From 83ba3ef3d1f061a201fb93128ece0811f59c8a4a Mon Sep 17 00:00:00 2001 From: Jeffrey Aven Date: Tue, 15 Sep 2026 08:56:01 +1000 Subject: [PATCH 1/3] vercel refresh --- .github/workflows/build-and-test.yml | 157 + .github/workflows/prod-web-deploy.yml | 116 +- .github/workflows/star-check.yml | 42 - .github/workflows/test-web-deploy.yml | 60 +- .gitignore | 135 +- CLAUDE.md | 84 + Makefile | 148 + NOTES.md | 77 + README.md | 469 +- bin/fetch-spec.sh | 42 + bin/generate-docs.mjs | 44 - bin/generate-docs.sh | 63 - bin/generate-mappings.mjs | 42 - bin/generate-mappings.sh | 83 - bin/generate-provider.mjs | 66 - bin/generate-provider.sh | 134 - bin/split.mjs | 76 - bin/split.sh | 123 - bin/start-server.sh | 25 +- bin/test-meta-routes.cjs | 887 +- package-lock.json | 1060 +- package.json | 66 +- provider-dev/config/all_services.csv | 414 + provider-dev/config/spec_pin.json | 12 + .../docgen/provider-data/headerContent1.txt | 40 +- .../docgen/provider-data/headerContent2.txt | 287 +- .../src/vercel/v00.00.00000/provider.yaml | 310 +- .../v00.00.00000/services/access_groups.yaml | 1389 + .../v00.00.00000/services/ai_gateway.yaml | 1244 + .../vercel/v00.00.00000/services/aliases.yaml | 1348 +- .../v00.00.00000/services/artifacts.yaml | 376 +- .../v00.00.00000/services/authentication.yaml | 993 +- .../vercel/v00.00.00000/services/billing.yaml | 1571 + .../services/billing_settings.yaml | 79 - .../v00.00.00000/services/bulk_redirects.yaml | 983 + .../vercel/v00.00.00000/services/cache.yaml | 69 - .../vercel/v00.00.00000/services/certs.yaml | 336 +- .../vercel/v00.00.00000/services/checks.yaml | 2554 +- .../vercel/v00.00.00000/services/connect.yaml | 3814 ++ .../v00.00.00000/services/deployments.yaml | 19834 +++++--- .../src/vercel/v00.00.00000/services/dns.yaml | 1099 +- .../vercel/v00.00.00000/services/domains.yaml | 1570 +- .../services/domains_registrar.yaml | 3578 ++ .../vercel/v00.00.00000/services/drains.yaml | 2408 + .../v00.00.00000/services/edge_cache.yaml | 319 + .../v00.00.00000/services/edge_config.yaml | 1777 +- .../v00.00.00000/services/environments.yaml | 2210 + .../v00.00.00000/services/feature_flags.yaml | 6538 +++ .../v00.00.00000/services/integrations.yaml | 6697 ++- .../src/vercel/v00.00.00000/services/kms.yaml | 2171 + .../v00.00.00000/services/log_drains.yaml | 1569 +- .../v00.00.00000/services/marketplace.yaml | 2913 ++ .../v00.00.00000/services/microfrontends.yaml | 6004 +++ .../v00.00.00000/services/networking.yaml | 1083 + .../v00.00.00000/services/observability.yaml | 420 + .../services/project_members.yaml | 368 +- .../v00.00.00000/services/project_routes.yaml | 2656 ++ .../v00.00.00000/services/projects.yaml | 39265 ++++++++++++---- .../services/rolling_release.yaml | 2283 + .../v00.00.00000/services/sandboxes.yaml | 6779 +++ .../vercel/v00.00.00000/services/secrets.yaml | 533 - .../v00.00.00000/services/security.yaml | 8753 ++++ .../vercel/v00.00.00000/services/storage.yaml | 653 + .../vercel/v00.00.00000/services/teams.yaml | 4898 +- .../vercel/v00.00.00000/services/user.yaml | 11502 ++++- .../src/vercel/v00.00.00000/services/vcr.yaml | 2414 + .../v00.00.00000/services/web_analytics.yaml | 3646 ++ .../v00.00.00000/services/webhooks.yaml | 1302 +- provider-dev/scripts/lib/csv.mjs | 56 + provider-dev/scripts/merge_mappings.mjs | 82 + provider-dev/scripts/post_process.mjs | 251 + provider-dev/scripts/pre_normalize.mjs | 215 + provider-dev/scripts/record_spec_pin.mjs | 82 + provider-dev/scripts/svc-discriminator.mjs | 90 + provider-dev/scripts/validate_mappings.mjs | 104 + provider-dev/source/.gitkeep | 0 tests/offline_validation.mjs | 155 + tests/smoke_test.mjs | 368 + website/.gitignore | 3 + website/docs/index.md | 358 +- .../access_group_members/index.md | 194 + .../access_group_projects/index.md | 406 + .../access_groups/access_groups/index.md | 505 + website/docs/services/access_groups/index.md | 34 + website/docs/services/ai_gateway/index.md | 33 + .../docs/services/ai_gateway/rules/index.md | 350 + .../ai_gateway/virtual_model_configs/index.md | 921 + .../docs/services/aliases/aliases/index.md | 261 +- .../aliases/deployment_aliases/index.md | 238 + .../services/aliases/deployments/index.md | 212 - website/docs/services/aliases/index.md | 2 +- .../artifacts/artifact_status/index.md | 134 + .../services/artifacts/artifacts/index.md | 155 +- website/docs/services/artifacts/index.md | 6 +- .../services/authentication/api_keys/index.md | 151 + website/docs/services/authentication/index.md | 6 +- .../services/authentication/tokens/index.md | 420 + .../authentication/user_tokens/index.md | 408 - .../docs/services/billing/charges/index.md | 148 + .../billing/contract_commitments/index.md | 136 + .../docs/services/billing/credits/index.md | 120 + website/docs/services/billing/index.md | 34 + website/docs/services/bulk_redirects/index.md | 33 + .../bulk_redirects/redirects/index.md | 378 + .../services/bulk_redirects/versions/index.md | 236 + website/docs/services/certs/certs/index.md | 228 +- .../docs/services/checks/check_runs/index.md | 487 + .../checks/deployment_checks/index.md | 564 + .../docs/services/checks/deployments/index.md | 522 - website/docs/services/checks/index.md | 7 +- .../services/checks/project_checks/index.md | 557 + .../connector_project_connections/index.md | 355 + .../docs/services/connect/connectors/index.md | 1209 + website/docs/services/connect/index.md | 34 + .../connect/project_connectors/index.md | 178 + .../docs/services/deployments/builds/index.md | 235 - .../{events => deployment_events}/index.md | 65 +- .../deployments/deployment_files/index.md | 172 + .../services/deployments/deployments/index.md | 1461 +- .../docs/services/deployments/files/index.md | 170 +- website/docs/services/deployments/index.md | 9 +- .../deployments/runtime_logs/index.md | 148 + .../services/dns/domains_records/index.md | 323 - website/docs/services/dns/index.md | 2 +- website/docs/services/dns/records/index.md | 558 + .../services/domains/domain_config/index.md | 176 + .../domains/domain_project_domains/index.md | 220 + .../services/domains/domain_registry/index.md | 151 - .../domains/domain_verification/index.md | 148 + .../docs/services/domains/domains/index.md | 439 +- website/docs/services/domains/index.md | 11 +- website/docs/services/domains/price/index.md | 147 - .../contact_info_schema/index.md | 136 + .../domain_auth_codes/index.md | 134 + .../domain_availability/index.md | 173 + .../domain_contact_verification/index.md | 148 + .../domain_prices}/index.md | 83 +- .../domain_transfers/index.md | 134 + .../domains_registrar/domains/index.md | 137 + .../docs/services/domains_registrar/index.md | 41 + .../domains_registrar/orders/index.md | 276 + .../domains_registrar/tld_prices/index.md | 158 + .../services/domains_registrar/tlds/index.md | 171 + website/docs/services/drains/drains/index.md | 696 + .../services/{secrets => drains}/index.md | 8 +- .../docs/services/edge_cache/cache/index.md | 196 + .../services/{cache => edge_cache}/index.md | 8 +- .../services/edge_config/backups/index.md | 282 + .../services/edge_config/edge_config/index.md | 386 - .../edge_config/edge_configs/index.md | 485 + website/docs/services/edge_config/index.md | 6 +- .../docs/services/edge_config/item/index.md | 165 - .../docs/services/edge_config/items/index.md | 191 +- .../docs/services/edge_config/schema/index.md | 211 + .../docs/services/edge_config/token/index.md | 217 - .../docs/services/edge_config/tokens/index.md | 230 +- .../environments/custom_environments/index.md | 452 + website/docs/services/environments/index.md | 33 + .../shared_env_variables/index.md | 632 + .../feature_flags/deployment_flags/index.md | 146 + .../feature_flags/flag_versions/index.md | 218 + .../services/feature_flags/flags/index.md | 638 + website/docs/services/feature_flags/index.md | 39 + .../services/feature_flags/sdk_keys/index.md | 313 + .../services/feature_flags/segments/index.md | 533 + .../services/feature_flags/settings/index.md | 232 + .../feature_flags/team_flags/index.md | 226 + .../feature_flags/team_settings/index.md | 194 + .../integrations/billing_plans/index.md | 260 + .../integrations/configuration/index.md | 200 - .../configuration_products/index.md | 172 + .../integrations/configurations/index.md | 563 + .../integrations/git_namespaces/index.md | 69 +- website/docs/services/integrations/index.md | 11 +- .../{search_repo => repos}/index.md | 133 +- .../services/integrations/stores/index.md | 193 + website/docs/services/kms/index.md | 34 + .../services/kms/issuer_policies/index.md | 258 + website/docs/services/kms/issuers/index.md | 551 + .../docs/services/kms/signing_keys/index.md | 253 + website/docs/services/log_drains/index.md | 2 +- .../index.md | 271 +- .../services/log_drains/log_drains/index.md | 466 +- .../account_info}/index.md | 71 +- .../services/marketplace/billing/index.md | 135 + .../docs/services/marketplace/events/index.md | 125 + .../experimentation_edge_config/index.md | 168 + .../experimentation_items/index.md | 216 + website/docs/services/marketplace/index.md | 41 + .../marketplace/installations/index.md | 184 + .../services/marketplace/invoices/index.md | 379 + .../services/marketplace/members/index.md | 152 + .../services/marketplace/resources/index.md | 449 + .../services/marketplace/sso_tokens/index.md | 108 + .../microfrontends/deployment_config/index.md | 160 + .../microfrontends/group_projects/index.md | 716 + .../services/microfrontends/groups/index.md | 220 + website/docs/services/microfrontends/index.md | 35 + .../microfrontends/project_config/index.md | 160 + website/docs/services/networking/index.md | 34 + .../services/networking/networks/index.md | 541 + .../networking/privatelink_endpoints/index.md | 509 + .../services/networking/static_ips/index.md | 128 + .../configuration_projects/index.md | 187 + website/docs/services/observability/index.md | 34 + .../queries}/index.md | 62 +- .../services/observability/schema/index.md | 197 + .../docs/services/project_members/index.md | 2 +- .../services/project_members/members/index.md | 332 + .../project_members/projects_members/index.md | 248 - website/docs/services/project_routes/index.md | 33 + .../services/project_routes/routes/index.md | 464 + .../services/project_routes/versions/index.md | 226 + .../docs/services/projects/domains/index.md | 424 +- .../docs/services/projects/env_vars/index.md | 698 + website/docs/services/projects/index.md | 9 +- .../docs/services/projects/projects/index.md | 1794 +- .../projects/promote_aliases/index.md | 176 + .../docs/services/projects/traces/index.md | 205 + .../projects/transfer_requests/index.md | 201 + .../rolling_release/billing_status/index.md | 158 + .../services/rolling_release/config/index.md | 224 + .../docs/services/rolling_release/index.md | 34 + .../rolling_release/rolling_releases/index.md | 304 + .../docs/services/sandboxes/commands/index.md | 382 + .../docs/services/sandboxes/drives/index.md | 333 + website/docs/services/sandboxes/index.md | 37 + .../services/sandboxes/sandboxes/index.md | 1033 + .../services/sandboxes/session_files/index.md | 173 + .../docs/services/sandboxes/sessions/index.md | 570 + .../services/sandboxes/snapshots/index.md | 487 + .../docs/services/secrets/secrets/index.md | 460 - .../security/attack_challenge_mode/index.md | 118 + .../services/security/attack_status/index.md | 182 + .../security/firewall_bypass/index.md | 365 + .../security/firewall_config/index.md | 270 + .../firewall_config_versions/index.md | 290 + .../security/firewall_events/index.md | 158 + website/docs/services/security/index.md | 37 + .../{billing_settings => storage}/index.md | 8 +- website/docs/services/storage/stores/index.md | 251 + .../{request => access_requests}/index.md | 137 +- website/docs/services/teams/index.md | 4 +- website/docs/services/teams/members/index.md | 276 +- .../teams/microfrontend_groups/index.md | 150 + website/docs/services/teams/teams/index.md | 545 +- .../docs/services/user/event_types/index.md | 160 + website/docs/services/user/events/index.md | 180 +- website/docs/services/user/index.md | 3 +- website/docs/services/user/user/index.md | 216 +- website/docs/services/vcr/images/index.md | 380 + website/docs/services/vcr/index.md | 35 + .../docs/services/vcr/permissions/index.md | 319 + .../docs/services/vcr/repositories/index.md | 359 + website/docs/services/vcr/tags/index.md | 341 + .../web_analytics/event_aggregates/index.md | 1496 + .../web_analytics/event_counts/index.md | 1490 + website/docs/services/web_analytics/index.md | 37 + .../pageview_aggregates/index.md | 1496 + .../web_analytics/pageview_counts/index.md | 1490 + .../speed_insights}/index.md | 35 +- .../web_insights}/index.md | 37 +- .../docs/services/webhooks/webhooks/index.md | 230 +- website/docusaurus.config.js | 264 +- website/package.json | 32 +- website/provider.js | 2 + website/scripts/sanitize-docs.mjs | 172 + website/sidebars.js | 40 +- .../components/CopyableCode/CopyableCode.js | 58 +- .../src/components/SchemaTable/SchemaTable.js | 49 + .../SchemaTable/SchemaTable.module.css | 27 + .../StackqlDeployDropdown.js | 400 + .../StackqlDeployDropdown.module.css | 12 + website/src/css/{custom.css => global.css} | 30 +- website/src/pages/blog.js | 10 - website/src/pages/contact-us.js | 10 - website/src/pages/install.js | 10 - website/src/pages/providers/aws.js | 10 - website/src/pages/providers/azure.js | 10 - website/src/pages/providers/confluent.js | 10 - website/src/pages/providers/databricks.js | 10 - website/src/pages/providers/github.js | 10 - website/src/pages/providers/google.js | 10 - website/src/pages/providers/index.js | 10 - website/src/pages/providers/okta.js | 10 - website/src/pages/providers/openai.js | 10 - website/src/pages/providers/snowflake.js | 10 - website/src/pages/stackql-deploy.js | 10 - website/src/pages/stackqldocs.js | 10 - website/src/pages/tutorials.js | 10 - website/src/theme/DocBreadcrumbs/index.js | 12 + website/src/theme/Footer/index.tsx | 522 +- website/static/CNAME | 2 +- website/static/apple-touch-icon.png | Bin 0 -> 7748 bytes website/static/favicon-16x16.png | Bin 0 -> 872 bytes website/static/favicon-32x32.png | Bin 0 -> 1533 bytes website/static/favicon.ico | Bin 0 -> 15086 bytes website/static/img/docusaurus-social-card.jpg | Bin 0 -> 55746 bytes website/static/img/logo.svg | 1 + website/static/safari-pinned-tab.svg | 27 + website/static/site.webmanifest | 11 + website/yarn.lock | 6341 ++- 302 files changed, 191018 insertions(+), 34942 deletions(-) create mode 100644 .github/workflows/build-and-test.yml delete mode 100644 .github/workflows/star-check.yml create mode 100644 CLAUDE.md create mode 100644 Makefile create mode 100644 NOTES.md create mode 100644 bin/fetch-spec.sh delete mode 100644 bin/generate-docs.mjs delete mode 100644 bin/generate-docs.sh delete mode 100644 bin/generate-mappings.mjs delete mode 100644 bin/generate-mappings.sh delete mode 100644 bin/generate-provider.mjs delete mode 100644 bin/generate-provider.sh delete mode 100644 bin/split.mjs delete mode 100644 bin/split.sh create mode 100644 provider-dev/config/all_services.csv create mode 100644 provider-dev/config/spec_pin.json create mode 100644 provider-dev/openapi/src/vercel/v00.00.00000/services/access_groups.yaml create mode 100644 provider-dev/openapi/src/vercel/v00.00.00000/services/ai_gateway.yaml create mode 100644 provider-dev/openapi/src/vercel/v00.00.00000/services/billing.yaml delete mode 100644 provider-dev/openapi/src/vercel/v00.00.00000/services/billing_settings.yaml create mode 100644 provider-dev/openapi/src/vercel/v00.00.00000/services/bulk_redirects.yaml delete mode 100644 provider-dev/openapi/src/vercel/v00.00.00000/services/cache.yaml create mode 100644 provider-dev/openapi/src/vercel/v00.00.00000/services/connect.yaml create mode 100644 provider-dev/openapi/src/vercel/v00.00.00000/services/domains_registrar.yaml create mode 100644 provider-dev/openapi/src/vercel/v00.00.00000/services/drains.yaml create mode 100644 provider-dev/openapi/src/vercel/v00.00.00000/services/edge_cache.yaml create mode 100644 provider-dev/openapi/src/vercel/v00.00.00000/services/environments.yaml create mode 100644 provider-dev/openapi/src/vercel/v00.00.00000/services/feature_flags.yaml create mode 100644 provider-dev/openapi/src/vercel/v00.00.00000/services/kms.yaml create mode 100644 provider-dev/openapi/src/vercel/v00.00.00000/services/marketplace.yaml create mode 100644 provider-dev/openapi/src/vercel/v00.00.00000/services/microfrontends.yaml create mode 100644 provider-dev/openapi/src/vercel/v00.00.00000/services/networking.yaml create mode 100644 provider-dev/openapi/src/vercel/v00.00.00000/services/observability.yaml create mode 100644 provider-dev/openapi/src/vercel/v00.00.00000/services/project_routes.yaml create mode 100644 provider-dev/openapi/src/vercel/v00.00.00000/services/rolling_release.yaml create mode 100644 provider-dev/openapi/src/vercel/v00.00.00000/services/sandboxes.yaml delete mode 100644 provider-dev/openapi/src/vercel/v00.00.00000/services/secrets.yaml create mode 100644 provider-dev/openapi/src/vercel/v00.00.00000/services/security.yaml create mode 100644 provider-dev/openapi/src/vercel/v00.00.00000/services/storage.yaml create mode 100644 provider-dev/openapi/src/vercel/v00.00.00000/services/vcr.yaml create mode 100644 provider-dev/openapi/src/vercel/v00.00.00000/services/web_analytics.yaml create mode 100644 provider-dev/scripts/lib/csv.mjs create mode 100644 provider-dev/scripts/merge_mappings.mjs create mode 100644 provider-dev/scripts/post_process.mjs create mode 100644 provider-dev/scripts/pre_normalize.mjs create mode 100644 provider-dev/scripts/record_spec_pin.mjs create mode 100644 provider-dev/scripts/svc-discriminator.mjs create mode 100644 provider-dev/scripts/validate_mappings.mjs delete mode 100644 provider-dev/source/.gitkeep create mode 100644 tests/offline_validation.mjs create mode 100644 tests/smoke_test.mjs create mode 100644 website/docs/services/access_groups/access_group_members/index.md create mode 100644 website/docs/services/access_groups/access_group_projects/index.md create mode 100644 website/docs/services/access_groups/access_groups/index.md create mode 100644 website/docs/services/access_groups/index.md create mode 100644 website/docs/services/ai_gateway/index.md create mode 100644 website/docs/services/ai_gateway/rules/index.md create mode 100644 website/docs/services/ai_gateway/virtual_model_configs/index.md create mode 100644 website/docs/services/aliases/deployment_aliases/index.md delete mode 100644 website/docs/services/aliases/deployments/index.md create mode 100644 website/docs/services/artifacts/artifact_status/index.md create mode 100644 website/docs/services/authentication/api_keys/index.md create mode 100644 website/docs/services/authentication/tokens/index.md delete mode 100644 website/docs/services/authentication/user_tokens/index.md create mode 100644 website/docs/services/billing/charges/index.md create mode 100644 website/docs/services/billing/contract_commitments/index.md create mode 100644 website/docs/services/billing/credits/index.md create mode 100644 website/docs/services/billing/index.md create mode 100644 website/docs/services/bulk_redirects/index.md create mode 100644 website/docs/services/bulk_redirects/redirects/index.md create mode 100644 website/docs/services/bulk_redirects/versions/index.md create mode 100644 website/docs/services/checks/check_runs/index.md create mode 100644 website/docs/services/checks/deployment_checks/index.md delete mode 100644 website/docs/services/checks/deployments/index.md create mode 100644 website/docs/services/checks/project_checks/index.md create mode 100644 website/docs/services/connect/connector_project_connections/index.md create mode 100644 website/docs/services/connect/connectors/index.md create mode 100644 website/docs/services/connect/index.md create mode 100644 website/docs/services/connect/project_connectors/index.md delete mode 100644 website/docs/services/deployments/builds/index.md rename website/docs/services/deployments/{events => deployment_events}/index.md (71%) create mode 100644 website/docs/services/deployments/deployment_files/index.md create mode 100644 website/docs/services/deployments/runtime_logs/index.md delete mode 100644 website/docs/services/dns/domains_records/index.md create mode 100644 website/docs/services/dns/records/index.md create mode 100644 website/docs/services/domains/domain_config/index.md create mode 100644 website/docs/services/domains/domain_project_domains/index.md delete mode 100644 website/docs/services/domains/domain_registry/index.md create mode 100644 website/docs/services/domains/domain_verification/index.md delete mode 100644 website/docs/services/domains/price/index.md create mode 100644 website/docs/services/domains_registrar/contact_info_schema/index.md create mode 100644 website/docs/services/domains_registrar/domain_auth_codes/index.md create mode 100644 website/docs/services/domains_registrar/domain_availability/index.md create mode 100644 website/docs/services/domains_registrar/domain_contact_verification/index.md rename website/docs/services/{domains/config => domains_registrar/domain_prices}/index.md (50%) create mode 100644 website/docs/services/domains_registrar/domain_transfers/index.md create mode 100644 website/docs/services/domains_registrar/domains/index.md create mode 100644 website/docs/services/domains_registrar/index.md create mode 100644 website/docs/services/domains_registrar/orders/index.md create mode 100644 website/docs/services/domains_registrar/tld_prices/index.md create mode 100644 website/docs/services/domains_registrar/tlds/index.md create mode 100644 website/docs/services/drains/drains/index.md rename website/docs/services/{secrets => drains}/index.md (81%) create mode 100644 website/docs/services/edge_cache/cache/index.md rename website/docs/services/{cache => edge_cache}/index.md (79%) create mode 100644 website/docs/services/edge_config/backups/index.md delete mode 100644 website/docs/services/edge_config/edge_config/index.md create mode 100644 website/docs/services/edge_config/edge_configs/index.md delete mode 100644 website/docs/services/edge_config/item/index.md create mode 100644 website/docs/services/edge_config/schema/index.md delete mode 100644 website/docs/services/edge_config/token/index.md create mode 100644 website/docs/services/environments/custom_environments/index.md create mode 100644 website/docs/services/environments/index.md create mode 100644 website/docs/services/environments/shared_env_variables/index.md create mode 100644 website/docs/services/feature_flags/deployment_flags/index.md create mode 100644 website/docs/services/feature_flags/flag_versions/index.md create mode 100644 website/docs/services/feature_flags/flags/index.md create mode 100644 website/docs/services/feature_flags/index.md create mode 100644 website/docs/services/feature_flags/sdk_keys/index.md create mode 100644 website/docs/services/feature_flags/segments/index.md create mode 100644 website/docs/services/feature_flags/settings/index.md create mode 100644 website/docs/services/feature_flags/team_flags/index.md create mode 100644 website/docs/services/feature_flags/team_settings/index.md create mode 100644 website/docs/services/integrations/billing_plans/index.md delete mode 100644 website/docs/services/integrations/configuration/index.md create mode 100644 website/docs/services/integrations/configuration_products/index.md create mode 100644 website/docs/services/integrations/configurations/index.md rename website/docs/services/integrations/{search_repo => repos}/index.md (52%) create mode 100644 website/docs/services/integrations/stores/index.md create mode 100644 website/docs/services/kms/index.md create mode 100644 website/docs/services/kms/issuer_policies/index.md create mode 100644 website/docs/services/kms/issuers/index.md create mode 100644 website/docs/services/kms/signing_keys/index.md rename website/docs/services/log_drains/{integrations => integration_log_drains}/index.md (56%) rename website/docs/services/{domains/status => marketplace/account_info}/index.md (53%) create mode 100644 website/docs/services/marketplace/billing/index.md create mode 100644 website/docs/services/marketplace/events/index.md create mode 100644 website/docs/services/marketplace/experimentation_edge_config/index.md create mode 100644 website/docs/services/marketplace/experimentation_items/index.md create mode 100644 website/docs/services/marketplace/index.md create mode 100644 website/docs/services/marketplace/installations/index.md create mode 100644 website/docs/services/marketplace/invoices/index.md create mode 100644 website/docs/services/marketplace/members/index.md create mode 100644 website/docs/services/marketplace/resources/index.md create mode 100644 website/docs/services/marketplace/sso_tokens/index.md create mode 100644 website/docs/services/microfrontends/deployment_config/index.md create mode 100644 website/docs/services/microfrontends/group_projects/index.md create mode 100644 website/docs/services/microfrontends/groups/index.md create mode 100644 website/docs/services/microfrontends/index.md create mode 100644 website/docs/services/microfrontends/project_config/index.md create mode 100644 website/docs/services/networking/index.md create mode 100644 website/docs/services/networking/networks/index.md create mode 100644 website/docs/services/networking/privatelink_endpoints/index.md create mode 100644 website/docs/services/networking/static_ips/index.md create mode 100644 website/docs/services/observability/configuration_projects/index.md create mode 100644 website/docs/services/observability/index.md rename website/docs/services/{teams/invites => observability/queries}/index.md (52%) create mode 100644 website/docs/services/observability/schema/index.md create mode 100644 website/docs/services/project_members/members/index.md delete mode 100644 website/docs/services/project_members/projects_members/index.md create mode 100644 website/docs/services/project_routes/index.md create mode 100644 website/docs/services/project_routes/routes/index.md create mode 100644 website/docs/services/project_routes/versions/index.md create mode 100644 website/docs/services/projects/env_vars/index.md create mode 100644 website/docs/services/projects/promote_aliases/index.md create mode 100644 website/docs/services/projects/traces/index.md create mode 100644 website/docs/services/projects/transfer_requests/index.md create mode 100644 website/docs/services/rolling_release/billing_status/index.md create mode 100644 website/docs/services/rolling_release/config/index.md create mode 100644 website/docs/services/rolling_release/index.md create mode 100644 website/docs/services/rolling_release/rolling_releases/index.md create mode 100644 website/docs/services/sandboxes/commands/index.md create mode 100644 website/docs/services/sandboxes/drives/index.md create mode 100644 website/docs/services/sandboxes/index.md create mode 100644 website/docs/services/sandboxes/sandboxes/index.md create mode 100644 website/docs/services/sandboxes/session_files/index.md create mode 100644 website/docs/services/sandboxes/sessions/index.md create mode 100644 website/docs/services/sandboxes/snapshots/index.md delete mode 100644 website/docs/services/secrets/secrets/index.md create mode 100644 website/docs/services/security/attack_challenge_mode/index.md create mode 100644 website/docs/services/security/attack_status/index.md create mode 100644 website/docs/services/security/firewall_bypass/index.md create mode 100644 website/docs/services/security/firewall_config/index.md create mode 100644 website/docs/services/security/firewall_config_versions/index.md create mode 100644 website/docs/services/security/firewall_events/index.md create mode 100644 website/docs/services/security/index.md rename website/docs/services/{billing_settings => storage}/index.md (76%) create mode 100644 website/docs/services/storage/stores/index.md rename website/docs/services/teams/{request => access_requests}/index.md (53%) create mode 100644 website/docs/services/teams/microfrontend_groups/index.md create mode 100644 website/docs/services/user/event_types/index.md create mode 100644 website/docs/services/vcr/images/index.md create mode 100644 website/docs/services/vcr/index.md create mode 100644 website/docs/services/vcr/permissions/index.md create mode 100644 website/docs/services/vcr/repositories/index.md create mode 100644 website/docs/services/vcr/tags/index.md create mode 100644 website/docs/services/web_analytics/event_aggregates/index.md create mode 100644 website/docs/services/web_analytics/event_counts/index.md create mode 100644 website/docs/services/web_analytics/index.md create mode 100644 website/docs/services/web_analytics/pageview_aggregates/index.md create mode 100644 website/docs/services/web_analytics/pageview_counts/index.md rename website/docs/services/{billing_settings/data_cache => web_analytics/speed_insights}/index.md (62%) rename website/docs/services/{cache/data_cache_purge_all => web_analytics/web_insights}/index.md (63%) create mode 100644 website/provider.js create mode 100644 website/scripts/sanitize-docs.mjs create mode 100644 website/src/components/SchemaTable/SchemaTable.js create mode 100644 website/src/components/SchemaTable/SchemaTable.module.css create mode 100644 website/src/components/StackqlDeployDropdown/StackqlDeployDropdown.js create mode 100644 website/src/components/StackqlDeployDropdown/StackqlDeployDropdown.module.css rename website/src/css/{custom.css => global.css} (89%) delete mode 100644 website/src/pages/blog.js delete mode 100644 website/src/pages/contact-us.js delete mode 100644 website/src/pages/install.js delete mode 100644 website/src/pages/providers/aws.js delete mode 100644 website/src/pages/providers/azure.js delete mode 100644 website/src/pages/providers/confluent.js delete mode 100644 website/src/pages/providers/databricks.js delete mode 100644 website/src/pages/providers/github.js delete mode 100644 website/src/pages/providers/google.js delete mode 100644 website/src/pages/providers/index.js delete mode 100644 website/src/pages/providers/okta.js delete mode 100644 website/src/pages/providers/openai.js delete mode 100644 website/src/pages/providers/snowflake.js delete mode 100644 website/src/pages/stackql-deploy.js delete mode 100644 website/src/pages/stackqldocs.js delete mode 100644 website/src/pages/tutorials.js create mode 100644 website/src/theme/DocBreadcrumbs/index.js create mode 100644 website/static/apple-touch-icon.png create mode 100644 website/static/favicon-16x16.png create mode 100644 website/static/favicon-32x32.png create mode 100644 website/static/favicon.ico create mode 100644 website/static/img/docusaurus-social-card.jpg create mode 100644 website/static/img/logo.svg create mode 100644 website/static/safari-pinned-tab.svg create mode 100644 website/static/site.webmanifest diff --git a/.github/workflows/build-and-test.yml b/.github/workflows/build-and-test.yml new file mode 100644 index 0000000..7afca16 --- /dev/null +++ b/.github/workflows/build-and-test.yml @@ -0,0 +1,157 @@ +name: build-and-test + +# Build the vercel provider from the current upstream spec and run every +# credential-free test layer on each push / PR; the live smoke suite runs +# only where the Vercel secrets are configured; a scheduled spec-drift job +# opens an issue when the served spec adds or removes operations (the +# mapping manifest must then be reviewed). + +on: + push: + branches: [main, 'feature/**'] + paths-ignore: ['website/**'] + pull_request: + branches: [main] + paths-ignore: ['website/**'] + schedule: + - cron: '23 3 * * 1' # weekly spec-drift check (Monday 03:23 UTC) + workflow_dispatch: + +jobs: + build-and-test: + if: github.event_name != 'schedule' + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v7 + + - uses: actions/setup-node@v7 + with: + node-version: 20 + cache: npm + + - name: Install dependencies + run: npm ci + + # puts the latest stackql on PATH; bin/start-server.sh and the test + # runners resolve it from there + - name: Install stackql + uses: stackql/setup-stackql@v2 + + - name: stackql version + run: stackql --version + + # The spec is unversioned upstream; a hash change alone is not a + # failure. New or removed operations surface in validate-mappings. + - name: Fetch the spec (reports drift against the recorded pin) + run: make fetch-spec + + - name: Split, merge and validate the mapping manifest + run: make split mappings validate-mappings + + - name: Normalize and generate the provider + run: make pre-normalize normalize generate + + - name: Fail on uncommitted generation drift + run: | + git add -N . + if ! git diff --quiet -- provider-dev/openapi provider-dev/config/all_services.csv; then + echo "Generated output differs from the committed artifacts - run 'make build' locally, review, and commit." + git diff --stat -- provider-dev/openapi provider-dev/config/all_services.csv + exit 1 + fi + + - name: Offline validation + run: make test-offline + + - name: Meta-route tests + run: make test-meta + + - name: Generate docs (sanity - the site build runs on the web workflows) + run: make docs + + smoke: + # secret-gated live smoke suite against a dedicated Hobby team; skipped + # with a notice when the secrets are not configured (forks, external PRs). + runs-on: ubuntu-latest + needs: build-and-test + if: github.event_name != 'pull_request' && github.event_name != 'schedule' + env: + VERCEL_API_TOKEN: ${{ secrets.VERCEL_API_TOKEN }} + VERCEL_TEAM_ID: ${{ secrets.VERCEL_TEAM_ID }} + steps: + - uses: actions/checkout@v7 + + - uses: actions/setup-node@v7 + with: + node-version: 20 + cache: npm + + - name: Install dependencies + run: npm ci + + - name: Install stackql + uses: stackql/setup-stackql@v2 + + - name: Live smoke suite (reads + project / env var / edge config / deployment lifecycle) + if: env.VERCEL_API_TOKEN != '' + run: make smoke + + - name: Live smoke skipped (no credentials) + if: env.VERCEL_API_TOKEN == '' + run: | + echo "::notice title=Live smoke suite skipped::VERCEL_API_TOKEN is not configured - the live smoke suite did not run." + + spec-drift: + # Diff the served spec against the pin on a schedule and on demand, and + # open an issue when it moves. + runs-on: ubuntu-latest + if: github.event_name == 'schedule' || github.event_name == 'workflow_dispatch' + permissions: + contents: read + issues: write + steps: + - uses: actions/checkout@v7 + + - uses: actions/setup-node@v7 + with: + node-version: 20 + cache: npm + + - name: Install dependencies + run: npm ci + + - name: Fetch and compare against the pin + id: drift + run: | + set +e + make check-spec > fetch.log 2>&1 + rc=$? + set -e + cat fetch.log + if [ "$rc" -eq 0 ]; then + echo "drift=false" >> "$GITHUB_OUTPUT" + else + echo "drift=true" >> "$GITHUB_OUTPUT" + # materialise what changed for the issue body + make fetch-spec split mappings > /dev/null 2>&1 || true + { npm run validate-mappings 2>&1 || true; } | tail -60 > drift.txt + cat drift.txt + fi + + - name: Report drift + if: steps.drift.outputs.drift == 'true' + uses: actions/github-script@v9 + with: + script: | + const fs = require('fs'); + const stat = fs.existsSync('drift.txt') ? fs.readFileSync('drift.txt', 'utf8') : '(details unavailable)'; + const title = 'Vercel OpenAPI spec drift detected'; + const body = 'The document served at https://openapi.vercel.sh/ no longer matches provider-dev/config/spec_pin.json.\n\nMapping validation against the refreshed spec:\n\n```\n' + stat + '\n```\nRun `make build && make test`, map any new operations in provider-dev/config/all_services.csv (or delete rows for removed ones), update NOTES.md, and commit.'; + await core.summary.addHeading(title).addCodeBlock(stat).write(); + const { data: issues } = await github.rest.issues.listForRepo({ + owner: context.repo.owner, repo: context.repo.repo, state: 'open', labels: 'spec-drift' + }); + if (issues.some(i => i.title === title)) return; + await github.rest.issues.create({ + owner: context.repo.owner, repo: context.repo.repo, title, body, labels: ['spec-drift'] + }); diff --git a/.github/workflows/prod-web-deploy.yml b/.github/workflows/prod-web-deploy.yml index ab53507..7b950ed 100644 --- a/.github/workflows/prod-web-deploy.yml +++ b/.github/workflows/prod-web-deploy.yml @@ -1,58 +1,58 @@ -name: Deploy to GitHub Pages - -on: - push: - branches: - - main - paths: - - 'website/**' - -jobs: - build: - name: Build Docusaurus - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - - uses: actions/setup-node@v4 - with: - node-version: 20 - cache: yarn - cache-dependency-path: website/yarn.lock - - - name: Install dependencies - run: yarn install --frozen-lockfile - working-directory: website - - - name: Build website - run: yarn build - working-directory: website - - - name: Upload Build Artifact - uses: actions/upload-pages-artifact@v3 - with: - path: website/build # Ensure the path is correctly set to the Docusaurus build output - - deploy: - name: Deploy to GitHub Pages - needs: build - - # Grant GITHUB_TOKEN the permissions required to make a Pages deployment - permissions: - pages: write # to deploy to Pages - id-token: write # to verify the deployment originates from an appropriate source - - # Deploy to the github-pages environment - environment: - name: github-pages - url: ${{ steps.deployment.outputs.page_url }} - - runs-on: ubuntu-latest - steps: - - name: Deploy to GitHub Pages - id: deployment - uses: actions/deploy-pages@v4 - with: - working-directory: website/build # Ensures the correct directory is used for deployment +name: Deploy to GitHub Pages + +on: + push: + branches: + - main + paths: + - 'website/**' + +jobs: + build: + name: Build Docusaurus + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v7 + with: + fetch-depth: 0 + + - uses: actions/setup-node@v7 + with: + node-version: 20 + cache: yarn + cache-dependency-path: website/yarn.lock + + - name: Install dependencies + run: yarn install --frozen-lockfile + working-directory: website + + - name: Build website + run: yarn build + working-directory: website + + - name: Upload Build Artifact + uses: actions/upload-pages-artifact@v5 + with: + path: website/build # Ensure the path is correctly set to the Docusaurus build output + + deploy: + name: Deploy to GitHub Pages + needs: build + + # Grant GITHUB_TOKEN the permissions required to make a Pages deployment + permissions: + pages: write # to deploy to Pages + id-token: write # to verify the deployment originates from an appropriate source + + # Deploy to the github-pages environment + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + + runs-on: ubuntu-latest + steps: + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v5 + with: + working-directory: website/build # Ensures the correct directory is used for deployment diff --git a/.github/workflows/star-check.yml b/.github/workflows/star-check.yml deleted file mode 100644 index 24d6c17..0000000 --- a/.github/workflows/star-check.yml +++ /dev/null @@ -1,42 +0,0 @@ -name: Check if PR author has starred required repositories -on: - pull_request: - types: [opened, synchronize, reopened] -jobs: - check-starred: - runs-on: ubuntu-latest - steps: - - name: Checkout code - uses: actions/checkout@v4 - - name: Get PR author username and repo info - id: get-info - run: | - echo "username=${{ github.event.pull_request.user.login }}" >> $GITHUB_ENV - echo "current_repo=${{ github.event.repository.name }}" >> $GITHUB_ENV - echo "current_owner=${{ github.repository_owner }}" >> $GITHUB_ENV - - name: Pull github provider - uses: stackql/stackql-exec@v2.2.1 - with: - is_command: 'true' - query: "REGISTRY PULL github;" - - name: Run stackql query - id: check-star - uses: stackql/stackql-assert@v2.2.1 - with: - test_query: | - SELECT repo, count(*) as has_starred - FROM github.activity.repo_stargazers - WHERE owner = '${{ env.current_owner }}' and repo IN ('stackql','${{ env.current_repo }}') - AND login = '${{ env.username }}' - GROUP BY repo; - expected_results_str: '[{"has_starred":"1","repo":"stackql"},{"has_starred":"1","repo":"${{ env.current_repo }}"}]' - continue-on-error: true - - name: Check if starred - if: always() # Ensures this runs regardless of check-star outcome - run: | - if [ "${{ steps.check-star.outcome }}" = "success" ]; then - echo "::notice::Thanks for your support!" - else - echo "::error::It seems you haven't starred the required repositories. Please star the following repos before proceeding: https://github.com/${{ env.current_owner }}/${{ env.current_repo }} (this repo) and https://github.com/stackql/stackql (our core repo)" - exit 1 - fi \ No newline at end of file diff --git a/.github/workflows/test-web-deploy.yml b/.github/workflows/test-web-deploy.yml index 1e2ef91..64df0d3 100644 --- a/.github/workflows/test-web-deploy.yml +++ b/.github/workflows/test-web-deploy.yml @@ -1,31 +1,31 @@ -name: Test deployment - -on: - pull_request: - branches: - - main - paths: - - 'website/**' - -jobs: - test-deploy: - name: Test deployment - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - - uses: actions/setup-node@v4 - with: - node-version: 20 - cache: yarn - cache-dependency-path: website/yarn.lock - - - name: Install dependencies - run: yarn install --frozen-lockfile - working-directory: website - - - name: Test build website - run: yarn build +name: Test deployment + +on: + pull_request: + branches: + - main + paths: + - 'website/**' + +jobs: + test-deploy: + name: Test deployment + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v7 + with: + fetch-depth: 0 + + - uses: actions/setup-node@v7 + with: + node-version: 20 + cache: yarn + cache-dependency-path: website/yarn.lock + + - name: Install dependencies + run: yarn install --frozen-lockfile + working-directory: website + + - name: Test build website + run: yarn build working-directory: website \ No newline at end of file diff --git a/.gitignore b/.gitignore index 1844196..e24a5bb 100644 --- a/.gitignore +++ b/.gitignore @@ -1,86 +1,49 @@ -main.zip - -# Byte-compiled / optimized / DLL files -__pycache__/ -*.py[cod] -*$py.class - -# Virtual environments -.venv/ -venv/ -env/ -ENV/ - -# Hatch/Poetry build artifacts -dist/ -build/ -*.egg-info/ - -# Installer logs -pip-log.txt -pip-delete-this-directory.txt - -# Unit test cache and coverage -.coverage -.cache/ -pytest_cache/ -htmlcov/ -**/__pycache__ - -# IDE / editor settings -.vscode/ -.idea/ -*.swp -*.swo - -# Output directory -output/ - -# Misc -.DS_Store -*.log -*.tmp -*.bak - -# stackql -.stackql/ -stackql -stackql-zip -stackql-aws-cloud-shell.sh -stackql-azure-cloud-shell.sh -stackql-google-cloud-shell.sh -.env -nohup.out - -# node -# Ignore node_modules in all directories -**/node_modules/ - -# Ignore build outputs in all directories -**/dist/ -**/build/ -**/.next/ -**/.cache/ -**/.turbo/ - -# Ignore log files -**/npm-debug.log -**/yarn-debug.log -**/yarn-error.log -**/pnpm-debug.log - -# Ignore lock files (optional if you don't want to commit them) -# Uncomment if you want to ignore lock files: -# **/package-lock.json -# **/yarn.lock -# **/pnpm-lock.yaml - -# Ignore dotenv files (if secrets are present) -**/.env -**/.env.*.local - -# Ignore coverage and test output -**/coverage/ -**/test-output/ -# Ignore everything in source directory except .gitkeep -source/* +# stackql binary and server artifacts +stackql +stackql.exe +stackql-zip +stackql-server.log +nohup.out +*.log +/.stackql + +# node +node_modules/ + +# python +__pycache__/ +*.py[cod] +.venv/ +venv/ + +# env / secrets +.env +.env.* +!.env.example + +# IDE / editor +.vscode/ +.idea/ +*.swp + +# docs site build output +website/build/ +website/.docusaurus/ +website/.shared-config/ + +# misc +.DS_Store +*.tmp +*.bak + +# The Vercel OpenAPI document is large (~10 MB) and unversioned upstream; +# it is fetched by `make fetch-spec` and recorded by hash, version and +# operation counts in provider-dev/config/spec_pin.json (committed). +provider-dev/downloaded/* +!provider-dev/downloaded/.gitkeep + +# transient analyze output merged into all_services.csv by `make mappings` +provider-dev/config/.analyze/ + +# split per-service specs are build artifacts, regenerated from the fetched spec by `make split` +provider-dev/source/*.yaml diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..0789507 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,84 @@ +# CLAUDE.md + +## Project + +This repository builds and documents the `vercel` provider for [StackQL](https://github.com/stackql/stackql): SQL query and provisioning over the Vercel REST API - projects, deployments (including file upload and deployment creation), aliases, domains and DNS, environment variables, Edge Config, teams and members, access groups, webhooks, drains, feature flags, firewall, AI Gateway, sandboxes, the container registry and billing. + +The provider is a type 1 (DIRECT) provider: generated from the OpenAPI document Vercel publishes at `https://openapi.vercel.sh/` with `@stackql/provider-utils`. The repository follows the layout and pipeline of the sibling provider repos under `stackql-registry` (the `clickhouse` repo is the closest reference: Makefile, tests with a live flag, Docusaurus 3.10 on the shared config). When in doubt about structure, mirror it. + +## Toolchain rules + +- Latest `@stackql/provider-utils` and `@stackql/pgwire-lite`, pinned exactly in package.json (check npm for newer minors before a refresh). +- Node >= 20, `type: module`. The two provider-utils CLIs are wrapped as npm scripts invoked through `node` (no `.bin` shims); flags pass through with `--`. +- GNU make and bash for the pipeline (`make help`); WSL on Windows. A `stackql` binary on `PATH` (or `$STACKQL` / `./stackql`) for tests. +- No em dashes, no ASCII arrows other than `->`, no characters off a QWERTY keyboard, in any file. Matter-of-fact prose. + +## Repository layout + +``` +Makefile # every pipeline stage, test layer and docs step as a target; `make all` +bin/ # fetch-spec.sh, start-server.sh, stop-server.sh, server-status.sh, test-meta-routes.cjs +provider-dev/ + config/all_services.csv # THE durable operation -> resource/method/verb manifest (hand-maintained, checked in) + config/spec_pin.json # what the provider was built from (date, hash, counts) + downloaded/openapi.json # fetched spec (gitignored, ~10 MB) + source/ # split per-service specs (build artifacts) + openapi/src/vercel/ # generated provider (checked in) + scripts/svc-discriminator.mjs # tag -> service map for the split + scripts/pre_normalize.mjs # vercel-specific spec corrections (see NOTES.md) + scripts/merge_mappings.mjs # analyze output merged into all_services.csv, mappings preserved + scripts/validate_mappings.mjs # fails on unmapped / stale / duplicate rows + scripts/post_process.mjs # nativeCasing, pagination, LIMIT pushdown, upload and text transforms + docgen/provider-data/ # headerContent1.txt, headerContent2.txt (docs landing page) +tests/ + offline_validation.mjs # SHOW / DESCRIBE via stackql exec + YAML assertions, no network + smoke_test.mjs # live suite over pgwire-lite; --live targets the published provider +website/ # Docusaurus 3.10 microsite (shared config vendored at build time) +NOTES.md # build findings: spec quirks, engine behaviour, platform limits +``` + +## Pipeline (`make build`) + +1. `make fetch-spec` - download the spec, record `spec_pin.json` (reports drift; `make check-spec` fails on it). +2. `make split` - one service per tag group (`provider-dev/scripts/svc-discriminator.mjs`; 38 services). Versioned duplicate tags (checks / checks-v2, ai-gateway / api-ai-gateway) and single-operation tags (logs, static-ips) are folded; untagged operations are routed by path prefix. +3. `make mappings` - provider-utils `analyze` into a temp dir, merged into `all_services.csv` by `merge_mappings.mjs`. Existing rows keep their mapping columns; new upstream operations are appended unmapped; rows for removed operations stay and are reported. +4. `make validate-mappings` - fails until every operation is mapped (or `skip_this_resource`) and no row is stale. This is the gate that turns upstream change into a reviewed decision. +5. `make pre-normalize` then `make normalize` - vercel corrections (bare-array responses, opaque oneOf placeholders, body/query name collisions) then the generic provider-utils pass. +6. `make generate` - `generate` with bearer auth (`VERCEL_API_TOKEN`), `snake_case_aliases: true`, `--naive-req-body-translate`, `--update-path-param-names`, followed by `make post-process`. + +`make all` = deps + build + test + docs + website. It never touches a Vercel account. + +## Mapping conventions (all_services.csv) + +- Resource names are plural snake_case nouns scoped by the service (`projects.env_vars`, `edge_config.items`, `teams.members`). +- GET collection -> `list` (select, `stackql_object_key` on the array), GET single -> `get` (select), POST create -> `create` (insert), PATCH -> `update`, PUT full replacement -> `replace`, DELETE -> `delete`. +- Lifecycle and action operations attach to the resource they act on as `exec` methods (`deployments.cancel`, `projects.promote`, `projects.rollback`, `projects.pause`, `backups.restore`, `drains.test`), keeping non-selectable resources to a minimum. +- Two select methods on one resource must have different required-parameter signatures (the meta-route suite enforces this); older API versions of a list (`list_v1`) are `exec`. +- Operations with no 2xx response are `skip_this_resource`. +- Never regenerate the CSV from scratch. A rename or a move of an existing operation to a different resource is a breaking change and needs a deliberate edit. + +## Tests (`make test`, `make smoke`) + +1. `make test-offline` - `tests/offline_validation.mjs`: services, resources, verbs, snake_case columns, pagination / pushdown / transform config in the generated YAML. +2. `make test-meta` - `bin/test-meta-routes.cjs` over a local `stackql srv` (pgwire-lite): every service, resource and method; DESCRIBE on every selectable resource; unique signatures per verb. +3. `make smoke` - `tests/smoke_test.mjs` (pgwire-lite over a server the suite starts): read smokes plus a full lifecycle - project, environment variable, Edge Config with items and a token, a hello world `index.html` upload and production deployment polled to READY and fetched over HTTPS, pause / unpause, then deletion. Names everything `stackql-smoke-` and sweeps breadcrumbs first. Free on a Hobby team; under $1 on Pro. `make smoke-live` runs the same suite against the published provider (post-publish verification); `make smoke-cleanup` only sweeps. + +Credentials: `VERCEL_API_TOKEN` (required) and `VERCEL_TEAM_ID` (optional; the token's default team otherwise) from the environment or a gitignored `.env`. + +## Docs (`make docs`, `make website`) + +`generate-docs --snake-case-aliases` then `website/scripts/sanitize-docs.mjs`. The landing page comes from `provider-dev/docgen/provider-data/headerContent1.txt` and `headerContent2.txt` (installation, authentication, team scope, casing, pagination, getting-started queries, provisioning and the static-site deployment walkthrough). `website/docusaurus.config.js` wraps the shared `stackql/docusaurus-config` (vendored to `.shared-config/` by `yarn vendor-config`) and sets `showLastUpdateTime = true`. Site identity is `website/provider.js`; `static/CNAME` pins `vercel-provider.stackql.io`. + +## Known constraints (details in NOTES.md) + +- Team scope is a `teamId` query parameter; `team_id` must be in the WHERE clause. any-sdk honours `x-stackQL-envVar` on server URL variables only, so `VERCEL_TEAM_ID` is a scripting convention until the engine supports the extension on parameters. +- In `stackql srv`, the first select method used on a resource in a session fixes its physical table; a `get` after a `list` on projects or deployments returns no rows over the wire (`stackql exec` is unaffected). +- Path parameters are physically snake_case (`@project_id` in EXEC); query and header parameters accept snake_case or the wire name. + +## Non-negotiables + +1. Latest provider-utils and pgwire-lite, pinned. +2. `all_services.csv` is the durable record of the operation mapping; upstream change is absorbed by `make mappings` and reviewed through `make validate-mappings`, never by regeneration. +3. Deterministic scripts; generated artifacts are never hand-edited. +4. Every regeneration is followed by `make test` before commit; `make smoke` before publishing. +5. The smoke suite cleans up everything it creates. diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..2fa13a9 --- /dev/null +++ b/Makefile @@ -0,0 +1,148 @@ +# StackQL vercel provider build pipeline. +# +# Every step is deterministic and re-runnable. `make all` runs the full +# chain against the current upstream spec: fetch -> split -> mappings -> +# validate -> pre-normalize -> normalize -> generate (+ post-process) -> +# offline + meta-route tests -> docs -> website build. It stops at +# validate-mappings when upstream adds or removes operations, so the +# checked-in mapping manifest (provider-dev/config/all_services.csv) is +# always the reviewed record of the provider surface. +# +# The live smoke suite (`make smoke`, `make smoke-live`) is separate so +# `all` never touches a Vercel account. It reads VERCEL_API_TOKEN (and the +# optional VERCEL_TEAM_ID) from the environment or a gitignored .env file. +# +# Requirements: Node >= 20, GNU make, bash, a stackql binary ($STACKQL, +# ./stackql or on PATH), yarn for the website. Runs under Linux / WSL / macOS. + +SHELL := bash +.DEFAULT_GOAL := help + +PROVIDER := vercel +SERVICES_DIR := provider-dev/openapi/src/$(PROVIDER) +SERVERS := [{"url": "https://api.vercel.com"}] +# bearer auth from VERCEL_API_TOKEN (the Terraform provider's variable); +# snake_case_aliases pairs with request.nativeCasing: camel on every +# method (set in post_process) for a snake_case SQL surface over the +# camelCase wire. +PROVIDER_CONFIG := {"auth": {"type": "bearer", "credentialsenvvar": "VERCEL_API_TOKEN"}, "snake_case_aliases": true} +ANALYZE_DIR := provider-dev/config/.analyze +ENV_FILE := .env + +.PHONY: help deps fetch-spec check-spec split mappings validate-mappings pre-normalize normalize generate post-process build \ + test-offline test-meta test smoke smoke-live smoke-cleanup start-server stop-server server-status \ + docs website website-start clean all + +help: ## show this help + @grep -E '^[a-zA-Z_-]+:.*?## ' $(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*?## "}; {printf " %-18s %s\n", $$1, $$2}' + +deps: ## install node dependencies (pinned @stackql/provider-utils and @stackql/pgwire-lite) + npm install + +# ---------------------------------------------------------------- pipeline + +fetch-spec: ## download the Vercel OpenAPI document and record the spec pin (reports drift) + npm run fetch-spec + +check-spec: ## download the spec and exit 1 if it differs from the recorded pin (CI drift check) + npm run fetch-spec -- --check + +split: ## split the spec into per-service specs (tag -> service map in provider-dev/scripts/svc-discriminator.mjs) + rm -f provider-dev/source/*.yaml + npm run split -- \ + --provider-name $(PROVIDER) \ + --api-doc provider-dev/downloaded/openapi.json \ + --svc-discriminator function \ + --svc-discriminator-fn provider-dev/scripts/svc-discriminator.mjs \ + --output-dir provider-dev/source \ + --overwrite + +mappings: ## refresh all_services.csv from the split specs, keeping every existing mapping (new ops appended unmapped) + rm -rf $(ANALYZE_DIR) + npm run generate-mappings -- --input-dir provider-dev/source --output-dir $(ANALYZE_DIR) + npm run merge-mappings -- $(ANALYZE_DIR)/all_services.csv + rm -rf $(ANALYZE_DIR) + +validate-mappings: ## fail unless every operation is mapped (or skipped) and no manifest row is stale + npm run validate-mappings -- --summary + +pre-normalize: ## vercel-specific spec corrections (bare-array responses, opaque oneOf variants) before normalize + npm run pre-normalize + +normalize: ## generic provider-utils normalize pass (oneOf/allOf flatten, bare-array wrap, opaque objects) + npm run normalize -- --api-dir provider-dev/source + +generate: ## generate the provider (bearer auth, snake_case surface, naive request body translate), then post-process + rm -rf provider-dev/openapi/* + npm run generate-provider -- \ + --provider-name $(PROVIDER) \ + --input-dir provider-dev/source \ + --output-dir $(SERVICES_DIR) \ + --config-path provider-dev/config/all_services.csv \ + --servers '$(SERVERS)' \ + --provider-config '$(PROVIDER_CONFIG)' \ + --naive-req-body-translate \ + --update-path-param-names \ + --overwrite + $(MAKE) post-process + +post-process: ## re-apply generated-provider extensions (nativeCasing, pagination, LIMIT pushdown, upload and text transforms) + npm run post-process + +build: fetch-spec split mappings validate-mappings pre-normalize normalize generate ## full upstream spec -> provider pipeline + +# ------------------------------------------------------------------- tests + +test-offline: ## offline validation against the local file registry (SHOW / DESCRIBE, no network) + node tests/offline_validation.mjs + +start-server: ## start a local stackql server (port 5444) on the generated provider + npm run start-server + +stop-server: ## stop the local stackql server + npm run stop-server + +server-status: ## show the local stackql server status + npm run server-status + +test-meta: ## meta-route suite (every service, resource and method) against a local stackql server + npm run start-server + npm run test-meta-routes -- $(PROVIDER) || (npm run stop-server; exit 1) + npm run stop-server + +test: test-offline test-meta ## all non-live test layers + +# `make smoke*` sources .env when present so a developer checkout works +# without exporting anything; CI sets VERCEL_API_TOKEN from a secret. +with_env = set -a; [ -f $(ENV_FILE) ] && source <(tr -d '\r' < $(ENV_FILE)); set +a; + +smoke: ## live smoke suite against the locally generated provider (reads + project / env var / edge config / deployment lifecycle) + @$(with_env) node tests/smoke_test.mjs + +smoke-live: ## live smoke suite against the published provider in the public registry (post-publish verification) + @$(with_env) node tests/smoke_test.mjs --live + +smoke-cleanup: ## sweep stackql-smoke-* projects and edge configs and exit + @$(with_env) node tests/smoke_test.mjs --cleanup-only + +# -------------------------------------------------------------------- docs + +docs: ## generate the website docs (snake_case surface), then sanitize for MDX + npm run generate-docs -- \ + --provider-name $(PROVIDER) \ + --provider-dir ./$(SERVICES_DIR)/v00.00.00000 \ + --output-dir ./website \ + --provider-data-dir ./provider-dev/docgen/provider-data \ + --snake-case-aliases + node website/scripts/sanitize-docs.mjs + +website: ## build the docusaurus microsite (vendors the shared config first) + cd website && yarn install && yarn build + +website-start: ## run the docusaurus dev server + cd website && yarn install && yarn start + +clean: ## remove generated artifacts (split specs, provider output, docs, website build) + rm -rf provider-dev/source/*.yaml provider-dev/openapi/* $(ANALYZE_DIR) website/build website/.docusaurus website/docs + +all: deps build test docs website ## everything non-live: deps, pipeline, tests, docs, site build diff --git a/NOTES.md b/NOTES.md new file mode 100644 index 0000000..7e6219e --- /dev/null +++ b/NOTES.md @@ -0,0 +1,77 @@ +# Build notes + +Findings recorded while building the refreshed `vercel` provider (September 2026). Each item names the evidence and the decision taken so a future refresh reuses them instead of re-deriving. + +## Spec source + +- Vercel serves one unversioned OpenAPI 3.0.3 document at `https://openapi.vercel.sh/` (`info.version` is `0.0.1`). It changes continuously; `bin/fetch-spec.sh` records the sha256, date and counts in `provider-dev/config/spec_pin.json` rather than committing the 10 MB document. Snapshot used for this build: 297 paths, 417 operations, 42 tags. +- Four HEAD operations (artifact exists, marketplace experimentation config, container registry blob and manifest heads) are outside the generator's verb set and are not mapped. +- 8 operations carry no tag (`/domains/records`, `/api-keys`, `/v2/observability/*`, `/speed-insights/toggle`, `/web/insights/toggle`); the discriminator routes them by path prefix. + +## Team scope and `VERCEL_TEAM_ID` + +- Vercel scopes by a `teamId` (or `slug`) query parameter on almost every operation. A "northstar" account's projects live under its default team; listing without `teamId` returns an empty envelope, so `team_id` is effectively required for useful queries. +- any-sdk resolves `x-stackQL-envVar` only on OpenAPI server URL variables (`internal/anysdk/server.go`; the constant is the only consumer of `ExtensionKeyEnvVar`). A server URL carrying a query string (`https://api.vercel.com?teamId={team_id}`) fails route matching (`router.FindRoute() failure`), so the extension cannot carry a query parameter today. `VERCEL_TEAM_ID` is therefore a convention for scripts, tests and docs, not a provider default. A core enhancement (honouring `x-stackQL-envVar` on `in: query` and `in: header` parameters when no WHERE value is supplied) would make `team_id` optional; the parameter is declared identically on ~380 operations so the provider needs no change beyond the annotation once that lands. +- A `custom` auth successor with `location: query` was considered and rejected: `/v1/integrations/git-namespaces` returns 400 when `teamId` is supplied, and duplicates would arise with a WHERE value. + +## Spec inaccuracies corrected in `pre_normalize.mjs` + +Verified against the live API with a read-only token: + +| Operation | Spec | Wire | Correction | +|---|---|---|---| +| `getEdgeConfigs` GET /v1/global-config | single object | bare array (`[]`) | wrap as array (normalize then applies the bare-array wrap) | +| `getEdgeConfigTokens` | `$ref GlobalConfigToken` | bare array | wrap as array | +| `getAllLogDrains` GET /v1/log-drains | oneOf [array, {drains}] | bare array | keep the array variant | +| `getWebhooks`, `getConfigurations` | oneOf [array, array] | bare array | keep the first variant | +| `getProjects` GET /v10/projects | oneOf [array, envelope x2] | `{projects, pagination}` | drop the legacy array variant | +| `getMicrofrontendsGroups` | opaque object | `{groups: [], maxMicrofrontendsGroupsPerTeam, maxMicrofrontendsPerGroup}` | declare the object | +| 14 list responses | oneOf with an empty `{type: object}` or scalar placeholder | envelope | drop the placeholder variants (generic rule) | + +Without the last rule the normalize merge produced `type: string` schemas for `listPromoteAliases`, `listAccessGroups`, `getProjectMembers`, `listTeamFlagSettings`, `listSessionSnapshots`, `listSessions`, `getRecords`, `getRoutes`, `searchRepo` and `getActiveAttackStatus`. + +## Body / query parameter name collisions + +Ten operations declare a request body property with the same name as one of their query parameters (`slug` - the team slug alias - on `createEdgeConfig`, `updateEdgeConfig`, `createFlag`, `createFlagSegment`, `createCustomEnvironment`, `updateCustomEnvironment`, `patchTeam`; `teamId` on `stageRedirects`, `addRepositoryPermission`, `removeRepositoryPermission`). With the naive body translation the value binds to the query parameter and the body goes out empty - observed as `415 Unsupported Media Type` on `POST /v1/global-config`. `pre_normalize.mjs` drops the colliding query parameter on those operations. Two fork operations (`createSandboxesByNameForkV2/V3`) collide on the `name` path parameter; the body `name` is unreachable there (documented limitation). + +## Pagination + +Five dialects, all inferred per method in `post_process.mjs` from the query parameters and the 200 schema: + +| Dialect | Request token | Response token | Methods | +|---|---|---|---| +| timestamp | `until` | `$.pagination.next` (number) | deployments, aliases, domains, dns records, project domains, project and team members, teams, promote aliases (10) | +| continuation | `from` | `$.pagination.next` (base32 string) | projects (1) | +| next token | `next` | `$.pagination.next` | access groups (3), kms issuers, edge config backups (5) | +| cursor | `cursor` | `$.pagination.next`, `$.nextCursor` (vcr), `$.cursor` (ai gateway) | connect, feature flags, sandboxes, vcr, ai gateway (18) | +| page number | `page` | `$.pagination.page` / `$.pagination.numPages` | bulk redirects (1) | + +The numeric `until` token is decoded as a float64 by any-sdk and formatted with `%v`; verified live that Vercel accepts the resulting value (two deployments were returned with `"limit" = '1'`, i.e. the second page was fetched). `limit` is a reserved word in the SQL grammar: `LIMIT n` is pushed down as `?limit=n` on the 40 select methods that accept it (`queryParamPushdown.top`, max 100); to force a page size without a SQL LIMIT quote the identifier (`AND "limit" = '1'`). + +## Operations skipped or adjusted in the manifest + +- The nine OCI distribution operations (`GET /v2/`, `/v2/{teamSlug}/{projectSlug}/{repositoryName}/blobs/...`, `.../manifests/...`, `.../tags/list`) are `skip_this_resource`: the spec declares them on `https://api.vercel.com`, where `/v2/` answers with an nginx 404 (the container registry protocol host is not in the document), and three of them have no 2xx response. The management surface of the registry (`vcr.repositories`, `images`, `tags`, `permissions`) is exposed. `registry` is also a reserved word in the StackQL grammar (`REGISTRY PULL`), so it cannot be a resource name. +- `getDeploymentFileContents` (302-only) is skipped. +- Two select methods on one resource must differ in required parameters (the meta-route suite enforces it): `getAiGatewayVirtualModelConfig` (`GET /virtual-model-configs`, query-addressed) is `exec get_by_query`, and the v1 flag lists (`listFlags`, `listTeamFlags`) are `exec list_v1` beside the v2 `list`. +- `marketplace.experimentation_edge_config.get` returns `{items: {: value}, digest, purpose, updatedAt}`; StackQL's selectable-schema heuristic treats a property named `items` as a list envelope and rejects the object, so the method carries `stackql_object_key = $` (project the whole object as one row). + +## Non-JSON endpoints + +- Octet-stream request bodies (`uploadFile`, `uploadArtifact`, `uploadProjectAvatar`): the operation body schema is replaced by a one-column object (`value`) and a `golang_template_json_v0.1.0` transform emits it verbatim (cloudflare Workers AI precedent). Invoked as `EXEC vercel.deployments.files.upload @team_id = ..., @x_vercel_digest = '', @value = ''`. `@@json` payloads are rejected for this method ("payload map of declared type string") - use `@value`. +- jsonl / ndjson / stream+json / octet-stream responses (`listBillingCharges`, `listContractCommitments`, `getRuntimeLogs`, `getSessionCommandLogs`, `readSessionFile`): surfaced as one row with a `contents` text column via `text/plain` + `overrideMediaType` + `schema_override` + `objectKey $.items` + a text template (the bare-array wrap machinery). Go templates in any-sdk have no string split, so an NDJSON stream cannot be exploded into rows client-side. +- The same wrapper is applied to select methods whose JSON response schema is opaque (`{type: object}` with no properties, or `properties: {}`): `edge_config.schema.get` (the store's JSON schema document) and `domains_registrar.contact_info_schema.get`. Without it `DESCRIBE` has no columns and the meta-route suite fails. +- `getDeploymentEvents` declares both `application/json` and `application/stream+json`; the JSON variant is used (the API returns a JSON array unless `follow=1`). + +## StackQL engine observations + +- **Server mode: one physical table per resource.** In `stackql srv`, `drm.getTableName` is keyed on provider.service.resource plus the discovery generation, not the method. When two select methods of one resource return different shapes (projects `list` items vs `get` object; deployments `list` items carry `uid`, `get` carries `id`), the first method used in a session fixes the table and the other returns no rows for the rest of the session. `stackql exec` (one process per statement) is unaffected. The smoke suite (pgwire-lite over `srv`) keeps to the list method for projects and deployments; resources whose two shapes match (teams, env vars, edge config items) are fine. Reproduction: `tests/smoke_test.mjs` history in git, or run `SELECT ... FROM vercel.projects.projects WHERE team_id = ...` then `... WHERE id_or_name = ...` over one server. +- `DESCRIBE` reports the first select method (the more specific `get`), so `DESCRIBE vercel.deployments.deployments` shows `id` while the list rows carry `uid`. +- With `--update-path-param-names` path parameters are physically snake_case (`id_or_name`, `project_id`), so EXEC variables for path parameters must be snake (`@project_id`); query and header parameters resolve from snake_case through `request.nativeCasing: camel` (`@team_id`, `@x_vercel_digest`) and also accept the wire name. + +## Vercel platform notes + +- Hobby teams allow one Edge Config store; the smoke suite sweeps `stackql-smoke-*` stores before creating one. Deployments on Hobby are free (daily limit applies). +- A deployment into a project without a framework needs `project_settings` (`{"framework": null}`) or `skip_auto_detection_confirmation = '1'`; a project `build_command` makes Vercel run a build and fail a static upload for lack of an output directory (the smoke suite updates `dev_command` instead). +- Deployment protection applies to the `--.vercel.app` URL on Hobby (it serves the Vercel login page); the production alias `.vercel.app` is public. +- `listDeploymentFiles` returns a tree whose top level is the `src` directory. +- `GET /v1/security/firewall/bypass`, `/v1/bulk-redirects`, `/v2/sandboxes`, `/v1/vcr/repository` and `/v1/networking/privatelink/endpoints` require `projectId` (or `project`); `/v1/integrations/configurations` requires `view`; `/v1/billing/charges` requires `from` and `to`. `SHOW METHODS` lists them. diff --git a/README.md b/README.md index 52a1de4..3b033d7 100644 --- a/README.md +++ b/README.md @@ -1,273 +1,196 @@ -# `vercel` provider for [`stackql`](https://github.com/stackql/stackql) - -This repository is used to generate and document the `vercel` provider for StackQL, allowing you to query and manipulate Vercel resources using SQL-like syntax. The provider is built using the `@stackql/provider-utils` package, which provides tools for converting OpenAPI specifications into StackQL-compatible provider schemas. - -## Prerequisites - -To use the Vercel provider with StackQL, you'll need: - -1. A Vercel account with appropriate API credentials -2. A Vercel API token with sufficient permissions for the resources you want to access -3. StackQL CLI installed on your system (see [StackQL](https://github.com/stackql/stackql)) - -## 1. Download the Open API Specification - -First, download the Vercel API OpenAPI specification: - -```bash -rm -rf provider-dev/downloaded/* -curl -L https://openapi.vercel.sh/openapi.yaml \ - -o provider-dev/downloaded/vercel-openapi.yaml - -# Convert YAML to JSON if needed -python3 provider-dev/scripts/yaml_to_json.py \ - --input provider-dev/downloaded/vercel-openapi.yaml \ - --output provider-dev/downloaded/openapi.json -``` - -## 2. Split into Service Specs - -Next, split the monolithic OpenAPI specification into service-specific files: - -```bash -rm -rf provider-dev/source/* -npm run split -- \ - --provider-name vercel \ - --api-doc provider-dev/downloaded/openapi.json \ - --svc-discriminator tag \ - --output-dir provider-dev/source \ - --overwrite \ - --svc-name-overrides "$(cat <= 20, GNU make, bash (Linux, WSL or macOS) +- A local `stackql` binary for testing (`$STACKQL`, `./stackql`, or on `PATH`) +- A Vercel API token for the live smoke suite ([create one](https://vercel.com/docs/rest-api/reference/welcome#creating-an-access-token)); a Hobby team is sufficient and free + +Install dependencies: + +```bash +npm install +``` + +### Makefile + +Every step below is a `make` target (`make help` lists them). The composite targets are: + +```bash +make all # deps, full pipeline against the current upstream spec, offline + meta-route tests, docs, website build +make smoke # live smoke suite against the locally generated provider (sources .env if present) +``` + +`make all` never touches a Vercel account. The live suites are separate targets: `smoke`, `smoke-live` (against the published provider) and `smoke-cleanup`. Credentials are read from the environment or a gitignored `.env` file: + +```bash +VERCEL_API_TOKEN=... # required +VERCEL_TEAM_ID=... # optional; the token's default team is used otherwise +``` + +## 0. Fetch the spec + +```bash +make fetch-spec # or: npm run fetch-spec +``` + +Downloads the OpenAPI document into `provider-dev/downloaded/openapi.json` (gitignored, about 10 MB) and records the fetch date, stated version, path / operation / tag counts and sha256 in `provider-dev/config/spec_pin.json`. Drift from the recorded pin is reported, not fatal: the mapping validation below is what turns upstream change into a reviewed decision. `make check-spec` fails on drift for CI. + +## 1. Split into service specs + +```bash +make split +``` + +Splits the document into 38 per-service specs in `provider-dev/source/` using `provider-dev/scripts/svc-discriminator.mjs`, a tag -> service map. Versioned duplicate tags are folded (`checks` + `checks-v2` -> `checks`, `ai-gateway` + `api-ai-gateway` -> `ai_gateway`, `global-config` -> `edge_config`), single-operation tags are folded into their parent (`logs` -> `deployments`, `static-ips` -> `networking`), and the eight untagged operations are routed by path prefix. + +| Service | Surface | +|---|---| +| `projects` | projects, project domains, environment variables, promote aliases, transfer requests, traces | +| `deployments` | deployments, file upload, deployment files, events, runtime logs | +| `edge_config` | Edge Config stores, items, schema, tokens, backups | +| `teams`, `project_members`, `access_groups` | teams, members, access requests, project members, access groups | +| `domains`, `dns`, `domains_registrar`, `certs`, `aliases` | domains, DNS records, registrar (TLDs, pricing, orders), certificates, aliases | +| `environments` | shared environment variables, custom environments | +| `feature_flags`, `rolling_release`, `checks` | flags, segments, SDK keys, rolling releases, checks and check runs | +| `drains`, `log_drains`, `webhooks`, `integrations`, `marketplace`, `connect` | drains, legacy log drains, webhooks, integrations, marketplace installations, connectors | +| `security`, `networking`, `kms` | firewall config, bypass rules, attack mode, networks, PrivateLink, KMS issuers and keys | +| `sandboxes`, `vcr`, `storage`, `artifacts`, `edge_cache` | sandboxes and sessions, container registry, blob stores, remote cache artifacts, edge cache purges | +| `ai_gateway`, `observability`, `web_analytics`, `billing`, `bulk_redirects`, `project_routes`, `microfrontends`, `user`, `authentication` | AI Gateway, observability, analytics queries, billing, redirects, routes, microfrontends, user and events, API tokens | + +## 2. Mappings + +```bash +make mappings # analyze -> merge into provider-dev/config/all_services.csv +make validate-mappings # fails until every operation is mapped or skipped and no row is stale +``` + +`generate-mappings` (provider-utils `analyze`) writes a fresh skeleton to a temp dir; `provider-dev/scripts/merge_mappings.mjs` folds it into the checked-in manifest, preserving every existing `stackql_resource_name` / `stackql_method_name` / `stackql_verb` / `stackql_object_key` and appending new operations unmapped. `validate_mappings.mjs` checks completeness, staleness, snake_case names, valid verbs and unique method names per resource. + +Mapping results at the pinned snapshot: 413 rows, 400 mapped (156 `SELECT`, 53 `INSERT`, 41 `UPDATE`, 6 `REPLACE`, 56 `DELETE`, 88 `EXEC`), 13 skipped (the nine OCI distribution operations the spec places on `api.vercel.com` where they are not served, the 302-only file download, and the operations with no 2xx response - see [NOTES.md](NOTES.md)), 134 resources across 38 services, 18 of them without a select method (write-only or action-only surfaces such as `edge_cache.cache` and `kms.signing_keys`). + +## 3. Normalize + +```bash +make pre-normalize +make normalize +``` + +`pre_normalize.mjs` applies the Vercel-specific corrections recorded in [NOTES.md](NOTES.md): list responses the spec declares as objects but the API returns as bare arrays (Edge Config stores and tokens, log drains, webhooks, integration configurations), opaque `{type: object}` placeholders inside response `oneOf`s that would poison the merged schema, an undeclared microfrontends response, and request body properties that collide with a query parameter of the same name (the team `slug` alias), which otherwise leave the body empty. The generic provider-utils pass then flattens variants and wraps the remaining bare-array responses. + +## 4. Generate the provider + +```bash +make generate # generate-provider ... then post-process +``` + +```bash +npm run generate-provider -- \ + --provider-name vercel \ + --input-dir provider-dev/source \ + --output-dir provider-dev/openapi/src/vercel \ + --config-path provider-dev/config/all_services.csv \ + --servers '[{"url": "https://api.vercel.com"}]' \ + --provider-config '{"auth": {"type": "bearer", "credentialsenvvar": "VERCEL_API_TOKEN"}, "snake_case_aliases": true}' \ + --naive-req-body-translate \ + --update-path-param-names \ + --overwrite +node provider-dev/scripts/post_process.mjs +``` + +`post_process.mjs` adds what the generator cannot express, derived from each operation: `request.nativeCasing: camel` on all 400 methods; pagination on 32 list methods (10 timestamp `until`, 1 continuation `from`, 5 `next` token, 15 `cursor`, 1 page number); `LIMIT` pushdown on the 37 select methods that accept `limit`; the octet-stream request transform on the three upload methods (`files.upload`, `artifacts.upload`, `projects.upload_avatar`: the `value` variable is sent verbatim as the body); and a text wrapper for the seven responses that are not tabular JSON (billing jsonl, runtime logs, sandbox command logs and file reads, plus the two opaque JSON schema documents), surfaced as one row with a `contents` column. + +### Authentication + +Provider config: `{"auth": {"type": "bearer", "credentialsenvvar": "VERCEL_API_TOKEN"}}`. A different variable can be passed at runtime with `--auth='{"vercel": {"type": "bearer", "credentialsenvvar": "..."}}'`. + +## 5. Test the provider + +Three layers; the first two run in `make test` and `make all`, the third is live. + +```bash +make test-offline # tests/offline_validation.mjs - SHOW / DESCRIBE via stackql exec + generated-YAML assertions +make test-meta # bin/test-meta-routes.cjs over a local stackql server - every service, resource, method; DESCRIBE on every selectable resource +make smoke # tests/smoke_test.mjs - live, see below +``` + +### Smoke tests (live) + +[tests/smoke_test.mjs](tests/smoke_test.mjs) starts a `stackql srv` (local file registry, or the public registry with `--live`) and drives it with `@stackql/pgwire-lite`. It runs read smokes (user, teams, projects, deployments, aliases, domains, Edge Configs, tokens, event types, TLDs) and a full lifecycle mirroring the Terraform provider's headline resources: a project `INSERT` / `UPDATE`, an environment variable `INSERT` / `SELECT` / `UPDATE` / `DELETE`, an Edge Config store with items and a read token, a hello world `index.html` uploaded with `EXEC vercel.deployments.files.upload` and deployed to production with `INSERT INTO vercel.deployments.deployments`, polled to `READY` and fetched over HTTPS from its production alias, deployment files and events, `EXEC pause` / `unpause`, and finally the deletes. Everything is named `stackql-smoke-` and breadcrumbs are swept first. On a Hobby team the run is free; on Pro it is well under $1. + +```bash +make smoke # local provider +make smoke-live # published provider (post-publish verification) +make smoke-cleanup # sweep stackql-smoke-* projects and edge configs only +``` + +### UAT + +```bash +set -a; source .env; set +a +REG_ROOT="$(pwd)/provider-dev/openapi" +REG="{\"url\":\"file://${REG_ROOT}\",\"localDocRoot\":\"${REG_ROOT}\",\"verifyConfig\":{\"nopVerify\":true}}" +stackql --registry="${REG}" shell +``` + +```sql +SELECT id, name, framework FROM vercel.projects.projects WHERE team_id = 'team_xxxxxxxxxxxxxxxxxxxxxxxx'; +``` + +### CI + +[.github/workflows/build-and-test.yml](.github/workflows/build-and-test.yml): fetch the spec, split, merge mappings, validate, normalize, generate and fail on uncommitted generation drift; offline validation, meta-route suite and docs generation on every push and pull request; the secret-gated live smoke suite on pushes; and a weekly spec-drift job that opens an issue when upstream adds or removes operations. The web workflows build and deploy the microsite from `main`. + +## 6. Publish the provider + +Push the `vercel` dir to `providers/src` in a feature branch of the [`stackql-provider-registry`](https://github.com/stackql/stackql-provider-registry) and follow the [registry release flow](https://github.com/stackql/stackql-provider-registry/blob/dev/docs/build-and-deployment.md). Pull and verify from the dev registry: + +```bash +export DEV_REG="{ \"url\": \"https://registry-dev.stackql.app/providers\" }" +stackql --registry="${DEV_REG}" shell +``` + +```sql +registry pull vercel; +``` + +then `make smoke-live`. + +## 7. Generate web docs + +The microsite (`website/`) is Docusaurus 3.10 on the shared architecture used by the other provider microsites: navbar, footer, theme and plugins come from [`stackql/docusaurus-config`](https://github.com/stackql/docusaurus-config), vendored into `.shared-config/` at build time. Site-local files are the provider identity (`website/provider.js`), a thin `docusaurus.config.js` wrapper (which also turns on `showLastUpdateTime` so every page carries a "Last updated on" stamp), the shared components and theme under `src/`, and static assets including `static/CNAME` (`vercel-provider.stackql.io`). + +```bash +make docs # generate-docs --snake-case-aliases + website/scripts/sanitize-docs.mjs +make website # yarn install && yarn build (vendors the shared config; needs GitHub access) +make website-start # dev server +``` + +`headerContent1.txt` / `headerContent2.txt` in `provider-dev/docgen/provider-data/` supply the landing page: installation, authentication, team scope, casing, pagination, the getting-started queries (project inventory, deployments by state, environment variable audit, domains and DNS, Edge Config items, members and tokens), provisioning end to end and the static-site deployment walkthrough. + +To publish, select GitHub Actions as the Pages source and create the DNS record: + +| Source Domain | Record Type | Target | +|---|---|---| +| vercel-provider.stackql.io | CNAME | stackql.github.io. | + +## License + +MIT License - see [LICENSE](LICENSE). + +## Contributing + +Contributions are welcome. Please open an issue or pull request. diff --git a/bin/fetch-spec.sh b/bin/fetch-spec.sh new file mode 100644 index 0000000..818c8bf --- /dev/null +++ b/bin/fetch-spec.sh @@ -0,0 +1,42 @@ +#!/usr/bin/env bash + +# Downloads the Vercel REST API OpenAPI document (served unauthenticated as +# JSON at https://openapi.vercel.sh) into provider-dev/downloaded/openapi.json +# and records what was fetched in provider-dev/config/spec_pin.json: fetch +# date, the document's stated version, path and operation counts, and the +# sha256 of the content. +# +# Vercel publishes one unversioned, continuously updated document, so drift +# between fetches is expected. The pin is the record of what the checked-in +# provider was built from; the mapping manifest (all_services.csv) and +# validate_mappings.mjs are what turn an upstream change into a reviewed +# decision (new operations must be mapped, removed ones deleted). +# +# Usage: bin/fetch-spec.sh [--check] +# --check exit 1 if the downloaded document differs from the recorded pin +# (for CI drift detection); the pin is not rewritten + +set -euo pipefail + +SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +REPO_ROOT="$( cd "$SCRIPT_DIR/.." && pwd )" +DOWNLOAD_DIR="$REPO_ROOT/provider-dev/downloaded" +PIN_FILE="$REPO_ROOT/provider-dev/config/spec_pin.json" +SPEC_URL="https://openapi.vercel.sh/" +SPEC_FILE="openapi.json" + +CHECK=false +if [ "${1:-}" = "--check" ]; then + CHECK=true +fi + +mkdir -p "$DOWNLOAD_DIR" +TMP_FILE="$(mktemp)" +trap 'rm -f "$TMP_FILE"' EXIT + +echo "Fetching Vercel OpenAPI document from $SPEC_URL" +curl -fsSL -H 'Accept: application/json' "$SPEC_URL" -o "$TMP_FILE" + +CHECK="$CHECK" TMP_FILE="$TMP_FILE" DOWNLOAD_DIR="$DOWNLOAD_DIR" PIN_FILE="$PIN_FILE" \ +SPEC_URL="$SPEC_URL" SPEC_FILE="$SPEC_FILE" \ +node "$REPO_ROOT/provider-dev/scripts/record_spec_pin.mjs" diff --git a/bin/generate-docs.mjs b/bin/generate-docs.mjs deleted file mode 100644 index 4be9b84..0000000 --- a/bin/generate-docs.mjs +++ /dev/null @@ -1,44 +0,0 @@ -#!/usr/bin/env node - -import { docgen } from '@stackql/provider-utils'; - -async function generateDocs() { - // Get command line arguments - const args = process.argv.slice(2); - const getArg = (flag) => { - const index = args.indexOf(flag); - return index !== -1 ? args[index + 1] : null; - }; - - const providerName = getArg('--provider-name'); - const providerDir = getArg('--provider-dir'); - const outputDir = getArg('--output-dir'); - const providerDataDir = getArg('--provider-data-dir'); - - if (!providerName || !providerDir || !outputDir || !providerDataDir) { - console.error('Error: Missing required arguments'); - console.error('Usage: node generate-docs.mjs --provider-name NAME --provider-dir DIR --output-dir DIR --provider-data-dir DIR'); - process.exit(1); - } - - try { - console.log(`Generating docs for provider: ${providerName}`); - console.log(`Provider directory: ${providerDir}`); - console.log(`Output directory: ${outputDir}`); - console.log(`Provider data directory: ${providerDataDir}`); - - const result = await docgen.generateDocs({ - providerName, - providerDir, - outputDir, - providerDataDir - }); - - console.log('Documentation generated successfully:', result); - } catch (error) { - console.error('Error generating documentation:', error); - process.exit(1); - } -} - -generateDocs(); \ No newline at end of file diff --git a/bin/generate-docs.sh b/bin/generate-docs.sh deleted file mode 100644 index 0602e15..0000000 --- a/bin/generate-docs.sh +++ /dev/null @@ -1,63 +0,0 @@ -#!/usr/bin/env bash - -# Exit on error -set -e - -# Get the script directory for relative paths -SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" -REPO_ROOT="$( cd "$SCRIPT_DIR/.." && pwd )" - -# Parse command line arguments -while [[ $# -gt 0 ]]; do - case $1 in - --provider-name) - PROVIDER_NAME="$2" - shift 2 - ;; - --provider-dir) - PROVIDER_DIR="$2" - shift 2 - ;; - --output-dir) - OUTPUT_DIR="$2" - shift 2 - ;; - --provider-data-dir) - PROVIDER_DATA_DIR="$2" - shift 2 - ;; - --help) - echo "Usage: generate-docs.sh [OPTIONS]" - echo "" - echo "Options:" - echo " --provider-name NAME Provider name (default: snowflake)" - echo " --provider-dir DIR Provider directory path (default: $PROVIDER_DIR)" - echo " --output-dir DIR Output directory for docs (default: $OUTPUT_DIR)" - echo " --provider-data-dir DIR Provider data directory (default: $PROVIDER_DATA_DIR)" - echo " --help Show this help message" - exit 0 - ;; - *) - echo "Unknown option: $1" - echo "Use --help for usage information" - exit 1 - ;; - esac -done - -echo "📚 Generating documentation using @stackql/provider-utils..." - -# Run the Node.js script with arguments -node --experimental-modules "$SCRIPT_DIR/generate-docs.mjs" \ - --provider-name "$PROVIDER_NAME" \ - --provider-dir "$PROVIDER_DIR" \ - --output-dir "$OUTPUT_DIR" \ - --provider-data-dir "$PROVIDER_DATA_DIR" - -# Check if command succeeded -if [ $? -ne 0 ]; then - echo "❌ Documentation generation failed" - exit 1 -fi - -echo "✅ Documentation generated successfully" \ No newline at end of file diff --git a/bin/generate-mappings.mjs b/bin/generate-mappings.mjs deleted file mode 100644 index f711fbc..0000000 --- a/bin/generate-mappings.mjs +++ /dev/null @@ -1,42 +0,0 @@ -#!/usr/bin/env node - -import { providerdev } from '@stackql/provider-utils'; - -async function generateMappings() { - // Get command line arguments - const args = process.argv.slice(2); - const getArg = (flag) => { - const index = args.indexOf(flag); - return index !== -1 ? args[index + 1] : null; - }; - - const providerName = getArg('--provider-name'); - const inputDir = getArg('--input-dir'); - const outputDir = getArg('--output-dir'); - const verbose = args.includes('--verbose'); - - if (!providerName || !inputDir || !outputDir) { - console.error('Error: Missing required arguments'); - console.error('Usage: node generate-mappings.mjs --provider-name NAME --input-dir DIR --output-dir DIR [--verbose]'); - process.exit(1); - } - - try { - console.log(`Analyzing OpenAPI specs for provider: ${providerName}`); - console.log(`Input directory: ${inputDir}`); - console.log(`Output directory: ${outputDir}`); - - const result = await providerdev.analyze({ - inputDir, - outputDir, - verbose - }); - - console.log('Analysis completed successfully:', result); - } catch (error) { - console.error('Error analyzing OpenAPI specs:', error); - process.exit(1); - } -} - -generateMappings(); \ No newline at end of file diff --git a/bin/generate-mappings.sh b/bin/generate-mappings.sh deleted file mode 100644 index a4921c1..0000000 --- a/bin/generate-mappings.sh +++ /dev/null @@ -1,83 +0,0 @@ -#!/usr/bin/env bash - -# Exit on error -set -e - -# Get the script directory for relative paths -SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" -REPO_ROOT="$( cd "$SCRIPT_DIR/.." && pwd )" - -# Default values -PROVIDER_NAME="" -INPUT_DIR="" -OUTPUT_DIR="" -VERBOSE=false - -# Parse command line arguments -while [[ $# -gt 0 ]]; do - case $1 in - --provider-name) - PROVIDER_NAME="$2" - shift 2 - ;; - --input-dir) - INPUT_DIR="$2" - shift 2 - ;; - --output-dir) - OUTPUT_DIR="$2" - shift 2 - ;; - --verbose) - VERBOSE=true - shift - ;; - --help) - echo "Usage: generate-mappings.sh [OPTIONS]" - echo "" - echo "Options:" - echo " --provider-name NAME Provider name (required)" - echo " --input-dir DIR Input directory containing split OpenAPI files (required)" - echo " --output-dir DIR Output directory for mapping file (required)" - echo " --verbose Enable verbose output" - echo " --help Show this help message" - exit 0 - ;; - *) - echo "Unknown option: $1" - echo "Use --help for usage information" - exit 1 - ;; - esac -done - -# Check required arguments -if [ -z "$PROVIDER_NAME" ] || [ -z "$INPUT_DIR" ] || [ -z "$OUTPUT_DIR" ]; then - echo "Error: Missing required arguments" - echo "Use --help for usage information" - exit 1 -fi - -echo "🔍 Analyzing OpenAPI specs to generate mappings..." -echo "Provider: $PROVIDER_NAME" -echo "Input Directory: $INPUT_DIR" -echo "Output Directory: $OUTPUT_DIR" - -# Build command arguments -ARGS=("--provider-name" "$PROVIDER_NAME" "--input-dir" "$INPUT_DIR" "--output-dir" "$OUTPUT_DIR") - -if [ "$VERBOSE" = true ]; then - ARGS+=("--verbose") - echo "Verbose: Yes" -fi - -# Run the Node.js script with arguments -node --experimental-modules "$SCRIPT_DIR/generate-mappings.mjs" "${ARGS[@]}" - -# Check if command succeeded -if [ $? -ne 0 ]; then - echo "❌ Mapping generation failed" - exit 1 -fi - -echo "✅ Mapping file generated successfully at: $OUTPUT_DIR/all_services.csv" \ No newline at end of file diff --git a/bin/generate-provider.mjs b/bin/generate-provider.mjs deleted file mode 100644 index 501eead..0000000 --- a/bin/generate-provider.mjs +++ /dev/null @@ -1,66 +0,0 @@ -#!/usr/bin/env node - -import { providerdev } from '@stackql/provider-utils'; - -async function generateProvider() { - // Get command line arguments - const args = process.argv.slice(2); - const getArg = (flag) => { - const index = args.indexOf(flag); - return index !== -1 ? args[index + 1] : null; - }; - - const providerName = getArg('--provider-name'); - const inputDir = getArg('--input-dir'); - const outputDir = getArg('--output-dir'); - const configPath = getArg('--config-path'); - const servers = getArg('--servers'); - const providerConfig = getArg('--provider-config'); - const skipFiles = getArg('--skip-files')?.split(',') || []; - const overwrite = args.includes('--overwrite'); - const verbose = args.includes('--verbose'); - - if (!providerName || !inputDir || !outputDir || !configPath) { - console.error('Error: Missing required arguments'); - console.error('Usage: node generate-provider.mjs --provider-name NAME --input-dir DIR --output-dir DIR --config-path PATH [--servers JSON] [--provider-config JSON] [--skip-files LIST] [--overwrite] [--verbose]'); - process.exit(1); - } - - try { - console.log(`Generating StackQL provider extensions for: ${providerName}`); - console.log(`Input directory: ${inputDir}`); - console.log(`Output directory: ${outputDir}`); - console.log(`Config path: ${configPath}`); - - if (servers) { - console.log(`Custom servers configuration provided`); - } - - if (providerConfig) { - console.log(`Custom provider configuration provided`); - } - - if (skipFiles.length > 0) { - console.log(`Skipping files: ${skipFiles.join(', ')}`); - } - - const result = await providerdev.generate({ - inputDir, - outputDir, - configPath, - providerId: providerName, - servers, - providerConfig, - skipFiles, - overwrite, - verbose - }); - - console.log('Provider generation completed successfully:', result); - } catch (error) { - console.error('Error generating provider extensions:', error); - process.exit(1); - } -} - -generateProvider(); \ No newline at end of file diff --git a/bin/generate-provider.sh b/bin/generate-provider.sh deleted file mode 100644 index 429933a..0000000 --- a/bin/generate-provider.sh +++ /dev/null @@ -1,134 +0,0 @@ -#!/usr/bin/env bash - -# Exit on error -set -e - -# Get the script directory for relative paths -SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" -REPO_ROOT="$( cd "$SCRIPT_DIR/.." && pwd )" - -# Default values -PROVIDER_NAME="" -INPUT_DIR="" -OUTPUT_DIR="" -CONFIG_PATH="" -SERVERS="" -PROVIDER_CONFIG="" -SKIP_FILES="" -OVERWRITE=false -VERBOSE=false - -# Parse command line arguments -while [[ $# -gt 0 ]]; do - case $1 in - --provider-name) - PROVIDER_NAME="$2" - shift 2 - ;; - --input-dir) - INPUT_DIR="$2" - shift 2 - ;; - --output-dir) - OUTPUT_DIR="$2" - shift 2 - ;; - --config-path) - CONFIG_PATH="$2" - shift 2 - ;; - --servers) - SERVERS="$2" - shift 2 - ;; - --provider-config) - PROVIDER_CONFIG="$2" - shift 2 - ;; - --skip-files) - SKIP_FILES="$2" - shift 2 - ;; - --overwrite) - OVERWRITE=true - shift - ;; - --verbose) - VERBOSE=true - shift - ;; - --help) - echo "Usage: generate-provider.sh [OPTIONS]" - echo "" - echo "Options:" - echo " --provider-name NAME Provider name/ID (required)" - echo " --input-dir DIR Input directory containing split OpenAPI files (required)" - echo " --output-dir DIR Output directory for provider (required)" - echo " --config-path PATH Path to CSV mapping file (required)" - echo " --servers JSON JSON string with servers configuration" - echo " --provider-config JSON JSON string with provider configuration" - echo " --skip-files LIST Comma-separated list of files to skip" - echo " --overwrite Overwrite existing files" - echo " --verbose Enable verbose output" - echo " --help Show this help message" - exit 0 - ;; - *) - echo "Unknown option: $1" - echo "Use --help for usage information" - exit 1 - ;; - esac -done - -# Check required arguments -if [ -z "$PROVIDER_NAME" ] || [ -z "$INPUT_DIR" ] || [ -z "$OUTPUT_DIR" ] || [ -z "$CONFIG_PATH" ]; then - echo "Error: Missing required arguments" - echo "Use --help for usage information" - exit 1 -fi - -echo "🔧 Generating StackQL provider extensions..." -echo "Provider: $PROVIDER_NAME" -echo "Input Directory: $INPUT_DIR" -echo "Output Directory: $OUTPUT_DIR" -echo "Config Path: $CONFIG_PATH" - -# Build command arguments -ARGS=("--provider-name" "$PROVIDER_NAME" "--input-dir" "$INPUT_DIR" "--output-dir" "$OUTPUT_DIR" "--config-path" "$CONFIG_PATH") - -if [ -n "$SERVERS" ]; then - ARGS+=("--servers" "$SERVERS") - echo "Custom servers configuration provided" -fi - -if [ -n "$PROVIDER_CONFIG" ]; then - ARGS+=("--provider-config" "$PROVIDER_CONFIG") - echo "Custom provider configuration provided" -fi - -if [ -n "$SKIP_FILES" ]; then - ARGS+=("--skip-files" "$SKIP_FILES") - echo "Skipping files: $SKIP_FILES" -fi - -if [ "$OVERWRITE" = true ]; then - ARGS+=("--overwrite") - echo "Overwrite: Yes" -fi - -if [ "$VERBOSE" = true ]; then - ARGS+=("--verbose") - echo "Verbose: Yes" -fi - -# Run the Node.js script with arguments -node --experimental-modules "$SCRIPT_DIR/generate-provider.mjs" "${ARGS[@]}" - -# Check if command succeeded -if [ $? -ne 0 ]; then - echo "❌ Provider generation failed" - exit 1 -fi - -echo "✅ Provider generated successfully at: $OUTPUT_DIR" \ No newline at end of file diff --git a/bin/split.mjs b/bin/split.mjs deleted file mode 100644 index 02a344c..0000000 --- a/bin/split.mjs +++ /dev/null @@ -1,76 +0,0 @@ -#!/usr/bin/env node - -import { providerdev } from '@stackql/provider-utils'; - -async function splitOpenApi() { - // Get command line arguments - const args = process.argv.slice(2); - const getArg = (flag) => { - const index = args.indexOf(flag); - return index !== -1 ? args[index + 1] : null; - }; - - const providerName = getArg('--provider-name'); - const apiDoc = getArg('--api-doc'); - const outputDir = getArg('--output-dir'); - const svcDiscriminator = getArg('--svc-discriminator') || 'tag'; - const exclude = getArg('--exclude') || ''; - const overwrite = args.includes('--overwrite'); - const verbose = args.includes('--verbose'); - const svcNameOverridesStr = getArg('--svc-name-overrides') || '{}'; - - let svcNameOverrides = {}; - try { - svcNameOverrides = JSON.parse(svcNameOverridesStr); - } catch (err) { - console.error('Error parsing service name overrides JSON:', err.message); - console.error('Please ensure the JSON format is correct'); - process.exit(1); - } - - if (!providerName || !apiDoc || !outputDir) { - console.error('Error: Missing required arguments'); - console.error('Usage: node split.mjs --provider-name NAME --api-doc PATH --output-dir DIR [--svc-discriminator tag|path] [--exclude LIST] [--svc-name-overrides JSON] [--overwrite] [--verbose]'); - process.exit(1); - } - - try { - console.log(`Splitting OpenAPI doc for provider: ${providerName}`); - console.log(`API Doc: ${apiDoc}`); - console.log(`Output directory: ${outputDir}`); - console.log(`Service Discriminator: ${svcDiscriminator}`); - - if (exclude) { - console.log(`Excluding: ${exclude}`); - } - - const numOverrides = Object.keys(svcNameOverrides).length; - if (numOverrides > 0) { - console.log(`Service name overrides: ${numOverrides} mappings`); - if (verbose) { - console.log('Override mappings:'); - for (const [original, newName] of Object.entries(svcNameOverrides)) { - console.log(` ${original} -> ${newName}`); - } - } - } - - const result = await providerdev.split({ - apiDoc, - providerName, - outputDir, - svcDiscriminator, - exclude, - overwrite, - verbose, - svcNameOverrides - }); - - console.log('Split operation completed successfully:', result); - } catch (error) { - console.error('Error splitting OpenAPI doc:', error); - process.exit(1); - } -} - -splitOpenApi(); \ No newline at end of file diff --git a/bin/split.sh b/bin/split.sh deleted file mode 100644 index 6f961f7..0000000 --- a/bin/split.sh +++ /dev/null @@ -1,123 +0,0 @@ -#!/usr/bin/env bash - -# Exit on error -set -e - -# Get the script directory for relative paths -SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" -REPO_ROOT="$( cd "$SCRIPT_DIR/.." && pwd )" - -# Default values -PROVIDER_NAME="" -API_DOC="" -OUTPUT_DIR="" -SVC_DISCRIMINATOR="tag" -EXCLUDE="" -OVERWRITE=false -VERBOSE=false -SVC_NAME_OVERRIDES="{}" - -# Parse command line arguments -while [[ $# -gt 0 ]]; do - case $1 in - --provider-name) - PROVIDER_NAME="$2" - shift 2 - ;; - --api-doc) - API_DOC="$2" - shift 2 - ;; - --output-dir) - OUTPUT_DIR="$2" - shift 2 - ;; - --svc-discriminator) - SVC_DISCRIMINATOR="$2" - shift 2 - ;; - --exclude) - EXCLUDE="$2" - shift 2 - ;; - --svc-name-overrides) - SVC_NAME_OVERRIDES="$2" - shift 2 - ;; - --overwrite) - OVERWRITE=true - shift - ;; - --verbose) - VERBOSE=true - shift - ;; - --help) - echo "Usage: split.sh [OPTIONS]" - echo "" - echo "Options:" - echo " --provider-name NAME Provider name (required)" - echo " --api-doc PATH Path to OpenAPI document (required)" - echo " --output-dir DIR Output directory for split files (required)" - echo " --svc-discriminator TYPE Service discriminator type: 'tag' or 'path' (default: tag)" - echo " --exclude LIST Comma-separated list of tags or paths to exclude" - echo " --svc-name-overrides JSON JSON object mapping original service names to new names" - echo " --overwrite Overwrite existing files" - echo " --verbose Enable verbose output" - echo " --help Show this help message" - exit 0 - ;; - *) - echo "Unknown option: $1" - echo "Use --help for usage information" - exit 1 - ;; - esac -done - -# Check required arguments -if [ -z "$PROVIDER_NAME" ] || [ -z "$API_DOC" ] || [ -z "$OUTPUT_DIR" ]; then - echo "Error: Missing required arguments" - echo "Use --help for usage information" - exit 1 -fi - -echo "🔪 Splitting OpenAPI document..." -echo "Provider: $PROVIDER_NAME" -echo "API Doc: $API_DOC" -echo "Output Directory: $OUTPUT_DIR" -echo "Service Discriminator: $SVC_DISCRIMINATOR" - -# Build command arguments -ARGS=("--provider-name" "$PROVIDER_NAME" "--api-doc" "$API_DOC" "--output-dir" "$OUTPUT_DIR" "--svc-discriminator" "$SVC_DISCRIMINATOR") - -if [ -n "$EXCLUDE" ]; then - ARGS+=("--exclude" "$EXCLUDE") - echo "Excluding: $EXCLUDE" -fi - -if [ "$SVC_NAME_OVERRIDES" != "{}" ]; then - ARGS+=("--svc-name-overrides" "$SVC_NAME_OVERRIDES") - echo "Service Name Overrides: $SVC_NAME_OVERRIDES" -fi - -if [ "$OVERWRITE" = true ]; then - ARGS+=("--overwrite") - echo "Overwrite: Yes" -fi - -if [ "$VERBOSE" = true ]; then - ARGS+=("--verbose") - echo "Verbose: Yes" -fi - -# Run the Node.js script with arguments -node --experimental-modules "$SCRIPT_DIR/split.mjs" "${ARGS[@]}" - -# Check if command succeeded -if [ $? -ne 0 ]; then - echo "❌ Split operation failed" - exit 1 -fi - -echo "✅ Split operation completed successfully" \ No newline at end of file diff --git a/bin/start-server.sh b/bin/start-server.sh index e050450..ae23ad4 100644 --- a/bin/start-server.sh +++ b/bin/start-server.sh @@ -59,7 +59,7 @@ fi # If registry path not specified, use current directory if [ -z "$REG_PATH" ]; then - REG_PATH="$BASE_DIR/provider-dev/openapi/src" + REG_PATH="$BASE_DIR/provider-dev/openapi" fi echo "Using provider: $PROVIDER" @@ -67,22 +67,23 @@ echo "Registry path: $REG_PATH" echo "Port: $PORT" echo "Verify signatures: $VERIFY" -# Check if stackql binary exists -if [ ! -f "$BASE_DIR/stackql" ]; then +# Resolve the stackql binary: $STACKQL, ./stackql, `stackql` on PATH, else +# download the latest release into the repo root (gitignored). +if [ -n "${STACKQL:-}" ] && [ -x "$STACKQL" ]; then + STACKQL_BIN="$STACKQL" +elif [ -x "$BASE_DIR/stackql" ]; then + STACKQL_BIN="$BASE_DIR/stackql" +elif command -v stackql > /dev/null 2>&1; then + STACKQL_BIN="$(command -v stackql)" +else echo "StackQL binary not found. Downloading..." - - # Determine OS and architecture OS=$(uname -s | tr '[:upper:]' '[:lower:]') ARCH=$(uname -m) - - # Map architecture to stackql naming if [ "$ARCH" = "x86_64" ]; then ARCH="amd64" elif [ "$ARCH" = "aarch64" ] || [ "$ARCH" = "arm64" ]; then ARCH="arm64" fi - - # Set download URL based on OS if [ "$OS" = "darwin" ]; then DOWNLOAD_URL="https://releases.stackql.io/stackql/latest/stackql_darwin_${ARCH}.zip" elif [ "$OS" = "linux" ]; then @@ -92,15 +93,15 @@ if [ ! -f "$BASE_DIR/stackql" ]; then echo "Please download stackql manually from https://github.com/stackql/stackql/releases" exit 1 fi - - # Download and extract cd "$BASE_DIR" curl -L -o stackql.zip "$DOWNLOAD_URL" unzip -o stackql.zip rm stackql.zip chmod +x stackql + STACKQL_BIN="$BASE_DIR/stackql" echo "StackQL binary downloaded successfully" fi +echo "StackQL binary: $STACKQL_BIN ($("$STACKQL_BIN" --version 2>/dev/null | head -1))" # Set registry configuration if [ "$VERIFY" = "true" ]; then @@ -118,7 +119,7 @@ fi # Start the server echo "Starting StackQL server with registry: $REG" cd "$BASE_DIR" -nohup ./stackql --registry="${REG}" --pgsrv.port="${PORT}" srv > stackql-server.log 2>&1 & +nohup "$STACKQL_BIN" --registry="${REG}" --pgsrv.port="${PORT}" srv > stackql-server.log 2>&1 & SERVER_PID=$! # Check if server started successfully diff --git a/bin/test-meta-routes.cjs b/bin/test-meta-routes.cjs index 822a5c4..00a302a 100644 --- a/bin/test-meta-routes.cjs +++ b/bin/test-meta-routes.cjs @@ -1,431 +1,458 @@ -#!/usr/bin/env node - -const { runQuery } = require('@stackql/pgwire-lite'); -const fs = require('fs'); -const path = require('path'); - -// Get current directory -const baseDir = path.resolve(path.dirname(process.argv[1]), '..'); - -// Default connection settings -const defaultOptions = { - user: 'stackql', - database: 'stackql', - host: 'localhost', - port: 5444, - debug: false, -}; - -// Parse command line arguments -const args = process.argv.slice(2); -let provider = null; -let port = 5444; -let verbose = false; -let outputFormat = 'json'; -let timeoutMs = 60000; // Default timeout: 60 seconds - -for (let i = 0; i < args.length; i++) { - if (args[i].startsWith('--')) { - switch (args[i]) { - case '--port': - port = parseInt(args[++i], 10); - break; - case '--verbose': - verbose = true; - break; - case '--format': - outputFormat = args[++i]; - if (!['json', 'csv', 'markdown'].includes(outputFormat)) { - console.error(`Error: Invalid output format "${outputFormat}". Must be json, csv, or markdown.`); - process.exit(1); - } - break; - case '--timeout': - timeoutMs = parseInt(args[++i], 10); - break; - case '--help': - console.log(` -Usage: test-meta-routes.js [OPTIONS] - -Test all metadata routes for a StackQL provider. - -Arguments: - provider Name of the provider to test - -Options: - --port PORT Server port (default: 5444) - --verbose Enable verbose output - --format FORMAT Output format: json, csv, markdown (default: json) - --timeout MILLISECONDS Query timeout in milliseconds (default: 60000) - --help Display this help message - `); - process.exit(0); - break; - default: - console.error(`Error: Unknown option "${args[i]}"`); - process.exit(1); - } - } else if (!provider) { - provider = args[i]; - } -} - -// Check that provider was specified -if (!provider) { - console.error('Error: Provider name must be specified'); - console.error('Usage: test-meta-routes.js [OPTIONS]'); - process.exit(1); -} - -// Set up connection options -const connectionOptions = { - ...defaultOptions, - port, - // Set query timeout - statement_timeout: timeoutMs, -}; - -// Get start time -const startTime = new Date(); - -const results = { - provider, - totalServices: 0, - totalResources: 0, - totalMethods: 0, - selectableMethods: 0, - nonSelectableResourceCount: 0, - nonSelectableResources: [], -}; - -/** - * Run a query and handle errors - * @param {string} query - SQL query to run - * @param {string} description - Description for logging - * @returns {Promise} - Query results - */ -async function executeQuery(query, description) { - if (verbose) { - console.log(`Running: ${query}`); - } else { - process.stdout.write(`${description}... `); - } - - try { - const result = await runQuery(connectionOptions, query); - - if (!verbose) { - if (result.data && result.data.length) { - console.log(`✅ (${result.data.length} rows)`); - } else { - console.log('✅'); - } - } else { - console.info(result.data); - } - - return result.data; - } catch (error) { - if (!verbose) { - console.log('❌'); - } - - results.errors.push({ - query, - description, - error: error.message, - timestamp: new Date().toISOString() - }); - - results.summary.errors++; - - if (error.message.includes('the last operation didn\'t produce a result')) { - return []; - } - - if (error.message.includes('SELECT not supported for this resource')) { - if (verbose) { - console.warn(` Warning: Resource is not selectable`); - } - return null; - } - - console.error(`Error executing ${description}: ${error.message}`); - return []; - } -} - -/** - * Test all provider meta routes - */ -async function testMetaRoutes() { - try { - console.log(`\n🔍 Testing meta routes for provider: ${provider}\n`); - - // SHOW PROVIDERS to verify provider exists - const registryQuery = "SHOW PROVIDERS"; - const providers = await executeQuery(registryQuery, "Checking registry providers"); - - const providerExists = providers && providers.some(p => p.name === provider); - if (!providerExists) { - console.error(`Error: Provider '${provider}' not found in registry`); - if (providers && providers.length > 0) { - console.log("Available providers:"); - providers.forEach(p => console.log(` - ${p.name}`)); - } - process.exit(1); - } - - // SHOW SERVICES IN - const servicesQuery = `SHOW SERVICES IN ${provider}`; - const services = await executeQuery(servicesQuery, "Getting services"); - - if (!services || services.length === 0) { - console.error(`Error: No services found for provider '${provider}'`); - process.exit(1); - } - - console.log(`\nFound ${services.length} services in ${provider}`); - results.totalServices += services.length; - - // for each service - for (const service of services) { - const serviceName = service.name; - console.log(`\n📊 Processing service: ${serviceName}`); - - // SHOW RESOURCES IN . - const resourcesQuery = `SHOW RESOURCES IN ${provider}.${serviceName}`; - const resources = await executeQuery(resourcesQuery, `Getting resources for ${serviceName}`); - - if (!resources || resources.length === 0) { - console.error(`Error: No resources found for ${provider}.${serviceName}`); - process.exit(1); - } - - console.log(`Found ${resources.length} resources in ${serviceName}`); - results.totalResources += resources.length; - - // for each resource - for (const resource of resources) { - const resourceName = resource.name; - console.log(`\n 🔹 Testing resource: ${resourceName}`); - - const resourceFQRN = `${provider}.${serviceName}.${resourceName}`; - const resourceData = { - name: resourceName, - service: serviceName, - selectable: false, - sqlVerbs: {} - }; - - // SHOW EXTENDED METHODS IN .. - const methodsQuery = `SHOW EXTENDED METHODS IN ${resourceFQRN}`; - const methods = await executeQuery(methodsQuery, ` Getting methods for ${resourceName}`); - if (!methods || methods.length === 0) { - console.error(`Error: Resource ${resourceName} has no methods`); - process.exit(1); - } else { - console.log(`Found ${methods.length} methods for ${resourceName}`); - } - - results.totalMethods += methods.length; - - for (const method of methods) { - const methodName = method.MethodName; - const sqlVerb = method.SQLVerb || 'exec'; - - if(sqlVerb.toLowerCase() === 'select') { - results.selectableMethods++; - resourceData.selectable = true; - } - - // Initialize the array if it doesn't exist yet - if(!resourceData.sqlVerbs[sqlVerb]) { - resourceData.sqlVerbs[sqlVerb] = []; - } - - // Convert comma-delimited list to an array of trimmed values - let requiredParamsArray = []; - if (method.RequiredParams) { - requiredParamsArray = method.RequiredParams - .split(',') - .map(param => param.trim()) - .filter(param => param.length > 0); - } - - // Push the method info to the array with the parsed required params - resourceData.sqlVerbs[sqlVerb].push({ - methodName, - requiredParams: requiredParamsArray - }); - } - - // non exec methods must have unique signatures within a resource - // in other words no two methods mapped to the same sqlVerb should have the exact same set of required params, order is not important - // if this condition is detected, log it and exit the program immediately - let hasSelect = false; - for (const [verb, methods] of Object.entries(resourceData.sqlVerbs)) { - if (verb.toLowerCase() === 'select') { - hasSelect = true; - } - if (verb.toLowerCase() === 'exec') { - continue; - } - const seenSignatures = new Set(); - for (const method of methods) { - const signature = JSON.stringify(method.requiredParams); - if (seenSignatures.has(signature)) { - console.error(`Error: Duplicate method signature found for ${verb} in ${resourceData.service}.${resourceName}:`, method); - process.exit(1); - } - seenSignatures.add(signature); - } - } - - if (!hasSelect) { - results.nonSelectableResourceCount++; - results.nonSelectableResources.push(`${resourceData.service}.${resourceName}`); - } - - // Try DESCRIBE EXTENDED if available - if(resourceData.selectable) { - try { - const describeExtendedQuery = `DESCRIBE EXTENDED ${resourceFQRN}`; - const extendedColumns = await executeQuery(describeExtendedQuery, ` Describing extended ${resourceName}`); - - if (extendedColumns !== null && extendedColumns.length > 0) { - console.log(`Found ${extendedColumns.length} extended columns for ${resourceName}`); - } else { - console.error(`ERROR: No columns found for ${resourceName}`); - process.exit(1); - } - } catch (error) { - console.error(`Error describing extended ${resourceName}:`, error.message); - process.exit(1); - } - } - - } - } - - // Calculate execution time - const endTime = new Date(); - const executionTime = (endTime - startTime) / 1000; // in seconds - results.executionTime = executionTime; - - // Output summary - console.log("\n📋 Test Summary:"); - console.info(results); - - // Save results to file - // const resultsDir = path.join(baseDir, 'test-results'); - // if (!fs.existsSync(resultsDir)) { - // fs.mkdirSync(resultsDir, { recursive: true }); - // } - - // const timestamp = new Date().toISOString().replace(/[:.]/g, '-'); - - // if (outputFormat === 'json') { - // const resultsFile = path.join(resultsDir, `${provider}-meta-test-${timestamp}.json`); - // fs.writeFileSync(resultsFile, JSON.stringify(results, null, 2)); - // console.log(`\nDetailed results saved to: ${resultsFile}`); - // } - // else if (outputFormat === 'csv') { - // // Generate CSV files - - // // Main summary CSV - // const summaryFile = path.join(resultsDir, `${provider}-meta-test-summary-${timestamp}.csv`); - // const summaryCSV = [ - // 'Provider,Timestamp,Services,Resources,Methods,Selectable,Insertable,Updatable,Deletable,Executable,Errors,ExecutionTime', - // `${provider},${results.timestamp},${results.summary.totalServices},${results.summary.totalResources},${results.summary.totalMethods},${results.summary.selectableMethods},${results.summary.insertableMethods},${results.summary.updatableMethods},${results.summary.deletableMethods},${results.summary.executableMethods},${results.summary.errors},${results.executionTime}` - // ].join('\n'); - // fs.writeFileSync(summaryFile, summaryCSV); - - // // Services CSV - // const servicesFile = path.join(resultsDir, `${provider}-meta-test-services-${timestamp}.csv`); - // const servicesCSV = [ - // 'Service,Title,ResourceCount', - // ...results.services.map(s => `${s.name},${s.title || ''},${s.resourceCount || 0}`) - // ].join('\n'); - // fs.writeFileSync(servicesFile, servicesCSV); - - // // Resources CSV - // const resourcesFile = path.join(resultsDir, `${provider}-meta-test-resources-${timestamp}.csv`); - // const resourcesCSV = [ - // 'Service,Resource,FQRN,Selectable,ColumnCount,MethodCount', - // ...results.resources.map(r => `${r.service},${r.name},${r.fqrn},${r.selectable},${r.columnCount || 0},${r.methodCount || 0}`) - // ].join('\n'); - // fs.writeFileSync(resourcesFile, resourcesCSV); - - // // Methods CSV - // const methodsFile = path.join(resultsDir, `${provider}-meta-test-methods-${timestamp}.csv`); - // const methodsCSV = [ - // 'Service,Resource,Method,SQLVerb,FQRN', - // ...results.methods.map(m => `${m.service},${m.resource},${m.name},${m.sqlVerb},${m.fqrn}`) - // ].join('\n'); - // fs.writeFileSync(methodsFile, methodsCSV); - - // console.log(`\nDetailed results saved to CSV files in: ${resultsDir}`); - // } - // else if (outputFormat === 'markdown') { - // const mdFile = path.join(resultsDir, `${provider}-meta-test-${timestamp}.md`); - - // const markdownContent = [ - // `# StackQL Provider Test Results: ${provider}`, - // '', - // `Test run: ${results.timestamp}`, - // '', - // '## Summary', - // '', - // '| Metric | Count |', - // '|--------|-------|', - // `| Services | ${results.summary.totalServices} |`, - // `| Resources | ${results.summary.totalResources} |`, - // `| Methods | ${results.summary.totalMethods} |`, - // `| Errors | ${results.summary.errors} |`, - // `| Execution Time | ${results.executionTime.toFixed(2)} seconds |`, - // '', - // '### Methods by SQL Verb', - // '', - // '| Verb | Count |', - // '|------|-------|', - // ...Object.entries(results.verbs).map(([verb, count]) => `| ${verb.toUpperCase()} | ${count} |`), - // '', - // '## Services', - // '', - // '| Service | Resources |', - // '|---------|-----------|', - // ...results.services.map(s => `| ${s.name} | ${s.resourceCount || 0} |`), - // '', - // '## Resources with Most Methods', - // '', - // '| Resource | Service | Methods | Selectable |', - // '|----------|---------|---------|------------|', - // ...results.resources - // .sort((a, b) => (b.methodCount || 0) - (a.methodCount || 0)) - // .slice(0, 20) - // .map(r => `| ${r.name} | ${r.service} | ${r.methodCount || 0} | ${r.selectable ? '✓' : '✗'} |`), - // '', - // '## Errors', - // '', - // results.errors.length > 0 - // ? [ - // '| Query | Error |', - // '|-------|-------|', - // ...results.errors.map(e => `| \`${e.query}\` | ${e.error} |`) - // ].join('\n') - // : 'No errors encountered during testing.', - // ].join('\n'); - - // fs.writeFileSync(mdFile, markdownContent); - // console.log(`\nDetailed results saved to: ${mdFile}`); - // } - - } catch (error) { - console.error('Error in meta routes test:', error); - process.exit(1); - } -} - -// Run the tests +#!/usr/bin/env node + +const { runQuery } = require('@stackql/pgwire-lite'); +const fs = require('fs'); +const path = require('path'); + +// Get current directory +const baseDir = path.resolve(path.dirname(process.argv[1]), '..'); + +// Default connection settings +const defaultOptions = { + user: 'stackql', + database: 'stackql', + // IPv4 loopback, not 'localhost': stackql srv binds 0.0.0.0 and Node + // resolves 'localhost' to ::1 first, which refuses the connection + host: '127.0.0.1', + port: 5444, + debug: false, +}; + +// Parse command line arguments +const args = process.argv.slice(2); +let provider = null; +let port = 5444; +let host = '127.0.0.1'; +let verbose = false; +let outputFormat = 'json'; +let timeoutMs = 60000; // Default timeout: 60 seconds + +for (let i = 0; i < args.length; i++) { + if (args[i].startsWith('--')) { + switch (args[i]) { + case '--port': + port = parseInt(args[++i], 10); + break; + case '--host': + host = args[++i]; + break; + case '--verbose': + verbose = true; + break; + case '--format': + outputFormat = args[++i]; + if (!['json', 'csv', 'markdown'].includes(outputFormat)) { + console.error(`Error: Invalid output format "${outputFormat}". Must be json, csv, or markdown.`); + process.exit(1); + } + break; + case '--timeout': + timeoutMs = parseInt(args[++i], 10); + break; + case '--help': + console.log(` +Usage: test-meta-routes.js [OPTIONS] + +Test all metadata routes for a StackQL provider. + +Arguments: + provider Name of the provider to test + +Options: + --port PORT Server port (default: 5444) + --verbose Enable verbose output + --format FORMAT Output format: json, csv, markdown (default: json) + --timeout MILLISECONDS Query timeout in milliseconds (default: 60000) + --help Display this help message + `); + process.exit(0); + break; + default: + console.error(`Error: Unknown option "${args[i]}"`); + process.exit(1); + } + } else if (!provider) { + provider = args[i]; + } +} + +// Check that provider was specified +if (!provider) { + console.error('Error: Provider name must be specified'); + console.error('Usage: test-meta-routes.js [OPTIONS]'); + process.exit(1); +} + +// Set up connection options +const connectionOptions = { + ...defaultOptions, + host, + port, + // Set query timeout + statement_timeout: timeoutMs, +}; + +// Get start time +const startTime = new Date(); + +// resources whose select response is a scalar (text) body - a single +// anonymous column at query time, so DESCRIBE EXTENDED is legitimately +// empty. Currently empty: pods_log gets a response transform (one row per +// log line) in post_process.mjs, so it has real columns. +const SCALAR_RESPONSE_RESOURCES = new Set([]); + +const results = { + provider, + totalServices: 0, + totalResources: 0, + totalMethods: 0, + selectableMethods: 0, + nonSelectableResourceCount: 0, + nonSelectableResources: [], + scalarResponseResources: [], + failures: [], +}; + +/** + * Run a query and handle errors + * @param {string} query - SQL query to run + * @param {string} description - Description for logging + * @returns {Promise} - Query results + */ +async function executeQuery(query, description) { + if (verbose) { + console.log(`Running: ${query}`); + } else { + process.stdout.write(`${description}... `); + } + + try { + const result = await runQuery(connectionOptions, query); + + if (!verbose) { + if (result.data && result.data.length) { + console.log(`✅ (${result.data.length} rows)`); + } else { + console.log('✅'); + } + } else { + console.info(result.data); + } + + return result.data; + } catch (error) { + if (!verbose) { + console.log('❌'); + } + + results.errors.push({ + query, + description, + error: error.message, + timestamp: new Date().toISOString() + }); + + results.summary.errors++; + + if (error.message.includes('the last operation didn\'t produce a result')) { + return []; + } + + if (error.message.includes('SELECT not supported for this resource')) { + if (verbose) { + console.warn(` Warning: Resource is not selectable`); + } + return null; + } + + console.error(`Error executing ${description}: ${error.message}`); + return []; + } +} + +/** + * Test all provider meta routes + */ +async function testMetaRoutes() { + try { + console.log(`\n🔍 Testing meta routes for provider: ${provider}\n`); + + // SHOW PROVIDERS to verify provider exists + const registryQuery = "SHOW PROVIDERS"; + const providers = await executeQuery(registryQuery, "Checking registry providers"); + + const providerExists = providers && providers.some(p => p.name === provider); + if (!providerExists) { + console.error(`Error: Provider '${provider}' not found in registry`); + if (providers && providers.length > 0) { + console.log("Available providers:"); + providers.forEach(p => console.log(` - ${p.name}`)); + } + process.exit(1); + } + + // SHOW SERVICES IN + const servicesQuery = `SHOW SERVICES IN ${provider}`; + const services = await executeQuery(servicesQuery, "Getting services"); + + if (!services || services.length === 0) { + console.error(`Error: No services found for provider '${provider}'`); + process.exit(1); + } + + console.log(`\nFound ${services.length} services in ${provider}`); + results.totalServices += services.length; + + // for each service + for (const service of services) { + const serviceName = service.name; + console.log(`\n📊 Processing service: ${serviceName}`); + + // SHOW RESOURCES IN . + const resourcesQuery = `SHOW RESOURCES IN ${provider}.${serviceName}`; + const resources = await executeQuery(resourcesQuery, `Getting resources for ${serviceName}`); + + if (!resources || resources.length === 0) { + console.error(`Error: No resources found for ${provider}.${serviceName}`); + process.exit(1); + } + + console.log(`Found ${resources.length} resources in ${serviceName}`); + results.totalResources += resources.length; + + // for each resource + for (const resource of resources) { + const resourceName = resource.name; + console.log(`\n 🔹 Testing resource: ${resourceName}`); + + const resourceFQRN = `${provider}.${serviceName}.${resourceName}`; + const resourceData = { + name: resourceName, + service: serviceName, + selectable: false, + sqlVerbs: {} + }; + + // SHOW EXTENDED METHODS IN .. + const methodsQuery = `SHOW EXTENDED METHODS IN ${resourceFQRN}`; + const methods = await executeQuery(methodsQuery, ` Getting methods for ${resourceName}`); + if (!methods || methods.length === 0) { + console.error(`Error: Resource ${resourceName} has no methods`); + process.exit(1); + } else { + console.log(`Found ${methods.length} methods for ${resourceName}`); + } + + results.totalMethods += methods.length; + + for (const method of methods) { + const methodName = method.MethodName; + const sqlVerb = method.SQLVerb || 'exec'; + + if(sqlVerb.toLowerCase() === 'select') { + results.selectableMethods++; + resourceData.selectable = true; + } + + // Initialize the array if it doesn't exist yet + if(!resourceData.sqlVerbs[sqlVerb]) { + resourceData.sqlVerbs[sqlVerb] = []; + } + + // Convert comma-delimited list to an array of trimmed values + let requiredParamsArray = []; + if (method.RequiredParams) { + requiredParamsArray = method.RequiredParams + .split(',') + .map(param => param.trim()) + .filter(param => param.length > 0); + } + + // Push the method info to the array with the parsed required params + resourceData.sqlVerbs[sqlVerb].push({ + methodName, + requiredParams: requiredParamsArray + }); + } + + // non exec methods must have unique signatures within a resource + // in other words no two methods mapped to the same sqlVerb should have the exact same set of required params, order is not important + // if this condition is detected, log it and exit the program immediately + let hasSelect = false; + for (const [verb, methods] of Object.entries(resourceData.sqlVerbs)) { + if (verb.toLowerCase() === 'select') { + hasSelect = true; + } + if (verb.toLowerCase() === 'exec') { + continue; + } + const seenSignatures = new Set(); + for (const method of methods) { + const signature = JSON.stringify(method.requiredParams); + if (seenSignatures.has(signature)) { + console.error(`Error: Duplicate method signature found for ${verb} in ${resourceData.service}.${resourceName}:`, method); + process.exit(1); + } + seenSignatures.add(signature); + } + } + + if (!hasSelect) { + results.nonSelectableResourceCount++; + results.nonSelectableResources.push(`${resourceData.service}.${resourceName}`); + } + + // Try DESCRIBE EXTENDED if available + if(resourceData.selectable) { + try { + const describeExtendedQuery = `DESCRIBE EXTENDED ${resourceFQRN}`; + const extendedColumns = await executeQuery(describeExtendedQuery, ` Describing extended ${resourceName}`); + + if (extendedColumns !== null && extendedColumns.length > 0) { + console.log(`Found ${extendedColumns.length} extended columns for ${resourceName}`); + } else if (SCALAR_RESPONSE_RESOURCES.has(resourceName)) { + // scalar (text) response - a single anonymous column at query + // time, so DESCRIBE is legitimately empty + console.log(`WARN: no columns for ${resourceName} (known scalar response)`); + results.scalarResponseResources.push(`${resourceData.service}.${resourceName}`); + } else { + console.error(`ERROR: No columns found for ${resourceName}`); + results.failures.push(`${resourceData.service}.${resourceName}: DESCRIBE EXTENDED returned no columns`); + } + } catch (error) { + console.error(`Error describing extended ${resourceName}:`, error.message); + results.failures.push(`${resourceData.service}.${resourceName}: ${error.message}`); + } + } + + } + } + + // Calculate execution time + const endTime = new Date(); + const executionTime = (endTime - startTime) / 1000; // in seconds + results.executionTime = executionTime; + + // Output summary + console.log("\n📋 Test Summary:"); + console.info(results); + + if (results.failures.length > 0) { + console.error(`\n❌ ${results.failures.length} failure(s):`); + for (const f of results.failures) console.error(` - ${f}`); + process.exit(1); + } + console.log("\n✅ All meta route tests passed"); + + // Save results to file + // const resultsDir = path.join(baseDir, 'test-results'); + // if (!fs.existsSync(resultsDir)) { + // fs.mkdirSync(resultsDir, { recursive: true }); + // } + + // const timestamp = new Date().toISOString().replace(/[:.]/g, '-'); + + // if (outputFormat === 'json') { + // const resultsFile = path.join(resultsDir, `${provider}-meta-test-${timestamp}.json`); + // fs.writeFileSync(resultsFile, JSON.stringify(results, null, 2)); + // console.log(`\nDetailed results saved to: ${resultsFile}`); + // } + // else if (outputFormat === 'csv') { + // // Generate CSV files + + // // Main summary CSV + // const summaryFile = path.join(resultsDir, `${provider}-meta-test-summary-${timestamp}.csv`); + // const summaryCSV = [ + // 'Provider,Timestamp,Services,Resources,Methods,Selectable,Insertable,Updatable,Deletable,Executable,Errors,ExecutionTime', + // `${provider},${results.timestamp},${results.summary.totalServices},${results.summary.totalResources},${results.summary.totalMethods},${results.summary.selectableMethods},${results.summary.insertableMethods},${results.summary.updatableMethods},${results.summary.deletableMethods},${results.summary.executableMethods},${results.summary.errors},${results.executionTime}` + // ].join('\n'); + // fs.writeFileSync(summaryFile, summaryCSV); + + // // Services CSV + // const servicesFile = path.join(resultsDir, `${provider}-meta-test-services-${timestamp}.csv`); + // const servicesCSV = [ + // 'Service,Title,ResourceCount', + // ...results.services.map(s => `${s.name},${s.title || ''},${s.resourceCount || 0}`) + // ].join('\n'); + // fs.writeFileSync(servicesFile, servicesCSV); + + // // Resources CSV + // const resourcesFile = path.join(resultsDir, `${provider}-meta-test-resources-${timestamp}.csv`); + // const resourcesCSV = [ + // 'Service,Resource,FQRN,Selectable,ColumnCount,MethodCount', + // ...results.resources.map(r => `${r.service},${r.name},${r.fqrn},${r.selectable},${r.columnCount || 0},${r.methodCount || 0}`) + // ].join('\n'); + // fs.writeFileSync(resourcesFile, resourcesCSV); + + // // Methods CSV + // const methodsFile = path.join(resultsDir, `${provider}-meta-test-methods-${timestamp}.csv`); + // const methodsCSV = [ + // 'Service,Resource,Method,SQLVerb,FQRN', + // ...results.methods.map(m => `${m.service},${m.resource},${m.name},${m.sqlVerb},${m.fqrn}`) + // ].join('\n'); + // fs.writeFileSync(methodsFile, methodsCSV); + + // console.log(`\nDetailed results saved to CSV files in: ${resultsDir}`); + // } + // else if (outputFormat === 'markdown') { + // const mdFile = path.join(resultsDir, `${provider}-meta-test-${timestamp}.md`); + + // const markdownContent = [ + // `# StackQL Provider Test Results: ${provider}`, + // '', + // `Test run: ${results.timestamp}`, + // '', + // '## Summary', + // '', + // '| Metric | Count |', + // '|--------|-------|', + // `| Services | ${results.summary.totalServices} |`, + // `| Resources | ${results.summary.totalResources} |`, + // `| Methods | ${results.summary.totalMethods} |`, + // `| Errors | ${results.summary.errors} |`, + // `| Execution Time | ${results.executionTime.toFixed(2)} seconds |`, + // '', + // '### Methods by SQL Verb', + // '', + // '| Verb | Count |', + // '|------|-------|', + // ...Object.entries(results.verbs).map(([verb, count]) => `| ${verb.toUpperCase()} | ${count} |`), + // '', + // '## Services', + // '', + // '| Service | Resources |', + // '|---------|-----------|', + // ...results.services.map(s => `| ${s.name} | ${s.resourceCount || 0} |`), + // '', + // '## Resources with Most Methods', + // '', + // '| Resource | Service | Methods | Selectable |', + // '|----------|---------|---------|------------|', + // ...results.resources + // .sort((a, b) => (b.methodCount || 0) - (a.methodCount || 0)) + // .slice(0, 20) + // .map(r => `| ${r.name} | ${r.service} | ${r.methodCount || 0} | ${r.selectable ? '✓' : '✗'} |`), + // '', + // '## Errors', + // '', + // results.errors.length > 0 + // ? [ + // '| Query | Error |', + // '|-------|-------|', + // ...results.errors.map(e => `| \`${e.query}\` | ${e.error} |`) + // ].join('\n') + // : 'No errors encountered during testing.', + // ].join('\n'); + + // fs.writeFileSync(mdFile, markdownContent); + // console.log(`\nDetailed results saved to: ${mdFile}`); + // } + + } catch (error) { + console.error('Error in meta routes test:', error); + process.exit(1); + } +} + +// Run the tests testMetaRoutes(); \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 89f374e..4d608d2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,527 +1,533 @@ -{ - "name": "stackql-provider-digitalocean", - "version": "0.1.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "stackql-provider-digitalocean", - "version": "0.1.0", - "dependencies": { - "@stackql/pgwire-lite": "^1.0.1", - "@stackql/provider-utils": "^0.5.0" - }, - "engines": { - "node": ">=14.16.0" - } - }, - "node_modules/@apidevtools/json-schema-ref-parser": { - "version": "11.7.2", - "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-11.7.2.tgz", - "integrity": "sha512-4gY54eEGEstClvEkGnwVkTkrx0sqwemEFG5OSRRn3tD91XH0+Q8XIkYIfo7IwEWPpJZwILb9GUXeShtplRc/eA==", - "license": "MIT", - "dependencies": { - "@jsdevtools/ono": "^7.1.3", - "@types/json-schema": "^7.0.15", - "js-yaml": "^4.1.0" - }, - "engines": { - "node": ">= 16" - }, - "funding": { - "url": "https://github.com/sponsors/philsturgeon" - } - }, - "node_modules/@apidevtools/openapi-schemas": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@apidevtools/openapi-schemas/-/openapi-schemas-2.1.0.tgz", - "integrity": "sha512-Zc1AlqrJlX3SlpupFGpiLi2EbteyP7fXmUOGup6/DnkRgjP9bgMM/ag+n91rsv0U1Gpz0H3VILA/o3bW7Ua6BQ==", - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/@apidevtools/swagger-methods": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@apidevtools/swagger-methods/-/swagger-methods-3.0.2.tgz", - "integrity": "sha512-QAkD5kK2b1WfjDS/UQn/qQkbwF31uqRjPTrsCs5ZG9BQGAkjwvqGFjjPqAuzac/IYzpPtRzjCP1WrTuAIjMrXg==", - "license": "MIT" - }, - "node_modules/@apidevtools/swagger-parser": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/@apidevtools/swagger-parser/-/swagger-parser-10.1.1.tgz", - "integrity": "sha512-u/kozRnsPO/x8QtKYJOqoGtC4kH6yg1lfYkB9Au0WhYB0FNLpyFusttQtvhlwjtG3rOwiRz4D8DnnXa8iEpIKA==", - "license": "MIT", - "dependencies": { - "@apidevtools/json-schema-ref-parser": "11.7.2", - "@apidevtools/openapi-schemas": "^2.1.0", - "@apidevtools/swagger-methods": "^3.0.2", - "@jsdevtools/ono": "^7.1.3", - "ajv": "^8.17.1", - "ajv-draft-04": "^1.0.0", - "call-me-maybe": "^1.0.2" - }, - "peerDependencies": { - "openapi-types": ">=7" - } - }, - "node_modules/@colors/colors": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz", - "integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==", - "license": "MIT", - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/@dabh/diagnostics": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz", - "integrity": "sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==", - "license": "MIT", - "dependencies": { - "colorspace": "1.1.x", - "enabled": "2.0.x", - "kuler": "^2.0.0" - } - }, - "node_modules/@jsdevtools/ono": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz", - "integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==", - "license": "MIT" - }, - "node_modules/@stackql/deno-openapi-dereferencer": { - "name": "@jsr/stackql__deno-openapi-dereferencer", - "version": "0.3.1", - "resolved": "https://npm.jsr.io/~/11/@jsr/stackql__deno-openapi-dereferencer/0.3.1.tgz", - "integrity": "sha512-7Ucdom3SYxvzp7VwzulQMe66E+1LeCZIprFQ70PwRPIUfL90bYNQDrLfe5L1WaB+X7StWdHmoFSFxoa9RDlN7w==", - "dependencies": { - "jsonpath-plus": "7.0.0" - } - }, - "node_modules/@stackql/pgwire-lite": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@stackql/pgwire-lite/-/pgwire-lite-1.0.1.tgz", - "integrity": "sha512-jgA6ogzlXySZ1xiJzBxuvgRNu9V38Gs3qUZ4AjinlT7hj+8RH3UhYaDvyBd33QWiK3tVNkglYcnXPQ7q0+rmNA==", - "license": "MIT", - "dependencies": { - "winston": "^3.14.2" - } - }, - "node_modules/@stackql/provider-utils": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@stackql/provider-utils/-/provider-utils-0.5.0.tgz", - "integrity": "sha512-KwHVVCBC0XwbDI/dDb7FM1fEFqqnXQ0mPJFmiEYkASNs5mXQW0jbAazVBeOFO4JN0PN6AyX6D/vWCVOmpnz9jw==", - "license": "MIT", - "dependencies": { - "@apidevtools/swagger-parser": "^10.1.1", - "@stackql/deno-openapi-dereferencer": "npm:@jsr/stackql__deno-openapi-dereferencer@^0.3.1", - "csv-parser": "^3.2.0", - "js-yaml": "^4.1.0", - "pluralize": "^8.0.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "license": "MIT" - }, - "node_modules/@types/triple-beam": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz", - "integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==", - "license": "MIT" - }, - "node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-draft-04": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/ajv-draft-04/-/ajv-draft-04-1.0.0.tgz", - "integrity": "sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==", - "license": "MIT", - "peerDependencies": { - "ajv": "^8.5.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "license": "Python-2.0" - }, - "node_modules/async": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", - "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", - "license": "MIT" - }, - "node_modules/call-me-maybe": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.2.tgz", - "integrity": "sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==", - "license": "MIT" - }, - "node_modules/color": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", - "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.3", - "color-string": "^1.6.0" - } - }, - "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "license": "MIT" - }, - "node_modules/color-string": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", - "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", - "license": "MIT", - "dependencies": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" - } - }, - "node_modules/colorspace": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz", - "integrity": "sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==", - "license": "MIT", - "dependencies": { - "color": "^3.1.3", - "text-hex": "1.0.x" - } - }, - "node_modules/csv-parser": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/csv-parser/-/csv-parser-3.2.0.tgz", - "integrity": "sha512-fgKbp+AJbn1h2dcAHKIdKNSSjfp43BZZykXsCjzALjKy80VXQNHPFJ6T9Afwdzoj24aMkq8GwDS7KGcDPpejrA==", - "license": "MIT", - "bin": { - "csv-parser": "bin/csv-parser" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/enabled": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", - "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==", - "license": "MIT" - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "license": "MIT" - }, - "node_modules/fast-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", - "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ], - "license": "BSD-3-Clause" - }, - "node_modules/fecha": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", - "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==", - "license": "MIT" - }, - "node_modules/fn.name": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", - "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==", - "license": "MIT" - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "license": "ISC" - }, - "node_modules/is-arrayish": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.4.tgz", - "integrity": "sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA==", - "license": "MIT" - }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "license": "MIT" - }, - "node_modules/jsonpath-plus": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/jsonpath-plus/-/jsonpath-plus-7.0.0.tgz", - "integrity": "sha512-MH4UnrWrU1hJGVEyEyjvYgONkzNTO6Yol0nq18EMnUQ/ZC5cTuJheirXXIwu1b9mZ6t3XL0P79gPsu+zlTnDIQ==", - "license": "MIT", - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/kuler": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", - "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==", - "license": "MIT" - }, - "node_modules/logform": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/logform/-/logform-2.7.0.tgz", - "integrity": "sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==", - "license": "MIT", - "dependencies": { - "@colors/colors": "1.6.0", - "@types/triple-beam": "^1.3.2", - "fecha": "^4.2.0", - "ms": "^2.1.1", - "safe-stable-stringify": "^2.3.1", - "triple-beam": "^1.3.0" - }, - "engines": { - "node": ">= 12.0.0" - } - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" - }, - "node_modules/one-time": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", - "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", - "license": "MIT", - "dependencies": { - "fn.name": "1.x.x" - } - }, - "node_modules/openapi-types": { - "version": "12.1.3", - "resolved": "https://registry.npmjs.org/openapi-types/-/openapi-types-12.1.3.tgz", - "integrity": "sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==", - "license": "MIT", - "peer": true - }, - "node_modules/pluralize": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", - "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/safe-stable-stringify": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", - "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/simple-swizzle": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.4.tgz", - "integrity": "sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw==", - "license": "MIT", - "dependencies": { - "is-arrayish": "^0.3.1" - } - }, - "node_modules/stack-trace": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", - "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/text-hex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", - "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==", - "license": "MIT" - }, - "node_modules/triple-beam": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz", - "integrity": "sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==", - "license": "MIT", - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "license": "MIT" - }, - "node_modules/winston": { - "version": "3.17.0", - "resolved": "https://registry.npmjs.org/winston/-/winston-3.17.0.tgz", - "integrity": "sha512-DLiFIXYC5fMPxaRg832S6F5mJYvePtmO5G9v9IgUFPhXm9/GkXarH/TUrBAVzhTCzAj9anE/+GjrgXp/54nOgw==", - "license": "MIT", - "dependencies": { - "@colors/colors": "^1.6.0", - "@dabh/diagnostics": "^2.0.2", - "async": "^3.2.3", - "is-stream": "^2.0.0", - "logform": "^2.7.0", - "one-time": "^1.0.0", - "readable-stream": "^3.4.0", - "safe-stable-stringify": "^2.3.1", - "stack-trace": "0.0.x", - "triple-beam": "^1.3.0", - "winston-transport": "^4.9.0" - }, - "engines": { - "node": ">= 12.0.0" - } - }, - "node_modules/winston-transport": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.9.0.tgz", - "integrity": "sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==", - "license": "MIT", - "dependencies": { - "logform": "^2.7.0", - "readable-stream": "^3.6.2", - "triple-beam": "^1.3.0" - }, - "engines": { - "node": ">= 12.0.0" - } - } - } -} +{ + "name": "stackql-provider-vercel", + "version": "0.2.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "stackql-provider-vercel", + "version": "0.2.0", + "license": "MIT", + "dependencies": { + "@stackql/pgwire-lite": "1.0.2", + "@stackql/provider-utils": "0.7.9", + "js-yaml": "^4.1.0" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@apidevtools/json-schema-ref-parser": { + "version": "11.7.2", + "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-11.7.2.tgz", + "integrity": "sha512-4gY54eEGEstClvEkGnwVkTkrx0sqwemEFG5OSRRn3tD91XH0+Q8XIkYIfo7IwEWPpJZwILb9GUXeShtplRc/eA==", + "license": "MIT", + "dependencies": { + "@jsdevtools/ono": "^7.1.3", + "@types/json-schema": "^7.0.15", + "js-yaml": "^4.1.0" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/philsturgeon" + } + }, + "node_modules/@apidevtools/openapi-schemas": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@apidevtools/openapi-schemas/-/openapi-schemas-2.1.0.tgz", + "integrity": "sha512-Zc1AlqrJlX3SlpupFGpiLi2EbteyP7fXmUOGup6/DnkRgjP9bgMM/ag+n91rsv0U1Gpz0H3VILA/o3bW7Ua6BQ==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/@apidevtools/swagger-methods": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@apidevtools/swagger-methods/-/swagger-methods-3.0.2.tgz", + "integrity": "sha512-QAkD5kK2b1WfjDS/UQn/qQkbwF31uqRjPTrsCs5ZG9BQGAkjwvqGFjjPqAuzac/IYzpPtRzjCP1WrTuAIjMrXg==", + "license": "MIT" + }, + "node_modules/@apidevtools/swagger-parser": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/@apidevtools/swagger-parser/-/swagger-parser-10.1.1.tgz", + "integrity": "sha512-u/kozRnsPO/x8QtKYJOqoGtC4kH6yg1lfYkB9Au0WhYB0FNLpyFusttQtvhlwjtG3rOwiRz4D8DnnXa8iEpIKA==", + "license": "MIT", + "dependencies": { + "@apidevtools/json-schema-ref-parser": "11.7.2", + "@apidevtools/openapi-schemas": "^2.1.0", + "@apidevtools/swagger-methods": "^3.0.2", + "@jsdevtools/ono": "^7.1.3", + "ajv": "^8.17.1", + "ajv-draft-04": "^1.0.0", + "call-me-maybe": "^1.0.2" + }, + "peerDependencies": { + "openapi-types": ">=7" + } + }, + "node_modules/@colors/colors": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz", + "integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==", + "license": "MIT", + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/@dabh/diagnostics": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz", + "integrity": "sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==", + "license": "MIT", + "dependencies": { + "colorspace": "1.1.x", + "enabled": "2.0.x", + "kuler": "^2.0.0" + } + }, + "node_modules/@jsdevtools/ono": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz", + "integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==", + "license": "MIT" + }, + "node_modules/@stackql/deno-openapi-dereferencer": { + "name": "@jsr/stackql__deno-openapi-dereferencer", + "version": "0.3.1", + "resolved": "https://npm.jsr.io/~/11/@jsr/stackql__deno-openapi-dereferencer/0.3.1.tgz", + "integrity": "sha512-7Ucdom3SYxvzp7VwzulQMe66E+1LeCZIprFQ70PwRPIUfL90bYNQDrLfe5L1WaB+X7StWdHmoFSFxoa9RDlN7w==", + "dependencies": { + "jsonpath-plus": "7.0.0" + } + }, + "node_modules/@stackql/pgwire-lite": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@stackql/pgwire-lite/-/pgwire-lite-1.0.2.tgz", + "integrity": "sha512-uHZA0yzVyow8TtWYyGPFI7/If8Ci/5EjjKdoaZ4YEk1XcSoCKaGQmH9KCUlR/R1FvQk4Ic3DV9It8XhePsoTqQ==", + "license": "MIT", + "dependencies": { + "winston": "^3.14.2" + } + }, + "node_modules/@stackql/provider-utils": { + "version": "0.7.9", + "resolved": "https://registry.npmjs.org/@stackql/provider-utils/-/provider-utils-0.7.9.tgz", + "integrity": "sha512-mMd+voDZvgeciLA41nO1+OPmyKr/Lh38bO1jiWUUeRDbrlBAJhn0jr9ykxUaikx/IA0UZrSy0BOp2Y05NWnY0w==", + "license": "MIT", + "dependencies": { + "@apidevtools/swagger-parser": "^10.1.1", + "@stackql/deno-openapi-dereferencer": "npm:@jsr/stackql__deno-openapi-dereferencer@^0.3.1", + "csv-parser": "^3.2.0", + "js-yaml": "^4.1.0", + "pluralize": "^8.0.0" + }, + "bin": { + "docgen-utils": "bin/docgen-utils.mjs", + "provider-dev-utils": "bin/provider-dev-utils.mjs" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "license": "MIT" + }, + "node_modules/@types/triple-beam": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz", + "integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==", + "license": "MIT" + }, + "node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-draft-04": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ajv-draft-04/-/ajv-draft-04-1.0.0.tgz", + "integrity": "sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==", + "license": "MIT", + "peerDependencies": { + "ajv": "^8.5.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" + }, + "node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "license": "MIT" + }, + "node_modules/call-me-maybe": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.2.tgz", + "integrity": "sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==", + "license": "MIT" + }, + "node_modules/color": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", + "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.3", + "color-string": "^1.6.0" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "license": "MIT" + }, + "node_modules/color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "license": "MIT", + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "node_modules/colorspace": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz", + "integrity": "sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==", + "license": "MIT", + "dependencies": { + "color": "^3.1.3", + "text-hex": "1.0.x" + } + }, + "node_modules/csv-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/csv-parser/-/csv-parser-3.2.0.tgz", + "integrity": "sha512-fgKbp+AJbn1h2dcAHKIdKNSSjfp43BZZykXsCjzALjKy80VXQNHPFJ6T9Afwdzoj24aMkq8GwDS7KGcDPpejrA==", + "license": "MIT", + "bin": { + "csv-parser": "bin/csv-parser" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/enabled": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", + "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==", + "license": "MIT" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "license": "MIT" + }, + "node_modules/fast-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", + "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/fecha": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", + "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==", + "license": "MIT" + }, + "node_modules/fn.name": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", + "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==", + "license": "MIT" + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/is-arrayish": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.4.tgz", + "integrity": "sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA==", + "license": "MIT" + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT" + }, + "node_modules/jsonpath-plus": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/jsonpath-plus/-/jsonpath-plus-7.0.0.tgz", + "integrity": "sha512-MH4UnrWrU1hJGVEyEyjvYgONkzNTO6Yol0nq18EMnUQ/ZC5cTuJheirXXIwu1b9mZ6t3XL0P79gPsu+zlTnDIQ==", + "license": "MIT", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/kuler": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", + "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==", + "license": "MIT" + }, + "node_modules/logform": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/logform/-/logform-2.7.0.tgz", + "integrity": "sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==", + "license": "MIT", + "dependencies": { + "@colors/colors": "1.6.0", + "@types/triple-beam": "^1.3.2", + "fecha": "^4.2.0", + "ms": "^2.1.1", + "safe-stable-stringify": "^2.3.1", + "triple-beam": "^1.3.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/one-time": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", + "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", + "license": "MIT", + "dependencies": { + "fn.name": "1.x.x" + } + }, + "node_modules/openapi-types": { + "version": "12.1.3", + "resolved": "https://registry.npmjs.org/openapi-types/-/openapi-types-12.1.3.tgz", + "integrity": "sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==", + "license": "MIT", + "peer": true + }, + "node_modules/pluralize": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", + "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safe-stable-stringify": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", + "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/simple-swizzle": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.4.tgz", + "integrity": "sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw==", + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, + "node_modules/stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/text-hex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", + "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==", + "license": "MIT" + }, + "node_modules/triple-beam": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz", + "integrity": "sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==", + "license": "MIT", + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "node_modules/winston": { + "version": "3.17.0", + "resolved": "https://registry.npmjs.org/winston/-/winston-3.17.0.tgz", + "integrity": "sha512-DLiFIXYC5fMPxaRg832S6F5mJYvePtmO5G9v9IgUFPhXm9/GkXarH/TUrBAVzhTCzAj9anE/+GjrgXp/54nOgw==", + "license": "MIT", + "dependencies": { + "@colors/colors": "^1.6.0", + "@dabh/diagnostics": "^2.0.2", + "async": "^3.2.3", + "is-stream": "^2.0.0", + "logform": "^2.7.0", + "one-time": "^1.0.0", + "readable-stream": "^3.4.0", + "safe-stable-stringify": "^2.3.1", + "stack-trace": "0.0.x", + "triple-beam": "^1.3.0", + "winston-transport": "^4.9.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/winston-transport": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.9.0.tgz", + "integrity": "sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==", + "license": "MIT", + "dependencies": { + "logform": "^2.7.0", + "readable-stream": "^3.6.2", + "triple-beam": "^1.3.0" + }, + "engines": { + "node": ">= 12.0.0" + } + } + } +} diff --git a/package.json b/package.json index c56e58b..9a42960 100644 --- a/package.json +++ b/package.json @@ -1,28 +1,38 @@ -{ - "name": "stackql-provider-digitalocean", - "version": "0.1.0", - "description": "StackQL Provider for Digital Ocean", - "type": "module", - "scripts": { - "generate-docs": "./bin/generate-docs.sh", - "split": "./bin/split.sh", - "generate-mappings": "./bin/generate-mappings.sh", - "generate-provider": "./bin/generate-provider.sh", - "start-server": "bash ./bin/start-server.sh", - "stop-server": "bash ./bin/stop-server.sh", - "server-status": "bash ./bin/server-status.sh", - "test-meta-routes": "node ./bin/test-meta-routes.cjs" - }, - "dependencies": { - "@stackql/pgwire-lite": "^1.0.1", - "@stackql/provider-utils": "^0.5.0" - }, - "keywords": [ - "stackql", - "digitalocean", - "provider" - ], - "engines": { - "node": ">=14.16.0" - } -} \ No newline at end of file +{ + "name": "stackql-provider-vercel", + "version": "0.2.0", + "description": "StackQL Provider for Vercel", + "type": "module", + "scripts": { + "fetch-spec": "bash ./bin/fetch-spec.sh", + "split": "node ./node_modules/@stackql/provider-utils/bin/provider-dev-utils.mjs split", + "generate-mappings": "node ./node_modules/@stackql/provider-utils/bin/provider-dev-utils.mjs analyze", + "merge-mappings": "node ./provider-dev/scripts/merge_mappings.mjs", + "validate-mappings": "node ./provider-dev/scripts/validate_mappings.mjs", + "pre-normalize": "node ./provider-dev/scripts/pre_normalize.mjs", + "normalize": "node ./node_modules/@stackql/provider-utils/bin/provider-dev-utils.mjs normalize", + "generate-provider": "node ./node_modules/@stackql/provider-utils/bin/provider-dev-utils.mjs generate", + "post-process": "node ./provider-dev/scripts/post_process.mjs", + "generate-docs": "node ./node_modules/@stackql/provider-utils/bin/docgen-utils.mjs generate-docs", + "start-server": "bash ./bin/start-server.sh", + "stop-server": "bash ./bin/stop-server.sh", + "server-status": "bash ./bin/server-status.sh", + "test-meta-routes": "node ./bin/test-meta-routes.cjs", + "test-offline": "node ./tests/offline_validation.mjs", + "smoke": "node ./tests/smoke_test.mjs" + }, + "dependencies": { + "@stackql/pgwire-lite": "1.0.2", + "@stackql/provider-utils": "0.7.9", + "js-yaml": "^4.1.0" + }, + "keywords": [ + "stackql", + "vercel", + "provider" + ], + "engines": { + "node": ">=20.0.0" + }, + "license": "MIT" +} diff --git a/provider-dev/config/all_services.csv b/provider-dev/config/all_services.csv new file mode 100644 index 0000000..ef65cb6 --- /dev/null +++ b/provider-dev/config/all_services.csv @@ -0,0 +1,414 @@ +filename,path,operationId,formatted_op_id,verb,response_object,tags,formatted_tags,stackql_resource_name,stackql_method_name,stackql_verb,stackql_object_key,op_description +access_groups.yaml,/v1/access-groups/{idOrName},readAccessGroup,read_access_group,get,,access-groups,access_groups,access_groups,get,select,,Reads an access group +access_groups.yaml,/v1/access-groups/{idOrName},updateAccessGroup,update_access_group,post,,access-groups,access_groups,access_groups,update,update,,Update an access group +access_groups.yaml,/v1/access-groups/{idOrName},deleteAccessGroup,delete_access_group,delete,,access-groups,access_groups,access_groups,delete,delete,,Deletes an access group +access_groups.yaml,/v1/access-groups/{idOrName}/members,listAccessGroupMembers,list_access_group_members,get,,access-groups,access_groups,access_group_members,list,select,$.members,List members of an access group +access_groups.yaml,/v1/access-groups,listAccessGroups,list_access_groups,get,,access-groups,access_groups,access_groups,list,select,$.accessGroups,"List access groups for a team, project or member" +access_groups.yaml,/v1/access-groups,createAccessGroup,create_access_group,post,,access-groups,access_groups,access_groups,create,insert,,Creates an access group +access_groups.yaml,/v1/access-groups/{idOrName}/projects,listAccessGroupProjects,list_access_group_projects,get,,access-groups,access_groups,access_group_projects,list,select,$.projects,List projects of an access group +access_groups.yaml,/v1/access-groups/{accessGroupIdOrName}/projects,createAccessGroupProject,create_access_group_project,post,,access-groups,access_groups,access_group_projects,create,insert,,Create an access group project +access_groups.yaml,/v1/access-groups/{accessGroupIdOrName}/projects/{projectId},readAccessGroupProject,read_access_group_project,get,,access-groups,access_groups,access_group_projects,get,select,,Reads an access group project +access_groups.yaml,/v1/access-groups/{accessGroupIdOrName}/projects/{projectId},updateAccessGroupProject,update_access_group_project,patch,,access-groups,access_groups,access_group_projects,update,update,,Update an access group project +access_groups.yaml,/v1/access-groups/{accessGroupIdOrName}/projects/{projectId},deleteAccessGroupProject,delete_access_group_project,delete,,access-groups,access_groups,access_group_projects,delete,delete,,Delete an access group project +ai_gateway.yaml,/v1/ai-gateway/virtual-model-configs,createAiGatewayVirtualModelConfig,create_ai_gateway_virtual_model_config,post,AiGatewayVirtualModelConfig,api-ai-gateway,api_ai_gateway,virtual_model_configs,create,insert,,Create virtual model config +ai_gateway.yaml,/v1/ai-gateway/virtual-model-configs,getAiGatewayVirtualModelConfig,get_ai_gateway_virtual_model_config,get,,api-ai-gateway,api_ai_gateway,virtual_model_configs,get_by_query,exec,,Get virtual model config +ai_gateway.yaml,/v1/ai-gateway/virtual-model-configs,updateAiGatewayVirtualModelConfig,update_ai_gateway_virtual_model_config,patch,AiGatewayVirtualModelConfig,api-ai-gateway,api_ai_gateway,virtual_model_configs,update,update,,Update virtual model config +ai_gateway.yaml,/v1/ai-gateway/virtual-model-configs,deleteAiGatewayVirtualModelConfig,delete_ai_gateway_virtual_model_config,delete,,api-ai-gateway,api_ai_gateway,virtual_model_configs,delete,delete,,Delete virtual model config +ai_gateway.yaml,/v1/ai-gateway/virtual-model-configs/list,listAiGatewayVirtualModelConfigs,list_ai_gateway_virtual_model_configs,get,AiGatewayVirtualModelConfigList,api-ai-gateway,api_ai_gateway,virtual_model_configs,list,select,$.virtualModelConfigs,List virtual model configs +ai_gateway.yaml,/v1/ai-gateway/virtual-model-configs/{vmcSlug},getAiGatewayVirtualModelConfigBySlug,get_ai_gateway_virtual_model_config_by_slug,get,AiGatewayVirtualModelConfig,api-ai-gateway,api_ai_gateway,virtual_model_configs,get_by_slug,select,,Get virtual model config +ai_gateway.yaml,/v1/ai-gateway/virtual-model-configs/{vmcSlug},updateAiGatewayVirtualModelConfigBySlug,update_ai_gateway_virtual_model_config_by_slug,patch,AiGatewayVirtualModelConfig,api-ai-gateway,api_ai_gateway,virtual_model_configs,update_by_slug,update,,Update virtual model config +ai_gateway.yaml,/v1/ai-gateway/virtual-model-configs/{vmcSlug},deleteAiGatewayVirtualModelConfigBySlug,delete_ai_gateway_virtual_model_config_by_slug,delete,,api-ai-gateway,api_ai_gateway,virtual_model_configs,delete_by_slug,delete,,Delete virtual model config +ai_gateway.yaml,/v1/ai-gateway/rules,createAiGatewayRule,create_ai_gateway_rule,post,AiGatewayRule,ai-gateway,ai_gateway,rules,create,insert,,Create rule +ai_gateway.yaml,/v1/ai-gateway/rules,listAiGatewayRules,list_ai_gateway_rules,get,AiGatewayRuleList,ai-gateway,ai_gateway,rules,list,select,$.rules,List rules +ai_gateway.yaml,/v1/ai-gateway/rules,updateAiGatewayRule,update_ai_gateway_rule,patch,AiGatewayRule,ai-gateway,ai_gateway,rules,update,update,,Update rule +ai_gateway.yaml,/v1/ai-gateway/rules,deleteAiGatewayRule,delete_ai_gateway_rule,delete,,ai-gateway,ai_gateway,rules,delete,delete,,Delete rule +aliases.yaml,/v2/deployments/{id}/aliases,listDeploymentAliases,list_deployment_aliases,get,,aliases,aliases,deployment_aliases,list,select,$.aliases,List Deployment Aliases +aliases.yaml,/v2/deployments/{id}/aliases,assignAlias,assign_alias,post,,aliases,aliases,deployment_aliases,assign,insert,,Assign an Alias +aliases.yaml,/v4/aliases,listAliases,list_aliases,get,,aliases,aliases,aliases,list,select,$.aliases,List aliases +aliases.yaml,/v4/aliases/{idOrAlias},getAlias,get_alias,get,,aliases,aliases,aliases,get,select,,Get an Alias +aliases.yaml,/v2/aliases/{aliasId},deleteAlias,delete_alias,delete,,aliases,aliases,aliases,delete,delete,,Delete an Alias +aliases.yaml,/aliases/{id}/protection-bypass,patchUrlProtectionBypass,patch_url_protection_bypass,patch,,aliases,aliases,aliases,update_protection_bypass,exec,,Update the protection bypass for a URL +artifacts.yaml,/v8/artifacts/events,recordEvents,record_events,post,,artifacts,artifacts,artifacts,record_events,exec,,Record an artifacts cache usage event +artifacts.yaml,/v8/artifacts/status,status,status,get,,artifacts,artifacts,artifact_status,get,select,,Get status of Remote Caching for this principal +artifacts.yaml,/v8/artifacts/{hash},uploadArtifact,upload_artifact,put,,artifacts,artifacts,artifacts,upload,exec,,Upload a cache artifact +artifacts.yaml,/v8/artifacts/{hash},downloadArtifact,download_artifact,get,,artifacts,artifacts,artifacts,download,exec,,Download a cache artifact +artifacts.yaml,/v8/artifacts,artifactQuery,artifact_query,post,,artifacts,artifacts,artifacts,query,exec,,Query information about an artifact +artifacts.yaml,/v8/artifacts,deleteAllArtifacts,delete_all_artifacts,delete,,artifacts,artifacts,artifacts,delete_all,delete,,Delete all cache artifacts +authentication.yaml,/api-keys,createApiKeys,create_api_keys,post,,,,api_keys,create,insert,, +authentication.yaml,/v6/user/tokens,listAuthTokens,list_auth_tokens,get,,authentication,authentication,tokens,list,select,$.tokens,List Auth Tokens +authentication.yaml,/v3/user/tokens,createAuthToken,create_auth_token,post,,authentication,authentication,tokens,create,insert,,Create an Auth Token +authentication.yaml,/v5/user/tokens/{tokenId},getAuthToken,get_auth_token,get,,authentication,authentication,tokens,get,select,$.token,Get Auth Token Metadata +authentication.yaml,/v3/user/tokens/{tokenId},deleteAuthToken,delete_auth_token,delete,,authentication,authentication,tokens,delete,delete,,Delete an authentication token +billing.yaml,/v1/billing/charges,listBillingCharges,list_billing_charges,get,,billing,billing,charges,list,select,,List FOCUS billing charges +billing.yaml,/v1/billing/contract-commitments,listContractCommitments,list_contract_commitments,get,,billing,billing,contract_commitments,list,select,,List FOCUS contract commitments +billing.yaml,/v1/billing/buy,buyCredits,buy_credits,post,,billing,billing,credits,buy,exec,,Purchase credits +bulk_redirects.yaml,/v1/bulk-redirects,stageRedirects,stage_redirects,put,,bulk-redirects,bulk_redirects,redirects,stage,replace,,Stages new redirects for a project. +bulk_redirects.yaml,/v1/bulk-redirects,getRedirects,get_redirects,get,,bulk-redirects,bulk_redirects,redirects,list,select,$.redirects,Gets project-level redirects. +bulk_redirects.yaml,/v1/bulk-redirects,deleteRedirects,delete_redirects,delete,,bulk-redirects,bulk_redirects,redirects,delete,delete,,Delete project-level redirects. +bulk_redirects.yaml,/v1/bulk-redirects,editRedirect,edit_redirect,patch,,bulk-redirects,bulk_redirects,redirects,update,update,,Edit a project-level redirect. +bulk_redirects.yaml,/v1/bulk-redirects/restore,restoreRedirects,restore_redirects,post,,bulk-redirects,bulk_redirects,redirects,restore,exec,,Restore staged project-level redirects to their production version. +bulk_redirects.yaml,/v1/bulk-redirects/versions,getVersions,get_versions,get,,bulk-redirects,bulk_redirects,versions,list,select,$.versions,Get the version history for a project's redirects. +bulk_redirects.yaml,/v1/bulk-redirects/versions,updateVersion,update_version,post,,bulk-redirects,bulk_redirects,versions,update,exec,,Promote a staging version to production or restore a previous production version. +certs.yaml,/v8/certs/{id},getCertById,get_cert_by_id,get,,certs,certs,certs,get,select,,Get cert by id +certs.yaml,/v8/certs/{id},removeCert,remove_cert,delete,,certs,certs,certs,delete,delete,,Remove cert +certs.yaml,/v8/certs,getCerts,get_certs,get,,certs,certs,certs,list,select,$.certs,Get certs +certs.yaml,/v8/certs,issueCert,issue_cert,post,,certs,certs,certs,issue,insert,,Issue a new cert +certs.yaml,/v8/certs,uploadCert,upload_cert,put,,certs,certs,certs,upload,exec,,Upload a cert +checks.yaml,/v2/projects/{projectIdOrName}/checks,listProjectChecks,list_project_checks,get,,checks-v2,checks_v2,project_checks,list,select,$.checks,List all checks for a project +checks.yaml,/v2/projects/{projectIdOrName}/checks,createProjectCheck,create_project_check,post,,checks-v2,checks_v2,project_checks,create,insert,,Create a check +checks.yaml,/v2/projects/{projectIdOrName}/checks/{checkId},getProjectCheck,get_project_check,get,,checks-v2,checks_v2,project_checks,get,select,,Get a check +checks.yaml,/v2/projects/{projectIdOrName}/checks/{checkId},updateProjectCheck,update_project_check,patch,,checks-v2,checks_v2,project_checks,update,update,,Update a check +checks.yaml,/v2/projects/{projectIdOrName}/checks/{checkId},deleteProjectCheck,delete_project_check,delete,,checks-v2,checks_v2,project_checks,delete,delete,,Delete a check +checks.yaml,/v2/projects/{projectIdOrName}/checks/{checkId}/runs,listCheckRuns,list_check_runs,get,,checks-v2,checks_v2,check_runs,list_for_check,select,$.runs,List runs for a check +checks.yaml,/v2/deployments/{deploymentId}/check-runs,listDeploymentCheckRuns,list_deployment_check_runs,get,,checks-v2,checks_v2,check_runs,list,select,$.runs,List check runs for a deployment +checks.yaml,/v2/deployments/{deploymentId}/check-runs,createDeploymentCheckRun,create_deployment_check_run,post,,checks-v2,checks_v2,check_runs,create,insert,,Create a check run +checks.yaml,/v2/deployments/{deploymentId}/check-runs/{checkRunId},getDeploymentCheckRun,get_deployment_check_run,get,,checks-v2,checks_v2,check_runs,get,select,,Get a check run +checks.yaml,/v2/deployments/{deploymentId}/check-runs/{checkRunId},updateDeploymentCheckRun,update_deployment_check_run,patch,,checks-v2,checks_v2,check_runs,update,update,,Update a check run +checks.yaml,/v1/deployments/{deploymentId}/checks,createCheck,create_check,post,,checks,checks,deployment_checks,create,insert,,Creates a new Check +checks.yaml,/v1/deployments/{deploymentId}/checks,getAllChecks,get_all_checks,get,,checks,checks,deployment_checks,list,select,$.checks,Retrieve a list of all checks +checks.yaml,/v1/deployments/{deploymentId}/checks/{checkId},getCheck,get_check,get,,checks,checks,deployment_checks,get,select,,Get a single check +checks.yaml,/v1/deployments/{deploymentId}/checks/{checkId},updateCheck,update_check,patch,,checks,checks,deployment_checks,update,update,,Update a check +checks.yaml,/v1/deployments/{deploymentId}/checks/{checkId}/rerequest,rerequestCheck,rerequest_check,post,,checks,checks,deployment_checks,rerequest,exec,,Rerequest a check +connect.yaml,/v2/connect/connectors,listConnectors,list_connectors,get,ConnectConnectorList,connect,connect,connectors,list,select,$.connectors,List connectors +connect.yaml,/v1/connect/connectors/{connector},getConnector,get_connector,get,ConnectConnector,connect,connect,connectors,get,select,,Get a connector +connect.yaml,/v1/connect/connectors/{connector},deleteConnector,delete_connector,delete,,connect,connect,connectors,delete,delete,,Delete a connector +connect.yaml,/v1/connect/connectors,createConnector,create_connector,post,ConnectConnectorCreateResult,connect,connect,connectors,create,insert,,Create a connector +connect.yaml,/v2/connect/connectors/{connector},updateConnector,update_connector,patch,ConnectConnectorUpdateResult,connect,connect,connectors,update,update,,Update a connector +connect.yaml,/v1/connect/connectors/{connector}/trigger-destinations,replaceConnectorTriggerDestinations,replace_connector_trigger_destinations,patch,ConnectConnector,connect,connect,connectors,replace_trigger_destinations,exec,,Update connector trigger destinations +connect.yaml,/v2/connect/connectors/{connector}/projects,listConnectorProjectConnections,list_connector_project_connections,get,ConnectConnectorProjectConnectionList,connect,connect,connector_project_connections,list,select,$.projects,List projects for a connector +connect.yaml,/v1/connect/connectors/{connector}/projects/{projectId},getConnectorProjectConnection,get_connector_project_connection,get,ConnectProjectConnection,connect,connect,connector_project_connections,get,select,,Get a connector project connection +connect.yaml,/v1/connect/connectors/{connector}/projects/{projectId},upsertConnectorProjectConnection,upsert_connector_project_connection,post,ConnectProjectConnection,connect,connect,connector_project_connections,upsert,insert,,Create or update a connector project connection +connect.yaml,/v1/connect/connectors/{connector}/projects/{projectId},deleteConnectorProjectConnection,delete_connector_project_connection,delete,,connect,connect,connector_project_connections,delete,delete,,Disconnect a connector from a project +connect.yaml,/v2/connect/projects/{projectId}/connectors,listProjectConnectorConnections,list_project_connector_connections,get,ConnectProjectConnectorConnectionList,connect,connect,project_connectors,list,select,$.connectors,List connectors for a project +connect.yaml,/v1/connect/token/{connector},getConnectorToken,get_connector_token,post,,connect,connect,connectors,get_token,exec,,Get a Connect token +connect.yaml,/v1/connect/authorize/{connector},createConnectorAuthorizationRequest,create_connector_authorization_request,post,,connect,connect,connectors,create_authorization_request,exec,,Create a Connect authorization request +deployments.yaml,/v3/deployments/{idOrUrl}/events,getDeploymentEvents,get_deployment_events,get,,deployments,deployments,deployment_events,list,select,,Get deployment events +deployments.yaml,/v1/deployments/{deploymentId}/integrations/{integrationConfigurationId}/resources/{resourceId}/actions/{action},update-integration-deployment-action,update_integration_deployment_action,patch,,deployments|integrations,deployments|integrations,deployments,update_integration_action,exec,,Update deployment integration action +deployments.yaml,/v13/deployments/{idOrUrl},getDeployment,get_deployment,get,,deployments,deployments,deployments,get,select,,Get a deployment by ID or URL +deployments.yaml,/v13/deployments,createDeployment,create_deployment,post,,deployments,deployments,deployments,create,insert,,Create a new deployment +deployments.yaml,/v12/deployments/{id}/cancel,cancelDeployment,cancel_deployment,patch,,deployments,deployments,deployments,cancel,exec,,Cancel a deployment +deployments.yaml,/v1/projects/{projectId}/deployments/{deploymentId}/runtime-logs,getRuntimeLogs,get_runtime_logs,get,,logs,logs,runtime_logs,list,select,,Get logs for a deployment +deployments.yaml,/v2/files,uploadFile,upload_file,post,,deployments,deployments,files,upload,exec,,Upload Deployment Files +deployments.yaml,/v6/deployments/{id}/files,listDeploymentFiles,list_deployment_files,get,FileTree,deployments,deployments,deployment_files,list,select,,List Deployment Files +deployments.yaml,/v8/deployments/{id}/files/{fileId},getDeploymentFileContents,get_deployment_file_contents,get,,deployments,deployments,skip_this_resource,,,,Get Deployment File Contents +deployments.yaml,/v7/deployments,getDeployments,get_deployments,get,,deployments,deployments,deployments,list,select,$.deployments,List deployments +deployments.yaml,/v13/deployments/{id},deleteDeployment,delete_deployment,delete,,deployments,deployments,deployments,delete,delete,,Delete a Deployment +dns.yaml,/v5/domains/{domain}/records,getRecords,get_records,get,,dns,dns,records,list,select,$.records,List existing DNS records +dns.yaml,/v2/domains/{domain}/records,createRecord,create_record,post,,dns,dns,records,create,insert,,Create a DNS record +dns.yaml,/v1/domains/records/{recordId},updateRecord,update_record,patch,,dns,dns,records,update,update,,Update an existing DNS record +dns.yaml,/domains/{domain}/records,replaceDomainsByDomainRecords,replace_domains_by_domain_records,put,,,,records,replace,replace,, +dns.yaml,/domains/records/{recordId},getDomainsRecordsByRecordId,get_domains_records_by_record_id,get,,,,records,get,select,, +dns.yaml,/v2/domains/{domain}/records/{recordId},removeRecord,remove_record,delete,,dns,dns,records,delete,delete,,Delete a DNS record +domains.yaml,/v6/domains/{domain}/config,getDomainConfig,get_domain_config,get,,domains,domains,domain_config,get,select,,Get a Domain's configuration +domains.yaml,/v9/domains/{domain}/verification,getDomainVerificationRecord,get_domain_verification_record,get,,domains,domains,domain_verification,get,select,,Get Domain Verification Record +domains.yaml,/v9/domains/{domain}/claim,claimDomainOwnership,claim_domain_ownership,post,,domains,domains,domains,claim_ownership,exec,,Claim Domain Ownership +domains.yaml,/v1/domains/{domain}/project-domains,getDomainProjectDomains,get_domain_project_domains,get,,domains,domains,domain_project_domains,list,select,$.projectDomains,List Project Domains by Apex Domain +domains.yaml,/v5/domains/{domain},getDomain,get_domain,get,,domains,domains,domains,get,select,$.domain,Get Information for a Single Domain +domains.yaml,/v5/domains,getDomains,get_domains,get,,domains,domains,domains,list,select,$.domains,List all the domains +domains.yaml,/v7/domains,createOrTransferDomain,create_or_transfer_domain,post,,domains,domains,domains,create,insert,,Add an existing domain to the Vercel platform +domains.yaml,/v3/domains/{domain},patchDomain,patch_domain,patch,,domains,domains,domains,update,update,,Update or move apex domain +domains.yaml,/v6/domains/{domain},deleteDomain,delete_domain,delete,,domains,domains,domains,delete,delete,,Remove a domain by name +domains_registrar.yaml,/v1/registrar/tlds/supported,getSupportedTlds,get_supported_tlds,get,TldName,domains-registrar,domains_registrar,tlds,list,select,,Get supported TLDs +domains_registrar.yaml,/v1/registrar/tlds/{tld},getTld,get_tld,get,,domains-registrar,domains_registrar,tlds,get,select,,Get TLD +domains_registrar.yaml,/v1/registrar/tlds/{tld}/price,getTldPrice,get_tld_price,get,,domains-registrar,domains_registrar,tld_prices,get,select,,Get TLD price data +domains_registrar.yaml,/v1/registrar/domains/{domain}/availability,getDomainAvailability,get_domain_availability,get,,domains-registrar,domains_registrar,domain_availability,get,select,,Get availability for a domain +domains_registrar.yaml,/v1/registrar/domains/{domain}/price,getDomainPrice,get_domain_price,get,,domains-registrar,domains_registrar,domain_prices,get,select,,Get price data for a domain +domains_registrar.yaml,/v1/registrar/domains/availability,getBulkAvailability,get_bulk_availability,post,,domains-registrar,domains_registrar,domain_availability,get_bulk,exec,,Get availability for multiple domains +domains_registrar.yaml,/v1/registrar/domains/{domain}/auth-code,getDomainAuthCode,get_domain_auth_code,get,,domains-registrar,domains_registrar,domain_auth_codes,get,select,,Get the auth code for a domain +domains_registrar.yaml,/v1/registrar/domains/{domain}/buy,buySingleDomain,buy_single_domain,post,,domains-registrar,domains_registrar,orders,buy_domain,exec,,Buy a domain +domains_registrar.yaml,/v1/registrar/domains/buy,buyDomains,buy_domains,post,,domains-registrar,domains_registrar,orders,buy_domains,exec,,Buy multiple domains +domains_registrar.yaml,/v1/registrar/domains/{domain}/transfer,transferInDomain,transfer_in_domain,post,,domains-registrar,domains_registrar,orders,transfer_in_domain,exec,,Transfer-in a domain +domains_registrar.yaml,/v1/registrar/domains/{domain}/transfer,getDomainTransferIn,get_domain_transfer_in,get,,domains-registrar,domains_registrar,domain_transfers,get,select,,Get a domain's transfer status +domains_registrar.yaml,/v1/registrar/domains/{domain}/renew,renewDomain,renew_domain,post,,domains-registrar,domains_registrar,orders,renew_domain,exec,,Renew a domain +domains_registrar.yaml,/v1/registrar/domains/{domain}/auto-renew,updateDomainAutoRenew,update_domain_auto_renew,patch,,domains-registrar,domains_registrar,domains,update_auto_renew,exec,,Update auto-renew for a domain +domains_registrar.yaml,/v1/registrar/domains/{domain}/nameservers,updateDomainNameservers,update_domain_nameservers,patch,,domains-registrar,domains_registrar,domains,update_nameservers,exec,,Update nameservers for a domain +domains_registrar.yaml,/v1/registrar/domains/{domain}/contact-verification,getDomainContactVerification,get_domain_contact_verification,get,,domains-registrar,domains_registrar,domain_contact_verification,get,select,,Get contact verification status for a domain +domains_registrar.yaml,/v1/registrar/domains/{domain}/contact-info/schema,getContactInfoSchema,get_contact_info_schema,get,,domains-registrar,domains_registrar,contact_info_schema,get,select,,Get contact info schema +domains_registrar.yaml,/v1/registrar/orders/{orderId},getOrder,get_order,get,,domains-registrar,domains_registrar,orders,get,select,,Get a domain order +drains.yaml,/v1/drains,createDrain,create_drain,post,,drains,drains,drains,create,insert,,Create a new Drain +drains.yaml,/v1/drains,getDrains,get_drains,get,,drains,drains,drains,list,select,$.drains,Retrieve a list of all Drains +drains.yaml,/v1/drains/{id},deleteDrain,delete_drain,delete,,drains,drains,drains,delete,delete,,Delete a drain +drains.yaml,/v1/drains/{id},getDrain,get_drain,get,,drains,drains,drains,get,select,,Find a Drain by id +drains.yaml,/v1/drains/{id},updateDrain,update_drain,patch,,drains,drains,drains,update,update,,Update an existing Drain +drains.yaml,/v1/drains/test,testDrain,test_drain,post,,drains,drains,drains,test,exec,,Validate Drain delivery configuration +edge_cache.yaml,/v1/edge-cache/invalidate-by-tags,invalidateByTags,invalidate_by_tags,post,,edge-cache,edge_cache,cache,invalidate_by_tags,exec,,Invalidate by tag +edge_cache.yaml,/v1/edge-cache/dangerously-delete-by-tags,dangerouslyDeleteByTags,dangerously_delete_by_tags,post,,edge-cache,edge_cache,cache,delete_by_tags,exec,,Dangerously delete by tag +edge_cache.yaml,/v1/edge-cache/invalidate-by-src-images,invalidateBySrcImages,invalidate_by_src_images,post,,edge-cache,edge_cache,cache,invalidate_by_src_images,exec,,Invalidate by source image +edge_cache.yaml,/v1/edge-cache/dangerously-delete-by-src-images,dangerouslyDeleteBySrcImages,dangerously_delete_by_src_images,post,,edge-cache,edge_cache,cache,delete_by_src_images,exec,,Dangerously delete by source image +edge_config.yaml,/v1/global-config,getEdgeConfigs,get_edge_configs,get,,global-config,global_config,edge_configs,list,select,,Get Global Configs +edge_config.yaml,/v1/global-config,createEdgeConfig,create_edge_config,post,,global-config,global_config,edge_configs,create,insert,,Create a Global Config +edge_config.yaml,/v1/global-config/{edgeConfigId},getEdgeConfig,get_edge_config,get,,global-config,global_config,edge_configs,get,select,,Get a Global Config +edge_config.yaml,/v1/global-config/{edgeConfigId},updateEdgeConfig,update_edge_config,put,,global-config,global_config,edge_configs,update,update,,Update a Global Config +edge_config.yaml,/v1/global-config/{edgeConfigId},deleteEdgeConfig,delete_edge_config,delete,,global-config,global_config,edge_configs,delete,delete,,Delete a Global Config +edge_config.yaml,/v1/global-config/{edgeConfigId}/items,getEdgeConfigItems,get_edge_config_items,get,GlobalConfigItem,global-config,global_config,items,list,select,,Get Global Config items +edge_config.yaml,/v1/global-config/{edgeConfigId}/items,patchEdgeConfigItems,patch_edge_config_items,patch,,global-config,global_config,items,update,update,,Update Global Config items in batch +edge_config.yaml,/v1/global-config/{edgeConfigId}/schema,getEdgeConfigSchema,get_edge_config_schema,get,,global-config,global_config,schema,get,select,,Get Global Config schema +edge_config.yaml,/v1/global-config/{edgeConfigId}/schema,patchEdgeConfigSchema,patch_edge_config_schema,post,,global-config,global_config,schema,update,update,,Update Global Config schema +edge_config.yaml,/v1/global-config/{edgeConfigId}/schema,deleteEdgeConfigSchema,delete_edge_config_schema,delete,,global-config,global_config,schema,delete,delete,,Delete a Global Config's schema +edge_config.yaml,/v1/global-config/{edgeConfigId}/item/{edgeConfigItemKey},getEdgeConfigItem,get_edge_config_item,get,GlobalConfigItem,global-config,global_config,items,get,select,,Get a Global Config item +edge_config.yaml,/v1/global-config/{edgeConfigId}/tokens,getEdgeConfigTokens,get_edge_config_tokens,get,GlobalConfigToken,global-config,global_config,tokens,list,select,,Get all tokens of a Global Config +edge_config.yaml,/v1/global-config/{edgeConfigId}/tokens,deleteEdgeConfigTokens,delete_edge_config_tokens,delete,,global-config,global_config,tokens,delete,delete,,Delete one or more Global Config tokens +edge_config.yaml,/v1/global-config/{edgeConfigId}/token/{token},getEdgeConfigToken,get_edge_config_token,get,GlobalConfigToken,global-config,global_config,tokens,get,select,,Get Global Config token meta data +edge_config.yaml,/v1/global-config/{edgeConfigId}/token,createEdgeConfigToken,create_edge_config_token,post,,global-config,global_config,tokens,create,insert,,Create a Global Config token +edge_config.yaml,/v1/global-config/{edgeConfigId}/backups/{edgeConfigBackupVersionId},getEdgeConfigBackup,get_edge_config_backup,get,,global-config,global_config,backups,get,select,,Get Global Config backup +edge_config.yaml,/v1/global-config/{edgeConfigId}/backups/{edgeConfigBackupVersionId}/restore,restoreEdgeConfigBackup,restore_edge_config_backup,post,,global-config,global_config,backups,restore,exec,,Restore Global Config backup +edge_config.yaml,/v1/global-config/{edgeConfigId}/backups,getEdgeConfigBackups,get_edge_config_backups,get,,global-config,global_config,backups,list,select,$.backups,Get Global Config backups +environments.yaml,/v1/env,createSharedEnvVariable,create_shared_env_variable,post,,environment,environment,shared_env_variables,create,insert,,Create one or more shared environment variables +environments.yaml,/v1/env,listSharedEnvVariable,list_shared_env_variable,get,,environment,environment,shared_env_variables,list,select,$.data,Lists all Shared Environment Variables for a team +environments.yaml,/v1/env,updateSharedEnvVariable,update_shared_env_variable,patch,,environment,environment,shared_env_variables,update,update,,Updates one or more shared environment variables +environments.yaml,/v1/env,deleteSharedEnvVariable,delete_shared_env_variable,delete,,environment,environment,shared_env_variables,delete,delete,,Delete one or more Env Var +environments.yaml,/v1/env/{id},getSharedEnvVar,get_shared_env_var,get,,environment,environment,shared_env_variables,get,select,,Retrieve the decrypted value of a Shared Environment Variable by id. +environments.yaml,/v1/env/{id}/unlink/{projectId},unlinkSharedEnvVariable,unlink_shared_env_variable,patch,,environment,environment,shared_env_variables,unlink,exec,,Disconnects a shared environment variable for a given project +environments.yaml,/v9/projects/{idOrName}/custom-environments,createCustomEnvironment,create_custom_environment,post,,environment,environment,custom_environments,create,insert,,Create a custom environment for the current project. +environments.yaml,/v9/projects/{idOrName}/custom-environments,getProjectsByIdOrNameCustomEnvironments,get_projects_by_id_or_name_custom_environments,get,,environment,environment,custom_environments,list,select,$.environments,Retrieve custom environments +environments.yaml,/v9/projects/{idOrName}/custom-environments/{environmentSlugOrId},getCustomEnvironment,get_custom_environment,get,,environment,environment,custom_environments,get,select,,Retrieve a custom environment +environments.yaml,/v9/projects/{idOrName}/custom-environments/{environmentSlugOrId},updateCustomEnvironment,update_custom_environment,patch,,environment,environment,custom_environments,update,update,,Update a custom environment +environments.yaml,/v9/projects/{idOrName}/custom-environments/{environmentSlugOrId},removeCustomEnvironment,remove_custom_environment,delete,,environment,environment,custom_environments,delete,delete,,Remove a custom environment +feature_flags.yaml,/v2/projects/{projectIdOrName}/feature-flags/flags,listFlagsV2,list_flags_v2,get,,feature-flags,feature_flags,flags,list,select,$.data,List flags +feature_flags.yaml,/v1/projects/{projectIdOrName}/feature-flags/flags,listFlags,list_flags,get,,feature-flags,feature_flags,flags,list_v1,exec,,List flags +feature_flags.yaml,/v1/projects/{projectIdOrName}/feature-flags/flags,createFlag,create_flag,put,,feature-flags,feature_flags,flags,create,insert,,Create a flag +feature_flags.yaml,/v1/projects/{projectIdOrName}/feature-flags/flags/{flagIdOrSlug},getFlag,get_flag,get,Flag,feature-flags,feature_flags,flags,get,select,,Get a flag +feature_flags.yaml,/v1/projects/{projectIdOrName}/feature-flags/flags/{flagIdOrSlug},updateFlag,update_flag,patch,,feature-flags,feature_flags,flags,update,update,,Update a flag +feature_flags.yaml,/v1/projects/{projectIdOrName}/feature-flags/flags/{flagIdOrSlug},deleteFlag,delete_flag,delete,,feature-flags,feature_flags,flags,delete,delete,,Delete a flag +feature_flags.yaml,/v1/projects/{projectIdOrName}/feature-flags/flags/{flagIdOrSlug}/versions,listFlagVersions,list_flag_versions,get,,feature-flags,feature_flags,flag_versions,list,select,$.versions,List flag versions +feature_flags.yaml,/v1/projects/{projectIdOrName}/feature-flags/settings,getFlagSettings,get_flag_settings,get,,feature-flags,feature_flags,settings,get,select,,Get project flag settings +feature_flags.yaml,/v1/projects/{projectIdOrName}/feature-flags/settings,updateFlagSettings,update_flag_settings,patch,,feature-flags,feature_flags,settings,update,update,,Update project flag settings +feature_flags.yaml,/v1/teams/{teamId}/feature-flags/settings,listTeamFlagSettings,list_team_flag_settings,get,,feature-flags,feature_flags,team_settings,list,select,$.data,List team project flag settings +feature_flags.yaml,/v2/teams/{teamId}/feature-flags/flags,listTeamFlagsV2,list_team_flags_v2,get,,feature-flags,feature_flags,team_flags,list,select,$.data,List all flags for a team +feature_flags.yaml,/v1/teams/{teamId}/feature-flags/flags,listTeamFlags,list_team_flags,get,,feature-flags,feature_flags,team_flags,list_v1,exec,,List all flags for a team +feature_flags.yaml,/v1/projects/{projectIdOrName}/feature-flags/segments,createFlagSegment,create_flag_segment,put,,feature-flags,feature_flags,segments,create,insert,,Create a segment +feature_flags.yaml,/v1/projects/{projectIdOrName}/feature-flags/segments,listFlagSegments,list_flag_segments,get,,feature-flags,feature_flags,segments,list,select,$.data,List segments +feature_flags.yaml,/v1/projects/{projectIdOrName}/feature-flags/segments/{segmentIdOrSlug},getFlagSegment,get_flag_segment,get,Segment,feature-flags,feature_flags,segments,get,select,,Get a segment +feature_flags.yaml,/v1/projects/{projectIdOrName}/feature-flags/segments/{segmentIdOrSlug},deleteFlagSegment,delete_flag_segment,delete,,feature-flags,feature_flags,segments,delete,delete,,Delete a segment +feature_flags.yaml,/v1/projects/{projectIdOrName}/feature-flags/segments/{segmentIdOrSlug},updateFlagSegment,update_flag_segment,patch,,feature-flags,feature_flags,segments,update,update,,Update a segment +feature_flags.yaml,/v1/deployments/{deploymentId}/feature-flags,getDeploymentFeatureFlags,get_deployment_feature_flags,get,,feature-flags,feature_flags,deployment_flags,get,select,,Retrieve the feature flags of a deployment +feature_flags.yaml,/v1/projects/{projectIdOrName}/feature-flags/sdk-keys,getSdkKeys,get_sdk_keys,get,,feature-flags,feature_flags,sdk_keys,list,select,$.data,Get all SDK keys +feature_flags.yaml,/v1/projects/{projectIdOrName}/feature-flags/sdk-keys,createSdkKey,create_sdk_key,put,FlagsSdkKeyWithSecrets,feature-flags,feature_flags,sdk_keys,create,insert,,Create an SDK key +feature_flags.yaml,/v1/projects/{projectIdOrName}/feature-flags/sdk-keys/{hashKey},deleteSdkKey,delete_sdk_key,delete,,feature-flags,feature_flags,sdk_keys,delete,delete,,Delete an SDK key +integrations.yaml,/v1/integrations/git-namespaces,gitNamespaces,git_namespaces,get,,integrations,integrations,git_namespaces,list,select,,List git namespaces by provider +integrations.yaml,/v1/integrations/search-repo,searchRepo,search_repo,get,,integrations,integrations,repos,search,select,$.repos,List git repositories linked to namespace by provider +integrations.yaml,/v1/integrations/integration/{integrationIdOrSlug}/products/{productIdOrSlug}/plans,getBillingPlans,get_billing_plans,get,,integrations,integrations,billing_plans,list,select,$.plans,List integration billing plans +integrations.yaml,/v1/integrations/installations/{integrationConfigurationId}/resources/{resourceId}/connections,connectIntegrationResourceToProject,connect_integration_resource_to_project,post,,integrations,integrations,configurations,connect_resource_to_project,exec,,Connect integration resource to project +integrations.yaml,/v1/integrations/configurations,getConfigurations,get_configurations,get,,integrations,integrations,configurations,list,select,,Get configurations for the authenticated user or team +integrations.yaml,/v1/integrations/configuration/{id},getConfiguration,get_configuration,get,,integrations,integrations,configurations,get,select,,Retrieve an integration configuration +integrations.yaml,/v1/integrations/configuration/{id},deleteConfiguration,delete_configuration,delete,,integrations,integrations,configurations,delete,delete,,Delete an integration configuration +integrations.yaml,/v1/integrations/configuration/{id}/products,getConfigurationProducts,get_configuration_products,get,,integrations,integrations,configuration_products,list,select,$.products,List products for integration configuration +integrations.yaml,/v1/storage/stores/integration/direct,createIntegrationStoreDirect,create_integration_store_direct,post,,integrations,integrations,stores,create_direct,insert,,Create integration store (free and paid plans) +kms.yaml,/v1/kms/issuers,listKmsIssuers,list_kms_issuers,get,,kms,kms,issuers,list,select,$.issuers,List issuers +kms.yaml,/v1/kms/issuers,createKmsIssuer,create_kms_issuer,post,,kms,kms,issuers,create,insert,,Create an issuer +kms.yaml,/v1/kms/issuers/{issuerId}/sign/message,signKmsMessage,sign_kms_message,post,,kms,kms,issuers,sign_message,exec,,Sign a message +kms.yaml,/v1/kms/issuers/{issuerId}/sign/token,signKmsToken,sign_kms_token,post,,kms,kms,issuers,sign_token,exec,,Sign a token +kms.yaml,/v1/kms/issuers/{issuerId}/keys,createKmsSigningKey,create_kms_signing_key,post,,kms,kms,signing_keys,create,insert,,Create a signing key +kms.yaml,/v1/kms/issuers/{issuerId}/keys/{keyId}/activate,activateKmsSigningKey,activate_kms_signing_key,post,,kms,kms,signing_keys,activate,exec,,Activate a signing key +kms.yaml,/v1/kms/issuers/{issuerId}/keys/{keyId}/revoke,revokeKmsSigningKey,revoke_kms_signing_key,post,,kms,kms,signing_keys,revoke,exec,,Revoke a signing key +kms.yaml,/v1/kms/issuers/{issuerId},getKmsIssuer,get_kms_issuer,get,,kms,kms,issuers,get,select,,Get an issuer +kms.yaml,/v1/kms/issuers/{issuerId},updateKmsIssuer,update_kms_issuer,patch,,kms,kms,issuers,update,update,,Update an issuer +kms.yaml,/v1/kms/issuers/{issuerId},deleteKmsIssuer,delete_kms_issuer,delete,,kms,kms,issuers,delete,delete,,Delete an issuer +kms.yaml,/v1/kms/issuers/{issuerId}/policies,createKmsIssuerPolicy,create_kms_issuer_policy,post,,kms,kms,issuer_policies,create,insert,,Create an issuer policy +kms.yaml,/v1/kms/issuers/{issuerId}/policies/{kind}/{policyKey},updateKmsIssuerPolicy,update_kms_issuer_policy,patch,,kms,kms,issuer_policies,update,update,,Update an issuer policy +kms.yaml,/v1/kms/issuers/{issuerId}/policies/{kind}/{policyKey},deleteKmsIssuerPolicy,delete_kms_issuer_policy,delete,,kms,kms,issuer_policies,delete,delete,,Delete an issuer policy +log_drains.yaml,/v1/log-drains/{id},getConfigurableLogDrain,get_configurable_log_drain,get,,logDrains,log_drains,log_drains,get,select,,Retrieves a Configurable Log Drain (deprecated) +log_drains.yaml,/v1/log-drains/{id},deleteConfigurableLogDrain,delete_configurable_log_drain,delete,,logDrains,log_drains,log_drains,delete,delete,,Deletes a Configurable Log Drain (deprecated) +log_drains.yaml,/v1/log-drains,getAllLogDrains,get_all_log_drains,get,,logDrains,log_drains,log_drains,list,select,,Retrieves a list of all the Log Drains (deprecated) +log_drains.yaml,/v1/log-drains,createConfigurableLogDrain,create_configurable_log_drain,post,,logDrains,log_drains,log_drains,create,insert,,Creates a Configurable Log Drain (deprecated) +log_drains.yaml,/v2/integrations/log-drains,getIntegrationLogDrains,get_integration_log_drains,get,,logDrains,log_drains,integration_log_drains,list,select,,Retrieves a list of Integration log drains (deprecated) +log_drains.yaml,/v2/integrations/log-drains,createLogDrain,create_log_drain,post,,logDrains,log_drains,integration_log_drains,create,insert,,Creates a new Integration Log Drain (deprecated) +log_drains.yaml,/v1/integrations/log-drains/{id},deleteIntegrationLogDrain,delete_integration_log_drain,delete,,logDrains,log_drains,integration_log_drains,delete,delete,,Deletes the Integration log drain with the provided `id` (deprecated) +marketplace.yaml,/v1/installations/{integrationConfigurationId},update-installation,update_installation,patch,,marketplace,marketplace,installations,update,update,,Update Installation +marketplace.yaml,/v1/installations/{integrationConfigurationId}/account,get-account-info,get_account_info,get,,marketplace,marketplace,account_info,get,select,,Get Account Information +marketplace.yaml,/v1/installations/{integrationConfigurationId}/member/{memberId},get-member,get_member,get,,marketplace,marketplace,members,get,select,,Get Member Information +marketplace.yaml,/v1/installations/{integrationConfigurationId}/credentials/rotate,rotate-installation-credential,rotate_installation_credential,post,,marketplace,marketplace,installations,rotate_credential,exec,,Rotate Installation Credential +marketplace.yaml,/v1/installations/{integrationConfigurationId}/credentials/revoke,revoke-installation-credential,revoke_installation_credential,post,,marketplace,marketplace,installations,revoke_credential,exec,,Revoke Installation Credential +marketplace.yaml,/v1/installations/{integrationConfigurationId}/events,create-event,create_event,post,,marketplace,marketplace,events,create,insert,,Create Event +marketplace.yaml,/v1/installations/{integrationConfigurationId}/resources,get-integration-resources,get_integration_resources,get,,marketplace,marketplace,resources,list,select,$.resources,Get Integration Resources +marketplace.yaml,/v1/installations/{integrationConfigurationId}/resources/{resourceId},get-integration-resource,get_integration_resource,get,,marketplace,marketplace,resources,get,select,,Get Integration Resource +marketplace.yaml,/v1/installations/{integrationConfigurationId}/resources/{resourceId},delete-integration-resource,delete_integration_resource,delete,,marketplace,marketplace,resources,delete,delete,,Delete Integration Resource +marketplace.yaml,/v1/installations/{integrationConfigurationId}/resources/{resourceId},import-resource,import_resource,put,,marketplace,marketplace,resources,import,replace,,Import Resource +marketplace.yaml,/v1/installations/{integrationConfigurationId}/resources/{resourceId},update-resource,update_resource,patch,,marketplace,marketplace,resources,update,update,,Update Resource +marketplace.yaml,/v1/installations/{integrationConfigurationId}/billing,submit-billing-data,submit_billing_data,post,,marketplace,marketplace,billing,submit,exec,,Submit Billing Data +marketplace.yaml,/v1/installations/{integrationConfigurationId}/billing/invoices,submit-invoice,submit_invoice,post,,marketplace,marketplace,invoices,create,insert,,Submit Invoice +marketplace.yaml,/v1/installations/{integrationConfigurationId}/billing/finalize,finalize-installation,finalize_installation,post,,marketplace,marketplace,installations,finalize,exec,,Finalize Installation +marketplace.yaml,/v1/installations/{integrationConfigurationId}/billing/invoices/{invoiceId},get-invoice,get_invoice,get,,marketplace,marketplace,invoices,get,select,,Get Invoice +marketplace.yaml,/v1/installations/{integrationConfigurationId}/billing/invoices/{invoiceId}/actions,update-invoice,update_invoice,post,,marketplace,marketplace,invoices,update,exec,,Invoice Actions +marketplace.yaml,/v1/installations/{integrationConfigurationId}/billing/balance,submit-prepayment-balances,submit_prepayment_balances,post,,marketplace,marketplace,billing,submit_prepayment_balances,exec,,Submit Prepayment Balances +marketplace.yaml,/v1/installations/{integrationConfigurationId}/products/{integrationProductIdOrSlug}/resources/{resourceId}/secrets,update-resource-secrets,update_resource_secrets,put,,marketplace,marketplace,resources,update_secrets,exec,,Deprecated: true. Update Resource Secrets (Deprecated) +marketplace.yaml,/v1/installations/{integrationConfigurationId}/resources/{resourceId}/secrets,update-resource-secrets-by-id,update_resource_secrets_by_id,put,,marketplace,marketplace,resources,update_secrets_by_id,exec,,Update Resource Secrets +marketplace.yaml,/v1/integrations/sso/token,exchange-sso-token,exchange_sso_token,post,,authentication|marketplace,authentication|marketplace,sso_tokens,exchange,exec,,SSO Token Exchange +marketplace.yaml,/v1/installations/{integrationConfigurationId}/resources/{resourceId}/experimentation/items,createInstallationsByIntegrationConfigurationIdResourcesByResourceIdExperimentationItems,create_installations_by_integration_configuration_id_resources_by_resource_id_experimentation_items,post,,marketplace,marketplace,experimentation_items,create,insert,,Create one or multiple experimentation items +marketplace.yaml,/v1/installations/{integrationConfigurationId}/resources/{resourceId}/experimentation/items/{itemId},updateInstallationsByIntegrationConfigurationIdResourcesByResourceIdExperimentationItemsByItemId,update_installations_by_integration_configuration_id_resources_by_resource_id_experimentation_items_by_item_id,patch,,marketplace,marketplace,experimentation_items,update,update,,Patch an existing experimentation item +marketplace.yaml,/v1/installations/{integrationConfigurationId}/resources/{resourceId}/experimentation/items/{itemId},deleteInstallationsByIntegrationConfigurationIdResourcesByResourceIdExperimentationItemsByItemId,delete_installations_by_integration_configuration_id_resources_by_resource_id_experimentation_items_by_item_id,delete,,marketplace,marketplace,experimentation_items,delete,delete,,Delete an existing experimentation item +marketplace.yaml,/v1/installations/{integrationConfigurationId}/resources/{resourceId}/experimentation/global-config,getInstallationsByIntegrationConfigurationIdResourcesByResourceIdExperimentationGlobalConfig,get_installations_by_integration_configuration_id_resources_by_resource_id_experimentation_global_config,get,,marketplace,marketplace,experimentation_edge_config,get,select,$,Get the data of a user-provided Global Config +marketplace.yaml,/v1/installations/{integrationConfigurationId}/resources/{resourceId}/experimentation/global-config,replaceInstallationsByIntegrationConfigurationIdResourcesByResourceIdExperimentationGlobalConfig,replace_installations_by_integration_configuration_id_resources_by_resource_id_experimentation_global_config,put,,marketplace,marketplace,experimentation_edge_config,replace,replace,,Push data into a user-provided Global Config +microfrontends.yaml,/v1/microfrontends/groups,getMicrofrontendsGroups,get_microfrontends_groups,get,,microfrontends,microfrontends,groups,list,select,,List microfrontends groups +microfrontends.yaml,/v1/microfrontends/groups/{groupId}/projects,getMicrofrontendsInGroup,get_microfrontends_in_group,get,,microfrontends,microfrontends,group_projects,list,select,$.projects,List projects in a microfrontends group +microfrontends.yaml,/v1/microfrontends/{deploymentId}/config,getMicrofrontendsConfig,get_microfrontends_config,get,,microfrontends,microfrontends,deployment_config,get,select,$.config,Get microfrontends config for a deployment +microfrontends.yaml,/v1/microfrontends/projects/{projectIdOrName}/production-mfe-config,getMicrofrontendsConfigForProject,get_microfrontends_config_for_project,get,,microfrontends,microfrontends,project_config,get,select,$.config,Get microfrontends config for a project +microfrontends.yaml,/v1/microfrontends/group,createMicrofrontendsGroupWithApplications,create_microfrontends_group_with_applications,post,,microfrontends,microfrontends,groups,create,insert,,Create a microfrontends group with applications +networking.yaml,/v1/connect/networks,listNetworks,list_networks,get,Network,networking,networking,networks,list,select,,List Secure Compute networks +networking.yaml,/v1/connect/networks,createNetwork,create_network,post,Network,networking,networking,networks,create,insert,,Create a Secure Compute network +networking.yaml,/v1/connect/networks/{networkId},deleteNetwork,delete_network,delete,,networking,networking,networks,delete,delete,,Delete a Secure Compute network +networking.yaml,/v1/connect/networks/{networkId},updateNetwork,update_network,patch,Network,networking,networking,networks,update,update,,Update a Secure Compute network +networking.yaml,/v1/connect/networks/{networkId},readNetwork,read_network,get,Network,networking,networking,networks,get,select,,Read a Secure Compute network +networking.yaml,/v1/networking/privatelink/endpoints,createPrivateLinkEndpoint,create_private_link_endpoint,post,PrivateLinkEndpoint,networking,networking,privatelink_endpoints,create,insert,,Create a PrivateLink endpoint +networking.yaml,/v1/networking/privatelink/endpoints,listPrivateLinkEndpoints,list_private_link_endpoints,get,PrivateLinkEndpoint,networking,networking,privatelink_endpoints,list,select,,List PrivateLink endpoints +networking.yaml,/v1/networking/privatelink/endpoints/{endpointId},readPrivateLinkEndpoint,read_private_link_endpoint,get,PrivateLinkEndpoint,networking,networking,privatelink_endpoints,get,select,,Read a PrivateLink endpoint +networking.yaml,/v1/networking/privatelink/endpoints/{endpointId},deletePrivateLinkEndpoint,delete_private_link_endpoint,delete,,networking,networking,privatelink_endpoints,delete,delete,,Delete a PrivateLink endpoint +networking.yaml,/v1/networking/privatelink/endpoints/{endpointId},updatePrivateLinkEndpoint,update_private_link_endpoint,patch,PrivateLinkEndpoint,networking,networking,privatelink_endpoints,update,update,,Update a PrivateLink endpoint +networking.yaml,/v1/projects/{idOrName}/shared-connect-links,updateStaticIps,update_static_ips,patch,,networking|static-ips,networking|static_ips,static_ips,update,update,,Configures Static IPs for a project +observability.yaml,/v1/observability/manage/configuration/projects,getObservabilityConfigurationProjects,get_observability_configuration_projects,get,,observability,observability,configuration_projects,list,select,$.disabledProjects,Lists disabled Observability Plus projects +observability.yaml,/v1/observability/manage/configuration/projects/{projectIdOrName},updateObservabilityConfigurationProject,update_observability_configuration_project,put,,observability,observability,configuration_projects,update,update,,Updates a disabled Observability Plus project setting +observability.yaml,/v2/observability/query,createObservabilityQuery,create_observability_query,post,,,,queries,run,exec,, +observability.yaml,/v2/observability/schema,getObservabilitySchema,get_observability_schema,get,,,,schema,list,select,, +observability.yaml,/v2/observability/schema/{metricId},getObservabilitySchemaByMetricId,get_observability_schema_by_metric_id,get,,,,schema,get,select,, +projects.yaml,/v10/projects,getProjects,get_projects,get,,projects,projects,projects,list,select,$.projects,Retrieve a list of projects +projects.yaml,/v1/projects/traces,getProjectTrace,get_project_trace,get,,projects,projects,traces,get,select,$.trace,Get a project trace by request ID +projects.yaml,/v11/projects,createProject,create_project,post,,projects,projects,projects,create,insert,,Create a new project +projects.yaml,/v1/projects/{idOrName}/token,getProjectToken,get_project_token,post,,projects,projects,projects,get_token,exec,,Generate a project OIDC token +projects.yaml,/v1/projects/traces/session,createTraceSession,create_trace_session,post,,projects,projects,traces,create_session,exec,,Create a trace session token for a deployment +projects.yaml,/v9/projects/{idOrName},getProject,get_project,get,,projects,projects,projects,get,select,,Find a project by id or name +projects.yaml,/v9/projects/{idOrName},updateProject,update_project,patch,,projects,projects,projects,update,update,,Update an existing project +projects.yaml,/v9/projects/{idOrName},deleteProject,delete_project,delete,,projects,projects,projects,delete,delete,,Delete a Project +projects.yaml,/v1/projects/{idOrName}/avatar,uploadProjectAvatar,upload_project_avatar,post,,projects,projects,projects,upload_avatar,exec,,Upload a project avatar +projects.yaml,/v9/projects/{idOrName}/domains,getProjectDomains,get_project_domains,get,,projects,projects,domains,list,select,$.domains,Retrieve project domains by project by id or name +projects.yaml,/v9/projects/{idOrName}/domains/{domain},getProjectDomain,get_project_domain,get,,projects,projects,domains,get,select,,Get a project domain +projects.yaml,/v9/projects/{idOrName}/domains/{domain},updateProjectDomain,update_project_domain,patch,,projects,projects,domains,update,update,,Update a project domain +projects.yaml,/v9/projects/{idOrName}/domains/{domain},removeProjectDomain,remove_project_domain,delete,,projects,projects,domains,delete,delete,,Remove a domain from a project +projects.yaml,/v10/projects/{idOrName}/domains,addProjectDomain,add_project_domain,post,,projects,projects,domains,add,insert,,Add a domain to a project +projects.yaml,/v1/projects/{idOrName}/domains/{domain}/move,moveProjectDomain,move_project_domain,post,,projects,projects,domains,move,exec,,Move a project domain +projects.yaml,/v9/projects/{idOrName}/domains/{domain}/verify,verifyProjectDomain,verify_project_domain,post,,projects,projects,domains,verify,exec,,Verify project domain +projects.yaml,/v10/projects/{idOrName}/env,filterProjectEnvs,filter_project_envs,get,,projects,projects,env_vars,list,select,$.envs,Retrieve the environment variables of a project by id or name +projects.yaml,/v10/projects/{idOrName}/env,createProjectEnv,create_project_env,post,,projects,projects,env_vars,create,insert,,Create one or more environment variables +projects.yaml,/v1/projects/{idOrName}/env/{id},getProjectEnv,get_project_env,get,,projects,projects,env_vars,get,select,,Retrieve the decrypted value of an environment variable of a project by id +projects.yaml,/v9/projects/{idOrName}/env/{id},removeProjectEnv,remove_project_env,delete,,projects,projects,env_vars,delete,delete,,Remove an environment variable +projects.yaml,/v9/projects/{idOrName}/env/{id},editProjectEnv,edit_project_env,patch,,projects,projects,env_vars,update,update,,Edit an environment variable +projects.yaml,/v1/projects/{idOrName}/env,batchRemoveProjectEnv,batch_remove_project_env,delete,,projects,projects,env_vars,batch_delete,delete,,Batch remove environment variables +projects.yaml,/projects/{idOrName}/transfer-request,createProjectTransferRequest,create_project_transfer_request,post,,projects,projects,transfer_requests,create,insert,,Create project transfer request +projects.yaml,/projects/transfer-request/{code},acceptProjectTransferRequest,accept_project_transfer_request,put,,projects,projects,transfer_requests,accept,exec,,Accept project transfer request +projects.yaml,/v1/projects/{idOrName}/protection-bypass,updateProjectProtectionBypass,update_project_protection_bypass,patch,,projects,projects,projects,update_protection_bypass,exec,,Update Protection Bypass for Automation +projects.yaml,/v1/projects/{projectId}/rollback/{deploymentId},requestRollback,request_rollback,post,,projects,projects,projects,rollback,exec,,Point production traffic to a previous production deployment by ID +projects.yaml,/v1/projects/{projectId}/rollback/{deploymentId}/update-description,updateProjectsByProjectIdRollbackByDeploymentIdUpdateDescription,update_projects_by_project_id_rollback_by_deployment_id_update_description,patch,,projects,projects,projects,update_rollback_description,exec,,Updates the description for a rollback +projects.yaml,/v1/projects/{projectId}/microfrontends,updateMicrofrontends,update_microfrontends,patch,,projects,projects,projects,update_microfrontends,exec,,Update the microfrontends settings +projects.yaml,/v10/projects/{projectId}/promote/{deploymentId},requestPromote,request_promote,post,,projects,projects,projects,promote,exec,,Point production traffic to a given deployment +projects.yaml,/v1/projects/{projectId}/promote/aliases,listPromoteAliases,list_promote_aliases,get,,projects,projects,promote_aliases,list,select,$.aliases,Gets a list of aliases with status for the current promote +projects.yaml,/v1/projects/{projectId}/pause,pauseProject,pause_project,post,,projects,projects,projects,pause,exec,,Pause a project +projects.yaml,/v1/projects/{projectId}/unpause,unpauseProject,unpause_project,post,,projects,projects,projects,unpause,exec,,Unpause a project +project_members.yaml,/v1/projects/{idOrName}/members,getProjectMembers,get_project_members,get,,projectMembers,project_members,members,list,select,$.members,List project members +project_members.yaml,/v1/projects/{idOrName}/members,addProjectMember,add_project_member,post,,projectMembers,project_members,members,add,insert,,Adds a new member to a project. +project_members.yaml,/v1/projects/{idOrName}/members/{uid},removeProjectMember,remove_project_member,delete,,projectMembers,project_members,members,remove,delete,,Remove a Project Member +project_routes.yaml,/v1/projects/{projectId}/routes,getRoutes,get_routes,get,,project-routes,project_routes,routes,list,select,$.routes,Get project routing rules +project_routes.yaml,/v1/projects/{projectId}/routes,stageRoutes,stage_routes,put,,project-routes,project_routes,routes,stage,replace,,Stage routing rules +project_routes.yaml,/v1/projects/{projectId}/routes,addRoute,add_route,post,,project-routes,project_routes,routes,create,insert,,Add a routing rule +project_routes.yaml,/v1/projects/{projectId}/routes,deleteRoutes,delete_routes,delete,,project-routes,project_routes,routes,delete,delete,,Delete routing rules +project_routes.yaml,/v1/projects/{projectId}/routes/{routeId},editRoute,edit_route,patch,,project-routes,project_routes,routes,update,update,,Edit a routing rule +project_routes.yaml,/v1/projects/{projectId}/routes/generate,generateRoute,generate_route,post,,project-routes,project_routes,routes,generate,exec,,Generate a routing rule from natural language +project_routes.yaml,/v1/projects/{projectId}/routes/versions,getRouteVersions,get_route_versions,get,,project-routes,project_routes,versions,list,select,$.versions,Get routing rule version history +project_routes.yaml,/v1/projects/{projectId}/routes/versions,updateRouteVersions,update_route_versions,post,,project-routes,project_routes,versions,update,exec,,"Promote, restore, or discard a routing rule version" +rolling_release.yaml,/v1/projects/{idOrName}/rolling-release/billing,getRollingReleaseBillingStatus,get_rolling_release_billing_status,get,,rolling-release,rolling_release,billing_status,get,select,,Get rolling release billing status +rolling_release.yaml,/v1/projects/{idOrName}/rolling-release/config,getRollingReleaseConfig,get_rolling_release_config,get,,rolling-release,rolling_release,config,get,select,$.rollingRelease,Get rolling release configuration +rolling_release.yaml,/v1/projects/{idOrName}/rolling-release/config,deleteRollingReleaseConfig,delete_rolling_release_config,delete,,rolling-release,rolling_release,config,delete,delete,,Delete rolling release configuration +rolling_release.yaml,/v1/projects/{idOrName}/rolling-release/config,updateRollingReleaseConfig,update_rolling_release_config,patch,,rolling-release,rolling_release,config,update,update,,Update the rolling release settings for the project +rolling_release.yaml,/v1/projects/{idOrName}/rolling-release,getRollingRelease,get_rolling_release,get,,rolling-release,rolling_release,rolling_releases,get,select,$.rollingRelease,Get the active rolling release information for a project +rolling_release.yaml,/v1/projects/{idOrName}/rolling-release/approve-stage,approveRollingReleaseStage,approve_rolling_release_stage,post,,rolling-release,rolling_release,rolling_releases,approve_stage,exec,,Update the active rolling release to the next stage for a project +rolling_release.yaml,/v1/projects/{idOrName}/rolling-release/start,startRollingRelease,start_rolling_release,post,,rolling-release,rolling_release,rolling_releases,start,exec,,Start a rolling release for the project +rolling_release.yaml,/v1/projects/{idOrName}/rolling-release/complete,completeRollingRelease,complete_rolling_release,post,,rolling-release,rolling_release,rolling_releases,complete,exec,,Complete the rolling release for the project +sandboxes.yaml,/v2/sandboxes,listNamedSandboxes,list_named_sandboxes,get,,sandboxes,sandboxes,sandboxes,list,select,$.sandboxes,List sandboxes +sandboxes.yaml,/v2/sandboxes,createSandboxesV2,create_sandboxes_v2,post,,sandboxes,sandboxes,sandboxes,create_v2,exec,,Create a named sandbox +sandboxes.yaml,/v2/sandboxes/drives,listDrives,list_drives,get,,sandboxes,sandboxes,drives,list,select,$.drives,List drives +sandboxes.yaml,/v2/sandboxes/drives/{name},getOrCreateDrive,get_or_create_drive,post,,sandboxes,sandboxes,drives,get_or_create,insert,,Get or create a drive +sandboxes.yaml,/v2/sandboxes/drives/{name},deleteDrive,delete_drive,delete,,sandboxes,sandboxes,drives,delete,delete,,Delete a drive +sandboxes.yaml,/v2/sandboxes/snapshots,listSessionSnapshots,list_session_snapshots,get,,sandboxes,sandboxes,snapshots,list,select,$.snapshots,List snapshots +sandboxes.yaml,/v2/sandboxes/snapshots/{snapshotId},getSessionSnapshot,get_session_snapshot,get,,sandboxes,sandboxes,snapshots,get,select,$.snapshot,Get a snapshot +sandboxes.yaml,/v2/sandboxes/snapshots/{snapshotId},deleteSessionSnapshot,delete_session_snapshot,delete,,sandboxes,sandboxes,snapshots,delete,delete,,Delete a snapshot +sandboxes.yaml,/v2/sandboxes/sessions,listSessions,list_sessions,get,,sandboxes,sandboxes,sessions,list,select,$.sessions,List sessions +sandboxes.yaml,/v2/sandboxes/sessions/{sessionId},getSession,get_session,get,,sandboxes,sandboxes,sessions,get,select,$.session,Get a session +sandboxes.yaml,/v2/sandboxes/{name},getNamedSandbox,get_named_sandbox,get,,sandboxes,sandboxes,sandboxes,get,select,$.sandbox,Get a named sandbox +sandboxes.yaml,/v2/sandboxes/{name},updateSandbox,update_sandbox,patch,,sandboxes,sandboxes,sandboxes,update,update,,Update a sandbox +sandboxes.yaml,/v2/sandboxes/{name},deleteSandbox,delete_sandbox,delete,,sandboxes,sandboxes,sandboxes,delete,delete,,Delete a sandbox +sandboxes.yaml,/v2/sandboxes/sessions/{sessionId}/cmd,listSessionCommands,list_session_commands,get,,sandboxes,sandboxes,commands,list,select,$.commands,List commands +sandboxes.yaml,/v2/sandboxes/sessions/{sessionId}/cmd,runSessionCommand,run_session_command,post,,sandboxes,sandboxes,commands,run,exec,,Execute a command +sandboxes.yaml,/v2/sandboxes/sessions/{sessionId}/cmd/{cmdId},getSessionCommand,get_session_command,get,,sandboxes,sandboxes,commands,get,select,$.command,Get a command +sandboxes.yaml,/v2/sandboxes/sessions/{sessionId}/cmd/{cmdId}/kill,killSessionCommand,kill_session_command,post,,sandboxes,sandboxes,commands,kill,exec,,Kill a command +sandboxes.yaml,/v2/sandboxes/sessions/{sessionId}/cmd/{cmdId}/logs,getSessionCommandLogs,get_session_command_logs,get,,sandboxes,sandboxes,commands,get_logs,exec,,Stream command logs +sandboxes.yaml,/v2/sandboxes/sessions/{sessionId}/stop,stopSession,stop_session,post,,sandboxes,sandboxes,sessions,stop,exec,,Stop a session +sandboxes.yaml,/v2/sandboxes/sessions/{sessionId}/extend-timeout,extendSessionTimeout,extend_session_timeout,post,,sandboxes,sandboxes,sessions,extend_timeout,exec,,Extend session timeout +sandboxes.yaml,/v2/sandboxes/sessions/{sessionId}/network-policy,updateSessionNetworkPolicy,update_session_network_policy,post,,sandboxes,sandboxes,sessions,update_network_policy,exec,,Update network policy +sandboxes.yaml,/v2/sandboxes/sessions/{sessionId}/fs/read,readSessionFile,read_session_file,post,,sandboxes,sandboxes,session_files,read,exec,,Read a file +sandboxes.yaml,/v2/sandboxes/sessions/{sessionId}/fs/mkdir,createSessionDirectory,create_session_directory,post,,sandboxes,sandboxes,session_files,mkdir,exec,,Create a directory +sandboxes.yaml,/v2/sandboxes/sessions/{sessionId}/fs/write,writeSessionFiles,write_session_files,post,,sandboxes,sandboxes,session_files,write,exec,,Write files +sandboxes.yaml,/v2/sandboxes/sessions/{sessionId}/snapshot,createSandboxesSessionsBySessionIdSnapshotV2,create_sandboxes_sessions_by_session_id_snapshot_v2,post,,sandboxes,sandboxes,snapshots,create_v2,exec,,Create a snapshot +sandboxes.yaml,/v2/sandboxes/{name}/fork,createSandboxesByNameForkV2,create_sandboxes_by_name_fork_v2,post,,sandboxes,sandboxes,sandboxes,fork_v2,exec,,Fork a named sandbox +sandboxes.yaml,/v3/sandboxes,createSandboxesV3,create_sandboxes_v3,post,,sandboxes,sandboxes,sandboxes,create_v3,exec,,Create a named sandbox +sandboxes.yaml,/v3/sandboxes/sessions/{sessionId}/snapshot,createSandboxesSessionsBySessionIdSnapshotV3,create_sandboxes_sessions_by_session_id_snapshot_v3,post,,sandboxes,sandboxes,snapshots,create,insert,,Create a snapshot +sandboxes.yaml,/v3/sandboxes/{name}/fork,createSandboxesByNameForkV3,create_sandboxes_by_name_fork_v3,post,,sandboxes,sandboxes,sandboxes,fork,exec,,Fork a named sandbox +sandboxes.yaml,/v4/sandboxes,createSandboxesV4,create_sandboxes_v4,post,,sandboxes,sandboxes,sandboxes,create,insert,,Create a named sandbox +security.yaml,/v1/security/attack-mode,updateAttackChallengeMode,update_attack_challenge_mode,post,,security,security,attack_challenge_mode,update,update,,Update Attack Challenge mode +security.yaml,/v1/security/firewall/config,getSecurityFirewallConfig,get_security_firewall_config,get,,security,security,firewall_config,get,select,,Returns activated WAF config +security.yaml,/v1/security/firewall/config,putFirewallConfig,put_firewall_config,put,,security,security,firewall_config,replace,replace,,Put Firewall Configuration +security.yaml,/v1/security/firewall/config,updateFirewallConfig,update_firewall_config,patch,,security,security,firewall_config,update,update,,Update Firewall Configuration +security.yaml,/v1/security/firewall/config/{configVersion},getFirewallConfig,get_firewall_config,get,,security,security,firewall_config_versions,get,select,,Read Firewall Configuration +security.yaml,/v1/security/firewall/config/{configVersion},deleteSecurityFirewallConfigByConfigVersion,delete_security_firewall_config_by_config_version,delete,,security,security,firewall_config_versions,delete,delete,,Returns activated WAF config +security.yaml,/v1/security/firewall/config/{configVersion}/activate,createSecurityFirewallConfigByConfigVersionActivate,create_security_firewall_config_by_config_version_activate,post,,security,security,firewall_config_versions,activate,exec,,Returns activated WAF config +security.yaml,/v1/security/firewall/attack-status,getActiveAttackStatus,get_active_attack_status,get,,security,security,attack_status,get,select,$.anomalies,Read active attack data +security.yaml,/v1/security/firewall/bypass,getBypassIp,get_bypass_ip,get,,security,security,firewall_bypass,list,select,$.result,Read System Bypass +security.yaml,/v1/security/firewall/bypass,addBypassIp,add_bypass_ip,post,,security,security,firewall_bypass,create,insert,,Create System Bypass Rule +security.yaml,/v1/security/firewall/bypass,removeBypassIp,remove_bypass_ip,delete,,security,security,firewall_bypass,delete,delete,,Remove System Bypass Rule +security.yaml,/v1/security/firewall/events,getSecurityFirewallEvents,get_security_firewall_events,get,,security,security,firewall_events,list,select,,Read Firewall Actions by Project +security.yaml,/v1/security/firewall/config/generate-rule,generateFirewallRule,generate_firewall_rule,post,,security,security,firewall_config,generate_rule,exec,,Generate a firewall rule from natural language +storage.yaml,/storage/stores/{id},getStorageStoresById,get_storage_stores_by_id,get,,storage,storage,stores,get,select,$.store,Get a store +storage.yaml,/storage/stores/blob,createStorageStoresBlob,create_storage_stores_blob,post,,storage,storage,stores,create_blob,insert,,Create a Blob store +storage.yaml,/storage/stores/blob/{id},deleteStorageStoresBlobById,delete_storage_stores_blob_by_id,delete,,storage,storage,stores,delete_blob,delete,,Delete a Blob store +teams.yaml,/v3/teams/{teamId}/members,getTeamMembers,get_team_members,get,,teams,teams,members,list,select,$.members,List team members +teams.yaml,/v2/teams/{teamId}/members,inviteUserToTeam,invite_user_to_team,post,InvitedTeamMember,teams,teams,members,invite,insert,,Invite a user +teams.yaml,/v1/teams/{teamId}/request,requestAccessToTeam,request_access_to_team,post,,teams,teams,access_requests,create,insert,,Request access to a team +teams.yaml,/v1/teams/{teamId}/request/{userId},getTeamAccessRequest,get_team_access_request,get,,teams,teams,access_requests,get,select,,Get access request status +teams.yaml,/v1/teams/{teamId}/members/teams/join,joinTeam,join_team,post,,teams,teams,members,join,exec,,Join a team +teams.yaml,/v1/teams/{teamId}/members/{uid},updateTeamMember,update_team_member,patch,,teams,teams,members,update,update,,Update a Team Member +teams.yaml,/v1/teams/{teamId}/members/{uid},removeTeamMember,remove_team_member,delete,,teams,teams,members,remove,delete,,Remove a Team Member +teams.yaml,/v2/teams/{teamId},getTeam,get_team,get,Team,teams,teams,teams,get,select,,Get a Team +teams.yaml,/v2/teams/{teamId},patchTeam,patch_team,patch,Team,teams,teams,teams,update,update,,Update a Team +teams.yaml,/v2/teams,getTeams,get_teams,get,,teams,teams,teams,list,select,$.teams,List all teams +teams.yaml,/v1/teams,createTeam,create_team,post,,teams,teams,teams,create,insert,,Create a Team +teams.yaml,/v1/teams/{teamId}/dsync-roles,postTeamDsyncRoles,post_team_dsync_roles,post,,teams,teams,teams,update_dsync_roles,exec,,Update Team Directory Sync Role Mappings +teams.yaml,/v1/teams/{teamId},deleteTeam,delete_team,delete,,teams,teams,teams,delete,delete,,Delete a Team +teams.yaml,/v1/teams/{teamId}/invites/{inviteId},deleteTeamInviteCode,delete_team_invite_code,delete,,teams,teams,members,delete_invite,delete,,Delete a Team invite code +teams.yaml,/v1/teams/{teamId}/microfrontends/{groupId},updateMicrofrontendsGroup,update_microfrontends_group,patch,,teams,teams,microfrontend_groups,update,update,,Update a microfrontends group +teams.yaml,/v1/teams/{teamId}/microfrontends/{groupId},deleteMicrofrontendsGroup,delete_microfrontends_group,delete,,teams,teams,microfrontend_groups,delete,delete,,Delete a microfrontends group +user.yaml,/v3/events,listUserEvents,list_user_events,get,,user,user,events,list,select,$.events,List User Events +user.yaml,/v1/events/types,listEventTypes,list_event_types,get,ListEventTypesResponse,user,user,event_types,list,select,$.types,List Event Types +user.yaml,/v2/user,getAuthUser,get_auth_user,get,,user,user,user,get,select,$.user,Get the User +user.yaml,/v1/user,requestDelete,request_delete,delete,,user,user,user,delete,delete,,Delete User Account +vcr.yaml,/v1/vcr/repository,createRepository,create_repository,post,,vcr,vcr,repositories,create,insert,,Create a repository +vcr.yaml,/v1/vcr/repository,listRepositories,list_repositories,get,VcrRepositoryList,vcr,vcr,repositories,list,select,$.repositories,List repositories +vcr.yaml,/v1/vcr/repository/{idOrName},getRepository,get_repository,get,,vcr,vcr,repositories,get,select,$.repository,Get a repository +vcr.yaml,/v1/vcr/repository/{idOrName},deleteRepository,delete_repository,delete,,vcr,vcr,repositories,delete,delete,,Delete a repository +vcr.yaml,/v1/vcr/repository/{idOrName}/images,listRepositoryImages,list_repository_images,get,VcrImageList,vcr,vcr,images,list,select,$.images,List repository images +vcr.yaml,/v1/vcr/repository/{idOrName}/permissions,addRepositoryPermission,add_repository_permission,post,,vcr,vcr,permissions,create,insert,,Add a repository permission +vcr.yaml,/v1/vcr/repository/{idOrName}/permissions,removeRepositoryPermission,remove_repository_permission,delete,,vcr,vcr,permissions,delete,delete,,Remove a repository permission +vcr.yaml,/v1/vcr/repository/{idOrName}/permissions,listRepositoryPermissions,list_repository_permissions,get,VcrRepositoryPermissionList,vcr,vcr,permissions,list,select,$.permissions,List repository permissions +vcr.yaml,/v1/vcr/repository/{idOrName}/permissions/all,clearRepositoryPermissions,clear_repository_permissions,delete,,vcr,vcr,permissions,clear,exec,,Clear all repository permissions +vcr.yaml,/v1/vcr/repository/{idOrName}/tags,listRepositoryTags,list_repository_tags,get,,vcr,vcr,tags,list,select,$.tags,List repository tags +vcr.yaml,/v1/vcr/repository/{idOrName}/tags/{tag},getRepositoryTag,get_repository_tag,get,,vcr,vcr,tags,get,select,$.tag,Get a repository tag +vcr.yaml,/v1/vcr/repository/{idOrName}/images/{imageIdOrDigest},getRepositoryImage,get_repository_image,get,,vcr,vcr,images,get,select,$.image,Get a repository image +vcr.yaml,/v1/vcr/repository/{idOrName}/images/{imageId},deleteRepositoryImage,delete_repository_image,delete,,vcr,vcr,images,delete,delete,,Delete a repository image +vcr.yaml,/v2/,getRoot,get_root,get,,vcr,vcr,skip_this_resource,,,,Check registry API version support +vcr.yaml,/v2/{teamSlug}/{projectSlug}/{repositoryName}/blobs/{digest},getByTeamSlugByProjectSlugByRepositoryNameBlobsByDigest,get_by_team_slug_by_project_slug_by_repository_name_blobs_by_digest,get,,vcr,vcr,skip_this_resource,,,,Download a blob +vcr.yaml,/v2/{teamSlug}/{projectSlug}/{repositoryName}/blobs/{digest},deleteByTeamSlugByProjectSlugByRepositoryNameBlobsByDigest,delete_by_team_slug_by_project_slug_by_repository_name_blobs_by_digest,delete,,vcr,vcr,skip_this_resource,,,,Delete a blob +vcr.yaml,/v2/{teamSlug}/{projectSlug}/{repositoryName}/blobs/uploads/{uuid},getByTeamSlugByProjectSlugByRepositoryNameBlobsUploadsByUuid,get_by_team_slug_by_project_slug_by_repository_name_blobs_uploads_by_uuid,get,,vcr,vcr,skip_this_resource,,,,Get blob upload status +vcr.yaml,/v2/{teamSlug}/{projectSlug}/{repositoryName}/blobs/uploads/{uuid},deleteByTeamSlugByProjectSlugByRepositoryNameBlobsUploadsByUuid,delete_by_team_slug_by_project_slug_by_repository_name_blobs_uploads_by_uuid,delete,,vcr,vcr,skip_this_resource,,,,Cancel a blob upload +vcr.yaml,/v2/{teamSlug}/{projectSlug}/{repositoryName}/blobs/uploads/{uuid},updateByTeamSlugByProjectSlugByRepositoryNameBlobsUploadsByUuid,update_by_team_slug_by_project_slug_by_repository_name_blobs_uploads_by_uuid,patch,,vcr,vcr,skip_this_resource,,,,Upload a blob chunk +vcr.yaml,/v2/{teamSlug}/{projectSlug}/{repositoryName}/blobs/uploads/{uuid},replaceByTeamSlugByProjectSlugByRepositoryNameBlobsUploadsByUuid,replace_by_team_slug_by_project_slug_by_repository_name_blobs_uploads_by_uuid,put,,vcr,vcr,skip_this_resource,,,,Complete a blob upload +vcr.yaml,/v2/{teamSlug}/{projectSlug}/{repositoryName}/blobs/uploads/,createByTeamSlugByProjectSlugByRepositoryNameBlobsUploads,create_by_team_slug_by_project_slug_by_repository_name_blobs_uploads,post,,vcr,vcr,skip_this_resource,,,,Start a blob upload +vcr.yaml,/v2/{teamSlug}/{projectSlug}/{repositoryName}/manifests/{reference},replaceByTeamSlugByProjectSlugByRepositoryNameManifestsByReference,replace_by_team_slug_by_project_slug_by_repository_name_manifests_by_reference,put,,vcr,vcr,skip_this_resource,,,,Push an image manifest +vcr.yaml,/v2/{teamSlug}/{projectSlug}/{repositoryName}/manifests/{reference},getByTeamSlugByProjectSlugByRepositoryNameManifestsByReference,get_by_team_slug_by_project_slug_by_repository_name_manifests_by_reference,get,,vcr,vcr,skip_this_resource,,,,Pull an image manifest +vcr.yaml,/v2/{teamSlug}/{projectSlug}/{repositoryName}/manifests/{reference},deleteByTeamSlugByProjectSlugByRepositoryNameManifestsByReference,delete_by_team_slug_by_project_slug_by_repository_name_manifests_by_reference,delete,,vcr,vcr,skip_this_resource,,,,Delete an image manifest +vcr.yaml,/v2/{teamSlug}/{projectSlug}/{repositoryName}/tags/list,getByTeamSlugByProjectSlugByRepositoryNameTagsList,get_by_team_slug_by_project_slug_by_repository_name_tags_list,get,,vcr,vcr,skip_this_resource,,,,List image tags +webhooks.yaml,/v1/webhooks,createWebhook,create_webhook,post,,webhooks,webhooks,webhooks,create,insert,,Creates a webhook +webhooks.yaml,/v1/webhooks,getWebhooks,get_webhooks,get,,webhooks,webhooks,webhooks,list,select,,Get a list of webhooks +webhooks.yaml,/v1/webhooks/{id},getWebhook,get_webhook,get,,webhooks,webhooks,webhooks,get,select,,Get a webhook +webhooks.yaml,/v1/webhooks/{id},deleteWebhook,delete_webhook,delete,,webhooks,webhooks,webhooks,delete,delete,,Deletes a webhook +web_analytics.yaml,/speed-insights/toggle,createSpeedInsightsToggle,create_speed_insights_toggle,post,,,,speed_insights,toggle,exec,, +web_analytics.yaml,/web/insights/toggle,createWebInsightsToggle,create_web_insights_toggle,post,,,,web_insights,toggle,exec,, +web_analytics.yaml,/v1/query/web-analytics/visits/aggregate,aggregatePageviews,aggregate_pageviews,get,,web-analytics,web_analytics,pageview_aggregates,list,select,$.data,Aggregates page views +web_analytics.yaml,/v1/query/web-analytics/events/aggregate,aggregateEvents,aggregate_events,get,,web-analytics,web_analytics,event_aggregates,list,select,$.data,Aggregates custom events +web_analytics.yaml,/v1/query/web-analytics/visits/count,countPageviews,count_pageviews,get,,web-analytics,web_analytics,pageview_counts,list,select,$.data,Counts page views +web_analytics.yaml,/v1/query/web-analytics/events/count,countEvents,count_events,get,,web-analytics,web_analytics,event_counts,list,select,$.data,Counts custom events diff --git a/provider-dev/config/spec_pin.json b/provider-dev/config/spec_pin.json new file mode 100644 index 0000000..06dff53 --- /dev/null +++ b/provider-dev/config/spec_pin.json @@ -0,0 +1,12 @@ +{ + "source": "https://openapi.vercel.sh/", + "file": "provider-dev/downloaded/openapi.json", + "fetched_at": "2026-09-14", + "openapi": "3.0.3", + "stated_version": "0.0.1", + "paths": 297, + "operations": 417, + "tags": 42, + "sha256": "0343d5d5718ccb17a79c476a219010fdadc0f6a4cb850bc1893093a84b19be77", + "bytes": 10766176 +} diff --git a/provider-dev/docgen/provider-data/headerContent1.txt b/provider-dev/docgen/provider-data/headerContent1.txt index 191d07a..d743508 100644 --- a/provider-dev/docgen/provider-data/headerContent1.txt +++ b/provider-dev/docgen/provider-data/headerContent1.txt @@ -1,19 +1,21 @@ ---- -title: vercel -hide_title: false -hide_table_of_contents: false -keywords: - - vercel - - stackql - - infrastructure-as-code - - configuration-as-data - - cloud inventory -description: Query, deploy, and manage Vercel resources using SQL -custom_edit_url: null -image: /img/stackql-vercel-provider-featured-image.png -id: 'provider-intro' ---- - -import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; - -Cloud platform for serverless deployment and hosting of web applications. \ No newline at end of file +--- +title: vercel +hide_title: false +hide_table_of_contents: false +keywords: + - vercel + - stackql + - infrastructure-as-code + - configuration-as-data + - cloud inventory + - deployments + - edge config +description: Query, deploy and manage Vercel projects, deployments, domains, environment variables, Edge Config, teams and more using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +id: 'provider-intro' +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; + +Query, provision and operate the Vercel platform using SQL - projects, deployments (including uploading files and creating deployments), aliases, domains and DNS records, environment variables, Edge Config stores and items, teams and members, access groups, webhooks, log and trace drains, feature flags, the firewall, AI Gateway, sandboxes, the container registry and billing. The provider is generated from the published Vercel REST API OpenAPI document and covers every REST operation in it. diff --git a/provider-dev/docgen/provider-data/headerContent2.txt b/provider-dev/docgen/provider-data/headerContent2.txt index 29cfdd4..ad41f7c 100644 --- a/provider-dev/docgen/provider-data/headerContent2.txt +++ b/provider-dev/docgen/provider-data/headerContent2.txt @@ -1,42 +1,245 @@ -See also: -[[` SHOW `]](https://stackql.io/docs/language-spec/show) [[` DESCRIBE `]](https://stackql.io/docs/language-spec/describe) [[` REGISTRY `]](https://stackql.io/docs/language-spec/registry) -* * * - -## Installation - -To pull the latest version of the `vercel` provider, run the following command: - -```bash -REGISTRY PULL vercel; -``` -> To view previous provider versions or to pull a specific provider version, see [here](https://stackql.io/docs/language-spec/registry). - -## Authentication - -The following system environment variables are used for authentication by default: - -- - Vercel API Token (see Creating a Vercel API Token) - -These variables are sourced at runtime (from the local machine or as CI variables/secrets). - -
- -Using different environment variables - -To use different environment variables (instead of the defaults), use the `--auth` flag of the `stackql` program. For example: - -```bash - -AUTH='{ "vercel": { "type": "bearer", "credentialsenvvar": "YOUR_VERCEL_API_TOKEN_VAR" }}' -stackql shell --auth="${AUTH}" - -``` -or using PowerShell: - -```powershell - -$Auth = "{ 'vercel': { 'type': 'bearer', 'credentialsenvvar': 'YOUR_VERCEL_API_TOKEN_VAR' }}" -stackql.exe shell --auth=$Auth - -``` -
\ No newline at end of file +See also: +[[` SHOW `]](https://stackql.io/docs/language-spec/show) [[` DESCRIBE `]](https://stackql.io/docs/language-spec/describe) [[` REGISTRY `]](https://stackql.io/docs/language-spec/registry) +* * * + +## Installation + +To pull the latest version of the `vercel` provider, run the following command: + +```bash +REGISTRY PULL vercel; +``` +> To view previous provider versions or to pull a specific provider version, see [here](https://stackql.io/docs/language-spec/registry). + +## Authentication + +The following system environment variable is used for authentication by default: + +- - a Vercel API token (see [Creating an access token](https://vercel.com/docs/rest-api/reference/welcome#creating-an-access-token)); the same variable the Vercel Terraform provider reads + +The variable is sourced at runtime (from the local machine or as a CI variable/secret). Tokens are scoped to the teams you select when creating them; a token created for a Hobby account covers that account's default team. + +
+ +Using a different environment variable + +To use a different environment variable (instead of the default), use the `--auth` flag of the `stackql` program. For example: + +```bash + +AUTH='{ "vercel": { "type": "bearer", "credentialsenvvar": "MY_VERCEL_TOKEN" }}' +stackql shell --auth="${AUTH}" + +``` +or using PowerShell: + +```powershell + +$Auth = "{ 'vercel': { 'type': 'bearer', 'credentialsenvvar': 'MY_VERCEL_TOKEN' }}" +stackql.exe shell --auth=$Auth + +``` +
+ +## Team scope + +Vercel scopes almost every operation to a team through the `teamId` query parameter (`team_id` in SQL). Projects, deployments, domains, Edge Config stores, environment variables and most other resources belong to a team, and listing them without a team returns nothing, so supply the team on every statement: + +```sql +SELECT id, name, framework +FROM vercel.projects.projects +WHERE team_id = 'team_xxxxxxxxxxxxxxxxxxxxxxxx'; +``` + +Find your team ids with: + +```sql +SELECT id, slug, name FROM vercel.teams.teams; +-- or the token's default team +SELECT default_team_id FROM vercel.user.user; +``` + +A handful of resources are user-scoped and take no `team_id`: , (list), and . + +> The Vercel Terraform provider takes the team as a provider argument; keep the id in an environment variable such as for your scripts and pass it into the `WHERE` clause. StackQL does not currently default a query parameter from the environment (that mechanism applies to server URL variables only), so `team_id` is always explicit in SQL. + +## Parameter and column casing + +The Vercel API uses camelCase on the wire (`teamId`, `createdAt`, `buildCommand`). This provider presents a snake_case surface: `WHERE` parameters, `INSERT` and `UPDATE` columns and `EXEC` variables are written in snake_case and resolved to the wire names, and result columns are returned as snake_case (`created_at`, `ready_state`). Nested JSON columns keep their wire casing inside the value; use `json_extract` to reach into them. + +```sql +SELECT uid, url, ready_state, created_at, + json_extract(meta, '$.githubCommitRef') AS branch +FROM vercel.deployments.deployments +WHERE team_id = 'team_xxxxxxxxxxxxxxxxxxxxxxxx'; +``` + +## Pagination and limits + +List operations page automatically until the last page. `LIMIT n` is pushed down as the API's `limit` parameter (capped at 100, the Vercel page size ceiling), so `SELECT ... LIMIT 20` fetches one page. + +## Project inventory + +Every project in a team, with framework and the latest production deployment: + +```sql +SELECT + id, + name, + framework, + node_version, + json_extract(latest_deployments, '$[0].url') AS latest_url, + json_extract(latest_deployments, '$[0].readyState') AS latest_state, + created_at +FROM vercel.projects.projects +WHERE team_id = 'team_xxxxxxxxxxxxxxxxxxxxxxxx'; +``` + +## Deployments by state + +Deployments that failed or were cancelled recently (the list method returns `uid`; the single-deployment method returns `id`): + +```sql +SELECT uid, name, url, ready_state, target, created_at +FROM vercel.deployments.deployments +WHERE team_id = 'team_xxxxxxxxxxxxxxxxxxxxxxxx' +AND ready_state IN ('ERROR', 'CANCELED') +ORDER BY created_at DESC; +``` + +A single deployment by id or hostname: + +```sql +SELECT id, url, ready_state, ready_substate, build_command, output_directory +FROM vercel.deployments.deployments +WHERE id_or_url = 'dpl_xxxxxxxxxxxxxxxxxxxxxxxx' +AND team_id = 'team_xxxxxxxxxxxxxxxxxxxxxxxx'; +``` + +## Environment variable audit + +Every environment variable of a project, its targets and type (values of `encrypted` and `sensitive` variables are not returned): + +```sql +SELECT key, type, target, git_branch, updated_at +FROM vercel.projects.env_vars +WHERE id_or_name = 'my-project' +AND team_id = 'team_xxxxxxxxxxxxxxxxxxxxxxxx'; +``` + +## Domains and DNS + +Domains in the team and their verification state, then the DNS records of one of them: + +```sql +SELECT name, verified, service_type, expires_at, created_at +FROM vercel.domains.domains +WHERE team_id = 'team_xxxxxxxxxxxxxxxxxxxxxxxx'; + +SELECT id, name, type, value, ttl +FROM vercel.dns.records +WHERE domain = 'example.com' +AND team_id = 'team_xxxxxxxxxxxxxxxxxxxxxxxx'; +``` + +## Edge Config items + +```sql +SELECT id, slug, item_count, size_in_bytes, updated_at +FROM vercel.edge_config.edge_configs +WHERE team_id = 'team_xxxxxxxxxxxxxxxxxxxxxxxx'; + +SELECT key, value, updated_at +FROM vercel.edge_config.items +WHERE edge_config_id = 'ecfg_xxxxxxxxxxxxxxxxxxxxxxxxxxxx' +AND team_id = 'team_xxxxxxxxxxxxxxxxxxxxxxxx'; +``` + +## Team members and tokens + +```sql +SELECT uid, email, role, confirmed, created_at +FROM vercel.teams.members +WHERE team_id = 'team_xxxxxxxxxxxxxxxxxxxxxxxx'; + +SELECT id, name, type, created_at, expires_at +FROM vercel.authentication.tokens; +``` + +## Provision, mutate and tear down + +Mutations use the same SQL grammar - `INSERT` creates a resource, `UPDATE` patches it, `EXEC` invokes lifecycle methods and `DELETE` removes it. Request body fields are written as columns in snake_case; JSON values (arrays and objects) are passed as JSON text. + +A project, an environment variable and an Edge Config store end to end: + +```sql +-- create a project +INSERT INTO vercel.projects.projects (team_id, name, framework) +SELECT 'team_xxxxxxxxxxxxxxxxxxxxxxxx', 'my-project', 'nextjs'; + +-- add an environment variable for production and preview +INSERT INTO vercel.projects.env_vars (id_or_name, team_id, key, value, type, target) +SELECT 'my-project', 'team_xxxxxxxxxxxxxxxxxxxxxxxx', 'API_URL', 'https://api.example.com', 'plain', '["production", "preview"]'; + +-- change a project setting +UPDATE vercel.projects.projects +SET build_command = 'npm run build' +WHERE id_or_name = 'my-project' AND team_id = 'team_xxxxxxxxxxxxxxxxxxxxxxxx'; + +-- create an Edge Config store and upsert two items +INSERT INTO vercel.edge_config.edge_configs (team_id, slug) +SELECT 'team_xxxxxxxxxxxxxxxxxxxxxxxx', 'my-config'; + +UPDATE vercel.edge_config.items +SET items = '[{"operation": "upsert", "key": "greeting", "value": "hello"}, {"operation": "upsert", "key": "flags", "value": {"featureA": true}}]' +WHERE edge_config_id = 'ecfg_xxxxxxxxxxxxxxxxxxxxxxxxxxxx' AND team_id = 'team_xxxxxxxxxxxxxxxxxxxxxxxx'; + +-- remove them +DELETE FROM vercel.edge_config.edge_configs +WHERE edge_config_id = 'ecfg_xxxxxxxxxxxxxxxxxxxxxxxxxxxx' AND team_id = 'team_xxxxxxxxxxxxxxxxxxxxxxxx'; + +DELETE FROM vercel.projects.projects +WHERE id_or_name = 'my-project' AND team_id = 'team_xxxxxxxxxxxxxxxxxxxxxxxx'; +``` + +## Deploy a static site + +A deployment is two steps: upload each file by its SHA1 digest with the `files.upload` method (the file contents go in the `value` variable and are sent as the raw request body), then create the deployment referencing the uploaded digests. A project that is not linked to a framework needs `project_settings`. + +```sql +-- 1. upload index.html (sha1 of the exact bytes, size in bytes) +EXEC vercel.deployments.files.upload + @team_id = 'team_xxxxxxxxxxxxxxxxxxxxxxxx', + @x_vercel_digest = 'fbda2260a7c9bf8a993343caa2238cf17402918c', + @value = 'Hello

Hello World from StackQL

'; + +-- 2. create a production deployment from the uploaded file +INSERT INTO vercel.deployments.deployments (team_id, name, project, files, target, project_settings) +SELECT 'team_xxxxxxxxxxxxxxxxxxxxxxxx', 'my-project', 'my-project', + '[{"file": "index.html", "sha": "fbda2260a7c9bf8a993343caa2238cf17402918c", "size": 115}]', + 'production', '{"framework": null}'; + +-- 3. watch it become READY (the production alias is https://my-project.vercel.app) +SELECT uid, url, ready_state +FROM vercel.deployments.deployments +WHERE team_id = 'team_xxxxxxxxxxxxxxxxxxxxxxxx' AND project_id = 'prj_xxxxxxxxxxxxxxxxxxxxxxxx'; +``` + +Lifecycle operations are invoked with `EXEC`: + +```sql +-- cancel a running build +EXEC vercel.deployments.deployments.cancel + @id = 'dpl_xxxxxxxxxxxxxxxxxxxxxxxx', @team_id = 'team_xxxxxxxxxxxxxxxxxxxxxxxx'; + +-- promote a deployment to production, or roll back to one +EXEC vercel.projects.projects.promote + @project_id = 'prj_xxxxxxxxxxxxxxxxxxxxxxxx', @deployment_id = 'dpl_xxxxxxxxxxxxxxxxxxxxxxxx', @team_id = 'team_xxxxxxxxxxxxxxxxxxxxxxxx'; + +EXEC vercel.projects.projects.rollback + @project_id = 'prj_xxxxxxxxxxxxxxxxxxxxxxxx', @deployment_id = 'dpl_xxxxxxxxxxxxxxxxxxxxxxxx', @team_id = 'team_xxxxxxxxxxxxxxxxxxxxxxxx'; + +-- pause and unpause a project (needs an active production deployment) +EXEC vercel.projects.projects.pause @project_id = 'prj_xxxxxxxxxxxxxxxxxxxxxxxx', @team_id = 'team_xxxxxxxxxxxxxxxxxxxxxxxx'; +EXEC vercel.projects.projects.unpause @project_id = 'prj_xxxxxxxxxxxxxxxxxxxxxxxx', @team_id = 'team_xxxxxxxxxxxxxxxxxxxxxxxx'; +``` diff --git a/provider-dev/openapi/src/vercel/v00.00.00000/provider.yaml b/provider-dev/openapi/src/vercel/v00.00.00000/provider.yaml index 0211e87..5a3a694 100644 --- a/provider-dev/openapi/src/vercel/v00.00.00000/provider.yaml +++ b/provider-dev/openapi/src/vercel/v00.00.00000/provider.yaml @@ -2,178 +2,350 @@ id: vercel name: vercel version: v00.00.00000 providerServices: + access_groups: + id: access_groups:v00.00.00000 + name: access_groups + preferred: true + service: + $ref: vercel/v00.00.00000/services/access_groups.yaml + title: access_groups API + version: v00.00.00000 + description: vercel access_groups API + ai_gateway: + id: ai_gateway:v00.00.00000 + name: ai_gateway + preferred: true + service: + $ref: vercel/v00.00.00000/services/ai_gateway.yaml + title: ai_gateway API + version: v00.00.00000 + description: vercel ai_gateway API aliases: - id: 'aliases:v00.00.00000' + id: aliases:v00.00.00000 name: aliases preferred: true service: $ref: vercel/v00.00.00000/services/aliases.yaml - title: Vercel API - Aliases + title: aliases API version: v00.00.00000 - description: Aliases + description: vercel aliases API artifacts: - id: 'artifacts:v00.00.00000' + id: artifacts:v00.00.00000 name: artifacts preferred: true service: $ref: vercel/v00.00.00000/services/artifacts.yaml - title: Vercel API - Artifacts + title: artifacts API version: v00.00.00000 - description: Artifacts + description: vercel artifacts API authentication: - id: 'authentication:v00.00.00000' + id: authentication:v00.00.00000 name: authentication preferred: true service: $ref: vercel/v00.00.00000/services/authentication.yaml - title: Vercel API - Authentication + title: authentication API version: v00.00.00000 - description: Authentication - billing_settings: - id: 'billing_settings:v00.00.00000' - name: billing_settings + description: vercel authentication API + billing: + id: billing:v00.00.00000 + name: billing preferred: true service: - $ref: vercel/v00.00.00000/services/billing_settings.yaml - title: Vercel API - Billing Settings + $ref: vercel/v00.00.00000/services/billing.yaml + title: billing API version: v00.00.00000 - description: Billing Settings - cache: - id: 'cache:v00.00.00000' - name: cache + description: vercel billing API + bulk_redirects: + id: bulk_redirects:v00.00.00000 + name: bulk_redirects preferred: true service: - $ref: vercel/v00.00.00000/services/cache.yaml - title: Vercel API - Cache + $ref: vercel/v00.00.00000/services/bulk_redirects.yaml + title: bulk_redirects API version: v00.00.00000 - description: Cache + description: vercel bulk_redirects API certs: - id: 'certs:v00.00.00000' + id: certs:v00.00.00000 name: certs preferred: true service: $ref: vercel/v00.00.00000/services/certs.yaml - title: Vercel API - Certs + title: certs API version: v00.00.00000 - description: Certs + description: vercel certs API checks: - id: 'checks:v00.00.00000' + id: checks:v00.00.00000 name: checks preferred: true service: $ref: vercel/v00.00.00000/services/checks.yaml - title: Vercel API - Checks + title: checks API + version: v00.00.00000 + description: vercel checks API + connect: + id: connect:v00.00.00000 + name: connect + preferred: true + service: + $ref: vercel/v00.00.00000/services/connect.yaml + title: connect API version: v00.00.00000 - description: Checks + description: vercel connect API deployments: - id: 'deployments:v00.00.00000' + id: deployments:v00.00.00000 name: deployments preferred: true service: $ref: vercel/v00.00.00000/services/deployments.yaml - title: Vercel API - Deployments + title: deployments API version: v00.00.00000 - description: Deployments + description: vercel deployments API dns: - id: 'dns:v00.00.00000' + id: dns:v00.00.00000 name: dns preferred: true service: $ref: vercel/v00.00.00000/services/dns.yaml - title: Vercel API - Dns + title: dns API version: v00.00.00000 - description: Dns + description: vercel dns API domains: - id: 'domains:v00.00.00000' + id: domains:v00.00.00000 name: domains preferred: true service: $ref: vercel/v00.00.00000/services/domains.yaml - title: Vercel API - Domains + title: domains API + version: v00.00.00000 + description: vercel domains API + domains_registrar: + id: domains_registrar:v00.00.00000 + name: domains_registrar + preferred: true + service: + $ref: vercel/v00.00.00000/services/domains_registrar.yaml + title: domains_registrar API + version: v00.00.00000 + description: vercel domains_registrar API + drains: + id: drains:v00.00.00000 + name: drains + preferred: true + service: + $ref: vercel/v00.00.00000/services/drains.yaml + title: drains API + version: v00.00.00000 + description: vercel drains API + edge_cache: + id: edge_cache:v00.00.00000 + name: edge_cache + preferred: true + service: + $ref: vercel/v00.00.00000/services/edge_cache.yaml + title: edge_cache API version: v00.00.00000 - description: Domains + description: vercel edge_cache API edge_config: - id: 'edge_config:v00.00.00000' + id: edge_config:v00.00.00000 name: edge_config preferred: true service: $ref: vercel/v00.00.00000/services/edge_config.yaml - title: Vercel API - Edge Config + title: edge_config API + version: v00.00.00000 + description: vercel edge_config API + environments: + id: environments:v00.00.00000 + name: environments + preferred: true + service: + $ref: vercel/v00.00.00000/services/environments.yaml + title: environments API + version: v00.00.00000 + description: vercel environments API + feature_flags: + id: feature_flags:v00.00.00000 + name: feature_flags + preferred: true + service: + $ref: vercel/v00.00.00000/services/feature_flags.yaml + title: feature_flags API version: v00.00.00000 - description: Edge-Config + description: vercel feature_flags API integrations: - id: 'integrations:v00.00.00000' + id: integrations:v00.00.00000 name: integrations preferred: true service: $ref: vercel/v00.00.00000/services/integrations.yaml - title: Vercel API - Integrations + title: integrations API version: v00.00.00000 - description: Integrations + description: vercel integrations API + kms: + id: kms:v00.00.00000 + name: kms + preferred: true + service: + $ref: vercel/v00.00.00000/services/kms.yaml + title: kms API + version: v00.00.00000 + description: vercel kms API log_drains: - id: 'log_drains:v00.00.00000' + id: log_drains:v00.00.00000 name: log_drains preferred: true service: $ref: vercel/v00.00.00000/services/log_drains.yaml - title: Vercel API - Log Drains + title: log_drains API version: v00.00.00000 - description: LogDrains - projects: - id: 'projects:v00.00.00000' - name: projects + description: vercel log_drains API + marketplace: + id: marketplace:v00.00.00000 + name: marketplace preferred: true service: - $ref: vercel/v00.00.00000/services/projects.yaml - title: Vercel API - Projects + $ref: vercel/v00.00.00000/services/marketplace.yaml + title: marketplace API version: v00.00.00000 - description: Projects + description: vercel marketplace API + microfrontends: + id: microfrontends:v00.00.00000 + name: microfrontends + preferred: true + service: + $ref: vercel/v00.00.00000/services/microfrontends.yaml + title: microfrontends API + version: v00.00.00000 + description: vercel microfrontends API + networking: + id: networking:v00.00.00000 + name: networking + preferred: true + service: + $ref: vercel/v00.00.00000/services/networking.yaml + title: networking API + version: v00.00.00000 + description: vercel networking API + observability: + id: observability:v00.00.00000 + name: observability + preferred: true + service: + $ref: vercel/v00.00.00000/services/observability.yaml + title: observability API + version: v00.00.00000 + description: vercel observability API project_members: - id: 'project_members:v00.00.00000' + id: project_members:v00.00.00000 name: project_members preferred: true service: $ref: vercel/v00.00.00000/services/project_members.yaml - title: Vercel API - Project Members + title: project_members API + version: v00.00.00000 + description: vercel project_members API + project_routes: + id: project_routes:v00.00.00000 + name: project_routes + preferred: true + service: + $ref: vercel/v00.00.00000/services/project_routes.yaml + title: project_routes API + version: v00.00.00000 + description: vercel project_routes API + projects: + id: projects:v00.00.00000 + name: projects + preferred: true + service: + $ref: vercel/v00.00.00000/services/projects.yaml + title: projects API version: v00.00.00000 - description: ProjectMembers - secrets: - id: 'secrets:v00.00.00000' - name: secrets + description: vercel projects API + rolling_release: + id: rolling_release:v00.00.00000 + name: rolling_release preferred: true service: - $ref: vercel/v00.00.00000/services/secrets.yaml - title: Vercel API - Secrets + $ref: vercel/v00.00.00000/services/rolling_release.yaml + title: rolling_release API version: v00.00.00000 - description: Secrets + description: vercel rolling_release API + sandboxes: + id: sandboxes:v00.00.00000 + name: sandboxes + preferred: true + service: + $ref: vercel/v00.00.00000/services/sandboxes.yaml + title: sandboxes API + version: v00.00.00000 + description: vercel sandboxes API + security: + id: security:v00.00.00000 + name: security + preferred: true + service: + $ref: vercel/v00.00.00000/services/security.yaml + title: security API + version: v00.00.00000 + description: vercel security API + storage: + id: storage:v00.00.00000 + name: storage + preferred: true + service: + $ref: vercel/v00.00.00000/services/storage.yaml + title: storage API + version: v00.00.00000 + description: vercel storage API teams: - id: 'teams:v00.00.00000' + id: teams:v00.00.00000 name: teams preferred: true service: $ref: vercel/v00.00.00000/services/teams.yaml - title: Vercel API - Teams + title: teams API version: v00.00.00000 - description: Teams + description: vercel teams API user: - id: 'user:v00.00.00000' + id: user:v00.00.00000 name: user preferred: true service: $ref: vercel/v00.00.00000/services/user.yaml - title: Vercel API - User + title: user API + version: v00.00.00000 + description: vercel user API + vcr: + id: vcr:v00.00.00000 + name: vcr + preferred: true + service: + $ref: vercel/v00.00.00000/services/vcr.yaml + title: vcr API + version: v00.00.00000 + description: vercel vcr API + web_analytics: + id: web_analytics:v00.00.00000 + name: web_analytics + preferred: true + service: + $ref: vercel/v00.00.00000/services/web_analytics.yaml + title: web_analytics API version: v00.00.00000 - description: User + description: vercel web_analytics API webhooks: - id: 'webhooks:v00.00.00000' + id: webhooks:v00.00.00000 name: webhooks preferred: true service: $ref: vercel/v00.00.00000/services/webhooks.yaml - title: Vercel API - Webhooks + title: webhooks API version: v00.00.00000 - description: Webhooks + description: vercel webhooks API config: auth: type: bearer credentialsenvvar: VERCEL_API_TOKEN + snake_case_aliases: true diff --git a/provider-dev/openapi/src/vercel/v00.00.00000/services/access_groups.yaml b/provider-dev/openapi/src/vercel/v00.00.00000/services/access_groups.yaml new file mode 100644 index 0000000..c867382 --- /dev/null +++ b/provider-dev/openapi/src/vercel/v00.00.00000/services/access_groups.yaml @@ -0,0 +1,1389 @@ +openapi: 3.0.3 +info: + title: access_groups API + description: vercel access_groups API + version: 0.0.1 +paths: + /v1/access-groups/{id_or_name}: + get: + description: Allows to read an access group + operationId: readAccessGroup + security: + - bearerToken: [] + summary: Reads an access group + tags: + - access-groups + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + teamPermissions: + items: + type: string + enum: + - AiGatewayApiKeyOwnedBySelf + - AiGatewayBudgetManager + - AiGatewayCredits + - AiGatewaySettings + - AiGatewayTranscriptsManager + - AiGatewayTranscriptsViewer + - ConnectorManager + - CreateProject + - EnvVariableManager + - EnvironmentManager + - FullProductionDeployment + - IntegrationManager + - OrgAdmin + - OrgViewer + - UsageViewer + - V0Builder + - V0Chatter + - V0Viewer + - WorkflowDecryptor + type: array + entitlements: + items: + type: string + enum: + - v0 + type: array + isDsyncManaged: + type: boolean + enum: + - false + - true + name: + type: string + description: The name of this access group. + example: my-access-group + createdAt: + type: string + description: Timestamp in milliseconds when the access group was created. + example: 1588720733602 + teamId: + type: string + description: ID of the team that this access group belongs to. + example: team_123a6c5209bc3778245d011443644c8d27dc2c50 + updatedAt: + type: string + description: Timestamp in milliseconds when the access group was last updated. + example: 1588720733602 + accessGroupId: + type: string + description: ID of the access group. + example: ag_123a6c5209bc3778245d011443644c8d27dc2c50 + membersCount: + type: number + description: Number of members in the access group. + example: 5 + projectsCount: + type: number + description: Number of projects in the access group. + example: 2 + teamRoles: + items: + type: string + type: array + description: Roles that the team has in the access group. + example: + - DEVELOPER + - BILLING + required: + - accessGroupId + - createdAt + - isDsyncManaged + - membersCount + - name + - projectsCount + - teamId + - updatedAt + type: object + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '410': + description: '' + x-vercel-cli: + supportedSubcommands: true + supportedProduction: false + aliases: + - read + - get + parameters: + - name: id_or_name + in: path + required: true + schema: + type: string + x-vercel-cli: + kind: argument + examples: + id: + summary: Access group ID + value: ag_1a2b3c4d5e6f7g8h9i0j + name: + summary: Access group name + value: My Access Group + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + post: + description: Allows to update an access group metadata + operationId: updateAccessGroup + security: + - bearerToken: [] + summary: Update an access group + tags: + - access-groups + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + entitlements: + items: + type: string + enum: + - v0 + type: array + name: + type: string + description: The name of this access group. + example: my-access-group + createdAt: + type: string + description: Timestamp in milliseconds when the access group was created. + example: 1588720733602 + teamId: + type: string + description: ID of the team that this access group belongs to. + example: team_123a6c5209bc3778245d011443644c8d27dc2c50 + updatedAt: + type: string + description: Timestamp in milliseconds when the access group was last updated. + example: 1588720733602 + accessGroupId: + type: string + description: ID of the access group. + example: ag_123a6c5209bc3778245d011443644c8d27dc2c50 + membersCount: + type: number + description: Number of members in the access group. + example: 5 + projectsCount: + type: number + description: Number of projects in the access group. + example: 2 + teamRoles: + items: + type: string + type: array + description: Roles that the team has in the access group. + example: + - DEVELOPER + - BILLING + teamPermissions: + items: + type: string + type: array + description: Permissions that the team has in the access group. + example: + - CreateProject + required: + - accessGroupId + - createdAt + - entitlements + - membersCount + - name + - projectsCount + - teamId + - updatedAt + type: object + '400': + description: |- + One of the provided values in the request body is invalid. + One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '410': + description: '' + parameters: + - name: id_or_name + in: path + required: true + schema: + type: string + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + requestBody: + content: + application/json: + schema: + type: object + additionalProperties: false + properties: + name: + type: string + description: The name of the access group + maxLength: 50 + pattern: ^[A-z0-9_ -]+$ + example: My access group + projects: + type: array + items: + type: object + additionalProperties: false + required: + - role + - projectId + properties: + projectId: + type: string + maxLength: 256 + example: prj_ndlgr43fadlPyCtREAqxxdyFK + description: The ID of the project. + role: + type: string + example: ADMIN + description: The project role that will be added to this Access Group. "null" will remove this project level role. + nullable: true + enum: + - ADMIN + - PROJECT_VIEWER + - PROJECT_DEVELOPER + - null + membersToAdd: + description: List of members to add to the access group. + type: array + items: + type: string + example: + - usr_1a2b3c4d5e6f7g8h9i0j + - usr_2b3c4d5e6f7g8h9i0j1k + membersToRemove: + description: List of members to remove from the access group. + type: array + items: + type: string + example: + - usr_1a2b3c4d5e6f7g8h9i0j + - usr_2b3c4d5e6f7g8h9i0j1k + required: true + delete: + description: Allows to delete an access group + operationId: deleteAccessGroup + security: + - bearerToken: [] + summary: Deletes an access group + tags: + - access-groups + responses: + '200': + description: '' + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '410': + description: '' + parameters: + - name: id_or_name + in: path + required: true + schema: + type: string + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + /v1/access-groups/{id_or_name}/members: + get: + description: List members of an access group + operationId: listAccessGroupMembers + security: + - bearerToken: [] + summary: List members of an access group + tags: + - access-groups + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + members: + items: + properties: + avatar: + type: string + email: + type: string + uid: + type: string + username: + type: string + name: + type: string + createdAt: + type: string + teamRole: + type: string + enum: + - BILLING + - CONTRIBUTOR + - DEVELOPER + - MEMBER + - OWNER + - SECURITY + - VIEWER + - VIEWER_FOR_PLUS + required: + - email + - teamRole + - uid + - username + type: object + type: array + pagination: + properties: + count: + type: number + next: + nullable: true + type: string + required: + - count + - next + type: object + required: + - members + - pagination + type: object + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '410': + description: '' + parameters: + - name: id_or_name + description: The ID or name of the Access Group. + in: path + required: true + schema: + type: string + description: The ID or name of the Access Group. + example: ag_pavWOn1iLObbXLRiwVvzmPrTWyTf + - name: limit + description: Limit how many access group members should be returned. + in: query + required: false + schema: + description: Limit how many access group members should be returned. + example: 20 + type: integer + minimum: 1 + maximum: 100 + - name: next + description: Continuation cursor to retrieve the next page of results. + in: query + required: false + schema: + description: Continuation cursor to retrieve the next page of results. + type: string + - name: search + description: Search project members by their name, username, and email. + in: query + required: false + schema: + description: Search project members by their name, username, and email. + type: string + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + /v1/access-groups: + get: + description: List access groups + operationId: listAccessGroups + security: + - bearerToken: [] + summary: List access groups for a team, project or member + tags: + - access-groups + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + accessGroups: + items: + properties: + members: + items: + type: string + type: array + projects: + items: + type: string + type: array + entitlements: + items: + type: string + type: array + teamPermissions: + items: + type: string + type: array + isDsyncManaged: + type: boolean + enum: + - false + - true + name: + type: string + description: The name of this access group. + example: my-access-group + createdAt: + type: string + description: Timestamp in milliseconds when the access group was created. + example: 1588720733602 + teamId: + type: string + description: ID of the team that this access group belongs to. + example: team_123a6c5209bc3778245d011443644c8d27dc2c50 + updatedAt: + type: string + description: Timestamp in milliseconds when the access group was last updated. + example: 1588720733602 + accessGroupId: + type: string + description: ID of the access group. + example: ag_123a6c5209bc3778245d011443644c8d27dc2c50 + membersCount: + type: number + description: Number of members in the access group. + example: 5 + projectsCount: + type: number + description: Number of projects in the access group. + example: 2 + teamRoles: + items: + type: string + type: array + description: Roles that the team has in the access group. + example: + - DEVELOPER + - BILLING + required: + - accessGroupId + - createdAt + - isDsyncManaged + - membersCount + - name + - projectsCount + - teamId + - updatedAt + type: object + type: array + pagination: + properties: + count: + type: number + next: + nullable: true + type: string + required: + - count + - next + type: object + required: + - accessGroups + - pagination + type: object + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '410': + description: '' + x-vercel-cli: + supportedSubcommands: true + supportedProduction: false + aliases: + - list + parameters: + - name: projectId + description: Filter access groups by project. + in: query + schema: + description: Filter access groups by project. + example: prj_pavWOn1iLObbx3RowVvzmPrTWyTf + type: string + - name: search + description: Search for access groups by name. + in: query + schema: + description: Search for access groups by name. + example: example + type: string + - name: membersLimit + description: Number of members to include in the response. + in: query + schema: + description: Number of members to include in the response. + example: 20 + type: integer + minimum: 1 + maximum: 100 + - name: projectsLimit + description: Number of projects to include in the response. + in: query + schema: + description: Number of projects to include in the response. + example: 20 + type: integer + minimum: 1 + maximum: 100 + - name: limit + description: Limit how many access group should be returned. + in: query + schema: + description: Limit how many access group should be returned. + example: 20 + type: integer + minimum: 1 + maximum: 100 + - name: next + description: Continuation cursor to retrieve the next page of results. + in: query + schema: + description: Continuation cursor to retrieve the next page of results. + type: string + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + post: + description: Allows to create an access group + operationId: createAccessGroup + security: + - bearerToken: [] + summary: Creates an access group + tags: + - access-groups + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + entitlements: + items: + type: string + enum: + - v0 + type: array + membersCount: + type: number + projectsCount: + type: number + name: + type: string + description: The name of this access group. + example: my-access-group + createdAt: + type: string + description: Timestamp in milliseconds when the access group was created. + example: 1588720733602 + teamId: + type: string + description: ID of the team that this access group belongs to. + example: team_123a6c5209bc3778245d011443644c8d27dc2c50 + updatedAt: + type: string + description: Timestamp in milliseconds when the access group was last updated. + example: 1588720733602 + accessGroupId: + type: string + description: ID of the access group. + example: ag_123a6c5209bc3778245d011443644c8d27dc2c50 + teamRoles: + items: + type: string + type: array + description: Roles that the team has in the access group. + example: + - DEVELOPER + - BILLING + teamPermissions: + items: + type: string + type: array + description: Permissions that the team has in the access group. + example: + - CreateProject + required: + - accessGroupId + - createdAt + - entitlements + - membersCount + - name + - projectsCount + - teamId + - updatedAt + type: object + '400': + description: One of the provided values in the request body is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '410': + description: '' + parameters: + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + requestBody: + content: + application/json: + schema: + type: object + additionalProperties: false + required: + - name + properties: + name: + type: string + description: The name of the access group + maxLength: 50 + pattern: ^[A-z0-9_ -]+$ + example: My access group + projects: + type: array + items: + type: object + additionalProperties: false + required: + - role + - projectId + properties: + projectId: + type: string + maxLength: 256 + example: prj_ndlgr43fadlPyCtREAqxxdyFK + description: The ID of the project. + role: + type: string + example: ADMIN + description: The project role that will be added to this Access Group. "null" will remove this project level role. + nullable: true + enum: + - ADMIN + - PROJECT_VIEWER + - PROJECT_DEVELOPER + - null + membersToAdd: + description: List of members to add to the access group. + type: array + items: + type: string + example: + - usr_1a2b3c4d5e6f7g8h9i0j + - usr_2b3c4d5e6f7g8h9i0j1k + required: true + /v1/access-groups/{id_or_name}/projects: + get: + description: List projects of an access group + operationId: listAccessGroupProjects + security: + - bearerToken: [] + summary: List projects of an access group + tags: + - access-groups + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + projects: + items: + properties: + projectId: + type: string + role: + type: string + enum: + - ADMIN + - PROJECT_DEVELOPER + - PROJECT_GUEST + - PROJECT_VIEWER + createdAt: + type: string + updatedAt: + type: string + project: + properties: + name: + type: string + framework: + nullable: true + type: string + latestDeploymentId: + type: string + type: object + required: + - createdAt + - project + - projectId + - role + - updatedAt + type: object + type: array + pagination: + properties: + count: + type: number + next: + nullable: true + type: string + required: + - count + - next + type: object + required: + - pagination + - projects + type: object + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '410': + description: '' + parameters: + - name: id_or_name + description: The ID or name of the Access Group. + in: path + required: true + schema: + type: string + description: The ID or name of the Access Group. + example: ag_pavWOn1iLObbXLRiwVvzmPrTWyTf + - name: limit + description: Limit how many access group projects should be returned. + in: query + required: false + schema: + description: Limit how many access group projects should be returned. + example: 20 + type: integer + minimum: 1 + maximum: 100 + - name: next + description: Continuation cursor to retrieve the next page of results. + in: query + required: false + schema: + description: Continuation cursor to retrieve the next page of results. + type: string + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + /v1/access-groups/{access_group_id_or_name}/projects: + post: + description: Allows creation of an access group project + operationId: createAccessGroupProject + security: + - bearerToken: [] + summary: Create an access group project + tags: + - access-groups + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + teamId: + type: string + accessGroupId: + type: string + projectId: + type: string + role: + type: string + enum: + - ADMIN + - PROJECT_DEVELOPER + - PROJECT_GUEST + - PROJECT_VIEWER + createdAt: + type: string + updatedAt: + type: string + required: + - accessGroupId + - createdAt + - projectId + - role + - teamId + - updatedAt + type: object + '400': + description: |- + One of the provided values in the request body is invalid. + One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '410': + description: '' + parameters: + - name: access_group_id_or_name + in: path + required: true + schema: + type: string + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + requestBody: + content: + application/json: + schema: + type: object + additionalProperties: false + required: + - role + - projectId + properties: + projectId: + type: string + maxLength: 256 + example: prj_ndlgr43fadlPyCtREAqxxdyFK + description: The ID of the project. + role: + type: string + example: ADMIN + description: The project role that will be added to this Access Group. + enum: + - ADMIN + - PROJECT_VIEWER + - PROJECT_DEVELOPER + required: true + /v1/access-groups/{access_group_id_or_name}/projects/{project_id}: + get: + description: Allows reading an access group project + operationId: readAccessGroupProject + security: + - bearerToken: [] + summary: Reads an access group project + tags: + - access-groups + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + teamId: + type: string + accessGroupId: + type: string + projectId: + type: string + role: + type: string + enum: + - ADMIN + - PROJECT_DEVELOPER + - PROJECT_GUEST + - PROJECT_VIEWER + createdAt: + type: string + updatedAt: + type: string + required: + - accessGroupId + - createdAt + - projectId + - role + - teamId + - updatedAt + type: object + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '410': + description: '' + parameters: + - name: access_group_id_or_name + in: path + required: true + schema: + type: string + examples: + id: + summary: Access group ID + value: ag_1a2b3c4d5e6f7g8h9i0j + name: + summary: Access group name + value: My Access Group + - name: project_id + in: path + required: true + schema: + type: string + example: prj_ndlgr43fadlPyCtREAqxxdyFK + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + patch: + description: Allows update of an access group project + operationId: updateAccessGroupProject + security: + - bearerToken: [] + summary: Update an access group project + tags: + - access-groups + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + teamId: + type: string + accessGroupId: + type: string + projectId: + type: string + role: + type: string + enum: + - ADMIN + - PROJECT_DEVELOPER + - PROJECT_GUEST + - PROJECT_VIEWER + createdAt: + type: string + updatedAt: + type: string + required: + - accessGroupId + - createdAt + - projectId + - role + - teamId + - updatedAt + type: object + '400': + description: |- + One of the provided values in the request body is invalid. + One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '410': + description: '' + parameters: + - name: access_group_id_or_name + in: path + required: true + schema: + type: string + examples: + id: + summary: Access group ID + value: ag_1a2b3c4d5e6f7g8h9i0j + name: + summary: Access group name + value: My Access Group + - name: project_id + in: path + required: true + schema: + type: string + example: prj_ndlgr43fadlPyCtREAqxxdyFK + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + requestBody: + content: + application/json: + schema: + type: object + additionalProperties: false + required: + - role + properties: + role: + type: string + example: ADMIN + description: The project role that will be added to this Access Group. + enum: + - ADMIN + - PROJECT_VIEWER + - PROJECT_DEVELOPER + - null + required: true + delete: + description: Allows deletion of an access group project + operationId: deleteAccessGroupProject + security: + - bearerToken: [] + summary: Delete an access group project + tags: + - access-groups + responses: + '200': + description: '' + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '410': + description: '' + parameters: + - name: access_group_id_or_name + in: path + required: true + schema: + type: string + examples: + id: + summary: Access group ID + value: ag_1a2b3c4d5e6f7g8h9i0j + name: + summary: Access group name + value: My Access Group + - name: project_id + in: path + required: true + schema: + type: string + example: prj_ndlgr43fadlPyCtREAqxxdyFK + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug +components: + x-stackQL-resources: + access_groups: + id: vercel.access_groups.access_groups + name: access_groups + title: Access Groups + methods: + get: + operation: + $ref: '#/paths/~1v1~1access-groups~1{id_or_name}/get' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + update: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v1~1access-groups~1{id_or_name}/post' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + delete: + operation: + $ref: '#/paths/~1v1~1access-groups~1{id_or_name}/delete' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + list: + operation: + $ref: '#/paths/~1v1~1access-groups/get' + response: + mediaType: application/json + openAPIDocKey: '200' + objectKey: $.accessGroups + request: + nativeCasing: camel + config: + pagination: + requestToken: + key: next + location: query + responseToken: + key: $.pagination.next + location: body + queryParamPushdown: + top: + paramName: limit + maxValue: 100 + create: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v1~1access-groups/post' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/access_groups/methods/get' + - $ref: '#/components/x-stackQL-resources/access_groups/methods/list' + insert: + - $ref: '#/components/x-stackQL-resources/access_groups/methods/create' + update: + - $ref: '#/components/x-stackQL-resources/access_groups/methods/update' + delete: + - $ref: '#/components/x-stackQL-resources/access_groups/methods/delete' + replace: [] + access_group_members: + id: vercel.access_groups.access_group_members + name: access_group_members + title: Access Group Members + methods: + list: + operation: + $ref: '#/paths/~1v1~1access-groups~1{id_or_name}~1members/get' + response: + mediaType: application/json + openAPIDocKey: '200' + objectKey: $.members + request: + nativeCasing: camel + config: + pagination: + requestToken: + key: next + location: query + responseToken: + key: $.pagination.next + location: body + queryParamPushdown: + top: + paramName: limit + maxValue: 100 + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/access_group_members/methods/list' + insert: [] + update: [] + delete: [] + replace: [] + access_group_projects: + id: vercel.access_groups.access_group_projects + name: access_group_projects + title: Access Group Projects + methods: + list: + operation: + $ref: '#/paths/~1v1~1access-groups~1{id_or_name}~1projects/get' + response: + mediaType: application/json + openAPIDocKey: '200' + objectKey: $.projects + request: + nativeCasing: camel + config: + pagination: + requestToken: + key: next + location: query + responseToken: + key: $.pagination.next + location: body + queryParamPushdown: + top: + paramName: limit + maxValue: 100 + create: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v1~1access-groups~1{access_group_id_or_name}~1projects/post' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + get: + operation: + $ref: '#/paths/~1v1~1access-groups~1{access_group_id_or_name}~1projects~1{project_id}/get' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + update: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v1~1access-groups~1{access_group_id_or_name}~1projects~1{project_id}/patch' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + delete: + operation: + $ref: '#/paths/~1v1~1access-groups~1{access_group_id_or_name}~1projects~1{project_id}/delete' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/access_group_projects/methods/get' + - $ref: '#/components/x-stackQL-resources/access_group_projects/methods/list' + insert: + - $ref: '#/components/x-stackQL-resources/access_group_projects/methods/create' + update: + - $ref: '#/components/x-stackQL-resources/access_group_projects/methods/update' + delete: + - $ref: '#/components/x-stackQL-resources/access_group_projects/methods/delete' + replace: [] +servers: + - url: https://api.vercel.com diff --git a/provider-dev/openapi/src/vercel/v00.00.00000/services/ai_gateway.yaml b/provider-dev/openapi/src/vercel/v00.00.00000/services/ai_gateway.yaml new file mode 100644 index 0000000..d3356a6 --- /dev/null +++ b/provider-dev/openapi/src/vercel/v00.00.00000/services/ai_gateway.yaml @@ -0,0 +1,1244 @@ +openapi: 3.0.3 +info: + title: ai_gateway API + description: vercel ai_gateway API + version: 0.0.1 +paths: + /v1/ai-gateway/virtual-model-configs: + post: + description: Create a virtual model config (VMC) + operationId: createAiGatewayVirtualModelConfig + security: + - bearerToken: [] + summary: Create virtual model config + tags: + - api-ai-gateway + responses: + '201': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/AiGatewayVirtualModelConfig' + '400': + description: '' + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '409': + description: '' + '410': + description: '' + '429': + description: '' + '500': + description: '' + parameters: + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + get: + description: Get a virtual model config + operationId: getAiGatewayVirtualModelConfig + security: + - bearerToken: [] + summary: Get virtual model config + tags: + - api-ai-gateway + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + ownerId: + type: string + description: Team (owner) that owns this VMC. + virtualModelSlug: + type: string + description: Client-facing alias used as the model slug in Gateway calls. + displayName: + type: string + description: Human-readable name for UI. + description: + type: string + description: Optional description for UI. + deleted: + type: boolean + enum: + - false + - true + description: Whether this VMC is soft-deleted. + status: + type: string + description: 'UI lifecycle status: draft, active, or archived.' + visibility: + type: string + description: 'Visibility in listings: public, internal, or stealth.' + updatedBy: + type: string + description: User id that last updated this VMC. + kind: + type: string + description: 'VMC kind: alias, relay, or router.' + baseUrl: + type: string + description: 'For kind=relay: URL the gateway forwards requests to as a transparent proxy.' + instanceId: + type: string + description: The concrete model-provider instance this VMC resolves to. + providerOrder: + items: + type: string + type: array + description: Ordered list of providers to try as fallbacks on failure. + providerOnly: + items: + type: string + type: array + description: Restrict routing to only these providers. + providerOptions: + additionalProperties: + $ref: '#/components/schemas/AiGatewayProviderOptionBag' + type: object + description: Arbitrary per-provider AI SDK options, keyed by gateway provider slug. + inferenceRegion: + properties: + providers: + additionalProperties: + nullable: true + properties: + scope: + type: string + enum: + - global + - specific + - zone + description: 'Pin scope: `specific` (one provider region), `zone` (geo zone), or `global`.' + geoRegion: + type: string + description: Geo zone (e.g. "us", "eu"). + providerRegion: + type: string + description: Provider-specific region identifier. + type: object + description: Per-provider region overrides keyed by provider slug. + type: object + description: Per-provider region overrides keyed by provider slug. + scope: + type: string + enum: + - global + - specific + - zone + description: 'Pin scope: `specific` (one provider region), `zone` (geo zone), or `global`.' + geoRegion: + type: string + description: Geo zone (e.g. "us", "eu"). + providerRegion: + type: string + description: Provider-specific region identifier. + type: object + description: Region pinned on the VMC for system-credential routing (alias/router only). + modelSlug: + type: string + description: Canonical model slug this VMC maps to (e.g. "creator/model"). Not used by kind=router. + models: + items: + type: string + type: array + description: 'For kind=router: ordered candidates, model slugs or router references. Otherwise: fallback models.' + selector: + type: string + enum: + - cost + - priority + - tps + - ttft + description: 'For kind=router: how to order candidates.' + requires: + items: + type: string + type: array + description: 'For kind=router: capability tags a candidate must have.' + byokCredentialIds: + items: + type: string + type: array + description: BYOK credential IDs allowed for this VMC. + observabilityTags: + items: + type: string + type: array + description: Observability tags attached to requests through this VMC. + sort: + type: string + enum: + - cost + - latency + - price + - throughput + - tps + - ttft + description: Rank eligible providers by an attribute. + has: + items: + type: string + enum: + - implicit-caching + - vision + description: Limit providers to those with these features. + type: array + description: Limit providers to those with these features. + caching: + type: string + enum: + - auto + description: Use caching if available. + serviceTier: + type: string + enum: + - fast + - flex + - priority + description: Service tier for providers that support it. + providerTimeouts: + properties: + byok: + additionalProperties: + type: number + type: object + type: object + description: Per-request provider timeouts in ms, keyed by provider slug for BYOK credentials. + zeroDataRetention: + type: boolean + enum: + - false + - true + description: Only use providers with zero data retention. + hipaaCompliant: + type: boolean + enum: + - false + - true + description: Only use HIPAA-compliant providers. + disallowPromptTraining: + type: boolean + enum: + - false + - true + description: Only use providers that will not train on your prompts. + speed: + type: string + enum: + - fast + description: Only use fastest providers with short timeouts. + allowFallbackFromFast: + type: boolean + enum: + - false + - true + description: Allow fallback from fast to standard providers on failure. + createdAt: + type: number + description: Creation timestamp (epoch ms). + updatedAt: + type: number + description: Last update timestamp (epoch ms). + virtualModelConfigs: + items: + $ref: '#/components/schemas/AiGatewayVirtualModelConfig' + type: array + description: The page of VMCs. + cursor: + nullable: true + type: string + description: Cursor for the next page, or null when no more pages remain. + required: + - createdAt + - deleted + - kind + - ownerId + - status + - updatedAt + - virtualModelSlug + - cursor + - virtualModelConfigs + type: object + description: Public response shape for virtual model configs. Used so OpenAPI generation can avoid ElectroDB's recursive EntityItem types. + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + '500': + description: '' + parameters: + - name: ownerId + in: query + schema: + type: string + - name: virtualModelSlug + in: query + schema: + type: string + - name: limit + in: query + schema: + type: integer + minimum: 1 + - name: cursor + in: query + schema: + type: string + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + patch: + description: Update a virtual model config + operationId: updateAiGatewayVirtualModelConfig + security: + - bearerToken: [] + summary: Update virtual model config + tags: + - api-ai-gateway + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/AiGatewayVirtualModelConfig' + '400': + description: '' + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + '500': + description: '' + parameters: + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + delete: + description: Delete a virtual model config (soft delete) + operationId: deleteAiGatewayVirtualModelConfig + security: + - bearerToken: [] + summary: Delete virtual model config + tags: + - api-ai-gateway + responses: + '204': + description: '' + content: + application/json: + schema: + nullable: true + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + '500': + description: '' + parameters: + - name: ownerId + in: query + required: false + schema: + type: string + - name: virtualModelSlug + in: query + required: true + schema: + type: string + - name: updatedBy + in: query + required: false + schema: + type: string + - name: actingIp + in: query + required: false + schema: + type: string + - name: actingUserAgent + in: query + required: false + schema: + type: string + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + /v1/ai-gateway/virtual-model-configs/list: + get: + description: List virtual model configs. With `ownerId`, returns all of that team's VMCs. Without it, pages through VMCs across all teams (newest-first, `limit`/`cursor`). + operationId: listAiGatewayVirtualModelConfigs + security: + - bearerToken: [] + summary: List virtual model configs + tags: + - api-ai-gateway + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/AiGatewayVirtualModelConfigList' + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '410': + description: '' + '500': + description: '' + parameters: + - name: ownerId + in: query + schema: + type: string + - name: limit + in: query + schema: + type: integer + minimum: 1 + - name: cursor + in: query + schema: + type: string + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + /v1/ai-gateway/virtual-model-configs/{vmc_slug}: + get: + description: Get a virtual model config by path slug + operationId: getAiGatewayVirtualModelConfigBySlug + security: + - bearerToken: [] + summary: Get virtual model config + tags: + - api-ai-gateway + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/AiGatewayVirtualModelConfig' + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + '500': + description: '' + parameters: + - name: ownerId + in: query + required: false + schema: + type: string + - name: vmc_slug + in: path + required: true + schema: + type: string + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + patch: + description: Update a virtual model config by path slug + operationId: updateAiGatewayVirtualModelConfigBySlug + security: + - bearerToken: [] + summary: Update virtual model config + tags: + - api-ai-gateway + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/AiGatewayVirtualModelConfig' + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + '500': + description: '' + parameters: + - name: vmc_slug + in: path + required: true + schema: + type: string + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + delete: + description: Delete a virtual model config by path slug (soft delete) + operationId: deleteAiGatewayVirtualModelConfigBySlug + security: + - bearerToken: [] + summary: Delete virtual model config + tags: + - api-ai-gateway + responses: + '204': + description: '' + content: + application/json: + schema: + nullable: true + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + '500': + description: '' + parameters: + - name: ownerId + in: query + required: false + schema: + type: string + - name: vmc_slug + in: path + required: true + schema: + type: string + - name: updatedBy + in: query + required: false + schema: + type: string + - name: actingIp + in: query + required: false + schema: + type: string + - name: actingUserAgent + in: query + required: false + schema: + type: string + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + /v1/ai-gateway/rules: + post: + description: Create a routing rule + operationId: createAiGatewayRule + security: + - bearerToken: [] + summary: Create rule + tags: + - ai-gateway + responses: + '201': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/AiGatewayRule' + '400': + description: '' + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '409': + description: '' + '410': + description: '' + '500': + description: '' + parameters: + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + get: + description: List the authenticated team's routing rules + operationId: listAiGatewayRules + security: + - bearerToken: [] + summary: List rules + tags: + - ai-gateway + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/AiGatewayRuleList' + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '410': + description: '' + '500': + description: '' + parameters: + - name: includeDisabled + in: query + schema: + type: string + enum: + - 'true' + - 'false' + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + patch: + description: Update a routing rule (enabled, action, or description) + operationId: updateAiGatewayRule + security: + - bearerToken: [] + summary: Update rule + tags: + - ai-gateway + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/AiGatewayRule' + '400': + description: '' + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + '500': + description: '' + parameters: + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + delete: + description: Delete a routing rule (soft delete) + operationId: deleteAiGatewayRule + security: + - bearerToken: [] + summary: Delete rule + tags: + - ai-gateway + responses: + '204': + description: '' + content: + application/json: + schema: + nullable: true + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + '500': + description: '' + parameters: + - name: ruleId + in: query + required: true + schema: + type: string + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug +components: + schemas: + AiGatewayVirtualModelConfig: + properties: + ownerId: + type: string + description: Team (owner) that owns this VMC. + virtualModelSlug: + type: string + description: Client-facing alias used as the model slug in Gateway calls. + displayName: + type: string + description: Human-readable name for UI. + description: + type: string + description: Optional description for UI. + deleted: + type: boolean + enum: + - false + - true + description: Whether this VMC is soft-deleted. + status: + type: string + description: 'UI lifecycle status: draft, active, or archived.' + visibility: + type: string + description: 'Visibility in listings: public, internal, or stealth.' + updatedBy: + type: string + description: User id that last updated this VMC. + kind: + type: string + description: 'VMC kind: alias, relay, or router.' + baseUrl: + type: string + description: 'For kind=relay: URL the gateway forwards requests to as a transparent proxy.' + instanceId: + type: string + description: The concrete model-provider instance this VMC resolves to. + providerOrder: + items: + type: string + type: array + description: Ordered list of providers to try as fallbacks on failure. + providerOnly: + items: + type: string + type: array + description: Restrict routing to only these providers. + providerOptions: + additionalProperties: + $ref: '#/components/schemas/AiGatewayProviderOptionBag' + type: object + description: Arbitrary per-provider AI SDK options, keyed by gateway provider slug. + inferenceRegion: + properties: + providers: + additionalProperties: + nullable: true + properties: + scope: + type: string + enum: + - global + - specific + - zone + description: 'Pin scope: `specific` (one provider region), `zone` (geo zone), or `global`.' + geoRegion: + type: string + description: Geo zone (e.g. "us", "eu"). + providerRegion: + type: string + description: Provider-specific region identifier. + type: object + description: Per-provider region overrides keyed by provider slug. + type: object + description: Per-provider region overrides keyed by provider slug. + scope: + type: string + enum: + - global + - specific + - zone + description: 'Pin scope: `specific` (one provider region), `zone` (geo zone), or `global`.' + geoRegion: + type: string + description: Geo zone (e.g. "us", "eu"). + providerRegion: + type: string + description: Provider-specific region identifier. + type: object + description: Region pinned on the VMC for system-credential routing (alias/router only). + modelSlug: + type: string + description: Canonical model slug this VMC maps to (e.g. "creator/model"). Not used by kind=router. + models: + items: + type: string + type: array + description: 'For kind=router: ordered candidates, model slugs or router references. Otherwise: fallback models.' + selector: + type: string + enum: + - cost + - priority + - tps + - ttft + description: 'For kind=router: how to order candidates.' + requires: + items: + type: string + type: array + description: 'For kind=router: capability tags a candidate must have.' + byokCredentialIds: + items: + type: string + type: array + description: BYOK credential IDs allowed for this VMC. + observabilityTags: + items: + type: string + type: array + description: Observability tags attached to requests through this VMC. + sort: + type: string + enum: + - cost + - latency + - price + - throughput + - tps + - ttft + description: Rank eligible providers by an attribute. + has: + items: + type: string + enum: + - implicit-caching + - vision + description: Limit providers to those with these features. + type: array + description: Limit providers to those with these features. + caching: + type: string + enum: + - auto + description: Use caching if available. + serviceTier: + type: string + enum: + - fast + - flex + - priority + description: Service tier for providers that support it. + providerTimeouts: + properties: + byok: + additionalProperties: + type: number + type: object + type: object + description: Per-request provider timeouts in ms, keyed by provider slug for BYOK credentials. + zeroDataRetention: + type: boolean + enum: + - false + - true + description: Only use providers with zero data retention. + hipaaCompliant: + type: boolean + enum: + - false + - true + description: Only use HIPAA-compliant providers. + disallowPromptTraining: + type: boolean + enum: + - false + - true + description: Only use providers that will not train on your prompts. + speed: + type: string + enum: + - fast + description: Only use fastest providers with short timeouts. + allowFallbackFromFast: + type: boolean + enum: + - false + - true + description: Allow fallback from fast to standard providers on failure. + createdAt: + type: number + description: Creation timestamp (epoch ms). + updatedAt: + type: number + description: Last update timestamp (epoch ms). + required: + - createdAt + - deleted + - kind + - ownerId + - status + - updatedAt + - virtualModelSlug + type: object + description: Public response shape for virtual model configs. Used so OpenAPI generation can avoid ElectroDB's recursive EntityItem types. + AiGatewayVirtualModelConfigList: + properties: + virtualModelConfigs: + items: + $ref: '#/components/schemas/AiGatewayVirtualModelConfig' + type: array + description: The page of VMCs. + cursor: + nullable: true + type: string + description: Cursor for the next page, or null when no more pages remain. + required: + - cursor + - virtualModelConfigs + type: object + AiGatewayRule: + properties: + ownerId: + type: string + ruleId: + type: string + type: + type: string + enum: + - deny + - rewrite + match: + properties: + model: + type: string + type: object + action: + properties: + rewriteModel: + type: string + reason: + type: string + type: object + enabled: + type: boolean + enum: + - false + - true + deleted: + type: boolean + enum: + - false + - true + description: + type: string + createdBy: + type: string + updatedBy: + type: string + createdAt: + type: number + updatedAt: + type: number + required: + - createdAt + - enabled + - ownerId + - ruleId + - type + - updatedAt + type: object + description: Public response shape for AI Gateway routing rules. Used so OpenAPI generation can avoid ElectroDB's recursive EntityItem types. + AiGatewayRuleList: + properties: + rules: + items: + $ref: '#/components/schemas/AiGatewayRule' + type: array + required: + - rules + type: object + AiGatewayProviderOptionBag: + additionalProperties: true + type: object + description: Arbitrary per-provider AI SDK options, keyed by gateway provider slug. + x-stackQL-resources: + virtual_model_configs: + id: vercel.ai_gateway.virtual_model_configs + name: virtual_model_configs + title: Virtual Model Configs + methods: + create: + operation: + $ref: '#/paths/~1v1~1ai-gateway~1virtual-model-configs/post' + response: + mediaType: application/json + openAPIDocKey: '201' + request: + nativeCasing: camel + get_by_query: + operation: + $ref: '#/paths/~1v1~1ai-gateway~1virtual-model-configs/get' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + update: + operation: + $ref: '#/paths/~1v1~1ai-gateway~1virtual-model-configs/patch' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + delete: + operation: + $ref: '#/paths/~1v1~1ai-gateway~1virtual-model-configs/delete' + response: + mediaType: application/json + openAPIDocKey: '204' + request: + nativeCasing: camel + list: + operation: + $ref: '#/paths/~1v1~1ai-gateway~1virtual-model-configs~1list/get' + response: + mediaType: application/json + openAPIDocKey: '200' + objectKey: $.virtualModelConfigs + request: + nativeCasing: camel + config: + pagination: + requestToken: + key: cursor + location: query + responseToken: + key: $.cursor + location: body + queryParamPushdown: + top: + paramName: limit + maxValue: 100 + get_by_slug: + operation: + $ref: '#/paths/~1v1~1ai-gateway~1virtual-model-configs~1{vmc_slug}/get' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + update_by_slug: + operation: + $ref: '#/paths/~1v1~1ai-gateway~1virtual-model-configs~1{vmc_slug}/patch' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + delete_by_slug: + operation: + $ref: '#/paths/~1v1~1ai-gateway~1virtual-model-configs~1{vmc_slug}/delete' + response: + mediaType: application/json + openAPIDocKey: '204' + request: + nativeCasing: camel + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/virtual_model_configs/methods/get_by_slug' + - $ref: '#/components/x-stackQL-resources/virtual_model_configs/methods/list' + insert: + - $ref: '#/components/x-stackQL-resources/virtual_model_configs/methods/create' + update: + - $ref: '#/components/x-stackQL-resources/virtual_model_configs/methods/update_by_slug' + - $ref: '#/components/x-stackQL-resources/virtual_model_configs/methods/update' + delete: + - $ref: '#/components/x-stackQL-resources/virtual_model_configs/methods/delete_by_slug' + - $ref: '#/components/x-stackQL-resources/virtual_model_configs/methods/delete' + replace: [] + rules: + id: vercel.ai_gateway.rules + name: rules + title: Rules + methods: + create: + operation: + $ref: '#/paths/~1v1~1ai-gateway~1rules/post' + response: + mediaType: application/json + openAPIDocKey: '201' + request: + nativeCasing: camel + list: + operation: + $ref: '#/paths/~1v1~1ai-gateway~1rules/get' + response: + mediaType: application/json + openAPIDocKey: '200' + objectKey: $.rules + request: + nativeCasing: camel + update: + operation: + $ref: '#/paths/~1v1~1ai-gateway~1rules/patch' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + delete: + operation: + $ref: '#/paths/~1v1~1ai-gateway~1rules/delete' + response: + mediaType: application/json + openAPIDocKey: '204' + request: + nativeCasing: camel + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/rules/methods/list' + insert: + - $ref: '#/components/x-stackQL-resources/rules/methods/create' + update: + - $ref: '#/components/x-stackQL-resources/rules/methods/update' + delete: + - $ref: '#/components/x-stackQL-resources/rules/methods/delete' + replace: [] +servers: + - url: https://api.vercel.com diff --git a/provider-dev/openapi/src/vercel/v00.00.00000/services/aliases.yaml b/provider-dev/openapi/src/vercel/v00.00.00000/services/aliases.yaml index 8736f64..fe1a538 100644 --- a/provider-dev/openapi/src/vercel/v00.00.00000/services/aliases.yaml +++ b/provider-dev/openapi/src/vercel/v00.00.00000/services/aliases.yaml @@ -1,134 +1,21 @@ openapi: 3.0.3 -servers: - - url: 'https://api.vercel.com' - description: Production API info: - contact: - email: support@vercel.com - name: Vercel Support - url: 'https://vercel.com/support' + title: aliases API + description: vercel aliases API version: 0.0.1 - title: Vercel API - aliases - description: aliases -components: - schemas: - Pagination: - properties: - count: - type: number - description: Amount of items in the current page. - example: 20 - next: - nullable: true - type: number - description: Timestamp that must be used to request the next page. - example: 1540095775951 - prev: - nullable: true - type: number - description: Timestamp that must be used to request the previous page. - example: 1540095775951 - required: - - count - - next - - prev - type: object - description: 'This object contains information related to the pagination of the current request, including the necessary parameters to get the next or previous page of data.' - responses: {} - securitySchemes: - bearerToken: - type: http - description: Default authentication mechanism - scheme: bearer - oauth2: - type: oauth2 - flows: - authorizationCode: - authorizationUrl: 'https://api.vercel.com/oauth/authorize' - tokenUrl: 'https://api.vercel.com/oauth/access_token' - scopes: {} - x-stackQL-resources: - aliases: - id: vercel.aliases.aliases - name: aliases - title: Aliases - methods: - list_aliases: - operation: - $ref: '#/paths/~1v4~1aliases/get' - response: - mediaType: application/json - openAPIDocKey: '200' - objectKey: $.aliases - _list_aliases: - operation: - $ref: '#/paths/~1v4~1aliases/get' - response: - mediaType: application/json - openAPIDocKey: '200' - get_alias: - operation: - $ref: '#/paths/~1v4~1aliases~1{idOrAlias}/get' - response: - mediaType: application/json - openAPIDocKey: '200' - delete_alias: - operation: - $ref: '#/paths/~1v2~1aliases~1{aliasId}/delete' - response: - mediaType: application/json - openAPIDocKey: '200' - sqlVerbs: - select: - - $ref: '#/components/x-stackQL-resources/aliases/methods/get_alias' - - $ref: '#/components/x-stackQL-resources/aliases/methods/list_aliases' - insert: [] - update: [] - delete: - - $ref: '#/components/x-stackQL-resources/aliases/methods/delete_alias' - deployments: - id: vercel.aliases.deployments - name: deployments - title: Deployments - methods: - list_deployment_aliases: - operation: - $ref: '#/paths/~1v2~1deployments~1{id}~1aliases/get' - response: - mediaType: application/json - openAPIDocKey: '200' - objectKey: $.aliases - _list_deployment_aliases: - operation: - $ref: '#/paths/~1v2~1deployments~1{id}~1aliases/get' - response: - mediaType: application/json - openAPIDocKey: '200' - assign_alias: - operation: - $ref: '#/paths/~1v2~1deployments~1{id}~1aliases/post' - response: - mediaType: application/json - openAPIDocKey: '200' - sqlVerbs: - select: - - $ref: '#/components/x-stackQL-resources/deployments/methods/list_deployment_aliases' - insert: [] - update: [] - delete: [] paths: - /v4/aliases: + /v2/deployments/{id}/aliases: get: - description: 'Retrieves a list of aliases for the authenticated User or Team. When `domain` is provided, only aliases for that domain will be returned. When `projectId` is provided, it will only return the given project aliases.' - operationId: listAliases + description: Retrieves all Aliases for the Deployment with the given ID. The authenticated user or team must own the deployment. + operationId: listDeploymentAliases security: - bearerToken: [] - summary: List aliases + summary: List Deployment Aliases tags: - aliases responses: '200': - description: The paginated list of aliases + description: The list of aliases assigned to the deployment content: application/json: schema: @@ -136,92 +23,23 @@ paths: aliases: items: properties: + uid: + type: string + description: The unique identifier of the alias + example: 2WjyKQmM8ZnGcJsPWMrHRHrE alias: type: string - description: 'The alias name, it could be a `.vercel.app` subdomain or a custom domain' + description: The alias name, it could be a `.vercel.app` subdomain or a custom domain example: my-alias.vercel.app created: type: string format: date-time description: The date when the alias was created example: '2017-04-26T23:00:34.232Z' - createdAt: - type: number - description: The date when the alias was created in milliseconds since the UNIX epoch - example: 1540095775941 - creator: - properties: - uid: - type: string - description: ID of the user who created the alias - example: 96SnxkFiMyVKsK3pnoHfx3Hz - email: - type: string - description: Email of the user who created the alias - example: john-doe@gmail.com - username: - type: string - description: Username of the user who created the alias - example: john-doe - required: - - uid - - email - - username - type: object - description: Information of the user who created the alias - deletedAt: - type: number - description: The date when the alias was deleted in milliseconds since the UNIX epoch - example: 1540095775941 - deployment: - properties: - id: - type: string - description: The deployment unique identifier - example: dpl_5m8CQaRBm3FnWRW1od3wKTpaECPx - url: - type: string - description: The deployment unique URL - example: my-instant-deployment-3ij3cxz9qr.now.sh - meta: - type: string - description: The deployment metadata - example: {} - required: - - id - - url - type: object - description: 'A map with the deployment ID, URL and metadata' - deploymentId: - nullable: true - type: string - description: The deployment ID - example: dpl_5m8CQaRBm3FnWRW1od3wKTpaECPx - projectId: - nullable: true - type: string - description: The unique identifier of the project - example: prj_12HKQaOmR5t5Uy6vdcQsNIiZgHGB redirect: nullable: true type: string description: Target destination domain for redirect when the alias is a redirect - redirectStatusCode: - nullable: true - type: number - enum: - - 301 - - 302 - - 307 - - 308 - description: Status code to be used on redirect - uid: - type: string - description: The unique identifier of the alias - updatedAt: - type: number - description: The date when the alias was updated in milliseconds since the UNIX epoch - example: 1540095775941 protectionBypass: additionalProperties: oneOf: @@ -234,6 +52,8 @@ paths: type: string enum: - shareable-link + expires: + type: number required: - createdAt - createdBy @@ -250,17 +70,17 @@ paths: access: type: string enum: - - requested - granted + - requested scope: type: string enum: - user required: + - access - createdAt - lastUpdatedAt - lastUpdatedBy - - access - scope type: object description: The protection bypass for the alias @@ -279,111 +99,548 @@ paths: - scope type: object description: The protection bypass for the alias + - properties: + createdAt: + type: number + lastUpdatedAt: + type: number + lastUpdatedBy: + type: string + scope: + type: string + enum: + - email_invite + required: + - createdAt + - lastUpdatedAt + - lastUpdatedBy + - scope + type: object + description: The protection bypass for the alias type: object description: The protection bypass for the alias required: - alias - created - - deploymentId - - projectId - uid type: object + description: A list of the aliases assigned to the deployment type: array - pagination: - $ref: '#/components/schemas/Pagination' + description: A list of the aliases assigned to the deployment required: - aliases - - pagination type: object '400': description: One of the provided values in the request query is invalid. '401': - description: '' + description: The request is not authorized. '403': description: You do not have permission to access this resource. '404': + description: The deployment was not found + '410': description: '' + x-vercel-cli: + supportedSubcommands: true + supportedProduction: false + aliases: + - for-deployment parameters: - - name: domain - description: Get only aliases of the given domain name - in: query - schema: - description: Get only aliases of the given domain name - example: my-test-domain.com - items: - type: string - maxItems: 20 - oneOf: - - type: array - - type: string - - name: from - description: Get only aliases created after the provided timestamp - in: query - schema: - deprecated: true - description: Get only aliases created after the provided timestamp - example: 1540095775951 - type: number - - name: limit - description: Maximum number of aliases to list from a request - in: query - schema: - description: Maximum number of aliases to list from a request - example: 10 - type: number - - name: projectId - description: Filter aliases from the given `projectId` - in: query + - name: id + description: The ID of the deployment the aliases should be listed for + in: path + required: true schema: - description: Filter aliases from the given `projectId` - example: prj_12HKQaOmR5t5Uy6vdcQsNIiZgHGB + example: dpl_FjvFJncQHQcZMznrUm9EoB8sFuPa + description: The ID of the deployment the aliases should be listed for type: string - - name: since - description: Get aliases created after this JavaScript timestamp - in: query - schema: - description: Get aliases created after this JavaScript timestamp - example: 1540095775941 - type: number - - name: until - description: Get aliases created before this JavaScript timestamp - in: query - schema: - description: Get aliases created before this JavaScript timestamp - example: 1540095775951 - type: number - - name: rollbackDeploymentId - description: Get aliases that would be rolled back for the given deployment + - description: The Team identifier to perform the request on behalf of. in: query + name: teamId schema: - description: Get aliases that would be rolled back for the given deployment - example: dpl_XXX type: string - - description: The Team identifier or slug to perform the request on behalf of. + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. in: query - name: teamId - required: true + name: slug schema: type: string - '/v4/aliases/{idOrAlias}': - get: - description: Retrieves an Alias for the given host name or alias ID. - operationId: getAlias + example: my-team-url-slug + post: + description: Creates a new alias for the deployment resolved from the given deployment or alias ID or URL. The authenticated user or team must own this deployment. If the desired alias is already assigned to another deployment, then it will be removed from the old deployment and assigned to the new one. + operationId: assignAlias security: - bearerToken: [] - summary: Get an Alias + summary: Assign an Alias tags: - aliases responses: '200': - description: The alias information + description: The alias was successfully assigned to the deployment content: application/json: schema: properties: - alias: + uid: type: string - description: 'The alias name, it could be a `.vercel.app` subdomain or a custom domain' + description: The unique identifier of the alias + example: 2WjyKQmM8ZnGcJsPWMrHRHrE + alias: + type: string + description: The assigned alias name + example: my-alias.vercel.app + created: + type: string + format: date-time + description: The date when the alias was created + example: '2017-04-26T23:00:34.232Z' + oldDeploymentId: + nullable: true + type: string + description: The unique identifier of the previously aliased deployment, only received when the alias was used before + example: dpl_FjvFJncQHQcZMznrUm9EoB8sFuPa + required: + - alias + - created + - uid + type: object + '400': + description: |- + One of the provided values in the request body is invalid. + One of the provided values in the request query is invalid. + The cert for the provided alias is not ready + The deployment is not READY and can not be aliased + The supplied alias is invalid + '401': + description: The request is not authorized. + '402': + description: The account is missing a payment so payment method must be updated + '403': + description: |- + You do not have permission to access this resource. + If no .vercel.app alias exists then we fail (nothing to mirror) + '404': + description: |- + The domain used for the alias was not found + The deployment was not found + '409': + description: |- + The provided alias is already assigned to the given deployment + The domain is not allowed to be used + '410': + description: '' + parameters: + - name: id + description: The deployment or alias ID or URL to assign from + in: path + required: true + schema: + description: The deployment or alias ID or URL to assign from + example: dpl_FjvFJncQHQcZMznrUm9EoB8sFuPa + oneOf: + - type: string + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + requestBody: + content: + application/json: + schema: + properties: + alias: + description: The alias we want to assign to the deployment defined in the URL + example: my-alias.vercel.app + type: string + redirect: + description: The redirect property will take precedence over the deployment id from the URL and consists of a hostname (like test.com) to which the alias should redirect using status code 307 + example: null + type: string + nullable: true + type: object + required: true + /v4/aliases: + get: + description: Retrieves a list of aliases for the authenticated User or Team. When `domain` is provided, only aliases for that domain will be returned. When `projectId` is provided, it will only return the given project aliases. + operationId: listAliases + security: + - bearerToken: [] + summary: List aliases + tags: + - aliases + responses: + '200': + description: The paginated list of aliases + content: + application/json: + schema: + properties: + aliases: + items: + properties: + alias: + type: string + description: The alias name, it could be a `.vercel.app` subdomain or a custom domain + example: my-alias.vercel.app + created: + type: string + format: date-time + description: The date when the alias was created + example: '2017-04-26T23:00:34.232Z' + createdAt: + type: number + description: The date when the alias was created in milliseconds since the UNIX epoch + example: 1540095775941 + creator: + properties: + uid: + type: string + description: ID of the user who created the alias + example: 96SnxkFiMyVKsK3pnoHfx3Hz + email: + type: string + description: Email of the user who created the alias + example: john-doe@gmail.com + username: + type: string + description: Username of the user who created the alias + example: john-doe + required: + - uid + type: object + description: Information of the user who created the alias + deletedAt: + type: number + description: The date when the alias was deleted in milliseconds since the UNIX epoch + example: 1540095775941 + nullable: true + deployment: + properties: + id: + type: string + description: The deployment unique identifier + example: dpl_5m8CQaRBm3FnWRW1od3wKTpaECPx + url: + type: string + description: The deployment unique URL + example: my-instant-deployment-3ij3cxz9qr.now.sh + meta: + type: string + description: The deployment metadata + example: {} + required: + - id + type: object + description: A map with the deployment ID, URL and metadata + deploymentId: + nullable: true + type: string + description: The deployment ID + example: dpl_5m8CQaRBm3FnWRW1od3wKTpaECPx + projectId: + nullable: true + type: string + description: The unique identifier of the project + example: prj_12HKQaOmR5t5Uy6vdcQsNIiZgHGB + redirect: + nullable: true + type: string + description: Target destination domain for redirect when the alias is a redirect + redirectStatusCode: + nullable: true + type: number + enum: + - 301 + - 302 + - 307 + - 308 + - null + description: Status code to be used on redirect + uid: + type: string + description: The unique identifier of the alias + updatedAt: + type: number + description: The date when the alias was updated in milliseconds since the UNIX epoch + example: 1540095775941 + protectionBypass: + additionalProperties: + oneOf: + - properties: + createdAt: + type: number + createdBy: + type: string + scope: + type: string + enum: + - shareable-link + expires: + type: number + required: + - createdAt + - createdBy + - scope + type: object + description: The protection bypass for the alias + - properties: + createdAt: + type: number + lastUpdatedAt: + type: number + lastUpdatedBy: + type: string + access: + type: string + enum: + - granted + - requested + scope: + type: string + enum: + - user + required: + - access + - createdAt + - lastUpdatedAt + - lastUpdatedBy + - scope + type: object + description: The protection bypass for the alias + - properties: + createdAt: + type: number + createdBy: + type: string + scope: + type: string + enum: + - alias-protection-override + required: + - createdAt + - createdBy + - scope + type: object + description: The protection bypass for the alias + - properties: + createdAt: + type: number + lastUpdatedAt: + type: number + lastUpdatedBy: + type: string + scope: + type: string + enum: + - email_invite + required: + - createdAt + - lastUpdatedAt + - lastUpdatedBy + - scope + type: object + description: The protection bypass for the alias + type: object + description: The protection bypass for the alias + microfrontends: + properties: + defaultApp: + properties: + projectId: + type: string + required: + - projectId + type: object + applications: + oneOf: + - items: + properties: + fallbackHost: + type: string + description: This is always set. In production it is used as a pointer to each apps production deployment. For pre-production, it's used as the fallback if there is no deployment for the branch. + projectId: + type: string + description: The project ID of the microfrontends application. + required: + - fallbackHost + - projectId + type: object + description: A list of the deployment routing information for each project. + type: array + description: A list of the deployment routing information for each project. + - items: + properties: + fallbackHost: + type: string + description: This is always set. For branch aliases, it's used as the fallback if there is no deployment for the branch. + branchAlias: + type: string + description: Could point to a branch without a deployment if the project was never deployed. The proxy will fallback to the fallbackHost if there is no deployment. + projectId: + type: string + description: The project ID of the microfrontends application. + required: + - branchAlias + - fallbackHost + - projectId + type: object + description: A list of the deployment routing information for each project. + type: array + description: A list of the deployment routing information for each project. + - items: + properties: + deploymentId: + type: string + description: This is the deployment for the same commit, it could be a cancelled deployment. The proxy will fallback to the branchDeploymentId and then the fallbackDeploymentId. + branchDeploymentId: + type: string + description: This is the latest non-cancelled deployment of the branch alias at the time the commit alias was created. It is possible there is no deployment for the branch, or this was set before the deployment was canceled, in which case this will point to a cancelled deployment, in either case the proxy will fallback to the fallbackDeploymentId. + fallbackDeploymentId: + type: string + description: This is the deployment of the fallback host at the time the commit alias was created. It is possible for this to be a deleted deployment, in which case the proxy will show that the deployment is deleted. It will not use the fallbackHost, as a future deployment on the fallback host could be invalid for this deployment, and it could lead to confusion / incorrect behavior for the commit alias. + fallbackHost: + type: string + description: Temporary for backwards compatibility. Can remove when metadata change is released + branchAlias: + type: string + projectId: + type: string + description: The project ID of the microfrontends application. + required: + - projectId + type: object + description: A list of the deployment routing information for each project. + type: array + description: A list of the deployment routing information for each project. + required: + - applications + - defaultApp + type: object + description: The microfrontends for the alias including the routing configuration + required: + - alias + - created + - deploymentId + - projectId + - uid + type: object + type: array + pagination: + $ref: '#/components/schemas/Pagination' + required: + - aliases + - pagination + type: object + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + x-vercel-cli: + supportedSubcommands: true + supportedProduction: false + aliases: + - list + parameters: + - name: domain + description: Get only aliases of the given domain name + in: query + schema: + description: Get only aliases of the given domain name + example: my-test-domain.com + maxItems: 20 + oneOf: + - type: array + items: + type: string + - type: string + - name: from + description: Get only aliases created after the provided timestamp + in: query + schema: + deprecated: true + description: Get only aliases created after the provided timestamp + example: 1540095775951 + type: number + - name: limit + description: Maximum number of aliases to list from a request + in: query + schema: + description: Maximum number of aliases to list from a request + example: 10 + type: number + - name: projectId + description: Filter aliases from the given `projectId` + in: query + schema: + description: Filter aliases from the given `projectId` + example: prj_12HKQaOmR5t5Uy6vdcQsNIiZgHGB + type: string + - name: since + description: Get aliases created after this JavaScript timestamp + in: query + schema: + description: Get aliases created after this JavaScript timestamp + example: 1540095775941 + type: number + - name: until + description: Get aliases created before this JavaScript timestamp + in: query + schema: + description: Get aliases created before this JavaScript timestamp + example: 1540095775951 + type: number + - name: rollbackDeploymentId + description: Get aliases that would be rolled back for the given deployment + in: query + schema: + description: Get aliases that would be rolled back for the given deployment + example: dpl_XXX + type: string + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + /v4/aliases/{id_or_alias}: + get: + description: Retrieves an Alias for the given host name or alias ID. + operationId: getAlias + security: + - bearerToken: [] + summary: Get an Alias + tags: + - aliases + responses: + '200': + description: The alias information + content: + application/json: + schema: + properties: + alias: + type: string + description: The alias name, it could be a `.vercel.app` subdomain or a custom domain example: my-alias.vercel.app created: type: string @@ -394,6 +651,7 @@ paths: type: number description: The date when the alias was created in milliseconds since the UNIX epoch example: 1540095775941 + nullable: true creator: properties: uid: @@ -410,14 +668,13 @@ paths: example: john-doe required: - uid - - email - - username type: object description: Information of the user who created the alias deletedAt: type: number description: The date when the alias was deleted in milliseconds since the UNIX epoch example: 1540095775941 + nullable: true deployment: properties: id: @@ -434,9 +691,8 @@ paths: example: {} required: - id - - url type: object - description: 'A map with the deployment ID, URL and metadata' + description: A map with the deployment ID, URL and metadata deploymentId: nullable: true type: string @@ -459,6 +715,7 @@ paths: - 302 - 307 - 308 + - null description: Status code to be used on redirect uid: type: string @@ -467,6 +724,7 @@ paths: type: number description: The date when the alias was updated in milliseconds since the UNIX epoch example: 1540095775941 + nullable: true protectionBypass: additionalProperties: oneOf: @@ -479,6 +737,8 @@ paths: type: string enum: - shareable-link + expires: + type: number required: - createdAt - createdBy @@ -495,17 +755,17 @@ paths: access: type: string enum: - - requested - granted + - requested scope: type: string enum: - user required: + - access - createdAt - lastUpdatedAt - lastUpdatedBy - - access - scope type: object description: The protection bypass for the alias @@ -524,8 +784,101 @@ paths: - scope type: object description: The protection bypass for the alias + - properties: + createdAt: + type: number + lastUpdatedAt: + type: number + lastUpdatedBy: + type: string + scope: + type: string + enum: + - email_invite + required: + - createdAt + - lastUpdatedAt + - lastUpdatedBy + - scope + type: object + description: The protection bypass for the alias type: object description: The protection bypass for the alias + microfrontends: + properties: + defaultApp: + properties: + projectId: + type: string + required: + - projectId + type: object + applications: + oneOf: + - items: + properties: + fallbackHost: + type: string + description: This is always set. In production it is used as a pointer to each apps production deployment. For pre-production, it's used as the fallback if there is no deployment for the branch. + projectId: + type: string + description: The project ID of the microfrontends application. + required: + - fallbackHost + - projectId + type: object + description: A list of the deployment routing information for each project. + type: array + description: A list of the deployment routing information for each project. + - items: + properties: + fallbackHost: + type: string + description: This is always set. For branch aliases, it's used as the fallback if there is no deployment for the branch. + branchAlias: + type: string + description: Could point to a branch without a deployment if the project was never deployed. The proxy will fallback to the fallbackHost if there is no deployment. + projectId: + type: string + description: The project ID of the microfrontends application. + required: + - branchAlias + - fallbackHost + - projectId + type: object + description: A list of the deployment routing information for each project. + type: array + description: A list of the deployment routing information for each project. + - items: + properties: + deploymentId: + type: string + description: This is the deployment for the same commit, it could be a cancelled deployment. The proxy will fallback to the branchDeploymentId and then the fallbackDeploymentId. + branchDeploymentId: + type: string + description: This is the latest non-cancelled deployment of the branch alias at the time the commit alias was created. It is possible there is no deployment for the branch, or this was set before the deployment was canceled, in which case this will point to a cancelled deployment, in either case the proxy will fallback to the fallbackDeploymentId. + fallbackDeploymentId: + type: string + description: This is the deployment of the fallback host at the time the commit alias was created. It is possible for this to be a deleted deployment, in which case the proxy will show that the deployment is deleted. It will not use the fallbackHost, as a future deployment on the fallback host could be invalid for this deployment, and it could lead to confusion / incorrect behavior for the commit alias. + fallbackHost: + type: string + description: Temporary for backwards compatibility. Can remove when metadata change is released + branchAlias: + type: string + projectId: + type: string + description: The project ID of the microfrontends application. + required: + - projectId + type: object + description: A list of the deployment routing information for each project. + type: array + description: A list of the deployment routing information for each project. + required: + - applications + - defaultApp + type: object + description: The microfrontends for the alias including the routing configuration required: - alias - created @@ -536,11 +889,13 @@ paths: '400': description: One of the provided values in the request query is invalid. '401': - description: '' + description: The request is not authorized. '403': description: You do not have permission to access this resource. '404': description: The alias was not found + '410': + description: '' parameters: - name: from description: Get the alias only if it was created after the provided timestamp @@ -551,7 +906,7 @@ paths: description: Get the alias only if it was created after the provided timestamp example: 1540095775951 type: number - - name: idOrAlias + - name: id_or_alias description: The alias or alias ID to be retrieved in: path required: true @@ -583,277 +938,308 @@ paths: description: Get the alias only if it was created before this JavaScript timestamp example: 1540095775951 type: number - - description: The Team identifier or slug to perform the request on behalf of. + - description: The Team identifier to perform the request on behalf of. in: query name: teamId - required: true schema: type: string - '/v2/aliases/{aliasId}': - delete: - description: Delete an Alias with the specified ID. - operationId: deleteAlias - security: - - bearerToken: [] - summary: Delete an Alias - tags: - - aliases - responses: - '200': - description: The alias was successfully removed - content: - application/json: - schema: - properties: - status: - type: string - enum: - - SUCCESS - required: - - status - type: object - '400': - description: One of the provided values in the request query is invalid. - '401': - description: '' - '403': - description: You do not have permission to access this resource. - '404': - description: The alias was not found - parameters: - - name: aliasId - description: The ID or alias that will be removed - in: path - required: true - schema: - example: 2WjyKQmM8ZnGcJsPWMrHRHrE - description: The ID or alias that will be removed - oneOf: - - type: string - - description: The Team identifier or slug to perform the request on behalf of. - in: query - name: teamId - required: true + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug schema: type: string - '/v2/deployments/{id}/aliases': - get: - description: Retrieves all Aliases for the Deployment with the given ID. The authenticated user or team must own the deployment. - operationId: listDeploymentAliases + example: my-team-url-slug + /v2/aliases/{alias_id}: + delete: + description: Delete an Alias with the specified ID. + operationId: deleteAlias security: - bearerToken: [] - summary: List Deployment Aliases + summary: Delete an Alias tags: - aliases responses: '200': - description: The list of aliases assigned to the deployment + description: The alias was successfully removed content: application/json: schema: properties: - aliases: - items: - properties: - uid: - type: string - description: The unique identifier of the alias - example: 2WjyKQmM8ZnGcJsPWMrHRHrE - alias: - type: string - description: 'The alias name, it could be a `.vercel.app` subdomain or a custom domain' - example: my-alias.vercel.app - created: - type: string - format: date-time - description: The date when the alias was created - example: '2017-04-26T23:00:34.232Z' - redirect: - nullable: true - type: string - description: Target destination domain for redirect when the alias is a redirect - protectionBypass: - additionalProperties: - oneOf: - - properties: - createdAt: - type: number - createdBy: - type: string - scope: - type: string - enum: - - shareable-link - required: - - createdAt - - createdBy - - scope - type: object - description: The protection bypass for the alias - - properties: - createdAt: - type: number - lastUpdatedAt: - type: number - lastUpdatedBy: - type: string - access: - type: string - enum: - - requested - - granted - scope: - type: string - enum: - - user - required: - - createdAt - - lastUpdatedAt - - lastUpdatedBy - - access - - scope - type: object - description: The protection bypass for the alias - - properties: - createdAt: - type: number - createdBy: - type: string - scope: - type: string - enum: - - alias-protection-override - required: - - createdAt - - createdBy - - scope - type: object - description: The protection bypass for the alias - type: object - description: The protection bypass for the alias - required: - - uid - - alias - - created - type: object - description: A list of the aliases assigned to the deployment - type: array - description: A list of the aliases assigned to the deployment + status: + type: string + enum: + - SUCCESS required: - - aliases + - status type: object '400': description: One of the provided values in the request query is invalid. '401': - description: '' + description: The request is not authorized. '403': description: You do not have permission to access this resource. '404': - description: The deployment was not found + description: The alias was not found + '410': + description: '' parameters: - - name: id - description: The ID of the deployment the aliases should be listed for + - name: alias_id + description: The ID or alias that will be removed in: path required: true schema: - example: dpl_FjvFJncQHQcZMznrUm9EoB8sFuPa - description: The ID of the deployment the aliases should be listed for - type: string - - description: The Team identifier or slug to perform the request on behalf of. + example: 2WjyKQmM8ZnGcJsPWMrHRHrE + description: The ID or alias that will be removed + oneOf: + - type: string + - description: The Team identifier to perform the request on behalf of. in: query name: teamId - required: true schema: type: string - post: - description: 'Creates a new alias for the deployment with the given deployment ID. The authenticated user or team must own this deployment. If the desired alias is already assigned to another deployment, then it will be removed from the old deployment and assigned to the new one.' - operationId: assignAlias + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + /aliases/{id}/protection-bypass: + patch: + description: Update the protection bypass for the alias or deployment URL (used for user access & comment access for deployments). Used as shareable links and user scoped access for Vercel Authentication and also to allow external (logged in) people to comment on previews for Preview Comments (next-live-mode). + operationId: patchUrlProtectionBypass security: - bearerToken: [] - summary: Assign an Alias + summary: Update the protection bypass for a URL tags: - aliases responses: '200': - description: The alias was successfully assigned to the deployment + description: '' content: application/json: schema: - properties: - uid: - type: string - description: The unique identifier of the alias - example: 2WjyKQmM8ZnGcJsPWMrHRHrE - alias: - type: string - description: The assigned alias name - example: my-alias.vercel.app - created: - type: string - format: date-time - description: The date when the alias was created - example: '2017-04-26T23:00:34.232Z' - oldDeploymentId: - nullable: true - type: string - description: 'The unique identifier of the previously aliased deployment, only received when the alias was used before' - example: dpl_FjvFJncQHQcZMznrUm9EoB8sFuPa - required: - - uid - - alias - - created + additionalProperties: true type: object '400': description: |- One of the provided values in the request body is invalid. One of the provided values in the request query is invalid. - The cert for the provided alias is not ready - The deployment is not READY and can not be aliased - The supplied alias is invalid '401': - description: '' - '402': - description: |- - The account was soft-blocked for an unhandled reason. - The account is missing a payment so payment method must be updated + description: The request is not authorized. '403': - description: |- - You do not have permission to access this resource. - If no .vercel.app alias exists then we fail (nothing to mirror) + description: You do not have permission to access this resource. '404': - description: |- - The domain used for the alias was not found - The deployment was not found + description: '' '409': - description: The provided alias is already assigned to the given deployment + description: '' + '410': + description: '' + '428': + description: '' parameters: - name: id - description: The ID of the deployment the aliases should be listed for + description: The alias or deployment ID in: path required: true schema: - description: The ID of the deployment the aliases should be listed for - example: dpl_FjvFJncQHQcZMznrUm9EoB8sFuPa - oneOf: - - type: string - - description: The Team identifier or slug to perform the request on behalf of. + type: string + description: The alias or deployment ID + - description: The Team identifier to perform the request on behalf of. in: query name: teamId - required: true schema: type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug requestBody: content: application/json: schema: - properties: - alias: - description: The alias we want to assign to the deployment defined in the URL - example: my-alias.vercel.app - type: string - redirect: - description: The redirect property will take precedence over the deployment id from the URL and consists of a hostname (like test.com) to which the alias should redirect using status code 307 - example: null - type: string - nullable: true type: object + properties: + ttl: + description: Optional time the shareable link is valid for in seconds. If not provided, the shareable link will never expire. + type: number + maximum: 63072000 + revoke: + description: Optional instructions for revoking and regenerating a shareable link + type: object + properties: + secret: + description: Sharebale link to revoked + type: string + regenerate: + description: Whether or not a new shareable link should be created after the provided secret is revoked + type: boolean + required: + - secret + - regenerate + scope: + description: Instructions for creating a user scoped protection bypass + type: object + properties: + userId: + type: string + description: Specified user id for the scoped bypass. + email: + type: string + format: email + description: Specified email for the scoped bypass. + access: + enum: + - denied + - granted + description: Invitation status for the user scoped bypass. + anyOf: + - required: + - userId + - required: + - email + required: + - access + override: + type: object + properties: + scope: + enum: + - alias-protection-override + action: + enum: + - create + - revoke + required: + - scope + - action + additionalProperties: false + required: + - scope + - override +components: + schemas: + Pagination: + properties: + count: + type: number + description: Amount of items in the current page. + example: 20 + next: + nullable: true + type: number + description: Timestamp that must be used to request the next page. + example: 1540095775951 + prev: + nullable: true + type: number + description: Timestamp that must be used to request the previous page. + example: 1540095775951 + required: + - count + - next + - prev + type: object + description: This object contains information related to the pagination of the current request, including the necessary parameters to get the next or previous page of data. + x-stackQL-resources: + deployment_aliases: + id: vercel.aliases.deployment_aliases + name: deployment_aliases + title: Deployment Aliases + methods: + list: + operation: + $ref: '#/paths/~1v2~1deployments~1{id}~1aliases/get' + response: + mediaType: application/json + openAPIDocKey: '200' + objectKey: $.aliases + request: + nativeCasing: camel + assign: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v2~1deployments~1{id}~1aliases/post' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/deployment_aliases/methods/list' + insert: + - $ref: '#/components/x-stackQL-resources/deployment_aliases/methods/assign' + update: [] + delete: [] + replace: [] + aliases: + id: vercel.aliases.aliases + name: aliases + title: Aliases + methods: + list: + operation: + $ref: '#/paths/~1v4~1aliases/get' + response: + mediaType: application/json + openAPIDocKey: '200' + objectKey: $.aliases + request: + nativeCasing: camel + config: + pagination: + requestToken: + key: until + location: query + responseToken: + key: $.pagination.next + location: body + queryParamPushdown: + top: + paramName: limit + maxValue: 100 + get: + operation: + $ref: '#/paths/~1v4~1aliases~1{id_or_alias}/get' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + delete: + operation: + $ref: '#/paths/~1v2~1aliases~1{alias_id}/delete' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + update_protection_bypass: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1aliases~1{id}~1protection-bypass/patch' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/aliases/methods/get' + - $ref: '#/components/x-stackQL-resources/aliases/methods/list' + insert: [] + update: [] + delete: + - $ref: '#/components/x-stackQL-resources/aliases/methods/delete' + replace: [] +servers: + - url: https://api.vercel.com diff --git a/provider-dev/openapi/src/vercel/v00.00.00000/services/artifacts.yaml b/provider-dev/openapi/src/vercel/v00.00.00000/services/artifacts.yaml index aff3907..dd1e07d 100644 --- a/provider-dev/openapi/src/vercel/v00.00.00000/services/artifacts.yaml +++ b/provider-dev/openapi/src/vercel/v00.00.00000/services/artifacts.yaml @@ -1,77 +1,8 @@ openapi: 3.0.3 -servers: - - url: 'https://api.vercel.com' - description: Production API info: - contact: - email: support@vercel.com - name: Vercel Support - url: 'https://vercel.com/support' + title: artifacts API + description: vercel artifacts API version: 0.0.1 - title: Vercel API - artifacts - description: artifacts -components: - schemas: {} - responses: {} - securitySchemes: - bearerToken: - type: http - description: Default authentication mechanism - scheme: bearer - oauth2: - type: oauth2 - flows: - authorizationCode: - authorizationUrl: 'https://api.vercel.com/oauth/authorize' - tokenUrl: 'https://api.vercel.com/oauth/access_token' - scopes: {} - x-stackQL-resources: - artifacts: - id: vercel.artifacts.artifacts - name: artifacts - title: Artifacts - methods: - record_events: - operation: - $ref: '#/paths/~1v8~1artifacts~1events/post' - response: - mediaType: application/json - openAPIDocKey: '200' - status: - operation: - $ref: '#/paths/~1v8~1artifacts~1status/get' - response: - mediaType: application/json - openAPIDocKey: '200' - upload_artifact: - operation: - $ref: '#/paths/~1v8~1artifacts~1{hash}/put' - response: - mediaType: application/json - openAPIDocKey: '200' - download_artifact: - operation: - $ref: '#/paths/~1v8~1artifacts~1{hash}/get' - response: - mediaType: application/json - openAPIDocKey: '200' - artifact_exists: - operation: - $ref: '#/paths/~1v8~1artifacts~1{hash}/head' - response: - mediaType: application/json - openAPIDocKey: '200' - artifact_query: - operation: - $ref: '#/paths/~1v8~1artifacts/post' - response: - mediaType: application/json - openAPIDocKey: '200' - sqlVerbs: - select: [] - insert: [] - update: [] - delete: [] paths: /v8/artifacts/events: post: @@ -90,17 +21,17 @@ paths: One of the provided values in the request body is invalid. One of the provided values in the headers is invalid '401': - description: '' + description: The request is not authorized. '402': - description: |- - The account was soft-blocked for an unhandled reason. - The account is missing a payment so payment method must be updated + description: The account is missing a payment so payment method must be updated '403': description: |- - You do not have permission to access this resource. The customer has reached their spend cap limit and has been paused. An owner can disable the cap or raise the limit in settings. The Remote Caching usage limit has been reached for this account for this billing cycle. Remote Caching has been disabled for this team or user. An owner can enable it in the billing settings. + You do not have permission to access this resource. + '410': + description: '' parameters: - in: header description: The continuous integration or delivery environment where this artifact is downloaded. @@ -119,12 +50,18 @@ paths: minimum: 0 maximum: 1 name: x-artifact-client-interactive - - description: The Team identifier or slug to perform the request on behalf of. + - description: The Team identifier to perform the request on behalf of. in: query - required: true name: teamId schema: type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug requestBody: content: application/json: @@ -162,9 +99,10 @@ paths: type: number description: The time taken to generate the artifact. This should be sent as a body parameter on `HIT` events. example: 400 + required: true /v8/artifacts/status: get: - description: 'Check the status of Remote Caching for this principal. Returns a JSON-encoded status indicating if Remote Caching is enabled, disabled, or disabled due to usage limits.' + description: Check the status of Remote Caching for this principal. Returns a JSON-encoded status indicating if Remote Caching is enabled, disabled, or disabled due to usage limits. operationId: status security: - bearerToken: [] @@ -180,32 +118,33 @@ paths: properties: status: type: string - enum: - - disabled - - enabled - - over_limit - - paused required: - status type: object '400': description: '' '401': - description: '' + description: The request is not authorized. '402': - description: |- - The account was soft-blocked for an unhandled reason. - The account is missing a payment so payment method must be updated + description: The account is missing a payment so payment method must be updated '403': description: You do not have permission to access this resource. + '410': + description: '' parameters: - - description: The Team identifier or slug to perform the request on behalf of. + - description: The Team identifier to perform the request on behalf of. in: query - required: true name: teamId schema: type: string - '/v8/artifacts/{hash}': + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + /v8/artifacts/{hash}: put: description: Uploads a cache artifact identified by the `hash` specified on the path. The cache artifact can then be downloaded with the provided `hash`. operationId: uploadArtifact @@ -227,7 +166,7 @@ paths: type: array description: Array of URLs where the artifact was updated example: - - 'https://api.vercel.com/v2/now/artifact/12HKQaOmR5t5Uy6vdcQsNIiZgHGB' + - https://api.vercel.com/v2/now/artifact/12HKQaOmR5t5Uy6vdcQsNIiZgHGB required: - urls type: object @@ -237,17 +176,17 @@ paths: One of the provided values in the headers is invalid File size is not valid '401': - description: '' + description: The request is not authorized. '402': - description: |- - The account was soft-blocked for an unhandled reason. - The account is missing a payment so payment method must be updated + description: The account is missing a payment so payment method must be updated '403': description: |- - You do not have permission to access this resource. The customer has reached their spend cap limit and has been paused. An owner can disable the cap or raise the limit in settings. The Remote Caching usage limit has been reached for this account for this billing cycle. Remote Caching has been disabled for this team or user. An owner can enable it in the billing settings. + You do not have permission to access this resource. + '410': + description: '' parameters: - in: header description: The artifact size in bytes @@ -292,6 +231,22 @@ paths: example: Tc0BmHvJYMIYJ62/zx87YqO0Flxk+5Ovip25NY825CQ= maxLength: 600 name: x-artifact-tag + - in: header + description: The SHA of the source control revision that generated this artifact. + required: false + schema: + type: string + description: The SHA of the source control revision that generated this artifact. + maxLength: 200 + name: x-artifact-sha + - in: header + description: A hash representing uncommitted changes in the working directory when this artifact was generated. + required: false + schema: + type: string + description: A hash representing uncommitted changes in the working directory when this artifact was generated. + maxLength: 200 + name: x-artifact-dirty-hash - name: hash description: The artifact hash in: path @@ -300,18 +255,25 @@ paths: example: 12HKQaOmR5t5Uy6vdcQsNIiZgHGB description: The artifact hash type: string - - description: The Team identifier or slug to perform the request on behalf of. + - description: The Team identifier to perform the request on behalf of. in: query name: teamId - required: true schema: type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug requestBody: content: application/octet-stream: schema: - type: string - format: binary + $ref: '#/components/schemas/StackqlOctetStreamBody' + required: true + x-speakeasy-test: false get: description: Downloads a cache artifact indentified by its `hash` specified on the request path. The artifact is downloaded as an octet-stream. The client should verify the content-length header and response body. operationId: downloadArtifact @@ -334,19 +296,19 @@ paths: One of the provided values in the request query is invalid. One of the provided values in the headers is invalid '401': - description: '' + description: The request is not authorized. '402': - description: |- - The account was soft-blocked for an unhandled reason. - The account is missing a payment so payment method must be updated + description: The account is missing a payment so payment method must be updated '403': description: |- - You do not have permission to access this resource. The customer has reached their spend cap limit and has been paused. An owner can disable the cap or raise the limit in settings. The Remote Caching usage limit has been reached for this account for this billing cycle. Remote Caching has been disabled for this team or user. An owner can enable it in the billing settings. + You do not have permission to access this resource. '404': description: The artifact was not found + '410': + description: '' parameters: - in: header description: The continuous integration or delivery environment where this artifact is downloaded. @@ -373,12 +335,18 @@ paths: example: 12HKQaOmR5t5Uy6vdcQsNIiZgHGB description: The artifact hash type: string - - description: The Team identifier or slug to perform the request on behalf of. + - description: The Team identifier to perform the request on behalf of. in: query name: teamId - required: true schema: type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug head: description: Check that a cache artifact with the given `hash` exists. This request returns response headers only and is equivalent to a `GET` request to this endpoint where the response contains no body. operationId: artifactExists @@ -393,19 +361,19 @@ paths: '400': description: One of the provided values in the request query is invalid. '401': - description: '' + description: The request is not authorized. '402': - description: |- - The account was soft-blocked for an unhandled reason. - The account is missing a payment so payment method must be updated + description: The account is missing a payment so payment method must be updated '403': description: |- - You do not have permission to access this resource. The customer has reached their spend cap limit and has been paused. An owner can disable the cap or raise the limit in settings. The Remote Caching usage limit has been reached for this account for this billing cycle. Remote Caching has been disabled for this team or user. An owner can enable it in the billing settings. + You do not have permission to access this resource. '404': description: The artifact was not found + '410': + description: '' parameters: - name: hash description: The artifact hash @@ -415,12 +383,18 @@ paths: example: 12HKQaOmR5t5Uy6vdcQsNIiZgHGB description: The artifact hash type: string - - description: The Team identifier or slug to perform the request on behalf of. + - description: The Team identifier to perform the request on behalf of. in: query name: teamId - required: true schema: type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug /v8/artifacts: post: description: Query information about an array of artifacts. @@ -446,6 +420,10 @@ paths: type: number tag: type: string + sha: + type: string + dirtyHash: + type: string required: - size - taskDurationMs @@ -465,24 +443,30 @@ paths: '400': description: One of the provided values in the request body is invalid. '401': - description: '' + description: The request is not authorized. '402': - description: |- - The account was soft-blocked for an unhandled reason. - The account is missing a payment so payment method must be updated + description: The account is missing a payment so payment method must be updated '403': description: |- - You do not have permission to access this resource. The customer has reached their spend cap limit and has been paused. An owner can disable the cap or raise the limit in settings. The Remote Caching usage limit has been reached for this account for this billing cycle. Remote Caching has been disabled for this team or user. An owner can enable it in the billing settings. + You do not have permission to access this resource. + '410': + description: '' parameters: - - description: The Team identifier or slug to perform the request on behalf of. + - description: The Team identifier to perform the request on behalf of. in: query name: teamId - required: true schema: type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug requestBody: content: application/json: @@ -496,3 +480,151 @@ paths: type: string description: artifact hashes type: array + example: + - 12HKQaOmR5t5Uy6vdcQsNIiZgHGB + - 34HKQaOmR5t5Uy6vasdasdasdasd + required: true + delete: + description: Deletes all cache artifacts stored for the authenticated team or user, clearing the Remote Cache. Subsequent builds will re-populate the cache. + operationId: deleteAllArtifacts + security: + - bearerToken: [] + summary: Delete all cache artifacts + tags: + - artifacts + responses: + '200': + description: Success. All cache artifacts for the account were deleted. + content: + application/json: + schema: + properties: + deletedCount: + type: number + required: + - deletedCount + type: object + '400': + description: '' + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '410': + description: '' + parameters: + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug +components: + x-stackQL-resources: + artifacts: + id: vercel.artifacts.artifacts + name: artifacts + title: Artifacts + methods: + record_events: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v8~1artifacts~1events/post' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + upload: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v8~1artifacts~1{hash}/put' + response: + mediaType: application/json + openAPIDocKey: '202' + request: + mediaType: application/octet-stream + required: + - value + schema_override: + $ref: '#/components/schemas/StackqlOctetStreamBody' + transform: + type: golang_template_json_v0.1.0 + body: '{{ .value }}' + nativeCasing: camel + download: + operation: + $ref: '#/paths/~1v8~1artifacts~1{hash}/get' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + query: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v8~1artifacts/post' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + delete_all: + operation: + $ref: '#/paths/~1v8~1artifacts/delete' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + sqlVerbs: + select: [] + insert: [] + update: [] + delete: + - $ref: '#/components/x-stackQL-resources/artifacts/methods/delete_all' + replace: [] + artifact_status: + id: vercel.artifacts.artifact_status + name: artifact_status + title: Artifact Status + methods: + get: + operation: + $ref: '#/paths/~1v8~1artifacts~1status/get' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/artifact_status/methods/get' + insert: [] + update: [] + delete: [] + replace: [] + schemas: + StackqlOctetStreamBody: + type: object + description: 'Raw request body for octet-stream uploads: the text in `value` is sent verbatim as the request body.' + properties: + value: + type: string + description: Raw body content (sent as-is). + required: + - value +servers: + - url: https://api.vercel.com diff --git a/provider-dev/openapi/src/vercel/v00.00.00000/services/authentication.yaml b/provider-dev/openapi/src/vercel/v00.00.00000/services/authentication.yaml index 5b3871d..025753f 100644 --- a/provider-dev/openapi/src/vercel/v00.00.00000/services/authentication.yaml +++ b/provider-dev/openapi/src/vercel/v00.00.00000/services/authentication.yaml @@ -1,205 +1,180 @@ openapi: 3.0.3 -servers: - - url: 'https://api.vercel.com' - description: Production API info: - contact: - email: support@vercel.com - name: Vercel Support - url: 'https://vercel.com/support' + title: authentication API + description: vercel authentication API version: 0.0.1 - title: Vercel API - authentication - description: authentication -components: - schemas: - AuthToken: - properties: - id: - type: string - description: The unique identifier of the token. - example: 5d9f2ebd38ddca62e5d51e9c1704c72530bdc8bfdd41e782a6687c48399e8391 - name: - type: string - description: The human-readable name of the token. - type: - type: string - description: The type of the token. - example: oauth2-token - origin: - type: string - description: The origin of how the token was created. - example: github - scopes: - items: - oneOf: - - properties: - type: - type: string - enum: - - user - origin: +paths: + /api-keys: + post: + description: '' + operationId: createApiKeys + security: [] + tags: [] + responses: + '200': + description: Successfully created an API key. + content: + application/json: + schema: + type: object + properties: + apiKeyString: + description: The API key's actual value. This value is only provided in this response, and can never be retrieved again in the future. Be sure to save it somewhere safe! + example: uRKJSTt0L4RaSkiMj41QTkxM type: string - enum: - - saml - - github - - gitlab - - bitbucket - - email - - manual - createdAt: - type: number - expiresAt: - type: number + apiKey: + $ref: '#/components/schemas/APIKey' required: - - type - - origin - - createdAt + - apiKeyString + - apiKey + '400': + description: One of the provided values in the request body is invalid. + '401': + description: The request is not authorized. + content: + application/json: + schema: type: object - description: The access scopes granted to the token. - - properties: - type: - type: string - enum: - - team - teamId: - type: string - origin: - type: string - enum: - - saml - - github - - gitlab - - bitbucket - - email - - manual - createdAt: - type: number - expiresAt: - type: number + properties: + error: + type: object + properties: + code: + type: string + message: + type: string + required: + - code + - message required: - - type - - teamId - - origin - - createdAt + - error + '403': + description: You do not have permission to access this resource. + content: + application/json: + schema: type: object - description: The access scopes granted to the token. - type: array - description: The access scopes granted to the token. - expiresAt: - type: number - description: Timestamp (in milliseconds) of when the token expires. - example: 1632816536002 - activeAt: - type: number - description: Timestamp (in milliseconds) of when the token was most recently used. - example: 1632816536002 - createdAt: - type: number - description: Timestamp (in milliseconds) of when the token was created. - example: 1632816536002 - required: - - id - - name - - type - - activeAt - - createdAt - type: object - description: Authentication token metadata. - Pagination: - properties: - count: - type: number - description: Amount of items in the current page. - example: 20 - next: - nullable: true - type: number - description: Timestamp that must be used to request the next page. - example: 1540095775951 - prev: - nullable: true - type: number - description: Timestamp that must be used to request the previous page. - example: 1540095775951 - required: - - count - - next - - prev - type: object - description: 'This object contains information related to the pagination of the current request, including the necessary parameters to get the next or previous page of data.' - responses: {} - securitySchemes: - bearerToken: - type: http - description: Default authentication mechanism - scheme: bearer - oauth2: - type: oauth2 - flows: - authorizationCode: - authorizationUrl: 'https://api.vercel.com/oauth/authorize' - tokenUrl: 'https://api.vercel.com/oauth/access_token' - scopes: {} - x-stackQL-resources: - user_tokens: - id: vercel.authentication.user_tokens - name: user_tokens - title: User Tokens - methods: - list_auth_tokens: - operation: - $ref: '#/paths/~1v5~1user~1tokens/get' - response: - mediaType: application/json - openAPIDocKey: '200' - objectKey: $.tokens - _list_auth_tokens: - operation: - $ref: '#/paths/~1v5~1user~1tokens/get' - response: - mediaType: application/json - openAPIDocKey: '200' - create_auth_token: - operation: - $ref: '#/paths/~1v3~1user~1tokens/post' - response: - mediaType: application/json - openAPIDocKey: '200' - get_auth_token: - operation: - $ref: '#/paths/~1v5~1user~1tokens~1{tokenId}/get' - response: - mediaType: application/json - openAPIDocKey: '200' - delete_auth_token: - operation: - $ref: '#/paths/~1v3~1user~1tokens~1{tokenId}/delete' - response: - mediaType: application/json - openAPIDocKey: '200' - verify_token: - operation: - $ref: '#/paths/~1registration~1verify/get' - response: - mediaType: application/json - openAPIDocKey: '200' - email_login: - operation: - $ref: '#/paths/~1registration/post' - response: - mediaType: application/json - openAPIDocKey: '200' - sqlVerbs: - select: - - $ref: '#/components/x-stackQL-resources/user_tokens/methods/get_auth_token' - - $ref: '#/components/x-stackQL-resources/user_tokens/methods/list_auth_tokens' - insert: - - $ref: '#/components/x-stackQL-resources/user_tokens/methods/create_auth_token' - update: [] - delete: - - $ref: '#/components/x-stackQL-resources/user_tokens/methods/delete_auth_token' -paths: - /v5/user/tokens: + properties: + error: + type: object + properties: + code: + type: string + message: + type: string + required: + - code + - message + required: + - error + '409': + description: '' + '410': + description: '' + '429': + description: '' + content: + application/json: + schema: + type: object + properties: + error: + type: object + properties: + code: + type: string + name: + type: string + message: + type: string + limit: + type: number + required: + - code + - name + - message + - limit + required: + - error + '500': + description: '' + content: + application/json: + schema: + type: object + properties: + error: + type: object + properties: + code: + type: string + message: + type: string + required: + - code + - message + required: + - error + parameters: [] + requestBody: + content: + application/json: + schema: + type: object + required: + - purpose + properties: + purpose: + type: string + description: The API key's purpose, which restricts how it can be used. + projectId: + type: string + description: An optional project to restrict the API key to. + example: prj_12HKQaOmR5t5Uy6vdcQsNIiZgHGB + name: + type: string + description: An optional name for the API key. + example: API Key for App 123 + expiresAt: + type: number + description: The API key's expiration, expressed as a UNIX timestamp in milliseconds. + aiGatewayQuota: + type: object + description: Optional AI Gateway quota configuration for the API key. + properties: + limitAmount: + type: number + minimum: 1 + description: The quota limit amount. + includeByokInQuota: + type: boolean + default: false + description: Whether to include BYOK (Bring Your Own Key) usage in the quota. + refreshPeriod: + type: string + enum: + - daily + - weekly + - monthly + - none + default: none + description: How often the quota refreshes. + alertThresholds: + type: array + items: + type: number + enum: + - 50 + - 75 + - 100 + description: Spend percentages (a subset of [50, 75, 100]) at which to send a spend alert. + required: + - limitAmount + metadata: + type: object + description: Optional generic metadata for the API key. The accepted shape depends on the key's `purpose` and is validated on creation; for `ai-gateway` keys this accepts `environment`. + additionalProperties: true + /v6/user/tokens: get: description: Retrieve a list of the current User's authentication tokens. operationId: listAuthTokens @@ -219,24 +194,42 @@ paths: items: $ref: '#/components/schemas/AuthToken' type: array - testingToken: - $ref: '#/components/schemas/AuthToken' pagination: - $ref: '#/components/schemas/Pagination' + properties: + count: + type: number + next: + nullable: true + type: string + prev: + nullable: true + type: string + required: + - count + - next + - prev + type: object required: - - tokens - pagination + - tokens type: object '400': description: '' '401': - description: '' + description: The request is not authorized. '403': description: You do not have permission to access this resource. + '410': + description: '' + x-vercel-cli: + supportedSubcommands: true + supportedProduction: false + aliases: + - list parameters: [] /v3/user/tokens: post: - description: 'Creates and returns a new authentication token for the currently authenticated User. The `bearerToken` property is only provided once, in the response body, so be sure to save it on the client for use with API requests.' + description: Creates and returns a new authentication token for the currently authenticated User. The `bearerToken` property is only provided once, in the response body, so be sure to save it on the client for use with API requests. operationId: createAuthToken security: - bearerToken: [] @@ -254,60 +247,54 @@ paths: $ref: '#/components/schemas/AuthToken' bearerToken: type: string - description: 'The authentication token''s actual value. This token is only provided in this response, and can never be retrieved again in the future. Be sure to save it somewhere safe!' + description: The authentication token's actual value. This token is only provided in this response, and can never be retrieved again in the future. Be sure to save it somewhere safe! example: uRKJSTt0L4RaSkiMj41QTkxM required: - - token - bearerToken + - token type: object description: Successful response. '400': description: One of the provided values in the request body is invalid. '401': - description: '' + description: The request is not authorized. '403': description: You do not have permission to access this resource. '404': description: '' + '410': + description: '' parameters: - - description: The Team identifier or slug to perform the request on behalf of. + - description: The Team identifier to perform the request on behalf of. in: query name: teamId - required: true schema: type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug requestBody: content: application/json: schema: - oneOf: - - type: object - additionalProperties: false - required: - - name - properties: - name: - type: string - expiresAt: - type: number - - type: object - additionalProperties: false - required: - - type - - name - properties: - type: - enum: - - oauth2-token - name: - type: string - clientId: - type: string - installationId: - type: string - expiresAt: - type: number - '/v5/user/tokens/{tokenId}': + type: object + additionalProperties: false + required: + - name + properties: + name: + type: string + expiresAt: + type: number + projectId: + type: string + description: The ID of the project to scope this token to + required: true + /v5/user/tokens/{token_id}: get: description: Retrieve metadata about an authentication token belonging to the currently authenticated User. operationId: getAuthToken @@ -331,22 +318,26 @@ paths: description: Successful response. '400': description: One of the provided values in the request query is invalid. + '401': + description: '' '403': description: You do not have permission to access this resource. '404': description: Token not found with the requested `tokenId`. + '410': + description: '' parameters: - - name: tokenId - description: 'The identifier of the token to retrieve. The special value \"current\" may be supplied, which returns the metadata for the token that the current HTTP request is authenticated with.' + - name: token_id + description: The identifier of the token to retrieve. The special value "current" may be supplied, which returns the metadata for the token that the current HTTP request is authenticated with. in: path required: true schema: type: string - description: 'The identifier of the token to retrieve. The special value \"current\" may be supplied, which returns the metadata for the token that the current HTTP request is authenticated with.' + description: The identifier of the token to retrieve. The special value "current" may be supplied, which returns the metadata for the token that the current HTTP request is authenticated with. example: 5d9f2ebd38ddca62e5d51e9c1704c72530bdc8bfdd41e782a6687c48399e8391 - '/v3/user/tokens/{tokenId}': + /v3/user/tokens/{token_id}: delete: - description: 'Invalidate an authentication token, such that it will no longer be valid for future HTTP requests.' + description: Invalidate an authentication token, such that it will no longer be valid for future HTTP requests. operationId: deleteAuthToken security: - bearerToken: [] @@ -376,157 +367,403 @@ paths: description: You do not have permission to access this resource. '404': description: Token not found with the requested `tokenId`. + '410': + description: '' parameters: - - name: tokenId - description: 'The identifier of the token to invalidate. The special value \"current\" may be supplied, which invalidates the token that the HTTP request was authenticated with.' + - name: token_id + description: The identifier of the token to invalidate. The special value "current" may be supplied, which invalidates the token that the HTTP request was authenticated with. in: path required: true schema: type: string - description: 'The identifier of the token to invalidate. The special value \"current\" may be supplied, which invalidates the token that the HTTP request was authenticated with.' + description: The identifier of the token to invalidate. The special value "current" may be supplied, which invalidates the token that the HTTP request was authenticated with. example: 5d9f2ebd38ddca62e5d51e9c1704c72530bdc8bfdd41e782a6687c48399e8391 - /registration/verify: - get: - description: Verify the user accepted the login request and get a authentication token. The user email address and the token received after requesting the login must be added to the URL as a query string with the names `email` and `token`. - operationId: verifyToken - security: [] - summary: Verify a login request to get an authentication token - tags: - - authentication - responses: - '200': - description: The verification was successful. - content: - application/json: - schema: - properties: - token: - type: string - description: The user authentication token that can be used to perform API requests. - example: 1ioXyz9Ue4xdCYGROet1dlKd - email: +components: + schemas: + APIKey: + description: Information about the newly created API key. + type: object + properties: + id: + description: The unique identifier of the API key. + example: 5d9f2ebd38ddca62e5d51e9c1704c72530bdc8bfdd41e782a6687c48399e8391 + type: string + name: + description: The human-readable name of the API key. + example: API Key for AI Gateway + type: string + partialKey: + description: The last few characters of the API key string, for helping identify the API key. + example: t7V + type: string + teamId: + description: The ID of the team that the API key grants access to. + example: team_123a6c5209bc3778245d011443644c8d27dc2c50 + type: string + purpose: + description: The API key's purpose, i.e. what resources it can be used with. + example: ai-gateway + type: string + projectId: + description: |- + The ID of the project that this API key grants access to. + + When this is unset, the API key grants access to all projects in the team. + example: prj_12HKQaOmR5t5Uy6vdcQsNIiZgHGB + type: string + nullable: true + expiresAt: + description: Timestamp (in milliseconds) of when the API key expires. + example: 1632816536002 + type: number + nullable: true + activeAt: + description: Timestamp (in milliseconds) of when the API key was most recently used. + example: 1632816536002 + type: number + createdAt: + description: Timestamp (in milliseconds) of when the API key was created. + example: 1632816536002 + type: number + createdBy: + description: The ID of the user who created the API key. + example: ZspSRT4ljIEEmMHgoDwKWDei + type: string + leakedAt: + description: Timestamp (in milliseconds) of when the API key was marked as leaked. + example: 1632816536002 + type: number + nullable: true + leakedUrl: + description: URL where the API key was discovered as leaked. + type: string + nullable: true + createdByAppId: + description: The ID of the app that created the API key, if any + type: string + nullable: true + quota: + $ref: '#/components/schemas/APIKeyQuota' + metadata: + description: |- + Generic metadata attached to the API key. + + The accepted shape depends on the key's `purpose` and is validated when the key is created. For `ai-gateway` keys this carries `environment` and `spendAttribution`. + type: object + patternProperties: + ^(.*)$: {} + required: + - id + - name + - partialKey + - teamId + - purpose + - projectId + - expiresAt + - activeAt + - createdAt + - createdBy + - leakedAt + - leakedUrl + - createdByAppId + AuthToken: + properties: + id: + type: string + description: The unique identifier of the token. + example: 5d9f2ebd38ddca62e5d51e9c1704c72530bdc8bfdd41e782a6687c48399e8391 + name: + type: string + description: The human-readable name of the token. + type: + type: string + description: The type of the token. + example: oauth2-token + prefix: + type: string + description: The token's prefix, for identification purposes. + example: vcp_ + suffix: + type: string + description: The last few characters of the token, for identification purposes. + example: abc123 + origin: + type: string + description: The origin of how the token was created. + example: github + scopes: + items: + oneOf: + - properties: + type: type: string - description: Email address of the authenticated user. - example: amy@example.com - teamId: + enum: + - user + sudo: + properties: + origin: + type: string + enum: + - email-otp + - otp + - recovery-code + - totp + - webauthn + description: Possible step-up auth origins + verifiedAt: + type: number + expiresAt: + type: number + required: + - expiresAt + - origin + type: object + origin: type: string - description: 'When completing SAML Single Sign-On authentication, this will be the ID of the Team that was authenticated for.' - example: team_LLHUOMOoDlqOp8wPE4kFo9pE + enum: + - app + - apple + - bitbucket + - chatgpt + - email + - emu + - github + - github-webhook + - gitlab + - google + - invite + - manual + - otp + - passkey + - saml + - sms + - token-exchange-oidc + createdAt: + type: number + expiresAt: + type: number required: - - token - - email + - createdAt + - type type: object - '400': - description: |- - One of the provided values in the request query is invalid. - The slug is already in use - The provided token exists but is not yet confirmed - '403': - description: |- - You do not have permission to access this resource. - The verification sso token is invalid or not found - The verification token is invalid or not found - '404': - description: '' - parameters: - - name: email - description: Email to verify the login. - in: query - required: false - schema: - type: string - description: Email to verify the login. - - name: token - description: The token returned when the login was requested. - in: query - required: true - schema: - type: string - description: The token returned when the login was requested. - - name: tokenName - description: The desired name for the token. It will be displayed on the user account details. - in: query - required: false - schema: - type: string - example: Your Client App Name - description: The desired name for the token. It will be displayed on the user account details. - - name: ssoUserId - description: 'The SAML Profile ID, when connecting a SAML Profile to a Team member for the first time.' - in: query - required: false - schema: - type: string - description: 'The SAML Profile ID, when connecting a SAML Profile to a Team member for the first time.' - - name: teamName - description: The name of this user's team. - in: query - required: false - schema: - type: string - description: The name of this user's team. - - name: teamSlug - description: The slug for this user's team. - in: query - required: false - schema: - type: string - description: The slug for this user's team. - - name: teamPlan - description: The plan for this user's team (pro or hobby). - in: query - required: false - schema: - type: string - enum: - - pro - - hobby - description: The plan for this user's team (pro or hobby). - /registration: - post: - description: Request a new login for a user to get a token. This will respond with a verification token and send an email to confirm the request. Once confirmed you can use the verification token to get an authentication token. - operationId: emailLogin - security: [] - summary: Login with email - tags: - - authentication - responses: - '200': - description: The request was successful and an email was sent - content: - application/json: - schema: - properties: - token: + description: The access scopes granted to the token. + - properties: + type: + type: string + enum: + - team + teamId: type: string - description: The token used to verify the user accepted the login request - example: T1dmvPu36nmyYisXAs7IRzcR - securityCode: + origin: type: string - description: The code the user is going to receive on the email. **Must** be displayed to the user so they can verify the request is the correct. - example: Practical Saola + enum: + - app + - apple + - bitbucket + - chatgpt + - email + - emu + - github + - github-webhook + - gitlab + - google + - invite + - manual + - otp + - passkey + - saml + - sms + - token-exchange-oidc + createdAt: + type: number + expiresAt: + type: number required: - - token - - securityCode + - createdAt + - teamId + - type type: object - '400': - description: |- - One of the provided values in the request body is invalid. - The provided email is invalid because the owner is blocked - parameters: [] - requestBody: - content: - application/json: - schema: - properties: - email: - example: user@mail.com - description: The user email. - type: string - tokenName: - example: Your Client App Name - description: The desired name for the token. It will be displayed on the user account details. - type: string - required: - - email - type: object + description: The access scopes granted to the token. + type: array + description: The access scopes granted to the token. + createdAt: + type: number + description: Timestamp (in milliseconds) of when the token was created. + example: 1632816536002 + activeAt: + type: number + description: Timestamp (in milliseconds) of when the token was most recently used. + example: 1632816536002 + expiresAt: + type: number + description: Timestamp (in milliseconds) of when the token expires. + example: 1632816536002 + revokedAt: + type: number + description: Timestamp (in milliseconds) of when the token was revoked. + example: 1632816536002 + leakedAt: + type: number + description: Timestamp (in milliseconds) of when the token was marked as leaked. + example: 1632816536002 + leakedUrl: + type: string + description: URL where the token was discovered as leaked. + required: + - activeAt + - createdAt + - id + - name + - type + type: object + description: Authentication token metadata. + Pagination: + properties: + count: + type: number + description: Amount of items in the current page. + example: 20 + next: + nullable: true + type: number + description: Timestamp that must be used to request the next page. + example: 1540095775951 + prev: + nullable: true + type: number + description: Timestamp that must be used to request the previous page. + example: 1540095775951 + required: + - count + - next + - prev + type: object + description: This object contains information related to the pagination of the current request, including the necessary parameters to get the next or previous page of data. + APIKeyQuota: + description: AI Gateway quota associated with an API key. + type: object + properties: + quotaEntityId: + description: The unique identifier for the quota. + type: string + limitAmount: + description: The quota limit amount. + type: number + currentSpend: + description: The current amount spent against the quota. + type: number + currentByokSpend: + description: The current BYOK spend (tracked separately). + type: number + includeByokInQuota: + description: Whether BYOK (Bring Your Own Key) spend counts against the quota. + type: boolean + refreshPeriod: + description: How often the quota refreshes. + type: string + active: + description: Whether the quota is currently active. + type: boolean + archived: + description: Whether the quota has been archived. + type: boolean + alertThresholds: + description: Spend percentages (a subset of [50, 75, 100]) at which to send a spend alert. Empty or undefined disables alerts. + type: array + items: + type: number + createdAt: + description: Timestamp (in milliseconds) of when the quota was created. + type: number + updatedAt: + description: Timestamp (in milliseconds) of when the quota was last updated. + type: number + required: + - quotaEntityId + - limitAmount + - currentSpend + - currentByokSpend + - includeByokInQuota + - refreshPeriod + - active + - archived + - createdAt + - updatedAt + x-stackQL-resources: + api_keys: + id: vercel.authentication.api_keys + name: api_keys + title: Api Keys + methods: + create: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1api-keys/post' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + sqlVerbs: + select: [] + insert: + - $ref: '#/components/x-stackQL-resources/api_keys/methods/create' + update: [] + delete: [] + replace: [] + tokens: + id: vercel.authentication.tokens + name: tokens + title: Tokens + methods: + list: + operation: + $ref: '#/paths/~1v6~1user~1tokens/get' + response: + mediaType: application/json + openAPIDocKey: '200' + objectKey: $.tokens + request: + nativeCasing: camel + create: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v3~1user~1tokens/post' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + get: + operation: + $ref: '#/paths/~1v5~1user~1tokens~1{token_id}/get' + response: + mediaType: application/json + openAPIDocKey: '200' + objectKey: $.token + request: + nativeCasing: camel + delete: + operation: + $ref: '#/paths/~1v3~1user~1tokens~1{token_id}/delete' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/tokens/methods/get' + - $ref: '#/components/x-stackQL-resources/tokens/methods/list' + insert: + - $ref: '#/components/x-stackQL-resources/tokens/methods/create' + update: [] + delete: + - $ref: '#/components/x-stackQL-resources/tokens/methods/delete' + replace: [] +servers: + - url: https://api.vercel.com diff --git a/provider-dev/openapi/src/vercel/v00.00.00000/services/billing.yaml b/provider-dev/openapi/src/vercel/v00.00.00000/services/billing.yaml new file mode 100644 index 0000000..05b9177 --- /dev/null +++ b/provider-dev/openapi/src/vercel/v00.00.00000/services/billing.yaml @@ -0,0 +1,1571 @@ +openapi: 3.0.3 +info: + title: billing API + description: vercel billing API + version: 0.0.1 +paths: + /v1/billing/charges: + get: + description: 'Returns the billing charge data in FOCUS v1.3 JSONL format for a specified Vercel team, within a date range specified by `from` and `to` query parameters. Supports 1-day granularity with a maximum date range of 1 year. The response is streamed as newline-delimited JSON (JSONL) and can be optionally compressed with gzip if the `Accept-Encoding: gzip` header is provided. This is only available for Owner, Member, Developer, Security, Billing, and Enterprise Viewer roles for the supplied team.' + operationId: listBillingCharges + security: + - bearerToken: [] + summary: List FOCUS billing charges + tags: + - billing + responses: + '200': + description: '' + content: + application/jsonl: + schema: + properties: + BilledCost: + type: number + description: Charge amount serving as the basis for invoicing + BillingCurrency: + type: string + enum: + - USD + description: Currency used for billing (ISO 4217) + ChargeCategory: + type: string + enum: + - Adjustment + - Credit + - Purchase + - Tax + - Usage + description: Classification of the charge + ChargePeriodStart: + type: string + description: Inclusive start of the charge period (ISO 8601 UTC) + ChargePeriodEnd: + type: string + description: Exclusive end of the charge period (ISO 8601 UTC) - Required in v1.3 + ConsumedQuantity: + nullable: true + type: number + description: Volume of resource consumed. Null when a charge does not involve measurable consumption quantity. + ConsumedUnit: + nullable: true + type: string + description: Unit of measurement for consumed quantity. Null when the charge is not measured in units. + EffectiveCost: + type: number + description: Amortized cost representation including discounts, pre-commitment credit purchase amount, etc. + RegionId: + type: string + description: Provider-assigned region identifier + RegionName: + type: string + description: Display name for the region + ServiceName: + type: string + description: Display name for the service/product + ServiceCategory: + type: string + enum: + - AI and Machine Learning + - Analytics + - Business Applications + - Compute + - Databases + - Developer Tools + - Identity + - Integration + - Internet of Things + - Management and Governance + - Media + - Migration + - Mobile + - Multicloud + - Networking + - Other + - Security + - Storage + - Web + description: High-level category of the service + ServiceProviderName: + type: string + description: Entity making the resource/service available for purchase (v1.3) + Tags: + additionalProperties: + type: string + type: object + description: Charge metadata including the Vercel ProjectId and ProjectName information + PricingCategory: + type: string + enum: + - Committed + - Dynamic + - Other + - Standard + description: Pricing model used for the charge. + PricingCurrency: + type: string + enum: + - USD + PricingQuantity: + type: number + PricingUnit: + type: string + required: + - BilledCost + - BillingCurrency + - ChargeCategory + - ChargePeriodEnd + - ChargePeriodStart + - ConsumedQuantity + - ConsumedUnit + - EffectiveCost + - PricingCategory + - PricingCurrency + - PricingQuantity + - PricingUnit + - ServiceName + - ServiceProviderName + - Tags + type: object + description: Extension of the base schema for Focus charges. Includes pricing information for all customers. + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + '500': + description: '' + '503': + description: '' + parameters: + - name: from + description: Inclusive start of the date range as an ISO 8601 date-time string in UTC. + in: query + required: true + schema: + type: string + description: Inclusive start of the date range as an ISO 8601 date-time string in UTC. + example: '2025-01-01T00:00:00.000Z' + - name: to + description: Exclusive end of the date range as an ISO 8601 date-time string in UTC. + in: query + required: true + schema: + type: string + description: Exclusive end of the date range as an ISO 8601 date-time string in UTC. + example: '2025-01-31T00:00:00.000Z' + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + x-codeSamples: + - lang: curl + label: cURL + source: | + curl -N --request GET \ + --url 'https://api.vercel.com/v1/billing/charges?teamId=&from=&to=' \ + --header 'Authorization: Bearer ' \ + --header 'Accept-Encoding: gzip' \ + --compressed + /v1/billing/contract-commitments: + get: + description: Returns commitment allocations per contract period in FOCUS v1.3 JSONL format for a specified Vercel team. The response is streamed as newline-delimited JSON (JSONL). This endpoint is only applicable to Enterprise Vercel customers. An empty response is returned for non-Enterprise (Pro/Flex) customers. + operationId: listContractCommitments + security: + - bearerToken: [] + summary: List FOCUS contract commitments + tags: + - billing + responses: + '200': + description: '' + content: + application/jsonl: + schema: + properties: + ContractCommitmentCategory: + type: string + enum: + - Spend + - Usage + description: Highest-level classification of the contract commitment. 'Spend' for Pro ($20/month), 'Usage' for Enterprise (MIU allocation). + ContractCommitmentCost: + type: number + description: 'Monetary value of the contract commitment (in BillingCurrency). Required when ContractCommitmentCategory is ''Spend''. For Pro: 20 (USD)' + ContractCommitmentDescription: + type: string + description: Self-contained summary of the contract commitment's terms + ContractCommitmentId: + type: string + description: Unique identifier for a single contract term within a contract. Maps to specific commitment period or allocation ID. + ContractCommitmentPeriodStart: + type: string + description: Inclusive start of the commitment term period (ISO 8601 UTC) + ContractCommitmentPeriodEnd: + type: string + description: Exclusive end of the commitment term period (ISO 8601 UTC) + ContractCommitmentQuantity: + type: number + description: 'Amount associated with the commitment (in ContractCommitmentUnit). Required when ContractCommitmentCategory is ''Usage''. For Enterprise: MIU allocation amount.' + ContractCommitmentType: + type: string + description: Service-provider-assigned name identifying the commitment type. 'Pro' or 'Enterprise' for Vercel. + ContractCommitmentUnit: + type: string + description: Measurement unit for ContractCommitmentQuantity. 'MIUs' for Enterprise, 'USD' for Pro spend commitments. + ContractId: + type: string + description: Service-provider-assigned identifier for a contract. Maps to Orb Subscription ID for Vercel. + ContractPeriodStart: + type: string + description: Inclusive start of the overall contract period (ISO 8601 UTC) + ContractPeriodEnd: + type: string + description: Exclusive end of the overall contract period (ISO 8601 UTC) + BillingCurrency: + type: string + required: + - BillingCurrency + - ContractCommitmentCategory + - ContractCommitmentId + - ContractCommitmentPeriodEnd + - ContractCommitmentPeriodStart + - ContractCommitmentType + - ContractCommitmentUnit + - ContractId + - ContractPeriodEnd + - ContractPeriodStart + type: object + description: 'Contract commitment information describing terms within a contract. New in FOCUS v1.3 - tracks commitment terms separate from cost/usage rows. For Vercel: - Pro: $20 monthly spend commitment - Enterprise: MIU allocation per period (usage commitment)' + '400': + description: '' + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + parameters: + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + /v1/billing/buy: + post: + description: Purchases credits for a Vercel team using the default payment method on file. The purchase is charged immediately via Stripe invoice. Supported credit types are `v0`, `gateway`, and `agent`. The `amount` field specifies the number of credits to purchase and must be a positive integer. An optional `source` query parameter can be provided to identify the caller. Defaults to `api` if not specified. This is only available for Owner, Member, Developer, Security, and Billing roles for the supplied team. + operationId: buyCredits + security: + - bearerToken: [] + summary: Purchase credits + tags: + - billing + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + checkoutSessionId: + type: string + checkoutSessionUrl: + type: string + purchaseIntent: + properties: + id: + type: string + description: The unique ID of a Purchase Intent. Uses the format `pur_*` + configuration: + oneOf: + - properties: + options: + properties: + amount: + type: string + description: The amount of currency to buy + currency: + type: string + enum: + - ai_credits + - ai_gateway_credits + - copper_test_units + - v0_user_credits + - vercel_agent_credits + description: The currency being purchased + expirationDate: + type: string + description: The expiration date of the credits being purchased + required: + - amount + - currency + type: object + description: Purchase configuration specific options + output: + nullable: true + type: + type: string + enum: + - credit_topup + required: + - options + - output + - type + type: object + description: The configuration for a credit purchase + - properties: + options: + properties: + items: + items: + properties: + name: + type: string + subtotal: + type: string + description: The subtotal of the domain name purchase + type: + type: string + enum: + - purchase + - renewal + - transfer + years: + type: number + description: The number of years to purchase + required: + - name + - subtotal + - type + - years + type: object + type: array + orderId: + type: string + description: The order ID of the domain name purchase + required: + - items + - orderId + type: object + output: + nullable: true + type: + type: string + enum: + - domain_name + required: + - options + - output + - type + type: object + description: The configuration for a credit purchase + - properties: + options: + properties: + effectiveDate: + oneOf: + - type: string + description: The effective date of the plan change (opaque JSON object) + - type: string + enum: + - end_of_subscription_term + - immediate + orbSubscriptionId: + type: string + description: The ID of the Orb subscription to change + alignBillingWithPlanChangeDate: + type: boolean + enum: + - false + - true + description: Whether or not to reset the billing cycle + couponRedemptionCode: + type: string + description: The coupon redemption code to apply to the plan change + externalPlanId: + type: string + description: The ID of the external plan to change to + replacePrices: + items: + properties: + fixedPriceQuantity: + type: number + description: The quantity for the fixed price + replacesPriceId: + type: string + description: The ID of the price to replace + required: + - fixedPriceQuantity + - replacesPriceId + type: object + description: The prices to replace in the subscription + type: array + description: The prices to replace in the subscription + required: + - effectiveDate + - orbSubscriptionId + type: object + output: + properties: + pendingSubscriptionChangeId: + type: string + description: The ID of the pending subscription change + required: + - pendingSubscriptionChangeId + type: object + type: + type: string + enum: + - orb_plan_change + required: + - options + - output + - type + type: object + description: The configuration for a credit purchase + - properties: + options: + type: string + description: (opaque JSON object) + output: + properties: + pendingSubscriptionChangeId: + type: string + description: The ID of the pending subscription change + required: + - pendingSubscriptionChangeId + type: object + type: + type: string + enum: + - orb_price_interval + required: + - options + - output + - type + type: object + description: The configuration for a credit purchase + - properties: + options: + properties: + externalPlanId: + type: string + description: The external plan ID of the Orb plan to subscribe to + addPrices: + items: + oneOf: + - properties: + priceId: + type: string + description: The ID of the price to add + required: + - priceId + type: object + description: The prices to add to the subscription + - type: string + description: The prices to add to the subscription (opaque JSON object) + type: array + description: The prices to add to the subscription + alignBillingWithSubscriptionStartDate: + type: boolean + enum: + - false + - true + description: Whether to align the subscription start date with the billing subscription start date + couponRedemptionCode: + type: string + description: The coupon redemption code to apply to the subscription + initialPhaseOrder: + type: number + description: The initial phase order to use for the subscription + metadata: + additionalProperties: + nullable: true + type: string + description: Optional metadata to associate with the subscription + type: object + description: Optional metadata to associate with the subscription + removePrices: + items: + properties: + priceId: + type: string + description: The ID of the price to remove + required: + - priceId + type: object + description: The prices to remove in the subscription + type: array + description: The prices to remove in the subscription + replacePrices: + items: + properties: + fixedPriceQuantity: + type: number + description: The quantity for the fixed price + replacesPriceId: + type: string + description: The ID of the price to replace + required: + - fixedPriceQuantity + - replacesPriceId + type: object + description: The prices to replace in the subscription + type: array + description: The prices to replace in the subscription + startDate: + type: string + description: The start date of the subscription + required: + - externalPlanId + type: object + output: + properties: + pendingSubscriptionChangeId: + type: string + description: The ID of the pending subscription change + required: + - pendingSubscriptionChangeId + type: object + type: + type: string + enum: + - orb_subscription + required: + - options + - output + - type + type: object + description: The configuration for a credit purchase + - properties: + options: + properties: + orbCustomerId: + type: string + description: The ID of the Orb customer to create + orbExternalCustomerId: + type: string + description: The external ID of the Orb customer to create + orbExternalPlanId: + type: string + description: The external ID of the Orb plan to create + orbPlanId: + type: string + description: The ID of the Orb plan to create + orbSubscriptionId: + type: string + description: The ID of the Orb subscription to create + lineItems: + items: + properties: + id: + type: string + description: The ID of the line item + description: + type: string + description: The description of the line item + name: + type: string + description: The name of the line item + productId: + type: string + description: The ID of the product being purchased + quantity: + type: string + description: The quantity of the line item + unitAmount: + type: string + description: The unit amount of the line item + metadata: + additionalProperties: + type: string + type: object + description: Optional metadata for the line item + productAlias: + type: string + description: The alias of the product being purchased + refund: + type: string + description: The amount of the line item that has been refunded + required: + - description + - id + - name + - productId + - quantity + - unitAmount + type: object + description: The line items that make up the Purchase Intent. + type: array + description: The line items that make up the Purchase Intent. + orbPendingSubscriptionChangeId: + type: string + description: The ID of the pending subscription change + required: + - orbCustomerId + - orbExternalCustomerId + - orbExternalPlanId + - orbPlanId + - orbSubscriptionId + type: object + output: + properties: + pendingSubscriptionChangeId: + type: string + description: The ID of the pending subscription change + type: object + type: + type: string + enum: + - orb_subscription_intent + required: + - options + - output + - type + type: object + description: The configuration for a credit purchase + - properties: + options: + properties: + planId: + type: string + description: The ID of the plan to subscribe to + fromPlan: + properties: + currentCycleEndDate: + type: string + description: The end of the current plan billing cycle + orbSubscriptionId: + type: string + description: The Orb subscription ID currently active for the owner on the source plan + planId: + type: string + description: The ID of the plan currently assigned + planItemQuantities: + items: + properties: + planItemId: + type: string + description: The ID of the current plan item to set the quantity for + quantity: + type: number + description: The nonnegative integer quantity for the current plan item + resourceIds: + items: + type: string + type: array + description: The resource IDs associated with the current plan item quantity + required: + - planItemId + - quantity + type: object + description: The current plan item quantities + type: array + description: The current plan item quantities + rateVariantKey: + type: string + description: The rate variant currently assigned + required: + - currentCycleEndDate + - orbSubscriptionId + - planId + type: object + description: The current plan being replaced by this purchase + planItemQuantities: + items: + properties: + planItemId: + type: string + description: The ID of the plan item to set the quantity for + quantity: + type: number + description: The nonnegative integer quantity for the plan item + resourceIds: + items: + type: string + type: array + description: The resource IDs to associate with the plan item quantity + required: + - planItemId + - quantity + type: object + description: The plan item quantities to set for the subscription + type: array + description: The plan item quantities to set for the subscription + rateVariantKey: + type: string + description: The rate variant key to apply to the subscription + required: + - planId + type: object + description: Purchase configuration specific options + output: + properties: + planChangeId: + type: string + description: The committed Plan revision used to calculate the purchase price + type: object + type: + type: string + enum: + - subscription + required: + - options + - output + - type + type: object + description: The configuration for a credit purchase + createdAt: + type: string + description: The datetime when the Purchase Intent was created. + currency: + type: string + enum: + - miu + - usd + description: The currency for the purchase intent + ownerId: + type: string + description: The ID of the owner of the Purchase Intent. + provider: + properties: + resourceId: + type: string + description: Provider resource id + type: + type: string + enum: + - apple_in_app_purchase + - orb_ledger + - stripe_elements + - stripe_hosted + - stripe_invoice_deferred + - stripe_invoice_elements + - stripe_invoice_immediate + - tackle_aws_marketplace + description: The type of the purchase provider + currencyConversionRate: + type: string + description: The currency conversion rate used by the provider + stripeSharedPaymentTokenUsed: + type: boolean + enum: + - false + - true + description: Whether a Stripe Shared Payment Token was used for this purchase. Only applicable when type is stripe_invoice_immediate. + required: + - resourceId + - type + type: object + status: + type: string + enum: + - failed + - pending + - succeeded + description: The status of the Purchase Intent. + subtotal: + type: string + description: The subtotal of the Purchase Intent. + tax: + type: string + description: The tax due on the Purchase Intent. + total: + type: string + description: The total balance due on the Purchase Intent. + updatedAt: + type: string + description: The datetime when the Purchase Intent was last updated. + dispute: + properties: + id: + type: string + description: The unique ID of the dispute entity. + amount: + type: string + description: The disputed amount. + createdAt: + type: string + description: When the dispute was first recorded. + currency: + type: string + description: The dispute currency. + providerId: + type: string + description: The external provider dispute ID (e.g. Stripe dispute ID). + reason: + nullable: true + type: string + description: The dispute reason. + status: + type: string + description: The dispute status. + updatedAt: + type: string + description: When the dispute was last updated. + required: + - amount + - createdAt + - currency + - id + - providerId + - reason + - status + - updatedAt + type: object + description: The dispute details, if any. + lineItems: + items: + properties: + id: + type: string + description: The ID of the line item + description: + type: string + description: The description of the line item + name: + type: string + description: The name of the line item + productId: + type: string + description: The ID of the product being purchased + quantity: + type: string + description: The quantity of the line item + unitAmount: + type: string + description: The unit amount of the line item + metadata: + additionalProperties: + type: string + type: object + description: Optional metadata for the line item + productAlias: + type: string + description: The alias of the product being purchased + refund: + type: string + description: The amount of the line item that has been refunded + required: + - description + - id + - name + - productId + - quantity + - unitAmount + type: object + description: The line items that make up the Purchase Intent. + type: array + description: The line items that make up the Purchase Intent. + metadata: + additionalProperties: + type: string + type: object + description: Optional metadata associated with the purchase intent + refund: + type: string + description: The amount of the purchase intent that has been refunded + returnUrl: + type: string + description: The URL to redirect to after the purchase is complete + required: + - configuration + - createdAt + - currency + - id + - ownerId + - provider + - status + - subtotal + - tax + - total + - updatedAt + type: object + description: The created purchase intent + orbSubscriptionIntent: + properties: + id: + type: string + description: The ID of the Orb subscription intent with the format `orbsubint_`. + configuration: + oneOf: + - properties: + options: + properties: + productAlias: + type: string + description: The alias of the product to set quantity for. + quantity: + type: number + description: The quantity to set for the plan item. + resourceIds: + items: + type: string + type: array + description: The resource IDs for the plan item. Only set if SKU requires resource entitlements. + required: + - productAlias + - quantity + type: object + description: Configuration input options for setting plan item quantity. + output: + properties: + effectiveBehavior: + type: string + enum: + - end_of_term + - immediate + description: When the subscription change should take effect. + orbPriceId: + type: string + description: The Orb price ID for the subscription item being modified. + pricingSource: + type: string + enum: + - copper + - orb + description: The source used as the authoritative price for this intent. + productId: + type: string + description: The product ID associated with this intent. + changedResources: + items: + properties: + productAlias: + type: string + description: The alias of the product that was changed. + productId: + type: string + description: The ID of the product that was changed. + quantity: + type: number + description: The resulting quantity after this change. + addedResourceIds: + items: + type: string + type: array + description: Resource IDs that were added. + effectiveAt: + type: string + description: When this resource change should take effect for downstream consumers. + removedResourceIds: + items: + type: string + type: array + description: Resource IDs that were removed. + resourceIds: + items: + type: string + type: array + description: The full set of resource IDs after the change. + required: + - productAlias + - productId + - quantity + type: object + description: Resources that were changed as part of this intent. Tracks all logical changes including the primary change and any side effects. + type: array + description: Resources that were changed as part of this intent. Tracks all logical changes including the primary change and any side effects. + metadata: + additionalProperties: + type: string + type: object + description: Optional metadata associated with the intent to update the Orb subscription with. + pendingSubscriptionChangeId: + type: string + description: The ID of the pending subscription change if there is one. + required: + - effectiveBehavior + - orbPriceId + - pricingSource + - productId + type: object + description: Output returned after configuring an OrbSubscriptionIntent. + type: + type: string + enum: + - set_plan_item_quantity + required: + - options + - output + - type + type: object + description: Configuration for the Orb subscription intent. + - properties: + options: + properties: + productAlias: + type: string + description: The alias of the product to increase quantity for. + resourceIds: + items: + type: string + type: array + description: The resource IDs to incrementally add. The quantity of the plan item will be increased by the number of resource IDs. + required: + - productAlias + - resourceIds + type: object + description: Configuration input options for increasing plan item quantity. + output: + properties: + effectiveBehavior: + type: string + enum: + - end_of_term + - immediate + description: When the subscription change should take effect. + orbPriceId: + type: string + description: The Orb price ID for the subscription item being modified. + pricingSource: + type: string + enum: + - copper + - orb + description: The source used as the authoritative price for this intent. + productId: + type: string + description: The product ID associated with this intent. + changedResources: + items: + properties: + productAlias: + type: string + description: The alias of the product that was changed. + productId: + type: string + description: The ID of the product that was changed. + quantity: + type: number + description: The resulting quantity after this change. + addedResourceIds: + items: + type: string + type: array + description: Resource IDs that were added. + effectiveAt: + type: string + description: When this resource change should take effect for downstream consumers. + removedResourceIds: + items: + type: string + type: array + description: Resource IDs that were removed. + resourceIds: + items: + type: string + type: array + description: The full set of resource IDs after the change. + required: + - productAlias + - productId + - quantity + type: object + description: Resources that were changed as part of this intent. Tracks all logical changes including the primary change and any side effects. + type: array + description: Resources that were changed as part of this intent. Tracks all logical changes including the primary change and any side effects. + metadata: + additionalProperties: + type: string + type: object + description: Optional metadata associated with the intent to update the Orb subscription with. + pendingSubscriptionChangeId: + type: string + description: The ID of the pending subscription change if there is one. + required: + - effectiveBehavior + - orbPriceId + - pricingSource + - productId + type: object + description: Output returned after configuring an OrbSubscriptionIntent. + type: + type: string + enum: + - increase_plan_item_quantity + required: + - options + - output + - type + type: object + description: Configuration for the Orb subscription intent. + - properties: + options: + properties: + productAlias: + type: string + description: The alias of the product to decrease quantity for. + resourceIds: + items: + type: string + type: array + description: The resource IDs to decrementally remove. The quantity of the plan item will be decreased by the number of resource IDs. + required: + - productAlias + - resourceIds + type: object + description: Configuration input options for decreasing plan item quantity. + output: + properties: + effectiveBehavior: + type: string + enum: + - end_of_term + - immediate + description: When the subscription change should take effect. + orbPriceId: + type: string + description: The Orb price ID for the subscription item being modified. + pricingSource: + type: string + enum: + - copper + - orb + description: The source used as the authoritative price for this intent. + productId: + type: string + description: The product ID associated with this intent. + changedResources: + items: + properties: + productAlias: + type: string + description: The alias of the product that was changed. + productId: + type: string + description: The ID of the product that was changed. + quantity: + type: number + description: The resulting quantity after this change. + addedResourceIds: + items: + type: string + type: array + description: Resource IDs that were added. + effectiveAt: + type: string + description: When this resource change should take effect for downstream consumers. + removedResourceIds: + items: + type: string + type: array + description: Resource IDs that were removed. + resourceIds: + items: + type: string + type: array + description: The full set of resource IDs after the change. + required: + - productAlias + - productId + - quantity + type: object + description: Resources that were changed as part of this intent. Tracks all logical changes including the primary change and any side effects. + type: array + description: Resources that were changed as part of this intent. Tracks all logical changes including the primary change and any side effects. + metadata: + additionalProperties: + type: string + type: object + description: Optional metadata associated with the intent to update the Orb subscription with. + pendingSubscriptionChangeId: + type: string + description: The ID of the pending subscription change if there is one. + required: + - effectiveBehavior + - orbPriceId + - pricingSource + - productId + type: object + description: Output returned after configuring an OrbSubscriptionIntent. + type: + type: string + enum: + - decrease_plan_item_quantity + required: + - options + - output + - type + type: object + description: Configuration for the Orb subscription intent. + - properties: + options: + properties: + addedResourceIds: + items: + type: string + type: array + description: The resource IDs to incrementally add. The quantity of the plan item will be increased by the number of resource IDs. + productAlias: + type: string + description: The alias of the product to adjust quantity for. + removedResourceIds: + items: + type: string + type: array + description: The resource IDs to incrementally remove. The quantity of the plan item will be decreased by the number of resource IDs. + required: + - addedResourceIds + - productAlias + - removedResourceIds + type: object + description: Configuration input options for adjusting plan item quantity. + output: + properties: + effectiveBehavior: + type: string + enum: + - end_of_term + - immediate + description: When the subscription change should take effect. + orbPriceId: + type: string + description: The Orb price ID for the subscription item being modified. + pricingSource: + type: string + enum: + - copper + - orb + description: The source used as the authoritative price for this intent. + productId: + type: string + description: The product ID associated with this intent. + changedResources: + items: + properties: + productAlias: + type: string + description: The alias of the product that was changed. + productId: + type: string + description: The ID of the product that was changed. + quantity: + type: number + description: The resulting quantity after this change. + addedResourceIds: + items: + type: string + type: array + description: Resource IDs that were added. + effectiveAt: + type: string + description: When this resource change should take effect for downstream consumers. + removedResourceIds: + items: + type: string + type: array + description: Resource IDs that were removed. + resourceIds: + items: + type: string + type: array + description: The full set of resource IDs after the change. + required: + - productAlias + - productId + - quantity + type: object + description: Resources that were changed as part of this intent. Tracks all logical changes including the primary change and any side effects. + type: array + description: Resources that were changed as part of this intent. Tracks all logical changes including the primary change and any side effects. + metadata: + additionalProperties: + type: string + type: object + description: Optional metadata associated with the intent to update the Orb subscription with. + pendingSubscriptionChangeId: + type: string + description: The ID of the pending subscription change if there is one. + required: + - effectiveBehavior + - orbPriceId + - pricingSource + - productId + type: object + description: Output returned after configuring an OrbSubscriptionIntent. + type: + type: string + enum: + - adjust_plan_item_quantity + required: + - options + - output + - type + type: object + description: Configuration for the Orb subscription intent. + createdAt: + type: string + description: The ISO 8601 date-time that the intent was created. + orbSubscriptionId: + type: string + description: The Orb subscription ID this intent is associated with. + orbUpdate: + oneOf: + - properties: + mode: + type: string + enum: + - sync + required: + - mode + type: object + description: How the subscription change is applied to Orb. + - properties: + mode: + type: string + enum: + - async + status: + type: string + enum: + - canceled + - failed + - pending + - running + required: + - mode + - status + type: object + description: How the subscription change is applied to Orb. + - properties: + appliedAt: + type: string + description: The ISO 8601 date-time that the subscription change was applied to Orb. + mode: + type: string + enum: + - async + status: + type: string + enum: + - succeeded + required: + - appliedAt + - mode + - status + type: object + description: How the subscription change is applied to Orb. + ownerId: + type: string + description: The owner ID for this intent (e.g., team or user ID). + status: + type: string + enum: + - failed + - pending + - succeeded + description: The status of the Orb subscription intent. + updatedAt: + type: string + description: The ISO 8601 date-time that the intent was last updated. + purchaseIntentId: + type: string + description: Optional purchase intent ID if this is associated with a purchase. + required: + - configuration + - createdAt + - id + - orbSubscriptionId + - orbUpdate + - ownerId + - status + - updatedAt + type: object + required: + - checkoutSessionId + - checkoutSessionUrl + - purchaseIntent + - orbSubscriptionIntent + type: object + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '402': + description: '' + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '409': + description: '' + '410': + description: '' + '500': + description: '' + parameters: + - name: source + description: The source of the purchase request. Defaults to `api` if not specified. + in: query + schema: + type: string + description: The source of the purchase request. Defaults to `api` if not specified. + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + requestBody: + required: true + content: + application/json: + schema: + type: object + required: + - item + properties: + item: + type: object + required: + - type + - creditType + - amount + properties: + type: + type: string + enum: + - credits + description: The type of item to purchase. + creditType: + type: string + enum: + - v0 + - gateway + - agent + description: The type of credits to purchase. + amount: + type: integer + minimum: 1 + description: The amount of credits to purchase. + x-codeSamples: + - lang: curl + label: cURL + source: | + curl --request POST \ + --url 'https://api.vercel.com/v1/billing/buy?teamId=' \ + --header 'Authorization: Bearer ' \ + --header 'Content-Type: application/json' \ + --data '{"item":{"type":"credits","creditType":"v0","amount":100}}' +components: + x-stackQL-resources: + charges: + id: vercel.billing.charges + name: charges + title: Charges + methods: + list: + operation: + $ref: '#/paths/~1v1~1billing~1charges/get' + response: + mediaType: text/plain + openAPIDocKey: '200' + overrideMediaType: application/json + schema_override: + $ref: '#/components/schemas/StackqlTextResponse' + objectKey: $.items + transform: + type: golang_template_text_v0.3.0 + body: '{"items":[{"contents": {{ toJson . }}}]}' + request: + nativeCasing: camel + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/charges/methods/list' + insert: [] + update: [] + delete: [] + replace: [] + contract_commitments: + id: vercel.billing.contract_commitments + name: contract_commitments + title: Contract Commitments + methods: + list: + operation: + $ref: '#/paths/~1v1~1billing~1contract-commitments/get' + response: + mediaType: text/plain + openAPIDocKey: '200' + overrideMediaType: application/json + schema_override: + $ref: '#/components/schemas/StackqlTextResponse' + objectKey: $.items + transform: + type: golang_template_text_v0.3.0 + body: '{"items":[{"contents": {{ toJson . }}}]}' + request: + nativeCasing: camel + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/contract_commitments/methods/list' + insert: [] + update: [] + delete: [] + replace: [] + credits: + id: vercel.billing.credits + name: credits + title: Credits + methods: + buy: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v1~1billing~1buy/post' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + sqlVerbs: + select: [] + insert: [] + update: [] + delete: [] + replace: [] + schemas: + StackqlTextResponse: + type: object + description: 'Wrapper for non-JSON response bodies (jsonl, ndjson, streamed json, octet-stream): one row carrying the raw body text.' + properties: + items: + type: array + items: + type: object + properties: + contents: + type: string + description: Raw response body. +servers: + - url: https://api.vercel.com diff --git a/provider-dev/openapi/src/vercel/v00.00.00000/services/billing_settings.yaml b/provider-dev/openapi/src/vercel/v00.00.00000/services/billing_settings.yaml deleted file mode 100644 index 1a3d05b..0000000 --- a/provider-dev/openapi/src/vercel/v00.00.00000/services/billing_settings.yaml +++ /dev/null @@ -1,79 +0,0 @@ -openapi: 3.0.3 -servers: - - url: 'https://api.vercel.com' - description: Production API -info: - contact: - email: support@vercel.com - name: Vercel Support - url: 'https://vercel.com/support' - version: 0.0.1 - title: Vercel API - billing_settings - description: billing_settings -components: - schemas: {} - responses: {} - securitySchemes: - bearerToken: - type: http - description: Default authentication mechanism - scheme: bearer - oauth2: - type: oauth2 - flows: - authorizationCode: - authorizationUrl: 'https://api.vercel.com/oauth/authorize' - tokenUrl: 'https://api.vercel.com/oauth/access_token' - scopes: {} - x-stackQL-resources: - data_cache: - id: vercel.billing_settings.data_cache - name: data_cache - title: Data Cache - methods: - enable_excess_billing: - operation: - $ref: '#/paths/~1data-cache~1billing-settings/patch' - response: - mediaType: application/json - openAPIDocKey: '200' - sqlVerbs: - select: [] - insert: [] - update: [] - delete: [] -paths: - /data-cache/billing-settings: - patch: - description: '' - operationId: enableExcessBilling - security: [] - tags: - - billing_settings - responses: - '200': - description: '' - content: - application/json: - schema: - properties: - excessBillingEnabled: - type: boolean - type: object - '400': - description: One of the provided values in the request body is invalid. - '401': - description: '' - '403': - description: You do not have permission to access this resource. - '404': - description: '' - parameters: [] - requestBody: - content: - application/json: - schema: - type: object - properties: - excessBillingEnabled: - type: boolean diff --git a/provider-dev/openapi/src/vercel/v00.00.00000/services/bulk_redirects.yaml b/provider-dev/openapi/src/vercel/v00.00.00000/services/bulk_redirects.yaml new file mode 100644 index 0000000..485211d --- /dev/null +++ b/provider-dev/openapi/src/vercel/v00.00.00000/services/bulk_redirects.yaml @@ -0,0 +1,983 @@ +openapi: 3.0.3 +info: + title: bulk_redirects API + description: vercel bulk_redirects API + version: 0.0.1 +paths: + /v1/bulk-redirects: + put: + description: Stages new redirects for a project and returns the new version. + operationId: stageRedirects + security: + - bearerToken: [] + summary: Stages new redirects for a project. + tags: + - bulk-redirects + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + alias: + nullable: true + type: string + version: + properties: + id: + type: string + description: The unique identifier for the version. + key: + type: string + description: The key of the version. The key may be duplicated across versions if the contents are the same as a different version. + lastModified: + type: number + createdBy: + type: string + name: + type: string + description: Optional name for the version. If not provided, defaults to an ISO timestamp string. + isStaging: + type: boolean + enum: + - false + - true + description: Whether this version has not been promoted to production yet and is not serving end users. + isLive: + type: boolean + enum: + - false + - true + description: Whether this version is currently live in production. + redirectCount: + type: number + description: The number of redirects in this version. + alias: + type: string + description: The staging link for previewing redirects in this version. + required: + - createdBy + - id + - key + - lastModified + type: object + required: + - alias + - version + type: object + '400': + description: One of the provided values in the request body is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '410': + description: '' + '500': + description: '' + parameters: + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + requestBody: + content: + application/json: + schema: + type: object + required: + - projectId + - teamId + properties: + projectId: + type: string + teamId: + type: string + overwrite: + type: boolean + name: + type: string + maxLength: 256 + redirects: + type: array + default: [] + items: + type: object + required: + - source + - destination + properties: + source: + type: string + maxLength: 2048 + destination: + type: string + maxLength: 2048 + statusCode: + oneOf: + - type: number + - type: string + permanent: + type: boolean + caseSensitive: + type: boolean + query: + type: boolean + preserveQueryParams: + type: boolean + get: + description: Get the version history for a project's bulk redirects + operationId: getRedirects + security: + - bearerToken: [] + summary: Gets project-level redirects. + tags: + - bulk-redirects + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + version: + properties: + id: + type: string + description: The unique identifier for the version. + key: + type: string + description: The key of the version. The key may be duplicated across versions if the contents are the same as a different version. + lastModified: + type: number + createdBy: + type: string + name: + type: string + description: Optional name for the version. If not provided, defaults to an ISO timestamp string. + isStaging: + type: boolean + enum: + - false + - true + description: Whether this version has not been promoted to production yet and is not serving end users. + isLive: + type: boolean + enum: + - false + - true + description: Whether this version is currently live in production. + redirectCount: + type: number + description: The number of redirects in this version. + alias: + type: string + description: The staging link for previewing redirects in this version. + required: + - createdBy + - id + - key + - lastModified + type: object + redirects: + items: + properties: + statusCode: + type: number + permanent: + type: boolean + enum: + - false + - true + sensitive: + type: boolean + enum: + - false + - true + caseSensitive: + type: boolean + enum: + - false + - true + query: + type: boolean + enum: + - false + - true + preserveQueryParams: + type: boolean + enum: + - false + - true + destination: + type: string + source: + type: string + required: + - destination + - source + type: object + type: array + pagination: + properties: + page: + type: number + per_page: + type: number + numPages: + type: number + required: + - numPages + - page + - per_page + type: object + required: + - pagination + - redirects + - version + type: object + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + parameters: + - name: projectId + in: query + required: true + schema: + type: string + - name: versionId + in: query + required: false + schema: + type: string + - name: q + in: query + required: false + schema: + type: string + - name: diff + in: query + required: false + schema: + oneOf: + - type: boolean + - type: string + enum: + - only + - name: page + in: query + required: false + schema: + type: integer + minimum: 1 + - name: per_page + in: query + required: false + schema: + type: integer + minimum: 10 + maximum: 250 + - name: sort_by + in: query + required: false + schema: + type: string + enum: + - source + - destination + - statusCode + - name: sort_order + in: query + required: false + schema: + type: string + enum: + - asc + - desc + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + delete: + description: Deletes the provided redirects from the latest version of the projects' bulk redirects. Stages a new change with the new redirects and returns the alias for the new version in the response. + operationId: deleteRedirects + security: + - bearerToken: [] + summary: Delete project-level redirects. + tags: + - bulk-redirects + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + alias: + type: string + version: + properties: + id: + type: string + description: The unique identifier for the version. + key: + type: string + description: The key of the version. The key may be duplicated across versions if the contents are the same as a different version. + lastModified: + type: number + createdBy: + type: string + name: + type: string + description: Optional name for the version. If not provided, defaults to an ISO timestamp string. + isStaging: + type: boolean + enum: + - false + - true + description: Whether this version has not been promoted to production yet and is not serving end users. + isLive: + type: boolean + enum: + - false + - true + description: Whether this version is currently live in production. + redirectCount: + type: number + description: The number of redirects in this version. + alias: + type: string + description: The staging link for previewing redirects in this version. + required: + - createdBy + - id + - key + - lastModified + type: object + required: + - version + - alias + type: object + '400': + description: |- + One of the provided values in the request body is invalid. + One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + '500': + description: '' + parameters: + - name: projectId + in: query + required: true + schema: + type: string + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + requestBody: + content: + application/json: + schema: + type: object + properties: + name: + type: string + maxLength: 256 + redirects: + description: The redirects to delete. The source of the redirect is used to match the redirect to delete. + type: array + minItems: 1 + items: + type: string + required: + - redirects + patch: + description: Edits a single redirect identified by its source path. Stages a new change with the modified redirect and returns the alias for the new version in the response. + operationId: editRedirect + security: + - bearerToken: [] + summary: Edit a project-level redirect. + tags: + - bulk-redirects + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + alias: + nullable: true + type: string + version: + properties: + id: + type: string + description: The unique identifier for the version. + key: + type: string + description: The key of the version. The key may be duplicated across versions if the contents are the same as a different version. + lastModified: + type: number + createdBy: + type: string + name: + type: string + description: Optional name for the version. If not provided, defaults to an ISO timestamp string. + isStaging: + type: boolean + enum: + - false + - true + description: Whether this version has not been promoted to production yet and is not serving end users. + isLive: + type: boolean + enum: + - false + - true + description: Whether this version is currently live in production. + redirectCount: + type: number + description: The number of redirects in this version. + alias: + type: string + description: The staging link for previewing redirects in this version. + required: + - createdBy + - id + - key + - lastModified + type: object + required: + - alias + - version + type: object + '400': + description: |- + One of the provided values in the request body is invalid. + One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + '500': + description: '' + parameters: + - name: projectId + in: query + required: true + schema: + type: string + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + requestBody: + content: + application/json: + schema: + type: object + properties: + name: + type: string + maxLength: 256 + redirect: + description: The redirect object to edit. The source field is used to match the redirect to modify. + type: object + properties: + source: + type: string + destination: + type: string + statusCode: + type: number + permanent: + type: boolean + caseSensitive: + type: boolean + query: + type: boolean + preserveQueryParams: + type: boolean + required: + - source + additionalProperties: false + restore: + description: If true, restores the redirect from the latest production version to staging. + type: boolean + required: + - redirect + /v1/bulk-redirects/restore: + post: + description: Restores the provided redirects in the staging version to the value in the production version. If no production version exists, removes the redirects from staging. + operationId: restoreRedirects + security: + - bearerToken: [] + summary: Restore staged project-level redirects to their production version. + tags: + - bulk-redirects + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + version: + properties: + id: + type: string + description: The unique identifier for the version. + key: + type: string + description: The key of the version. The key may be duplicated across versions if the contents are the same as a different version. + lastModified: + type: number + createdBy: + type: string + name: + type: string + description: Optional name for the version. If not provided, defaults to an ISO timestamp string. + isStaging: + type: boolean + enum: + - false + - true + description: Whether this version has not been promoted to production yet and is not serving end users. + isLive: + type: boolean + enum: + - false + - true + description: Whether this version is currently live in production. + redirectCount: + type: number + description: The number of redirects in this version. + alias: + type: string + description: The staging link for previewing redirects in this version. + required: + - createdBy + - id + - key + - lastModified + type: object + restored: + items: + type: string + type: array + failedToRestore: + items: + type: string + type: array + required: + - failedToRestore + - restored + - version + type: object + '400': + description: |- + One of the provided values in the request body is invalid. + One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + '500': + description: '' + parameters: + - name: projectId + in: query + required: true + schema: + type: string + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + requestBody: + content: + application/json: + schema: + type: object + properties: + name: + type: string + maxLength: 256 + redirects: + description: The redirects to restore. The source of the redirect is used to match the redirect to restore. + type: array + minItems: 1 + maxItems: 100 + items: + type: string + required: + - redirects + /v1/bulk-redirects/versions: + get: + description: Get the version history for a project's bulk redirects + operationId: getVersions + security: + - bearerToken: [] + summary: Get the version history for a project's redirects. + tags: + - bulk-redirects + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + versions: + items: + properties: + id: + type: string + description: The unique identifier for the version. + key: + type: string + description: The key of the version. The key may be duplicated across versions if the contents are the same as a different version. + lastModified: + type: number + createdBy: + type: string + name: + type: string + description: Optional name for the version. If not provided, defaults to an ISO timestamp string. + isStaging: + type: boolean + enum: + - false + - true + description: Whether this version has not been promoted to production yet and is not serving end users. + isLive: + type: boolean + enum: + - false + - true + description: Whether this version is currently live in production. + redirectCount: + type: number + description: The number of redirects in this version. + alias: + type: string + description: The staging link for previewing redirects in this version. + required: + - createdBy + - id + - key + - lastModified + type: object + type: array + required: + - versions + type: object + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '410': + description: '' + '500': + description: '' + parameters: + - name: projectId + in: query + required: true + schema: + type: string + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + post: + description: Update a version by promoting staging to production or restoring a previous production version + operationId: updateVersion + security: + - bearerToken: [] + summary: Promote a staging version to production or restore a previous production version. + tags: + - bulk-redirects + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + version: + properties: + id: + type: string + description: The unique identifier for the version. + key: + type: string + description: The key of the version. The key may be duplicated across versions if the contents are the same as a different version. + lastModified: + type: number + createdBy: + type: string + name: + type: string + description: Optional name for the version. If not provided, defaults to an ISO timestamp string. + isStaging: + type: boolean + enum: + - false + - true + description: Whether this version has not been promoted to production yet and is not serving end users. + isLive: + type: boolean + enum: + - false + - true + description: Whether this version is currently live in production. + redirectCount: + type: number + description: The number of redirects in this version. + alias: + type: string + description: The staging link for previewing redirects in this version. + required: + - createdBy + - id + - key + - lastModified + type: object + required: + - version + type: object + '400': + description: |- + One of the provided values in the request body is invalid. + One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + '500': + description: '' + parameters: + - name: projectId + in: query + required: true + schema: + type: string + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + requestBody: + content: + application/json: + schema: + type: object + required: + - id + - action + properties: + id: + type: string + action: + type: string + enum: + - promote + - restore + - discard + name: + type: string + maxLength: 256 +components: + x-stackQL-resources: + redirects: + id: vercel.bulk_redirects.redirects + name: redirects + title: Redirects + methods: + stage: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v1~1bulk-redirects/put' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + list: + operation: + $ref: '#/paths/~1v1~1bulk-redirects/get' + response: + mediaType: application/json + openAPIDocKey: '200' + objectKey: $.redirects + request: + nativeCasing: camel + config: + pagination: + algorithm: page_number + requestToken: + key: page + location: query + responseToken: + key: $.pagination.page + location: body + responseTerminator: + key: $.pagination.numPages + location: body + delete: + operation: + $ref: '#/paths/~1v1~1bulk-redirects/delete' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + update: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v1~1bulk-redirects/patch' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + restore: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v1~1bulk-redirects~1restore/post' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/redirects/methods/list' + insert: [] + update: + - $ref: '#/components/x-stackQL-resources/redirects/methods/update' + delete: + - $ref: '#/components/x-stackQL-resources/redirects/methods/delete' + replace: + - $ref: '#/components/x-stackQL-resources/redirects/methods/stage' + versions: + id: vercel.bulk_redirects.versions + name: versions + title: Versions + methods: + list: + operation: + $ref: '#/paths/~1v1~1bulk-redirects~1versions/get' + response: + mediaType: application/json + openAPIDocKey: '200' + objectKey: $.versions + request: + nativeCasing: camel + update: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v1~1bulk-redirects~1versions/post' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/versions/methods/list' + insert: [] + update: [] + delete: [] + replace: [] +servers: + - url: https://api.vercel.com diff --git a/provider-dev/openapi/src/vercel/v00.00.00000/services/cache.yaml b/provider-dev/openapi/src/vercel/v00.00.00000/services/cache.yaml deleted file mode 100644 index ca15533..0000000 --- a/provider-dev/openapi/src/vercel/v00.00.00000/services/cache.yaml +++ /dev/null @@ -1,69 +0,0 @@ -openapi: 3.0.3 -servers: - - url: 'https://api.vercel.com' - description: Production API -info: - contact: - email: support@vercel.com - name: Vercel Support - url: 'https://vercel.com/support' - version: 0.0.1 - title: Vercel API - cache - description: cache -components: - schemas: {} - responses: {} - securitySchemes: - bearerToken: - type: http - description: Default authentication mechanism - scheme: bearer - oauth2: - type: oauth2 - flows: - authorizationCode: - authorizationUrl: 'https://api.vercel.com/oauth/authorize' - tokenUrl: 'https://api.vercel.com/oauth/access_token' - scopes: {} - x-stackQL-resources: - data_cache_purge_all: - id: vercel.cache.data_cache_purge_all - name: data_cache_purge_all - title: Data Cache Purge All - methods: - purge_all: - operation: - $ref: '#/paths/~1data-cache~1purge-all/delete' - response: - mediaType: application/json - openAPIDocKey: '200' - sqlVerbs: - select: [] - insert: [] - update: [] - delete: [] -paths: - /data-cache/purge-all: - delete: - description: '' - operationId: purgeAll - security: [] - tags: - - cache - responses: - '200': - description: '' - '400': - description: One of the provided values in the request query is invalid. - '401': - description: '' - '403': - description: You do not have permission to access this resource. - '404': - description: '' - parameters: - - name: projectIdOrName - in: query - required: true - schema: - type: string diff --git a/provider-dev/openapi/src/vercel/v00.00.00000/services/certs.yaml b/provider-dev/openapi/src/vercel/v00.00.00000/services/certs.yaml index df0c9b6..1cf50f9 100644 --- a/provider-dev/openapi/src/vercel/v00.00.00000/services/certs.yaml +++ b/provider-dev/openapi/src/vercel/v00.00.00000/services/certs.yaml @@ -1,69 +1,10 @@ openapi: 3.0.3 -servers: - - url: 'https://api.vercel.com' - description: Production API info: - contact: - email: support@vercel.com - name: Vercel Support - url: 'https://vercel.com/support' + title: certs API + description: vercel certs API version: 0.0.1 - title: Vercel API - certs - description: certs -components: - schemas: {} - responses: {} - securitySchemes: - bearerToken: - type: http - description: Default authentication mechanism - scheme: bearer - oauth2: - type: oauth2 - flows: - authorizationCode: - authorizationUrl: 'https://api.vercel.com/oauth/authorize' - tokenUrl: 'https://api.vercel.com/oauth/access_token' - scopes: {} - x-stackQL-resources: - certs: - id: vercel.certs.certs - name: certs - title: Certs - methods: - get_cert_by_id: - operation: - $ref: '#/paths/~1v7~1certs~1{id}/get' - response: - mediaType: application/json - openAPIDocKey: '200' - remove_cert: - operation: - $ref: '#/paths/~1v7~1certs~1{id}/delete' - response: - mediaType: application/json - openAPIDocKey: '200' - issue_cert: - operation: - $ref: '#/paths/~1v7~1certs/post' - response: - mediaType: application/json - openAPIDocKey: '200' - upload_cert: - operation: - $ref: '#/paths/~1v7~1certs/put' - response: - mediaType: application/json - openAPIDocKey: '200' - sqlVerbs: - select: - - $ref: '#/components/x-stackQL-resources/certs/methods/get_cert_by_id' - insert: [] - update: [] - delete: - - $ref: '#/components/x-stackQL-resources/certs/methods/remove_cert' paths: - '/v7/certs/{id}': + /v8/certs/{id}: get: description: Get cert by id operationId: getCertById @@ -87,25 +28,33 @@ paths: type: number autoRenew: type: boolean + enum: + - false + - true cns: items: type: string type: array required: - - id - - createdAt - - expiresAt - autoRenew - cns + - createdAt + - expiresAt + - id type: object '400': description: One of the provided values in the request query is invalid. '401': - description: '' + description: The request is not authorized. '403': description: You do not have permission to access this resource. '404': description: '' + '410': + description: '' + x-vercel-cli: + supportedSubcommands: true + supportedProduction: false parameters: - name: id description: The cert id @@ -114,12 +63,20 @@ paths: schema: description: The cert id type: string - - description: The Team identifier or slug to perform the request on behalf of. + x-vercel-cli: + kind: argument + - description: The Team identifier to perform the request on behalf of. in: query name: teamId - required: true schema: type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug delete: description: Remove cert operationId: removeCert @@ -134,15 +91,21 @@ paths: content: application/json: schema: - type: object + type: string + description: (opaque JSON object) '400': description: One of the provided values in the request query is invalid. '401': - description: '' + description: The request is not authorized. '403': description: You do not have permission to access this resource. '404': description: '' + '410': + description: '' + x-vercel-cli: + supportedSubcommands: true + supportedProduction: false parameters: - name: id description: The cert id to remove @@ -151,13 +114,89 @@ paths: schema: description: The cert id to remove type: string - - description: The Team identifier or slug to perform the request on behalf of. + x-vercel-cli: + kind: argument + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + /v8/certs: + get: + description: Get certs + operationId: getCerts + security: + - bearerToken: [] + summary: Get certs + tags: + - certs + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + certs: + items: + properties: + id: + type: string + createdAt: + type: number + expiresAt: + type: number + autoRenew: + type: boolean + enum: + - false + - true + cns: + items: + type: string + type: array + required: + - autoRenew + - cns + - createdAt + - expiresAt + - id + type: object + type: array + pagination: + $ref: '#/components/schemas/Pagination' + required: + - certs + - pagination + type: object + '400': + description: '' + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '410': + description: '' + parameters: + - description: The Team identifier to perform the request on behalf of. in: query name: teamId - required: true schema: type: string - /v7/certs: + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug post: description: Issue a new cert operationId: issueCert @@ -181,40 +220,56 @@ paths: type: number autoRenew: type: boolean + enum: + - false + - true cns: items: type: string type: array required: - - id - - createdAt - - expiresAt - autoRenew - cns + - createdAt + - expiresAt + - id type: object '400': description: One of the provided values in the request body is invalid. '401': - description: '' + description: The request is not authorized. '402': - description: |- - The account was soft-blocked for an unhandled reason. - The account is missing a payment so payment method must be updated + description: The account is missing a payment so payment method must be updated '403': description: You do not have permission to access this resource. '404': description: '' + '410': + description: '' '449': description: '' '500': description: '' + x-vercel-cli: + supportedSubcommands: true + supportedProduction: false + aliases: + - issue + bodyArguments: + - cns parameters: - - description: The Team identifier or slug to perform the request on behalf of. + - description: The Team identifier to perform the request on behalf of. in: query name: teamId - required: true schema: type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug requestBody: content: application/json: @@ -249,32 +304,48 @@ paths: type: number autoRenew: type: boolean + enum: + - false + - true cns: items: type: string type: array required: - - id - - createdAt - - expiresAt - autoRenew - cns + - createdAt + - expiresAt + - id type: object '400': description: One of the provided values in the request body is invalid. '401': - description: '' + description: The request is not authorized. '402': description: This feature is only available for Enterprise customers. '403': description: You do not have permission to access this resource. + '410': + description: '' + x-vercel-cli: + supportedSubcommands: true + supportedProduction: false + aliases: + - add parameters: - - description: The Team identifier or slug to perform the request on behalf of. + - description: The Team identifier to perform the request on behalf of. in: query name: teamId - required: true schema: type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug requestBody: content: application/json: @@ -298,3 +369,92 @@ paths: skipValidation: type: boolean description: Skip validation of the certificate +components: + schemas: + Pagination: + properties: + count: + type: number + description: Amount of items in the current page. + example: 20 + next: + nullable: true + type: number + description: Timestamp that must be used to request the next page. + example: 1540095775951 + prev: + nullable: true + type: number + description: Timestamp that must be used to request the previous page. + example: 1540095775951 + required: + - count + - next + - prev + type: object + description: This object contains information related to the pagination of the current request, including the necessary parameters to get the next or previous page of data. + x-stackQL-resources: + certs: + id: vercel.certs.certs + name: certs + title: Certs + methods: + get: + operation: + $ref: '#/paths/~1v8~1certs~1{id}/get' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + delete: + operation: + $ref: '#/paths/~1v8~1certs~1{id}/delete' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + list: + operation: + $ref: '#/paths/~1v8~1certs/get' + response: + mediaType: application/json + openAPIDocKey: '200' + objectKey: $.certs + request: + nativeCasing: camel + issue: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v8~1certs/post' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + upload: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v8~1certs/put' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/certs/methods/get' + - $ref: '#/components/x-stackQL-resources/certs/methods/list' + insert: + - $ref: '#/components/x-stackQL-resources/certs/methods/issue' + update: [] + delete: + - $ref: '#/components/x-stackQL-resources/certs/methods/delete' + replace: [] +servers: + - url: https://api.vercel.com diff --git a/provider-dev/openapi/src/vercel/v00.00.00000/services/checks.yaml b/provider-dev/openapi/src/vercel/v00.00.00000/services/checks.yaml index 1e99020..239fcd3 100644 --- a/provider-dev/openapi/src/vercel/v00.00.00000/services/checks.yaml +++ b/provider-dev/openapi/src/vercel/v00.00.00000/services/checks.yaml @@ -1,83 +1,1979 @@ openapi: 3.0.3 -servers: - - url: 'https://api.vercel.com' - description: Production API info: - contact: - email: support@vercel.com - name: Vercel Support - url: 'https://vercel.com/support' + title: checks API + description: vercel checks API version: 0.0.1 - title: Vercel API - checks - description: checks -components: - schemas: {} - responses: {} - securitySchemes: - bearerToken: - type: http - description: Default authentication mechanism - scheme: bearer - oauth2: - type: oauth2 - flows: - authorizationCode: - authorizationUrl: 'https://api.vercel.com/oauth/authorize' - tokenUrl: 'https://api.vercel.com/oauth/access_token' - scopes: {} - x-stackQL-resources: - deployments: - id: vercel.checks.deployments - name: deployments - title: Deployments - methods: - create_check: - operation: - $ref: '#/paths/~1v1~1deployments~1{deploymentId}~1checks/post' - response: - mediaType: application/json - openAPIDocKey: '200' - get_all_checks: - operation: - $ref: '#/paths/~1v1~1deployments~1{deploymentId}~1checks/get' - response: - mediaType: application/json - openAPIDocKey: '200' - objectKey: $.checks - _get_all_checks: - operation: - $ref: '#/paths/~1v1~1deployments~1{deploymentId}~1checks/get' - response: - mediaType: application/json - openAPIDocKey: '200' - get_check: - operation: - $ref: '#/paths/~1v1~1deployments~1{deploymentId}~1checks~1{checkId}/get' - response: - mediaType: application/json - openAPIDocKey: '200' - update_check: - operation: - $ref: '#/paths/~1v1~1deployments~1{deploymentId}~1checks~1{checkId}/patch' - response: - mediaType: application/json - openAPIDocKey: '200' - rerequest_check: - operation: - $ref: '#/paths/~1v1~1deployments~1{deploymentId}~1checks~1{checkId}~1rerequest/post' - response: - mediaType: application/json - openAPIDocKey: '200' - sqlVerbs: - select: - - $ref: '#/components/x-stackQL-resources/deployments/methods/get_check' - - $ref: '#/components/x-stackQL-resources/deployments/methods/get_all_checks' - insert: - - $ref: '#/components/x-stackQL-resources/deployments/methods/create_check' - update: [] - delete: [] paths: - '/v1/deployments/{deploymentId}/checks': + /v2/projects/{project_id_or_name}/checks: + get: + description: List all checks for a project, optionally filtered by target. + operationId: listProjectChecks + security: + - bearerToken: [] + summary: List all checks for a project + tags: + - checks-v2 + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + checks: + items: + properties: + id: + type: string + name: + type: string + ownerId: + type: string + projectId: + type: string + isRerequestable: + type: boolean + enum: + - false + - true + requires: + type: string + enum: + - build-ready + - deployment-url + - none + source: + oneOf: + - properties: + kind: + type: string + enum: + - integration + integrationId: + type: string + integrationConfigurationId: + type: string + resourceId: + type: string + externalResourceId: + type: string + required: + - integrationConfigurationId + - integrationId + - kind + type: object + - properties: + kind: + type: string + enum: + - webhook + webhookId: + type: string + required: + - kind + type: object + - properties: + kind: + type: string + enum: + - git-provider + provider: + type: string + enum: + - bitbucket + - github + - gitlab + externalCheckName: + type: string + required: + - externalCheckName + - kind + - provider + type: object + blocks: + type: string + enum: + - build-start + - deployment-alias + - deployment-promotion + - deployment-start + - none + targets: + items: + type: string + type: array + sourceKind: + type: string + enum: + - git-provider + - integration + - vercel + - webhook + - integration + - webhook + - git-provider + sourceIntegrationConfigurationId: + type: string + timeout: + type: number + createdAt: + type: number + updatedAt: + type: number + deletedAt: + type: number + required: + - blocks + - createdAt + - id + - isRerequestable + - name + - ownerId + - projectId + - requires + - source + - sourceKind + - targets + - timeout + - updatedAt + type: object + type: array + required: + - checks + type: object + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '410': + description: '' + '500': + description: '' + parameters: + - name: project_id_or_name + in: path + required: true + schema: + type: string + - name: blocks + in: query + required: false + schema: + type: string + enum: + - build-start + - deployment-start + - deployment-alias + - deployment-promotion + - none + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + post: + description: Creates a new check for a project. + operationId: createProjectCheck + security: + - bearerToken: [] + summary: Create a check + tags: + - checks-v2 + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + id: + type: string + name: + type: string + ownerId: + type: string + projectId: + type: string + isRerequestable: + type: boolean + enum: + - false + - true + requires: + type: string + enum: + - build-ready + - deployment-url + - none + source: + properties: + kind: + type: string + enum: + - integration + integrationId: + type: string + integrationConfigurationId: + type: string + resourceId: + type: string + externalResourceId: + type: string + webhookId: + type: string + provider: + type: string + enum: + - bitbucket + - github + - gitlab + externalCheckName: + type: string + required: + - integrationConfigurationId + - integrationId + - kind + - externalCheckName + - provider + type: object + blocks: + type: string + enum: + - build-start + - deployment-alias + - deployment-promotion + - deployment-start + - none + targets: + items: + type: string + type: array + sourceKind: + type: string + enum: + - git-provider + - integration + - vercel + - webhook + - integration + - webhook + - git-provider + sourceIntegrationConfigurationId: + type: string + timeout: + type: number + createdAt: + type: number + updatedAt: + type: number + deletedAt: + type: number + required: + - blocks + - createdAt + - id + - isRerequestable + - name + - ownerId + - projectId + - requires + - source + - sourceKind + - targets + - timeout + - updatedAt + type: object + '400': + description: |- + One of the provided values in the request body is invalid. + One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '410': + description: '' + '500': + description: '' + parameters: + - name: project_id_or_name + in: path + required: true + schema: + type: string + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + requestBody: + content: + application/json: + schema: + properties: + name: + type: string + isRerequestable: + type: boolean + requires: + type: string + enum: + - build-ready + - deployment-url + - none + default: deployment-url + targets: + type: array + items: + type: string + uniqueItems: true + blocks: + type: string + enum: + - build-start + - deployment-start + - deployment-alias + - deployment-promotion + - none + default: deployment-alias + source: + type: object + properties: + kind: + type: string + default: integration + externalResourceId: + type: string + webhookId: + type: string + externalCheckName: + type: string + provider: + type: string + enum: + - github + required: + - kind + - externalCheckName + - provider + timeout: + type: number + default: 300 + required: + - name + - requires + type: object + /v2/projects/{project_id_or_name}/checks/{check_id}: + get: + description: Return a detailed response for a single check. + operationId: getProjectCheck + security: + - bearerToken: [] + summary: Get a check + tags: + - checks-v2 + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + id: + type: string + name: + type: string + ownerId: + type: string + projectId: + type: string + isRerequestable: + type: boolean + enum: + - false + - true + requires: + type: string + enum: + - build-ready + - deployment-url + - none + source: + properties: + kind: + type: string + enum: + - integration + integrationId: + type: string + integrationConfigurationId: + type: string + resourceId: + type: string + externalResourceId: + type: string + webhookId: + type: string + provider: + type: string + enum: + - bitbucket + - github + - gitlab + externalCheckName: + type: string + required: + - integrationConfigurationId + - integrationId + - kind + - externalCheckName + - provider + type: object + blocks: + type: string + enum: + - build-start + - deployment-alias + - deployment-promotion + - deployment-start + - none + targets: + items: + type: string + type: array + sourceKind: + type: string + enum: + - git-provider + - integration + - vercel + - webhook + - integration + - webhook + - git-provider + sourceIntegrationConfigurationId: + type: string + timeout: + type: number + createdAt: + type: number + updatedAt: + type: number + deletedAt: + type: number + required: + - blocks + - createdAt + - id + - isRerequestable + - name + - ownerId + - projectId + - requires + - source + - sourceKind + - targets + - timeout + - updatedAt + type: object + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '410': + description: '' + '500': + description: '' + parameters: + - name: project_id_or_name + in: path + required: true + schema: + type: string + - name: check_id + description: The ID of the resource that will be updated. + in: path + required: true + schema: + type: string + description: The ID of the resource that will be updated. + example: stf_89ha9sdhh9a9 + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + patch: + description: Update an existing check. + operationId: updateProjectCheck + security: + - bearerToken: [] + summary: Update a check + tags: + - checks-v2 + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + id: + type: string + name: + type: string + ownerId: + type: string + projectId: + type: string + isRerequestable: + type: boolean + enum: + - false + - true + requires: + type: string + enum: + - build-ready + - deployment-url + - none + source: + properties: + kind: + type: string + enum: + - integration + integrationId: + type: string + integrationConfigurationId: + type: string + resourceId: + type: string + externalResourceId: + type: string + webhookId: + type: string + provider: + type: string + enum: + - bitbucket + - github + - gitlab + externalCheckName: + type: string + required: + - integrationConfigurationId + - integrationId + - kind + - externalCheckName + - provider + type: object + blocks: + type: string + enum: + - build-start + - deployment-alias + - deployment-promotion + - deployment-start + - none + targets: + items: + type: string + type: array + sourceKind: + type: string + enum: + - git-provider + - integration + - vercel + - webhook + - integration + - webhook + - git-provider + sourceIntegrationConfigurationId: + type: string + timeout: + type: number + createdAt: + type: number + updatedAt: + type: number + deletedAt: + type: number + required: + - blocks + - createdAt + - id + - isRerequestable + - name + - ownerId + - projectId + - requires + - source + - sourceKind + - targets + - timeout + - updatedAt + type: object + '400': + description: |- + One of the provided values in the request body is invalid. + One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + '500': + description: '' + parameters: + - name: project_id_or_name + in: path + required: true + schema: + type: string + - name: check_id + in: path + required: true + schema: + type: string + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + requestBody: + content: + application/json: + schema: + properties: + name: + type: string + isRerequestable: + type: boolean + requires: + type: string + enum: + - build-ready + - deployment-url + default: deployment-url + targets: + type: array + items: + type: string + blocks: + type: string + enum: + - build-start + - deployment-start + - deployment-alias + - deployment-promotion + - none + default: deployment-alias + timeout: + type: number + default: 300 + type: object + delete: + description: Delete an existing check and all of its runs. + operationId: deleteProjectCheck + security: + - bearerToken: [] + summary: Delete a check + tags: + - checks-v2 + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + success: + type: boolean + enum: + - true + required: + - success + type: object + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + '500': + description: '' + parameters: + - name: project_id_or_name + in: path + required: true + schema: + type: string + - name: check_id + in: path + required: true + schema: + type: string + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + /v2/projects/{project_id_or_name}/checks/{check_id}/runs: + get: + description: List all runs associated with a given check. + operationId: listCheckRuns + security: + - bearerToken: [] + summary: List runs for a check + tags: + - checks-v2 + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + runs: + items: + oneOf: + - properties: + id: + type: string + name: + type: string + ownerId: + type: string + deploymentId: + type: string + projectId: + type: string + requires: + type: string + enum: + - build-ready + - deployment-url + - none + blocks: + type: string + enum: + - build-start + - deployment-alias + - deployment-promotion + - deployment-start + - none + targets: + items: + type: string + type: array + status: + type: string + enum: + - completed + - queued + - running + conclusion: + type: string + enum: + - canceled + - failed + - neutral + - skipped + - succeeded + - timeout + conclusionText: + type: string + externalId: + type: string + externalUrl: + type: string + output: + additionalProperties: true + type: object + timeout: + type: number + createdAt: + type: number + updatedAt: + type: number + completedAt: + type: number + checkId: + type: string + source: + oneOf: + - properties: + kind: + type: string + enum: + - integration + integrationId: + type: string + integrationConfigurationId: + type: string + resourceId: + type: string + externalResourceId: + type: string + required: + - integrationConfigurationId + - integrationId + - kind + type: object + - properties: + kind: + type: string + enum: + - webhook + webhookId: + type: string + required: + - kind + type: object + - properties: + kind: + type: string + enum: + - git-provider + provider: + type: string + enum: + - bitbucket + - github + - gitlab + externalCheckName: + type: string + required: + - externalCheckName + - kind + - provider + type: object + - properties: + subKind: + type: string + enum: + - vercel-native-check + origin: + type: string + enum: + - api + - platform + type: object + description: Native Vercel checks — check definition and check run `source`. + required: + - checkId + - createdAt + - deploymentId + - id + - name + - ownerId + - source + - status + - timeout + - updatedAt + type: object + description: Check run backed by a project-level `check` definition. + - properties: + id: + type: string + name: + type: string + ownerId: + type: string + deploymentId: + type: string + projectId: + type: string + requires: + type: string + enum: + - build-ready + - deployment-url + - none + blocks: + type: string + enum: + - build-start + - deployment-alias + - deployment-promotion + - deployment-start + - none + targets: + items: + type: string + type: array + status: + type: string + enum: + - completed + - queued + - running + conclusion: + type: string + enum: + - canceled + - failed + - neutral + - skipped + - succeeded + - timeout + conclusionText: + type: string + externalId: + type: string + externalUrl: + type: string + output: + additionalProperties: true + type: object + timeout: + type: number + createdAt: + type: number + updatedAt: + type: number + completedAt: + type: number + source: + oneOf: + - properties: + subKind: + type: string + enum: + - vercel-ci + origin: + type: string + enum: + - config + invocationId: + type: string + invocationAttempt: + type: number + jobDefinitionId: + type: string + required: + - invocationId + - jobDefinitionId + - origin + - subKind + type: object + description: Config-driven CI task — check run `source` only (no parent check). + - properties: + subKind: + type: string + enum: + - vercel-ci-sentinel + origin: + type: string + enum: + - platform + required: + - origin + - subKind + type: object + description: CI sentinel — check run `source` only (no parent check). + required: + - createdAt + - deploymentId + - id + - name + - ownerId + - source + - status + - timeout + - updatedAt + type: object + description: Vercel CI check run without a parent `check` (no `checkId` field). + type: array + required: + - runs + type: object + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '410': + description: '' + '500': + description: '' + parameters: + - name: project_id_or_name + in: path + required: true + schema: + type: string + - name: check_id + description: The ID of the resource that will be updated. + in: path + required: true + schema: + type: string + description: The ID of the resource that will be updated. + example: ckr_89ha9sdhh9a9 + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + /v2/deployments/{deployment_id}/check-runs: + get: + description: List all check runs for a deployment. + operationId: listDeploymentCheckRuns + security: + - bearerToken: [] + summary: List check runs for a deployment + tags: + - checks-v2 + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + runs: + items: + oneOf: + - properties: + id: + type: string + name: + type: string + ownerId: + type: string + deploymentId: + type: string + projectId: + type: string + requires: + type: string + enum: + - build-ready + - deployment-url + - none + blocks: + type: string + enum: + - build-start + - deployment-alias + - deployment-promotion + - deployment-start + - none + targets: + items: + type: string + type: array + status: + type: string + enum: + - completed + - queued + - running + conclusion: + type: string + enum: + - canceled + - failed + - neutral + - skipped + - succeeded + - timeout + conclusionText: + type: string + externalId: + type: string + externalUrl: + type: string + output: + additionalProperties: true + type: object + timeout: + type: number + createdAt: + type: number + updatedAt: + type: number + completedAt: + type: number + checkId: + type: string + source: + oneOf: + - properties: + kind: + type: string + enum: + - integration + integrationId: + type: string + integrationConfigurationId: + type: string + resourceId: + type: string + externalResourceId: + type: string + required: + - integrationConfigurationId + - integrationId + - kind + type: object + - properties: + kind: + type: string + enum: + - webhook + webhookId: + type: string + required: + - kind + type: object + - properties: + kind: + type: string + enum: + - git-provider + provider: + type: string + enum: + - bitbucket + - github + - gitlab + externalCheckName: + type: string + required: + - externalCheckName + - kind + - provider + type: object + - properties: + subKind: + type: string + enum: + - vercel-native-check + origin: + type: string + enum: + - api + - platform + type: object + description: Native Vercel checks — check definition and check run `source`. + required: + - checkId + - createdAt + - deploymentId + - id + - name + - ownerId + - source + - status + - timeout + - updatedAt + type: object + description: Check run backed by a project-level `check` definition. + - properties: + id: + type: string + name: + type: string + ownerId: + type: string + deploymentId: + type: string + projectId: + type: string + requires: + type: string + enum: + - build-ready + - deployment-url + - none + blocks: + type: string + enum: + - build-start + - deployment-alias + - deployment-promotion + - deployment-start + - none + targets: + items: + type: string + type: array + status: + type: string + enum: + - completed + - queued + - running + conclusion: + type: string + enum: + - canceled + - failed + - neutral + - skipped + - succeeded + - timeout + conclusionText: + type: string + externalId: + type: string + externalUrl: + type: string + output: + additionalProperties: true + type: object + timeout: + type: number + createdAt: + type: number + updatedAt: + type: number + completedAt: + type: number + source: + oneOf: + - properties: + subKind: + type: string + enum: + - vercel-ci + origin: + type: string + enum: + - config + invocationId: + type: string + invocationAttempt: + type: number + jobDefinitionId: + type: string + required: + - invocationId + - jobDefinitionId + - origin + - subKind + type: object + description: Config-driven CI task — check run `source` only (no parent check). + - properties: + subKind: + type: string + enum: + - vercel-ci-sentinel + origin: + type: string + enum: + - platform + required: + - origin + - subKind + type: object + description: CI sentinel — check run `source` only (no parent check). + required: + - createdAt + - deploymentId + - id + - name + - ownerId + - source + - status + - timeout + - updatedAt + type: object + description: Vercel CI check run without a parent `check` (no `checkId` field). + type: array + required: + - runs + type: object + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '410': + description: '' + '500': + description: '' + parameters: + - name: deployment_id + in: path + required: true + schema: + type: string + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + post: + description: Creates a new check run for a deployment. + operationId: createDeploymentCheckRun + security: + - bearerToken: [] + summary: Create a check run + tags: + - checks-v2 + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + id: + type: string + name: + type: string + ownerId: + type: string + deploymentId: + type: string + projectId: + type: string + requires: + type: string + enum: + - build-ready + - deployment-url + - none + blocks: + type: string + enum: + - build-start + - deployment-alias + - deployment-promotion + - deployment-start + - none + targets: + items: + type: string + type: array + status: + type: string + enum: + - completed + - queued + - running + conclusion: + type: string + enum: + - canceled + - failed + - neutral + - skipped + - succeeded + - timeout + conclusionText: + type: string + externalId: + type: string + externalUrl: + type: string + output: + additionalProperties: true + type: object + timeout: + type: number + createdAt: + type: number + updatedAt: + type: number + completedAt: + type: number + checkId: + type: string + source: + oneOf: + - properties: + kind: + type: string + enum: + - integration + integrationId: + type: string + integrationConfigurationId: + type: string + resourceId: + type: string + externalResourceId: + type: string + required: + - integrationConfigurationId + - integrationId + - kind + type: object + - properties: + kind: + type: string + enum: + - webhook + webhookId: + type: string + required: + - kind + type: object + - properties: + kind: + type: string + enum: + - git-provider + provider: + type: string + enum: + - bitbucket + - github + - gitlab + externalCheckName: + type: string + required: + - externalCheckName + - kind + - provider + type: object + - properties: + subKind: + type: string + enum: + - vercel-native-check + origin: + type: string + enum: + - api + - platform + type: object + description: Native Vercel checks — check definition and check run `source`. + required: + - checkId + - createdAt + - deploymentId + - id + - name + - ownerId + - source + - status + - timeout + - updatedAt + type: object + description: Check run backed by a project-level `check` definition. + '400': + description: |- + One of the provided values in the request body is invalid. + One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + '500': + description: '' + parameters: + - name: deployment_id + in: path + required: true + schema: + type: string + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + requestBody: + content: + application/json: + schema: + properties: + checkId: + type: string + required: + - checkId + type: object + /v2/deployments/{deployment_id}/check-runs/{check_run_id}: + get: + description: Return a detailed response for a single check run. + operationId: getDeploymentCheckRun + security: + - bearerToken: [] + summary: Get a check run + tags: + - checks-v2 + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + id: + type: string + name: + type: string + ownerId: + type: string + deploymentId: + type: string + projectId: + type: string + requires: + type: string + enum: + - build-ready + - deployment-url + - none + blocks: + type: string + enum: + - build-start + - deployment-alias + - deployment-promotion + - deployment-start + - none + targets: + items: + type: string + type: array + status: + type: string + enum: + - completed + - queued + - running + conclusion: + type: string + enum: + - canceled + - failed + - neutral + - skipped + - succeeded + - timeout + conclusionText: + type: string + externalId: + type: string + externalUrl: + type: string + output: + additionalProperties: true + type: object + timeout: + type: number + createdAt: + type: number + updatedAt: + type: number + completedAt: + type: number + checkId: + type: string + source: + oneOf: + - properties: + kind: + type: string + enum: + - integration + integrationId: + type: string + integrationConfigurationId: + type: string + resourceId: + type: string + externalResourceId: + type: string + required: + - integrationConfigurationId + - integrationId + - kind + type: object + - properties: + kind: + type: string + enum: + - webhook + webhookId: + type: string + required: + - kind + type: object + - properties: + kind: + type: string + enum: + - git-provider + provider: + type: string + enum: + - bitbucket + - github + - gitlab + externalCheckName: + type: string + required: + - externalCheckName + - kind + - provider + type: object + - properties: + subKind: + type: string + enum: + - vercel-native-check + origin: + type: string + enum: + - api + - platform + type: object + description: Native Vercel checks — check definition and check run `source`. + required: + - checkId + - createdAt + - deploymentId + - id + - name + - ownerId + - source + - status + - timeout + - updatedAt + type: object + description: Check run backed by a project-level `check` definition. + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + '500': + description: '' + parameters: + - name: deployment_id + in: path + required: true + schema: + type: string + - name: check_run_id + description: The ID of the resource that will be updated. + in: path + required: true + schema: + type: string + description: The ID of the resource that will be updated. + example: ckr_89ha9sdhh9a9 + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + patch: + description: Update an existing check run for a deployment. + operationId: updateDeploymentCheckRun + security: + - bearerToken: [] + summary: Update a check run + tags: + - checks-v2 + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + id: + type: string + name: + type: string + ownerId: + type: string + deploymentId: + type: string + projectId: + type: string + requires: + type: string + enum: + - build-ready + - deployment-url + - none + blocks: + type: string + enum: + - build-start + - deployment-alias + - deployment-promotion + - deployment-start + - none + targets: + items: + type: string + type: array + status: + type: string + enum: + - completed + - queued + - running + conclusion: + type: string + enum: + - canceled + - failed + - neutral + - skipped + - succeeded + - timeout + conclusionText: + type: string + externalId: + type: string + externalUrl: + type: string + output: + additionalProperties: true + type: object + timeout: + type: number + createdAt: + type: number + updatedAt: + type: number + completedAt: + type: number + checkId: + type: string + source: + oneOf: + - properties: + kind: + type: string + enum: + - integration + integrationId: + type: string + integrationConfigurationId: + type: string + resourceId: + type: string + externalResourceId: + type: string + required: + - integrationConfigurationId + - integrationId + - kind + type: object + - properties: + kind: + type: string + enum: + - webhook + webhookId: + type: string + required: + - kind + type: object + - properties: + kind: + type: string + enum: + - git-provider + provider: + type: string + enum: + - bitbucket + - github + - gitlab + externalCheckName: + type: string + required: + - externalCheckName + - kind + - provider + type: object + - properties: + subKind: + type: string + enum: + - vercel-native-check + origin: + type: string + enum: + - api + - platform + type: object + description: Native Vercel checks — check definition and check run `source`. + required: + - checkId + - createdAt + - deploymentId + - id + - name + - ownerId + - source + - status + - timeout + - updatedAt + type: object + description: Check run backed by a project-level `check` definition. + '400': + description: |- + One of the provided values in the request body is invalid. + One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '410': + description: '' + '413': + description: The output provided is too large + '500': + description: '' + parameters: + - name: deployment_id + in: path + required: true + schema: + type: string + - name: check_run_id + in: path + required: true + schema: + type: string + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + requestBody: + content: + application/json: + schema: + additionalProperties: false + properties: + externalId: + type: string + externalUrl: + type: string + format: uri + pattern: '^https?://|^sso:' + status: + type: string + enum: + - queued + - running + - completed + output: + type: string + description: (opaque JSON object) + completedAt: + type: number + conclusion: + type: string + enum: + - canceled + - skipped + - timeout + - failed + - neutral + - succeeded + conclusionText: + type: string + type: object + /v1/deployments/{deployment_id}/checks: post: description: Creates a new check. This endpoint must be called with an OAuth2 or it will produce a 400 error. operationId: createCheck @@ -86,6 +1982,7 @@ paths: summary: Creates a new Check tags: - checks + deprecated: true responses: '200': description: '' @@ -95,27 +1992,35 @@ paths: properties: id: type: string + example: chk_1a2b3c4d5e6f7g8h9i0j name: type: string - path: + example: Performance Check + createdAt: + type: number + updatedAt: + type: number + deploymentId: type: string status: type: string enum: + - completed - registered - running - - completed + example: completed conclusion: type: string enum: - canceled - failed - neutral - - succeeded - skipped - stale - blocking: - type: boolean + - succeeded + example: succeeded + externalId: + type: string output: properties: metrics: @@ -132,8 +2037,8 @@ paths: enum: - web-vitals required: - - value - source + - value type: object LCP: properties: @@ -147,8 +2052,8 @@ paths: enum: - web-vitals required: - - value - source + - value type: object CLS: properties: @@ -162,8 +2067,8 @@ paths: enum: - web-vitals required: - - value - source + - value type: object TBT: properties: @@ -177,8 +2082,8 @@ paths: enum: - web-vitals required: - - value - source + - value type: object virtualExperienceScore: properties: @@ -192,42 +2097,45 @@ paths: enum: - web-vitals required: - - value - source + - value type: object required: + - CLS - FCP - LCP - - CLS - TBT type: object type: object + completedAt: + type: number + path: + type: string + example: /api/users + blocking: + type: boolean + enum: + - false + - true detailsUrl: type: string integrationId: type: string - deploymentId: - type: string - externalId: - type: string - createdAt: - type: number - updatedAt: - type: number startedAt: type: number - completedAt: - type: number rerequestable: type: boolean + enum: + - false + - true required: + - blocking + - createdAt + - deploymentId - id + - integrationId - name - status - - blocking - - integrationId - - deploymentId - - createdAt - updatedAt type: object '400': @@ -237,13 +2145,15 @@ paths: Cannot create check for finished deployment The provided token is not from an OAuth2 Client '401': - description: '' + description: The request is not authorized. '403': description: You do not have permission to access this resource. '404': description: The deployment was not found + '410': + description: '' parameters: - - name: deploymentId + - name: deployment_id description: The deployment to create the check for. in: path required: true @@ -251,12 +2161,18 @@ paths: description: The deployment to create the check for. example: dpl_2qn7PZrx89yxY34vEZPD31Y9XVj6 type: string - - description: The Team identifier or slug to perform the request on behalf of. + - description: The Team identifier to perform the request on behalf of. in: query name: teamId - required: true schema: type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug requestBody: content: application/json: @@ -279,7 +2195,7 @@ paths: detailsUrl: description: URL to display for further details type: string - example: 'http://example.com' + example: http://example.com externalId: description: An identifier that can be used as an external reference type: string @@ -292,6 +2208,7 @@ paths: - name - blocking type: object + required: true get: description: List all of the checks created for a deployment. operationId: getAllChecks @@ -300,6 +2217,7 @@ paths: summary: Retrieve a list of all checks tags: - checks + deprecated: true responses: '200': description: '' @@ -318,9 +2236,9 @@ paths: - canceled - failed - neutral - - succeeded - skipped - stale + - succeeded createdAt: type: number detailsUrl: @@ -347,8 +2265,8 @@ paths: enum: - web-vitals required: - - value - source + - value type: object LCP: properties: @@ -362,8 +2280,8 @@ paths: enum: - web-vitals required: - - value - source + - value type: object CLS: properties: @@ -377,8 +2295,8 @@ paths: enum: - web-vitals required: - - value - source + - value type: object TBT: properties: @@ -392,8 +2310,8 @@ paths: enum: - web-vitals required: - - value - source + - value type: object virtualExperienceScore: properties: @@ -407,13 +2325,13 @@ paths: enum: - web-vitals required: - - value - source + - value type: object required: + - CLS - FCP - LCP - - CLS - TBT type: object type: object @@ -421,17 +2339,26 @@ paths: type: string rerequestable: type: boolean + enum: + - false + - true + blocking: + type: boolean + enum: + - false + - true startedAt: type: number status: type: string enum: + - completed - registered - running - - completed updatedAt: type: number required: + - blocking - createdAt - id - integrationId @@ -447,13 +2374,15 @@ paths: '400': description: One of the provided values in the request query is invalid. '401': - description: '' + description: The request is not authorized. '403': description: You do not have permission to access this resource. '404': description: The deployment was not found + '410': + description: '' parameters: - - name: deploymentId + - name: deployment_id description: The deployment to get all checks for in: path required: true @@ -461,13 +2390,19 @@ paths: description: The deployment to get all checks for example: dpl_2qn7PZrx89yxY34vEZPD31Y9XVj6 type: string - - description: The Team identifier or slug to perform the request on behalf of. + - description: The Team identifier to perform the request on behalf of. in: query name: teamId - required: true schema: type: string - '/v1/deployments/{deploymentId}/checks/{checkId}': + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + /v1/deployments/{deployment_id}/checks/{check_id}: get: description: Return a detailed response for a single check. operationId: getCheck @@ -476,6 +2411,7 @@ paths: summary: Get a single check tags: - checks + deprecated: true responses: '200': description: '' @@ -487,25 +2423,29 @@ paths: type: string name: type: string - path: + createdAt: + type: number + updatedAt: + type: number + deploymentId: type: string status: type: string enum: + - completed - registered - running - - completed conclusion: type: string enum: - canceled - failed - neutral - - succeeded - skipped - stale - blocking: - type: boolean + - succeeded + externalId: + type: string output: properties: metrics: @@ -522,8 +2462,8 @@ paths: enum: - web-vitals required: - - value - source + - value type: object LCP: properties: @@ -537,8 +2477,8 @@ paths: enum: - web-vitals required: - - value - source + - value type: object CLS: properties: @@ -552,8 +2492,8 @@ paths: enum: - web-vitals required: - - value - source + - value type: object TBT: properties: @@ -567,8 +2507,8 @@ paths: enum: - web-vitals required: - - value - source + - value type: object virtualExperienceScore: properties: @@ -582,48 +2522,50 @@ paths: enum: - web-vitals required: - - value - source + - value type: object required: + - CLS - FCP - LCP - - CLS - TBT type: object type: object + completedAt: + type: number + path: + type: string + blocking: + type: boolean + enum: + - false + - true detailsUrl: type: string integrationId: type: string - deploymentId: - type: string - externalId: - type: string - createdAt: - type: number - updatedAt: - type: number startedAt: type: number - completedAt: - type: number rerequestable: type: boolean + enum: + - false + - true required: + - blocking + - createdAt + - deploymentId - id + - integrationId - name - status - - blocking - - integrationId - - deploymentId - - createdAt - updatedAt type: object '400': description: One of the provided values in the request query is invalid. '401': - description: '' + description: The request is not authorized. '403': description: |- You do not have permission to access this resource. @@ -632,8 +2574,10 @@ paths: description: |- Check was not found The deployment was not found + '410': + description: '' parameters: - - name: deploymentId + - name: deployment_id description: The deployment to get the check for. in: path required: true @@ -641,7 +2585,7 @@ paths: description: The deployment to get the check for. example: dpl_2qn7PZrx89yxY34vEZPD31Y9XVj6 type: string - - name: checkId + - name: check_id description: The check to fetch in: path required: true @@ -649,12 +2593,18 @@ paths: description: The check to fetch example: check_2qn7PZrx89yxY34vEZPD31Y9XVj6 type: string - - description: The Team identifier or slug to perform the request on behalf of. + - description: The Team identifier to perform the request on behalf of. in: query name: teamId - required: true schema: type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug patch: description: Update an existing check. This endpoint must be called with an OAuth2 or it will produce a 400 error. operationId: updateCheck @@ -663,6 +2613,7 @@ paths: summary: Update a check tags: - checks + deprecated: true responses: '200': description: '' @@ -674,25 +2625,29 @@ paths: type: string name: type: string - path: + createdAt: + type: number + updatedAt: + type: number + deploymentId: type: string status: type: string enum: + - completed - registered - running - - completed conclusion: type: string enum: - canceled - failed - neutral - - succeeded - skipped - stale - blocking: - type: boolean + - succeeded + externalId: + type: string output: properties: metrics: @@ -709,8 +2664,8 @@ paths: enum: - web-vitals required: - - value - source + - value type: object LCP: properties: @@ -724,8 +2679,8 @@ paths: enum: - web-vitals required: - - value - source + - value type: object CLS: properties: @@ -739,8 +2694,8 @@ paths: enum: - web-vitals required: - - value - source + - value type: object TBT: properties: @@ -754,8 +2709,8 @@ paths: enum: - web-vitals required: - - value - source + - value type: object virtualExperienceScore: properties: @@ -769,42 +2724,44 @@ paths: enum: - web-vitals required: - - value - source + - value type: object required: + - CLS - FCP - LCP - - CLS - TBT type: object type: object + completedAt: + type: number + path: + type: string + blocking: + type: boolean + enum: + - false + - true detailsUrl: type: string integrationId: type: string - deploymentId: - type: string - externalId: - type: string - createdAt: - type: number - updatedAt: - type: number startedAt: type: number - completedAt: - type: number rerequestable: type: boolean + enum: + - false + - true required: + - blocking + - createdAt + - deploymentId - id + - integrationId - name - status - - blocking - - integrationId - - deploymentId - - createdAt - updatedAt type: object '400': @@ -813,17 +2770,19 @@ paths: One of the provided values in the request query is invalid. The provided token is not from an OAuth2 Client '401': - description: '' + description: The request is not authorized. '403': description: You do not have permission to access this resource. '404': description: |- Check was not found The deployment was not found + '410': + description: '' '413': description: The output provided is too large parameters: - - name: deploymentId + - name: deployment_id description: The deployment to update the check for. in: path required: true @@ -831,7 +2790,7 @@ paths: description: The deployment to update the check for. example: dpl_2qn7PZrx89yxY34vEZPD31Y9XVj6 type: string - - name: checkId + - name: check_id description: The check being updated in: path required: true @@ -839,12 +2798,18 @@ paths: description: The check being updated example: check_2qn7PZrx89yxY34vEZPD31Y9XVj6 type: string - - description: The Team identifier or slug to perform the request on behalf of. + - description: The Team identifier to perform the request on behalf of. in: query name: teamId - required: true schema: type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug requestBody: content: application/json: @@ -876,7 +2841,7 @@ paths: detailsUrl: description: A URL a user may visit to see more information about the check type: string - example: 'https://example.com/check/run/1234abc' + example: https://example.com/check/run/1234abc output: description: The results of the check Run type: object @@ -977,14 +2942,14 @@ paths: maximum: 100 minimum: 0 example: 30 - description: 'The calculated Virtual Experience Score value, between 0 and 100' + description: The calculated Virtual Experience Score value, between 0 and 100 nullable: true previousValue: type: integer maximum: 100 minimum: 0 example: 35 - description: 'A previous Virtual Experience Score value to display a delta, between 0 and 100' + description: A previous Virtual Experience Score value to display a delta, between 0 and 100 source: enum: - web-vitals @@ -993,7 +2958,8 @@ paths: type: string example: 1234abc type: object - '/v1/deployments/{deploymentId}/checks/{checkId}/rerequest': + required: true + /v1/deployments/{deployment_id}/checks/{check_id}/rerequest: post: description: Rerequest a selected check that has failed. operationId: rerequestCheck @@ -1002,25 +2968,29 @@ paths: summary: Rerequest a check tags: - checks + deprecated: true responses: '200': description: '' content: application/json: schema: - type: object + type: string + description: (opaque JSON object) '400': description: One of the provided values in the request query is invalid. '401': - description: '' + description: The request is not authorized. '403': description: You do not have permission to access this resource. '404': description: |- The deployment was not found Check was not found + '410': + description: '' parameters: - - name: deploymentId + - name: deployment_id description: The deployment to rerun the check for. in: path required: true @@ -1028,7 +2998,7 @@ paths: description: The deployment to rerun the check for. example: dpl_2qn7PZrx89yxY34vEZPD31Y9XVj6 type: string - - name: checkId + - name: check_id description: The check to rerun in: path required: true @@ -1036,9 +3006,215 @@ paths: description: The check to rerun example: check_2qn7PZrx89yxY34vEZPD31Y9XVj6 type: string - - description: The Team identifier or slug to perform the request on behalf of. + - name: autoUpdate + description: Mark the check as running + in: query + required: false + schema: + description: Mark the check as running + type: boolean + - description: The Team identifier to perform the request on behalf of. in: query name: teamId - required: true schema: type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug +components: + x-stackQL-resources: + project_checks: + id: vercel.checks.project_checks + name: project_checks + title: Project Checks + methods: + list: + operation: + $ref: '#/paths/~1v2~1projects~1{project_id_or_name}~1checks/get' + response: + mediaType: application/json + openAPIDocKey: '200' + objectKey: $.checks + request: + nativeCasing: camel + create: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v2~1projects~1{project_id_or_name}~1checks/post' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + get: + operation: + $ref: '#/paths/~1v2~1projects~1{project_id_or_name}~1checks~1{check_id}/get' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + update: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v2~1projects~1{project_id_or_name}~1checks~1{check_id}/patch' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + delete: + operation: + $ref: '#/paths/~1v2~1projects~1{project_id_or_name}~1checks~1{check_id}/delete' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/project_checks/methods/get' + - $ref: '#/components/x-stackQL-resources/project_checks/methods/list' + insert: + - $ref: '#/components/x-stackQL-resources/project_checks/methods/create' + update: + - $ref: '#/components/x-stackQL-resources/project_checks/methods/update' + delete: + - $ref: '#/components/x-stackQL-resources/project_checks/methods/delete' + replace: [] + check_runs: + id: vercel.checks.check_runs + name: check_runs + title: Check Runs + methods: + list_for_check: + operation: + $ref: '#/paths/~1v2~1projects~1{project_id_or_name}~1checks~1{check_id}~1runs/get' + response: + mediaType: application/json + openAPIDocKey: '200' + objectKey: $.runs + request: + nativeCasing: camel + list: + operation: + $ref: '#/paths/~1v2~1deployments~1{deployment_id}~1check-runs/get' + response: + mediaType: application/json + openAPIDocKey: '200' + objectKey: $.runs + request: + nativeCasing: camel + create: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v2~1deployments~1{deployment_id}~1check-runs/post' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + get: + operation: + $ref: '#/paths/~1v2~1deployments~1{deployment_id}~1check-runs~1{check_run_id}/get' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + update: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v2~1deployments~1{deployment_id}~1check-runs~1{check_run_id}/patch' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/check_runs/methods/list_for_check' + - $ref: '#/components/x-stackQL-resources/check_runs/methods/get' + - $ref: '#/components/x-stackQL-resources/check_runs/methods/list' + insert: + - $ref: '#/components/x-stackQL-resources/check_runs/methods/create' + update: + - $ref: '#/components/x-stackQL-resources/check_runs/methods/update' + delete: [] + replace: [] + deployment_checks: + id: vercel.checks.deployment_checks + name: deployment_checks + title: Deployment Checks + methods: + create: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v1~1deployments~1{deployment_id}~1checks/post' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + list: + operation: + $ref: '#/paths/~1v1~1deployments~1{deployment_id}~1checks/get' + response: + mediaType: application/json + openAPIDocKey: '200' + objectKey: $.checks + request: + nativeCasing: camel + get: + operation: + $ref: '#/paths/~1v1~1deployments~1{deployment_id}~1checks~1{check_id}/get' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + update: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v1~1deployments~1{deployment_id}~1checks~1{check_id}/patch' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + rerequest: + operation: + $ref: '#/paths/~1v1~1deployments~1{deployment_id}~1checks~1{check_id}~1rerequest/post' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/deployment_checks/methods/get' + - $ref: '#/components/x-stackQL-resources/deployment_checks/methods/list' + insert: + - $ref: '#/components/x-stackQL-resources/deployment_checks/methods/create' + update: + - $ref: '#/components/x-stackQL-resources/deployment_checks/methods/update' + delete: [] + replace: [] +servers: + - url: https://api.vercel.com diff --git a/provider-dev/openapi/src/vercel/v00.00.00000/services/connect.yaml b/provider-dev/openapi/src/vercel/v00.00.00000/services/connect.yaml new file mode 100644 index 0000000..d55ed7d --- /dev/null +++ b/provider-dev/openapi/src/vercel/v00.00.00000/services/connect.yaml @@ -0,0 +1,3814 @@ +openapi: 3.0.3 +info: + title: connect API + description: vercel connect API + version: 0.0.1 +paths: + /v2/connect/connectors: + get: + description: List connectors that belong to a team. + operationId: listConnectors + security: + - bearerToken: [] + summary: List connectors + tags: + - connect + responses: + '200': + description: A page of connectors. + content: + application/json: + schema: + $ref: '#/components/schemas/ConnectConnectorList' + '400': + description: One of the provided values in the request query is invalid. + content: + application/json: + schema: + $ref: '#/components/schemas/ConnectError' + '401': + description: The request is not authorized. + content: + application/json: + schema: + $ref: '#/components/schemas/ConnectError' + '403': + description: You do not have permission to access this resource. + content: + application/json: + schema: + $ref: '#/components/schemas/ConnectError' + '410': + description: The requested resource is no longer available. + content: + application/json: + schema: + $ref: '#/components/schemas/ConnectError' + '422': + description: The request cannot be completed in the current state. + content: + application/json: + schema: + $ref: '#/components/schemas/ConnectError' + parameters: + - name: limit + description: Maximum number of connectors to return. Defaults to 20. + in: query + schema: + type: integer + minimum: 1 + maximum: 100 + description: Maximum number of connectors to return. Defaults to 20. + - name: cursor + description: Cursor from `pagination.next` on the previous response. + in: query + schema: + type: string + description: Cursor from `pagination.next` on the previous response. + - name: projectId + description: Return only connectors connected to this project. + in: query + schema: + type: string + description: Return only connectors connected to this project. + - name: search + description: Search connector names, UIDs, and services. + in: query + schema: + type: string + maxLength: 100 + description: Search connector names, UIDs, and services. + - name: type + description: 'Comma-separated connector types: `slack`, `discord`, `github`, `linear`, `linq`, `salesforce`, `sendblue`, `snowflake`, `snowflake-wif`, `microsoft-entra`, `api-key`, `photon`, `oauth`, or `custom`.' + in: query + schema: + type: string + description: 'Comma-separated connector types: `slack`, `discord`, `github`, `linear`, `linq`, `salesforce`, `sendblue`, `snowflake`, `snowflake-wif`, `microsoft-entra`, `api-key`, `photon`, `oauth`, or `custom`.' + - name: service + description: Comma-separated provider or service identifiers. + in: query + schema: + type: string + description: Comma-separated provider or service identifiers. + - name: sort + description: Sort by name in ascending order, or by creation or update time in descending order. + in: query + schema: + type: string + enum: + - name + - createdAt + - updatedAt + description: Sort by name in ascending order, or by creation or update time in descending order. + - description: The team ID that scopes the request. Do not send it with slug. If both are omitted, Vercel uses the team associated with the token or the authenticated user's default team. The request returns 401 if no team can be selected. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The team slug that scopes the request. Do not send it with teamId. If both are omitted, Vercel uses the team associated with the token or the authenticated user's default team. The request returns 401 if no team can be selected. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + /v1/connect/connectors/{connector}: + get: + description: Get the connector by ID. Accepts a dashboard/team requester or a deployment's project OIDC token; project requesters may only read connectors linked to their project and environment. + operationId: getConnector + security: + - bearerToken: [] + summary: Get a connector + tags: + - connect + responses: + '200': + description: The connector. + content: + application/json: + schema: + $ref: '#/components/schemas/ConnectConnector' + '400': + description: One of the provided values in the request query is invalid. + content: + application/json: + schema: + $ref: '#/components/schemas/ConnectError' + '401': + description: The request is not authorized. + content: + application/json: + schema: + $ref: '#/components/schemas/ConnectError' + '403': + description: You do not have permission to access this resource. + content: + application/json: + schema: + $ref: '#/components/schemas/ConnectError' + '404': + description: The requested resource was not found. + content: + application/json: + schema: + $ref: '#/components/schemas/ConnectError' + '410': + description: The requested resource is no longer available. + content: + application/json: + schema: + $ref: '#/components/schemas/ConnectError' + '422': + description: The request cannot be completed in the current state. + content: + application/json: + schema: + $ref: '#/components/schemas/ConnectError' + parameters: + - name: connector + description: 'Stable connector ID or URL-encoded team-scoped UID. Examples: `scl_abc123` or `slack%2Fmy-bot`.' + in: path + required: true + schema: + type: string + description: 'Stable connector ID or URL-encoded team-scoped UID. Examples: `scl_abc123` or `slack%2Fmy-bot`.' + - description: The team ID that scopes the request. Do not send it with slug. If both are omitted, Vercel uses the team associated with the token or the authenticated user's default team. The request returns 401 if no team can be selected. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The team slug that scopes the request. Do not send it with teamId. If both are omitted, Vercel uses the team associated with the token or the authenticated user's default team. The request returns 401 if no team can be selected. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + delete: + description: Delete a connector, its project connections, and its installation records. + operationId: deleteConnector + security: + - bearerToken: [] + summary: Delete a connector + tags: + - connect + responses: + '204': + description: The connector, its project connections, and its installation records were deleted. + '400': + description: One of the provided values in the request query is invalid. + content: + application/json: + schema: + $ref: '#/components/schemas/ConnectError' + '401': + description: The request is not authorized. + content: + application/json: + schema: + $ref: '#/components/schemas/ConnectError' + '403': + description: You do not have permission to access this resource. + content: + application/json: + schema: + $ref: '#/components/schemas/ConnectError' + '404': + description: The requested resource was not found. + content: + application/json: + schema: + $ref: '#/components/schemas/ConnectError' + '409': + description: The request conflicts with the current resource state. + content: + application/json: + schema: + $ref: '#/components/schemas/ConnectError' + '410': + description: The requested resource is no longer available. + content: + application/json: + schema: + $ref: '#/components/schemas/ConnectError' + '422': + description: The request cannot be completed in the current state. + content: + application/json: + schema: + $ref: '#/components/schemas/ConnectError' + '502': + description: A dependency returned an invalid or unsuccessful response. + content: + application/json: + schema: + $ref: '#/components/schemas/ConnectError' + parameters: + - name: connector + description: 'Stable connector ID or URL-encoded team-scoped UID. Examples: `scl_abc123` or `slack%2Fmy-bot`.' + in: path + required: true + schema: + type: string + description: 'Stable connector ID or URL-encoded team-scoped UID. Examples: `scl_abc123` or `slack%2Fmy-bot`.' + - description: The team ID that scopes the request. Do not send it with slug. If both are omitted, Vercel uses the team associated with the token or the authenticated user's default team. The request returns 401 if no team can be selected. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The team slug that scopes the request. Do not send it with teamId. If both are omitted, Vercel uses the team associated with the token or the authenticated user's default team. The request returns 401 if no team can be selected. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + /v1/connect/connectors: + post: + description: Create a connector and optionally link it to a project. Use `type` with complete provider data, or use `service` with `connectionMethod` so Connect can supply the type, endpoints, templates, and defaults. + operationId: createConnector + security: + - bearerToken: [] + summary: Create a connector + tags: + - connect + responses: + '201': + description: The connector was created. + content: + application/json: + schema: + $ref: '#/components/schemas/ConnectConnectorCreateResult' + '400': + description: One of the provided values in the request body is invalid. + content: + application/json: + schema: + $ref: '#/components/schemas/ConnectError' + '401': + description: The request is not authorized. + content: + application/json: + schema: + $ref: '#/components/schemas/ConnectError' + '403': + description: You do not have permission to access this resource. + content: + application/json: + schema: + $ref: '#/components/schemas/ConnectError' + '404': + description: The requested resource was not found. + content: + application/json: + schema: + $ref: '#/components/schemas/ConnectError' + '409': + description: The request conflicts with the current resource state. + content: + application/json: + schema: + $ref: '#/components/schemas/ConnectError' + '410': + description: The requested resource is no longer available. + content: + application/json: + schema: + $ref: '#/components/schemas/ConnectError' + '422': + description: The request cannot be completed in the current state. + content: + application/json: + schema: + $ref: '#/components/schemas/ConnectError' + '500': + description: An internal error occurred. + content: + application/json: + schema: + $ref: '#/components/schemas/ConnectError' + '502': + description: A dependency returned an invalid or unsuccessful response. + content: + application/json: + schema: + $ref: '#/components/schemas/ConnectError' + parameters: + - description: The team ID that scopes the request. Do not send it with slug. If both are omitted, Vercel uses the team associated with the token or the authenticated user's default team. The request returns 401 if no team can be selected. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The team slug that scopes the request. Do not send it with teamId. If both are omitted, Vercel uses the team associated with the token or the authenticated user's default team. The request returns 401 if no team can be selected. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/ConnectCreateConnectorRequest' + /v2/connect/connectors/{connector}: + patch: + description: Update a connector and return the connector with any service-side update signals that the caller must handle. + operationId: updateConnector + security: + - bearerToken: [] + summary: Update a connector + tags: + - connect + responses: + '200': + description: The updated connector and any required service-side follow-up signals. + content: + application/json: + schema: + $ref: '#/components/schemas/ConnectConnectorUpdateResult' + '400': + description: |- + One of the provided values in the request body is invalid. + One of the provided values in the request query is invalid. + content: + application/json: + schema: + $ref: '#/components/schemas/ConnectError' + '401': + description: The request is not authorized. + content: + application/json: + schema: + $ref: '#/components/schemas/ConnectError' + '403': + description: You do not have permission to access this resource. + content: + application/json: + schema: + $ref: '#/components/schemas/ConnectError' + '404': + description: The requested resource was not found. + content: + application/json: + schema: + $ref: '#/components/schemas/ConnectError' + '409': + description: The request conflicts with the current resource state. + content: + application/json: + schema: + $ref: '#/components/schemas/ConnectError' + '410': + description: The requested resource is no longer available. + content: + application/json: + schema: + $ref: '#/components/schemas/ConnectError' + '422': + description: The request cannot be completed in the current state. + content: + application/json: + schema: + $ref: '#/components/schemas/ConnectError' + '502': + description: A dependency returned an invalid or unsuccessful response. + content: + application/json: + schema: + $ref: '#/components/schemas/ConnectError' + parameters: + - name: connector + description: 'Stable connector ID or URL-encoded team-scoped UID. Examples: `scl_abc123` or `slack%2Fmy-bot`.' + in: path + required: true + schema: + type: string + description: 'Stable connector ID or URL-encoded team-scoped UID. Examples: `scl_abc123` or `slack%2Fmy-bot`.' + - description: The team ID that scopes the request. Do not send it with slug. If both are omitted, Vercel uses the team associated with the token or the authenticated user's default team. The request returns 401 if no team can be selected. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The team slug that scopes the request. Do not send it with teamId. If both are omitted, Vercel uses the team associated with the token or the authenticated user's default team. The request returns 401 if no team can be selected. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/ConnectUpdateConnectorRequest' + required: true + /v1/connect/connectors/{connector}/trigger-destinations: + patch: + description: Replace the full set of destinations that receive trigger requests for a connector. + operationId: replaceConnectorTriggerDestinations + security: + - bearerToken: [] + summary: Update connector trigger destinations + tags: + - connect + responses: + '200': + description: The connector with its replaced trigger destinations. + content: + application/json: + schema: + $ref: '#/components/schemas/ConnectConnector' + '400': + description: |- + One of the provided values in the request body is invalid. + One of the provided values in the request query is invalid. + content: + application/json: + schema: + $ref: '#/components/schemas/ConnectError' + '401': + description: The request is not authorized. + content: + application/json: + schema: + $ref: '#/components/schemas/ConnectError' + '403': + description: You do not have permission to access this resource. + content: + application/json: + schema: + $ref: '#/components/schemas/ConnectError' + '404': + description: The requested resource was not found. + content: + application/json: + schema: + $ref: '#/components/schemas/ConnectError' + '410': + description: The requested resource is no longer available. + content: + application/json: + schema: + $ref: '#/components/schemas/ConnectError' + '422': + description: The request cannot be completed in the current state. + content: + application/json: + schema: + $ref: '#/components/schemas/ConnectError' + parameters: + - name: connector + description: 'Stable connector ID or URL-encoded team-scoped UID. Examples: `scl_abc123` or `slack%2Fmy-bot`.' + in: path + required: true + schema: + type: string + description: 'Stable connector ID or URL-encoded team-scoped UID. Examples: `scl_abc123` or `slack%2Fmy-bot`.' + - description: The team ID that scopes the request. Do not send it with slug. If both are omitted, Vercel uses the team associated with the token or the authenticated user's default team. The request returns 401 if no team can be selected. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The team slug that scopes the request. Do not send it with teamId. If both are omitted, Vercel uses the team associated with the token or the authenticated user's default team. The request returns 401 if no team can be selected. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/ConnectReplaceTriggerDestinationsRequest' + required: true + /v2/connect/connectors/{connector}/projects: + get: + description: List the projects connected to a connector and the environments where each connection is available. + operationId: listConnectorProjectConnections + security: + - bearerToken: [] + summary: List projects for a connector + tags: + - connect + responses: + '200': + description: A page of project connections for the connector. + content: + application/json: + schema: + $ref: '#/components/schemas/ConnectConnectorProjectConnectionList' + '400': + description: One of the provided values in the request query is invalid. + content: + application/json: + schema: + $ref: '#/components/schemas/ConnectError' + '401': + description: The request is not authorized. + content: + application/json: + schema: + $ref: '#/components/schemas/ConnectError' + '403': + description: You do not have permission to access this resource. + content: + application/json: + schema: + $ref: '#/components/schemas/ConnectError' + '404': + description: The requested resource was not found. + content: + application/json: + schema: + $ref: '#/components/schemas/ConnectError' + '410': + description: The requested resource is no longer available. + content: + application/json: + schema: + $ref: '#/components/schemas/ConnectError' + '422': + description: The request cannot be completed in the current state. + content: + application/json: + schema: + $ref: '#/components/schemas/ConnectError' + parameters: + - name: connector + description: 'Stable connector ID or URL-encoded team-scoped UID. Examples: `scl_abc123` or `slack%2Fmy-bot`.' + in: path + required: true + schema: + type: string + description: 'Stable connector ID or URL-encoded team-scoped UID. Examples: `scl_abc123` or `slack%2Fmy-bot`.' + - name: limit + description: Maximum number of project connections to return. Defaults to 50. + in: query + required: false + schema: + type: integer + minimum: 1 + maximum: 100 + description: Maximum number of project connections to return. Defaults to 50. + - name: cursor + description: Cursor from `pagination.next` on the previous response. + in: query + required: false + schema: + type: string + description: Cursor from `pagination.next` on the previous response. + - description: The team ID that scopes the request. Do not send it with slug. If both are omitted, Vercel uses the team associated with the token or the authenticated user's default team. The request returns 401 if no team can be selected. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The team slug that scopes the request. Do not send it with teamId. If both are omitted, Vercel uses the team associated with the token or the authenticated user's default team. The request returns 401 if no team can be selected. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + /v1/connect/connectors/{connector}/projects/{project_id}: + get: + description: Get the configuration that connects a connector to a project. + operationId: getConnectorProjectConnection + security: + - bearerToken: [] + summary: Get a connector project connection + tags: + - connect + responses: + '200': + description: The connector project connection. + content: + application/json: + schema: + $ref: '#/components/schemas/ConnectProjectConnection' + '400': + description: One of the provided values in the request query is invalid. + content: + application/json: + schema: + $ref: '#/components/schemas/ConnectError' + '401': + description: The request is not authorized. + content: + application/json: + schema: + $ref: '#/components/schemas/ConnectError' + '403': + description: You do not have permission to access this resource. + content: + application/json: + schema: + $ref: '#/components/schemas/ConnectError' + '404': + description: The requested resource was not found. + content: + application/json: + schema: + $ref: '#/components/schemas/ConnectError' + '410': + description: The requested resource is no longer available. + content: + application/json: + schema: + $ref: '#/components/schemas/ConnectError' + parameters: + - name: connector + description: 'Stable connector ID or URL-encoded team-scoped UID. Examples: `scl_abc123` or `slack%2Fmy-bot`.' + in: path + required: true + schema: + type: string + description: 'Stable connector ID or URL-encoded team-scoped UID. Examples: `scl_abc123` or `slack%2Fmy-bot`.' + - name: project_id + description: Vercel project ID. + in: path + required: true + schema: + type: string + description: Vercel project ID. + - description: The team ID that scopes the request. Do not send it with slug. If both are omitted, Vercel uses the team associated with the token or the authenticated user's default team. The request returns 401 if no team can be selected. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The team slug that scopes the request. Do not send it with teamId. If both are omitted, Vercel uses the team associated with the token or the authenticated user's default team. The request returns 401 if no team can be selected. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + post: + description: Connect a connector to a project, or replace the environments on an existing project connection. + operationId: upsertConnectorProjectConnection + security: + - bearerToken: [] + summary: Create or update a connector project connection + tags: + - connect + responses: + '200': + description: The connector project connection was created or updated. + content: + application/json: + schema: + $ref: '#/components/schemas/ConnectProjectConnection' + '400': + description: |- + One of the provided values in the request body is invalid. + One of the provided values in the request query is invalid. + content: + application/json: + schema: + $ref: '#/components/schemas/ConnectError' + '401': + description: The request is not authorized. + content: + application/json: + schema: + $ref: '#/components/schemas/ConnectError' + '403': + description: You do not have permission to access this resource. + content: + application/json: + schema: + $ref: '#/components/schemas/ConnectError' + '404': + description: The requested resource was not found. + content: + application/json: + schema: + $ref: '#/components/schemas/ConnectError' + '410': + description: The requested resource is no longer available. + content: + application/json: + schema: + $ref: '#/components/schemas/ConnectError' + parameters: + - name: connector + description: 'Stable connector ID or URL-encoded team-scoped UID. Examples: `scl_abc123` or `slack%2Fmy-bot`.' + in: path + required: true + schema: + type: string + description: 'Stable connector ID or URL-encoded team-scoped UID. Examples: `scl_abc123` or `slack%2Fmy-bot`.' + - name: project_id + description: Vercel project ID. + in: path + required: true + schema: + type: string + description: Vercel project ID. + - description: The team ID that scopes the request. Do not send it with slug. If both are omitted, Vercel uses the team associated with the token or the authenticated user's default team. The request returns 401 if no team can be selected. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The team slug that scopes the request. Do not send it with teamId. If both are omitted, Vercel uses the team associated with the token or the authenticated user's default team. The request returns 401 if no team can be selected. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/ConnectUpsertProjectConnectionRequest' + required: true + delete: + description: Disconnect a connector from a project. + operationId: deleteConnectorProjectConnection + security: + - bearerToken: [] + summary: Disconnect a connector from a project + tags: + - connect + responses: + '204': + description: The connector was disconnected from the project. + '400': + description: One of the provided values in the request query is invalid. + content: + application/json: + schema: + $ref: '#/components/schemas/ConnectError' + '401': + description: The request is not authorized. + content: + application/json: + schema: + $ref: '#/components/schemas/ConnectError' + '403': + description: You do not have permission to access this resource. + content: + application/json: + schema: + $ref: '#/components/schemas/ConnectError' + '404': + description: The requested resource was not found. + content: + application/json: + schema: + $ref: '#/components/schemas/ConnectError' + '410': + description: The requested resource is no longer available. + content: + application/json: + schema: + $ref: '#/components/schemas/ConnectError' + parameters: + - name: connector + description: 'Stable connector ID or URL-encoded team-scoped UID. Examples: `scl_abc123` or `slack%2Fmy-bot`.' + in: path + required: true + schema: + type: string + description: 'Stable connector ID or URL-encoded team-scoped UID. Examples: `scl_abc123` or `slack%2Fmy-bot`.' + - name: project_id + description: Vercel project ID. + in: path + required: true + schema: + type: string + description: Vercel project ID. + - description: The team ID that scopes the request. Do not send it with slug. If both are omitted, Vercel uses the team associated with the token or the authenticated user's default team. The request returns 401 if no team can be selected. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The team slug that scopes the request. Do not send it with teamId. If both are omitted, Vercel uses the team associated with the token or the authenticated user's default team. The request returns 401 if no team can be selected. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + /v2/connect/projects/{project_id}/connectors: + get: + description: List the connectors connected to a project and the environments where each connection is available. + operationId: listProjectConnectorConnections + security: + - bearerToken: [] + summary: List connectors for a project + tags: + - connect + responses: + '200': + description: A page of connector connections for the project. + content: + application/json: + schema: + $ref: '#/components/schemas/ConnectProjectConnectorConnectionList' + '400': + description: One of the provided values in the request query is invalid. + content: + application/json: + schema: + $ref: '#/components/schemas/ConnectError' + '401': + description: The request is not authorized. + content: + application/json: + schema: + $ref: '#/components/schemas/ConnectError' + '403': + description: You do not have permission to access this resource. + content: + application/json: + schema: + $ref: '#/components/schemas/ConnectError' + '404': + description: The requested resource was not found. + content: + application/json: + schema: + $ref: '#/components/schemas/ConnectError' + '410': + description: The requested resource is no longer available. + content: + application/json: + schema: + $ref: '#/components/schemas/ConnectError' + parameters: + - name: project_id + description: Vercel project ID. + in: path + required: true + schema: + type: string + description: Vercel project ID. + - name: limit + description: Maximum number of connector connections to return. Defaults to 50. + in: query + required: false + schema: + type: integer + minimum: 1 + maximum: 100 + description: Maximum number of connector connections to return. Defaults to 50. + - name: cursor + description: Cursor from `pagination.next` on the previous response. + in: query + required: false + schema: + type: string + description: Cursor from `pagination.next` on the previous response. + - description: The team ID that scopes the request. Do not send it with slug. If both are omitted, Vercel uses the team associated with the token or the authenticated user's default team. The request returns 401 if no team can be selected. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The team slug that scopes the request. Do not send it with teamId. If both are omitted, Vercel uses the team associated with the token or the authenticated user's default team. The request returns 401 if no team can be selected. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + /v1/connect/token/{connector}: + post: + description: Get an access token for a connector identified by the path parameter and scoped to the requester. + operationId: getConnectorToken + security: + - bearerToken: [] + summary: Get a Connect token + tags: + - connect + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + token: + type: string + tokenId: + type: string + expiresAt: + type: number + connector: + properties: + id: + type: string + uid: + type: string + type: + type: string + required: + - id + - type + - uid + type: object + name: + type: string + installationId: + type: string + tenantId: + type: string + externalSubject: + type: string + authorizationId: + type: string + description: Stable id correlating all tokens (including refreshes) back to the original authorization. + tokenGroupId: + type: string + description: Stable id that groups all tokens with the same parameters across refreshes. + claims: + additionalProperties: true + type: object + description: Claims extracted from the provider's tokens per the connector's `ForwardedClaims` allow-list. Currently sourced from the OIDC id_token only. + metadata: + additionalProperties: true + type: object + description: Driver-specific metadata (e.g., botUserId for Slack). + required: + - connector + - expiresAt + - token + - tokenId + type: object + '400': + description: |- + One of the provided values in the request body is invalid. + One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + '422': + description: '' + '429': + description: '' + parameters: + - name: connector + in: path + required: true + schema: + type: string + requestBody: + content: + application/json: + schema: + type: object + properties: + subject: + title: type:app + type: object + required: + - type + - token + properties: + type: + type: string + enum: + - app + id: + type: string + issuer: + type: string + sub: + type: string + iss: + type: string + aud: + type: string + additionalClaims: + type: object + additionalProperties: true + token: + type: string + additionalProperties: true + not: + properties: + type: + type: string + enum: + - token + required: + - type + type: object + installationId: + type: string + audience: + type: array + items: + type: string + scopes: + type: array + items: + type: string + resources: + type: array + items: + type: string + authorizationDetails: + type: array + items: + type: object + properties: + type: + type: string + additionalProperties: true + validityBufferMs: + type: number + /v1/connect/authorize/{connector}: + post: + description: Create an authorization request for a connector and return the URL and verifier details needed to complete the flow. + operationId: createConnectorAuthorizationRequest + security: + - bearerToken: [] + summary: Create a Connect authorization request + tags: + - connect + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + url: + type: string + request: + type: string + verifier: + type: string + deviceCode: + type: string + expiresAt: + type: number + connector: + properties: + id: + type: string + description: Client id (e.g. `scl_…`). + uid: + type: string + description: Client uid (e.g. `salesforce/my-org`). + type: + type: string + description: Client type (e.g. `oauth`, `salesforce`). + service: + type: string + description: Resolved service id when known (e.g. `salesforce`), following the `stored.service ?? typeDef.service ?? stored.type` convention. + serviceName: + type: string + description: Curated display name of the resolved service (e.g. "Salesforce"), present when the service is a known service. Suited for end-user surfaces like "Sign in with {serviceName}". + displayName: + type: string + description: Provider-facing display name when the connector type exposes one, falling back to the stored connector name. + name: + type: string + description: 'The connector''s own name: the operator-given client name, falling back to the client type''s name for legacy rows without one.' + required: + - displayName + - id + - name + - type + - uid + type: object + required: + - connector + - expiresAt + - request + - url + - verifier + type: object + '400': + description: |- + One of the provided values in the request body is invalid. + One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + parameters: + - name: connector + in: path + required: true + schema: + type: string + requestBody: + content: + application/json: + schema: + type: object + properties: + subject: + title: type:app + type: object + required: + - type + - token + properties: + type: + type: string + enum: + - app + id: + type: string + issuer: + type: string + sub: + type: string + iss: + type: string + aud: + type: string + additionalClaims: + type: object + additionalProperties: true + token: + type: string + additionalProperties: true + not: + properties: + type: + type: string + enum: + - token + required: + - type + type: object + installationId: + type: string + audience: + type: array + items: + type: string + scopes: + type: array + items: + type: string + resources: + type: array + items: + type: string + authorizationDetails: + type: array + items: + type: object + properties: + type: + type: string + additionalProperties: true + validityBufferMs: + type: number + returnUrl: + type: string + webhook: + type: string + prompt: + type: string + deviceCode: + type: boolean + expiresInMs: + type: number + additionalParams: + type: object + additionalProperties: + type: string +components: + schemas: + ConnectConnectorList: + properties: + connectors: + items: + $ref: '#/components/schemas/ConnectConnector' + type: array + description: Connectors in this page. + pagination: + $ref: '#/components/schemas/ConnectPagination' + description: Cursor for the next page. + required: + - connectors + - pagination + type: object + description: Page of connectors. + ConnectError: + type: object + description: Error response returned by a Connect API operation. + required: + - error + additionalProperties: false + properties: + error: + type: object + required: + - code + - message + additionalProperties: true + properties: + code: + type: string + description: Stable machine-readable error code. + message: + type: string + description: Human-readable error message. + description: Error details. + ConnectConnector: + properties: + id: + type: string + description: Stable `scl_` connector ID. Use this value directly in `{connector}`. + uid: + type: string + description: Team-scoped UID. URL-encode this value before using it in `{connector}`. + defaultInstallationId: + type: string + description: Installation used when a token request does not specify an installation. + createdAt: + type: number + description: Creation time in epoch milliseconds. + updatedAt: + type: number + description: Last update time in epoch milliseconds. + reinstallAt: + type: number + description: Time when this connector started requiring reinstallation because an installation-affecting app-token grant changed. + createdBy: + description: Principal that created the connector. + properties: + type: + type: string + enum: + - user + description: Principal kind. + id: + type: string + description: Vercel user ID. + environment: + oneOf: + - type: string + - type: string + enum: + - development + - preview + - production + description: Deployment environment of the project principal. + required: + - id + - type + - environment + type: object + updatedBy: + description: Principal that most recently updated the connector. + properties: + type: + type: string + enum: + - user + description: Principal kind. + id: + type: string + description: Vercel user ID. + environment: + oneOf: + - type: string + - type: string + enum: + - development + - preview + - production + description: Deployment environment of the project principal. + required: + - id + - type + - environment + type: object + creationMode: + type: string + enum: + - managed + - manual + description: How the connector row was originally created. New create paths stamp this explicitly; older rows may omit it. + managed: + properties: + sync: + type: boolean + enum: + - false + - true + description: Whether Vercel synchronizes provider-side configuration. + type: object + description: Managed connector metadata exposed without leaking the manager connector or installation identifiers. + type: + type: string + enum: + - api-key + - aws-alpha + - custom + - discord + - github + - linear + - linq + - microsoft-entra + - microsoft-teams + - oauth + - photon + - salesforce + - sendblue + - slack + - snowflake + - snowflake-wif + description: Connector implementation type. + service: + type: string + description: 'Best-effort identifier of the third-party service this connector represents, independent of `type`. Examples: `''slack''`, `''mcp.linear.app''`, and `''auth.example.com''`. Always present in API responses.' + connectionMethod: + type: string + description: The connection method this connector was created from, when the create request named one. + target: + type: string + description: Which of the service's products/surfaces this connector points at. + name: + type: string + description: Connector name within the owning team. + displayName: + type: string + description: Human-readable connector name. + clientUrl: + nullable: true + type: string + description: Provider-side URL for viewing or managing the resource represented by the connector. The destination can be an app, account, phone line, or service instance, depending on the connector type. + redirectUri: + type: string + description: Redirect URI registered with the third-party service for this connector, if any. Used by `startAuthorization`/`startInstallation` to replay the exact URI back to the provider's token endpoint. Absent on connectors created before this field was introduced; those callers fall back to the `https://connect.vercel.com/callback` default. + typeName: + type: string + description: Human-readable name of the connector type. + typeIcon: + type: string + description: Icon identifier supplied by the connector type. + website: + type: string + description: Public website for the connected service. + devsite: + type: string + description: Developer website for the connected service. + docsite: + type: string + description: Developer documentation for the connected service. + icon: + type: string + description: Connector branding icon. SHA-1 hash that resolves to the uploaded icon through the Vercel avatar service. Consumers render this with `https://vercel.com/api/www/avatar/{icon}`. + backgroundColor: + type: string + description: Hex background color (e.g., `#000000`) for branding. + accentColor: + type: string + description: Hex accent color (e.g., `#000000`) for branding. + supportedSubjectTypes: + items: + type: string + type: array + description: Token subject types supported by the connector. + appTokens: + properties: + crossInstallation: + type: boolean + enum: + - false + - true + description: Whether one app token can be used across installations. + supportsRefinement: + type: boolean + enum: + - false + - true + description: Whether callers can narrow app-token grants per request. + supportsResources: + type: boolean + enum: + - false + - true + description: Whether callers can request resource-specific app tokens. + requiresReinstallation: + type: boolean + enum: + - false + - true + description: True when changing app token grants requires reinstalling the app, so tokens cannot be partitioned independently by requester environment. + scopes: + items: + type: string + type: array + description: Known allowed app-level scopes. For Slack this is the bot scope set configured on the app; for OAuth it is the connector's enabled `clientCredentials.scopes` configuration. + supportedAuthorizationDetails: + items: + type: string + type: array + description: Supported OAuth authorization-detail type names. + permissionsUrl: + type: string + description: Link to the page on the service where this connector's app-level permissions are declared and granted, when the service has one and it differs from `clientUrl`. + required: + - crossInstallation + - supportsRefinement + type: object + description: App-token capabilities and known grants for the connector. + userTokens: + properties: + crossInstallation: + type: boolean + enum: + - false + - true + description: Whether one user token can be used across installations. + supportsRefinement: + type: boolean + enum: + - false + - true + description: Whether callers can narrow user-token grants per request. + supportsResources: + type: boolean + enum: + - false + - true + description: Whether callers can request resource-specific user tokens. + scopes: + items: + type: string + type: array + description: Known allowed user-level scopes. For Slack this is the user scope set configured on the app; for OAuth it is the connector's enabled `userAuthorization.scopes` configuration. + supportedAuthorizationDetails: + items: + type: string + type: array + description: Supported OAuth authorization-detail type names. + manualCredentialInput: + type: boolean + enum: + - false + - true + description: User authorization is completed by the Connect consent screen submitting a credential instead of an OAuth redirect. + required: + - crossInstallation + - supportsRefinement + type: object + description: User-token capabilities and known grants for the connector. + supportsInstallation: + type: boolean + enum: + - false + - true + description: Whether the connector supports an installation flow. + supportsRevocation: + type: boolean + enum: + - false + - true + description: Whether Connect can revoke tokens for this connector. + supportsTriggers: + type: boolean + enum: + - false + - true + description: Whether this connector type supports trigger webhooks. Derived from the type definition; indicates that `triggers` and `triggerDestinations` may be meaningful for this connector. + supportsIcon: + enum: + - false + - maybe + - true + description: Whether the connector icon can propagate to the provider. + triggers: + $ref: '#/components/schemas/ConnectTriggerConfiguration' + description: Incoming trigger configuration for the connector. + events: + items: + type: string + type: array + description: Known events this connector subscribes to (e.g. Slack bot events, GitHub webhook events). Names are type-specific and validated by the managed-create flow when forwarded to the third-party service. + triggerDestinations: + items: + $ref: '#/components/schemas/ConnectTriggerDestination' + type: array + description: Destinations that incoming triggers should be forwarded to. Limited to 3 entries. Set the initial destination with `triggerDestination` during creation. Replace the complete set with `PATCH /v1/connect/connectors/{connector}/trigger-destinations`. + required: + - createdAt + - displayName + - id + - name + - service + - supportedSubjectTypes + - supportsIcon + - supportsInstallation + - supportsRevocation + - supportsTriggers + - type + - typeName + - uid + - updatedAt + type: object + description: A connector that defines how Vercel accesses an external service. + ConnectConnectorCreateResult: + properties: + id: + type: string + description: Stable `scl_` connector ID. Use this value directly in `{connector}`. + uid: + type: string + description: Team-scoped UID. URL-encode this value before using it in `{connector}`. + defaultInstallationId: + type: string + description: Installation used when a token request does not specify an installation. + createdAt: + type: number + description: Creation time in epoch milliseconds. + updatedAt: + type: number + description: Last update time in epoch milliseconds. + reinstallAt: + type: number + description: Time when this connector started requiring reinstallation because an installation-affecting app-token grant changed. + createdBy: + description: Principal that created the connector. + properties: + type: + type: string + enum: + - user + description: Principal kind. + id: + type: string + description: Vercel user ID. + environment: + oneOf: + - type: string + - type: string + enum: + - development + - preview + - production + x-speakeasy-name-override: created_by_environment + description: Deployment environment of the project principal. + title: CreatedByEnvironmentTarget + required: + - id + - type + - environment + type: object + updatedBy: + description: Principal that most recently updated the connector. + properties: + type: + type: string + enum: + - user + description: Principal kind. + id: + type: string + description: Vercel user ID. + environment: + oneOf: + - type: string + - type: string + enum: + - development + - preview + - production + x-speakeasy-name-override: updated_by_environment + description: Deployment environment of the project principal. + title: UpdatedByEnvironmentTarget + required: + - id + - type + - environment + type: object + creationMode: + type: string + enum: + - managed + - manual + description: How the connector row was originally created. New create paths stamp this explicitly; older rows may omit it. + managed: + properties: + sync: + type: boolean + enum: + - false + - true + description: Whether Vercel synchronizes provider-side configuration. + type: object + description: Managed connector metadata exposed without leaking the manager connector or installation identifiers. + type: + type: string + enum: + - api-key + - aws-alpha + - custom + - discord + - github + - linear + - linq + - microsoft-entra + - microsoft-teams + - oauth + - photon + - salesforce + - sendblue + - slack + - snowflake + - snowflake-wif + description: Connector implementation type. + service: + type: string + description: 'Best-effort identifier of the third-party service this connector represents, independent of `type`. Examples: `''slack''`, `''mcp.linear.app''`, and `''auth.example.com''`. Always present in API responses.' + connectionMethod: + type: string + description: The connection method this connector was created from, when the create request named one. + target: + type: string + description: Which of the service's products/surfaces this connector points at. + name: + type: string + description: Connector name within the owning team. + displayName: + type: string + description: Human-readable connector name. + clientUrl: + nullable: true + type: string + description: Provider-side URL for viewing or managing the resource represented by the connector. The destination can be an app, account, phone line, or service instance, depending on the connector type. + redirectUri: + type: string + description: Redirect URI registered with the third-party service for this connector, if any. Used by `startAuthorization`/`startInstallation` to replay the exact URI back to the provider's token endpoint. Absent on connectors created before this field was introduced; those callers fall back to the `https://connect.vercel.com/callback` default. + typeName: + type: string + description: Human-readable name of the connector type. + typeIcon: + type: string + description: Icon identifier supplied by the connector type. + website: + type: string + description: Public website for the connected service. + devsite: + type: string + description: Developer website for the connected service. + docsite: + type: string + description: Developer documentation for the connected service. + icon: + type: string + description: Connector branding icon. SHA-1 hash that resolves to the uploaded icon through the Vercel avatar service. Consumers render this with `https://vercel.com/api/www/avatar/{icon}`. + backgroundColor: + type: string + description: Hex background color (e.g., `#000000`) for branding. + accentColor: + type: string + description: Hex accent color (e.g., `#000000`) for branding. + supportedSubjectTypes: + items: + type: string + type: array + description: Token subject types supported by the connector. + appTokens: + properties: + crossInstallation: + type: boolean + enum: + - false + - true + description: Whether one app token can be used across installations. + supportsRefinement: + type: boolean + enum: + - false + - true + description: Whether callers can narrow app-token grants per request. + supportsResources: + type: boolean + enum: + - false + - true + description: Whether callers can request resource-specific app tokens. + requiresReinstallation: + type: boolean + enum: + - false + - true + description: True when changing app token grants requires reinstalling the app, so tokens cannot be partitioned independently by requester environment. + scopes: + items: + type: string + type: array + description: Known allowed app-level scopes. For Slack this is the bot scope set configured on the app; for OAuth it is the connector's enabled `clientCredentials.scopes` configuration. + supportedAuthorizationDetails: + items: + type: string + type: array + description: Supported OAuth authorization-detail type names. + permissionsUrl: + type: string + description: Link to the page on the service where this connector's app-level permissions are declared and granted, when the service has one and it differs from `clientUrl`. + required: + - crossInstallation + - supportsRefinement + type: object + description: App-token capabilities and known grants for the connector. + userTokens: + properties: + crossInstallation: + type: boolean + enum: + - false + - true + description: Whether one user token can be used across installations. + supportsRefinement: + type: boolean + enum: + - false + - true + description: Whether callers can narrow user-token grants per request. + supportsResources: + type: boolean + enum: + - false + - true + description: Whether callers can request resource-specific user tokens. + scopes: + items: + type: string + type: array + description: Known allowed user-level scopes. For Slack this is the user scope set configured on the app; for OAuth it is the connector's enabled `userAuthorization.scopes` configuration. + supportedAuthorizationDetails: + items: + type: string + type: array + description: Supported OAuth authorization-detail type names. + manualCredentialInput: + type: boolean + enum: + - false + - true + description: User authorization is completed by the Connect consent screen submitting a credential instead of an OAuth redirect. + required: + - crossInstallation + - supportsRefinement + type: object + description: User-token capabilities and known grants for the connector. + supportsInstallation: + type: boolean + enum: + - false + - true + description: Whether the connector supports an installation flow. + supportsRevocation: + type: boolean + enum: + - false + - true + description: Whether Connect can revoke tokens for this connector. + supportsTriggers: + type: boolean + enum: + - false + - true + description: Whether this connector type supports trigger webhooks. Derived from the type definition; indicates that `triggers` and `triggerDestinations` may be meaningful for this connector. + supportsIcon: + enum: + - false + - maybe + - true + description: Whether the connector icon can propagate to the provider. + triggers: + $ref: '#/components/schemas/ConnectTriggerConfiguration' + description: Incoming trigger configuration for the connector. + events: + items: + type: string + type: array + description: Known events this connector subscribes to (e.g. Slack bot events, GitHub webhook events). Names are type-specific and validated by the managed-create flow when forwarded to the third-party service. + triggerDestinations: + items: + $ref: '#/components/schemas/ConnectTriggerDestination' + type: array + description: Destinations that incoming triggers should be forwarded to. Limited to 3 entries. Set the initial destination with `triggerDestination` during creation. Replace the complete set with `PATCH /v1/connect/connectors/{connector}/trigger-destinations`. + required: + - createdAt + - displayName + - id + - name + - service + - supportedSubjectTypes + - supportsIcon + - supportsInstallation + - supportsRevocation + - supportsTriggers + - type + - typeName + - uid + - updatedAt + type: object + description: Connector created by the request. + ConnectCreateConnectorRequest: + type: object + required: + - data + - type + - service + - connectionMethod + properties: + data: + $ref: '#/components/schemas/ConnectConnectorCreateData' + description: Provider configuration for the selected connector type or connection method. + icon: + type: string + description: | + SHA-1 digest of a PNG or JPEG icon that is at least 640 by 640 pixels. This field does not accept a URL or image bytes. + + First compute the digest and upload the raw image with [POST /v2/files](https://vercel.com/docs/rest-api/deployments/upload-deployment-files). Send `Content-Length` and the same 40-character digest in `x-vercel-digest`. Then set `icon` to that digest. + + ```js + import { createHash } from 'node:crypto'; + import { readFile } from 'node:fs/promises'; + + const VERCEL_TOKEN = process.env.VERCEL_TOKEN; + const connectorId = 'scl_...'; + const bytes = await readFile('icon.png'); + const digest = createHash('sha1').update(bytes).digest('hex'); + + await fetch('https://api.vercel.com/v2/files', { + method: 'POST', + headers: { + Authorization: `Bearer ${VERCEL_TOKEN}`, + 'Content-Type': 'application/octet-stream', + 'Content-Length': String(bytes.length), + 'x-vercel-digest': digest, + }, + body: bytes, + }); + + await fetch(`https://api.vercel.com/v2/connect/connectors/${connectorId}`, { + method: 'PATCH', + headers: { + Authorization: `Bearer ${VERCEL_TOKEN}`, + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ icon: digest }), + }); + ``` + pattern: ^[0-9a-fA-F]{40}$ + backgroundColor: + type: string + description: Branding background color (6-digit hex, for example + pattern: ^#[0-9a-fA-F]{6}$ + accentColor: + type: string + description: Branding accent color (6-digit hex, for example + pattern: ^#[0-9a-fA-F]{6}$ + type: + type: string + description: 'Connector implementation type for full configuration. Known types: api-key, discord, github, linear, linq, microsoft-entra, oauth, photon, salesforce, sendblue, slack, snowflake, snowflake-wif. Optional when service and connectionMethod select the type.' + service: + type: string + description: Service slug or URL for which the connector is used. Required when connectionMethod is set. Service alone does not enable preset configuration. + connectionMethod: + type: string + maxLength: 64 + description: Connection method slug of the service. Use it with service to select preset configuration. + params: + type: object + maxProperties: 16 + additionalProperties: + type: string + maxLength: 256 + description: Values for the selected connection method's template fields. Requires connectionMethod. + target: + type: string + maxLength: 64 + description: Which of the service's targets this connector is for. Requires \"connectionMethod\" and must be one that method serves. Optional. + uid: + type: string + description: Optional team-scoped unique identifier for the connector. If omitted or empty, Connect generates a value. + name: + type: string + description: Connector name. The value is trimmed and cannot contain control characters. If omitted or empty, the project name is used. A name or projectId is required. API key connectors require name. + projectId: + type: string + description: Project to connect during creation. If environments is omitted, the connection uses development, preview, and production. + environments: + minItems: 1 + description: Environments for the project connection. Requires projectId. Use one or more built-in environment names or stable custom environment IDs that belong to the project. Duplicate values are accepted and removed. + type: array + items: + anyOf: + - type: string + enum: + - development + - preview + - production + - type: string + pattern: ^env_ + description: A built-in environment name or the stable env_* ID of a custom environment. + triggers: + description: Whether the triggers are enabled for this connector. + type: boolean + triggerDestination: + description: Initial trigger destination. Requires triggers to be enabled and a projectId here or at the top level. Connector responses expose the resulting set as triggerDestinations. Replace the complete set with PATCH /v1/connect/connectors/{connector}/trigger-destinations. + title: Default deployment + type: object + minProperties: 1 + additionalProperties: false + properties: + projectId: + type: string + description: Project that receives triggers. During connector creation, omit it to use the top-level projectId. + minLength: 1 + path: + type: string + maxLength: 2048 + description: Route path on the linked project that receives forwarded trigger requests. + minLength: 1 + branch: + type: string + maxLength: 250 + description: Git branch used to select a preview deployment. + minLength: 1 + customEnvironmentId: + description: Stable custom environment ID that belongs to the destination project. + type: string + pattern: ^env_ + required: + - branch + - customEnvironmentId + events: + type: array + description: Default trigger events for this connector. + items: + type: string + description: Create a connector with full provider configuration or with a known service connection method. + title: Full configuration + ConnectConnectorUpdateResult: + properties: + connector: + $ref: '#/components/schemas/ConnectConnector' + description: Updated connector. + reinstallNeeded: + type: boolean + enum: + - false + - true + description: When true, prompt a team owner or administrator to reinstall the connector before relying on the change. + reconsentNeeded: + $ref: '#/components/schemas/ConnectReconsent' + description: Present when affected users must authorize the connector's new permissions. + serviceSync: + $ref: '#/components/schemas/ConnectServiceSync' + description: Result of synchronizing the change with the external service. + required: + - connector + type: object + description: Updated connector and any required provider follow-up actions. + ConnectUpdateConnectorRequest: + type: object + minProperties: 1 + additionalProperties: false + properties: + triggers: + description: Whether the triggers are enabled for this connector. + type: boolean + events: + type: array + description: Default trigger events for this connector. + items: + type: string + data: + $ref: '#/components/schemas/ConnectConnectorUpdateData' + description: Provider configuration fields to update. + icon: + type: string + description: | + SHA-1 digest of a PNG or JPEG icon that is at least 640 by 640 pixels. This field does not accept a URL or image bytes. + + First compute the digest and upload the raw image with [POST /v2/files](https://vercel.com/docs/rest-api/deployments/upload-deployment-files). Send `Content-Length` and the same 40-character digest in `x-vercel-digest`. Then set `icon` to that digest. + + ```js + import { createHash } from 'node:crypto'; + import { readFile } from 'node:fs/promises'; + + const VERCEL_TOKEN = process.env.VERCEL_TOKEN; + const connectorId = 'scl_...'; + const bytes = await readFile('icon.png'); + const digest = createHash('sha1').update(bytes).digest('hex'); + + await fetch('https://api.vercel.com/v2/files', { + method: 'POST', + headers: { + Authorization: `Bearer ${VERCEL_TOKEN}`, + 'Content-Type': 'application/octet-stream', + 'Content-Length': String(bytes.length), + 'x-vercel-digest': digest, + }, + body: bytes, + }); + + await fetch(`https://api.vercel.com/v2/connect/connectors/${connectorId}`, { + method: 'PATCH', + headers: { + Authorization: `Bearer ${VERCEL_TOKEN}`, + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ icon: digest }), + }); + ``` + pattern: ^[0-9a-fA-F]{40}$ + backgroundColor: + type: string + accentColor: + type: string + uid: + type: string + description: Full team-scoped UID, such as `slack/my-bot`. It cannot contain whitespace, `%`, `#`, control characters, or Vercel-owned namespaces. Changing it breaks callers that use the old UID. The stable connector ID does not change. + name: + type: string + description: Display name for the connector. It is trimmed and cannot be empty or contain control characters. + description: Connector fields to update. + ConnectReplaceTriggerDestinationsRequest: + type: object + required: + - destinations + additionalProperties: false + properties: + destinations: + type: array + maxItems: 3 + description: Complete replacement set of trigger destinations. An empty array removes all destinations. Connector get and list responses expose the saved set as triggerDestinations. + items: + $ref: '#/components/schemas/ConnectTriggerDestinationInput' + description: Complete replacement set of trigger destinations. + ConnectConnectorProjectConnectionList: + properties: + projects: + items: + $ref: '#/components/schemas/ConnectProjectConnection' + type: array + description: Project connections in this page. + pagination: + $ref: '#/components/schemas/ConnectPagination' + description: Cursor for the next page. + required: + - pagination + - projects + type: object + description: Page of projects connected to a connector. + ConnectProjectConnection: + properties: + connectorId: + type: string + description: Stable `scl_` connector ID, even when the request used a UID. + project: + properties: + id: + type: string + description: Same Vercel project ID as the connection's top-level `projectId`. + name: + type: string + description: Current Vercel project name. + customEnvironments: + items: + properties: + id: + type: string + description: Stable custom environment ID. + slug: + type: string + description: Current human-readable custom environment slug. + required: + - id + - slug + type: object + description: Custom environments available on the project. This list can include environments where the connector is not enabled. + type: array + description: Custom environments available on the project. This list can include environments where the connector is not enabled. + required: + - id + - name + type: object + description: Vercel project connected to the connector. + enabledEnvironments: + items: + oneOf: + - type: string + - type: string + enum: + - development + - preview + - production + type: array + description: Environments where the connector is enabled for the project. + createdAt: + type: number + description: Time when the project connection was created, in epoch milliseconds. + updatedAt: + type: number + description: Time when the project connection was last updated, in epoch milliseconds. + required: + - connectorId + - createdAt + - enabledEnvironments + - project + - updatedAt + type: object + description: A connection between a connector and a Vercel project, including the environments where the connector is enabled. + ConnectUpsertProjectConnectionRequest: + type: object + required: + - environments + properties: + environments: + minItems: 1 + description: One or more built-in environment names or stable custom environment IDs that belong to the project. Duplicate values are accepted and removed. + type: array + items: + anyOf: + - type: string + enum: + - development + - preview + - production + - type: string + pattern: ^env_ + description: A built-in environment name or the stable env_* ID of a custom environment. + description: Environments enabled for a connector project connection. + ConnectProjectConnectorConnectionList: + properties: + connectors: + items: + $ref: '#/components/schemas/ConnectProjectConnection' + type: array + description: Connector connections in this page. + pagination: + $ref: '#/components/schemas/ConnectPagination' + description: Cursor for the next page. + required: + - connectors + - pagination + type: object + description: Page of connectors connected to a project. + ConnectPagination: + properties: + next: + nullable: true + type: string + description: Opaque value to pass as `cursor` on the next request. + required: + - next + type: object + description: Cursor for the next page. + ConnectTriggerConfiguration: + properties: + enabled: + type: boolean + enum: + - false + - true + description: Whether incoming triggers are enabled for the connector. + required: + - enabled + type: object + description: Incoming trigger configuration. Only present when enabled. + ConnectTriggerDestination: + properties: + projectId: + type: string + description: Vercel project that receives matching trigger requests. + customEnvironmentId: + type: string + description: Stable custom-environment ID to route this destination to. Mutually exclusive with `branch`; omitted destinations keep the legacy production behavior. + branch: + type: string + description: Git branch used to select a preview deployment. + path: + type: string + description: Route path that receives the forwarded trigger request. + required: + - projectId + type: object + description: Destinations that incoming triggers should be forwarded to. Limited to 3 entries. Set the initial destination with `triggerDestination` during creation. Replace the complete set with `PATCH /v1/connect/connectors/{connector}/trigger-destinations`. + ConnectConnectorCreateData: + description: Provider configuration. With type, provide the complete configuration for that type. With service and connectionMethod, provide only credentials and preferences; Connect supplies the type, endpoints, templates, and defaults. Other connector types accept an arbitrary object. + type: object + properties: + serverUrl: + type: string + description: Authorization server base URL used for discovery. + serverConfig: + description: Authorization server metadata. Values override discovered metadata. Empty known string fields remove their stored overrides. + type: object + properties: + issuer: + type: string + description: Authorization server issuer URL. + authorization_endpoint: + type: string + description: OAuth authorization endpoint URL. + token_endpoint: + type: string + description: OAuth token endpoint URL. + userinfo_endpoint: + type: string + description: OpenID Connect UserInfo endpoint URL. + jwks_uri: + type: string + description: URL of the authorization server JSON Web Key Set. + jwks: + description: Inline authorization server JSON Web Key Set. + type: object + properties: + keys: + type: array + items: + type: object + properties: + kty: + type: string + description: JSON Web Key type. + kid: + type: string + description: JSON Web Key identifier. + use: + type: string + enum: + - sig + - enc + description: 'Intended key use: signing or encryption.' + key_ops: + type: array + items: + type: string + description: Operations permitted for this key. + alg: + type: string + description: Algorithm intended for this key. + required: + - kty + additionalProperties: true + description: JSON Web Keys published by the authorization server. + required: + - keys + additionalProperties: true + revocation_endpoint: + type: string + description: OAuth token revocation endpoint URL. + introspection_endpoint: + type: string + description: OAuth token introspection endpoint URL. + end_session_endpoint: + type: string + description: OpenID Connect session termination endpoint URL. + device_authorization_endpoint: + type: string + description: OAuth device authorization endpoint URL. + registration_endpoint: + type: string + description: OAuth dynamic client registration endpoint URL. + response_types_supported: + type: array + items: + type: string + description: OAuth response types supported by the server. + token_endpoint_auth_methods_supported: + type: array + items: + type: string + description: Token endpoint client authentication methods supported by the server. + token_endpoint_auth_signing_alg_values_supported: + type: array + items: + type: string + description: Signing algorithms supported for token endpoint authentication. + scopes_supported: + type: array + items: + type: string + description: OAuth scopes supported by the server. + grant_types_supported: + type: array + items: + type: string + description: OAuth grant types supported by the server. + response_modes_supported: + type: array + items: + type: string + description: OAuth response modes supported by the server. + subject_types_supported: + type: array + items: + type: string + description: OpenID Connect subject identifier types supported by the server. + id_token_signing_alg_values_supported: + type: array + items: + type: string + description: Signing algorithms supported for ID tokens. + id_token_encryption_alg_values_supported: + type: array + items: + type: string + description: Key management algorithms supported for encrypted ID tokens. + id_token_encryption_enc_values_supported: + type: array + items: + type: string + description: Content encryption algorithms supported for encrypted ID tokens. + claim_types_supported: + type: array + items: + type: string + description: OpenID Connect claim value types supported by the server. + claims_supported: + type: array + items: + type: string + description: Claims that the authorization server can return. + code_challenge_methods_supported: + type: array + items: + type: string + description: PKCE code challenge methods supported by the server. + prompt_values_supported: + type: array + items: + type: string + description: Authorization prompt values supported by the server. + claims_parameter_supported: + type: boolean + description: Whether authorization requests can use the claims parameter. + request_parameter_supported: + type: boolean + description: Whether authorization requests can use signed request objects. + request_uri_parameter_supported: + type: boolean + description: Whether authorization requests can use request_uri. + require_request_uri_registration: + type: boolean + description: Whether request_uri values must be registered in advance. + service_documentation: + type: string + description: Authorization server documentation URL. + op_policy_uri: + type: string + description: Authorization server privacy policy URL. + op_tos_uri: + type: string + description: Authorization server terms of service URL. + logo_uri: + type: string + description: Authorization server logo URL. + client_id_metadata_document_supported: + type: boolean + description: Whether the server supports OAuth client ID metadata documents. + authorization_details_types_supported: + type: array + items: + type: string + description: OAuth authorization-detail types supported by the server. + additionalProperties: true + default: {} + clientId: + type: string + description: OAuth client ID assigned by the provider. + clientName: + type: string + description: OAuth client name. + clientSecret: + type: string + description: OAuth client secret. + writeOnly: true + tokenEndpointAuthMethod: + type: string + description: OAuth token endpoint authentication method. Common values are client_secret_post, client_secret_basic, none, and private_key_jwt. If omitted, Vercel selects a supported method from serverConfig and otherwise uses client_secret_post. + responseType: + type: string + description: OAuth authorization response type. Defaults to code. Other provider-supported values are accepted. An empty string clears the configured type. + pkceRequired: + type: boolean + description: Whether user authorization must use PKCE. + codeChallengeMethod: + type: string + description: PKCE code challenge method. Supported values are S256 and plain. Vercel prefers S256 when the provider supports it. An empty string clears the configured method. + userAuthorization: + description: User authorization grant settings. + type: object + properties: + enabled: + type: boolean + description: Whether this OAuth grant is enabled. + scopes: + type: array + description: 'Default scopes to request when token params specify scopes: [\"*\"].' + items: + type: string + required: + - enabled + additionalProperties: false + refreshTokens: + description: Refresh token settings. + type: object + properties: + enabled: + type: boolean + description: Whether this OAuth grant is enabled. + required: + - enabled + additionalProperties: false + clientCredentials: + description: Client credentials grant settings. + type: object + properties: + enabled: + type: boolean + description: Whether this OAuth grant is enabled. + scopes: + type: array + description: 'Default scopes to request when token params specify scopes: [\"*\"].' + items: + type: string + required: + - enabled + additionalProperties: false + forwardedClaims: + type: object + additionalProperties: false + description: Allow-list of extra claims to propagate, keyed by source (idToken). Only claims named here and present in that source are exposed. + properties: + idToken: + type: array + items: + type: string + description: ID token claim names that Connect can expose. + defaultAudience: + type: string + description: Default audience used when a token request omits one. An empty string clears the default. + defaultTokenExpiresIn: + type: number + minimum: 60 + description: Default token lifetime in seconds to use when the token response omits expires_in. + authorizationUrlParams: + type: object + additionalProperties: + type: string + description: Extra query parameters added to authorization URLs. + jwtBearer: + description: JWT bearer grant settings. + type: object + properties: + enabled: + type: boolean + description: Whether JWT bearer grants are enabled. + scopes: + type: array + description: 'Default scopes to request when token params specify scopes: [\"*\"].' + items: + type: string + sub: + type: string + description: Default JWT subject claim. + iss: + type: string + description: Default JWT issuer claim. + aud: + type: string + description: Default JWT audience claim. + additionalClaims: + type: object + additionalProperties: {} + description: Additional claims included in generated JWT assertions. + ttl: + type: number + description: JWT lifetime in seconds. + minimum: 0 + exclusiveMinimum: true + useClientCredentials: + type: boolean + description: Whether JWT bearer requests also use client credentials. + additionalProperties: false + clientAssertion: + description: '`private_key_jwt` client assertion settings.' + type: object + additionalProperties: false + properties: + type: + type: string + description: OAuth client assertion type. Defaults to urn:ietf:params:oauth:client-assertion-type:jwt-bearer. An empty string clears the configured type. + ttl: + type: number + description: Client assertion lifetime in seconds. + minimum: 0 + exclusiveMinimum: true + claims: + type: object + additionalProperties: {} + description: Additional claims included in the client assertion. + subjectType: + type: string + enum: + - app + - user + description: Which subject the connector issues tokens for. Defaults to \"app\" (connector-level keys). \"user\" connectors store no connector-level values; each user supplies their own key during authorization. + values: + type: array + items: + type: object + properties: + value: + type: string + description: API key value. + writeOnly: true + scope: + type: string + description: Optional scope associated with the API key value. + expiresAt: + type: integer + description: The timestamp when the API key value expires in milliseconds. + minimum: 0 + exclusiveMinimum: true + required: + - value + additionalProperties: false + description: Initial API key values stored by the connector. + serviceUrls: + type: array + minItems: 1 + maxItems: 8 + items: + type: string + format: uri + description: The HTTPS resources the API key authenticates against. + instructions: + type: string + maxLength: 4000 + description: Markdown instructions shown to each user on the authorization screen, explaining how to obtain the key they should paste. + appId: + type: integer + description: GitHub App numeric ID. + minimum: 0 + exclusiveMinimum: true + appSlug: + type: string + description: GitHub App slug. + appName: + type: string + description: GitHub App display name. + owner: + description: GitHub App owner. + type: object + properties: + type: + type: string + enum: + - user + - organization + - User + - Organization + description: GitHub App owner type. + id: + type: integer + description: GitHub App owner numeric ID. + slug: + type: string + description: GitHub App owner login. + name: + type: string + description: GitHub App owner display name. + required: + - type + - id + - slug + additionalProperties: false + privateKeyPem: + type: string + description: GitHub App private key in PEM format. + writeOnly: true + webhookSecret: + type: string + description: GitHub App webhook secret. + writeOnly: true + extras: + type: object + additionalProperties: {} + description: Additional provider metadata stored with the connector. + appScopes: + type: array + items: + type: string + description: OAuth scopes requested for Linear application tokens. + userScopes: + type: array + items: + type: string + description: OAuth scopes requested for Linear user tokens. + ownerOrganization: + description: Linear organization that owns the OAuth application. + type: object + properties: + id: + type: string + description: Linear organization ID. + slug: + type: string + description: Linear organization slug. + name: + type: string + description: Linear organization name. + logoUrl: + type: string + description: Linear organization logo URL. + nullable: true + required: + - id + - slug + - name + additionalProperties: false + application: + description: Linear OAuth application metadata. + type: object + properties: + id: + type: string + description: Linear OAuth application ID. + clientId: + type: string + description: Linear OAuth client ID. + name: + type: string + description: Linear OAuth application name. + description: + type: string + description: Linear OAuth application description. + nullable: true + developer: + type: string + description: Linear OAuth application developer name. + nullable: true + developerUrl: + type: string + description: Linear OAuth application developer URL. + nullable: true + imageUrl: + type: string + description: Linear OAuth application image URL. + nullable: true + redirectUris: + type: array + items: + type: string + description: Registered redirect URIs for the Linear OAuth application. + distribution: + type: string + description: Linear OAuth application distribution mode. + nullable: true + webhookResourceTypes: + type: array + items: + type: string + description: Linear resource types delivered to the webhook. + webhookUrl: + type: string + description: Linear webhook URL. + nullable: true + webhookEnabled: + type: boolean + description: Whether the Linear webhook is enabled. + createdAt: + type: string + description: Linear OAuth application creation timestamp. + updatedAt: + type: string + description: Linear OAuth application update timestamp. + required: + - id + - clientId + - name + additionalProperties: false + apiToken: + type: string + description: Linq partner API token for the shared line. + writeOnly: true + phoneNumbers: + type: array + items: + type: string + pattern: ^\\+[1-9]\\d{1,14}$ + consumerKey: + type: string + description: Salesforce connected app consumer key. + consumerSecret: + type: string + description: Salesforce connected app consumer secret. + writeOnly: true + loginHost: + type: string + description: Salesforce login host, such as login.salesforce.com. + apiKeyId: + type: string + description: Sendblue API key id (`sb-api-key-id`). + apiSecretKey: + type: string + description: Sendblue API secret key (`sb-api-secret-key`). + writeOnly: true + slackTeam: + description: Slack workspace metadata. + type: object + properties: + id: + type: string + description: Slack workspace ID. + name: + type: string + description: Slack workspace name. + domain: + type: string + description: Slack workspace domain. + required: + - id + additionalProperties: false + signingSecret: + type: string + description: Slack request signing secret. + writeOnly: true + verificationToken: + type: string + description: Legacy Slack webhook verification token. + writeOnly: true + botScopes: + type: array + items: + type: string + description: OAuth scopes requested for Slack bot tokens. + slashCommands: + type: array + maxItems: 50 + items: + type: object + properties: + command: + type: string + pattern: ^\\/ + maxLength: 32 + description: Slash command including its leading slash. + description: + type: string + maxLength: 2000 + description: Description shown for the slash command in Slack. + usageHint: + type: string + maxLength: 1000 + description: Optional usage hint shown for the slash command. + shouldEscape: + type: boolean + description: Whether Slack should escape command arguments. + required: + - command + - description + additionalProperties: false + description: Slash commands configured for the managed Slack app. + shortcuts: + type: array + maxItems: 10 + items: + type: object + properties: + type: + type: string + enum: + - global + - message + description: Where Slack exposes the shortcut. + name: + type: string + description: Shortcut display name. + callbackId: + type: string + maxLength: 255 + description: Identifier included in the shortcut callback. + description: + type: string + maxLength: 150 + description: Description shown for the shortcut in Slack. + required: + - type + - name + - callbackId + - description + additionalProperties: false + description: Global and message shortcuts configured for the Slack app. + accountIdentifier: + type: string + description: Snowflake account identifier. + defaultSessionRole: + type: string + description: Default Snowflake role for created sessions. + projectId: + type: string + description: Photon project ID. + projectSecret: + type: string + description: Photon project secret. + writeOnly: true + required: + - clientId + - appId + - appSlug + - appName + - clientSecret + - apiToken + - consumerKey + - consumerSecret + - loginHost + - apiKeyId + - apiSecretKey + - accountIdentifier + - projectId + - projectSecret + additionalProperties: false + title: type:oauth + ConnectReconsent: + properties: + scope: + type: string + enum: + - user + description: The affected authorization scope. user means each affected user must authorize again. + required: + - scope + type: object + description: Existing authorizations no longer cover the connector's configured scopes, so they must be re-authorized. + ConnectServiceSync: + properties: + status: + type: string + enum: + - done + - required + description: done means the external service was updated. required means the Vercel update was saved, but provider-side configuration still needs attention. + errors: + items: + $ref: '#/components/schemas/ConnectServiceSyncError' + type: array + description: Provider synchronization errors. Present when serviceSync.status is required. + required: + - status + type: object + description: Provider-side configuration synchronization result. + ConnectConnectorUpdateData: + description: Provider configuration fields for the connector type. + type: object + properties: + serverUrl: + type: string + description: Authorization server base URL used for discovery. + serverConfig: + description: Authorization server metadata. Values override discovered metadata. Empty known string fields remove their stored overrides. + type: object + properties: + issuer: + type: string + description: Authorization server issuer URL. + authorization_endpoint: + type: string + description: OAuth authorization endpoint URL. + token_endpoint: + type: string + description: OAuth token endpoint URL. + userinfo_endpoint: + type: string + description: OpenID Connect UserInfo endpoint URL. + jwks_uri: + type: string + description: URL of the authorization server JSON Web Key Set. + jwks: + description: Inline authorization server JSON Web Key Set. + type: object + properties: + keys: + type: array + items: + type: object + properties: + kty: + type: string + description: JSON Web Key type. + kid: + type: string + description: JSON Web Key identifier. + use: + type: string + enum: + - sig + - enc + description: 'Intended key use: signing or encryption.' + key_ops: + type: array + items: + type: string + description: Operations permitted for this key. + alg: + type: string + description: Algorithm intended for this key. + required: + - kty + additionalProperties: true + description: JSON Web Keys published by the authorization server. + required: + - keys + additionalProperties: true + revocation_endpoint: + type: string + description: OAuth token revocation endpoint URL. + introspection_endpoint: + type: string + description: OAuth token introspection endpoint URL. + end_session_endpoint: + type: string + description: OpenID Connect session termination endpoint URL. + device_authorization_endpoint: + type: string + description: OAuth device authorization endpoint URL. + registration_endpoint: + type: string + description: OAuth dynamic client registration endpoint URL. + response_types_supported: + type: array + items: + type: string + description: OAuth response types supported by the server. + token_endpoint_auth_methods_supported: + type: array + items: + type: string + description: Token endpoint client authentication methods supported by the server. + token_endpoint_auth_signing_alg_values_supported: + type: array + items: + type: string + description: Signing algorithms supported for token endpoint authentication. + scopes_supported: + type: array + items: + type: string + description: OAuth scopes supported by the server. + grant_types_supported: + type: array + items: + type: string + description: OAuth grant types supported by the server. + response_modes_supported: + type: array + items: + type: string + description: OAuth response modes supported by the server. + subject_types_supported: + type: array + items: + type: string + description: OpenID Connect subject identifier types supported by the server. + id_token_signing_alg_values_supported: + type: array + items: + type: string + description: Signing algorithms supported for ID tokens. + id_token_encryption_alg_values_supported: + type: array + items: + type: string + description: Key management algorithms supported for encrypted ID tokens. + id_token_encryption_enc_values_supported: + type: array + items: + type: string + description: Content encryption algorithms supported for encrypted ID tokens. + claim_types_supported: + type: array + items: + type: string + description: OpenID Connect claim value types supported by the server. + claims_supported: + type: array + items: + type: string + description: Claims that the authorization server can return. + code_challenge_methods_supported: + type: array + items: + type: string + description: PKCE code challenge methods supported by the server. + prompt_values_supported: + type: array + items: + type: string + description: Authorization prompt values supported by the server. + claims_parameter_supported: + type: boolean + description: Whether authorization requests can use the claims parameter. + request_parameter_supported: + type: boolean + description: Whether authorization requests can use signed request objects. + request_uri_parameter_supported: + type: boolean + description: Whether authorization requests can use request_uri. + require_request_uri_registration: + type: boolean + description: Whether request_uri values must be registered in advance. + service_documentation: + type: string + description: Authorization server documentation URL. + op_policy_uri: + type: string + description: Authorization server privacy policy URL. + op_tos_uri: + type: string + description: Authorization server terms of service URL. + logo_uri: + type: string + description: Authorization server logo URL. + client_id_metadata_document_supported: + type: boolean + description: Whether the server supports OAuth client ID metadata documents. + authorization_details_types_supported: + type: array + items: + type: string + description: OAuth authorization-detail types supported by the server. + additionalProperties: true + default: {} + clientId: + type: string + description: OAuth client ID. + clientName: + type: string + description: OAuth client name. + clientSecret: + type: string + description: OAuth client secret. + writeOnly: true + tokenEndpointAuthMethod: + type: string + description: OAuth token endpoint authentication method. Common values are client_secret_post, client_secret_basic, none, and private_key_jwt. If omitted, Vercel selects a supported method from serverConfig and otherwise uses client_secret_post. + responseType: + type: string + description: OAuth authorization response type. Defaults to code. Other provider-supported values are accepted. An empty string clears the configured type. + pkceRequired: + type: boolean + description: Whether user authorization must use PKCE. + codeChallengeMethod: + type: string + description: PKCE code challenge method. Supported values are S256 and plain. Vercel prefers S256 when the provider supports it. An empty string clears the configured method. + userAuthorization: + description: User authorization grant settings. + type: object + properties: + enabled: + type: boolean + description: Whether this OAuth grant is enabled. + scopes: + type: array + description: 'Default scopes to request when token params specify scopes: [\"*\"].' + items: + type: string + required: + - enabled + additionalProperties: false + refreshTokens: + description: Refresh token settings. + type: object + properties: + enabled: + type: boolean + description: Whether this OAuth grant is enabled. + required: + - enabled + additionalProperties: false + clientCredentials: + description: Client credentials grant settings. + type: object + properties: + enabled: + type: boolean + description: Whether this OAuth grant is enabled. + scopes: + type: array + description: 'Default scopes to request when token params specify scopes: [\"*\"].' + items: + type: string + required: + - enabled + additionalProperties: false + forwardedClaims: + type: object + additionalProperties: false + description: Allow-list of extra claims to propagate, keyed by source (idToken). Only claims named here and present in that source are exposed. + properties: + idToken: + type: array + items: + type: string + description: ID token claim names that Connect can expose. + defaultAudience: + type: string + description: Default audience used when a token request omits one. An empty string clears the default. + defaultTokenExpiresIn: + type: number + minimum: 60 + description: Default token lifetime in seconds to use when the token response omits expires_in. + authorizationUrlParams: + type: object + additionalProperties: + type: string + description: Extra query parameters added to authorization URLs. + jwtBearer: + description: JWT bearer grant settings. + type: object + properties: + enabled: + type: boolean + description: Whether JWT bearer grants are enabled. + scopes: + type: array + description: 'Default scopes to request when token params specify scopes: [\"*\"].' + items: + type: string + sub: + type: string + description: Default JWT subject claim. + iss: + type: string + description: Default JWT issuer claim. + aud: + type: string + description: Default JWT audience claim. + additionalClaims: + type: object + additionalProperties: {} + description: Additional claims included in generated JWT assertions. + ttl: + type: number + description: JWT lifetime in seconds. + minimum: 0 + exclusiveMinimum: true + useClientCredentials: + type: boolean + description: Whether JWT bearer requests also use client credentials. + additionalProperties: false + clientAssertion: + description: '`private_key_jwt` client assertion settings.' + type: object + additionalProperties: false + properties: + type: + type: string + description: OAuth client assertion type. Defaults to urn:ietf:params:oauth:client-assertion-type:jwt-bearer. An empty string clears the configured type. + ttl: + type: number + description: Client assertion lifetime in seconds. + minimum: 0 + exclusiveMinimum: true + claims: + type: object + additionalProperties: {} + description: Additional claims included in the client assertion. + toDelete: + type: array + items: + type: string + description: Stored API key value IDs to delete. + toAdd: + type: array + items: + type: object + properties: + value: + type: string + description: API key value. + writeOnly: true + scope: + type: string + description: Optional scope associated with the API key value. + expiresAt: + type: integer + description: The timestamp when the API key value expires in milliseconds. + minimum: 0 + exclusiveMinimum: true + required: + - value + additionalProperties: false + description: API key values to add. + toUpdate: + type: array + items: + type: object + properties: + id: + type: string + description: Stored API key value ID. + value: + anyOf: + - type: string + - type: string + description: Replacement API key value. Use null to keep the stored value. + writeOnly: true + scope: + anyOf: + - type: string + - type: string + description: Replacement scope. Use null to remove the scope. + expiresAt: + anyOf: + - type: integer + minimum: 0 + exclusiveMinimum: true + - type: string + description: The timestamp when the API key value expires in milliseconds. + required: + - id + additionalProperties: false + description: Existing API key values to update. + instructions: + anyOf: + - type: string + maxLength: 4000 + - type: string + description: Markdown instructions shown to each user on the authorization screen, explaining how to obtain the key they should paste. + appId: + type: integer + description: GitHub App numeric ID. + minimum: 0 + exclusiveMinimum: true + appSlug: + type: string + description: GitHub App slug. + appName: + type: string + description: GitHub App display name. + owner: + description: GitHub App owner. + type: object + properties: + type: + type: string + enum: + - user + - organization + - User + - Organization + description: GitHub App owner type. + id: + type: integer + description: GitHub App owner numeric ID. + slug: + type: string + description: GitHub App owner login. + name: + type: string + description: GitHub App owner display name. + required: + - type + - id + - slug + additionalProperties: false + privateKeyPem: + type: string + description: GitHub App private key in PEM format. + writeOnly: true + webhookSecret: + type: string + description: GitHub App webhook secret. + writeOnly: true + extras: + type: object + additionalProperties: {} + description: Additional provider metadata stored with the connector. + appScopes: + type: array + items: + type: string + description: OAuth scopes requested for Linear application tokens. + userScopes: + type: array + items: + type: string + description: OAuth scopes requested for Linear user tokens. + ownerOrganization: + description: Linear organization that owns the OAuth application. + type: object + properties: + id: + type: string + description: Linear organization ID. + slug: + type: string + description: Linear organization slug. + name: + type: string + description: Linear organization name. + logoUrl: + type: string + description: Linear organization logo URL. + nullable: true + required: + - id + - slug + - name + additionalProperties: false + application: + description: Linear OAuth application metadata. + type: object + properties: + id: + type: string + description: Linear OAuth application ID. + clientId: + type: string + description: Linear OAuth client ID. + name: + type: string + description: Linear OAuth application name. + description: + type: string + description: Linear OAuth application description. + nullable: true + developer: + type: string + description: Linear OAuth application developer name. + nullable: true + developerUrl: + type: string + description: Linear OAuth application developer URL. + nullable: true + imageUrl: + type: string + description: Linear OAuth application image URL. + nullable: true + redirectUris: + type: array + items: + type: string + description: Registered redirect URIs for the Linear OAuth application. + distribution: + type: string + description: Linear OAuth application distribution mode. + nullable: true + webhookResourceTypes: + type: array + items: + type: string + description: Linear resource types delivered to the webhook. + webhookUrl: + type: string + description: Linear webhook URL. + nullable: true + webhookEnabled: + type: boolean + description: Whether the Linear webhook is enabled. + createdAt: + type: string + description: Linear OAuth application creation timestamp. + updatedAt: + type: string + description: Linear OAuth application update timestamp. + required: + - id + - clientId + - name + additionalProperties: false + consumerKey: + type: string + description: Salesforce connected app consumer key. + consumerSecret: + type: string + description: Salesforce connected app consumer secret. + writeOnly: true + loginHost: + type: string + description: Salesforce login host, such as login.salesforce.com. + slackTeam: + description: Slack workspace metadata. + type: object + properties: + id: + type: string + description: Slack workspace ID. + name: + type: string + description: Slack workspace name. + domain: + type: string + description: Slack workspace domain. + required: + - id + additionalProperties: false + signingSecret: + type: string + description: Slack request signing secret. + writeOnly: true + verificationToken: + type: string + description: Legacy Slack webhook verification token. + writeOnly: true + botScopes: + type: array + items: + type: string + description: OAuth scopes requested for Slack bot tokens. + slashCommands: + type: array + maxItems: 50 + items: + type: object + properties: + command: + type: string + pattern: ^\\/ + maxLength: 32 + description: Slash command including its leading slash. + description: + type: string + maxLength: 2000 + description: Description shown for the slash command in Slack. + usageHint: + type: string + maxLength: 1000 + description: Optional usage hint shown for the slash command. + shouldEscape: + type: boolean + description: Whether Slack should escape command arguments. + required: + - command + - description + additionalProperties: false + description: Slash commands configured for the managed Slack app. + shortcuts: + type: array + maxItems: 10 + items: + type: object + properties: + type: + type: string + enum: + - global + - message + description: Where Slack exposes the shortcut. + name: + type: string + description: Shortcut display name. + callbackId: + type: string + maxLength: 255 + description: Identifier included in the shortcut callback. + description: + type: string + maxLength: 150 + description: Description shown for the shortcut in Slack. + required: + - type + - name + - callbackId + - description + additionalProperties: false + description: Global and message shortcuts configured for the Slack app. + accountIdentifier: + type: string + description: Snowflake account identifier. + defaultSessionRole: + type: string + description: Default Snowflake role for created sessions. + apiToken: + type: string + description: Linq partner API token for the shared line. + writeOnly: true + phoneNumbers: + type: array + items: + type: string + pattern: ^\\+[1-9]\\d{1,14}$ + apiKeyId: + type: string + description: Sendblue API key id (`sb-api-key-id`). + apiSecretKey: + type: string + description: Sendblue API secret key (`sb-api-secret-key`). + writeOnly: true + projectSecret: + type: string + description: Photon project secret. + writeOnly: true + repairWebhook: + type: boolean + description: Whether Connect should recreate the Photon webhook. + additionalProperties: false + title: type:oauth + ConnectTriggerDestinationInput: + description: A destination in the complete replacement set. Each destination targets the default deployment, a branch, or a custom environment. + title: Default deployment + type: object + required: + - projectId + - branch + - customEnvironmentId + additionalProperties: false + properties: + projectId: + type: string + description: Project that receives matching trigger requests. + minLength: 1 + path: + type: string + maxLength: 2048 + description: Route path on the linked project that receives forwarded trigger requests. + minLength: 1 + branch: + type: string + maxLength: 250 + description: Git branch used to select a preview deployment. + minLength: 1 + customEnvironmentId: + description: Stable custom environment ID that belongs to the destination project. + type: string + pattern: ^env_ + ConnectServiceSyncError: + properties: + message: + type: string + description: Human-readable provider synchronization error. + fields: + items: + type: string + type: array + description: Connector fields that caused the synchronization error. + vendor: + additionalProperties: true + type: object + description: Provider-specific error details that are safe to expose. + required: + - message + type: object + description: Provider synchronization errors, when synchronization is required. + x-stackQL-resources: + connectors: + id: vercel.connect.connectors + name: connectors + title: Connectors + methods: + list: + operation: + $ref: '#/paths/~1v2~1connect~1connectors/get' + response: + mediaType: application/json + openAPIDocKey: '200' + objectKey: $.connectors + request: + nativeCasing: camel + config: + pagination: + requestToken: + key: cursor + location: query + responseToken: + key: $.pagination.next + location: body + queryParamPushdown: + top: + paramName: limit + maxValue: 100 + get: + operation: + $ref: '#/paths/~1v1~1connect~1connectors~1{connector}/get' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + delete: + operation: + $ref: '#/paths/~1v1~1connect~1connectors~1{connector}/delete' + response: + mediaType: application/json + openAPIDocKey: '204' + request: + nativeCasing: camel + create: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v1~1connect~1connectors/post' + response: + mediaType: application/json + openAPIDocKey: '201' + request: + nativeCasing: camel + update: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v2~1connect~1connectors~1{connector}/patch' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + replace_trigger_destinations: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v1~1connect~1connectors~1{connector}~1trigger-destinations/patch' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + get_token: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v1~1connect~1token~1{connector}/post' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + create_authorization_request: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v1~1connect~1authorize~1{connector}/post' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/connectors/methods/get' + - $ref: '#/components/x-stackQL-resources/connectors/methods/list' + insert: + - $ref: '#/components/x-stackQL-resources/connectors/methods/create' + update: + - $ref: '#/components/x-stackQL-resources/connectors/methods/update' + delete: + - $ref: '#/components/x-stackQL-resources/connectors/methods/delete' + replace: [] + connector_project_connections: + id: vercel.connect.connector_project_connections + name: connector_project_connections + title: Connector Project Connections + methods: + list: + operation: + $ref: '#/paths/~1v2~1connect~1connectors~1{connector}~1projects/get' + response: + mediaType: application/json + openAPIDocKey: '200' + objectKey: $.projects + request: + nativeCasing: camel + config: + pagination: + requestToken: + key: cursor + location: query + responseToken: + key: $.pagination.next + location: body + queryParamPushdown: + top: + paramName: limit + maxValue: 100 + get: + operation: + $ref: '#/paths/~1v1~1connect~1connectors~1{connector}~1projects~1{project_id}/get' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + upsert: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v1~1connect~1connectors~1{connector}~1projects~1{project_id}/post' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + delete: + operation: + $ref: '#/paths/~1v1~1connect~1connectors~1{connector}~1projects~1{project_id}/delete' + response: + mediaType: application/json + openAPIDocKey: '204' + request: + nativeCasing: camel + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/connector_project_connections/methods/get' + - $ref: '#/components/x-stackQL-resources/connector_project_connections/methods/list' + insert: + - $ref: '#/components/x-stackQL-resources/connector_project_connections/methods/upsert' + update: [] + delete: + - $ref: '#/components/x-stackQL-resources/connector_project_connections/methods/delete' + replace: [] + project_connectors: + id: vercel.connect.project_connectors + name: project_connectors + title: Project Connectors + methods: + list: + operation: + $ref: '#/paths/~1v2~1connect~1projects~1{project_id}~1connectors/get' + response: + mediaType: application/json + openAPIDocKey: '200' + objectKey: $.connectors + request: + nativeCasing: camel + config: + pagination: + requestToken: + key: cursor + location: query + responseToken: + key: $.pagination.next + location: body + queryParamPushdown: + top: + paramName: limit + maxValue: 100 + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/project_connectors/methods/list' + insert: [] + update: [] + delete: [] + replace: [] +servers: + - url: https://api.vercel.com diff --git a/provider-dev/openapi/src/vercel/v00.00.00000/services/deployments.yaml b/provider-dev/openapi/src/vercel/v00.00.00000/services/deployments.yaml index dfa7d42..2cdde68 100644 --- a/provider-dev/openapi/src/vercel/v00.00.00000/services/deployments.yaml +++ b/provider-dev/openapi/src/vercel/v00.00.00000/services/deployments.yaml @@ -1,387 +1,10 @@ openapi: 3.0.3 -servers: - - url: 'https://api.vercel.com' - description: Production API info: - contact: - email: support@vercel.com - name: Vercel Support - url: 'https://vercel.com/support' + title: deployments API + description: vercel deployments API version: 0.0.1 - title: Vercel API - deployments - description: deployments -components: - schemas: - FileTree: - properties: - name: - type: string - description: The name of the file tree entry - example: my-file.json - type: - type: string - enum: - - directory - - file - - symlink - - lambda - - middleware - - invalid - description: String indicating the type of file tree entry. - example: file - uid: - type: string - description: The unique identifier of the file (only valid for the `file` type) - example: 2d4aad419917f15b1146e9e03ddc9bb31747e4d0 - children: - items: - $ref: '#/components/schemas/FileTree' - type: array - description: The list of children files of the directory (only valid for the `directory` type) - contentType: - type: string - description: The content-type of the file (only valid for the `file` type) - example: application/json - mode: - type: number - description: The file "mode" indicating file type and permissions. - symlink: - type: string - description: Not currently used. See `file-list-to-tree.ts`. - required: - - name - - type - - mode - type: object - description: A deployment file tree entry - Pagination: - properties: - count: - type: number - description: Amount of items in the current page. - example: 20 - next: - nullable: true - type: number - description: Timestamp that must be used to request the next page. - example: 1540095775951 - prev: - nullable: true - type: number - description: Timestamp that must be used to request the previous page. - example: 1540095775951 - required: - - count - - next - - prev - type: object - description: 'This object contains information related to the pagination of the current request, including the necessary parameters to get the next or previous page of data.' - responses: {} - securitySchemes: - bearerToken: - type: http - description: Default authentication mechanism - scheme: bearer - oauth2: - type: oauth2 - flows: - authorizationCode: - authorizationUrl: 'https://api.vercel.com/oauth/authorize' - tokenUrl: 'https://api.vercel.com/oauth/access_token' - scopes: {} - x-stackQL-resources: - builds: - id: vercel.deployments.builds - name: builds - title: Builds - methods: - get_builds_for_deployment: - operation: - $ref: '#/paths/~1deployments~1{deploymentId}~1builds/get' - response: - mediaType: application/json - openAPIDocKey: '200' - objectKey: $.builds - _get_builds_for_deployment: - operation: - $ref: '#/paths/~1deployments~1{deploymentId}~1builds/get' - response: - mediaType: application/json - openAPIDocKey: '200' - sqlVerbs: - select: - - $ref: '#/components/x-stackQL-resources/builds/methods/get_builds_for_deployment' - insert: [] - update: [] - delete: [] - events: - id: vercel.deployments.events - name: events - title: Events - methods: - get_deployment_events: - operation: - $ref: '#/paths/~1v2~1deployments~1{idOrUrl}~1events/get' - response: - mediaType: application/json - openAPIDocKey: '200' - sqlVerbs: - select: - - $ref: '#/components/x-stackQL-resources/events/methods/get_deployment_events' - insert: [] - update: [] - delete: [] - deployments: - id: vercel.deployments.deployments - name: deployments - title: Deployments - methods: - get_deployment: - operation: - $ref: '#/paths/~1v13~1deployments~1{idOrUrl}/get' - response: - mediaType: application/json - openAPIDocKey: '200' - create_deployment: - operation: - $ref: '#/paths/~1v13~1deployments/post' - response: - mediaType: application/json - openAPIDocKey: '200' - cancel_deployment: - operation: - $ref: '#/paths/~1v12~1deployments~1{id}~1cancel/patch' - response: - mediaType: application/json - openAPIDocKey: '200' - get_deployments: - operation: - $ref: '#/paths/~1v6~1deployments/get' - response: - mediaType: application/json - openAPIDocKey: '200' - objectKey: $.deployments - _get_deployments: - operation: - $ref: '#/paths/~1v6~1deployments/get' - response: - mediaType: application/json - openAPIDocKey: '200' - delete_deployment: - operation: - $ref: '#/paths/~1v13~1deployments~1{id}/delete' - response: - mediaType: application/json - openAPIDocKey: '200' - sqlVerbs: - select: - - $ref: '#/components/x-stackQL-resources/deployments/methods/get_deployment' - - $ref: '#/components/x-stackQL-resources/deployments/methods/get_deployments' - insert: - - $ref: '#/components/x-stackQL-resources/deployments/methods/create_deployment' - update: [] - delete: - - $ref: '#/components/x-stackQL-resources/deployments/methods/delete_deployment' - files: - id: vercel.deployments.files - name: files - title: Files - methods: - upload_file: - operation: - $ref: '#/paths/~1v2~1files/post' - response: - mediaType: application/json - openAPIDocKey: '200' - list_deployment_files: - operation: - $ref: '#/paths/~1v6~1deployments~1{id}~1files/get' - response: - mediaType: application/json - openAPIDocKey: '200' - get_deployment_file_contents: - operation: - $ref: '#/paths/~1v6~1deployments~1{id}~1files~1{fileId}/get' - response: - mediaType: application/json - openAPIDocKey: '200' - sqlVerbs: - select: - - $ref: '#/components/x-stackQL-resources/files/methods/list_deployment_files' - insert: [] - update: [] - delete: [] paths: - '/deployments/{deploymentId}/builds': - get: - description: Retrieves the list of builds given their deployment's unique identifier. No longer listed as public API as of May 2023. - operationId: getBuildsForDeployment - security: [] - tags: - - deployments - responses: - '200': - description: '' - content: - application/json: - schema: - properties: - builds: - items: - properties: - id: - type: string - description: The unique identifier of the Build - deploymentId: - type: string - description: The unique identifier of the deployment - entrypoint: - type: string - description: The entrypoint of the deployment - readyState: - type: string - enum: - - INITIALIZING - - BUILDING - - UPLOADING - - DEPLOYING - - READY - - ARCHIVED - - ERROR - - QUEUED - - CANCELED - description: 'The state of the deployment depending on the process of deploying, or if it is ready or in an error state' - readyStateAt: - type: number - description: The time at which the Build state was last modified - scheduledAt: - nullable: true - type: number - description: The time at which the Build was scheduled to be built - createdAt: - type: number - description: The time at which the Build was created - deployedAt: - type: number - description: The time at which the Build was deployed - createdIn: - type: string - description: The region where the Build was first created - use: - type: string - description: The Runtime the Build used to generate the output - config: - properties: - distDir: - type: string - forceBuildIn: - type: string - reuseWorkPathFrom: - type: string - zeroConfig: - type: boolean - type: object - description: An object that contains the Build's configuration - output: - items: - properties: - type: - type: string - enum: - - lambda - - file - - edge - description: The type of the output - path: - type: string - description: The absolute path of the file or Serverless Function - digest: - type: string - description: The SHA1 of the file - mode: - type: number - description: The POSIX file permissions - size: - type: number - description: The size of the file in bytes - lambda: - nullable: true - properties: - functionName: - type: string - deployedTo: - items: - type: string - type: array - memorySize: - type: number - timeout: - type: number - layers: - items: - type: string - type: array - required: - - functionName - - deployedTo - type: object - description: 'If the output is a Serverless Function, an object containing the name, location and memory size of the function' - edge: - nullable: true - properties: - regions: - nullable: true - items: - type: string - type: array - description: 'The regions where the edge function will be invoked. Only exists if the edge function as a regional edge function, see: https://vercel.com/docs/concepts/edge-network/regions#setting-edge-function-regions' - required: - - regions - type: object - description: Exists if the output is an edge function. - required: - - path - - digest - - mode - type: object - description: A list of outputs for the Build that can be either Serverless Functions or static files - type: array - description: A list of outputs for the Build that can be either Serverless Functions or static files - fingerprint: - nullable: true - type: string - description: 'If the Build uses the `@vercel/static` Runtime, it contains a hashed string of all outputs' - copiedFrom: - type: string - required: - - id - - deploymentId - - entrypoint - - readyState - - output - type: object - description: An object representing a Build on Vercel - type: array - required: - - builds - type: object - '400': - description: One of the provided values in the request query is invalid. - '401': - description: '' - '403': - description: You do not have permission to access this resource. - '404': - description: Deployment was not found - parameters: - - name: deploymentId - description: The deployment unique identifier - in: path - required: true - schema: - type: string - description: The deployment unique identifier - '/v2/deployments/{idOrUrl}/events': + /v3/deployments/{id_or_url}/events: get: description: Get the build logs of a deployment by deployment ID and build ID. It can work as an infinite stream of logs or as a JSON endpoint depending on the input parameters. operationId: getDeploymentEvents @@ -392,1080 +15,429 @@ paths: - deployments responses: '200': - description: |- - A stream of jsonlines where each line is a deployment log item. - Array of deployment logs for the provided query. + description: '' content: application/json: schema: - type: array - items: - oneOf: - - properties: - type: - type: string - enum: - - command - created: - type: number - payload: - properties: - deploymentId: - type: string - text: - type: string - id: - type: string - date: - type: number - serial: - type: string - required: - - deploymentId - - id - - date - - serial - type: object - required: - - type - - created - - payload - type: object - - properties: - type: - type: string - enum: - - deployment-state - created: - type: number - payload: - properties: - deploymentId: - type: string - info: - properties: - type: - type: string - name: - type: string - entrypoint: - type: string - path: - type: string - step: - type: string - required: - - type - - name - type: object - id: - type: string - date: - type: number - serial: - type: string - required: - - deploymentId - - info - - id - - date - - serial - type: object - required: - - type - - created - - payload - type: object - - properties: - type: - type: string - enum: - - delimiter - created: - type: number - payload: - properties: - deploymentId: + $ref: '#/components/schemas/GetDeploymentEventsResponse' + application/stream+json: + schema: + properties: + type: + type: string + enum: + - command + - delimiter + - deployment-state + - edge-function-invocation + - exit + - fatal + - metric + - middleware + - middleware-invocation + - report + - stderr + - stdout + created: + type: number + payload: + properties: + deploymentId: + type: string + info: + properties: + type: + type: string + name: + type: string + entrypoint: + type: string + path: + type: string + step: + type: string + readyState: + type: string + serviceName: + type: string + required: + - name + - type + type: object + text: + type: string + id: + type: string + date: + type: number + serial: + type: string + created: + type: number + statusCode: + type: number + requestId: + type: string + proxy: + properties: + timestamp: + type: number + method: + type: string + host: + type: string + path: + type: string + statusCode: + type: number + userAgent: + items: type: string - info: - properties: - type: - type: string - name: - type: string - entrypoint: - type: string - path: - type: string - step: + type: array + referer: + type: string + clientIp: + type: string + region: + type: string + scheme: + type: string + responseByteSize: + type: number + cacheId: + type: string + pathType: + type: string + pathTypeVariant: + type: string + vercelId: + type: string + vercelCache: + type: string + enum: + - BYPASS + - HIT + - MISS + - PRERENDER + - REVALIDATED + - STALE + lambdaRegion: + type: string + wafAction: + type: string + enum: + - bypass + - challenge + - deny + - log + - rate_limit + wafRuleId: + type: string + required: + - host + - method + - timestamp + type: object + required: + - date + - deploymentId + - id + - serial + type: object + date: + type: number + deploymentId: + type: string + id: + type: string + info: + properties: + type: + type: string + name: + type: string + entrypoint: + type: string + path: + type: string + step: + type: string + readyState: + type: string + serviceName: + type: string + required: + - name + - type + type: object + serial: + type: string + text: + type: string + level: + type: string + enum: + - error + - warning + required: + - created + - payload + - type + - date + - deploymentId + - id + - info + - serial + type: object + oneOf: + - properties: + type: + type: string + enum: + - command + - delimiter + - deployment-state + - edge-function-invocation + - exit + - fatal + - metric + - middleware + - middleware-invocation + - report + - stderr + - stdout + created: + type: number + payload: + properties: + deploymentId: + type: string + info: + properties: + type: + type: string + name: + type: string + entrypoint: + type: string + path: + type: string + step: + type: string + readyState: + type: string + serviceName: + type: string + required: + - name + - type + type: object + text: + type: string + id: + type: string + date: + type: number + serial: + type: string + created: + type: number + statusCode: + type: number + requestId: + type: string + proxy: + properties: + timestamp: + type: number + method: + type: string + host: + type: string + path: + type: string + statusCode: + type: number + userAgent: + items: type: string - required: - - type - - name - type: object - id: - type: string - date: - type: number - serial: - type: string - required: - - deploymentId - - info - - id - - date - - serial - type: object - required: - - type - - created - - payload - type: object - - properties: - type: - type: string - enum: - - exit - created: - type: number - payload: - properties: - date: - type: number - text: - type: string - id: - type: string - deploymentId: - type: string - created: - type: number - serial: - type: string - required: - - date - - id - - deploymentId - - created - - serial - type: object - required: - - type - - created - - payload - type: object - - properties: - type: - type: string - enum: - - middleware - created: - type: number - payload: - properties: - deploymentId: - type: string - info: - properties: - type: - type: string - name: - type: string - entrypoint: - type: string - path: - type: string - step: - type: string - required: - - type - - name - type: object - text: - type: string - id: - type: string - date: - type: number - serial: - type: string - requestId: - type: string - required: - - deploymentId - - info - - id - - date - - serial - type: object - required: - - type - - created - - payload - type: object - - properties: - type: - type: string - enum: - - delimiter - - command - - stdout - - stderr - - exit - - deployment-state - - middleware - - middleware-invocation - - edge-function-invocation - - fatal - created: - type: number - payload: - properties: - deploymentId: - type: string - info: - properties: - type: - type: string - name: - type: string - entrypoint: - type: string - path: - type: string - step: - type: string - required: - - type - - name - type: object - text: - type: string - id: - type: string - date: - type: number - serial: - type: string - statusCode: - type: number - requestId: - type: string - required: - - deploymentId - - info - - id - - date - - serial - type: object - required: - - type - - created - - payload - type: object - - oneOf: - - type: object - - properties: - type: - type: string - enum: - - command - created: - type: number - payload: - properties: - deploymentId: - type: string - text: - type: string - id: - type: string - date: - type: number - serial: - type: string - required: - - deploymentId - - id - - date - - serial - type: object - required: - - type - - created - - payload - type: object - - properties: - type: - type: string - enum: - - deployment-state - created: - type: number - payload: - properties: - deploymentId: - type: string - info: - properties: - type: - type: string - name: - type: string - entrypoint: - type: string - path: - type: string - step: - type: string - required: - - type - - name - type: object - id: - type: string - date: - type: number - serial: - type: string - required: - - deploymentId - - info - - id - - date - - serial - type: object - required: - - type - - created - - payload - type: object - - properties: - type: - type: string - enum: - - delimiter - created: - type: number - payload: - properties: - deploymentId: - type: string - info: - properties: - type: - type: string - name: - type: string - entrypoint: - type: string - path: - type: string - step: - type: string - required: - - type - - name - type: object - id: - type: string - date: - type: number - serial: - type: string - required: - - deploymentId - - info - - id - - date - - serial - type: object - required: - - type - - created - - payload - type: object - - properties: - type: - type: string - enum: - - exit - created: - type: number - payload: - properties: - date: - type: number - text: - type: string - id: - type: string - deploymentId: - type: string - created: - type: number - serial: - type: string - required: - - date - - id - - deploymentId - - created - - serial - type: object - required: - - type - - created - - payload - type: object - - properties: - type: - type: string - enum: - - middleware - created: - type: number - payload: - properties: - deploymentId: - type: string - info: - properties: - type: - type: string - name: - type: string - entrypoint: - type: string - path: - type: string - step: - type: string - required: - - type - - name - type: object - text: - type: string - id: - type: string - date: - type: number - serial: - type: string - requestId: - type: string - required: - - deploymentId - - info - - id - - date - - serial - type: object - required: - - type - - created - - payload - type: object - - properties: - type: - type: string - enum: - - delimiter - - command - - stdout - - stderr - - exit - - deployment-state - - middleware - - middleware-invocation - - edge-function-invocation - - fatal - created: - type: number - payload: - properties: - deploymentId: - type: string - info: - properties: - type: - type: string - name: - type: string - entrypoint: - type: string - path: - type: string - step: - type: string - required: - - type - - name - type: object - text: - type: string - id: - type: string - date: - type: number - serial: - type: string - statusCode: - type: number - requestId: - type: string - required: - - deploymentId - - info - - id - - date - - serial - type: object - required: - - type - - created - - payload - type: object - application/stream+json: - schema: - oneOf: - - properties: - type: - type: string - enum: - - command - created: - type: number - payload: - properties: - deploymentId: - type: string - text: - type: string - id: - type: string - date: - type: number - serial: - type: string + type: array + referer: + type: string + clientIp: + type: string + region: + type: string + scheme: + type: string + responseByteSize: + type: number + cacheId: + type: string + pathType: + type: string + pathTypeVariant: + type: string + vercelId: + type: string + vercelCache: + type: string + enum: + - BYPASS + - HIT + - MISS + - PRERENDER + - REVALIDATED + - STALE + lambdaRegion: + type: string + wafAction: + type: string + enum: + - bypass + - challenge + - deny + - log + - rate_limit + wafRuleId: + type: string + required: + - host + - method + - timestamp + type: object required: + - date - deploymentId - id - - date - serial type: object required: - - type - created - payload + - type type: object - properties: - type: - type: string - enum: - - deployment-state created: type: number - payload: + date: + type: number + deploymentId: + type: string + id: + type: string + info: properties: - deploymentId: + type: type: string - info: - properties: - type: - type: string - name: - type: string - entrypoint: - type: string - path: - type: string - step: - type: string - required: - - type - - name - type: object - id: + name: type: string - date: - type: number - serial: + entrypoint: type: string - required: - - deploymentId - - info - - id - - date - - serial - type: object - required: - - type - - created - - payload - type: object - - properties: - type: - type: string - enum: - - delimiter - created: - type: number - payload: - properties: - deploymentId: + path: type: string - info: - properties: - type: - type: string - name: - type: string - entrypoint: - type: string - path: - type: string - step: - type: string - required: - - type - - name - type: object - id: + step: type: string - date: - type: number - serial: + readyState: + type: string + serviceName: type: string required: - - deploymentId - - info - - id - - date - - serial + - name + - type type: object - required: - - type - - created - - payload - type: object - - properties: + serial: + type: string + text: + type: string type: type: string enum: + - command + - delimiter + - deployment-state + - edge-function-invocation - exit - created: - type: number - payload: - properties: - date: - type: number - text: - type: string - id: - type: string - deploymentId: - type: string - created: - type: number - serial: - type: string - required: - - date - - id - - deploymentId - - created - - serial - type: object + - fatal + - metric + - middleware + - middleware-invocation + - report + - stderr + - stdout + level: + type: string + enum: + - error + - warning required: - - type - created - - payload + - date + - deploymentId + - id + - info + - serial + - type type: object - properties: type: type: string enum: - - middleware - created: + - alias-assigned + deploymentId: + type: string + date: type: number - payload: + alias: + items: + type: string + type: array + aliasError: + nullable: true properties: - deploymentId: - type: string - info: - properties: - type: - type: string - name: - type: string - entrypoint: - type: string - path: - type: string - step: - type: string - required: - - type - - name - type: object - text: - type: string - id: - type: string - date: - type: number - serial: + code: type: string - requestId: + message: type: string required: - - deploymentId - - info - - id - - date - - serial + - code + - message type: object - required: - - type - - created - - payload - type: object - - properties: - type: - type: string - enum: - - delimiter - - command - - stdout - - stderr - - exit - - deployment-state - - middleware - - middleware-invocation - - edge-function-invocation - - fatal - created: - type: number - payload: + aliasWarning: + nullable: true properties: - deploymentId: - type: string - info: - properties: - type: - type: string - name: - type: string - entrypoint: - type: string - path: - type: string - step: - type: string - required: - - type - - name - type: object - text: + code: type: string - id: + message: type: string - date: - type: number - serial: + link: type: string - statusCode: - type: number - requestId: + action: type: string required: - - deploymentId - - info - - id - - date - - serial + - code + - message type: object required: + - alias + - aliasError + - aliasWarning + - date + - deploymentId - type - - created - - payload type: object - - oneOf: - - type: object - - properties: - type: - type: string - enum: - - command - created: - type: number - payload: - properties: - deploymentId: - type: string - text: - type: string - id: - type: string - date: - type: number - serial: - type: string - required: - - deploymentId - - id - - date - - serial - type: object - required: - - type - - created - - payload - type: object - - properties: - type: - type: string - enum: - - deployment-state - created: - type: number - payload: - properties: - deploymentId: - type: string - info: - properties: - type: - type: string - name: - type: string - entrypoint: - type: string - path: - type: string - step: - type: string - required: - - type - - name - type: object - id: - type: string - date: - type: number - serial: - type: string - required: - - deploymentId - - info - - id - - date - - serial - type: object - required: - - type - - created - - payload - type: object - - properties: - type: - type: string - enum: - - delimiter - created: - type: number - payload: - properties: - deploymentId: - type: string - info: - properties: - type: - type: string - name: - type: string - entrypoint: - type: string - path: - type: string - step: - type: string - required: - - type - - name - type: object - id: - type: string - date: - type: number - serial: - type: string - required: - - deploymentId - - info - - id - - date - - serial - type: object - required: - - type - - created - - payload - type: object - - properties: - type: - type: string - enum: - - exit - created: - type: number - payload: - properties: - date: - type: number - text: - type: string - id: - type: string - deploymentId: - type: string - created: - type: number - serial: - type: string - required: - - date - - id - - deploymentId - - created - - serial - type: object - required: - - type - - created - - payload - type: object - - properties: - type: - type: string - enum: - - middleware - created: - type: number - payload: - properties: - deploymentId: - type: string - info: - properties: - type: - type: string - name: - type: string - entrypoint: - type: string - path: - type: string - step: - type: string - required: - - type - - name - type: object - text: - type: string - id: - type: string - date: - type: number - serial: - type: string - requestId: - type: string - required: - - deploymentId - - info - - id - - date - - serial - type: object - required: - - type - - created - - payload - type: object - - properties: - type: - type: string - enum: - - delimiter - - command - - stdout - - stderr - - exit - - deployment-state - - middleware - - middleware-invocation - - edge-function-invocation - - fatal - created: - type: number - payload: - properties: - deploymentId: - type: string - info: - properties: - type: - type: string - name: - type: string - entrypoint: - type: string - path: - type: string - step: - type: string - required: - - type - - name - type: object - text: - type: string - id: - type: string - date: - type: number - serial: - type: string - statusCode: - type: number - requestId: - type: string - required: - - deploymentId - - info - - id - - date - - serial - type: object - required: - - type - - created - - payload - type: object '400': description: One of the provided values in the request query is invalid. '401': - description: '' + description: The request is not authorized. '403': description: You do not have permission to access this resource. - '404': - description: The deployment was not found + '410': + description: '' + '500': + description: '' parameters: - - name: idOrUrl + - name: id_or_url description: The unique identifier or hostname of the deployment. in: path required: true @@ -1486,7 +458,7 @@ paths: example: backward description: Order of the returned events based on the timestamp. - name: follow - description: 'When enabled, this endpoint will return live events as they happen.' + description: When enabled, this endpoint will return live events as they happen. in: query required: false schema: @@ -1495,7 +467,7 @@ paths: - 0 - 1 example: 1 - description: 'When enabled, this endpoint will return live events as they happen.' + description: When enabled, this endpoint will return live events as they happen. - name: limit description: Maximum number of events to return. Provide `-1` to return all available logs. in: query @@ -1556,13 +528,107 @@ paths: - 0 - 1 example: 1 - - description: The Team identifier or slug to perform the request on behalf of. + - description: The Team identifier to perform the request on behalf of. in: query name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + /v1/deployments/{deployment_id}/integrations/{integration_configuration_id}/resources/{resource_id}/actions/{action}: + patch: + description: Updates the deployment integration action for the specified integration installation + operationId: update-integration-deployment-action + security: + - bearerToken: [] + summary: Update deployment integration action + tags: + - deployments + - integrations + responses: + '202': + description: '' + '400': + description: |- + One of the provided values in the request body is invalid. + One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '410': + description: '' + parameters: + - name: deployment_id + in: path + required: true + schema: + type: string + - name: integration_configuration_id + in: path + required: true + schema: + type: string + - name: resource_id + in: path + required: true + schema: + type: string + - name: action + in: path required: true schema: type: string - '/v13/deployments/{idOrUrl}': + requestBody: + content: + application/json: + schema: + type: object + properties: + status: + type: string + enum: + - running + - succeeded + - failed + statusText: + type: string + statusUrl: + type: string + format: uri + pattern: '^https?://|^sso:' + outcomes: + type: array + items: + oneOf: + - type: object + properties: + kind: + type: string + secrets: + type: array + items: + type: object + properties: + name: + type: string + value: + type: string + required: + - name + - value + additionalProperties: false + required: + - kind + - secrets + additionalProperties: false + additionalProperties: false + /v13/deployments/{id_or_url}: get: description: Retrieves information for a deployment either by supplying its ID (`id` property) or Hostname (`url` property). Additional details will be included when the authenticated user or team is an owner of the deployment. operationId: getDeployment @@ -1574,1947 +640,853 @@ paths: responses: '200': description: |- - The deployment including only public information - The deployment including both public and private information + Returns a reduced view of the deployment with public information only. Private fields are omitted when the requester is not the deployment owner. + Returns the deployment object for the authenticated owner, including private fields such as environment variables, build log URLs, and internal metadata. + Returns the reduced deployment view for anonymous (`vcn_`) callers. Pool-team details are withheld. content: application/json: schema: - oneOf: - - properties: - build: - properties: - env: - items: - type: string - type: array - description: The keys of the environment variables that were assigned during the build phase. - example: - - MY_ENV_VAR - required: - - env - type: object - builds: - items: - type: object - type: array - connectBuildsEnabled: - type: boolean - description: The flag saying if Vercel Connect configuration is used for builds - connectConfigurationId: + properties: + alias: + items: + type: string + type: array + aliasAssigned: + type: boolean + enum: + - false + - true + id: + type: string + description: A string holding the unique ID of the deployment + example: dpl_89qyp1cskzkLrVicDaZoDbjyHuDJ + target: + nullable: true + type: string + enum: + - production + - staging + - null + description: If defined, either `staging` if a staging alias in the format `..now.sh` was assigned upon creation, or `production` if the aliases from `alias` were assigned. `null` value indicates the "preview" deployment. + example: null + readyState: + type: string + enum: + - BLOCKED + - BUILDING + - CANCELED + - ERROR + - INITIALIZING + - QUEUED + - READY + description: The state of the deployment depending on the process of deploying, or if it is ready or in an error state + example: READY + aliasError: + nullable: true + properties: + code: type: string - description: The ID of Vercel Connect configuration used for this deployment - createdIn: + message: type: string - description: The region where the deployment was first created - example: sfo1 - env: - items: - type: string - type: array - description: The keys of the environment variables that were assigned during runtime - example: - - MY_SECRET - functions: - nullable: true - additionalProperties: - properties: - memory: - type: number - maxDuration: - type: number - runtime: - type: string - includeFiles: - type: string - excludeFiles: - type: string + required: + - code + - message + type: object + description: An object that will contain a `code` and a `message` when the aliasing fails, otherwise the value will be `null` + example: null + aliasWarning: + nullable: true + properties: + code: + type: string + message: + type: string + link: + type: string + action: + type: string + required: + - code + - message + type: object + errorCode: + type: string + errorMessage: + nullable: true + type: string + aliasAssignedAt: + nullable: true + oneOf: + - type: number + - type: boolean + enum: + - false + - true + alwaysRefuseToBuild: + type: boolean + enum: + - false + - true + build: + properties: + env: + items: + type: string + type: array + required: + - env + type: object + buildArtifactUrls: + items: + type: string + type: array + builds: + items: + properties: + use: + type: string + src: + type: string + config: + additionalProperties: true type: object - description: An object used to configure your Serverless Functions - example: - api/test.js: - memory: 3008 + required: + - use + type: object + type: array + env: + items: + type: string + type: array + resourceConfig: + properties: + buildMachine: + properties: + purchaseType: + type: string + enum: + - basic + - enhanced + - standard + - turbo + description: Machine type which was purchased/selected for this build. `basic` is the 2vCPU tier, recorded on the deployment so the build pipeline can detect a basic build without consulting the project. + defaultPurchaseType: + type: string + enum: + - basic + - enhanced + - standard + description: The default plan type for the build machine — what the customer is *paying* for on their plan. For most customers, this is standard, but some customers have an entitlement for enhanced builds. + machineSelectionType: + type: string + enum: + - elastic + - fixed + description: Whether the build ran on a fixed or elastic machine. Used to drive billing for the build. + selectionSource: + type: string + enum: + - elastic-algorithm + - plan-default + - project-setting + - team-entitlement + - team-setting + description: The setting which selected the build machine when the deployment was created. Frozen here so later project or team changes do not rewrite its history. + cores: + type: number + description: Number of cores the build machine ran with. Set at dispatch time once the build lands on a hive. + memory: + type: number + description: Memory, in MiB, the build machine ran with. Set at dispatch time once the build lands on a hive. type: object - description: An object used to configure your Serverless Functions - example: - api/test.js: - memory: 3008 - inspectorUrl: + description: Build machine configuration recorded for this deployment's build. See {@link DeploymentBuildMachine}. Distinct from the team/user `resourceConfig.buildMachine`, which only carries `default`. + type: object + inspectorUrl: + nullable: true + type: string + isInConcurrentBuildsQueue: + type: boolean + enum: + - false + - true + isInSystemBuildsQueue: + type: boolean + enum: + - false + - true + projectSettings: + properties: + nodeVersion: + type: string + enum: + - 10.x + - 12.x + - 14.x + - 16.x + - 18.x + - 20.x + - 22.x + - 24.x + - 8.10.x + buildCommand: nullable: true type: string - description: Vercel URL to inspect the deployment. - example: 'https://vercel.com/acme/nextjs/J1hXN00qjUeoYfpEEf7dnDtpSiVq' - isInConcurrentBuildsQueue: - type: boolean - description: Is the deployment currently queued waiting for a Concurrent Build Slot to be available - example: false - meta: - additionalProperties: - type: string - description: An object containing the deployment's metadata - example: - foo: bar - type: object - description: An object containing the deployment's metadata - example: - foo: bar - monorepoManager: + devCommand: nullable: true type: string - description: An monorepo manager that was used for the deployment - example: turbo - name: + framework: + nullable: true + type: string + enum: + - actix-web + - angular + - ash + - astro + - axum + - blitzjs + - brunch + - bun + - container + - create-react-app + - django + - docusaurus + - docusaurus-2 + - dojo + - eleventy + - elysia + - ember + - eve + - express + - factory-eve + - fastapi + - fasthtml + - fastify + - flask + - gatsby + - go + - gridsome + - h3 + - hexo + - hono + - hugo + - hydrogen + - ionic-angular + - ionic-react + - jekyll + - koa + - mastra + - middleman + - nestjs + - nextjs + - nitro + - node + - nuxtjs + - parcel + - polymer + - preact + - python + - react-router + - redwoodjs + - remix + - ruby + - rust + - saber + - sanity + - sanity-v2 + - sapper + - scully + - services + - solidstart + - solidstart-1 + - stencil + - storybook + - svelte + - sveltekit + - sveltekit-1 + - tanstack-start + - tanstack-start-lovable + - umijs + - vite + - vitepress + - vue + - vuepress + - xmcp + - zola + - null + commandForIgnoringBuildStep: + nullable: true type: string - description: The name of the project associated with the deployment at the time that the deployment was created - example: my-project - ownerId: + installCommand: + nullable: true type: string - description: The unique ID of the user or team the deployment belongs to - example: ZspSRT4ljIEEmMHgoDwKWDei - plan: + outputDirectory: + nullable: true + type: string + speedInsights: + properties: + id: + type: string + enabledAt: + type: number + disabledAt: + type: number + canceledAt: + type: number + hasData: + type: boolean + enum: + - false + - true + dataReceivedAt: + type: number + description: When the first free (not Speed Insights Plus) production data point was observed, in ms. Set once by subscriber-analytics-events; projects that already had data before this field shipped get it backfilled on their next batch, so it reads "first free data point observed", not necessarily "first ever". + paidAt: + type: number + required: + - id + type: object + webAnalytics: + properties: + id: + type: string + disabledAt: + type: number + canceledAt: + type: number + enabledAt: + type: number + hasData: + type: boolean + enum: + - true + required: + - id + type: object + type: object + integrations: + properties: + status: type: string enum: - - pro - - enterprise - - hobby - - oss - description: The pricing plan the deployment was made under - example: pro - projectId: + - error + - pending + - ready + - skipped + - timeout + startedAt: + type: number + claimedAt: + type: number + completedAt: + type: number + skippedAt: + type: number + skippedBy: type: string - description: The ID of the project the deployment is associated with - example: prj_12HKQaOmR5t5Uy6vdcQsNIiZgHGB - routes: - nullable: true + required: + - startedAt + - status + type: object + images: + properties: + sizes: items: - oneOf: - - properties: - src: - type: string - dest: - type: string - headers: - additionalProperties: - type: string - type: object - methods: - items: - type: string - type: array - continue: - type: boolean - override: - type: boolean - caseSensitive: - type: boolean - check: - type: boolean - important: - type: boolean - status: - type: number - has: - items: - oneOf: - - properties: - type: - type: string - enum: - - host - value: - type: string - required: - - type - - value - type: object - - properties: - type: - type: string - enum: - - header - - cookie - - query - key: - type: string - value: - type: string - required: - - type - - key - type: object - type: array - missing: - items: - oneOf: - - properties: - type: - type: string - enum: - - host - value: - type: string - required: - - type - - value - type: object - - properties: - type: - type: string - enum: - - header - - cookie - - query - key: - type: string - value: - type: string - required: - - type - - key - type: object - type: array - locale: - properties: - redirect: - additionalProperties: - type: string - type: object - cookie: - type: string - type: object - middlewarePath: - type: string - description: A middleware key within the `output` key under the build result. Overrides a `middleware` definition. - middlewareRawSrc: - items: - type: string - type: array - description: The original middleware matchers. - middleware: - type: number - description: A middleware index in the `middleware` key under the build result - required: - - src - type: object - description: A list of routes objects used to rewrite paths to point towards other internal or external paths - example: - - src: /docs - dest: 'https://docs.example.com' - - properties: - handle: - type: string - enum: - - error - - filesystem - - hit - - miss - - rewrite - - resource - src: - type: string - dest: - type: string - status: - type: number - required: - - handle - type: object - description: A list of routes objects used to rewrite paths to point towards other internal or external paths - example: - - src: /docs - dest: 'https://docs.example.com' - - properties: - src: - type: string - continue: - type: boolean - middleware: - type: number - enum: - - 0 - required: - - src - - continue - - middleware - type: object - description: A list of routes objects used to rewrite paths to point towards other internal or external paths - example: - - src: /docs - dest: 'https://docs.example.com' + type: number type: array - description: A list of routes objects used to rewrite paths to point towards other internal or external paths - example: - - src: /docs - dest: 'https://docs.example.com' - gitRepo: - nullable: true - oneOf: - - properties: - namespace: - type: string - projectId: - type: number - type: - type: string - enum: - - gitlab - url: - type: string - path: - type: string - defaultBranch: - type: string - name: - type: string - private: - type: boolean - ownerType: - type: string - enum: - - team - - user - required: - - namespace - - projectId - - type - - url - - path - - defaultBranch - - name - - private - - ownerType - type: object - - properties: - org: - type: string - repo: - type: string - repoId: - type: number - type: - type: string - enum: - - github - repoOwnerId: - type: string - path: - type: string - defaultBranch: - type: string - name: - type: string - private: - type: boolean - ownerType: - type: string - enum: - - team - - user - required: - - org - - repo - - repoId - - type - - repoOwnerId - - path - - defaultBranch - - name - - private - - ownerType - type: object - - properties: - owner: - type: string - repoUuid: - type: string - slug: - type: string - type: - type: string - enum: - - bitbucket - workspaceUuid: - type: string - path: - type: string - defaultBranch: - type: string - name: - type: string - private: - type: boolean - ownerType: - type: string - enum: - - team - - user - required: - - owner - - repoUuid - - slug - - type - - workspaceUuid - - path - - defaultBranch - - name - - private - - ownerType - type: object - aliasAssignedAt: - nullable: true - oneOf: - - type: number - - type: boolean - lambdas: + qualities: + items: + type: number + type: array + domains: + items: + type: string + type: array + remotePatterns: items: properties: - id: + protocol: type: string - createdAt: - type: number - entrypoint: - nullable: true + enum: + - http + - https + description: Must be `http` or `https`. + hostname: type: string - readyState: + description: Can be literal or wildcard. Single `*` matches a single subdomain. Double `**` matches any number of subdomains. + port: type: string - enum: - - BUILDING - - ERROR - - INITIALIZING - - READY - readyStateAt: - type: number - output: - items: - properties: - path: - type: string - functionName: - type: string - required: - - path - - functionName - type: object - type: array + description: Can be literal port such as `8080` or empty string meaning no port. + pathname: + type: string + description: Can be literal or wildcard. Single `*` matches a single path segment. Double `**` matches any number of path segments. + search: + type: string + description: Can be literal query string such as `?v=1` or empty string meaning no query string. required: - - id - - output + - hostname type: object type: array - public: - type: boolean - description: A boolean representing if the deployment is public or not. By default this is `false` - example: false - readyState: - type: string - enum: - - QUEUED - - BUILDING - - ERROR - - INITIALIZING - - READY - - CANCELED - description: 'The state of the deployment depending on the process of deploying, or if it is ready or in an error state' - example: READY - readySubstate: - type: string - enum: - - STAGED - - PROMOTED - description: The substate of the deployment when the state is "READY" - example: STAGED - regions: + localPatterns: + items: + properties: + pathname: + type: string + description: Can be literal or wildcard. Single `*` matches a single path segment. Double `**` matches any number of path segments. + search: + type: string + description: Can be literal query string such as `?v=1` or empty string meaning no query string. + type: object + type: array + minimumCacheTTL: + type: number + formats: items: type: string + enum: + - image/avif + - image/webp type: array - description: The regions the deployment exists in - example: - - sfo1 - source: - type: string + dangerouslyAllowSVG: + type: boolean enum: - - cli - - git - - import - - import/repo - - clone/repo - description: Where was the deployment created from - example: cli - target: - nullable: true + - false + - true + contentSecurityPolicy: + type: string + contentDispositionType: type: string enum: - - staging - - production - description: 'If defined, either `staging` if a staging alias in the format `..now.sh` was assigned upon creation, or `production` if the aliases from `alias` were assigned' - example: null - team: - properties: - id: - type: string - description: The ID of the team owner - example: team_LLHUOMOoDlqOp8wPE4kFo9pE - name: - type: string - description: The name of the team owner - example: FSociety - slug: - type: string - description: The slug of the team owner - example: fsociety - required: - - id - - name - - slug - type: object - description: The team that owns the deployment if any + - attachment + - inline + type: object + bootedAt: + type: number + buildingAt: + type: number + buildContainerFinishedAt: + type: number + description: Since April 2025 it necessary for On-Demand Concurrency Minutes calculation + buildSkipped: + type: boolean + enum: + - false + - true + creator: + properties: + uid: + type: string + description: Stable creator id across principal types (user id, app id, integration configuration id, or `system`). + example: 96SnxkFiMyVKsK3pnoHfx3Hz type: type: string enum: - - LAMBDAS - url: + - app + - integration + - system + - user + description: Principal type of the deployment creator. + username: type: string - description: A string with the unique URL of the deployment - example: my-instant-deployment-3ij3cxz9qr.now.sh - userAliases: - items: + description: The username of the user that created the deployment + example: john-doe + avatar: + type: string + description: The avatar of the user that created the deployment + required: + - uid + type: object + description: Information about the deployment creator + initReadyAt: + type: number + isFirstBranchDeployment: + type: boolean + enum: + - false + - true + lambdas: + items: + properties: + id: type: string - type: array - description: An array of domains that were provided by the user when creating the Deployment. - example: - - sub1.example.com - - sub2.example.com - version: - type: number - enum: - - 2 - description: The platform version that was used to create the deployment. - example: 2 - previewCommentsEnabled: - type: boolean - description: Whether or not preview comments are enabled for the deployment - example: false - alias: - items: + readyState: type: string - type: array - description: 'A list of all the aliases (default aliases, staging aliases and production aliases) that were assigned upon deployment creation' - example: [] - aliasAssigned: - type: boolean - description: A boolean that will be true when the aliases from the alias property were assigned successfully - example: true - aliasError: - nullable: true - properties: - code: - type: string - message: - type: string - required: - - code - - message - type: object - description: 'An object that will contain a `code` and a `message` when the aliasing fails, otherwise the value will be `null`' - example: null - aliasFinal: - nullable: true - type: string - aliasWarning: - nullable: true - properties: - code: - type: string - message: - type: string - link: - type: string - action: - type: string - required: - - code - - message - type: object - autoAssignCustomDomains: - type: boolean - automaticAliases: - items: + enum: + - BUILDING + - ERROR + - INITIALIZING + - READY + createdAt: + type: number + entrypoint: + nullable: true type: string - type: array - bootedAt: - type: number - buildErrorAt: - type: number - buildingAt: - type: number - canceledAt: - type: number - checksState: - type: string - enum: - - registered - - running - - completed - checksConclusion: - type: string - enum: - - succeeded - - failed - - skipped - - canceled - createdAt: - type: number - description: A number containing the date when the deployment was created in milliseconds - example: 1540257589405 - creator: - properties: - uid: - type: string - description: The ID of the user that created the deployment - example: 96SnxkFiMyVKsK3pnoHfx3Hz - username: - type: string - description: The username of the user that created the deployment - example: john-doe - required: - - uid - type: object - description: Information about the deployment creator - errorCode: + readyStateAt: + type: number + output: + items: + properties: + path: + type: string + functionName: + type: string + required: + - functionName + - path + type: object + type: array + required: + - id + - output + type: object + description: A partial representation of a Build used by the deployment endpoint. + type: array + public: + type: boolean + enum: + - false + - true + description: A boolean representing if the deployment is public or not. By default this is `false` + example: false + ready: + type: number + status: + type: string + enum: + - BLOCKED + - BUILDING + - CANCELED + - ERROR + - INITIALIZING + - QUEUED + - READY + team: + properties: + id: type: string - errorLink: + name: type: string - errorMessage: - nullable: true + slug: type: string - errorStep: + avatar: type: string - gitSource: - oneOf: - - properties: + required: + - id + - name + - slug + type: object + description: The team that owns the deployment if any + userAliases: + items: + type: string + type: array + description: An array of domains that were provided by the user when creating the Deployment. + example: + - sub1.example.com + - sub2.example.com + previewCommentsEnabled: + type: boolean + enum: + - false + - true + description: Whether or not preview comments are enabled for the deployment + example: false + ttyBuildLogs: + type: boolean + enum: + - false + - true + customEnvironment: + oneOf: + - properties: + id: + type: string + description: 'Unique identifier for the custom environment (format: env_*)' + slug: + type: string + description: URL-friendly name of the environment + type: + type: string + enum: + - development + - preview + - production + description: The type of environment (production, preview, or development) + description: + type: string + description: Optional description of the environment's purpose + branchMatcher: + properties: type: type: string enum: - - github - repoId: - oneOf: - - type: string - - type: number - ref: - nullable: true - type: string - sha: + - endsWith + - equals + - startsWith + description: The type of matching to perform + pattern: type: string - prId: - nullable: true - type: number + description: The pattern to match against branch names required: + - pattern - type - - repoId type: object - - properties: - type: - type: string - enum: - - github - org: - type: string - repo: - type: string - ref: - nullable: true - type: string - sha: - type: string - prId: - nullable: true - type: number - required: - - type - - org - - repo - type: object - - properties: - type: - type: string - enum: - - gitlab - projectId: - oneOf: - - type: string - - type: number - ref: - nullable: true - type: string - sha: - type: string - prId: - nullable: true - type: number - required: - - type - - projectId - type: object - - properties: - type: - type: string - enum: - - bitbucket - workspaceUuid: - type: string - repoUuid: - type: string - ref: - nullable: true - type: string - sha: - type: string - prId: - nullable: true - type: number - required: - - type - - repoUuid - type: object - - properties: - type: - type: string - enum: - - bitbucket - owner: - type: string - slug: - type: string - ref: - nullable: true - type: string - sha: - type: string - prId: - nullable: true - type: number - required: - - type - - owner - - slug - type: object - - properties: - type: - type: string - enum: - - custom - ref: - type: string - sha: - type: string - gitUrl: - type: string - required: - - type - - ref - - sha - - gitUrl - type: object - - properties: - type: - type: string - enum: - - github - ref: - type: string - sha: - type: string - repoId: - type: number - org: - type: string - repo: - type: string - required: - - type - - ref - - sha - - repoId - type: object - - properties: - type: - type: string - enum: - - gitlab - ref: - type: string - sha: - type: string - projectId: - type: number - required: - - type - - ref - - sha - - projectId - type: object - - properties: - type: - type: string - enum: - - bitbucket - ref: - type: string - sha: - type: string - owner: - type: string - slug: - type: string - workspaceUuid: - type: string - repoUuid: - type: string - required: - - type - - ref - - sha - - workspaceUuid - - repoUuid - type: object - id: - type: string - description: A string holding the unique ID of the deployment - example: dpl_89qyp1cskzkLrVicDaZoDbjyHuDJ - required: - - build - - createdIn - - env - - inspectorUrl - - isInConcurrentBuildsQueue - - meta - - name - - ownerId - - plan - - projectId - - routes - - public - - readyState - - regions - - type - - url - - version - - alias - - aliasAssigned - - bootedAt - - buildingAt - - createdAt - - creator - - id - type: object - description: The deployment including both public and private information - - properties: - lambdas: - items: - properties: - id: - type: string - createdAt: - type: number - entrypoint: - nullable: true - type: string - readyState: + description: Configuration for matching git branches to this environment + domains: + items: + properties: + name: + type: string + apexName: + type: string + projectId: + type: string + redirect: + nullable: true + type: string + redirectStatusCode: + nullable: true + type: number + enum: + - 301 + - 302 + - 307 + - 308 + - null + gitBranch: + nullable: true + type: string + customEnvironmentId: + nullable: true + type: string + updatedAt: + type: number + createdAt: + type: number + verified: + type: boolean + enum: + - false + - true + description: '`true` if the domain is verified for use with the project. If `false` it will not be used as an alias on this project until the challenge in `verification` is completed.' + verification: + items: + properties: + type: + type: string + domain: + type: string + value: + type: string + reason: + type: string + required: + - domain + - reason + - type + - value + type: object + description: 'A list of verification challenges, one of which must be completed to verify the domain for use on the project. After the challenge is complete `POST /projects/:idOrName/domains/:domain/verify` to verify the domain. Possible challenges: - If `verification.type = TXT` the `verification.domain` will be checked for a TXT record matching `verification.value`.' + type: array + description: 'A list of verification challenges, one of which must be completed to verify the domain for use on the project. After the challenge is complete `POST /projects/:idOrName/domains/:domain/verify` to verify the domain. Possible challenges: - If `verification.type = TXT` the `verification.domain` will be checked for a TXT record matching `verification.value`.' + required: + - apexName + - name + - projectId + - verified + type: object + description: List of domains associated with this environment + type: array + description: List of domains associated with this environment + currentDeploymentAliases: + items: type: string - enum: - - BUILDING - - ERROR - - INITIALIZING - - READY - readyStateAt: - type: number - output: - items: - properties: - path: - type: string - functionName: - type: string - required: - - path - - functionName - type: object - type: array - required: - - id - - output - type: object - type: array - name: - type: string - description: The name of the project associated with the deployment at the time that the deployment was created - example: my-project - meta: - additionalProperties: - type: string - description: An object containing the deployment's metadata - example: - foo: bar - type: object - description: An object containing the deployment's metadata - example: - foo: bar - public: - type: boolean - description: A boolean representing if the deployment is public or not. By default this is `false` - example: false - readyState: - type: string - enum: - - QUEUED - - BUILDING - - ERROR - - INITIALIZING - - READY - - CANCELED - description: 'The state of the deployment depending on the process of deploying, or if it is ready or in an error state' - example: READY - readySubstate: - type: string - enum: - - STAGED - - PROMOTED - description: The substate of the deployment when the state is "READY" - example: STAGED - regions: - items: - type: string - type: array - description: The regions the deployment exists in - example: - - sfo1 - source: - type: string - enum: - - cli - - git - - import - - import/repo - - clone/repo - description: Where was the deployment created from - example: cli - target: - nullable: true - type: string - enum: - - staging - - production - description: 'If defined, either `staging` if a staging alias in the format `..now.sh` was assigned upon creation, or `production` if the aliases from `alias` were assigned' - example: null - team: - properties: - id: - type: string - description: The ID of the team owner - example: team_LLHUOMOoDlqOp8wPE4kFo9pE - name: - type: string - description: The name of the team owner - example: FSociety - slug: - type: string - description: The slug of the team owner - example: fsociety + type: array + description: List of aliases for the current deployment + createdAt: + type: number + description: Timestamp when the environment was created + updatedAt: + type: number + description: Timestamp when the environment was last updated required: + - createdAt - id - - name - slug + - type + - updatedAt type: object - description: The team that owns the deployment if any - type: - type: string - enum: - - LAMBDAS - url: - type: string - description: A string with the unique URL of the deployment - example: my-instant-deployment-3ij3cxz9qr.now.sh - userAliases: - items: - type: string - type: array - description: An array of domains that were provided by the user when creating the Deployment. - example: - - sub1.example.com - - sub2.example.com - version: - type: number - enum: - - 2 - description: The platform version that was used to create the deployment. - example: 2 - previewCommentsEnabled: - type: boolean - description: Whether or not preview comments are enabled for the deployment - example: false - alias: - items: - type: string - type: array - description: 'A list of all the aliases (default aliases, staging aliases and production aliases) that were assigned upon deployment creation' - example: [] - aliasAssigned: - type: boolean - description: A boolean that will be true when the aliases from the alias property were assigned successfully - example: true - aliasError: - nullable: true - properties: - code: - type: string - message: - type: string - required: - - code - - message - type: object - description: 'An object that will contain a `code` and a `message` when the aliasing fails, otherwise the value will be `null`' - example: null - aliasFinal: - nullable: true - type: string - aliasWarning: - nullable: true - properties: - code: - type: string - message: - type: string - link: - type: string - action: + description: If the deployment was created using a Custom Environment, then this property contains information regarding the environment used. + - properties: + id: type: string required: - - code - - message + - id type: object - autoAssignCustomDomains: - type: boolean - automaticAliases: - items: - type: string - type: array - bootedAt: - type: number - buildErrorAt: - type: number - buildingAt: - type: number - canceledAt: - type: number - checksState: - type: string - enum: - - registered - - running - - completed - checksConclusion: - type: string - enum: - - succeeded - - failed - - skipped - - canceled - createdAt: - type: number - description: A number containing the date when the deployment was created in milliseconds - example: 1540257589405 - creator: - properties: - uid: - type: string - description: The ID of the user that created the deployment - example: 96SnxkFiMyVKsK3pnoHfx3Hz - username: - type: string - description: The username of the user that created the deployment - example: john-doe - required: - - uid - type: object - description: Information about the deployment creator - errorCode: - type: string - errorLink: - type: string - errorMessage: - nullable: true - type: string - errorStep: - type: string - gitSource: - oneOf: - - properties: - type: - type: string - enum: - - github - repoId: - oneOf: - - type: string - - type: number - ref: - nullable: true - type: string - sha: - type: string - prId: - nullable: true - type: number - required: - - type - - repoId - type: object - - properties: - type: - type: string - enum: - - github - org: - type: string - repo: - type: string - ref: - nullable: true - type: string - sha: - type: string - prId: - nullable: true - type: number - required: - - type - - org - - repo - type: object - - properties: - type: - type: string - enum: - - gitlab - projectId: - oneOf: - - type: string - - type: number - ref: - nullable: true - type: string - sha: - type: string - prId: - nullable: true - type: number - required: - - type - - projectId - type: object - - properties: - type: - type: string - enum: - - bitbucket - workspaceUuid: - type: string - repoUuid: - type: string - ref: - nullable: true - type: string - sha: - type: string - prId: - nullable: true - type: number - required: - - type - - repoUuid - type: object - - properties: - type: - type: string - enum: - - bitbucket - owner: - type: string - slug: - type: string - ref: - nullable: true - type: string - sha: - type: string - prId: - nullable: true - type: number - required: - - type - - owner - - slug - type: object - - properties: - type: - type: string - enum: - - custom - ref: - type: string - sha: - type: string - gitUrl: - type: string - required: - - type - - ref - - sha - - gitUrl - type: object - - properties: - type: - type: string - enum: - - github - ref: - type: string - sha: - type: string - repoId: - type: number - org: - type: string - repo: - type: string - required: - - type - - ref - - sha - - repoId - type: object - - properties: - type: - type: string - enum: - - gitlab - ref: - type: string - sha: - type: string - projectId: - type: number - required: - - type - - ref - - sha - - projectId - type: object - - properties: - type: - type: string - enum: - - bitbucket - ref: - type: string - sha: - type: string - owner: - type: string - slug: - type: string - workspaceUuid: - type: string - repoUuid: - type: string - required: - - type - - ref - - sha - - workspaceUuid - - repoUuid - type: object - id: - type: string - description: A string holding the unique ID of the deployment - example: dpl_89qyp1cskzkLrVicDaZoDbjyHuDJ - required: - - name - - meta - - public - - readyState - - regions - - type - - url - - version - - alias - - aliasAssigned - - bootedAt - - buildingAt - - createdAt - - creator - - id - type: object - description: The deployment including only public information - '400': - description: One of the provided values in the request query is invalid. - '403': - description: You do not have permission to access this resource. - '404': - description: The deployment was not found - parameters: - - name: idOrUrl - description: The unique identifier or hostname of the deployment. - in: path - required: true - schema: - example: dpl_89qyp1cskzkLrVicDaZoDbjyHuDJ - description: The unique identifier or hostname of the deployment. - type: string - - name: withGitRepoInfo - description: Whether to add in gitRepo information. - in: query - required: false - schema: - description: Whether to add in gitRepo information. - type: string - example: 'true' - - description: The Team identifier or slug to perform the request on behalf of. - in: query - name: teamId - required: true - schema: - type: string - /v13/deployments: - post: - description: 'Create a new deployment with all the required and intended data. If the deployment is not a git deployment, all files must be provided with the request, either referenced or inlined. Additionally, a deployment id can be specified to redeploy a previous deployment.' - operationId: createDeployment - security: - - bearerToken: [] - summary: Create a new deployment - tags: - - deployments - responses: - '200': - description: The successfully created deployment - content: - application/json: - schema: - properties: - build: - properties: - env: - items: - type: string - type: array - description: The keys of the environment variables that were assigned during the build phase. - example: - - MY_ENV_VAR - required: - - env - type: object - builds: - items: - type: object - type: array - connectBuildsEnabled: - type: boolean - description: The flag saying if Vercel Connect configuration is used for builds - connectConfigurationId: - type: string - description: The ID of Vercel Connect configuration used for this deployment - createdIn: - type: string - description: The region where the deployment was first created - example: sfo1 - env: - items: - type: string - type: array - description: The keys of the environment variables that were assigned during runtime - example: - - MY_SECRET - functions: - nullable: true - additionalProperties: - properties: - memory: - type: number - maxDuration: - type: number - runtime: - type: string - includeFiles: - type: string - excludeFiles: - type: string - type: object - description: An object used to configure your Serverless Functions - example: - api/test.js: - memory: 3008 - type: object - description: An object used to configure your Serverless Functions - example: - api/test.js: - memory: 3008 - inspectorUrl: - nullable: true + description: If the deployment was created using a Custom Environment, then this property contains information regarding the environment used. + oomReport: type: string - description: Vercel URL to inspect the deployment. - example: 'https://vercel.com/acme/nextjs/J1hXN00qjUeoYfpEEf7dnDtpSiVq' - isInConcurrentBuildsQueue: - type: boolean - description: Is the deployment currently queued waiting for a Concurrent Build Slot to be available - example: false - meta: - additionalProperties: - type: string - description: An object containing the deployment's metadata - example: - foo: bar - type: object - description: An object containing the deployment's metadata - example: - foo: bar - monorepoManager: - nullable: true + enum: + - out-of-memory + readyStateReason: type: string - description: An monorepo manager that was used for the deployment - example: turbo + createdAt: + type: number + description: A number containing the date when the deployment was created in milliseconds + example: 1540257589405 name: type: string description: The name of the project associated with the deployment at the time that the deployment was created example: my-project - ownerId: + type: type: string - description: The unique ID of the user or team the deployment belongs to - example: ZspSRT4ljIEEmMHgoDwKWDei - plan: + enum: + - LAMBDAS + aliasFinal: + nullable: true type: string + autoAssignCustomDomains: + type: boolean enum: - - pro - - enterprise - - hobby - - oss - description: The pricing plan the deployment was made under - example: pro - projectId: + - false + - true + description: applies to custom domains only, defaults to `true` + automaticAliases: + items: + type: string + type: array + buildErrorAt: + type: number + checksState: type: string - description: The ID of the project the deployment is associated with - example: prj_12HKQaOmR5t5Uy6vdcQsNIiZgHGB - routes: + enum: + - completed + - registered + - running + checksConclusion: + type: string + enum: + - canceled + - failed + - skipped + - succeeded + deletedAt: nullable: true - items: - oneOf: - - properties: - src: - type: string - dest: - type: string - headers: - additionalProperties: - type: string - type: object - methods: - items: - type: string - type: array - continue: - type: boolean - override: - type: boolean - caseSensitive: - type: boolean - check: - type: boolean - important: - type: boolean - status: - type: number - has: - items: - oneOf: - - properties: - type: - type: string - enum: - - host - value: - type: string - required: - - type - - value - type: object - - properties: - type: - type: string - enum: - - header - - cookie - - query - key: - type: string - value: - type: string - required: - - type - - key - type: object - type: array - missing: - items: - oneOf: - - properties: - type: - type: string - enum: - - host - value: - type: string - required: - - type - - value - type: object - - properties: - type: - type: string - enum: - - header - - cookie - - query - key: - type: string - value: - type: string - required: - - type - - key - type: object - type: array - locale: - properties: - redirect: - additionalProperties: - type: string - type: object - cookie: - type: string - type: object - middlewarePath: - type: string - description: A middleware key within the `output` key under the build result. Overrides a `middleware` definition. - middlewareRawSrc: - items: - type: string - type: array - description: The original middleware matchers. - middleware: - type: number - description: A middleware index in the `middleware` key under the build result - required: - - src - type: object - description: A list of routes objects used to rewrite paths to point towards other internal or external paths - example: - - src: /docs - dest: 'https://docs.example.com' - - properties: - handle: - type: string - enum: - - error - - filesystem - - hit - - miss - - rewrite - - resource - src: - type: string - dest: - type: string - status: - type: number - required: - - handle - type: object - description: A list of routes objects used to rewrite paths to point towards other internal or external paths - example: - - src: /docs - dest: 'https://docs.example.com' - - properties: - src: - type: string - continue: - type: boolean - middleware: - type: number - enum: - - 0 - required: - - src - - continue - - middleware - type: object - description: A list of routes objects used to rewrite paths to point towards other internal or external paths - example: - - src: /docs - dest: 'https://docs.example.com' + type: number + description: A number containing the date when the deployment was deleted at milliseconds + example: 1540257589405 + defaultRoute: + type: string + description: Computed field that is only available for deployments with a microfrontend configuration. + canceledAt: + type: number + errorLink: + type: string + errorStep: + type: string + passiveRegions: + items: + type: string type: array - description: A list of routes objects used to rewrite paths to point towards other internal or external paths - example: - - src: /docs - dest: 'https://docs.example.com' - gitRepo: - nullable: true + description: Since November 2023 this field defines a set of regions that we will deploy the lambda to passively Lambdas will be deployed to these regions but only invoked if all of the primary `regions` are marked as out of service + gitSource: oneOf: - properties: - namespace: - type: string - projectId: - type: number type: type: string enum: - - gitlab - url: - type: string - path: - type: string - defaultBranch: - type: string - name: + - github + repoId: + oneOf: + - type: string + - type: number + ref: + nullable: true type: string - private: - type: boolean - ownerType: + sha: type: string - enum: - - team - - user + prId: + nullable: true + type: number required: - - namespace - - projectId + - repoId - type - - url - - path - - defaultBranch - - name - - private - - ownerType type: object - properties: - org: - type: string - repo: - type: string - repoId: - type: number type: type: string enum: - github - repoOwnerId: - type: string - path: + org: type: string - defaultBranch: + repo: type: string - name: + ref: + nullable: true type: string - private: - type: boolean - ownerType: + sha: type: string - enum: - - team - - user + prId: + nullable: true + type: number required: - org - repo - - repoId - type - - repoOwnerId - - path - - defaultBranch - - name - - private - - ownerType type: object - properties: - owner: + type: type: string - repoUuid: + enum: + - github-custom-host + host: type: string - slug: + repoId: + oneOf: + - type: string + - type: number + ref: + nullable: true + type: string + sha: type: string + prId: + nullable: true + type: number + required: + - host + - repoId + - type + type: object + - properties: type: type: string enum: - - bitbucket - workspaceUuid: + - github-custom-host + host: type: string - path: + org: type: string - defaultBranch: + repo: type: string - name: + ref: + nullable: true type: string - private: - type: boolean - ownerType: + sha: type: string - enum: - - team - - user + prId: + nullable: true + type: number required: - - owner - - repoUuid - - slug + - host + - org + - repo - type - - workspaceUuid - - path - - defaultBranch - - name - - private - - ownerType type: object - aliasAssignedAt: - nullable: true - oneOf: - - type: number - - type: boolean - lambdas: - items: - properties: - id: - type: string - createdAt: - type: number - entrypoint: - nullable: true - type: string - readyState: - type: string - enum: - - BUILDING - - ERROR - - INITIALIZING - - READY - readyStateAt: - type: number - output: - items: - properties: - path: - type: string - functionName: - type: string - required: - - path - - functionName - type: object - type: array - required: - - id - - output - type: object - type: array - public: - type: boolean - description: A boolean representing if the deployment is public or not. By default this is `false` - example: false - readyState: - type: string - enum: - - QUEUED - - BUILDING - - ERROR - - INITIALIZING - - READY - - CANCELED - description: 'The state of the deployment depending on the process of deploying, or if it is ready or in an error state' - example: READY - readySubstate: - type: string - enum: - - STAGED - - PROMOTED - description: The substate of the deployment when the state is "READY" - example: STAGED - regions: - items: - type: string - type: array - description: The regions the deployment exists in - example: - - sfo1 - source: - type: string - enum: - - cli - - git - - import - - import/repo - - clone/repo - description: Where was the deployment created from - example: cli - target: - nullable: true - type: string - enum: - - staging - - production - description: 'If defined, either `staging` if a staging alias in the format `..now.sh` was assigned upon creation, or `production` if the aliases from `alias` were assigned' - example: null - team: - properties: - id: - type: string - description: The ID of the team owner - example: team_LLHUOMOoDlqOp8wPE4kFo9pE - name: - type: string - description: The name of the team owner - example: FSociety - slug: - type: string - description: The slug of the team owner - example: fsociety - required: - - id - - name - - slug - type: object - description: The team that owns the deployment if any - type: - type: string - enum: - - LAMBDAS - url: - type: string - description: A string with the unique URL of the deployment - example: my-instant-deployment-3ij3cxz9qr.now.sh - userAliases: - items: - type: string - type: array - description: An array of domains that were provided by the user when creating the Deployment. - example: - - sub1.example.com - - sub2.example.com - version: - type: number - enum: - - 2 - description: The platform version that was used to create the deployment. - example: 2 - previewCommentsEnabled: - type: boolean - description: Whether or not preview comments are enabled for the deployment - example: false - alias: - items: - type: string - type: array - description: 'A list of all the aliases (default aliases, staging aliases and production aliases) that were assigned upon deployment creation' - example: [] - aliasAssigned: - type: boolean - description: A boolean that will be true when the aliases from the alias property were assigned successfully - example: true - aliasError: - nullable: true - properties: - code: - type: string - message: - type: string - required: - - code - - message - type: object - description: 'An object that will contain a `code` and a `message` when the aliasing fails, otherwise the value will be `null`' - example: null - aliasFinal: - nullable: true - type: string - aliasWarning: - nullable: true - properties: - code: - type: string - message: - type: string - link: - type: string - action: - type: string - required: - - code - - message - type: object - autoAssignCustomDomains: - type: boolean - automaticAliases: - items: - type: string - type: array - bootedAt: - type: number - buildErrorAt: - type: number - buildingAt: - type: number - canceledAt: - type: number - checksState: - type: string - enum: - - registered - - running - - completed - checksConclusion: - type: string - enum: - - succeeded - - failed - - skipped - - canceled - createdAt: - type: number - description: A number containing the date when the deployment was created in milliseconds - example: 1540257589405 - creator: - properties: - uid: - type: string - description: The ID of the user that created the deployment - example: 96SnxkFiMyVKsK3pnoHfx3Hz - username: - type: string - description: The username of the user that created the deployment - example: john-doe - required: - - uid - type: object - description: Information about the deployment creator - errorCode: - type: string - errorLink: - type: string - errorMessage: - nullable: true - type: string - errorStep: - type: string - gitSource: - oneOf: - properties: type: type: string enum: - - github + - github-limited repoId: oneOf: - type: string @@ -3528,14 +1500,14 @@ paths: nullable: true type: number required: - - type - repoId + - type type: object - properties: type: type: string enum: - - github + - github-limited org: type: string repo: @@ -3549,9 +1521,9 @@ paths: nullable: true type: number required: - - type - org - repo + - type type: object - properties: type: @@ -3571,8 +1543,8 @@ paths: nullable: true type: number required: - - type - projectId + - type type: object - properties: type: @@ -3592,8 +1564,8 @@ paths: nullable: true type: number required: - - type - repoUuid + - type type: object - properties: type: @@ -3613,27 +1585,76 @@ paths: nullable: true type: number required: - - type - owner - slug + - type type: object - properties: type: type: string enum: - - custom - ref: + - vercel + org: + type: string + repo: type: string sha: type: string - gitUrl: + repoPushedAt: + type: number + ref: + nullable: true + type: string + prId: + nullable: true + type: number + required: + - sha + - type + type: object + - properties: + type: + type: string + enum: + - cursor-origin + repoId: type: string + description: Origin repository id. + owner: + type: string + description: Owner (namespace) slug. + repo: + type: string + ref: + nullable: true + type: string + sha: + type: string + prId: + nullable: true + type: number required: + - repoId - type + type: object + - properties: + type: + type: string + enum: + - custom + ref: + type: string + sha: + type: string + gitUrl: + type: string + required: + - gitUrl - ref - sha - - gitUrl + - type type: object + description: Allows custom git sources (local folder mounted to the container) in test mode - properties: type: type: string @@ -3650,10 +1671,55 @@ paths: repo: type: string required: + - ref + - repoId + - sha - type + type: object + - properties: + type: + type: string + enum: + - github-custom-host + host: + type: string + ref: + type: string + sha: + type: string + repoId: + type: number + org: + type: string + repo: + type: string + required: + - host - ref + - repoId - sha + - type + type: object + - properties: + type: + type: string + enum: + - github-limited + ref: + type: string + sha: + type: string + repoId: + type: number + org: + type: string + repo: + type: string + required: + - ref - repoId + - sha + - type type: object - properties: type: @@ -3667,10 +1733,10 @@ paths: projectId: type: number required: - - type + - projectId - ref - sha - - projectId + - type type: object - properties: type: @@ -3690,970 +1756,7783 @@ paths: repoUuid: type: string required: - - type - ref + - repoUuid - sha + - type - workspaceUuid - - repoUuid type: object - id: + - properties: + type: + type: string + enum: + - vercel + ref: + type: string + sha: + type: string + org: + type: string + repo: + type: string + repoPushedAt: + type: number + required: + - org + - ref + - repo + - sha + - type + type: object + - properties: + type: + type: string + enum: + - cursor-origin + ref: + type: string + sha: + type: string + repoId: + type: string + owner: + type: string + repo: + type: string + required: + - owner + - ref + - repo + - repoId + - sha + - type + type: object + manualProvisioning: + properties: + state: + type: string + enum: + - COMPLETE + - PENDING + - TIMEOUT + description: Current provisioning state + completedAt: + type: number + description: Timestamp when manual provisioning completed + required: + - state + type: object + description: Present when deployment was created with manual provisioning enabled, either explicitly or via the experimental BYOC git flow. The deployment stays in INITIALIZING until /continue is called. + meta: + additionalProperties: + type: string + type: object + originCacheRegion: type: string - description: A string holding the unique ID of the deployment - example: dpl_89qyp1cskzkLrVicDaZoDbjyHuDJ - required: - - build - - createdIn - - env - - inspectorUrl - - isInConcurrentBuildsQueue - - meta - - name - - ownerId - - plan - - projectId - - routes - - public - - readyState - - regions - - type - - url - - version - - alias - - aliasAssigned - - bootedAt - - buildingAt - - createdAt - - creator - - id - type: object - description: The successfully created deployment - '400': - description: |- - One of the provided values in the request body is invalid. - One of the provided values in the request query is invalid. - '401': - description: '' - '402': - description: |- - The account was soft-blocked for an unhandled reason. - The account is missing a payment so payment method must be updated - Deploying to Serverless Functions to multiple regions requires a plan update - '403': - description: You do not have permission to access this resource. - '404': - description: '' - '409': - description: The deployment project is being transferred - parameters: - - name: forceNew - description: Forces a new deployment even if there is a previous similar deployment - in: query - schema: - description: Forces a new deployment even if there is a previous similar deployment - enum: - - '0' - - '1' - - name: skipAutoDetectionConfirmation - description: Allows to skip framework detection so the API would not fail to ask for confirmation - in: query - schema: - description: Allows to skip framework detection so the API would not fail to ask for confirmation - enum: - - '0' - - '1' - - name: forceNew - description: Forces a new deployment even if there is a previous similar deployment - in: query - schema: - description: Forces a new deployment even if there is a previous similar deployment - enum: - - '0' - - '1' - - name: skipAutoDetectionConfirmation - description: Allows to skip framework detection so the API would not fail to ask for confirmation - in: query - schema: - description: Allows to skip framework detection so the API would not fail to ask for confirmation - enum: - - '0' - - '1' - - description: The Team identifier or slug to perform the request on behalf of. - in: query - name: teamId - required: true - schema: - type: string - requestBody: - content: - application/json: - schema: - type: object - additionalProperties: false - properties: - $schema: - description: 'Ignored. Can be set to get completions, validations and documentation in some editors.' - example: - - 'https://openapi.vercel.sh/vercel.json' - type: string - alias: - description: Aliases that will get assigned when the deployment is `READY` and the target is `production`. The client needs to make a `GET` request to its API to ensure the assignment - example: - - example.vercel.app - items: - maxLength: 253 + nodeVersion: type: string - maxItems: 50 - maxLength: 253 - type: array - build: - additionalProperties: false - description: An object containing another object with information to be passed to the Build Process - deprecated: true - properties: - env: - additionalProperties: - maxLength: 65536 - type: string - description: An object containing the deployment's environment variable names and values to be passed to Builds. Secrets can be referenced by prefixing the value with `@` - example: - A_SECRET: '@a-secret' - deprecated: true - maxProperties: 100 - minProperties: 0 - type: object - type: object - builds: - description: A list of build descriptions whose src references valid source files. - deprecated: true - items: - additionalProperties: false + enum: + - 10.x + - 12.x + - 14.x + - 16.x + - 18.x + - 20.x + - 22.x + - 24.x + - 8.10.x + description: If set it overrides the `projectSettings.nodeVersion` for this deployment. + project: properties: - config: - description: 'Optionally, an object including arbitrary metadata to be passed to the Builder' - type: object - src: - description: 'A glob expression or pathname. If more than one file is resolved, one build will be created per matched file. It can include `*` and `**`' - maxLength: 4096 + id: + type: string + name: type: string - use: - description: 'An npm module to be installed by the build process. It can include a semver compatible version (e.g.: `@org/proj@1`)' - maxLength: 256 + framework: + nullable: true type: string required: - - use + - id + - name type: object - maxItems: 128 - minItems: 0 - type: array - cleanUrls: - description: 'When set to `true`, all HTML files and Serverless Functions will have their extension removed. When visiting a path that ends with the extension, a 308 response will redirect the client to the extensionless path.' - type: boolean - env: - additionalProperties: - maxLength: 65536 + description: The public project information associated with the deployment. + prebuilt: + type: boolean + enum: + - false + - true + readySubstate: type: string - description: An object containing the deployment's environment variable names and values. Secrets can be referenced by prefixing the value with `@` - example: - A_SECRET: '@a-secret' - deprecated: true - maxProperties: 100 - minProperties: 0 - type: object - functions: - additionalProperties: - additionalProperties: false + enum: + - PROMOTED + - ROLLING + - STAGED + description: 'Substate of deployment when readyState is ''READY'' Tracks whether or not deployment has seen production traffic: - STAGED: never seen production traffic - ROLLING: in the process of having production traffic gradually transitioned. - PROMOTED: has seen production traffic' + regions: + items: + type: string + type: array + description: The regions the deployment exists in + example: + - sfo1 + softDeletedByRetention: + type: boolean + enum: + - false + - true + description: flag to indicate if the deployment was deleted by retention policy + example: 'true' + source: + type: string + enum: + - api-trigger-git-deploy + - cli + - clone/repo + - drop + - git + - git-deploy-hook + - import + - import/repo + - redeploy + - v0-web + description: Where was the deployment created from. Best-effort guess for metrics only — not authoritative; do not gate behavior on it. + example: cli + undeletedAt: + type: number + description: A number containing the date when the deployment was undeleted at milliseconds + example: 1540257589405 + url: + type: string + description: A string with the unique URL of the deployment + example: my-instant-deployment-3ij3cxz9qr.now.sh + userConfiguredDeploymentId: + type: string + description: Since January 2025 User-configured deployment ID for skew protection with pre-built deployments. This is set when users configure a custom deploymentId in their next.config.js file. This allows Next.js to use skew protection even when deployments are pre-built outside of Vercel's build system. + example: abc123 + version: + type: number + enum: + - 2 + description: The platform version that was used to create the deployment. + example: 2 + oidcTokenClaims: properties: - excludeFiles: - description: 'A glob pattern to match files that should be excluded from your Serverless Function. If you’re using a Community Runtime, the behavior might vary.' - maxLength: 256 - type: string - includeFiles: - description: 'A glob pattern to match files that should be included in your Serverless Function. If you’re using a Community Runtime, the behavior might vary.' - maxLength: 256 - type: string - maxDuration: - description: An integer defining how long your Serverless Function should be allowed to run on every request in seconds (between 1 and the maximum limit of your plan). - maximum: 900 - minimum: 1 - type: number - memory: - description: An integer defining the memory your Serverless Function should be provided with (between 128 and 3008). - maximum: 3008 - minimum: 128 - type: number - runtime: - description: 'The npm package name of a Runtime, including its version' - maxLength: 256 + iss: type: string - type: object - description: An object describing custom options for your Serverless Functions. Each key must be glob pattern that matches the paths of the Serverless Functions you would like to customize (like `api/*.js` or `api/test.js`). - example: - src/pages/**: - maxDuration: 6 - memory: 1024 - maxProperties: 50 - minProperties: 1 - type: object - git: - type: object - properties: - deploymentEnabled: - description: Specifies the branches that will not trigger an auto-deployment when committing to them. Any non specified branch is `true` by default. - example: - main: false - oneOf: - - type: boolean - - type: object - additionalProperties: - type: boolean - headers: - type: array - maxItems: 1024 - description: A list of header definitions. - items: - type: object - additionalProperties: false - required: - - source - - headers - properties: - source: - description: A pattern that matches each incoming pathname (excluding querystring) + sub: type: string - maxLength: 4096 - headers: - description: An array of key/value pairs representing each response header. - type: array - maxItems: 1024 - items: - type: object - additionalProperties: false - required: - - key - - value - properties: - key: - type: string - maxLength: 4096 - value: - type: string - maxLength: 4096 - has: - description: An array of requirements that are needed to match - type: array - maxItems: 16 - items: - anyOf: - - type: object - additionalProperties: false - required: - - type - - value - properties: - type: - description: The type of request element to check - type: string - enum: - - host - value: - description: A regular expression used to match the value. Named groups can be used in the destination - type: string - maxLength: 4096 - - type: object - additionalProperties: false - required: - - type - - key - properties: - type: - description: The type of request element to check - type: string - enum: - - header - - cookie - - query - key: - description: The name of the element contained in the particular type - type: string - maxLength: 4096 - value: - description: A regular expression used to match the value. Named groups can be used in the destination - type: string - maxLength: 4096 - missing: - description: An array of requirements that are needed to match - type: array - maxItems: 16 - items: - anyOf: - - type: object - additionalProperties: false - required: - - type - - value - properties: - type: - description: The type of request element to check - type: string - enum: - - host - value: - description: A regular expression used to match the value. Named groups can be used in the destination - type: string - maxLength: 4096 - - type: object - additionalProperties: false - required: - - type - - key - properties: - type: - description: The type of request element to check - type: string - enum: - - header - - cookie - - query - key: - description: The name of the element contained in the particular type - type: string - maxLength: 4096 - value: - description: A regular expression used to match the value. Named groups can be used in the destination - type: string - maxLength: 4096 - images: - type: object - additionalProperties: false - required: - - sizes - properties: - contentDispositionType: - enum: - - inline - - attachment - contentSecurityPolicy: - type: string - maxLength: 256 - dangerouslyAllowSVG: - type: boolean - domains: - type: array - minItems: 0 - maxItems: 50 - items: - type: string - maxLength: 256 - formats: - type: array - minItems: 1 - maxItems: 4 - items: - enum: - - image/avif - - image/webp - - image/jpeg - - image/png - minimumCacheTTL: - type: integer - minimum: 1 - maximum: 315360000 - remotePatterns: - type: array - minItems: 0 - maxItems: 50 - items: - type: object - additionalProperties: false - required: - - hostname - properties: - protocol: - enum: - - http - - https - hostname: - type: string - maxLength: 256 - port: - type: string - maxLength: 5 - pathname: - type: string - maxLength: 256 - sizes: - type: array - minItems: 1 - maxItems: 50 - items: - type: number - name: - description: A string with the project name used in the deployment URL - example: my-instant-deployment - type: string - public: - description: Whether a deployment's source and logs are available publicly - type: boolean - redirects: - title: Redirects - type: array - maxItems: 1024 - description: A list of redirect definitions. - items: - type: object - additionalProperties: false - required: - - source - - destination - properties: - source: - description: A pattern that matches each incoming pathname (excluding querystring). + scope: type: string - maxLength: 4096 - destination: - description: A location destination defined as an absolute pathname or external URL. + aud: type: string - maxLength: 4096 - permanent: - description: 'A boolean to toggle between permanent and temporary redirect. When `true`, the status code is `308`. When `false` the status code is `307`.' - type: boolean - has: - description: An array of requirements that are needed to match - type: array - maxItems: 16 - items: - anyOf: - - type: object - additionalProperties: false - required: - - type - - value - properties: - type: - description: The type of request element to check - type: string - enum: - - host - value: - description: A regular expression used to match the value. Named groups can be used in the destination - type: string - maxLength: 4096 - - type: object - additionalProperties: false - required: - - type - - key - properties: - type: - description: The type of request element to check - type: string - enum: - - header - - cookie - - query - key: - description: The name of the element contained in the particular type - type: string - maxLength: 4096 - value: - description: A regular expression used to match the value. Named groups can be used in the destination - type: string - maxLength: 4096 - missing: - description: An array of requirements that are needed to match - type: array - maxItems: 16 - items: - anyOf: - - type: object - additionalProperties: false - required: - - type - - value - properties: - type: - description: The type of request element to check - type: string - enum: - - host - value: - description: A regular expression used to match the value. Named groups can be used in the destination - type: string - maxLength: 4096 - - type: object - additionalProperties: false - required: - - type - - key - properties: - type: - description: The type of request element to check - type: string - enum: - - header - - cookie - - query - key: - description: The name of the element contained in the particular type - type: string - maxLength: 4096 - value: - description: A regular expression used to match the value. Named groups can be used in the destination - type: string - maxLength: 4096 - regions: - description: An array of the regions the deployment's Serverless Functions should be deployed to - example: - - sfo - - bru - items: - maxLength: 256 - type: string - maxItems: 1000 - minItems: 1 - type: array - rewrites: - type: array - maxItems: 1024 - description: A list of rewrite definitions. - items: - type: object - additionalProperties: false - required: - - source - - destination - properties: - source: - description: A pattern that matches each incoming pathname (excluding querystring). + owner: type: string - maxLength: 4096 - destination: - description: An absolute pathname to an existing resource or an external URL. + owner_id: type: string - maxLength: 4096 - has: - description: An array of requirements that are needed to match - type: array - maxItems: 16 + project: + type: string + project_id: + type: string + environment: + type: string + custom_environment_id: + type: string + mfe_group_ids: items: - anyOf: - - type: object - additionalProperties: false - required: - - type - - value - properties: - type: - description: The type of request element to check + type: string + type: array + plan: + type: string + required: + - aud + - environment + - iss + - owner + - owner_id + - project + - project_id + - scope + - sub + type: object + projectId: + type: string + plan: + type: string + enum: + - enterprise + - hobby + - pro + connectBuildsEnabled: + type: boolean + enum: + - false + - true + connectConfigurationId: + type: string + createdIn: + type: string + crons: + items: + properties: + schedule: + type: string + path: + type: string + required: + - path + - schedule + type: object + type: array + atproto: + oneOf: + - properties: + enabled: + type: boolean + enum: + - false + required: + - enabled + type: object + - properties: + enabled: + type: boolean + enum: + - true + subscription: + properties: + collections: + items: type: string - enum: - - host - value: - description: A regular expression used to match the value. Named groups can be used in the destination + type: array + dids: + items: type: string - maxLength: 4096 - - type: object - additionalProperties: false - required: - - type - - key - properties: - type: - description: The type of request element to check + type: array + kinds: + items: type: string enum: - - header - - cookie - - query - key: - description: The name of the element contained in the particular type - type: string - maxLength: 4096 - value: - description: A regular expression used to match the value. Named groups can be used in the destination - type: string - maxLength: 4096 - missing: - description: An array of requirements that are needed to match - type: array - maxItems: 16 - items: - anyOf: - - type: object - additionalProperties: false - required: - - type - - value - properties: - type: - description: The type of request element to check - type: string - enum: - - host - value: - description: A regular expression used to match the value. Named groups can be used in the destination - type: string - maxLength: 4096 - - type: object - additionalProperties: false - required: - - type - - key - properties: - type: - description: The type of request element to check - type: string - enum: - - header - - cookie - - query - key: - description: The name of the element contained in the particular type - type: string - maxLength: 4096 - value: - description: A regular expression used to match the value. Named groups can be used in the destination - type: string - maxLength: 4096 - routes: - type: array - maxItems: 1024 - deprecated: true - description: A list of routes objects used to rewrite paths to point towards other internal or external paths - example: - - dest: 'https://docs.example.com' - src: /docs - items: - anyOf: - - type: object + - account + - commit + - identity + - sync + type: array + path: + type: string + required: + - collections + - path + type: object required: - - src - additionalProperties: false - properties: - src: + - enabled + - subscription + type: object + functions: + nullable: true + additionalProperties: + properties: + architecture: + type: string + enum: + - arm64 + - x86_64 + memory: + type: number + maxDuration: + oneOf: + - type: number + - type: string + enum: + - max + affinity: + properties: + mode: + type: string + enum: + - strict + required: + - mode + type: object + maxConcurrency: + type: number + regions: + items: type: string - maxLength: 4096 - dest: + type: array + functionFailoverRegions: + items: type: string - maxLength: 4096 - headers: - type: object - additionalProperties: + type: array + runtime: + type: string + includeFiles: + type: string + excludeFiles: + type: string + experimentalTriggers: + items: + oneOf: + - properties: + type: + type: string + enum: + - queue/v1beta + description: Event type - must be "queue/v1beta" (REQUIRED) + consumer: + type: string + description: Name of the consumer group for this trigger (REQUIRED) + topic: + type: string + description: Name of the queue topic to consume from (REQUIRED) + maxDeliveries: + type: number + description: Maximum number of delivery attempts for message processing (OPTIONAL) This represents the total number of times a message can be delivered, not the number of retries. Must be at least 1 if specified. Behavior when not specified depends on the server's default configuration. + retryAfterSeconds: + type: number + description: Delay in seconds before retrying failed executions (OPTIONAL) Behavior when not specified depends on the server's default configuration. + initialDelaySeconds: + type: number + description: Initial delay in seconds before first execution attempt (OPTIONAL) Must be 0 or greater. Use 0 for no initial delay. Behavior when not specified depends on the server's default configuration. + maxConcurrency: + type: number + description: Maximum number of concurrent executions for this consumer (OPTIONAL) Must be at least 1 if specified. Behavior when not specified depends on the server's default configuration. + required: + - consumer + - topic + - type + type: object + description: Queue trigger input event for v1beta (from vercel.json config). Requires explicit consumer name. + - properties: + type: + type: string + enum: + - queue/v2beta + description: Event type - must be "queue/v2beta" (REQUIRED) + topic: + type: string + description: Name of the queue topic to consume from (REQUIRED) + maxDeliveries: + type: number + description: Maximum number of delivery attempts for message processing (OPTIONAL) This represents the total number of times a message can be delivered, not the number of retries. Must be at least 1 if specified. Behavior when not specified depends on the server's default configuration. + retryAfterSeconds: + type: number + description: Delay in seconds before retrying failed executions (OPTIONAL) Behavior when not specified depends on the server's default configuration. + initialDelaySeconds: + type: number + description: Initial delay in seconds before first execution attempt (OPTIONAL) Must be 0 or greater. Use 0 for no initial delay. Behavior when not specified depends on the server's default configuration. + maxConcurrency: + type: number + description: Maximum number of concurrent executions for this consumer (OPTIONAL) Must be at least 1 if specified. Behavior when not specified depends on the server's default configuration. + required: + - topic + - type + type: object + description: Queue trigger input event for v2beta (from vercel.json config). Consumer name is implicitly derived from the function path. Only one trigger per function is allowed. + - properties: + type: + type: string + enum: + - schedule/v1beta + description: Event type - must be "schedule/v1beta" (REQUIRED) + required: + - type + type: object + type: array + supportsCancellation: + type: boolean + enum: + - false + - true + type: object + type: object + isInstantStatic: + type: boolean + enum: + - false + - true + description: Whether this deployment completed through the instant static fast path. + monorepoManager: + nullable: true + type: string + ownerId: + type: string + passiveConnectConfigurationId: + type: string + description: Since November 2023 this field defines a Secure Compute network that will only be used to deploy passive lambdas to (as in passiveRegions) + routes: + nullable: true + items: + oneOf: + - properties: + src: type: string - maxLength: 4096 - minProperties: 1 - maxProperties: 100 - methods: - type: array - maxItems: 10 - items: + dest: type: string - maxLength: 32 - caseSensitive: - type: boolean - important: - type: boolean - user: - type: boolean - continue: - type: boolean - override: - type: boolean - check: - type: boolean - isInternal: - type: boolean - status: - type: integer - minimum: 100 - maximum: 999 - locale: - type: object - additionalProperties: false - minProperties: 1 - properties: - redirect: - type: object - additionalProperties: - type: string - maxLength: 4096 - minProperties: 1 - maxProperties: 100 - value: - type: string - maxLength: 4096 - path: + headers: + additionalProperties: type: string - maxLength: 4096 - cookie: + type: object + methods: + items: type: string - maxLength: 4096 - default: + type: array + continue: + type: boolean + enum: + - false + - true + override: + type: boolean + enum: + - false + - true + caseSensitive: + type: boolean + enum: + - false + - true + check: + type: boolean + enum: + - false + - true + important: + type: boolean + enum: + - false + - true + status: + type: number + has: + items: + oneOf: + - properties: + type: + type: string + enum: + - host + value: + oneOf: + - type: string + - properties: + eq: + oneOf: + - type: string + - type: number + neq: + type: string + inc: + items: + type: string + type: array + ninc: + items: + type: string + type: array + pre: + type: string + suf: + type: string + re: + type: string + gt: + type: number + gte: + type: number + lt: + type: number + lte: + type: number + type: object + required: + - type + - value + type: object + - properties: + type: + type: string + enum: + - cookie + - header + - query + key: + type: string + value: + oneOf: + - type: string + - properties: + eq: + oneOf: + - type: string + - type: number + neq: + type: string + inc: + items: + type: string + type: array + ninc: + items: + type: string + type: array + pre: + type: string + suf: + type: string + re: + type: string + gt: + type: number + gte: + type: number + lt: + type: number + lte: + type: number + type: object + required: + - key + - type + type: object + type: array + missing: + items: + oneOf: + - properties: + type: + type: string + enum: + - host + value: + oneOf: + - type: string + - properties: + eq: + oneOf: + - type: string + - type: number + neq: + type: string + inc: + items: + type: string + type: array + ninc: + items: + type: string + type: array + pre: + type: string + suf: + type: string + re: + type: string + gt: + type: number + gte: + type: number + lt: + type: number + lte: + type: number + type: object + required: + - type + - value + type: object + - properties: + type: + type: string + enum: + - cookie + - header + - query + key: + type: string + value: + oneOf: + - type: string + - properties: + eq: + oneOf: + - type: string + - type: number + neq: + type: string + inc: + items: + type: string + type: array + ninc: + items: + type: string + type: array + pre: + type: string + suf: + type: string + re: + type: string + gt: + type: number + gte: + type: number + lt: + type: number + lte: + type: number + type: object + required: + - key + - type + type: object + type: array + mitigate: + properties: + action: + type: string + enum: + - challenge + - deny + required: + - action + type: object + transforms: + items: + oneOf: + - properties: + type: + type: string + enum: + - request.headers + - request.query + - response.headers + op: + type: string + enum: + - append + - delete + - set + target: + properties: + key: + oneOf: + - type: string + - properties: + eq: + oneOf: + - type: string + - type: number + neq: + type: string + inc: + items: + type: string + type: array + ninc: + items: + type: string + type: array + pre: + type: string + suf: + type: string + gt: + type: number + gte: + type: number + lt: + type: number + lte: + type: number + type: object + required: + - key + type: object + args: + oneOf: + - type: string + - items: + type: string + type: array + env: + items: + type: string + type: array + required: + - op + - target + - type + type: object + - properties: + type: + type: string + enum: + - request.path + op: + type: string + enum: + - set + args: + type: string + env: + items: + type: string + type: array + required: + - args + - op + - type + type: object + type: array + env: + items: type: string - maxLength: 4096 - middleware: - type: number - middlewarePath: - type: string - middlewareRawSrc: - type: array - items: + type: array + locale: + properties: + redirect: + additionalProperties: + type: string + type: object + cookie: + type: string + type: object + source: type: string - has: - description: An array of requirements that are needed to match - type: array - maxItems: 16 - items: - anyOf: - - type: object - additionalProperties: false - required: - - type - - value - properties: + description: Aliases for `src`, `dest`, and `status`. These provide consistency with the `rewrites`, `redirects`, and `headers` fields which use `source`, `destination`, and `statusCode`. During normalization, the string forms are converted to their canonical forms (`src`, `dest`, `status`) and stripped from the route object. `destination` may also be a service-targeted object, in which case routing is delegated into the named service's internal route table and the object is preserved as-is (not folded into `dest`). + destination: + oneOf: + - type: string + - properties: type: - description: The type of request element to check type: string enum: - - host - value: - description: A regular expression used to match the value. Named groups can be used in the destination - type: string - maxLength: 4096 - - type: object - additionalProperties: false - required: - - type - - key - properties: - type: - description: The type of request element to check + - service + description: Optional explicit format marker. The destination is identified by the presence of `service`, so `type` is no longer required. + service: type: string - enum: - - header - - cookie - - query - key: - description: The name of the element contained in the particular type + path: type: string - maxLength: 4096 - value: - description: A regular expression used to match the value. Named groups can be used in the destination - type: string - maxLength: 4096 - missing: - description: An array of requirements that are needed to match - type: array - maxItems: 16 - items: - anyOf: - - type: object - additionalProperties: false + description: Routing-only path used to select a route inside the target service. required: - - type - - value + - service + type: object + statusCode: + type: number + middlewarePath: + type: string + description: A middleware key within the `output` key under the build result. Overrides a `middleware` definition. + middlewareRawSrc: + items: + type: string + type: array + description: The original middleware matchers. + middleware: + type: number + description: A middleware index in the `middleware` key under the build result + respectOriginCacheControl: + type: boolean + enum: + - false + - true + required: + - src + type: object + - properties: + handle: + type: string + enum: + - error + - filesystem + - hit + - miss + - resource + - rewrite + src: + type: string + dest: + type: string + status: + type: number + required: + - handle + type: object + - properties: + src: + type: string + continue: + type: boolean + enum: + - false + - true + middleware: + type: number + enum: + - 0 + required: + - continue + - middleware + - src + type: object + type: array + services: + items: + oneOf: + - properties: + schema: + type: string + enum: + - experimentalServices + name: + type: string + type: + type: string + enum: + - cron + - job + - web + - worker + trigger: + type: string + enum: + - queue + - schedule + - workflow + group: + type: string + workspace: + type: string + entrypoint: + type: string + framework: + type: string + builder: + properties: + use: + type: string + src: + type: string + config: properties: - type: - description: The type of request element to check + bunVersion: + type: string + maxLambdaSize: type: string + includeFiles: + oneOf: + - type: string + - items: + type: string + type: array + excludeFiles: + oneOf: + - type: string + - items: + type: string + type: array + bundle: + type: boolean enum: - - host - value: - description: A regular expression used to match the value. Named groups can be used in the destination + - false + - true + ldsflags: type: string - maxLength: 4096 - - type: object - additionalProperties: false - required: - - type - - key + helpers: + type: boolean + enum: + - false + - true + rust: + type: string + debug: + type: boolean + enum: + - false + - true + zeroConfig: + type: boolean + enum: + - false + - true + import: + additionalProperties: + type: string + type: object + functions: + additionalProperties: + properties: + architecture: + type: string + enum: + - arm64 + - x86_64 + memory: + type: number + maxDuration: + oneOf: + - type: number + - type: string + enum: + - max + affinity: + properties: + mode: + type: string + enum: + - strict + required: + - mode + type: object + maxConcurrency: + type: number + regions: + items: + type: string + type: array + functionFailoverRegions: + items: + type: string + type: array + runtime: + type: string + includeFiles: + type: string + excludeFiles: + type: string + experimentalTriggers: + items: + oneOf: + - properties: + type: + type: string + enum: + - queue/v1beta + description: Event type - must be "queue/v1beta" (REQUIRED) + consumer: + type: string + description: Name of the consumer group for this trigger (REQUIRED) + topic: + type: string + description: Name of the queue topic to consume from (REQUIRED) + maxDeliveries: + type: number + description: Maximum number of delivery attempts for message processing (OPTIONAL) This represents the total number of times a message can be delivered, not the number of retries. Must be at least 1 if specified. Behavior when not specified depends on the server's default configuration. + retryAfterSeconds: + type: number + description: Delay in seconds before retrying failed executions (OPTIONAL) Behavior when not specified depends on the server's default configuration. + initialDelaySeconds: + type: number + description: Initial delay in seconds before first execution attempt (OPTIONAL) Must be 0 or greater. Use 0 for no initial delay. Behavior when not specified depends on the server's default configuration. + maxConcurrency: + type: number + description: Maximum number of concurrent executions for this consumer (OPTIONAL) Must be at least 1 if specified. Behavior when not specified depends on the server's default configuration. + required: + - consumer + - topic + - type + type: object + description: Queue trigger input event for v1beta (from vercel.json config). Requires explicit consumer name. + - properties: + type: + type: string + enum: + - queue/v2beta + description: Event type - must be "queue/v2beta" (REQUIRED) + topic: + type: string + description: Name of the queue topic to consume from (REQUIRED) + maxDeliveries: + type: number + description: Maximum number of delivery attempts for message processing (OPTIONAL) This represents the total number of times a message can be delivered, not the number of retries. Must be at least 1 if specified. Behavior when not specified depends on the server's default configuration. + retryAfterSeconds: + type: number + description: Delay in seconds before retrying failed executions (OPTIONAL) Behavior when not specified depends on the server's default configuration. + initialDelaySeconds: + type: number + description: Initial delay in seconds before first execution attempt (OPTIONAL) Must be 0 or greater. Use 0 for no initial delay. Behavior when not specified depends on the server's default configuration. + maxConcurrency: + type: number + description: Maximum number of concurrent executions for this consumer (OPTIONAL) Must be at least 1 if specified. Behavior when not specified depends on the server's default configuration. + required: + - topic + - type + type: object + description: Queue trigger input event for v2beta (from vercel.json config). Consumer name is implicitly derived from the function path. Only one trigger per function is allowed. + - properties: + type: + type: string + enum: + - schedule/v1beta + description: Event type - must be "schedule/v1beta" (REQUIRED) + required: + - type + type: object + type: array + supportsCancellation: + type: boolean + enum: + - false + - true + type: object + type: object + projectSettings: + properties: + framework: + nullable: true + type: string + devCommand: + nullable: true + type: string + installCommand: + nullable: true + type: string + buildCommand: + nullable: true + type: string + outputDirectory: + nullable: true + type: string + rootDirectory: + nullable: true + type: string + nodeVersion: + type: string + monorepoManager: + nullable: true + type: string + createdAt: + type: number + autoExposeSystemEnvs: + type: boolean + enum: + - false + - true + sourceFilesOutsideRootDirectory: + type: boolean + enum: + - false + - true + directoryListing: + type: boolean + enum: + - false + - true + gitForkProtection: + type: boolean + enum: + - false + - true + commandForIgnoringBuildStep: + nullable: true + type: string + type: object + outputDirectory: + type: string + installCommand: + type: string + buildCommand: + type: string + devCommand: + type: string + framework: + nullable: true + type: string + nodeVersion: + type: string + middleware: + type: boolean + enum: + - false + - true + middlewareRuntime: + type: string + enum: + - nodejs + description: Enforced runtime for explicitly configured Routing Middleware. + middlewareMatcher: + oneOf: + - type: string + - items: + type: string + type: array + description: Matcher supplied outside of the middleware source module. + serviceName: + type: string + description: Owning service name; scopes per-function config such as the v2beta consumer. + type: object + required: + - use + type: object + runtime: + type: string + buildCommand: + type: string + installCommand: + type: string + preDeployCommand: + type: string + routePrefix: + type: string + routePrefixSource: + type: string + enum: + - configured + - generated + subdomain: + type: string + schedule: + oneOf: + - type: string + - items: + type: string + type: array + handlerFunction: + type: string + topics: + oneOf: + - items: + type: string + type: array + - items: + properties: + topic: + type: string + retryAfterSeconds: + type: number + initialDelaySeconds: + type: number + required: + - topic + type: object + type: array + env: + additionalProperties: + properties: + type: + type: string + enum: + - service-ref + service: + type: string + required: + - service + - type + type: object + type: object + required: + - builder + - name + - schema + - type + - workspace + type: object + description: Services detected during build from vercel.json experimentalServices or auto-detected from project structure. Used to inject service URLs as environment variables at runtime. + - properties: + schema: + type: string + enum: + - experimentalServicesV2 + name: + type: string + root: + type: string + description: Path to the service root, relative to the project root. + framework: + type: string + runtime: + type: string + entrypoint: + type: string + description: Resolved entrypoint, relative to the service root. + command: + items: + type: string + type: array + description: 'Command override for `runtime: "container"` services.' + builder: + properties: + use: + type: string + src: + type: string + config: properties: - type: - description: The type of request element to check + bunVersion: + type: string + maxLambdaSize: type: string + includeFiles: + oneOf: + - type: string + - items: + type: string + type: array + excludeFiles: + oneOf: + - type: string + - items: + type: string + type: array + bundle: + type: boolean enum: - - header - - cookie - - query - key: - description: The name of the element contained in the particular type + - false + - true + ldsflags: type: string - maxLength: 4096 - value: - description: A regular expression used to match the value. Named groups can be used in the destination + helpers: + type: boolean + enum: + - false + - true + rust: type: string - maxLength: 4096 - - type: object - required: - - handle - additionalProperties: false - properties: - handle: - type: string - maxLength: 32 - enum: - - error - - filesystem - - hit - - miss - - resource - - rewrite - trailingSlash: - description: 'When `false`, visiting a path that ends with a forward slash will respond with a `308` status code and redirect to the path without the trailing slash.' - type: boolean - buildCommand: - description: The build command for this project. When `null` is used this value will be automatically detected - maxLength: 256 - type: string - nullable: true - ignoreCommand: - maxLength: 256 - type: string - nullable: true - devCommand: - description: The dev command for this project. When `null` is used this value will be automatically detected - maxLength: 256 - type: string - nullable: true - framework: - description: The framework that is being used for this project. When `null` is used no framework is selected - type: string - enum: - - null - - blitzjs - - nextjs - - gatsby - - remix - - astro - - hexo - - eleventy - - docusaurus-2 - - docusaurus - - preact - - solidstart - - dojo - - ember - - vue - - scully - - ionic-angular - - angular - - polymer - - svelte - - sveltekit - - sveltekit-1 - - ionic-react - - create-react-app - - gridsome - - umijs - - sapper - - saber - - stencil - - nuxtjs - - redwoodjs - - hugo - - jekyll - - brunch - - middleman - - zola - - hydrogen - - vite - - vitepress - - vuepress - - parcel - - sanity - - storybook - nullable: true - installCommand: - description: The install command for this project. When `null` is used this value will be automatically detected - maxLength: 256 - type: string - nullable: true - outputDirectory: - description: The output directory of the project. When `null` is used this value will be automatically detected - maxLength: 256 - type: string - nullable: true - crons: - description: An array of cron jobs that should be created for production Deployments. - type: array - maxItems: 20 - items: - type: object - required: - - schedule - - path - properties: - schedule: - type: string - maxLength: 256 - path: - type: string - maxLength: 512 - pattern: ^/.* - deploymentId: - description: An deployment id for an existing deployment to redeploy - type: string - files: - description: A list of objects with the files to be deployed - items: - oneOf: - - additionalProperties: false - description: Used in the case you want to inline a file inside the request - properties: - data: - description: 'The file content, it could be either a `base64` (useful for images, etc.) of the files or the plain content for source code' - type: string - encoding: - description: 'The file content encoding, it could be either a base64 (useful for images, etc.) of the files or the plain text for source code.' - enum: - - base64 - - utf-8 - file: - description: The file name including the whole path - example: folder/file.js - type: string - required: - - file - - data - title: InlinedFile - type: object - - additionalProperties: false - description: Used in the case you want to reference a file that was already uploaded - properties: - file: - description: The file path relative to the project root - example: folder/file.js - type: string - sha: - description: 'The file contents hashed with SHA1, used to check the integrity' - type: string - size: - description: The file size in bytes - type: integer - required: - - file - title: UploadedFile - type: object - type: array - gitMetadata: - description: Populates initial git metadata for different git providers. - additionalProperties: false - type: object - properties: - remoteUrl: - type: string - description: The git repository's remote origin url - example: 'https://github.com/vercel/next.js' - commitAuthorName: - type: string - description: The name of the author of the commit - example: kyliau - commitMessage: - type: string - description: The commit message - example: add method to measure Interaction to Next Paint (INP) (#36490) - commitRef: - type: string + debug: + type: boolean + enum: + - false + - true + zeroConfig: + type: boolean + enum: + - false + - true + import: + additionalProperties: + type: string + type: object + functions: + additionalProperties: + properties: + architecture: + type: string + enum: + - arm64 + - x86_64 + memory: + type: number + maxDuration: + oneOf: + - type: number + - type: string + enum: + - max + affinity: + properties: + mode: + type: string + enum: + - strict + required: + - mode + type: object + maxConcurrency: + type: number + regions: + items: + type: string + type: array + functionFailoverRegions: + items: + type: string + type: array + runtime: + type: string + includeFiles: + type: string + excludeFiles: + type: string + experimentalTriggers: + items: + oneOf: + - properties: + type: + type: string + enum: + - queue/v1beta + description: Event type - must be "queue/v1beta" (REQUIRED) + consumer: + type: string + description: Name of the consumer group for this trigger (REQUIRED) + topic: + type: string + description: Name of the queue topic to consume from (REQUIRED) + maxDeliveries: + type: number + description: Maximum number of delivery attempts for message processing (OPTIONAL) This represents the total number of times a message can be delivered, not the number of retries. Must be at least 1 if specified. Behavior when not specified depends on the server's default configuration. + retryAfterSeconds: + type: number + description: Delay in seconds before retrying failed executions (OPTIONAL) Behavior when not specified depends on the server's default configuration. + initialDelaySeconds: + type: number + description: Initial delay in seconds before first execution attempt (OPTIONAL) Must be 0 or greater. Use 0 for no initial delay. Behavior when not specified depends on the server's default configuration. + maxConcurrency: + type: number + description: Maximum number of concurrent executions for this consumer (OPTIONAL) Must be at least 1 if specified. Behavior when not specified depends on the server's default configuration. + required: + - consumer + - topic + - type + type: object + description: Queue trigger input event for v1beta (from vercel.json config). Requires explicit consumer name. + - properties: + type: + type: string + enum: + - queue/v2beta + description: Event type - must be "queue/v2beta" (REQUIRED) + topic: + type: string + description: Name of the queue topic to consume from (REQUIRED) + maxDeliveries: + type: number + description: Maximum number of delivery attempts for message processing (OPTIONAL) This represents the total number of times a message can be delivered, not the number of retries. Must be at least 1 if specified. Behavior when not specified depends on the server's default configuration. + retryAfterSeconds: + type: number + description: Delay in seconds before retrying failed executions (OPTIONAL) Behavior when not specified depends on the server's default configuration. + initialDelaySeconds: + type: number + description: Initial delay in seconds before first execution attempt (OPTIONAL) Must be 0 or greater. Use 0 for no initial delay. Behavior when not specified depends on the server's default configuration. + maxConcurrency: + type: number + description: Maximum number of concurrent executions for this consumer (OPTIONAL) Must be at least 1 if specified. Behavior when not specified depends on the server's default configuration. + required: + - topic + - type + type: object + description: Queue trigger input event for v2beta (from vercel.json config). Consumer name is implicitly derived from the function path. Only one trigger per function is allowed. + - properties: + type: + type: string + enum: + - schedule/v1beta + description: Event type - must be "schedule/v1beta" (REQUIRED) + required: + - type + type: object + type: array + supportsCancellation: + type: boolean + enum: + - false + - true + type: object + type: object + projectSettings: + properties: + framework: + nullable: true + type: string + devCommand: + nullable: true + type: string + installCommand: + nullable: true + type: string + buildCommand: + nullable: true + type: string + outputDirectory: + nullable: true + type: string + rootDirectory: + nullable: true + type: string + nodeVersion: + type: string + monorepoManager: + nullable: true + type: string + createdAt: + type: number + autoExposeSystemEnvs: + type: boolean + enum: + - false + - true + sourceFilesOutsideRootDirectory: + type: boolean + enum: + - false + - true + directoryListing: + type: boolean + enum: + - false + - true + gitForkProtection: + type: boolean + enum: + - false + - true + commandForIgnoringBuildStep: + nullable: true + type: string + type: object + outputDirectory: + type: string + installCommand: + type: string + buildCommand: + type: string + devCommand: + type: string + framework: + nullable: true + type: string + nodeVersion: + type: string + middleware: + type: boolean + enum: + - false + - true + middlewareRuntime: + type: string + enum: + - nodejs + description: Enforced runtime for explicitly configured Routing Middleware. + middlewareMatcher: + oneOf: + - type: string + - items: + type: string + type: array + description: Matcher supplied outside of the middleware source module. + serviceName: + type: string + description: Owning service name; scopes per-function config such as the v2beta consumer. + type: object + required: + - use + type: object + description: Builder selected by the resolver. + installCommand: + type: string + buildCommand: + type: string + devCommand: + type: string + ignoreCommand: + type: string + outputDirectory: + type: string + bindings: + items: + properties: + type: + type: string + enum: + - service + description: If present, must be `"service"` for Service-to-Service HTTP bindings. + service: + type: string + description: Target service name from `services`. + format: + type: string + enum: + - url + description: Generated value shape, must be `"url"`. + env: + type: string + description: Environment variable name that will store the generated value + required: + - env + - format + - service + type: object + description: Caller-side bindings to other services. + type: array + description: Caller-side bindings to other services. + functions: + additionalProperties: + properties: + architecture: + type: string + enum: + - arm64 + - x86_64 + memory: + type: number + maxDuration: + oneOf: + - type: number + - type: string + enum: + - max + affinity: + properties: + mode: + type: string + enum: + - strict + required: + - mode + type: object + maxConcurrency: + type: number + regions: + items: + type: string + type: array + functionFailoverRegions: + items: + type: string + type: array + runtime: + type: string + includeFiles: + type: string + excludeFiles: + type: string + experimentalTriggers: + items: + oneOf: + - properties: + type: + type: string + enum: + - queue/v1beta + description: Event type - must be "queue/v1beta" (REQUIRED) + consumer: + type: string + description: Name of the consumer group for this trigger (REQUIRED) + topic: + type: string + description: Name of the queue topic to consume from (REQUIRED) + maxDeliveries: + type: number + description: Maximum number of delivery attempts for message processing (OPTIONAL) This represents the total number of times a message can be delivered, not the number of retries. Must be at least 1 if specified. Behavior when not specified depends on the server's default configuration. + retryAfterSeconds: + type: number + description: Delay in seconds before retrying failed executions (OPTIONAL) Behavior when not specified depends on the server's default configuration. + initialDelaySeconds: + type: number + description: Initial delay in seconds before first execution attempt (OPTIONAL) Must be 0 or greater. Use 0 for no initial delay. Behavior when not specified depends on the server's default configuration. + maxConcurrency: + type: number + description: Maximum number of concurrent executions for this consumer (OPTIONAL) Must be at least 1 if specified. Behavior when not specified depends on the server's default configuration. + required: + - consumer + - topic + - type + type: object + description: Queue trigger input event for v1beta (from vercel.json config). Requires explicit consumer name. + - properties: + type: + type: string + enum: + - queue/v2beta + description: Event type - must be "queue/v2beta" (REQUIRED) + topic: + type: string + description: Name of the queue topic to consume from (REQUIRED) + maxDeliveries: + type: number + description: Maximum number of delivery attempts for message processing (OPTIONAL) This represents the total number of times a message can be delivered, not the number of retries. Must be at least 1 if specified. Behavior when not specified depends on the server's default configuration. + retryAfterSeconds: + type: number + description: Delay in seconds before retrying failed executions (OPTIONAL) Behavior when not specified depends on the server's default configuration. + initialDelaySeconds: + type: number + description: Initial delay in seconds before first execution attempt (OPTIONAL) Must be 0 or greater. Use 0 for no initial delay. Behavior when not specified depends on the server's default configuration. + maxConcurrency: + type: number + description: Maximum number of concurrent executions for this consumer (OPTIONAL) Must be at least 1 if specified. Behavior when not specified depends on the server's default configuration. + required: + - topic + - type + type: object + description: Queue trigger input event for v2beta (from vercel.json config). Consumer name is implicitly derived from the function path. Only one trigger per function is allowed. + - properties: + type: + type: string + enum: + - schedule/v1beta + description: Event type - must be "schedule/v1beta" (REQUIRED) + required: + - type + type: object + type: array + supportsCancellation: + type: boolean + enum: + - false + - true + type: object + description: Function configuration scoped to this service. + type: object + description: Function configuration scoped to this service. + headers: + items: + properties: + source: + type: string + headers: + items: + properties: + key: + type: string + value: + type: string + required: + - key + - value + type: object + type: array + has: + items: + oneOf: + - properties: + type: + type: string + enum: + - host + value: + oneOf: + - type: string + - properties: + eq: + oneOf: + - type: string + - type: number + neq: + type: string + inc: + items: + type: string + type: array + ninc: + items: + type: string + type: array + pre: + type: string + suf: + type: string + re: + type: string + gt: + type: number + gte: + type: number + lt: + type: number + lte: + type: number + type: object + required: + - type + - value + type: object + - properties: + type: + type: string + enum: + - cookie + - header + - query + key: + type: string + value: + oneOf: + - type: string + - properties: + eq: + oneOf: + - type: string + - type: number + neq: + type: string + inc: + items: + type: string + type: array + ninc: + items: + type: string + type: array + pre: + type: string + suf: + type: string + re: + type: string + gt: + type: number + gte: + type: number + lt: + type: number + lte: + type: number + type: object + required: + - key + - type + type: object + type: array + missing: + items: + oneOf: + - properties: + type: + type: string + enum: + - host + value: + oneOf: + - type: string + - properties: + eq: + oneOf: + - type: string + - type: number + neq: + type: string + inc: + items: + type: string + type: array + ninc: + items: + type: string + type: array + pre: + type: string + suf: + type: string + re: + type: string + gt: + type: number + gte: + type: number + lt: + type: number + lte: + type: number + type: object + required: + - type + - value + type: object + - properties: + type: + type: string + enum: + - cookie + - header + - query + key: + type: string + value: + oneOf: + - type: string + - properties: + eq: + oneOf: + - type: string + - type: number + neq: + type: string + inc: + items: + type: string + type: array + ninc: + items: + type: string + type: array + pre: + type: string + suf: + type: string + re: + type: string + gt: + type: number + gte: + type: number + lt: + type: number + lte: + type: number + type: object + required: + - key + - type + type: object + type: array + required: + - headers + - source + type: object + type: array + redirects: + items: + properties: + source: + type: string + destination: + type: string + permanent: + type: boolean + enum: + - false + - true + statusCode: + type: number + has: + items: + oneOf: + - properties: + type: + type: string + enum: + - host + value: + oneOf: + - type: string + - properties: + eq: + oneOf: + - type: string + - type: number + neq: + type: string + inc: + items: + type: string + type: array + ninc: + items: + type: string + type: array + pre: + type: string + suf: + type: string + re: + type: string + gt: + type: number + gte: + type: number + lt: + type: number + lte: + type: number + type: object + required: + - type + - value + type: object + - properties: + type: + type: string + enum: + - cookie + - header + - query + key: + type: string + value: + oneOf: + - type: string + - properties: + eq: + oneOf: + - type: string + - type: number + neq: + type: string + inc: + items: + type: string + type: array + ninc: + items: + type: string + type: array + pre: + type: string + suf: + type: string + re: + type: string + gt: + type: number + gte: + type: number + lt: + type: number + lte: + type: number + type: object + required: + - key + - type + type: object + type: array + missing: + items: + oneOf: + - properties: + type: + type: string + enum: + - host + value: + oneOf: + - type: string + - properties: + eq: + oneOf: + - type: string + - type: number + neq: + type: string + inc: + items: + type: string + type: array + ninc: + items: + type: string + type: array + pre: + type: string + suf: + type: string + re: + type: string + gt: + type: number + gte: + type: number + lt: + type: number + lte: + type: number + type: object + required: + - type + - value + type: object + - properties: + type: + type: string + enum: + - cookie + - header + - query + key: + type: string + value: + oneOf: + - type: string + - properties: + eq: + oneOf: + - type: string + - type: number + neq: + type: string + inc: + items: + type: string + type: array + ninc: + items: + type: string + type: array + pre: + type: string + suf: + type: string + re: + type: string + gt: + type: number + gte: + type: number + lt: + type: number + lte: + type: number + type: object + required: + - key + - type + type: object + type: array + env: + items: + type: string + type: array + required: + - destination + - source + type: object + type: array + rewrites: + items: + properties: + source: + type: string + destination: + oneOf: + - type: string + - properties: + type: + type: string + enum: + - service + description: Optional explicit format marker. The destination is identified by the presence of `service`, so `type` is no longer required. + service: + type: string + path: + type: string + description: Routing-only path used to select a route inside the target service. + required: + - service + type: object + transforms: + items: + properties: + type: + type: string + enum: + - request.path + op: + type: string + enum: + - set + args: + type: string + env: + items: + type: string + type: array + required: + - args + - op + - type + type: object + type: array + has: + items: + oneOf: + - properties: + type: + type: string + enum: + - host + value: + oneOf: + - type: string + - properties: + eq: + oneOf: + - type: string + - type: number + neq: + type: string + inc: + items: + type: string + type: array + ninc: + items: + type: string + type: array + pre: + type: string + suf: + type: string + re: + type: string + gt: + type: number + gte: + type: number + lt: + type: number + lte: + type: number + type: object + required: + - type + - value + type: object + - properties: + type: + type: string + enum: + - cookie + - header + - query + key: + type: string + value: + oneOf: + - type: string + - properties: + eq: + oneOf: + - type: string + - type: number + neq: + type: string + inc: + items: + type: string + type: array + ninc: + items: + type: string + type: array + pre: + type: string + suf: + type: string + re: + type: string + gt: + type: number + gte: + type: number + lt: + type: number + lte: + type: number + type: object + required: + - key + - type + type: object + type: array + missing: + items: + oneOf: + - properties: + type: + type: string + enum: + - host + value: + oneOf: + - type: string + - properties: + eq: + oneOf: + - type: string + - type: number + neq: + type: string + inc: + items: + type: string + type: array + ninc: + items: + type: string + type: array + pre: + type: string + suf: + type: string + re: + type: string + gt: + type: number + gte: + type: number + lt: + type: number + lte: + type: number + type: object + required: + - type + - value + type: object + - properties: + type: + type: string + enum: + - cookie + - header + - query + key: + type: string + value: + oneOf: + - type: string + - properties: + eq: + oneOf: + - type: string + - type: number + neq: + type: string + inc: + items: + type: string + type: array + ninc: + items: + type: string + type: array + pre: + type: string + suf: + type: string + re: + type: string + gt: + type: number + gte: + type: number + lt: + type: number + lte: + type: number + type: object + required: + - key + - type + type: object + type: array + statusCode: + type: number + env: + items: + type: string + type: array + respectOriginCacheControl: + type: boolean + enum: + - false + - true + required: + - destination + - source + type: object + type: array + routes: + items: + oneOf: + - properties: + src: + type: string + dest: + type: string + headers: + additionalProperties: + type: string + type: object + methods: + items: + type: string + type: array + continue: + type: boolean + enum: + - false + - true + override: + type: boolean + enum: + - false + - true + caseSensitive: + type: boolean + enum: + - false + - true + check: + type: boolean + enum: + - false + - true + important: + type: boolean + enum: + - false + - true + status: + type: number + has: + items: + oneOf: + - properties: + type: + type: string + enum: + - host + value: + oneOf: + - type: string + - properties: + eq: + oneOf: + - type: string + - type: number + neq: + type: string + inc: + items: + type: string + type: array + ninc: + items: + type: string + type: array + pre: + type: string + suf: + type: string + re: + type: string + gt: + type: number + gte: + type: number + lt: + type: number + lte: + type: number + type: object + required: + - type + - value + type: object + - properties: + type: + type: string + enum: + - cookie + - header + - query + key: + type: string + value: + oneOf: + - type: string + - properties: + eq: + oneOf: + - type: string + - type: number + neq: + type: string + inc: + items: + type: string + type: array + ninc: + items: + type: string + type: array + pre: + type: string + suf: + type: string + re: + type: string + gt: + type: number + gte: + type: number + lt: + type: number + lte: + type: number + type: object + required: + - key + - type + type: object + type: array + missing: + items: + oneOf: + - properties: + type: + type: string + enum: + - host + value: + oneOf: + - type: string + - properties: + eq: + oneOf: + - type: string + - type: number + neq: + type: string + inc: + items: + type: string + type: array + ninc: + items: + type: string + type: array + pre: + type: string + suf: + type: string + re: + type: string + gt: + type: number + gte: + type: number + lt: + type: number + lte: + type: number + type: object + required: + - type + - value + type: object + - properties: + type: + type: string + enum: + - cookie + - header + - query + key: + type: string + value: + oneOf: + - type: string + - properties: + eq: + oneOf: + - type: string + - type: number + neq: + type: string + inc: + items: + type: string + type: array + ninc: + items: + type: string + type: array + pre: + type: string + suf: + type: string + re: + type: string + gt: + type: number + gte: + type: number + lt: + type: number + lte: + type: number + type: object + required: + - key + - type + type: object + type: array + mitigate: + properties: + action: + type: string + enum: + - challenge + - deny + required: + - action + type: object + transforms: + items: + oneOf: + - properties: + type: + type: string + enum: + - request.headers + - request.query + - response.headers + op: + type: string + enum: + - append + - delete + - set + target: + properties: + key: + oneOf: + - type: string + - properties: + eq: + oneOf: + - type: string + - type: number + neq: + type: string + inc: + items: + type: string + type: array + ninc: + items: + type: string + type: array + pre: + type: string + suf: + type: string + gt: + type: number + gte: + type: number + lt: + type: number + lte: + type: number + type: object + required: + - key + type: object + args: + oneOf: + - type: string + - items: + type: string + type: array + env: + items: + type: string + type: array + required: + - op + - target + - type + type: object + - properties: + type: + type: string + enum: + - request.path + op: + type: string + enum: + - set + args: + type: string + env: + items: + type: string + type: array + required: + - args + - op + - type + type: object + type: array + env: + items: + type: string + type: array + locale: + properties: + redirect: + additionalProperties: + type: string + type: object + cookie: + type: string + type: object + source: + type: string + description: Aliases for `src`, `dest`, and `status`. These provide consistency with the `rewrites`, `redirects`, and `headers` fields which use `source`, `destination`, and `statusCode`. During normalization, the string forms are converted to their canonical forms (`src`, `dest`, `status`) and stripped from the route object. `destination` may also be a service-targeted object, in which case routing is delegated into the named service's internal route table and the object is preserved as-is (not folded into `dest`). + destination: + oneOf: + - type: string + - properties: + type: + type: string + enum: + - service + description: Optional explicit format marker. The destination is identified by the presence of `service`, so `type` is no longer required. + service: + type: string + path: + type: string + description: Routing-only path used to select a route inside the target service. + required: + - service + type: object + statusCode: + type: number + middlewarePath: + type: string + description: A middleware key within the `output` key under the build result. Overrides a `middleware` definition. + middlewareRawSrc: + items: + type: string + type: array + description: The original middleware matchers. + middleware: + type: number + description: A middleware index in the `middleware` key under the build result + respectOriginCacheControl: + type: boolean + enum: + - false + - true + required: + - src + type: object + - properties: + handle: + type: string + enum: + - error + - filesystem + - hit + - miss + - resource + - rewrite + src: + type: string + dest: + type: string + status: + type: number + required: + - handle + type: object + type: array + cleanUrls: + type: boolean + enum: + - false + - true + trailingSlash: + type: boolean + enum: + - false + - true + required: + - builder + - name + - root + - schema + type: object + description: Services detected during build from vercel.json experimentalServices or auto-detected from project structure. Used to inject service URLs as environment variables at runtime. + type: array + description: Services detected during build from vercel.json experimentalServices or auto-detected from project structure. Used to inject service URLs as environment variables at runtime. + gitRepo: + nullable: true + oneOf: + - properties: + namespace: + type: string + projectId: + type: number + type: + type: string + enum: + - gitlab + url: + type: string + path: + type: string + defaultBranch: + type: string + name: + type: string + private: + type: boolean + enum: + - false + - true + ownerType: + type: string + enum: + - team + - user + required: + - defaultBranch + - name + - namespace + - ownerType + - path + - private + - projectId + - type + - url + type: object + - properties: + org: + type: string + repo: + type: string + repoId: + type: number + type: + type: string + enum: + - github + repoOwnerId: + type: number + path: + type: string + defaultBranch: + type: string + name: + type: string + private: + type: boolean + enum: + - false + - true + ownerType: + type: string + enum: + - team + - user + required: + - defaultBranch + - name + - org + - ownerType + - path + - private + - repo + - repoId + - repoOwnerId + - type + type: object + - properties: + owner: + type: string + repoUuid: + type: string + slug: + type: string + type: + type: string + enum: + - bitbucket + workspaceUuid: + type: string + path: + type: string + defaultBranch: + type: string + name: + type: string + private: + type: boolean + enum: + - false + - true + ownerType: + type: string + enum: + - team + - user + required: + - defaultBranch + - name + - owner + - ownerType + - path + - private + - repoUuid + - slug + - type + - workspaceUuid + type: object + - properties: + org: + type: string + repo: + type: string + type: + type: string + enum: + - vercel + path: + type: string + defaultBranch: + type: string + name: + type: string + private: + type: boolean + enum: + - false + - true + ownerType: + type: string + enum: + - team + - user + required: + - defaultBranch + - name + - org + - ownerType + - path + - private + - repo + - type + type: object + - properties: + owner: + type: string + description: Owner (namespace) slug. + repo: + type: string + repoId: + type: string + description: Origin repository id. + type: + type: string + enum: + - cursor-origin + path: + type: string + defaultBranch: + type: string + name: + type: string + private: + type: boolean + enum: + - false + - true + ownerType: + type: string + enum: + - team + - user + required: + - defaultBranch + - name + - owner + - ownerType + - path + - private + - repo + - repoId + - type + type: object + flags: + oneOf: + - properties: + definitions: + additionalProperties: + properties: + options: + items: + properties: + value: + $ref: '#/components/schemas/FlagJSONValue' + label: + type: string + required: + - value + type: object + type: array + url: + type: string + description: + type: string + type: object + type: object + required: + - definitions + type: object + description: Flags defined in the Build Output API, used by this deployment. Primarily used by the Toolbar to know about the used flags. + - items: + type: string + description: Flags defined in the Build Output API, used by this deployment. Primarily used by the Toolbar to know about the used flags. (opaque JSON object) + type: array + description: Flags defined in the Build Output API, used by this deployment. Primarily used by the Toolbar to know about the used flags. + microfrontends: + oneOf: + - properties: + isDefaultApp: + type: boolean + enum: + - false + defaultAppProjectName: + type: string + description: The project name of the default app of this deployment's microfrontends group. + defaultRoute: + type: string + description: A path that is used to take screenshots and as the default path in preview links when a domain for this microfrontend is shown in the UI. + groupIds: + type: array + items: + type: string + minItems: 1 + description: The group of microfrontends that this project belongs to. Each microfrontend project must belong to a microfrontends group that is the set of microfrontends that are used together. + required: + - defaultAppProjectName + - groupIds + type: object + - properties: + isDefaultApp: + type: boolean + enum: + - true + mfeConfigUploadState: + type: string + enum: + - no_config + - success + - waiting_on_build + description: The result of the microfrontends config upload during deployment creation / build. Only set for default app deployments. The config upload is attempted during deployment create, and then again during the build. If the config is not in the root directory, or the deployment is prebuilt, the config cannot be uploaded during deployment create. The upload during deployment build finds the config even if it's not in the root directory, as it has access to all files. Uploading the config during create is ideal, as then all child deployments are guaranteed to have access to the default app deployment config even if the default app has not yet started building. If the config is not uploaded, the child app will show as building until the config has been uploaded during the default app build. - `success` - The config was uploaded successfully, either when the deployment was created or during the build. - `waiting_on_build` - The config could not be uploaded during deployment create, will be attempted again during the build. - `no_config` - No config was found. Only set once the build has not found the config in any of the deployment's files. - `undefined` - Legacy deployments, or there was an error uploading the config during deployment create. + defaultAppProjectName: + type: string + description: The project name of the default app of this deployment's microfrontends group. + defaultRoute: + type: string + description: A path that is used to take screenshots and as the default path in preview links when a domain for this microfrontend is shown in the UI. + groupIds: + type: array + items: + type: string + minItems: 1 + description: The group of microfrontends that this project belongs to. Each microfrontend project must belong to a microfrontends group that is the set of microfrontends that are used together. + required: + - defaultAppProjectName + - groupIds + - isDefaultApp + type: object + platform: + properties: + source: + properties: + name: + type: string + description: Display name of the platform. + required: + - name + type: object + description: The external platform that created the deployment (e.g. its display name). + origin: + properties: + type: + type: string + enum: + - id + - url + description: Whether the value is an opaque identifier or a URL. + value: + type: string + description: The identifier or URL pointing to the originating entity. + required: + - type + - value + type: object + description: Reference back to the entity on the platform that initiated the deployment. + creator: + properties: + name: + type: string + description: Display name of the platform user. + avatar: + type: string + description: URL of the platform user's avatar image. + required: + - name + type: object + description: The user on the external platform who triggered the deployment. + meta: + additionalProperties: + type: string + type: object + description: Arbitrary key-value metadata provided by the platform. + required: + - creator + - origin + - source + type: object + description: Metadata about the source platform that triggered the deployment. Allows us to map a deployment back to a platform (e.g. the chat that created it) + config: + properties: + version: + type: number + functionType: + type: string + enum: + - fluid + - standard + functionMemoryType: + type: string + enum: + - performance + - performance_xl + - standard + - standard_legacy + functionTimeout: + nullable: true + type: number + secureComputePrimaryRegion: + nullable: true + type: string + secureComputeFallbackRegion: + nullable: true + type: string + isUsingActiveCPU: + type: boolean + enum: + - false + - true + resourceConfig: + properties: + buildQueue: + properties: + configuration: + type: string + enum: + - SKIP_NAMESPACE_QUEUE + - WAIT_FOR_NAMESPACE_QUEUE + description: Build resource configuration snapshot for this deployment. + type: object + description: Build resource configuration snapshot for this deployment. + elasticConcurrency: + type: string + enum: + - PROJECT_SETTING + - SKIP_QUEUE + - TEAM_SETTING + description: 'When elastic concurrency is used for this deployment, a value is set. The value tells the reason where the setting was coming from. - TEAM_SETTING: Inherited from team settings - PROJECT_SETTING: Inherited from project settings - SKIP_QUEUE: Manually triggered by user to skip the queues' + buildMachine: + properties: + purchaseType: + nullable: true + type: string + enum: + - basic + - enhanced + - standard + - turbo + - null + description: Machine type that was used for the build. + type: object + type: object + description: Build resource configuration snapshot for this deployment. + required: + - functionMemoryType + - functionTimeout + - functionType + - secureComputeFallbackRegion + - secureComputePrimaryRegion + type: object + description: Since February 2025 the configuration must include snapshot data at the time of deployment creation to capture properties for the /deployments/:id/config endpoint utilized for displaying Deployment Configuration on the frontend This is optional because older deployments may not have this data captured + checks: + properties: + deployment-alias: + properties: + state: + type: string + enum: + - failed + - pending + - succeeded + startedAt: + type: number + completedAt: + type: number + required: + - startedAt + - state + type: object + description: Condensed check data. Retrieve individual check and check run data using api-checks v2 routes. + required: + - deployment-alias + type: object + seatBlock: + properties: + blockCode: + type: string + enum: + - COMMIT_AUTHOR_REQUIRED + - TEAM_ACCESS_REQUIRED + description: 'The NSNB decision code for the seat block. TODO: We should consolidate block types.' + userId: + type: string + description: The blocked vercel user ID. + isVerified: + type: boolean + enum: + - false + - true + description: Determines if the user was verified during the block. In the git integration case, the commit sender was the author. + gitUserId: + oneOf: + - type: string + - type: number + gitProvider: + type: string + enum: + - bitbucket + - github + - gitlab + description: The git provider type associated with gitUserId. + required: + - blockCode + type: object + description: NSNB Blocked metadata + attribution: + properties: + commitMeta: + properties: + email: + type: string + description: Email from git commit author + name: + type: string + description: Name from git commit author + isVerified: + type: boolean + enum: + - false + - true + description: Whether the commit was signed/verified (GitHub only, others return undefined) + type: object + description: Commit metadata from the git commit author + gitUser: + properties: + id: + oneOf: + - type: string + - type: number + login: + type: string + description: Git provider username/login + type: + type: string + description: User type + provider: + type: string + description: The git provider (github, gitlab, bitbucket) + required: + - id + - login + type: object + description: Git provider user associated with the commit author email (only set if resolved) + vercelUser: + properties: + id: + type: string + description: Vercel user ID + username: + type: string + description: Vercel username + teamRoles: + items: + type: string + type: array + description: Team roles at time of deployment + required: + - id + - username + type: object + description: Vercel user linked to the git provider account (only set if resolved) + type: object + description: Attribution metadata for the deployment, linking commit author to git and Vercel users. Only populated when the `enable-deployment-attribution` flag is enabled. + required: + - aliasAssigned + - id + - readyState + - bootedAt + - build + - buildSkipped + - buildingAt + - createdAt + - createdIn + - creator + - env + - inspectorUrl + - isInConcurrentBuildsQueue + - isInSystemBuildsQueue + - meta + - name + - ownerId + - plan + - projectId + - projectSettings + - public + - regions + - routes + - status + - type + - url + - version + type: object + description: Returns the reduced deployment view for anonymous (`vcn_`) callers. Pool-team details are withheld. + '400': + description: One of the provided values in the request query is invalid. + '403': + description: You do not have permission to access this resource. + '404': + description: The deployment was not found + '410': + description: '' + '429': + description: '' + x-vercel-cli: + supportedSubcommands: true + supportedProduction: false + aliases: + - inspect + - get + parameters: + - name: id_or_url + description: The unique identifier or hostname of the deployment. + in: path + required: true + schema: + example: dpl_89qyp1cskzkLrVicDaZoDbjyHuDJ + description: The unique identifier or hostname of the deployment. + type: string + - name: withGitRepoInfo + description: When `true`, the response includes the `gitSource` object with the commit SHA, branch name, and connected repository metadata. Defaults to `false`. + in: query + required: false + schema: + description: When `true`, the response includes the `gitSource` object with the commit SHA, branch name, and connected repository metadata. Defaults to `false`. + type: string + example: 'true' + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + /v13/deployments: + post: + description: Creates a new deployment for the authenticated team or user. For non-git deployments, upload files first via the file upload API, then reference them here by SHA — or inline small files directly in the request body. To redeploy an existing deployment, provide its `deploymentId`; all settings are inherited unless explicitly overridden. The deployment begins building immediately and transitions through `QUEUED` → `INITIALIZING` → `BUILDING` before reaching `READY` or `ERROR`. + operationId: createDeployment + security: + - bearerToken: [] + summary: Create a new deployment + tags: + - deployments + responses: + '200': + description: |- + Returns the newly created deployment object. Poll `readyState` to track build progress. See https://vercel.com/docs/deployments/deployment-states for possible states. + Returns the reduced deployment view for anonymous (`vcn_`) callers. Pool-team details are withheld. + content: + application/json: + schema: + properties: + alias: + items: + type: string + type: array + aliasAssigned: + type: boolean + enum: + - false + - true + id: + type: string + description: A string holding the unique ID of the deployment + example: dpl_89qyp1cskzkLrVicDaZoDbjyHuDJ + target: + nullable: true + type: string + enum: + - production + - staging + - null + description: If defined, either `staging` if a staging alias in the format `..now.sh` was assigned upon creation, or `production` if the aliases from `alias` were assigned. `null` value indicates the "preview" deployment. + example: null + readyState: + type: string + enum: + - BLOCKED + - BUILDING + - CANCELED + - ERROR + - INITIALIZING + - QUEUED + - READY + description: The state of the deployment depending on the process of deploying, or if it is ready or in an error state + example: READY + aliasError: + nullable: true + properties: + code: + type: string + message: + type: string + required: + - code + - message + type: object + description: An object that will contain a `code` and a `message` when the aliasing fails, otherwise the value will be `null` + example: null + aliasWarning: + nullable: true + properties: + code: + type: string + message: + type: string + link: + type: string + action: + type: string + required: + - code + - message + type: object + errorCode: + type: string + errorMessage: + nullable: true + type: string + aliasAssignedAt: + nullable: true + oneOf: + - type: number + - type: boolean + enum: + - false + - true + alwaysRefuseToBuild: + type: boolean + enum: + - false + - true + build: + properties: + env: + items: + type: string + type: array + required: + - env + type: object + buildArtifactUrls: + items: + type: string + type: array + builds: + items: + properties: + use: + type: string + src: + type: string + config: + additionalProperties: true + type: object + required: + - use + type: object + type: array + env: + items: + type: string + type: array + resourceConfig: + properties: + buildMachine: + properties: + purchaseType: + type: string + enum: + - basic + - enhanced + - standard + - turbo + description: Machine type which was purchased/selected for this build. `basic` is the 2vCPU tier, recorded on the deployment so the build pipeline can detect a basic build without consulting the project. + defaultPurchaseType: + type: string + enum: + - basic + - enhanced + - standard + description: The default plan type for the build machine — what the customer is *paying* for on their plan. For most customers, this is standard, but some customers have an entitlement for enhanced builds. + machineSelectionType: + type: string + enum: + - elastic + - fixed + description: Whether the build ran on a fixed or elastic machine. Used to drive billing for the build. + selectionSource: + type: string + enum: + - elastic-algorithm + - plan-default + - project-setting + - team-entitlement + - team-setting + description: The setting which selected the build machine when the deployment was created. Frozen here so later project or team changes do not rewrite its history. + cores: + type: number + description: Number of cores the build machine ran with. Set at dispatch time once the build lands on a hive. + memory: + type: number + description: Memory, in MiB, the build machine ran with. Set at dispatch time once the build lands on a hive. + type: object + description: Build machine configuration recorded for this deployment's build. See {@link DeploymentBuildMachine}. Distinct from the team/user `resourceConfig.buildMachine`, which only carries `default`. + type: object + inspectorUrl: + nullable: true + type: string + isInConcurrentBuildsQueue: + type: boolean + enum: + - false + - true + isInSystemBuildsQueue: + type: boolean + enum: + - false + - true + projectSettings: + properties: + nodeVersion: + type: string + enum: + - 10.x + - 12.x + - 14.x + - 16.x + - 18.x + - 20.x + - 22.x + - 24.x + - 8.10.x + buildCommand: + nullable: true + type: string + devCommand: + nullable: true + type: string + framework: + nullable: true + type: string + enum: + - actix-web + - angular + - ash + - astro + - axum + - blitzjs + - brunch + - bun + - container + - create-react-app + - django + - docusaurus + - docusaurus-2 + - dojo + - eleventy + - elysia + - ember + - eve + - express + - factory-eve + - fastapi + - fasthtml + - fastify + - flask + - gatsby + - go + - gridsome + - h3 + - hexo + - hono + - hugo + - hydrogen + - ionic-angular + - ionic-react + - jekyll + - koa + - mastra + - middleman + - nestjs + - nextjs + - nitro + - node + - nuxtjs + - parcel + - polymer + - preact + - python + - react-router + - redwoodjs + - remix + - ruby + - rust + - saber + - sanity + - sanity-v2 + - sapper + - scully + - services + - solidstart + - solidstart-1 + - stencil + - storybook + - svelte + - sveltekit + - sveltekit-1 + - tanstack-start + - tanstack-start-lovable + - umijs + - vite + - vitepress + - vue + - vuepress + - xmcp + - zola + - null + commandForIgnoringBuildStep: + nullable: true + type: string + installCommand: + nullable: true + type: string + outputDirectory: + nullable: true + type: string + speedInsights: + properties: + id: + type: string + enabledAt: + type: number + disabledAt: + type: number + canceledAt: + type: number + hasData: + type: boolean + enum: + - false + - true + dataReceivedAt: + type: number + description: When the first free (not Speed Insights Plus) production data point was observed, in ms. Set once by subscriber-analytics-events; projects that already had data before this field shipped get it backfilled on their next batch, so it reads "first free data point observed", not necessarily "first ever". + paidAt: + type: number + required: + - id + type: object + webAnalytics: + properties: + id: + type: string + disabledAt: + type: number + canceledAt: + type: number + enabledAt: + type: number + hasData: + type: boolean + enum: + - true + required: + - id + type: object + type: object + integrations: + properties: + status: + type: string + enum: + - error + - pending + - ready + - skipped + - timeout + startedAt: + type: number + claimedAt: + type: number + completedAt: + type: number + skippedAt: + type: number + skippedBy: + type: string + required: + - startedAt + - status + type: object + images: + properties: + sizes: + items: + type: number + type: array + qualities: + items: + type: number + type: array + domains: + items: + type: string + type: array + remotePatterns: + items: + properties: + protocol: + type: string + enum: + - http + - https + description: Must be `http` or `https`. + hostname: + type: string + description: Can be literal or wildcard. Single `*` matches a single subdomain. Double `**` matches any number of subdomains. + port: + type: string + description: Can be literal port such as `8080` or empty string meaning no port. + pathname: + type: string + description: Can be literal or wildcard. Single `*` matches a single path segment. Double `**` matches any number of path segments. + search: + type: string + description: Can be literal query string such as `?v=1` or empty string meaning no query string. + required: + - hostname + type: object + type: array + localPatterns: + items: + properties: + pathname: + type: string + description: Can be literal or wildcard. Single `*` matches a single path segment. Double `**` matches any number of path segments. + search: + type: string + description: Can be literal query string such as `?v=1` or empty string meaning no query string. + type: object + type: array + minimumCacheTTL: + type: number + formats: + items: + type: string + enum: + - image/avif + - image/webp + type: array + dangerouslyAllowSVG: + type: boolean + enum: + - false + - true + contentSecurityPolicy: + type: string + contentDispositionType: + type: string + enum: + - attachment + - inline + type: object + bootedAt: + type: number + buildingAt: + type: number + buildContainerFinishedAt: + type: number + description: Since April 2025 it necessary for On-Demand Concurrency Minutes calculation + buildSkipped: + type: boolean + enum: + - false + - true + creator: + properties: + uid: + type: string + description: Stable creator id across principal types (user id, app id, integration configuration id, or `system`). + example: 96SnxkFiMyVKsK3pnoHfx3Hz + type: + type: string + enum: + - app + - integration + - system + - user + description: Principal type of the deployment creator. + username: + type: string + description: The username of the user that created the deployment + example: john-doe + avatar: + type: string + description: The avatar of the user that created the deployment + required: + - uid + type: object + description: Information about the deployment creator + initReadyAt: + type: number + isFirstBranchDeployment: + type: boolean + enum: + - false + - true + lambdas: + items: + properties: + id: + type: string + readyState: + type: string + enum: + - BUILDING + - ERROR + - INITIALIZING + - READY + createdAt: + type: number + entrypoint: + nullable: true + type: string + readyStateAt: + type: number + output: + items: + properties: + path: + type: string + functionName: + type: string + required: + - functionName + - path + type: object + type: array + required: + - id + - output + type: object + description: A partial representation of a Build used by the deployment endpoint. + type: array + public: + type: boolean + enum: + - false + - true + description: A boolean representing if the deployment is public or not. By default this is `false` + example: false + ready: + type: number + status: + type: string + enum: + - BLOCKED + - BUILDING + - CANCELED + - ERROR + - INITIALIZING + - QUEUED + - READY + team: + properties: + id: + type: string + name: + type: string + slug: + type: string + avatar: + type: string + required: + - id + - name + - slug + type: object + description: The team that owns the deployment if any + userAliases: + items: + type: string + type: array + description: An array of domains that were provided by the user when creating the Deployment. + example: + - sub1.example.com + - sub2.example.com + previewCommentsEnabled: + type: boolean + enum: + - false + - true + description: Whether or not preview comments are enabled for the deployment + example: false + ttyBuildLogs: + type: boolean + enum: + - false + - true + customEnvironment: + oneOf: + - properties: + id: + type: string + description: 'Unique identifier for the custom environment (format: env_*)' + slug: + type: string + description: URL-friendly name of the environment + type: + type: string + enum: + - development + - preview + - production + description: The type of environment (production, preview, or development) + description: + type: string + description: Optional description of the environment's purpose + branchMatcher: + properties: + type: + type: string + enum: + - endsWith + - equals + - startsWith + description: The type of matching to perform + pattern: + type: string + description: The pattern to match against branch names + required: + - pattern + - type + type: object + description: Configuration for matching git branches to this environment + domains: + items: + properties: + name: + type: string + apexName: + type: string + projectId: + type: string + redirect: + nullable: true + type: string + redirectStatusCode: + nullable: true + type: number + enum: + - 301 + - 302 + - 307 + - 308 + - null + gitBranch: + nullable: true + type: string + customEnvironmentId: + nullable: true + type: string + updatedAt: + type: number + createdAt: + type: number + verified: + type: boolean + enum: + - false + - true + description: '`true` if the domain is verified for use with the project. If `false` it will not be used as an alias on this project until the challenge in `verification` is completed.' + verification: + items: + properties: + type: + type: string + domain: + type: string + value: + type: string + reason: + type: string + required: + - domain + - reason + - type + - value + type: object + description: 'A list of verification challenges, one of which must be completed to verify the domain for use on the project. After the challenge is complete `POST /projects/:idOrName/domains/:domain/verify` to verify the domain. Possible challenges: - If `verification.type = TXT` the `verification.domain` will be checked for a TXT record matching `verification.value`.' + type: array + description: 'A list of verification challenges, one of which must be completed to verify the domain for use on the project. After the challenge is complete `POST /projects/:idOrName/domains/:domain/verify` to verify the domain. Possible challenges: - If `verification.type = TXT` the `verification.domain` will be checked for a TXT record matching `verification.value`.' + required: + - apexName + - name + - projectId + - verified + type: object + description: List of domains associated with this environment + type: array + description: List of domains associated with this environment + currentDeploymentAliases: + items: + type: string + type: array + description: List of aliases for the current deployment + createdAt: + type: number + description: Timestamp when the environment was created + updatedAt: + type: number + description: Timestamp when the environment was last updated + required: + - createdAt + - id + - slug + - type + - updatedAt + type: object + description: If the deployment was created using a Custom Environment, then this property contains information regarding the environment used. + - properties: + id: + type: string + required: + - id + type: object + description: If the deployment was created using a Custom Environment, then this property contains information regarding the environment used. + oomReport: + type: string + enum: + - out-of-memory + readyStateReason: + type: string + createdAt: + type: number + description: A number containing the date when the deployment was created in milliseconds + example: 1540257589405 + name: + type: string + description: The name of the project associated with the deployment at the time that the deployment was created + example: my-project + type: + type: string + enum: + - LAMBDAS + aliasFinal: + nullable: true + type: string + autoAssignCustomDomains: + type: boolean + enum: + - false + - true + description: applies to custom domains only, defaults to `true` + automaticAliases: + items: + type: string + type: array + buildErrorAt: + type: number + checksState: + type: string + enum: + - completed + - registered + - running + checksConclusion: + type: string + enum: + - canceled + - failed + - skipped + - succeeded + deletedAt: + nullable: true + type: number + description: A number containing the date when the deployment was deleted at milliseconds + example: 1540257589405 + defaultRoute: + type: string + description: Computed field that is only available for deployments with a microfrontend configuration. + canceledAt: + type: number + errorLink: + type: string + errorStep: + type: string + passiveRegions: + items: + type: string + type: array + description: Since November 2023 this field defines a set of regions that we will deploy the lambda to passively Lambdas will be deployed to these regions but only invoked if all of the primary `regions` are marked as out of service + gitSource: + oneOf: + - properties: + type: + type: string + enum: + - github + repoId: + oneOf: + - type: string + - type: number + ref: + nullable: true + type: string + sha: + type: string + prId: + nullable: true + type: number + required: + - repoId + - type + type: object + - properties: + type: + type: string + enum: + - github + org: + type: string + repo: + type: string + ref: + nullable: true + type: string + sha: + type: string + prId: + nullable: true + type: number + required: + - org + - repo + - type + type: object + - properties: + type: + type: string + enum: + - github-custom-host + host: + type: string + repoId: + oneOf: + - type: string + - type: number + ref: + nullable: true + type: string + sha: + type: string + prId: + nullable: true + type: number + required: + - host + - repoId + - type + type: object + - properties: + type: + type: string + enum: + - github-custom-host + host: + type: string + org: + type: string + repo: + type: string + ref: + nullable: true + type: string + sha: + type: string + prId: + nullable: true + type: number + required: + - host + - org + - repo + - type + type: object + - properties: + type: + type: string + enum: + - github-limited + repoId: + oneOf: + - type: string + - type: number + ref: + nullable: true + type: string + sha: + type: string + prId: + nullable: true + type: number + required: + - repoId + - type + type: object + - properties: + type: + type: string + enum: + - github-limited + org: + type: string + repo: + type: string + ref: + nullable: true + type: string + sha: + type: string + prId: + nullable: true + type: number + required: + - org + - repo + - type + type: object + - properties: + type: + type: string + enum: + - gitlab + projectId: + oneOf: + - type: string + - type: number + ref: + nullable: true + type: string + sha: + type: string + prId: + nullable: true + type: number + required: + - projectId + - type + type: object + - properties: + type: + type: string + enum: + - bitbucket + workspaceUuid: + type: string + repoUuid: + type: string + ref: + nullable: true + type: string + sha: + type: string + prId: + nullable: true + type: number + required: + - repoUuid + - type + type: object + - properties: + type: + type: string + enum: + - bitbucket + owner: + type: string + slug: + type: string + ref: + nullable: true + type: string + sha: + type: string + prId: + nullable: true + type: number + required: + - owner + - slug + - type + type: object + - properties: + type: + type: string + enum: + - vercel + org: + type: string + repo: + type: string + sha: + type: string + repoPushedAt: + type: number + ref: + nullable: true + type: string + prId: + nullable: true + type: number + required: + - sha + - type + type: object + - properties: + type: + type: string + enum: + - cursor-origin + repoId: + type: string + description: Origin repository id. + owner: + type: string + description: Owner (namespace) slug. + repo: + type: string + ref: + nullable: true + type: string + sha: + type: string + prId: + nullable: true + type: number + required: + - repoId + - type + type: object + - properties: + type: + type: string + enum: + - custom + ref: + type: string + sha: + type: string + gitUrl: + type: string + required: + - gitUrl + - ref + - sha + - type + type: object + description: Allows custom git sources (local folder mounted to the container) in test mode + - properties: + type: + type: string + enum: + - github + ref: + type: string + sha: + type: string + repoId: + type: number + org: + type: string + repo: + type: string + required: + - ref + - repoId + - sha + - type + type: object + - properties: + type: + type: string + enum: + - github-custom-host + host: + type: string + ref: + type: string + sha: + type: string + repoId: + type: number + org: + type: string + repo: + type: string + required: + - host + - ref + - repoId + - sha + - type + type: object + - properties: + type: + type: string + enum: + - github-limited + ref: + type: string + sha: + type: string + repoId: + type: number + org: + type: string + repo: + type: string + required: + - ref + - repoId + - sha + - type + type: object + - properties: + type: + type: string + enum: + - gitlab + ref: + type: string + sha: + type: string + projectId: + type: number + required: + - projectId + - ref + - sha + - type + type: object + - properties: + type: + type: string + enum: + - bitbucket + ref: + type: string + sha: + type: string + owner: + type: string + slug: + type: string + workspaceUuid: + type: string + repoUuid: + type: string + required: + - ref + - repoUuid + - sha + - type + - workspaceUuid + type: object + - properties: + type: + type: string + enum: + - vercel + ref: + type: string + sha: + type: string + org: + type: string + repo: + type: string + repoPushedAt: + type: number + required: + - org + - ref + - repo + - sha + - type + type: object + - properties: + type: + type: string + enum: + - cursor-origin + ref: + type: string + sha: + type: string + repoId: + type: string + owner: + type: string + repo: + type: string + required: + - owner + - ref + - repo + - repoId + - sha + - type + type: object + manualProvisioning: + properties: + state: + type: string + enum: + - COMPLETE + - PENDING + - TIMEOUT + description: Current provisioning state + completedAt: + type: number + description: Timestamp when manual provisioning completed + required: + - state + type: object + description: Present when deployment was created with manual provisioning enabled, either explicitly or via the experimental BYOC git flow. The deployment stays in INITIALIZING until /continue is called. + meta: + additionalProperties: + type: string + type: object + originCacheRegion: + type: string + nodeVersion: + type: string + enum: + - 10.x + - 12.x + - 14.x + - 16.x + - 18.x + - 20.x + - 22.x + - 24.x + - 8.10.x + description: If set it overrides the `projectSettings.nodeVersion` for this deployment. + project: + properties: + id: + type: string + name: + type: string + framework: + nullable: true + type: string + required: + - id + - name + type: object + description: The public project information associated with the deployment. + prebuilt: + type: boolean + enum: + - false + - true + readySubstate: + type: string + enum: + - PROMOTED + - ROLLING + - STAGED + description: 'Substate of deployment when readyState is ''READY'' Tracks whether or not deployment has seen production traffic: - STAGED: never seen production traffic - ROLLING: in the process of having production traffic gradually transitioned. - PROMOTED: has seen production traffic' + regions: + items: + type: string + type: array + description: The regions the deployment exists in + example: + - sfo1 + softDeletedByRetention: + type: boolean + enum: + - false + - true + description: flag to indicate if the deployment was deleted by retention policy + example: 'true' + source: + type: string + enum: + - api-trigger-git-deploy + - cli + - clone/repo + - drop + - git + - git-deploy-hook + - import + - import/repo + - redeploy + - v0-web + description: Where was the deployment created from. Best-effort guess for metrics only — not authoritative; do not gate behavior on it. + example: cli + undeletedAt: + type: number + description: A number containing the date when the deployment was undeleted at milliseconds + example: 1540257589405 + url: + type: string + description: A string with the unique URL of the deployment + example: my-instant-deployment-3ij3cxz9qr.now.sh + userConfiguredDeploymentId: + type: string + description: Since January 2025 User-configured deployment ID for skew protection with pre-built deployments. This is set when users configure a custom deploymentId in their next.config.js file. This allows Next.js to use skew protection even when deployments are pre-built outside of Vercel's build system. + example: abc123 + version: + type: number + enum: + - 2 + description: The platform version that was used to create the deployment. + example: 2 + oidcTokenClaims: + properties: + iss: + type: string + sub: + type: string + scope: + type: string + aud: + type: string + owner: + type: string + owner_id: + type: string + project: + type: string + project_id: + type: string + environment: + type: string + custom_environment_id: + type: string + mfe_group_ids: + items: + type: string + type: array + plan: + type: string + required: + - aud + - environment + - iss + - owner + - owner_id + - project + - project_id + - scope + - sub + type: object + projectId: + type: string + plan: + type: string + enum: + - enterprise + - hobby + - pro + connectBuildsEnabled: + type: boolean + enum: + - false + - true + connectConfigurationId: + type: string + createdIn: + type: string + crons: + items: + properties: + schedule: + type: string + path: + type: string + required: + - path + - schedule + type: object + type: array + atproto: + oneOf: + - properties: + enabled: + type: boolean + enum: + - false + required: + - enabled + type: object + - properties: + enabled: + type: boolean + enum: + - true + subscription: + properties: + collections: + items: + type: string + type: array + dids: + items: + type: string + type: array + kinds: + items: + type: string + enum: + - account + - commit + - identity + - sync + type: array + path: + type: string + required: + - collections + - path + type: object + required: + - enabled + - subscription + type: object + functions: + nullable: true + additionalProperties: + properties: + architecture: + type: string + enum: + - arm64 + - x86_64 + memory: + type: number + maxDuration: + oneOf: + - type: number + - type: string + enum: + - max + affinity: + properties: + mode: + type: string + enum: + - strict + required: + - mode + type: object + maxConcurrency: + type: number + regions: + items: + type: string + type: array + functionFailoverRegions: + items: + type: string + type: array + runtime: + type: string + includeFiles: + type: string + excludeFiles: + type: string + experimentalTriggers: + items: + oneOf: + - properties: + type: + type: string + enum: + - queue/v1beta + description: Event type - must be "queue/v1beta" (REQUIRED) + consumer: + type: string + description: Name of the consumer group for this trigger (REQUIRED) + topic: + type: string + description: Name of the queue topic to consume from (REQUIRED) + maxDeliveries: + type: number + description: Maximum number of delivery attempts for message processing (OPTIONAL) This represents the total number of times a message can be delivered, not the number of retries. Must be at least 1 if specified. Behavior when not specified depends on the server's default configuration. + retryAfterSeconds: + type: number + description: Delay in seconds before retrying failed executions (OPTIONAL) Behavior when not specified depends on the server's default configuration. + initialDelaySeconds: + type: number + description: Initial delay in seconds before first execution attempt (OPTIONAL) Must be 0 or greater. Use 0 for no initial delay. Behavior when not specified depends on the server's default configuration. + maxConcurrency: + type: number + description: Maximum number of concurrent executions for this consumer (OPTIONAL) Must be at least 1 if specified. Behavior when not specified depends on the server's default configuration. + required: + - consumer + - topic + - type + type: object + description: Queue trigger input event for v1beta (from vercel.json config). Requires explicit consumer name. + - properties: + type: + type: string + enum: + - queue/v2beta + description: Event type - must be "queue/v2beta" (REQUIRED) + topic: + type: string + description: Name of the queue topic to consume from (REQUIRED) + maxDeliveries: + type: number + description: Maximum number of delivery attempts for message processing (OPTIONAL) This represents the total number of times a message can be delivered, not the number of retries. Must be at least 1 if specified. Behavior when not specified depends on the server's default configuration. + retryAfterSeconds: + type: number + description: Delay in seconds before retrying failed executions (OPTIONAL) Behavior when not specified depends on the server's default configuration. + initialDelaySeconds: + type: number + description: Initial delay in seconds before first execution attempt (OPTIONAL) Must be 0 or greater. Use 0 for no initial delay. Behavior when not specified depends on the server's default configuration. + maxConcurrency: + type: number + description: Maximum number of concurrent executions for this consumer (OPTIONAL) Must be at least 1 if specified. Behavior when not specified depends on the server's default configuration. + required: + - topic + - type + type: object + description: Queue trigger input event for v2beta (from vercel.json config). Consumer name is implicitly derived from the function path. Only one trigger per function is allowed. + - properties: + type: + type: string + enum: + - schedule/v1beta + description: Event type - must be "schedule/v1beta" (REQUIRED) + required: + - type + type: object + type: array + supportsCancellation: + type: boolean + enum: + - false + - true + type: object + type: object + isInstantStatic: + type: boolean + enum: + - false + - true + description: Whether this deployment completed through the instant static fast path. + monorepoManager: + nullable: true + type: string + ownerId: + type: string + passiveConnectConfigurationId: + type: string + description: Since November 2023 this field defines a Secure Compute network that will only be used to deploy passive lambdas to (as in passiveRegions) + routes: + nullable: true + items: + oneOf: + - properties: + src: + type: string + dest: + type: string + headers: + additionalProperties: + type: string + type: object + methods: + items: + type: string + type: array + continue: + type: boolean + enum: + - false + - true + override: + type: boolean + enum: + - false + - true + caseSensitive: + type: boolean + enum: + - false + - true + check: + type: boolean + enum: + - false + - true + important: + type: boolean + enum: + - false + - true + status: + type: number + has: + items: + oneOf: + - properties: + type: + type: string + enum: + - host + value: + oneOf: + - type: string + - properties: + eq: + oneOf: + - type: string + - type: number + neq: + type: string + inc: + items: + type: string + type: array + ninc: + items: + type: string + type: array + pre: + type: string + suf: + type: string + re: + type: string + gt: + type: number + gte: + type: number + lt: + type: number + lte: + type: number + type: object + required: + - type + - value + type: object + - properties: + type: + type: string + enum: + - cookie + - header + - query + key: + type: string + value: + oneOf: + - type: string + - properties: + eq: + oneOf: + - type: string + - type: number + neq: + type: string + inc: + items: + type: string + type: array + ninc: + items: + type: string + type: array + pre: + type: string + suf: + type: string + re: + type: string + gt: + type: number + gte: + type: number + lt: + type: number + lte: + type: number + type: object + required: + - key + - type + type: object + type: array + missing: + items: + oneOf: + - properties: + type: + type: string + enum: + - host + value: + oneOf: + - type: string + - properties: + eq: + oneOf: + - type: string + - type: number + neq: + type: string + inc: + items: + type: string + type: array + ninc: + items: + type: string + type: array + pre: + type: string + suf: + type: string + re: + type: string + gt: + type: number + gte: + type: number + lt: + type: number + lte: + type: number + type: object + required: + - type + - value + type: object + - properties: + type: + type: string + enum: + - cookie + - header + - query + key: + type: string + value: + oneOf: + - type: string + - properties: + eq: + oneOf: + - type: string + - type: number + neq: + type: string + inc: + items: + type: string + type: array + ninc: + items: + type: string + type: array + pre: + type: string + suf: + type: string + re: + type: string + gt: + type: number + gte: + type: number + lt: + type: number + lte: + type: number + type: object + required: + - key + - type + type: object + type: array + mitigate: + properties: + action: + type: string + enum: + - challenge + - deny + required: + - action + type: object + transforms: + items: + oneOf: + - properties: + type: + type: string + enum: + - request.headers + - request.query + - response.headers + op: + type: string + enum: + - append + - delete + - set + target: + properties: + key: + oneOf: + - type: string + - properties: + eq: + oneOf: + - type: string + - type: number + neq: + type: string + inc: + items: + type: string + type: array + ninc: + items: + type: string + type: array + pre: + type: string + suf: + type: string + gt: + type: number + gte: + type: number + lt: + type: number + lte: + type: number + type: object + required: + - key + type: object + args: + oneOf: + - type: string + - items: + type: string + type: array + env: + items: + type: string + type: array + required: + - op + - target + - type + type: object + - properties: + type: + type: string + enum: + - request.path + op: + type: string + enum: + - set + args: + type: string + env: + items: + type: string + type: array + required: + - args + - op + - type + type: object + type: array + env: + items: + type: string + type: array + locale: + properties: + redirect: + additionalProperties: + type: string + type: object + cookie: + type: string + type: object + source: + type: string + description: Aliases for `src`, `dest`, and `status`. These provide consistency with the `rewrites`, `redirects`, and `headers` fields which use `source`, `destination`, and `statusCode`. During normalization, the string forms are converted to their canonical forms (`src`, `dest`, `status`) and stripped from the route object. `destination` may also be a service-targeted object, in which case routing is delegated into the named service's internal route table and the object is preserved as-is (not folded into `dest`). + destination: + oneOf: + - type: string + - properties: + type: + type: string + enum: + - service + description: Optional explicit format marker. The destination is identified by the presence of `service`, so `type` is no longer required. + service: + type: string + path: + type: string + description: Routing-only path used to select a route inside the target service. + required: + - service + type: object + statusCode: + type: number + middlewarePath: + type: string + description: A middleware key within the `output` key under the build result. Overrides a `middleware` definition. + middlewareRawSrc: + items: + type: string + type: array + description: The original middleware matchers. + middleware: + type: number + description: A middleware index in the `middleware` key under the build result + respectOriginCacheControl: + type: boolean + enum: + - false + - true + required: + - src + type: object + - properties: + handle: + type: string + enum: + - error + - filesystem + - hit + - miss + - resource + - rewrite + src: + type: string + dest: + type: string + status: + type: number + required: + - handle + type: object + - properties: + src: + type: string + continue: + type: boolean + enum: + - false + - true + middleware: + type: number + enum: + - 0 + required: + - continue + - middleware + - src + type: object + type: array + services: + items: + oneOf: + - properties: + schema: + type: string + enum: + - experimentalServices + name: + type: string + type: + type: string + enum: + - cron + - job + - web + - worker + trigger: + type: string + enum: + - queue + - schedule + - workflow + group: + type: string + workspace: + type: string + entrypoint: + type: string + framework: + type: string + builder: + properties: + use: + type: string + src: + type: string + config: + properties: + bunVersion: + type: string + maxLambdaSize: + type: string + includeFiles: + oneOf: + - type: string + - items: + type: string + type: array + excludeFiles: + oneOf: + - type: string + - items: + type: string + type: array + bundle: + type: boolean + enum: + - false + - true + ldsflags: + type: string + helpers: + type: boolean + enum: + - false + - true + rust: + type: string + debug: + type: boolean + enum: + - false + - true + zeroConfig: + type: boolean + enum: + - false + - true + import: + additionalProperties: + type: string + type: object + functions: + additionalProperties: + properties: + architecture: + type: string + enum: + - arm64 + - x86_64 + memory: + type: number + maxDuration: + oneOf: + - type: number + - type: string + enum: + - max + affinity: + properties: + mode: + type: string + enum: + - strict + required: + - mode + type: object + maxConcurrency: + type: number + regions: + items: + type: string + type: array + functionFailoverRegions: + items: + type: string + type: array + runtime: + type: string + includeFiles: + type: string + excludeFiles: + type: string + experimentalTriggers: + items: + oneOf: + - properties: + type: + type: string + enum: + - queue/v1beta + description: Event type - must be "queue/v1beta" (REQUIRED) + consumer: + type: string + description: Name of the consumer group for this trigger (REQUIRED) + topic: + type: string + description: Name of the queue topic to consume from (REQUIRED) + maxDeliveries: + type: number + description: Maximum number of delivery attempts for message processing (OPTIONAL) This represents the total number of times a message can be delivered, not the number of retries. Must be at least 1 if specified. Behavior when not specified depends on the server's default configuration. + retryAfterSeconds: + type: number + description: Delay in seconds before retrying failed executions (OPTIONAL) Behavior when not specified depends on the server's default configuration. + initialDelaySeconds: + type: number + description: Initial delay in seconds before first execution attempt (OPTIONAL) Must be 0 or greater. Use 0 for no initial delay. Behavior when not specified depends on the server's default configuration. + maxConcurrency: + type: number + description: Maximum number of concurrent executions for this consumer (OPTIONAL) Must be at least 1 if specified. Behavior when not specified depends on the server's default configuration. + required: + - consumer + - topic + - type + type: object + description: Queue trigger input event for v1beta (from vercel.json config). Requires explicit consumer name. + - properties: + type: + type: string + enum: + - queue/v2beta + description: Event type - must be "queue/v2beta" (REQUIRED) + topic: + type: string + description: Name of the queue topic to consume from (REQUIRED) + maxDeliveries: + type: number + description: Maximum number of delivery attempts for message processing (OPTIONAL) This represents the total number of times a message can be delivered, not the number of retries. Must be at least 1 if specified. Behavior when not specified depends on the server's default configuration. + retryAfterSeconds: + type: number + description: Delay in seconds before retrying failed executions (OPTIONAL) Behavior when not specified depends on the server's default configuration. + initialDelaySeconds: + type: number + description: Initial delay in seconds before first execution attempt (OPTIONAL) Must be 0 or greater. Use 0 for no initial delay. Behavior when not specified depends on the server's default configuration. + maxConcurrency: + type: number + description: Maximum number of concurrent executions for this consumer (OPTIONAL) Must be at least 1 if specified. Behavior when not specified depends on the server's default configuration. + required: + - topic + - type + type: object + description: Queue trigger input event for v2beta (from vercel.json config). Consumer name is implicitly derived from the function path. Only one trigger per function is allowed. + - properties: + type: + type: string + enum: + - schedule/v1beta + description: Event type - must be "schedule/v1beta" (REQUIRED) + required: + - type + type: object + type: array + supportsCancellation: + type: boolean + enum: + - false + - true + type: object + type: object + projectSettings: + properties: + framework: + nullable: true + type: string + devCommand: + nullable: true + type: string + installCommand: + nullable: true + type: string + buildCommand: + nullable: true + type: string + outputDirectory: + nullable: true + type: string + rootDirectory: + nullable: true + type: string + nodeVersion: + type: string + monorepoManager: + nullable: true + type: string + createdAt: + type: number + autoExposeSystemEnvs: + type: boolean + enum: + - false + - true + sourceFilesOutsideRootDirectory: + type: boolean + enum: + - false + - true + directoryListing: + type: boolean + enum: + - false + - true + gitForkProtection: + type: boolean + enum: + - false + - true + commandForIgnoringBuildStep: + nullable: true + type: string + type: object + outputDirectory: + type: string + installCommand: + type: string + buildCommand: + type: string + devCommand: + type: string + framework: + nullable: true + type: string + nodeVersion: + type: string + middleware: + type: boolean + enum: + - false + - true + middlewareRuntime: + type: string + enum: + - nodejs + description: Enforced runtime for explicitly configured Routing Middleware. + middlewareMatcher: + oneOf: + - type: string + - items: + type: string + type: array + description: Matcher supplied outside of the middleware source module. + serviceName: + type: string + description: Owning service name; scopes per-function config such as the v2beta consumer. + type: object + required: + - use + type: object + runtime: + type: string + buildCommand: + type: string + installCommand: + type: string + preDeployCommand: + type: string + routePrefix: + type: string + routePrefixSource: + type: string + enum: + - configured + - generated + subdomain: + type: string + schedule: + oneOf: + - type: string + - items: + type: string + type: array + handlerFunction: + type: string + topics: + oneOf: + - items: + type: string + type: array + - items: + properties: + topic: + type: string + retryAfterSeconds: + type: number + initialDelaySeconds: + type: number + required: + - topic + type: object + type: array + env: + additionalProperties: + properties: + type: + type: string + enum: + - service-ref + service: + type: string + required: + - service + - type + type: object + type: object + required: + - builder + - name + - schema + - type + - workspace + type: object + description: Services detected during build from vercel.json experimentalServices or auto-detected from project structure. Used to inject service URLs as environment variables at runtime. + - properties: + schema: + type: string + enum: + - experimentalServicesV2 + name: + type: string + root: + type: string + description: Path to the service root, relative to the project root. + framework: + type: string + runtime: + type: string + entrypoint: + type: string + description: Resolved entrypoint, relative to the service root. + command: + items: + type: string + type: array + description: 'Command override for `runtime: "container"` services.' + builder: + properties: + use: + type: string + src: + type: string + config: + properties: + bunVersion: + type: string + maxLambdaSize: + type: string + includeFiles: + oneOf: + - type: string + - items: + type: string + type: array + excludeFiles: + oneOf: + - type: string + - items: + type: string + type: array + bundle: + type: boolean + enum: + - false + - true + ldsflags: + type: string + helpers: + type: boolean + enum: + - false + - true + rust: + type: string + debug: + type: boolean + enum: + - false + - true + zeroConfig: + type: boolean + enum: + - false + - true + import: + additionalProperties: + type: string + type: object + functions: + additionalProperties: + properties: + architecture: + type: string + enum: + - arm64 + - x86_64 + memory: + type: number + maxDuration: + oneOf: + - type: number + - type: string + enum: + - max + affinity: + properties: + mode: + type: string + enum: + - strict + required: + - mode + type: object + maxConcurrency: + type: number + regions: + items: + type: string + type: array + functionFailoverRegions: + items: + type: string + type: array + runtime: + type: string + includeFiles: + type: string + excludeFiles: + type: string + experimentalTriggers: + items: + oneOf: + - properties: + type: + type: string + enum: + - queue/v1beta + description: Event type - must be "queue/v1beta" (REQUIRED) + consumer: + type: string + description: Name of the consumer group for this trigger (REQUIRED) + topic: + type: string + description: Name of the queue topic to consume from (REQUIRED) + maxDeliveries: + type: number + description: Maximum number of delivery attempts for message processing (OPTIONAL) This represents the total number of times a message can be delivered, not the number of retries. Must be at least 1 if specified. Behavior when not specified depends on the server's default configuration. + retryAfterSeconds: + type: number + description: Delay in seconds before retrying failed executions (OPTIONAL) Behavior when not specified depends on the server's default configuration. + initialDelaySeconds: + type: number + description: Initial delay in seconds before first execution attempt (OPTIONAL) Must be 0 or greater. Use 0 for no initial delay. Behavior when not specified depends on the server's default configuration. + maxConcurrency: + type: number + description: Maximum number of concurrent executions for this consumer (OPTIONAL) Must be at least 1 if specified. Behavior when not specified depends on the server's default configuration. + required: + - consumer + - topic + - type + type: object + description: Queue trigger input event for v1beta (from vercel.json config). Requires explicit consumer name. + - properties: + type: + type: string + enum: + - queue/v2beta + description: Event type - must be "queue/v2beta" (REQUIRED) + topic: + type: string + description: Name of the queue topic to consume from (REQUIRED) + maxDeliveries: + type: number + description: Maximum number of delivery attempts for message processing (OPTIONAL) This represents the total number of times a message can be delivered, not the number of retries. Must be at least 1 if specified. Behavior when not specified depends on the server's default configuration. + retryAfterSeconds: + type: number + description: Delay in seconds before retrying failed executions (OPTIONAL) Behavior when not specified depends on the server's default configuration. + initialDelaySeconds: + type: number + description: Initial delay in seconds before first execution attempt (OPTIONAL) Must be 0 or greater. Use 0 for no initial delay. Behavior when not specified depends on the server's default configuration. + maxConcurrency: + type: number + description: Maximum number of concurrent executions for this consumer (OPTIONAL) Must be at least 1 if specified. Behavior when not specified depends on the server's default configuration. + required: + - topic + - type + type: object + description: Queue trigger input event for v2beta (from vercel.json config). Consumer name is implicitly derived from the function path. Only one trigger per function is allowed. + - properties: + type: + type: string + enum: + - schedule/v1beta + description: Event type - must be "schedule/v1beta" (REQUIRED) + required: + - type + type: object + type: array + supportsCancellation: + type: boolean + enum: + - false + - true + type: object + type: object + projectSettings: + properties: + framework: + nullable: true + type: string + devCommand: + nullable: true + type: string + installCommand: + nullable: true + type: string + buildCommand: + nullable: true + type: string + outputDirectory: + nullable: true + type: string + rootDirectory: + nullable: true + type: string + nodeVersion: + type: string + monorepoManager: + nullable: true + type: string + createdAt: + type: number + autoExposeSystemEnvs: + type: boolean + enum: + - false + - true + sourceFilesOutsideRootDirectory: + type: boolean + enum: + - false + - true + directoryListing: + type: boolean + enum: + - false + - true + gitForkProtection: + type: boolean + enum: + - false + - true + commandForIgnoringBuildStep: + nullable: true + type: string + type: object + outputDirectory: + type: string + installCommand: + type: string + buildCommand: + type: string + devCommand: + type: string + framework: + nullable: true + type: string + nodeVersion: + type: string + middleware: + type: boolean + enum: + - false + - true + middlewareRuntime: + type: string + enum: + - nodejs + description: Enforced runtime for explicitly configured Routing Middleware. + middlewareMatcher: + oneOf: + - type: string + - items: + type: string + type: array + description: Matcher supplied outside of the middleware source module. + serviceName: + type: string + description: Owning service name; scopes per-function config such as the v2beta consumer. + type: object + required: + - use + type: object + description: Builder selected by the resolver. + installCommand: + type: string + buildCommand: + type: string + devCommand: + type: string + ignoreCommand: + type: string + outputDirectory: + type: string + bindings: + items: + properties: + type: + type: string + enum: + - service + description: If present, must be `"service"` for Service-to-Service HTTP bindings. + service: + type: string + description: Target service name from `services`. + format: + type: string + enum: + - url + description: Generated value shape, must be `"url"`. + env: + type: string + description: Environment variable name that will store the generated value + required: + - env + - format + - service + type: object + description: Caller-side bindings to other services. + type: array + description: Caller-side bindings to other services. + functions: + additionalProperties: + properties: + architecture: + type: string + enum: + - arm64 + - x86_64 + memory: + type: number + maxDuration: + oneOf: + - type: number + - type: string + enum: + - max + affinity: + properties: + mode: + type: string + enum: + - strict + required: + - mode + type: object + maxConcurrency: + type: number + regions: + items: + type: string + type: array + functionFailoverRegions: + items: + type: string + type: array + runtime: + type: string + includeFiles: + type: string + excludeFiles: + type: string + experimentalTriggers: + items: + oneOf: + - properties: + type: + type: string + enum: + - queue/v1beta + description: Event type - must be "queue/v1beta" (REQUIRED) + consumer: + type: string + description: Name of the consumer group for this trigger (REQUIRED) + topic: + type: string + description: Name of the queue topic to consume from (REQUIRED) + maxDeliveries: + type: number + description: Maximum number of delivery attempts for message processing (OPTIONAL) This represents the total number of times a message can be delivered, not the number of retries. Must be at least 1 if specified. Behavior when not specified depends on the server's default configuration. + retryAfterSeconds: + type: number + description: Delay in seconds before retrying failed executions (OPTIONAL) Behavior when not specified depends on the server's default configuration. + initialDelaySeconds: + type: number + description: Initial delay in seconds before first execution attempt (OPTIONAL) Must be 0 or greater. Use 0 for no initial delay. Behavior when not specified depends on the server's default configuration. + maxConcurrency: + type: number + description: Maximum number of concurrent executions for this consumer (OPTIONAL) Must be at least 1 if specified. Behavior when not specified depends on the server's default configuration. + required: + - consumer + - topic + - type + type: object + description: Queue trigger input event for v1beta (from vercel.json config). Requires explicit consumer name. + - properties: + type: + type: string + enum: + - queue/v2beta + description: Event type - must be "queue/v2beta" (REQUIRED) + topic: + type: string + description: Name of the queue topic to consume from (REQUIRED) + maxDeliveries: + type: number + description: Maximum number of delivery attempts for message processing (OPTIONAL) This represents the total number of times a message can be delivered, not the number of retries. Must be at least 1 if specified. Behavior when not specified depends on the server's default configuration. + retryAfterSeconds: + type: number + description: Delay in seconds before retrying failed executions (OPTIONAL) Behavior when not specified depends on the server's default configuration. + initialDelaySeconds: + type: number + description: Initial delay in seconds before first execution attempt (OPTIONAL) Must be 0 or greater. Use 0 for no initial delay. Behavior when not specified depends on the server's default configuration. + maxConcurrency: + type: number + description: Maximum number of concurrent executions for this consumer (OPTIONAL) Must be at least 1 if specified. Behavior when not specified depends on the server's default configuration. + required: + - topic + - type + type: object + description: Queue trigger input event for v2beta (from vercel.json config). Consumer name is implicitly derived from the function path. Only one trigger per function is allowed. + - properties: + type: + type: string + enum: + - schedule/v1beta + description: Event type - must be "schedule/v1beta" (REQUIRED) + required: + - type + type: object + type: array + supportsCancellation: + type: boolean + enum: + - false + - true + type: object + description: Function configuration scoped to this service. + type: object + description: Function configuration scoped to this service. + headers: + items: + properties: + source: + type: string + headers: + items: + properties: + key: + type: string + value: + type: string + required: + - key + - value + type: object + type: array + has: + items: + oneOf: + - properties: + type: + type: string + enum: + - host + value: + oneOf: + - type: string + - properties: + eq: + oneOf: + - type: string + - type: number + neq: + type: string + inc: + items: + type: string + type: array + ninc: + items: + type: string + type: array + pre: + type: string + suf: + type: string + re: + type: string + gt: + type: number + gte: + type: number + lt: + type: number + lte: + type: number + type: object + required: + - type + - value + type: object + - properties: + type: + type: string + enum: + - cookie + - header + - query + key: + type: string + value: + oneOf: + - type: string + - properties: + eq: + oneOf: + - type: string + - type: number + neq: + type: string + inc: + items: + type: string + type: array + ninc: + items: + type: string + type: array + pre: + type: string + suf: + type: string + re: + type: string + gt: + type: number + gte: + type: number + lt: + type: number + lte: + type: number + type: object + required: + - key + - type + type: object + type: array + missing: + items: + oneOf: + - properties: + type: + type: string + enum: + - host + value: + oneOf: + - type: string + - properties: + eq: + oneOf: + - type: string + - type: number + neq: + type: string + inc: + items: + type: string + type: array + ninc: + items: + type: string + type: array + pre: + type: string + suf: + type: string + re: + type: string + gt: + type: number + gte: + type: number + lt: + type: number + lte: + type: number + type: object + required: + - type + - value + type: object + - properties: + type: + type: string + enum: + - cookie + - header + - query + key: + type: string + value: + oneOf: + - type: string + - properties: + eq: + oneOf: + - type: string + - type: number + neq: + type: string + inc: + items: + type: string + type: array + ninc: + items: + type: string + type: array + pre: + type: string + suf: + type: string + re: + type: string + gt: + type: number + gte: + type: number + lt: + type: number + lte: + type: number + type: object + required: + - key + - type + type: object + type: array + required: + - headers + - source + type: object + type: array + redirects: + items: + properties: + source: + type: string + destination: + type: string + permanent: + type: boolean + enum: + - false + - true + statusCode: + type: number + has: + items: + oneOf: + - properties: + type: + type: string + enum: + - host + value: + oneOf: + - type: string + - properties: + eq: + oneOf: + - type: string + - type: number + neq: + type: string + inc: + items: + type: string + type: array + ninc: + items: + type: string + type: array + pre: + type: string + suf: + type: string + re: + type: string + gt: + type: number + gte: + type: number + lt: + type: number + lte: + type: number + type: object + required: + - type + - value + type: object + - properties: + type: + type: string + enum: + - cookie + - header + - query + key: + type: string + value: + oneOf: + - type: string + - properties: + eq: + oneOf: + - type: string + - type: number + neq: + type: string + inc: + items: + type: string + type: array + ninc: + items: + type: string + type: array + pre: + type: string + suf: + type: string + re: + type: string + gt: + type: number + gte: + type: number + lt: + type: number + lte: + type: number + type: object + required: + - key + - type + type: object + type: array + missing: + items: + oneOf: + - properties: + type: + type: string + enum: + - host + value: + oneOf: + - type: string + - properties: + eq: + oneOf: + - type: string + - type: number + neq: + type: string + inc: + items: + type: string + type: array + ninc: + items: + type: string + type: array + pre: + type: string + suf: + type: string + re: + type: string + gt: + type: number + gte: + type: number + lt: + type: number + lte: + type: number + type: object + required: + - type + - value + type: object + - properties: + type: + type: string + enum: + - cookie + - header + - query + key: + type: string + value: + oneOf: + - type: string + - properties: + eq: + oneOf: + - type: string + - type: number + neq: + type: string + inc: + items: + type: string + type: array + ninc: + items: + type: string + type: array + pre: + type: string + suf: + type: string + re: + type: string + gt: + type: number + gte: + type: number + lt: + type: number + lte: + type: number + type: object + required: + - key + - type + type: object + type: array + env: + items: + type: string + type: array + required: + - destination + - source + type: object + type: array + rewrites: + items: + properties: + source: + type: string + destination: + oneOf: + - type: string + - properties: + type: + type: string + enum: + - service + description: Optional explicit format marker. The destination is identified by the presence of `service`, so `type` is no longer required. + service: + type: string + path: + type: string + description: Routing-only path used to select a route inside the target service. + required: + - service + type: object + transforms: + items: + properties: + type: + type: string + enum: + - request.path + op: + type: string + enum: + - set + args: + type: string + env: + items: + type: string + type: array + required: + - args + - op + - type + type: object + type: array + has: + items: + oneOf: + - properties: + type: + type: string + enum: + - host + value: + oneOf: + - type: string + - properties: + eq: + oneOf: + - type: string + - type: number + neq: + type: string + inc: + items: + type: string + type: array + ninc: + items: + type: string + type: array + pre: + type: string + suf: + type: string + re: + type: string + gt: + type: number + gte: + type: number + lt: + type: number + lte: + type: number + type: object + required: + - type + - value + type: object + - properties: + type: + type: string + enum: + - cookie + - header + - query + key: + type: string + value: + oneOf: + - type: string + - properties: + eq: + oneOf: + - type: string + - type: number + neq: + type: string + inc: + items: + type: string + type: array + ninc: + items: + type: string + type: array + pre: + type: string + suf: + type: string + re: + type: string + gt: + type: number + gte: + type: number + lt: + type: number + lte: + type: number + type: object + required: + - key + - type + type: object + type: array + missing: + items: + oneOf: + - properties: + type: + type: string + enum: + - host + value: + oneOf: + - type: string + - properties: + eq: + oneOf: + - type: string + - type: number + neq: + type: string + inc: + items: + type: string + type: array + ninc: + items: + type: string + type: array + pre: + type: string + suf: + type: string + re: + type: string + gt: + type: number + gte: + type: number + lt: + type: number + lte: + type: number + type: object + required: + - type + - value + type: object + - properties: + type: + type: string + enum: + - cookie + - header + - query + key: + type: string + value: + oneOf: + - type: string + - properties: + eq: + oneOf: + - type: string + - type: number + neq: + type: string + inc: + items: + type: string + type: array + ninc: + items: + type: string + type: array + pre: + type: string + suf: + type: string + re: + type: string + gt: + type: number + gte: + type: number + lt: + type: number + lte: + type: number + type: object + required: + - key + - type + type: object + type: array + statusCode: + type: number + env: + items: + type: string + type: array + respectOriginCacheControl: + type: boolean + enum: + - false + - true + required: + - destination + - source + type: object + type: array + routes: + items: + oneOf: + - properties: + src: + type: string + dest: + type: string + headers: + additionalProperties: + type: string + type: object + methods: + items: + type: string + type: array + continue: + type: boolean + enum: + - false + - true + override: + type: boolean + enum: + - false + - true + caseSensitive: + type: boolean + enum: + - false + - true + check: + type: boolean + enum: + - false + - true + important: + type: boolean + enum: + - false + - true + status: + type: number + has: + items: + oneOf: + - properties: + type: + type: string + enum: + - host + value: + oneOf: + - type: string + - properties: + eq: + oneOf: + - type: string + - type: number + neq: + type: string + inc: + items: + type: string + type: array + ninc: + items: + type: string + type: array + pre: + type: string + suf: + type: string + re: + type: string + gt: + type: number + gte: + type: number + lt: + type: number + lte: + type: number + type: object + required: + - type + - value + type: object + - properties: + type: + type: string + enum: + - cookie + - header + - query + key: + type: string + value: + oneOf: + - type: string + - properties: + eq: + oneOf: + - type: string + - type: number + neq: + type: string + inc: + items: + type: string + type: array + ninc: + items: + type: string + type: array + pre: + type: string + suf: + type: string + re: + type: string + gt: + type: number + gte: + type: number + lt: + type: number + lte: + type: number + type: object + required: + - key + - type + type: object + type: array + missing: + items: + oneOf: + - properties: + type: + type: string + enum: + - host + value: + oneOf: + - type: string + - properties: + eq: + oneOf: + - type: string + - type: number + neq: + type: string + inc: + items: + type: string + type: array + ninc: + items: + type: string + type: array + pre: + type: string + suf: + type: string + re: + type: string + gt: + type: number + gte: + type: number + lt: + type: number + lte: + type: number + type: object + required: + - type + - value + type: object + - properties: + type: + type: string + enum: + - cookie + - header + - query + key: + type: string + value: + oneOf: + - type: string + - properties: + eq: + oneOf: + - type: string + - type: number + neq: + type: string + inc: + items: + type: string + type: array + ninc: + items: + type: string + type: array + pre: + type: string + suf: + type: string + re: + type: string + gt: + type: number + gte: + type: number + lt: + type: number + lte: + type: number + type: object + required: + - key + - type + type: object + type: array + mitigate: + properties: + action: + type: string + enum: + - challenge + - deny + required: + - action + type: object + transforms: + items: + oneOf: + - properties: + type: + type: string + enum: + - request.headers + - request.query + - response.headers + op: + type: string + enum: + - append + - delete + - set + target: + properties: + key: + oneOf: + - type: string + - properties: + eq: + oneOf: + - type: string + - type: number + neq: + type: string + inc: + items: + type: string + type: array + ninc: + items: + type: string + type: array + pre: + type: string + suf: + type: string + gt: + type: number + gte: + type: number + lt: + type: number + lte: + type: number + type: object + required: + - key + type: object + args: + oneOf: + - type: string + - items: + type: string + type: array + env: + items: + type: string + type: array + required: + - op + - target + - type + type: object + - properties: + type: + type: string + enum: + - request.path + op: + type: string + enum: + - set + args: + type: string + env: + items: + type: string + type: array + required: + - args + - op + - type + type: object + type: array + env: + items: + type: string + type: array + locale: + properties: + redirect: + additionalProperties: + type: string + type: object + cookie: + type: string + type: object + source: + type: string + description: Aliases for `src`, `dest`, and `status`. These provide consistency with the `rewrites`, `redirects`, and `headers` fields which use `source`, `destination`, and `statusCode`. During normalization, the string forms are converted to their canonical forms (`src`, `dest`, `status`) and stripped from the route object. `destination` may also be a service-targeted object, in which case routing is delegated into the named service's internal route table and the object is preserved as-is (not folded into `dest`). + destination: + oneOf: + - type: string + - properties: + type: + type: string + enum: + - service + description: Optional explicit format marker. The destination is identified by the presence of `service`, so `type` is no longer required. + service: + type: string + path: + type: string + description: Routing-only path used to select a route inside the target service. + required: + - service + type: object + statusCode: + type: number + middlewarePath: + type: string + description: A middleware key within the `output` key under the build result. Overrides a `middleware` definition. + middlewareRawSrc: + items: + type: string + type: array + description: The original middleware matchers. + middleware: + type: number + description: A middleware index in the `middleware` key under the build result + respectOriginCacheControl: + type: boolean + enum: + - false + - true + required: + - src + type: object + - properties: + handle: + type: string + enum: + - error + - filesystem + - hit + - miss + - resource + - rewrite + src: + type: string + dest: + type: string + status: + type: number + required: + - handle + type: object + type: array + cleanUrls: + type: boolean + enum: + - false + - true + trailingSlash: + type: boolean + enum: + - false + - true + required: + - builder + - name + - root + - schema + type: object + description: Services detected during build from vercel.json experimentalServices or auto-detected from project structure. Used to inject service URLs as environment variables at runtime. + type: array + description: Services detected during build from vercel.json experimentalServices or auto-detected from project structure. Used to inject service URLs as environment variables at runtime. + gitRepo: + nullable: true + oneOf: + - properties: + namespace: + type: string + projectId: + type: number + type: + type: string + enum: + - gitlab + url: + type: string + path: + type: string + defaultBranch: + type: string + name: + type: string + private: + type: boolean + enum: + - false + - true + ownerType: + type: string + enum: + - team + - user + required: + - defaultBranch + - name + - namespace + - ownerType + - path + - private + - projectId + - type + - url + type: object + - properties: + org: + type: string + repo: + type: string + repoId: + type: number + type: + type: string + enum: + - github + repoOwnerId: + type: number + path: + type: string + defaultBranch: + type: string + name: + type: string + private: + type: boolean + enum: + - false + - true + ownerType: + type: string + enum: + - team + - user + required: + - defaultBranch + - name + - org + - ownerType + - path + - private + - repo + - repoId + - repoOwnerId + - type + type: object + - properties: + owner: + type: string + repoUuid: + type: string + slug: + type: string + type: + type: string + enum: + - bitbucket + workspaceUuid: + type: string + path: + type: string + defaultBranch: + type: string + name: + type: string + private: + type: boolean + enum: + - false + - true + ownerType: + type: string + enum: + - team + - user + required: + - defaultBranch + - name + - owner + - ownerType + - path + - private + - repoUuid + - slug + - type + - workspaceUuid + type: object + - properties: + org: + type: string + repo: + type: string + type: + type: string + enum: + - vercel + path: + type: string + defaultBranch: + type: string + name: + type: string + private: + type: boolean + enum: + - false + - true + ownerType: + type: string + enum: + - team + - user + required: + - defaultBranch + - name + - org + - ownerType + - path + - private + - repo + - type + type: object + - properties: + owner: + type: string + description: Owner (namespace) slug. + repo: + type: string + repoId: + type: string + description: Origin repository id. + type: + type: string + enum: + - cursor-origin + path: + type: string + defaultBranch: + type: string + name: + type: string + private: + type: boolean + enum: + - false + - true + ownerType: + type: string + enum: + - team + - user + required: + - defaultBranch + - name + - owner + - ownerType + - path + - private + - repo + - repoId + - type + type: object + flags: + oneOf: + - properties: + definitions: + additionalProperties: + properties: + options: + items: + properties: + value: + $ref: '#/components/schemas/FlagJSONValue' + label: + type: string + required: + - value + type: object + type: array + url: + type: string + description: + type: string + type: object + type: object + required: + - definitions + type: object + description: Flags defined in the Build Output API, used by this deployment. Primarily used by the Toolbar to know about the used flags. + - items: + type: string + description: Flags defined in the Build Output API, used by this deployment. Primarily used by the Toolbar to know about the used flags. (opaque JSON object) + type: array + description: Flags defined in the Build Output API, used by this deployment. Primarily used by the Toolbar to know about the used flags. + microfrontends: + oneOf: + - properties: + isDefaultApp: + type: boolean + enum: + - false + defaultAppProjectName: + type: string + description: The project name of the default app of this deployment's microfrontends group. + defaultRoute: + type: string + description: A path that is used to take screenshots and as the default path in preview links when a domain for this microfrontend is shown in the UI. + groupIds: + type: array + items: + type: string + minItems: 1 + description: The group of microfrontends that this project belongs to. Each microfrontend project must belong to a microfrontends group that is the set of microfrontends that are used together. + required: + - defaultAppProjectName + - groupIds + type: object + - properties: + isDefaultApp: + type: boolean + enum: + - true + mfeConfigUploadState: + type: string + enum: + - no_config + - success + - waiting_on_build + description: The result of the microfrontends config upload during deployment creation / build. Only set for default app deployments. The config upload is attempted during deployment create, and then again during the build. If the config is not in the root directory, or the deployment is prebuilt, the config cannot be uploaded during deployment create. The upload during deployment build finds the config even if it's not in the root directory, as it has access to all files. Uploading the config during create is ideal, as then all child deployments are guaranteed to have access to the default app deployment config even if the default app has not yet started building. If the config is not uploaded, the child app will show as building until the config has been uploaded during the default app build. - `success` - The config was uploaded successfully, either when the deployment was created or during the build. - `waiting_on_build` - The config could not be uploaded during deployment create, will be attempted again during the build. - `no_config` - No config was found. Only set once the build has not found the config in any of the deployment's files. - `undefined` - Legacy deployments, or there was an error uploading the config during deployment create. + defaultAppProjectName: + type: string + description: The project name of the default app of this deployment's microfrontends group. + defaultRoute: + type: string + description: A path that is used to take screenshots and as the default path in preview links when a domain for this microfrontend is shown in the UI. + groupIds: + type: array + items: + type: string + minItems: 1 + description: The group of microfrontends that this project belongs to. Each microfrontend project must belong to a microfrontends group that is the set of microfrontends that are used together. + required: + - defaultAppProjectName + - groupIds + - isDefaultApp + type: object + platform: + properties: + source: + properties: + name: + type: string + description: Display name of the platform. + required: + - name + type: object + description: The external platform that created the deployment (e.g. its display name). + origin: + properties: + type: + type: string + enum: + - id + - url + description: Whether the value is an opaque identifier or a URL. + value: + type: string + description: The identifier or URL pointing to the originating entity. + required: + - type + - value + type: object + description: Reference back to the entity on the platform that initiated the deployment. + creator: + properties: + name: + type: string + description: Display name of the platform user. + avatar: + type: string + description: URL of the platform user's avatar image. + required: + - name + type: object + description: The user on the external platform who triggered the deployment. + meta: + additionalProperties: + type: string + type: object + description: Arbitrary key-value metadata provided by the platform. + required: + - creator + - origin + - source + type: object + description: Metadata about the source platform that triggered the deployment. Allows us to map a deployment back to a platform (e.g. the chat that created it) + config: + properties: + version: + type: number + functionType: + type: string + enum: + - fluid + - standard + functionMemoryType: + type: string + enum: + - performance + - performance_xl + - standard + - standard_legacy + functionTimeout: + nullable: true + type: number + secureComputePrimaryRegion: + nullable: true + type: string + secureComputeFallbackRegion: + nullable: true + type: string + isUsingActiveCPU: + type: boolean + enum: + - false + - true + resourceConfig: + properties: + buildQueue: + properties: + configuration: + type: string + enum: + - SKIP_NAMESPACE_QUEUE + - WAIT_FOR_NAMESPACE_QUEUE + description: Build resource configuration snapshot for this deployment. + type: object + description: Build resource configuration snapshot for this deployment. + elasticConcurrency: + type: string + enum: + - PROJECT_SETTING + - SKIP_QUEUE + - TEAM_SETTING + description: 'When elastic concurrency is used for this deployment, a value is set. The value tells the reason where the setting was coming from. - TEAM_SETTING: Inherited from team settings - PROJECT_SETTING: Inherited from project settings - SKIP_QUEUE: Manually triggered by user to skip the queues' + buildMachine: + properties: + purchaseType: + nullable: true + type: string + enum: + - basic + - enhanced + - standard + - turbo + - null + description: Machine type that was used for the build. + type: object + type: object + description: Build resource configuration snapshot for this deployment. + required: + - functionMemoryType + - functionTimeout + - functionType + - secureComputeFallbackRegion + - secureComputePrimaryRegion + type: object + description: Since February 2025 the configuration must include snapshot data at the time of deployment creation to capture properties for the /deployments/:id/config endpoint utilized for displaying Deployment Configuration on the frontend This is optional because older deployments may not have this data captured + checks: + properties: + deployment-alias: + properties: + state: + type: string + enum: + - failed + - pending + - succeeded + startedAt: + type: number + completedAt: + type: number + required: + - startedAt + - state + type: object + description: Condensed check data. Retrieve individual check and check run data using api-checks v2 routes. + required: + - deployment-alias + type: object + seatBlock: + properties: + blockCode: + type: string + enum: + - COMMIT_AUTHOR_REQUIRED + - TEAM_ACCESS_REQUIRED + description: 'The NSNB decision code for the seat block. TODO: We should consolidate block types.' + userId: + type: string + description: The blocked vercel user ID. + isVerified: + type: boolean + enum: + - false + - true + description: Determines if the user was verified during the block. In the git integration case, the commit sender was the author. + gitUserId: + oneOf: + - type: string + - type: number + gitProvider: + type: string + enum: + - bitbucket + - github + - gitlab + description: The git provider type associated with gitUserId. + required: + - blockCode + type: object + description: NSNB Blocked metadata + attribution: + properties: + commitMeta: + properties: + email: + type: string + description: Email from git commit author + name: + type: string + description: Name from git commit author + isVerified: + type: boolean + enum: + - false + - true + description: Whether the commit was signed/verified (GitHub only, others return undefined) + type: object + description: Commit metadata from the git commit author + gitUser: + properties: + id: + oneOf: + - type: string + - type: number + login: + type: string + description: Git provider username/login + type: + type: string + description: User type + provider: + type: string + description: The git provider (github, gitlab, bitbucket) + required: + - id + - login + type: object + description: Git provider user associated with the commit author email (only set if resolved) + vercelUser: + properties: + id: + type: string + description: Vercel user ID + username: + type: string + description: Vercel username + teamRoles: + items: + type: string + type: array + description: Team roles at time of deployment + required: + - id + - username + type: object + description: Vercel user linked to the git provider account (only set if resolved) + type: object + description: Attribution metadata for the deployment, linking commit author to git and Vercel users. Only populated when the `enable-deployment-attribution` flag is enabled. + required: + - aliasAssigned + - id + - readyState + - bootedAt + - build + - buildSkipped + - buildingAt + - createdAt + - createdIn + - creator + - env + - inspectorUrl + - isInConcurrentBuildsQueue + - isInSystemBuildsQueue + - meta + - name + - ownerId + - plan + - projectId + - projectSettings + - public + - regions + - routes + - status + - type + - url + - version + type: object + description: Returns the reduced deployment view for anonymous (`vcn_`) callers. Pool-team details are withheld. + '400': + description: |- + One of the provided values in the request body is invalid. + One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '402': + description: |- + The account is missing a payment so payment method must be updated + Pro customers are allowed to deploy Serverless Functions to up to `proMaxRegions` regions, or if the project was created before the limit was introduced. + Deploying to Serverless Functions to multiple regions requires a plan update + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '409': + description: The deployment project is being transferred + '410': + description: '' + '426': + description: '' + '429': + description: '' + '500': + description: '' + '503': + description: '' + x-vercel-cli: + supportedSubcommands: true + supportedProduction: false + parameters: + - name: forceNew + description: Forces a new deployment even if there is a previous similar deployment. Set to `1` to bypass deployment deduplication and always trigger a fresh build. + in: query + schema: + description: Forces a new deployment even if there is a previous similar deployment. Set to `1` to bypass deployment deduplication and always trigger a fresh build. + enum: + - '0' + - '1' + example: '1' + - name: skipAutoDetectionConfirmation + description: Set to `1` to skip framework auto-detection and proceed without confirmation. By default, if Vercel detects a framework that differs from the project setting, the API returns a `400` asking you to confirm. Use this to suppress that check in automated pipelines. + in: query + schema: + description: Set to `1` to skip framework auto-detection and proceed without confirmation. By default, if Vercel detects a framework that differs from the project setting, the API returns a `400` asking you to confirm. Use this to suppress that check in automated pipelines. + enum: + - '0' + - '1' + example: '1' + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + requestBody: + content: + application/json: + schema: + additionalProperties: false + properties: + customEnvironmentSlugOrId: + description: The slug or ID of a custom environment to deploy to, overriding the default target environment. When omitted, the deployment targets the environment inferred from the branch (production or preview). + type: string + example: staging + deploymentId: + description: The ID of an existing deployment to redeploy. All project settings and environment variables are inherited from the original unless explicitly overridden in this request. The redeployment gets a new ID, URL, and build. + type: string + example: dpl_2qn7PZrx89yxY34vEZPD31Y9XVj6 + files: + description: The files to include in the deployment. Each entry is either an inlined file (with `data` and `encoding`) or a reference to a previously uploaded file (with `sha` and `size`). Required for non-git deployments. Cannot be used together with `gitSource`. + items: + oneOf: + - additionalProperties: false + description: Used in the case you want to inline a file inside the request + properties: + data: + description: The file content, it could be either a `base64` (useful for images, etc.) of the files or the plain content for source code + type: string + encoding: + description: The file content encoding, it could be either a base64 (useful for images, etc.) of the files or the plain text for source code. + enum: + - base64 + - utf-8 + file: + description: The file name including the whole path + example: folder/file.js + type: string + required: + - file + - data + title: InlinedFile + type: object + - additionalProperties: false + description: Used in the case you want to reference a file that was already uploaded + properties: + file: + description: The file path relative to the project root + example: folder/file.js + type: string + sha: + description: The file contents hashed with SHA1, used to check the integrity + type: string + size: + description: The file size in bytes + type: integer + required: + - file + title: UploadedFile + type: object + type: array + gitAccessToken: + description: Available only to Vercel platform accounts. A read-only GitHub access token scoped to the requested repository. Use a token with a lifetime of 24 hours or less that remains valid until source retrieval completes. + maxLength: 1024 + type: string + writeOnly: true + gitMetadata: + description: Populates initial git metadata for different git providers. + additionalProperties: false + type: object + properties: + remoteUrl: + type: string + description: The git repository's remote origin url + example: https://github.com/vercel/next.js + commitAuthorName: + type: string + description: The name of the author of the commit + example: kyliau + commitAuthorEmail: + type: string + description: The email of the author of the commit + example: kyliau@example.com + commitMessage: + type: string + description: The commit message + example: add method to measure Interaction to Next Paint (INP) (#36490) + commitRef: + type: string description: The branch on which the commit was made example: main commitSha: @@ -4664,705 +9543,1402 @@ paths: type: boolean description: Whether or not there have been modifications to the working tree since the latest commit example: true + ci: + type: boolean + description: True if process.env.CI was set when deploying + example: true + ciType: + type: string + description: The type of CI system used + example: github-actions + ciGitProviderUsername: + type: string + description: The username used for the Git Provider (e.g. GitHub) if their CI (e.g. GitHub Actions) was used, if available + example: rauchg + ciGitRepoVisibility: + type: string + description: The visibility of the Git repository if their CI (e.g. GitHub Actions) was used, if available + example: private + rootDirectory: + type: string + description: Path of the deployed directory relative to the detected git repository root. Empty string when deploying from the repository root. + example: apps/web gitSource: description: Defines the Git Repository source to be deployed. This property can not be used in combination with `files`. - anyOf: - - properties: - ref: - type: string - repoId: - oneOf: - - type: number - - type: string - sha: - type: string - type: - enum: - - github - type: string - required: - - type - - ref - - repoId - type: object - - properties: - org: - type: string - ref: - type: string - repo: - type: string - sha: - type: string - type: - enum: - - github - type: string - required: - - type - - ref - - org - - repo - type: object - - properties: - projectId: - oneOf: - - type: number - - type: string - ref: + properties: + type: + enum: + - vercel + type: string + sha: + type: string + example: a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9t0 + ref: + type: string + example: main + repoId: + oneOf: + - type: number + - type: string + example: 123456789 + org: + type: string + example: vercel + repo: + type: string + example: next.js + projectId: + oneOf: + - type: number + - type: string + example: 987654321 + repoUuid: + type: string + example: 123e4567-e89b-12d3-a456-426614174000 + workspaceUuid: + type: string + example: 987e6543-e21b-12d3-a456-426614174000 + owner: + type: string + example: bitbucket_user + slug: + type: string + example: my-awesome-project + required: + - type + - sha + - ref + - repoId + - org + - repo + - projectId + - repoUuid + - owner + - slug + type: object + meta: + additionalProperties: + maxLength: 65536 + type: string + description: An object containing the deployment's metadata. Multiple key-value pairs can be attached to a deployment. For deployments created with a Cursor Origin `gitSource`, Vercel automatically adds `cursorOriginDeployment`, `cursorOriginCommitSha`, `cursorOriginCommitRef`, `cursorOriginCommitMessage`, `cursorOriginCommitAuthorName`, `cursorOriginCommitAuthorEmail` when available, `cursorOriginOwner`, `cursorOriginRepo`, `cursorOriginRepoId`, and `cursorOriginPrId` for pull request deployments. + example: + foo: bar + maxProperties: 100 + type: object + monorepoManager: + description: The monorepo manager that is being used for this deployment. When `null` is used no monorepo manager is selected + type: string + nullable: true + name: + description: A string with the project name used in the deployment URL + example: my-instant-deployment + type: string + project: + description: The target project identifier in which the deployment will be created. When defined, this parameter overrides name + example: my-deployment-project + type: string + projectSettings: + additionalProperties: false + description: Project settings that will be applied to the deployment. It is required for the first deployment of a project and will be saved for any following deployments + properties: + buildCommand: + description: The build command for this project. When `null` is used this value will be automatically detected + maxLength: 256 + type: string + nullable: true + example: next build + commandForIgnoringBuildStep: + maxLength: 256 + type: string + nullable: true + devCommand: + description: The dev command for this project. When `null` is used this value will be automatically detected + maxLength: 256 + type: string + nullable: true + framework: + description: The framework that is being used for this project. When `null` is used no framework is selected + type: string + enum: + - null + - services + - container + - blitzjs + - nextjs + - gatsby + - remix + - react-router + - astro + - hexo + - eleventy + - docusaurus-2 + - docusaurus + - preact + - solidstart-1 + - solidstart + - dojo + - ember + - vue + - scully + - ionic-angular + - angular + - polymer + - svelte + - sveltekit + - sveltekit-1 + - ionic-react + - create-react-app + - gridsome + - umijs + - sapper + - saber + - stencil + - nuxtjs + - redwoodjs + - hugo + - jekyll + - brunch + - middleman + - zola + - hydrogen + - vite + - tanstack-start + - tanstack-start-lovable + - vitepress + - vuepress + - parcel + - fastapi + - flask + - fasthtml + - django + - ash + - factory-eve + - eve + - sanity + - sanity-v2 + - storybook + - nitro + - hono + - express + - h3 + - koa + - nestjs + - elysia + - fastify + - xmcp + - python + - ruby + - rust + - axum + - actix-web + - bun + - node + - go + - mastra + nullable: true + installCommand: + description: The install command for this project. When `null` is used this value will be automatically detected + maxLength: 256 + type: string + nullable: true + example: pnpm install + nodeVersion: + description: Override the Node.js version that should be used for this deployment + enum: + - 24.x + - 22.x + - 20.x + - 18.x + - 16.x + - 14.x + - 12.x + - 10.x + - 8.10.x + type: string + outputDirectory: + description: The output directory of the project. When `null` is used this value will be automatically detected + maxLength: 256 + type: string + nullable: true + rootDirectory: + description: The name of a directory or relative path to the source code of your project. When `null` is used it will default to the project root + maxLength: 256 + type: string + nullable: true + serverlessFunctionRegion: + description: The region to deploy Serverless Functions in this project + maxLength: 4 + type: string + nullable: true + skipGitConnectDuringLink: + description: Opts-out of the message prompting a CLI user to connect a Git repository in `vercel link`. + type: boolean + deprecated: true + sourceFilesOutsideRootDirectory: + description: Indicates if there are source files outside of the root directory, typically used for monorepos + type: boolean + type: object + target: + description: Either not defined, `staging`, `production`, or a custom environment identifier. If `staging`, a staging alias in the format `-.vercel.app` will be assigned. If `production`, any aliases defined in `alias` will be assigned. If omitted, the target will be `preview`. + type: string + example: production + withLatestCommit: + description: When `true` and `deploymentId` is passed in, the sha from the previous deployment's `gitSource` is removed forcing the latest commit to be used. + type: boolean + required: + - name + type: object + required: true + /v12/deployments/{id}/cancel: + patch: + description: 'Cancels a deployment that is currently in progress, stopping the build before it completes. Use this to recover quickly from accidental deploys, wrong-branch pushes, or builds with known errors — without waiting for them to finish. Returns 400 if the deployment is no longer cancelable (already `READY`, `ERROR`, or `CANCELED`). Returns the updated deployment object with `readyState: ''CANCELED''` on success.' + operationId: cancelDeployment + security: + - bearerToken: [] + summary: Cancel a deployment + tags: + - deployments + responses: + '200': + description: Returns the updated deployment object with `readyState` set to `CANCELED`. The build has been stopped and this action is irreversible. + content: + application/json: + schema: + properties: + aliasAssignedAt: + nullable: true + type: number + enum: + - false + - true + alwaysRefuseToBuild: + type: boolean + enum: + - false + - true + build: + properties: + env: + items: type: string - sha: + type: array + required: + - env + type: object + buildArtifactUrls: + items: + type: string + type: array + builds: + items: + properties: + use: type: string - type: - enum: - - gitlab + src: type: string + config: + additionalProperties: true + type: object required: - - type - - ref - - projectId + - use type: object - - properties: - ref: - type: string - repoUuid: + type: array + env: + items: + type: string + type: array + resourceConfig: + properties: + buildMachine: + properties: + purchaseType: + type: string + enum: + - basic + - enhanced + - standard + - turbo + description: Machine type which was purchased/selected for this build. `basic` is the 2vCPU tier, recorded on the deployment so the build pipeline can detect a basic build without consulting the project. + defaultPurchaseType: + type: string + enum: + - basic + - enhanced + - standard + description: The default plan type for the build machine — what the customer is *paying* for on their plan. For most customers, this is standard, but some customers have an entitlement for enhanced builds. + machineSelectionType: + type: string + enum: + - elastic + - fixed + description: Whether the build ran on a fixed or elastic machine. Used to drive billing for the build. + selectionSource: + type: string + enum: + - elastic-algorithm + - plan-default + - project-setting + - team-entitlement + - team-setting + description: The setting which selected the build machine when the deployment was created. Frozen here so later project or team changes do not rewrite its history. + cores: + type: number + description: Number of cores the build machine ran with. Set at dispatch time once the build lands on a hive. + memory: + type: number + description: Memory, in MiB, the build machine ran with. Set at dispatch time once the build lands on a hive. + type: object + description: Build machine configuration recorded for this deployment's build. See {@link DeploymentBuildMachine}. Distinct from the team/user `resourceConfig.buildMachine`, which only carries `default`. + type: object + inspectorUrl: + nullable: true + type: string + isInConcurrentBuildsQueue: + type: boolean + enum: + - false + - true + isInSystemBuildsQueue: + type: boolean + enum: + - false + - true + projectSettings: + properties: + nodeVersion: + type: string + enum: + - 10.x + - 12.x + - 14.x + - 16.x + - 18.x + - 20.x + - 22.x + - 24.x + - 8.10.x + buildCommand: + nullable: true + type: string + devCommand: + nullable: true + type: string + framework: + nullable: true + type: string + enum: + - actix-web + - angular + - ash + - astro + - axum + - blitzjs + - brunch + - bun + - container + - create-react-app + - django + - docusaurus + - docusaurus-2 + - dojo + - eleventy + - elysia + - ember + - eve + - express + - factory-eve + - fastapi + - fasthtml + - fastify + - flask + - gatsby + - go + - gridsome + - h3 + - hexo + - hono + - hugo + - hydrogen + - ionic-angular + - ionic-react + - jekyll + - koa + - mastra + - middleman + - nestjs + - nextjs + - nitro + - node + - nuxtjs + - parcel + - polymer + - preact + - python + - react-router + - redwoodjs + - remix + - ruby + - rust + - saber + - sanity + - sanity-v2 + - sapper + - scully + - services + - solidstart + - solidstart-1 + - stencil + - storybook + - svelte + - sveltekit + - sveltekit-1 + - tanstack-start + - tanstack-start-lovable + - umijs + - vite + - vitepress + - vue + - vuepress + - xmcp + - zola + - null + commandForIgnoringBuildStep: + nullable: true + type: string + installCommand: + nullable: true + type: string + outputDirectory: + nullable: true + type: string + speedInsights: + properties: + id: + type: string + enabledAt: + type: number + disabledAt: + type: number + canceledAt: + type: number + hasData: + type: boolean + enum: + - false + - true + dataReceivedAt: + type: number + description: When the first free (not Speed Insights Plus) production data point was observed, in ms. Set once by subscriber-analytics-events; projects that already had data before this field shipped get it backfilled on their next batch, so it reads "first free data point observed", not necessarily "first ever". + paidAt: + type: number + required: + - id + type: object + webAnalytics: + properties: + id: + type: string + disabledAt: + type: number + canceledAt: + type: number + enabledAt: + type: number + hasData: + type: boolean + enum: + - true + required: + - id + type: object + type: object + integrations: + properties: + status: + type: string + enum: + - error + - pending + - ready + - skipped + - timeout + startedAt: + type: number + claimedAt: + type: number + completedAt: + type: number + skippedAt: + type: number + skippedBy: + type: string + required: + - startedAt + - status + type: object + images: + properties: + sizes: + items: + type: number + type: array + qualities: + items: + type: number + type: array + domains: + items: type: string - sha: + type: array + remotePatterns: + items: + properties: + protocol: + type: string + enum: + - http + - https + description: Must be `http` or `https`. + hostname: + type: string + description: Can be literal or wildcard. Single `*` matches a single subdomain. Double `**` matches any number of subdomains. + port: + type: string + description: Can be literal port such as `8080` or empty string meaning no port. + pathname: + type: string + description: Can be literal or wildcard. Single `*` matches a single path segment. Double `**` matches any number of path segments. + search: + type: string + description: Can be literal query string such as `?v=1` or empty string meaning no query string. + required: + - hostname + type: object + type: array + localPatterns: + items: + properties: + pathname: + type: string + description: Can be literal or wildcard. Single `*` matches a single path segment. Double `**` matches any number of path segments. + search: + type: string + description: Can be literal query string such as `?v=1` or empty string meaning no query string. + type: object + type: array + minimumCacheTTL: + type: number + formats: + items: type: string - type: enum: - - bitbucket - type: string - workspaceUuid: - type: string - required: - - type - - ref - - repoUuid - type: object - - properties: - owner: - type: string - ref: - type: string - sha: + - image/avif + - image/webp + type: array + dangerouslyAllowSVG: + type: boolean + enum: + - false + - true + contentSecurityPolicy: + type: string + contentDispositionType: + type: string + enum: + - attachment + - inline + type: object + alias: + items: + type: string + type: array + description: A list of all the aliases (default aliases, staging aliases and production aliases) that were assigned upon deployment creation + example: [] + aliasAssigned: + type: boolean + enum: + - false + - true + description: A boolean that will be true when the aliases from the alias property were assigned successfully + example: true + bootedAt: + type: number + buildingAt: + type: number + buildContainerFinishedAt: + type: number + description: Since April 2025 it necessary for On-Demand Concurrency Minutes calculation + buildSkipped: + type: boolean + enum: + - false + - true + creator: + properties: + uid: + type: string + description: Stable creator id across principal types (user id, app id, integration configuration id, or `system`). + example: 96SnxkFiMyVKsK3pnoHfx3Hz + type: + type: string + enum: + - app + - integration + - system + - user + description: Principal type of the deployment creator. + username: + type: string + description: The username of the user that created the deployment + example: john-doe + avatar: + type: string + description: The avatar of the user that created the deployment + required: + - uid + type: object + description: Information about the deployment creator + initReadyAt: + type: number + isFirstBranchDeployment: + type: boolean + enum: + - false + - true + lambdas: + items: + properties: + id: type: string - slug: + readyState: type: string - type: enum: - - bitbucket + - BUILDING + - ERROR + - INITIALIZING + - READY + createdAt: + type: number + entrypoint: + nullable: true type: string + readyStateAt: + type: number + output: + items: + properties: + path: + type: string + functionName: + type: string + required: + - functionName + - path + type: object + type: array required: - - type - - ref - - owner - - slug + - id + - output type: object - meta: - additionalProperties: - maxLength: 65536 + description: A partial representation of a Build used by the deployment endpoint. + type: array + public: + type: boolean + enum: + - false + - true + description: A boolean representing if the deployment is public or not. By default this is `false` + example: false + ready: + type: number + status: type: string - description: An object containing the deployment's metadata. Multiple key-value pairs can be attached to a deployment - example: - foo: bar - maxProperties: 100 - type: object - monorepoManager: - description: The monorepo manager that is being used for this deployment. When `null` is used no monorepo manager is selected - type: string - nullable: true - project: - type: object - required: - - id - - region_id - - name - - pg_version - - proxy_host - - branch_logical_size_limit - - branch_logical_size_limit_bytes - - store_passwords - - created_at - - updated_at - - owner_id - properties: - id: - type: string - region_id: - type: string - name: - type: string - pg_version: - type: number - proxy_host: - type: string - branch_logical_size_limit: - type: number - description: The logical size limit for a branch in MiB. - branch_logical_size_limit_bytes: - type: number - description: The logical size limit for a branch in bytes. - synthetic_storage_size: - type: number - description: The data storage size in bytes. - store_passwords: - type: boolean - created_at: - type: string - updated_at: - type: string - owner_id: - type: string - quota_reset_at: + enum: + - BLOCKED + - BUILDING + - CANCELED + - ERROR + - INITIALIZING + - QUEUED + - READY + team: + properties: + id: + type: string + name: + type: string + slug: + type: string + avatar: + type: string + required: + - id + - name + - slug + type: object + description: The team that owns the deployment if any + userAliases: + items: type: string - data_storage_bytes_hour: - type: number - data_transfer_bytes: - type: number - written_data_bytes: - type: number - active_time_seconds: - type: number - compute_time_seconds: - type: number - settings: - type: object - properties: - quota: - type: object + type: array + description: An array of domains that were provided by the user when creating the Deployment. + example: + - sub1.example.com + - sub2.example.com + previewCommentsEnabled: + type: boolean + enum: + - false + - true + description: Whether or not preview comments are enabled for the deployment + example: false + ttyBuildLogs: + type: boolean + enum: + - false + - true + customEnvironment: + properties: + id: + type: string + description: 'Unique identifier for the custom environment (format: env_*)' + slug: + type: string + description: URL-friendly name of the environment + type: + type: string + enum: + - development + - preview + - production + description: The type of environment (production, preview, or development) + description: + type: string + description: Optional description of the environment's purpose + branchMatcher: + properties: + type: + type: string + enum: + - endsWith + - equals + - startsWith + description: The type of matching to perform + pattern: + type: string + description: The pattern to match against branch names + required: + - pattern + - type + type: object + description: Configuration for matching git branches to this environment + domains: + items: properties: - compute_time_seconds: - type: number - description: The total amount of CPU seconds allowed to be spent by a project's compute endpoints. - active_time_seconds: - type: number - description: The total amount of wall-clock time allowed to be spent by a project's compute endpoints. - written_data_bytes: + name: + type: string + apexName: + type: string + projectId: + type: string + redirect: + nullable: true + type: string + redirectStatusCode: + nullable: true type: number - description: The total amount of data written to all project's branches. - data_transfer_bytes: + enum: + - 301 + - 302 + - 307 + - 308 + - null + gitBranch: + nullable: true + type: string + customEnvironmentId: + nullable: true + type: string + updatedAt: type: number - description: The total amount of data transferred from all project's branches using proxy. - logical_size_bytes: + createdAt: type: number - description: The logical size of every project's branch. - projectSettings: - additionalProperties: false - description: Project settings that will be applied to the deployment. It is required for the first deployment of a project and will be saved for any following deployments - properties: - buildCommand: - description: The build command for this project. When `null` is used this value will be automatically detected - maxLength: 256 - type: string - nullable: true - commandForIgnoringBuildStep: - maxLength: 256 - type: string - nullable: true - devCommand: - description: The dev command for this project. When `null` is used this value will be automatically detected - maxLength: 256 - type: string - nullable: true - framework: - description: The framework that is being used for this project. When `null` is used no framework is selected - type: string - enum: - - null - - blitzjs - - nextjs - - gatsby - - remix - - astro - - hexo - - eleventy - - docusaurus-2 - - docusaurus - - preact - - solidstart - - dojo - - ember - - vue - - scully - - ionic-angular - - angular - - polymer - - svelte - - sveltekit - - sveltekit-1 - - ionic-react - - create-react-app - - gridsome - - umijs - - sapper - - saber - - stencil - - nuxtjs - - redwoodjs - - hugo - - jekyll - - brunch - - middleman - - zola - - hydrogen - - vite - - vitepress - - vuepress - - parcel - - sanity - - storybook - nullable: true - installCommand: - description: The install command for this project. When `null` is used this value will be automatically detected - maxLength: 256 - type: string - nullable: true - outputDirectory: - description: The output directory of the project. When `null` is used this value will be automatically detected - maxLength: 256 - type: string - nullable: true - rootDirectory: - description: The name of a directory or relative path to the source code of your project. When `null` is used it will default to the project root - maxLength: 256 - type: string - nullable: true - serverlessFunctionRegion: - description: The region to deploy Serverless Functions in this project - maxLength: 4 - type: string - nullable: true - skipGitConnectDuringLink: - description: Opts-out of the message prompting a CLI user to connect a Git repository in `vercel link`. - type: boolean - deprecated: true - sourceFilesOutsideRootDirectory: - description: 'Indicates if there are source files outside of the root directory, typically used for monorepos' - type: boolean - type: object - target: - description: 'Either not defined, `staging`, or `production`. If `staging`, a staging alias in the format `-.vercel.app` will be assigned. If `production`, any aliases defined in `alias` will be assigned. If omitted, the target will be `preview`' - enum: - - staging - - production - type: string - withLatestCommit: - description: 'When `true` and `deploymentId` is passed in, the sha from the previous deployment''s `gitSource` is removed forcing the latest commit to be used.' - type: boolean - connection_uris: - type: array - items: - type: object + verified: + type: boolean + enum: + - false + - true + description: '`true` if the domain is verified for use with the project. If `false` it will not be used as an alias on this project until the challenge in `verification` is completed.' + verification: + items: + properties: + type: + type: string + domain: + type: string + value: + type: string + reason: + type: string + required: + - domain + - reason + - type + - value + type: object + description: 'A list of verification challenges, one of which must be completed to verify the domain for use on the project. After the challenge is complete `POST /projects/:idOrName/domains/:domain/verify` to verify the domain. Possible challenges: - If `verification.type = TXT` the `verification.domain` will be checked for a TXT record matching `verification.value`.' + type: array + description: 'A list of verification challenges, one of which must be completed to verify the domain for use on the project. After the challenge is complete `POST /projects/:idOrName/domains/:domain/verify` to verify the domain. Possible challenges: - If `verification.type = TXT` the `verification.domain` will be checked for a TXT record matching `verification.value`.' + required: + - apexName + - name + - projectId + - verified + type: object + description: List of domains associated with this environment + type: array + description: List of domains associated with this environment + currentDeploymentAliases: + items: + type: string + type: array + description: List of aliases for the current deployment + createdAt: + type: number + description: Timestamp when the environment was created + updatedAt: + type: number + description: Timestamp when the environment was last updated required: - - connection_uri + - createdAt + - id + - slug + - type + - updatedAt + type: object + description: If the deployment was created using a Custom Environment, then this property contains information regarding the environment used. + oomReport: + type: string + enum: + - out-of-memory + readyStateReason: + type: string + id: + type: string + description: A string holding the unique ID of the deployment + example: dpl_89qyp1cskzkLrVicDaZoDbjyHuDJ + target: + nullable: true + type: string + enum: + - production + - staging + - null + description: If defined, either `staging` if a staging alias in the format `..now.sh` was assigned upon creation, or `production` if the aliases from `alias` were assigned. `null` value indicates the "preview" deployment. + example: null + readyState: + type: string + enum: + - BLOCKED + - BUILDING + - CANCELED + - ERROR + - INITIALIZING + - QUEUED + - READY + description: The state of the deployment depending on the process of deploying, or if it is ready or in an error state + example: READY + aliasError: + nullable: true properties: - connection_uri: + code: + type: string + message: type: string - example: 'postgres://user:pw@endpoint.us-east-2.aws.neon.tech/neondb' - roles: - type: array - items: - type: object required: - - branch_id - - name - - created_at - - updated_at + - code + - message + type: object + description: An object that will contain a `code` and a `message` when the aliasing fails, otherwise the value will be `null` + example: null + aliasWarning: + nullable: true properties: - branch_id: - type: string - name: + code: type: string - created_at: + message: type: string - updated_at: + link: type: string - protected: - type: boolean - password: + action: type: string - databases: - type: array - items: - type: object required: - - id - - branch_id - - name - - owner_name - - created_at - - updated_at + - code + - message + type: object + errorCode: + type: string + errorMessage: + nullable: true + type: string + createdAt: + type: number + description: A number containing the date when the deployment was created in milliseconds + example: 1540257589405 + name: + type: string + description: The name of the project associated with the deployment at the time that the deployment was created + example: my-project + type: + type: string + enum: + - LAMBDAS + aliasFinal: + nullable: true + type: string + autoAssignCustomDomains: + type: boolean + enum: + - false + - true + description: applies to custom domains only, defaults to `true` + automaticAliases: + items: + type: string + type: array + buildErrorAt: + type: number + checksState: + type: string + enum: + - completed + - registered + - running + checksConclusion: + type: string + enum: + - canceled + - failed + - skipped + - succeeded + deletedAt: + nullable: true + type: number + description: A number containing the date when the deployment was deleted at milliseconds + example: 1540257589405 + defaultRoute: + type: string + description: Computed field that is only available for deployments with a microfrontend configuration. + canceledAt: + type: number + errorLink: + type: string + errorStep: + type: string + passiveRegions: + items: + type: string + type: array + description: Since November 2023 this field defines a set of regions that we will deploy the lambda to passively Lambdas will be deployed to these regions but only invoked if all of the primary `regions` are marked as out of service + gitSource: properties: - id: - type: number - branch_id: + type: type: string - name: + enum: + - github + repoId: + oneOf: + - type: string + - type: number + ref: + nullable: true type: string - owner_name: + sha: type: string - created_at: + prId: + nullable: true + type: number + org: type: string - updated_at: + repo: type: string - branch: - type: object - required: - - id - - project_id - - name - - current_state - - primary - - created_at - - updated_at - properties: - id: - type: string - project_id: - type: string - name: - type: string - current_state: - type: string - enum: - - init - - ready - primary: - type: boolean - created_at: - type: string - updated_at: - type: string - parent_id: - type: string - endpoints: - type: array - items: - type: object - required: - - host - - id - - project_id - - branch_id - - autoscaling_limit_min_cu - - autoscaling_limit_max_cu - - region_id - - type - - current_state - - pooler_enabled - - pooler_mode - - disabled - - passwordless_access - - created_at - - updated_at - - suspend_timeout_seconds - properties: host: type: string - id: - type: string - project_id: - type: string - branch_id: - type: string - autoscaling_limit_min_cu: - type: number - autoscaling_limit_max_cu: - type: number - region_id: - type: string - type: + projectId: + oneOf: + - type: string + - type: number + workspaceUuid: type: string - current_state: + repoUuid: type: string - pooler_enabled: - type: boolean - pooler_mode: + owner: type: string - disabled: - type: boolean - passwordless_access: - type: boolean - last_active: + slug: type: string - created_at: + repoPushedAt: + type: number + gitUrl: type: string - updated_at: + required: + - repoId + - type + - org + - repo + - host + - projectId + - repoUuid + - owner + - slug + - sha + - gitUrl + - ref + - workspaceUuid + type: object + description: Allows custom git sources (local folder mounted to the container) in test mode + manualProvisioning: + properties: + state: type: string - suspend_timeout_seconds: + enum: + - COMPLETE + - PENDING + - TIMEOUT + description: Current provisioning state + completedAt: type: number - endpoint: - type: object - required: - - host - - id - - project_id - - branch_id - - autoscaling_limit_min_cu - - autoscaling_limit_max_cu - - region_id - - type - - current_state - - pooler_enabled - - pooler_mode - - disabled - - passwordless_access - - created_at - - updated_at - - suspend_timeout_seconds - properties: - host: - type: string - id: - type: string - project_id: - type: string - branch_id: - type: string - autoscaling_limit_min_cu: - type: number - autoscaling_limit_max_cu: - type: number - region_id: - type: string - type: - type: string - current_state: - type: string - pooler_enabled: - type: boolean - pooler_mode: - type: string - disabled: - type: boolean - passwordless_access: - type: boolean - last_active: - type: string - created_at: - type: string - updated_at: - type: string - suspend_timeout_seconds: - type: number - database: - type: object - required: - - id - - branch_id - - name - - owner_name - - created_at - - updated_at - properties: - id: - type: number - branch_id: - type: string - name: - type: string - owner_name: - type: string - created_at: - type: string - updated_at: - type: string - role: - type: object - required: - - branch_id - - name - - created_at - - updated_at - properties: - branch_id: - type: string - name: - type: string - created_at: - type: string - updated_at: - type: string - protected: - type: boolean - password: + description: Timestamp when manual provisioning completed + required: + - state + type: object + description: Present when deployment was created with manual provisioning enabled, either explicitly or via the experimental BYOC git flow. The deployment stays in INITIALIZING until /continue is called. + meta: + additionalProperties: type: string - password: - type: string - projects: - type: array - items: type: object + originCacheRegion: + type: string + nodeVersion: + type: string + enum: + - 10.x + - 12.x + - 14.x + - 16.x + - 18.x + - 20.x + - 22.x + - 24.x + - 8.10.x + description: If set it overrides the `projectSettings.nodeVersion` for this deployment. + project: + properties: + id: + type: string + name: + type: string + framework: + nullable: true + type: string required: - id - - data_storage_bytes_hour - - data_transfer_bytes - - written_data_bytes - - compute_time_seconds - - synthetic_storage_size + - name + type: object + description: The public project information associated with the deployment. + prebuilt: + type: boolean + enum: + - false + - true + readySubstate: + type: string + enum: + - PROMOTED + - ROLLING + - STAGED + description: 'Substate of deployment when readyState is ''READY'' Tracks whether or not deployment has seen production traffic: - STAGED: never seen production traffic - ROLLING: in the process of having production traffic gradually transitioned. - PROMOTED: has seen production traffic' + regions: + items: + type: string + type: array + description: The regions the deployment exists in + example: + - sfo1 + softDeletedByRetention: + type: boolean + enum: + - false + - true + description: flag to indicate if the deployment was deleted by retention policy + example: 'true' + source: + type: string + enum: + - api-trigger-git-deploy + - cli + - clone/repo + - drop + - git + - git-deploy-hook + - import + - import/repo + - redeploy + - v0-web + description: Where was the deployment created from. Best-effort guess for metrics only — not authoritative; do not gate behavior on it. + example: cli + undeletedAt: + type: number + description: A number containing the date when the deployment was undeleted at milliseconds + example: 1540257589405 + url: + type: string + description: A string with the unique URL of the deployment + example: my-instant-deployment-3ij3cxz9qr.now.sh + userConfiguredDeploymentId: + type: string + description: Since January 2025 User-configured deployment ID for skew protection with pre-built deployments. This is set when users configure a custom deploymentId in their next.config.js file. This allows Next.js to use skew protection even when deployments are pre-built outside of Vercel's build system. + example: abc123 + version: + type: number + enum: + - 2 + description: The platform version that was used to create the deployment. + example: 2 + oidcTokenClaims: properties: - id: + iss: type: string - data_storage_bytes_hour: - type: number - data_storage_bytes_hour_updated_at: + sub: type: string - data_transfer_bytes: - type: number - data_transfer_bytes_updated_at: + scope: type: string - written_data_bytes: - type: number - written_data_bytes_updated_at: + aud: type: string - compute_time_seconds: - type: number - compute_time_seconds_updated_at: + owner: type: string - synthetic_storage_size: - type: number - synthetic_storage_size_updated_at: + owner_id: type: string - pagination: - type: object - required: - - cursor - properties: - cursor: - type: string - required: - - name - - project - - connection_uris - - roles - - databases - - branch - - endpoints - - endpoint - - database - - role - - password - - projects - - pagination - '/v12/deployments/{id}/cancel': - patch: - description: 'This endpoint allows you to cancel a deployment which is currently building, by supplying its `id` in the URL.' - operationId: cancelDeployment - security: - - bearerToken: [] - summary: Cancel a deployment - tags: - - deployments - responses: - '200': - description: '' - content: - application/json: - schema: - properties: - build: - properties: - env: + project: + type: string + project_id: + type: string + environment: + type: string + custom_environment_id: + type: string + mfe_group_ids: items: type: string type: array - description: The keys of the environment variables that were assigned during the build phase. - example: - - MY_ENV_VAR + plan: + type: string required: - - env + - aud + - environment + - iss + - owner + - owner_id + - project + - project_id + - scope + - sub type: object - builds: - items: - type: object - type: array + projectId: + type: string + plan: + type: string + enum: + - enterprise + - hobby + - pro connectBuildsEnabled: type: boolean - description: The flag saying if Vercel Connect configuration is used for builds + enum: + - false + - true connectConfigurationId: type: string - description: The ID of Vercel Connect configuration used for this deployment createdIn: type: string - description: The region where the deployment was first created - example: sfo1 - env: + crons: items: - type: string + properties: + schedule: + type: string + path: + type: string + required: + - path + - schedule + type: object type: array - description: The keys of the environment variables that were assigned during runtime - example: - - MY_SECRET + atproto: + properties: + enabled: + type: boolean + enum: + - false + subscription: + properties: + collections: + items: + type: string + type: array + dids: + items: + type: string + type: array + kinds: + items: + type: string + enum: + - account + - commit + - identity + - sync + type: array + path: + type: string + required: + - collections + - path + type: object + required: + - enabled + - subscription + type: object functions: nullable: true additionalProperties: properties: + architecture: + type: string + enum: + - arm64 + - x86_64 memory: type: number maxDuration: + oneOf: + - type: number + - type: string + enum: + - max + affinity: + properties: + mode: + type: string + enum: + - strict + required: + - mode + type: object + maxConcurrency: type: number + regions: + items: + type: string + type: array + functionFailoverRegions: + items: + type: string + type: array runtime: type: string includeFiles: type: string excludeFiles: type: string + experimentalTriggers: + items: + oneOf: + - properties: + type: + type: string + enum: + - queue/v1beta + description: Event type - must be "queue/v1beta" (REQUIRED) + consumer: + type: string + description: Name of the consumer group for this trigger (REQUIRED) + topic: + type: string + description: Name of the queue topic to consume from (REQUIRED) + maxDeliveries: + type: number + description: Maximum number of delivery attempts for message processing (OPTIONAL) This represents the total number of times a message can be delivered, not the number of retries. Must be at least 1 if specified. Behavior when not specified depends on the server's default configuration. + retryAfterSeconds: + type: number + description: Delay in seconds before retrying failed executions (OPTIONAL) Behavior when not specified depends on the server's default configuration. + initialDelaySeconds: + type: number + description: Initial delay in seconds before first execution attempt (OPTIONAL) Must be 0 or greater. Use 0 for no initial delay. Behavior when not specified depends on the server's default configuration. + maxConcurrency: + type: number + description: Maximum number of concurrent executions for this consumer (OPTIONAL) Must be at least 1 if specified. Behavior when not specified depends on the server's default configuration. + required: + - consumer + - topic + - type + type: object + description: Queue trigger input event for v1beta (from vercel.json config). Requires explicit consumer name. + - properties: + type: + type: string + enum: + - queue/v2beta + description: Event type - must be "queue/v2beta" (REQUIRED) + topic: + type: string + description: Name of the queue topic to consume from (REQUIRED) + maxDeliveries: + type: number + description: Maximum number of delivery attempts for message processing (OPTIONAL) This represents the total number of times a message can be delivered, not the number of retries. Must be at least 1 if specified. Behavior when not specified depends on the server's default configuration. + retryAfterSeconds: + type: number + description: Delay in seconds before retrying failed executions (OPTIONAL) Behavior when not specified depends on the server's default configuration. + initialDelaySeconds: + type: number + description: Initial delay in seconds before first execution attempt (OPTIONAL) Must be 0 or greater. Use 0 for no initial delay. Behavior when not specified depends on the server's default configuration. + maxConcurrency: + type: number + description: Maximum number of concurrent executions for this consumer (OPTIONAL) Must be at least 1 if specified. Behavior when not specified depends on the server's default configuration. + required: + - topic + - type + type: object + description: Queue trigger input event for v2beta (from vercel.json config). Consumer name is implicitly derived from the function path. Only one trigger per function is allowed. + - properties: + type: + type: string + enum: + - schedule/v1beta + description: Event type - must be "schedule/v1beta" (REQUIRED) + required: + - type + type: object + type: array + supportsCancellation: + type: boolean + enum: + - false + - true type: object - description: An object used to configure your Serverless Functions - example: - api/test.js: - memory: 3008 type: object - description: An object used to configure your Serverless Functions - example: - api/test.js: - memory: 3008 - inspectorUrl: - nullable: true - type: string - description: Vercel URL to inspect the deployment. - example: 'https://vercel.com/acme/nextjs/J1hXN00qjUeoYfpEEf7dnDtpSiVq' - isInConcurrentBuildsQueue: + isInstantStatic: type: boolean - description: Is the deployment currently queued waiting for a Concurrent Build Slot to be available - example: false - meta: - additionalProperties: - type: string - description: An object containing the deployment's metadata - example: - foo: bar - type: object - description: An object containing the deployment's metadata - example: - foo: bar + enum: + - false + - true + description: Whether this deployment completed through the instant static fast path. monorepoManager: nullable: true type: string - description: An monorepo manager that was used for the deployment - example: turbo - name: - type: string - description: The name of the project associated with the deployment at the time that the deployment was created - example: my-project ownerId: type: string - description: The unique ID of the user or team the deployment belongs to - example: ZspSRT4ljIEEmMHgoDwKWDei - plan: - type: string - enum: - - pro - - enterprise - - hobby - - oss - description: The pricing plan the deployment was made under - example: pro - projectId: + passiveConnectConfigurationId: type: string - description: The ID of the project the deployment is associated with - example: prj_12HKQaOmR5t5Uy6vdcQsNIiZgHGB + description: Since November 2023 this field defines a Secure Compute network that will only be used to deploy passive lambdas to (as in passiveRegions) routes: nullable: true items: @@ -5370,730 +10946,2680 @@ paths: - properties: src: type: string - dest: + dest: + type: string + headers: + additionalProperties: + type: string + type: object + methods: + items: + type: string + type: array + continue: + type: boolean + enum: + - false + - true + override: + type: boolean + enum: + - false + - true + caseSensitive: + type: boolean + enum: + - false + - true + check: + type: boolean + enum: + - false + - true + important: + type: boolean + enum: + - false + - true + status: + type: number + has: + items: + oneOf: + - properties: + type: + type: string + enum: + - host + value: + oneOf: + - type: string + - properties: + eq: + oneOf: + - type: string + - type: number + neq: + type: string + inc: + items: + type: string + type: array + ninc: + items: + type: string + type: array + pre: + type: string + suf: + type: string + re: + type: string + gt: + type: number + gte: + type: number + lt: + type: number + lte: + type: number + type: object + required: + - type + - value + type: object + - properties: + type: + type: string + enum: + - cookie + - header + - query + key: + type: string + value: + oneOf: + - type: string + - properties: + eq: + oneOf: + - type: string + - type: number + neq: + type: string + inc: + items: + type: string + type: array + ninc: + items: + type: string + type: array + pre: + type: string + suf: + type: string + re: + type: string + gt: + type: number + gte: + type: number + lt: + type: number + lte: + type: number + type: object + required: + - key + - type + type: object + type: array + missing: + items: + oneOf: + - properties: + type: + type: string + enum: + - host + value: + oneOf: + - type: string + - properties: + eq: + oneOf: + - type: string + - type: number + neq: + type: string + inc: + items: + type: string + type: array + ninc: + items: + type: string + type: array + pre: + type: string + suf: + type: string + re: + type: string + gt: + type: number + gte: + type: number + lt: + type: number + lte: + type: number + type: object + required: + - type + - value + type: object + - properties: + type: + type: string + enum: + - cookie + - header + - query + key: + type: string + value: + oneOf: + - type: string + - properties: + eq: + oneOf: + - type: string + - type: number + neq: + type: string + inc: + items: + type: string + type: array + ninc: + items: + type: string + type: array + pre: + type: string + suf: + type: string + re: + type: string + gt: + type: number + gte: + type: number + lt: + type: number + lte: + type: number + type: object + required: + - key + - type + type: object + type: array + mitigate: + properties: + action: + type: string + enum: + - challenge + - deny + required: + - action + type: object + transforms: + items: + oneOf: + - properties: + type: + type: string + enum: + - request.headers + - request.query + - response.headers + op: + type: string + enum: + - append + - delete + - set + target: + properties: + key: + oneOf: + - type: string + - properties: + eq: + oneOf: + - type: string + - type: number + neq: + type: string + inc: + items: + type: string + type: array + ninc: + items: + type: string + type: array + pre: + type: string + suf: + type: string + gt: + type: number + gte: + type: number + lt: + type: number + lte: + type: number + type: object + required: + - key + type: object + args: + oneOf: + - type: string + - items: + type: string + type: array + env: + items: + type: string + type: array + required: + - op + - target + - type + type: object + - properties: + type: + type: string + enum: + - request.path + op: + type: string + enum: + - set + args: + type: string + env: + items: + type: string + type: array + required: + - args + - op + - type + type: object + type: array + env: + items: + type: string + type: array + locale: + properties: + redirect: + additionalProperties: + type: string + type: object + cookie: + type: string + type: object + source: + type: string + description: Aliases for `src`, `dest`, and `status`. These provide consistency with the `rewrites`, `redirects`, and `headers` fields which use `source`, `destination`, and `statusCode`. During normalization, the string forms are converted to their canonical forms (`src`, `dest`, `status`) and stripped from the route object. `destination` may also be a service-targeted object, in which case routing is delegated into the named service's internal route table and the object is preserved as-is (not folded into `dest`). + destination: + oneOf: + - type: string + - properties: + type: + type: string + enum: + - service + description: Optional explicit format marker. The destination is identified by the presence of `service`, so `type` is no longer required. + service: + type: string + path: + type: string + description: Routing-only path used to select a route inside the target service. + required: + - service + type: object + statusCode: + type: number + middlewarePath: + type: string + description: A middleware key within the `output` key under the build result. Overrides a `middleware` definition. + middlewareRawSrc: + items: + type: string + type: array + description: The original middleware matchers. + middleware: + type: number + description: A middleware index in the `middleware` key under the build result + respectOriginCacheControl: + type: boolean + enum: + - false + - true + required: + - src + type: object + - properties: + handle: + type: string + enum: + - error + - filesystem + - hit + - miss + - resource + - rewrite + src: + type: string + dest: + type: string + status: + type: number + required: + - handle + type: object + - properties: + src: + type: string + continue: + type: boolean + enum: + - false + - true + middleware: + type: number + enum: + - 0 + required: + - continue + - middleware + - src + type: object + type: array + services: + items: + oneOf: + - properties: + schema: + type: string + enum: + - experimentalServices + name: + type: string + type: + type: string + enum: + - cron + - job + - web + - worker + trigger: + type: string + enum: + - queue + - schedule + - workflow + group: + type: string + workspace: + type: string + entrypoint: + type: string + framework: + type: string + builder: + properties: + use: + type: string + src: + type: string + config: + properties: + bunVersion: + type: string + maxLambdaSize: + type: string + includeFiles: + oneOf: + - type: string + - items: + type: string + type: array + excludeFiles: + oneOf: + - type: string + - items: + type: string + type: array + bundle: + type: boolean + enum: + - false + - true + ldsflags: + type: string + helpers: + type: boolean + enum: + - false + - true + rust: + type: string + debug: + type: boolean + enum: + - false + - true + zeroConfig: + type: boolean + enum: + - false + - true + import: + additionalProperties: + type: string + type: object + functions: + additionalProperties: + properties: + architecture: + type: string + enum: + - arm64 + - x86_64 + memory: + type: number + maxDuration: + oneOf: + - type: number + - type: string + enum: + - max + affinity: + properties: + mode: + type: string + enum: + - strict + required: + - mode + type: object + maxConcurrency: + type: number + regions: + items: + type: string + type: array + functionFailoverRegions: + items: + type: string + type: array + runtime: + type: string + includeFiles: + type: string + excludeFiles: + type: string + experimentalTriggers: + items: + oneOf: + - properties: + type: + type: string + enum: + - queue/v1beta + description: Event type - must be "queue/v1beta" (REQUIRED) + consumer: + type: string + description: Name of the consumer group for this trigger (REQUIRED) + topic: + type: string + description: Name of the queue topic to consume from (REQUIRED) + maxDeliveries: + type: number + description: Maximum number of delivery attempts for message processing (OPTIONAL) This represents the total number of times a message can be delivered, not the number of retries. Must be at least 1 if specified. Behavior when not specified depends on the server's default configuration. + retryAfterSeconds: + type: number + description: Delay in seconds before retrying failed executions (OPTIONAL) Behavior when not specified depends on the server's default configuration. + initialDelaySeconds: + type: number + description: Initial delay in seconds before first execution attempt (OPTIONAL) Must be 0 or greater. Use 0 for no initial delay. Behavior when not specified depends on the server's default configuration. + maxConcurrency: + type: number + description: Maximum number of concurrent executions for this consumer (OPTIONAL) Must be at least 1 if specified. Behavior when not specified depends on the server's default configuration. + required: + - consumer + - topic + - type + type: object + description: Queue trigger input event for v1beta (from vercel.json config). Requires explicit consumer name. + - properties: + type: + type: string + enum: + - queue/v2beta + description: Event type - must be "queue/v2beta" (REQUIRED) + topic: + type: string + description: Name of the queue topic to consume from (REQUIRED) + maxDeliveries: + type: number + description: Maximum number of delivery attempts for message processing (OPTIONAL) This represents the total number of times a message can be delivered, not the number of retries. Must be at least 1 if specified. Behavior when not specified depends on the server's default configuration. + retryAfterSeconds: + type: number + description: Delay in seconds before retrying failed executions (OPTIONAL) Behavior when not specified depends on the server's default configuration. + initialDelaySeconds: + type: number + description: Initial delay in seconds before first execution attempt (OPTIONAL) Must be 0 or greater. Use 0 for no initial delay. Behavior when not specified depends on the server's default configuration. + maxConcurrency: + type: number + description: Maximum number of concurrent executions for this consumer (OPTIONAL) Must be at least 1 if specified. Behavior when not specified depends on the server's default configuration. + required: + - topic + - type + type: object + description: Queue trigger input event for v2beta (from vercel.json config). Consumer name is implicitly derived from the function path. Only one trigger per function is allowed. + - properties: + type: + type: string + enum: + - schedule/v1beta + description: Event type - must be "schedule/v1beta" (REQUIRED) + required: + - type + type: object + type: array + supportsCancellation: + type: boolean + enum: + - false + - true + type: object + type: object + projectSettings: + properties: + framework: + nullable: true + type: string + devCommand: + nullable: true + type: string + installCommand: + nullable: true + type: string + buildCommand: + nullable: true + type: string + outputDirectory: + nullable: true + type: string + rootDirectory: + nullable: true + type: string + nodeVersion: + type: string + monorepoManager: + nullable: true + type: string + createdAt: + type: number + autoExposeSystemEnvs: + type: boolean + enum: + - false + - true + sourceFilesOutsideRootDirectory: + type: boolean + enum: + - false + - true + directoryListing: + type: boolean + enum: + - false + - true + gitForkProtection: + type: boolean + enum: + - false + - true + commandForIgnoringBuildStep: + nullable: true + type: string + type: object + outputDirectory: + type: string + installCommand: + type: string + buildCommand: + type: string + devCommand: + type: string + framework: + nullable: true + type: string + nodeVersion: + type: string + middleware: + type: boolean + enum: + - false + - true + middlewareRuntime: + type: string + enum: + - nodejs + description: Enforced runtime for explicitly configured Routing Middleware. + middlewareMatcher: + oneOf: + - type: string + - items: + type: string + type: array + description: Matcher supplied outside of the middleware source module. + serviceName: + type: string + description: Owning service name; scopes per-function config such as the v2beta consumer. + type: object + required: + - use + type: object + runtime: + type: string + buildCommand: type: string - headers: + installCommand: + type: string + preDeployCommand: + type: string + routePrefix: + type: string + routePrefixSource: + type: string + enum: + - configured + - generated + subdomain: + type: string + schedule: + oneOf: + - type: string + - items: + type: string + type: array + handlerFunction: + type: string + topics: + oneOf: + - items: + type: string + type: array + - items: + properties: + topic: + type: string + retryAfterSeconds: + type: number + initialDelaySeconds: + type: number + required: + - topic + type: object + type: array + env: additionalProperties: - type: string + properties: + type: + type: string + enum: + - service-ref + service: + type: string + required: + - service + - type + type: object type: object - methods: + required: + - builder + - name + - schema + - type + - workspace + type: object + description: Services detected during build from vercel.json experimentalServices or auto-detected from project structure. Used to inject service URLs as environment variables at runtime. + - properties: + schema: + type: string + enum: + - experimentalServicesV2 + name: + type: string + root: + type: string + description: Path to the service root, relative to the project root. + framework: + type: string + runtime: + type: string + entrypoint: + type: string + description: Resolved entrypoint, relative to the service root. + command: items: type: string type: array - continue: - type: boolean - override: - type: boolean - caseSensitive: - type: boolean - check: - type: boolean - important: - type: boolean - status: - type: number - has: - items: - oneOf: - - properties: - type: + description: 'Command override for `runtime: "container"` services.' + builder: + properties: + use: + type: string + src: + type: string + config: + properties: + bunVersion: + type: string + maxLambdaSize: + type: string + includeFiles: + oneOf: + - type: string + - items: + type: string + type: array + excludeFiles: + oneOf: + - type: string + - items: + type: string + type: array + bundle: + type: boolean + enum: + - false + - true + ldsflags: + type: string + helpers: + type: boolean + enum: + - false + - true + rust: + type: string + debug: + type: boolean + enum: + - false + - true + zeroConfig: + type: boolean + enum: + - false + - true + import: + additionalProperties: type: string + type: object + functions: + additionalProperties: + properties: + architecture: + type: string + enum: + - arm64 + - x86_64 + memory: + type: number + maxDuration: + oneOf: + - type: number + - type: string + enum: + - max + affinity: + properties: + mode: + type: string + enum: + - strict + required: + - mode + type: object + maxConcurrency: + type: number + regions: + items: + type: string + type: array + functionFailoverRegions: + items: + type: string + type: array + runtime: + type: string + includeFiles: + type: string + excludeFiles: + type: string + experimentalTriggers: + items: + oneOf: + - properties: + type: + type: string + enum: + - queue/v1beta + description: Event type - must be "queue/v1beta" (REQUIRED) + consumer: + type: string + description: Name of the consumer group for this trigger (REQUIRED) + topic: + type: string + description: Name of the queue topic to consume from (REQUIRED) + maxDeliveries: + type: number + description: Maximum number of delivery attempts for message processing (OPTIONAL) This represents the total number of times a message can be delivered, not the number of retries. Must be at least 1 if specified. Behavior when not specified depends on the server's default configuration. + retryAfterSeconds: + type: number + description: Delay in seconds before retrying failed executions (OPTIONAL) Behavior when not specified depends on the server's default configuration. + initialDelaySeconds: + type: number + description: Initial delay in seconds before first execution attempt (OPTIONAL) Must be 0 or greater. Use 0 for no initial delay. Behavior when not specified depends on the server's default configuration. + maxConcurrency: + type: number + description: Maximum number of concurrent executions for this consumer (OPTIONAL) Must be at least 1 if specified. Behavior when not specified depends on the server's default configuration. + required: + - consumer + - topic + - type + type: object + description: Queue trigger input event for v1beta (from vercel.json config). Requires explicit consumer name. + - properties: + type: + type: string + enum: + - queue/v2beta + description: Event type - must be "queue/v2beta" (REQUIRED) + topic: + type: string + description: Name of the queue topic to consume from (REQUIRED) + maxDeliveries: + type: number + description: Maximum number of delivery attempts for message processing (OPTIONAL) This represents the total number of times a message can be delivered, not the number of retries. Must be at least 1 if specified. Behavior when not specified depends on the server's default configuration. + retryAfterSeconds: + type: number + description: Delay in seconds before retrying failed executions (OPTIONAL) Behavior when not specified depends on the server's default configuration. + initialDelaySeconds: + type: number + description: Initial delay in seconds before first execution attempt (OPTIONAL) Must be 0 or greater. Use 0 for no initial delay. Behavior when not specified depends on the server's default configuration. + maxConcurrency: + type: number + description: Maximum number of concurrent executions for this consumer (OPTIONAL) Must be at least 1 if specified. Behavior when not specified depends on the server's default configuration. + required: + - topic + - type + type: object + description: Queue trigger input event for v2beta (from vercel.json config). Consumer name is implicitly derived from the function path. Only one trigger per function is allowed. + - properties: + type: + type: string + enum: + - schedule/v1beta + description: Event type - must be "schedule/v1beta" (REQUIRED) + required: + - type + type: object + type: array + supportsCancellation: + type: boolean + enum: + - false + - true + type: object + type: object + projectSettings: + properties: + framework: + nullable: true + type: string + devCommand: + nullable: true + type: string + installCommand: + nullable: true + type: string + buildCommand: + nullable: true + type: string + outputDirectory: + nullable: true + type: string + rootDirectory: + nullable: true + type: string + nodeVersion: + type: string + monorepoManager: + nullable: true + type: string + createdAt: + type: number + autoExposeSystemEnvs: + type: boolean + enum: + - false + - true + sourceFilesOutsideRootDirectory: + type: boolean + enum: + - false + - true + directoryListing: + type: boolean + enum: + - false + - true + gitForkProtection: + type: boolean + enum: + - false + - true + commandForIgnoringBuildStep: + nullable: true + type: string + type: object + outputDirectory: + type: string + installCommand: + type: string + buildCommand: + type: string + devCommand: + type: string + framework: + nullable: true + type: string + nodeVersion: + type: string + middleware: + type: boolean + enum: + - false + - true + middlewareRuntime: + type: string + enum: + - nodejs + description: Enforced runtime for explicitly configured Routing Middleware. + middlewareMatcher: + oneOf: + - type: string + - items: + type: string + type: array + description: Matcher supplied outside of the middleware source module. + serviceName: + type: string + description: Owning service name; scopes per-function config such as the v2beta consumer. + type: object + required: + - use + type: object + description: Builder selected by the resolver. + installCommand: + type: string + buildCommand: + type: string + devCommand: + type: string + ignoreCommand: + type: string + outputDirectory: + type: string + bindings: + items: + properties: + type: + type: string + enum: + - service + description: If present, must be `"service"` for Service-to-Service HTTP bindings. + service: + type: string + description: Target service name from `services`. + format: + type: string + enum: + - url + description: Generated value shape, must be `"url"`. + env: + type: string + description: Environment variable name that will store the generated value + required: + - env + - format + - service + type: object + description: Caller-side bindings to other services. + type: array + description: Caller-side bindings to other services. + functions: + additionalProperties: + properties: + architecture: + type: string + enum: + - arm64 + - x86_64 + memory: + type: number + maxDuration: + oneOf: + - type: number + - type: string enum: - - host - value: + - max + affinity: + properties: + mode: type: string + enum: + - strict required: - - type - - value + - mode type: object + maxConcurrency: + type: number + regions: + items: + type: string + type: array + functionFailoverRegions: + items: + type: string + type: array + runtime: + type: string + includeFiles: + type: string + excludeFiles: + type: string + experimentalTriggers: + items: + oneOf: + - properties: + type: + type: string + enum: + - queue/v1beta + description: Event type - must be "queue/v1beta" (REQUIRED) + consumer: + type: string + description: Name of the consumer group for this trigger (REQUIRED) + topic: + type: string + description: Name of the queue topic to consume from (REQUIRED) + maxDeliveries: + type: number + description: Maximum number of delivery attempts for message processing (OPTIONAL) This represents the total number of times a message can be delivered, not the number of retries. Must be at least 1 if specified. Behavior when not specified depends on the server's default configuration. + retryAfterSeconds: + type: number + description: Delay in seconds before retrying failed executions (OPTIONAL) Behavior when not specified depends on the server's default configuration. + initialDelaySeconds: + type: number + description: Initial delay in seconds before first execution attempt (OPTIONAL) Must be 0 or greater. Use 0 for no initial delay. Behavior when not specified depends on the server's default configuration. + maxConcurrency: + type: number + description: Maximum number of concurrent executions for this consumer (OPTIONAL) Must be at least 1 if specified. Behavior when not specified depends on the server's default configuration. + required: + - consumer + - topic + - type + type: object + description: Queue trigger input event for v1beta (from vercel.json config). Requires explicit consumer name. + - properties: + type: + type: string + enum: + - queue/v2beta + description: Event type - must be "queue/v2beta" (REQUIRED) + topic: + type: string + description: Name of the queue topic to consume from (REQUIRED) + maxDeliveries: + type: number + description: Maximum number of delivery attempts for message processing (OPTIONAL) This represents the total number of times a message can be delivered, not the number of retries. Must be at least 1 if specified. Behavior when not specified depends on the server's default configuration. + retryAfterSeconds: + type: number + description: Delay in seconds before retrying failed executions (OPTIONAL) Behavior when not specified depends on the server's default configuration. + initialDelaySeconds: + type: number + description: Initial delay in seconds before first execution attempt (OPTIONAL) Must be 0 or greater. Use 0 for no initial delay. Behavior when not specified depends on the server's default configuration. + maxConcurrency: + type: number + description: Maximum number of concurrent executions for this consumer (OPTIONAL) Must be at least 1 if specified. Behavior when not specified depends on the server's default configuration. + required: + - topic + - type + type: object + description: Queue trigger input event for v2beta (from vercel.json config). Consumer name is implicitly derived from the function path. Only one trigger per function is allowed. + - properties: + type: + type: string + enum: + - schedule/v1beta + description: Event type - must be "schedule/v1beta" (REQUIRED) + required: + - type + type: object + type: array + supportsCancellation: + type: boolean + enum: + - false + - true + type: object + description: Function configuration scoped to this service. + type: object + description: Function configuration scoped to this service. + headers: + items: + properties: + source: + type: string + headers: + items: + properties: + key: + type: string + value: + type: string + required: + - key + - value + type: object + type: array + has: + items: + oneOf: + - properties: + type: + type: string + enum: + - host + value: + oneOf: + - type: string + - properties: + eq: + oneOf: + - type: string + - type: number + neq: + type: string + inc: + items: + type: string + type: array + ninc: + items: + type: string + type: array + pre: + type: string + suf: + type: string + re: + type: string + gt: + type: number + gte: + type: number + lt: + type: number + lte: + type: number + type: object + required: + - type + - value + type: object + - properties: + type: + type: string + enum: + - cookie + - header + - query + key: + type: string + value: + oneOf: + - type: string + - properties: + eq: + oneOf: + - type: string + - type: number + neq: + type: string + inc: + items: + type: string + type: array + ninc: + items: + type: string + type: array + pre: + type: string + suf: + type: string + re: + type: string + gt: + type: number + gte: + type: number + lt: + type: number + lte: + type: number + type: object + required: + - key + - type + type: object + type: array + missing: + items: + oneOf: + - properties: + type: + type: string + enum: + - host + value: + oneOf: + - type: string + - properties: + eq: + oneOf: + - type: string + - type: number + neq: + type: string + inc: + items: + type: string + type: array + ninc: + items: + type: string + type: array + pre: + type: string + suf: + type: string + re: + type: string + gt: + type: number + gte: + type: number + lt: + type: number + lte: + type: number + type: object + required: + - type + - value + type: object + - properties: + type: + type: string + enum: + - cookie + - header + - query + key: + type: string + value: + oneOf: + - type: string + - properties: + eq: + oneOf: + - type: string + - type: number + neq: + type: string + inc: + items: + type: string + type: array + ninc: + items: + type: string + type: array + pre: + type: string + suf: + type: string + re: + type: string + gt: + type: number + gte: + type: number + lt: + type: number + lte: + type: number + type: object + required: + - key + - type + type: object + type: array + required: + - headers + - source + type: object + type: array + redirects: + items: + properties: + source: + type: string + destination: + type: string + permanent: + type: boolean + enum: + - false + - true + statusCode: + type: number + has: + items: + oneOf: + - properties: + type: + type: string + enum: + - host + value: + oneOf: + - type: string + - properties: + eq: + oneOf: + - type: string + - type: number + neq: + type: string + inc: + items: + type: string + type: array + ninc: + items: + type: string + type: array + pre: + type: string + suf: + type: string + re: + type: string + gt: + type: number + gte: + type: number + lt: + type: number + lte: + type: number + type: object + required: + - type + - value + type: object + - properties: + type: + type: string + enum: + - cookie + - header + - query + key: + type: string + value: + oneOf: + - type: string + - properties: + eq: + oneOf: + - type: string + - type: number + neq: + type: string + inc: + items: + type: string + type: array + ninc: + items: + type: string + type: array + pre: + type: string + suf: + type: string + re: + type: string + gt: + type: number + gte: + type: number + lt: + type: number + lte: + type: number + type: object + required: + - key + - type + type: object + type: array + missing: + items: + oneOf: + - properties: + type: + type: string + enum: + - host + value: + oneOf: + - type: string + - properties: + eq: + oneOf: + - type: string + - type: number + neq: + type: string + inc: + items: + type: string + type: array + ninc: + items: + type: string + type: array + pre: + type: string + suf: + type: string + re: + type: string + gt: + type: number + gte: + type: number + lt: + type: number + lte: + type: number + type: object + required: + - type + - value + type: object + - properties: + type: + type: string + enum: + - cookie + - header + - query + key: + type: string + value: + oneOf: + - type: string + - properties: + eq: + oneOf: + - type: string + - type: number + neq: + type: string + inc: + items: + type: string + type: array + ninc: + items: + type: string + type: array + pre: + type: string + suf: + type: string + re: + type: string + gt: + type: number + gte: + type: number + lt: + type: number + lte: + type: number + type: object + required: + - key + - type + type: object + type: array + env: + items: + type: string + type: array + required: + - destination + - source + type: object + type: array + rewrites: + items: + properties: + source: + type: string + destination: + oneOf: + - type: string + - properties: + type: + type: string + enum: + - service + description: Optional explicit format marker. The destination is identified by the presence of `service`, so `type` is no longer required. + service: + type: string + path: + type: string + description: Routing-only path used to select a route inside the target service. + required: + - service + type: object + transforms: + items: + properties: + type: + type: string + enum: + - request.path + op: + type: string + enum: + - set + args: + type: string + env: + items: + type: string + type: array + required: + - args + - op + - type + type: object + type: array + has: + items: + oneOf: + - properties: + type: + type: string + enum: + - host + value: + oneOf: + - type: string + - properties: + eq: + oneOf: + - type: string + - type: number + neq: + type: string + inc: + items: + type: string + type: array + ninc: + items: + type: string + type: array + pre: + type: string + suf: + type: string + re: + type: string + gt: + type: number + gte: + type: number + lt: + type: number + lte: + type: number + type: object + required: + - type + - value + type: object + - properties: + type: + type: string + enum: + - cookie + - header + - query + key: + type: string + value: + oneOf: + - type: string + - properties: + eq: + oneOf: + - type: string + - type: number + neq: + type: string + inc: + items: + type: string + type: array + ninc: + items: + type: string + type: array + pre: + type: string + suf: + type: string + re: + type: string + gt: + type: number + gte: + type: number + lt: + type: number + lte: + type: number + type: object + required: + - key + - type + type: object + type: array + missing: + items: + oneOf: + - properties: + type: + type: string + enum: + - host + value: + oneOf: + - type: string + - properties: + eq: + oneOf: + - type: string + - type: number + neq: + type: string + inc: + items: + type: string + type: array + ninc: + items: + type: string + type: array + pre: + type: string + suf: + type: string + re: + type: string + gt: + type: number + gte: + type: number + lt: + type: number + lte: + type: number + type: object + required: + - type + - value + type: object + - properties: + type: + type: string + enum: + - cookie + - header + - query + key: + type: string + value: + oneOf: + - type: string + - properties: + eq: + oneOf: + - type: string + - type: number + neq: + type: string + inc: + items: + type: string + type: array + ninc: + items: + type: string + type: array + pre: + type: string + suf: + type: string + re: + type: string + gt: + type: number + gte: + type: number + lt: + type: number + lte: + type: number + type: object + required: + - key + - type + type: object + type: array + statusCode: + type: number + env: + items: + type: string + type: array + respectOriginCacheControl: + type: boolean + enum: + - false + - true + required: + - destination + - source + type: object + type: array + routes: + items: + oneOf: - properties: - type: + src: type: string - enum: - - header - - cookie - - query - key: + dest: type: string - value: + headers: + additionalProperties: + type: string + type: object + methods: + items: + type: string + type: array + continue: + type: boolean + enum: + - false + - true + override: + type: boolean + enum: + - false + - true + caseSensitive: + type: boolean + enum: + - false + - true + check: + type: boolean + enum: + - false + - true + important: + type: boolean + enum: + - false + - true + status: + type: number + has: + items: + oneOf: + - properties: + type: + type: string + enum: + - host + value: + oneOf: + - type: string + - properties: + eq: + oneOf: + - type: string + - type: number + neq: + type: string + inc: + items: + type: string + type: array + ninc: + items: + type: string + type: array + pre: + type: string + suf: + type: string + re: + type: string + gt: + type: number + gte: + type: number + lt: + type: number + lte: + type: number + type: object + required: + - type + - value + type: object + - properties: + type: + type: string + enum: + - cookie + - header + - query + key: + type: string + value: + oneOf: + - type: string + - properties: + eq: + oneOf: + - type: string + - type: number + neq: + type: string + inc: + items: + type: string + type: array + ninc: + items: + type: string + type: array + pre: + type: string + suf: + type: string + re: + type: string + gt: + type: number + gte: + type: number + lt: + type: number + lte: + type: number + type: object + required: + - key + - type + type: object + type: array + missing: + items: + oneOf: + - properties: + type: + type: string + enum: + - host + value: + oneOf: + - type: string + - properties: + eq: + oneOf: + - type: string + - type: number + neq: + type: string + inc: + items: + type: string + type: array + ninc: + items: + type: string + type: array + pre: + type: string + suf: + type: string + re: + type: string + gt: + type: number + gte: + type: number + lt: + type: number + lte: + type: number + type: object + required: + - type + - value + type: object + - properties: + type: + type: string + enum: + - cookie + - header + - query + key: + type: string + value: + oneOf: + - type: string + - properties: + eq: + oneOf: + - type: string + - type: number + neq: + type: string + inc: + items: + type: string + type: array + ninc: + items: + type: string + type: array + pre: + type: string + suf: + type: string + re: + type: string + gt: + type: number + gte: + type: number + lt: + type: number + lte: + type: number + type: object + required: + - key + - type + type: object + type: array + mitigate: + properties: + action: + type: string + enum: + - challenge + - deny + required: + - action + type: object + transforms: + items: + oneOf: + - properties: + type: + type: string + enum: + - request.headers + - request.query + - response.headers + op: + type: string + enum: + - append + - delete + - set + target: + properties: + key: + oneOf: + - type: string + - properties: + eq: + oneOf: + - type: string + - type: number + neq: + type: string + inc: + items: + type: string + type: array + ninc: + items: + type: string + type: array + pre: + type: string + suf: + type: string + gt: + type: number + gte: + type: number + lt: + type: number + lte: + type: number + type: object + required: + - key + type: object + args: + oneOf: + - type: string + - items: + type: string + type: array + env: + items: + type: string + type: array + required: + - op + - target + - type + type: object + - properties: + type: + type: string + enum: + - request.path + op: + type: string + enum: + - set + args: + type: string + env: + items: + type: string + type: array + required: + - args + - op + - type + type: object + type: array + env: + items: + type: string + type: array + locale: + properties: + redirect: + additionalProperties: + type: string + type: object + cookie: + type: string + type: object + source: type: string - required: - - type - - key - type: object - type: array - missing: - items: - oneOf: - - properties: - type: + description: Aliases for `src`, `dest`, and `status`. These provide consistency with the `rewrites`, `redirects`, and `headers` fields which use `source`, `destination`, and `statusCode`. During normalization, the string forms are converted to their canonical forms (`src`, `dest`, `status`) and stripped from the route object. `destination` may also be a service-targeted object, in which case routing is delegated into the named service's internal route table and the object is preserved as-is (not folded into `dest`). + destination: + oneOf: + - type: string + - properties: + type: + type: string + enum: + - service + description: Optional explicit format marker. The destination is identified by the presence of `service`, so `type` is no longer required. + service: + type: string + path: + type: string + description: Routing-only path used to select a route inside the target service. + required: + - service + type: object + statusCode: + type: number + middlewarePath: type: string + description: A middleware key within the `output` key under the build result. Overrides a `middleware` definition. + middlewareRawSrc: + items: + type: string + type: array + description: The original middleware matchers. + middleware: + type: number + description: A middleware index in the `middleware` key under the build result + respectOriginCacheControl: + type: boolean enum: - - host - value: - type: string + - false + - true required: - - type - - value + - src type: object - properties: - type: + handle: type: string enum: - - header - - cookie - - query - key: + - error + - filesystem + - hit + - miss + - resource + - rewrite + src: type: string - value: + dest: type: string + status: + type: number required: - - type - - key + - handle type: object type: array - locale: - properties: - redirect: - additionalProperties: - type: string - type: object - cookie: - type: string - type: object - middlewarePath: - type: string - description: A middleware key within the `output` key under the build result. Overrides a `middleware` definition. - middlewareRawSrc: - items: - type: string - type: array - description: The original middleware matchers. - middleware: - type: number - description: A middleware index in the `middleware` key under the build result - required: - - src - type: object - description: A list of routes objects used to rewrite paths to point towards other internal or external paths - example: - - src: /docs - dest: 'https://docs.example.com' - - properties: - handle: - type: string + cleanUrls: + type: boolean enum: - - error - - filesystem - - hit - - miss - - rewrite - - resource - src: - type: string - dest: - type: string - status: - type: number - required: - - handle - type: object - description: A list of routes objects used to rewrite paths to point towards other internal or external paths - example: - - src: /docs - dest: 'https://docs.example.com' - - properties: - src: - type: string - continue: + - false + - true + trailingSlash: type: boolean - middleware: - type: number enum: - - 0 + - false + - true required: - - src - - continue - - middleware - type: object - description: A list of routes objects used to rewrite paths to point towards other internal or external paths - example: - - src: /docs - dest: 'https://docs.example.com' - type: array - description: A list of routes objects used to rewrite paths to point towards other internal or external paths - example: - - src: /docs - dest: 'https://docs.example.com' - gitRepo: - nullable: true - oneOf: - - properties: - namespace: - type: string - projectId: - type: number - type: - type: string - enum: - - gitlab - url: - type: string - path: - type: string - defaultBranch: - type: string - name: - type: string - private: - type: boolean - ownerType: - type: string - enum: - - user - - team - required: - - namespace - - projectId - - type - - url - - path - - defaultBranch - - name - - private - - ownerType - type: object - - properties: - org: - type: string - repo: - type: string - repoId: - type: number - type: - type: string - enum: - - github - repoOwnerId: - type: string - path: - type: string - defaultBranch: - type: string - name: - type: string - private: - type: boolean - ownerType: - type: string - enum: - - user - - team - required: - - org - - repo - - repoId - - type - - repoOwnerId - - path - - defaultBranch - - name - - private - - ownerType - type: object - - properties: - owner: - type: string - repoUuid: - type: string - slug: - type: string - type: - type: string - enum: - - bitbucket - workspaceUuid: - type: string - path: - type: string - defaultBranch: - type: string - name: - type: string - private: - type: boolean - ownerType: - type: string - enum: - - user - - team - required: - - owner - - repoUuid - - slug - - type - - workspaceUuid - - path - - defaultBranch - - name - - private - - ownerType - type: object - aliasAssignedAt: - nullable: true - oneOf: - - type: number - - type: boolean - lambdas: - items: - properties: - id: - type: string - createdAt: - type: number - entrypoint: - nullable: true - type: string - readyState: - type: string - enum: - - INITIALIZING - - BUILDING - - READY - - ERROR - readyStateAt: - type: number - output: - items: - properties: - path: - type: string - functionName: - type: string - required: - - path - - functionName - type: object - type: array - required: - - id - - output - type: object - type: array - public: - type: boolean - description: A boolean representing if the deployment is public or not. By default this is `false` - example: false - readyState: - type: string - enum: - - INITIALIZING - - BUILDING - - READY - - ERROR - - QUEUED - - CANCELED - description: 'The state of the deployment depending on the process of deploying, or if it is ready or in an error state' - example: READY - readySubstate: - type: string - enum: - - STAGED - - PROMOTED - description: The substate of the deployment when the state is "READY" - example: STAGED - regions: - items: - type: string + - builder + - name + - root + - schema + type: object + description: Services detected during build from vercel.json experimentalServices or auto-detected from project structure. Used to inject service URLs as environment variables at runtime. type: array - description: The regions the deployment exists in - example: - - sfo1 - source: - type: string - enum: - - cli - - git - - import - - import/repo - - clone/repo - description: Where was the deployment created from - example: cli - target: + description: Services detected during build from vercel.json experimentalServices or auto-detected from project structure. Used to inject service URLs as environment variables at runtime. + gitRepo: nullable: true - type: string - enum: - - staging - - production - description: 'If defined, either `staging` if a staging alias in the format `..now.sh` was assigned upon creation, or `production` if the aliases from `alias` were assigned' - example: null - team: properties: - id: + namespace: + type: string + projectId: + type: number + type: + type: string + enum: + - gitlab + url: + type: string + path: + type: string + defaultBranch: type: string - description: The ID of the team owner - example: team_LLHUOMOoDlqOp8wPE4kFo9pE name: type: string - description: The name of the team owner - example: FSociety - slug: + private: + type: boolean + enum: + - false + - true + ownerType: type: string - description: The slug of the team owner - example: fsociety - required: - - id - - name - - slug - type: object - description: The team that owns the deployment if any - type: - type: string - enum: - - LAMBDAS - url: - type: string - description: A string with the unique URL of the deployment - example: my-instant-deployment-3ij3cxz9qr.now.sh - userAliases: - items: - type: string - type: array - description: An array of domains that were provided by the user when creating the Deployment. - example: - - sub1.example.com - - sub2.example.com - version: - type: number - enum: - - 2 - description: The platform version that was used to create the deployment. - example: 2 - previewCommentsEnabled: - type: boolean - description: Whether or not preview comments are enabled for the deployment - example: false - alias: - items: - type: string - type: array - description: 'A list of all the aliases (default aliases, staging aliases and production aliases) that were assigned upon deployment creation' - example: [] - aliasAssigned: - type: boolean - description: A boolean that will be true when the aliases from the alias property were assigned successfully - example: true - aliasError: - nullable: true - properties: - code: + enum: + - team + - user + org: type: string - message: + repo: type: string - required: - - code - - message - type: object - description: 'An object that will contain a `code` and a `message` when the aliasing fails, otherwise the value will be `null`' - example: null - aliasFinal: - nullable: true - type: string - aliasWarning: - nullable: true - properties: - code: + repoId: + type: number + repoOwnerId: + type: number + owner: type: string - message: + repoUuid: type: string - link: + slug: type: string - action: + workspaceUuid: type: string required: - - code - - message + - defaultBranch + - name + - namespace + - ownerType + - path + - private + - projectId + - type + - url + - org + - repo + - repoId + - repoOwnerId + - owner + - repoUuid + - slug + - workspaceUuid type: object - autoAssignCustomDomains: - type: boolean - automaticAliases: + flags: + properties: + definitions: + additionalProperties: + properties: + options: + items: + properties: + value: + $ref: '#/components/schemas/FlagJSONValue' + label: + type: string + required: + - value + type: object + type: array + url: + type: string + description: + type: string + type: object + type: object + required: + - definitions + type: object + description: Flags defined in the Build Output API, used by this deployment. Primarily used by the Toolbar to know about the used flags. items: type: string - type: array - bootedAt: - type: number - buildErrorAt: - type: number - buildingAt: - type: number - canceledAt: - type: number - checksState: - type: string - enum: - - registered - - running - - completed - checksConclusion: - type: string - enum: - - succeeded - - failed - - skipped - - canceled - createdAt: - type: number - description: A number containing the date when the deployment was created in milliseconds - example: 1540257589405 - creator: + description: Flags defined in the Build Output API, used by this deployment. Primarily used by the Toolbar to know about the used flags. (opaque JSON object) + microfrontends: properties: - uid: + isDefaultApp: + type: boolean + enum: + - false + defaultAppProjectName: type: string - description: The ID of the user that created the deployment - example: 96SnxkFiMyVKsK3pnoHfx3Hz - username: + description: The project name of the default app of this deployment's microfrontends group. + defaultRoute: type: string - description: The username of the user that created the deployment - example: john-doe - required: - - uid - type: object - description: Information about the deployment creator - errorCode: - type: string - errorLink: - type: string - errorMessage: - nullable: true - type: string - errorStep: - type: string - gitSource: - oneOf: - - properties: - type: - type: string - enum: - - github - repoId: - oneOf: - - type: string - - type: number - ref: - nullable: true - type: string - sha: - type: string - prId: - nullable: true - type: number - required: - - type - - repoId - type: object - - properties: - type: - type: string - enum: - - github - org: - type: string - repo: - type: string - ref: - nullable: true - type: string - sha: - type: string - prId: - nullable: true - type: number - required: - - type - - org - - repo - type: object - - properties: - type: - type: string - enum: - - gitlab - projectId: - oneOf: - - type: string - - type: number - ref: - nullable: true - type: string - sha: - type: string - prId: - nullable: true - type: number - required: - - type - - projectId - type: object - - properties: - type: - type: string - enum: - - bitbucket - workspaceUuid: - type: string - repoUuid: - type: string - ref: - nullable: true - type: string - sha: + description: A path that is used to take screenshots and as the default path in preview links when a domain for this microfrontend is shown in the UI. + groupIds: + type: array + items: + type: string + minItems: 1 + description: The group of microfrontends that this project belongs to. Each microfrontend project must belong to a microfrontends group that is the set of microfrontends that are used together. + mfeConfigUploadState: + type: string + enum: + - no_config + - success + - waiting_on_build + description: The result of the microfrontends config upload during deployment creation / build. Only set for default app deployments. The config upload is attempted during deployment create, and then again during the build. If the config is not in the root directory, or the deployment is prebuilt, the config cannot be uploaded during deployment create. The upload during deployment build finds the config even if it's not in the root directory, as it has access to all files. Uploading the config during create is ideal, as then all child deployments are guaranteed to have access to the default app deployment config even if the default app has not yet started building. If the config is not uploaded, the child app will show as building until the config has been uploaded during the default app build. - `success` - The config was uploaded successfully, either when the deployment was created or during the build. - `waiting_on_build` - The config could not be uploaded during deployment create, will be attempted again during the build. - `no_config` - No config was found. Only set once the build has not found the config in any of the deployment's files. - `undefined` - Legacy deployments, or there was an error uploading the config during deployment create. + required: + - defaultAppProjectName + - groupIds + - isDefaultApp + type: object + platform: + properties: + source: + properties: + name: type: string - prId: - nullable: true - type: number + description: Display name of the platform. required: - - type - - repoUuid + - name type: object - - properties: + description: The external platform that created the deployment (e.g. its display name). + origin: + properties: type: type: string enum: - - bitbucket - owner: - type: string - slug: - type: string - ref: - nullable: true - type: string - sha: + - id + - url + description: Whether the value is an opaque identifier or a URL. + value: type: string - prId: - nullable: true - type: number + description: The identifier or URL pointing to the originating entity. required: - type - - owner - - slug + - value type: object - - properties: - type: - type: string - enum: - - custom - ref: - type: string - sha: + description: Reference back to the entity on the platform that initiated the deployment. + creator: + properties: + name: type: string - gitUrl: + description: Display name of the platform user. + avatar: type: string + description: URL of the platform user's avatar image. required: - - type - - ref - - sha - - gitUrl + - name type: object - - properties: - type: + description: The user on the external platform who triggered the deployment. + meta: + additionalProperties: + type: string + type: object + description: Arbitrary key-value metadata provided by the platform. + required: + - creator + - origin + - source + type: object + description: Metadata about the source platform that triggered the deployment. Allows us to map a deployment back to a platform (e.g. the chat that created it) + config: + properties: + version: + type: number + functionType: + type: string + enum: + - fluid + - standard + functionMemoryType: + type: string + enum: + - performance + - performance_xl + - standard + - standard_legacy + functionTimeout: + nullable: true + type: number + secureComputePrimaryRegion: + nullable: true + type: string + secureComputeFallbackRegion: + nullable: true + type: string + isUsingActiveCPU: + type: boolean + enum: + - false + - true + resourceConfig: + properties: + buildQueue: + properties: + configuration: + type: string + enum: + - SKIP_NAMESPACE_QUEUE + - WAIT_FOR_NAMESPACE_QUEUE + description: Build resource configuration snapshot for this deployment. + type: object + description: Build resource configuration snapshot for this deployment. + elasticConcurrency: type: string enum: - - github - ref: - type: string - sha: - type: string - repoId: - type: number - org: - type: string - repo: - type: string - required: - - type - - ref - - sha - - repoId + - PROJECT_SETTING + - SKIP_QUEUE + - TEAM_SETTING + description: 'When elastic concurrency is used for this deployment, a value is set. The value tells the reason where the setting was coming from. - TEAM_SETTING: Inherited from team settings - PROJECT_SETTING: Inherited from project settings - SKIP_QUEUE: Manually triggered by user to skip the queues' + buildMachine: + properties: + purchaseType: + nullable: true + type: string + enum: + - basic + - enhanced + - standard + - turbo + - null + description: Machine type that was used for the build. + type: object type: object - - properties: - type: + description: Build resource configuration snapshot for this deployment. + required: + - functionMemoryType + - functionTimeout + - functionType + - secureComputeFallbackRegion + - secureComputePrimaryRegion + type: object + description: Since February 2025 the configuration must include snapshot data at the time of deployment creation to capture properties for the /deployments/:id/config endpoint utilized for displaying Deployment Configuration on the frontend This is optional because older deployments may not have this data captured + checks: + properties: + deployment-alias: + properties: + state: type: string enum: - - gitlab - ref: - type: string - sha: - type: string - projectId: + - failed + - pending + - succeeded + startedAt: + type: number + completedAt: type: number required: - - type - - ref - - sha - - projectId + - startedAt + - state type: object - - properties: - type: + description: Condensed check data. Retrieve individual check and check run data using api-checks v2 routes. + required: + - deployment-alias + type: object + seatBlock: + properties: + blockCode: + type: string + enum: + - COMMIT_AUTHOR_REQUIRED + - TEAM_ACCESS_REQUIRED + description: 'The NSNB decision code for the seat block. TODO: We should consolidate block types.' + userId: + type: string + description: The blocked vercel user ID. + isVerified: + type: boolean + enum: + - false + - true + description: Determines if the user was verified during the block. In the git integration case, the commit sender was the author. + gitUserId: + oneOf: + - type: string + - type: number + gitProvider: + type: string + enum: + - bitbucket + - github + - gitlab + description: The git provider type associated with gitUserId. + required: + - blockCode + type: object + description: NSNB Blocked metadata + attribution: + properties: + commitMeta: + properties: + email: type: string - enum: - - bitbucket - ref: + description: Email from git commit author + name: type: string - sha: + description: Name from git commit author + isVerified: + type: boolean + enum: + - false + - true + description: Whether the commit was signed/verified (GitHub only, others return undefined) + type: object + description: Commit metadata from the git commit author + gitUser: + properties: + id: + oneOf: + - type: string + - type: number + login: type: string - owner: + description: Git provider username/login + type: type: string - slug: + description: User type + provider: type: string - workspaceUuid: + description: The git provider (github, gitlab, bitbucket) + required: + - id + - login + type: object + description: Git provider user associated with the commit author email (only set if resolved) + vercelUser: + properties: + id: type: string - repoUuid: + description: Vercel user ID + username: type: string + description: Vercel username + teamRoles: + items: + type: string + type: array + description: Team roles at time of deployment required: - - type - - ref - - sha - - workspaceUuid - - repoUuid + - id + - username type: object - id: - type: string - description: A string holding the unique ID of the deployment - example: dpl_89qyp1cskzkLrVicDaZoDbjyHuDJ + description: Vercel user linked to the git provider account (only set if resolved) + type: object + description: Attribution metadata for the deployment, linking commit author to git and Vercel users. Only populated when the `enable-deployment-attribution` flag is enabled. required: + - aliasAssigned + - bootedAt - build + - buildSkipped + - buildingAt + - createdAt - createdIn + - creator - env + - id - inspectorUrl - isInConcurrentBuildsQueue + - isInSystemBuildsQueue - meta - name - ownerId - plan - projectId - - routes + - projectSettings - public - readyState - regions + - routes + - status - type - url - version - - alias - - aliasAssigned - - bootedAt - - buildingAt - - createdAt - - creator - - id type: object + description: Returns the updated deployment object with `readyState` set to `CANCELED`. The build has been stopped and this action is irreversible. '400': description: One of the provided values in the request query is invalid. '401': - description: '' + description: The request is not authorized. '403': description: You do not have permission to access this resource. '404': description: '' + '410': + description: '' + x-vercel-cli: + supportedSubcommands: true + supportedProduction: false parameters: - name: id description: The unique identifier of the deployment. @@ -6103,15 +13629,118 @@ paths: type: string example: dpl_5WJWYSyB7BpgTj3EuwF37WMRBXBtPQ2iTMJHJBJyRfd description: The unique identifier of the deployment. - - description: The Team identifier or slug to perform the request on behalf of. + x-vercel-cli: + kind: argument + - description: The Team identifier to perform the request on behalf of. in: query name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + /v1/projects/{project_id}/deployments/{deployment_id}/runtime-logs: + get: + description: Returns a stream of logs for a given deployment. + operationId: getRuntimeLogs + security: + - bearerToken: [] + summary: Get logs for a deployment + tags: + - logs + responses: + '200': + description: '' + content: + application/stream+json: + schema: + properties: + level: + type: string + enum: + - debug + - error + - fatal + - info + - trace + - warning + message: + type: string + rowId: + type: string + source: + type: string + enum: + - delimiter + - edge-function + - edge-middleware + - request + - serverless + timestampInMs: + type: number + domain: + type: string + messageTruncated: + type: boolean + enum: + - false + - true + requestMethod: + type: string + requestPath: + type: string + responseStatusCode: + type: number + required: + - domain + - level + - message + - messageTruncated + - requestMethod + - requestPath + - responseStatusCode + - rowId + - source + - timestampInMs + type: object + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '410': + description: '' + parameters: + - name: project_id + in: path + required: true + schema: + type: string + - name: deployment_id + in: path required: true schema: type: string + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug /v2/files: post: - description: 'Before you create a deployment you need to upload the required files for that deployment. To do it, you need to first upload each file to this endpoint. Once that''s completed, you can create a new deployment with the uploaded files. The file content must be placed inside the body of the request. In the case of a successful response you''ll receive a status code 200 with an empty body.' + description: Before you create a deployment you need to upload the required files for that deployment. To do it, you need to first upload each file to this endpoint. Once that's completed, you can create a new deployment with the uploaded files. The file content must be placed inside the body of the request. In the case of a successful response you'll receive a status code 200 with an empty body. operationId: uploadFile security: - bearerToken: [] @@ -6126,28 +13755,30 @@ paths: content: application/json: schema: - oneOf: - - properties: - urls: - items: - type: string - type: array - description: Array of URLs where the file was updated - example: - - example-upload.aws.com - required: - - urls - type: object - - type: object + properties: + urls: + items: + type: string + type: array + description: Array of URLs where the file was updated + example: + - example-upload.aws.com + required: + - urls + type: object '400': description: |- One of the provided values in the headers is invalid Digest is not valid File size is not valid '401': - description: '' + description: The request is not authorized. '403': description: You do not have permission to access this resource. + '410': + description: '' + '426': + description: '' parameters: - in: header description: The file size in bytes @@ -6165,10 +13796,10 @@ paths: - in: header description: The file SHA1 used to check the integrity schema: - deprecated: true type: string description: The file SHA1 used to check the integrity maxLength: 40 + deprecated: true name: x-now-digest - in: header description: The file size as an alternative to `Content-Length` @@ -6177,15 +13808,26 @@ paths: deprecated: true description: The file size as an alternative to `Content-Length` name: x-now-size - - description: The Team identifier or slug to perform the request on behalf of. + - description: The Team identifier to perform the request on behalf of. in: query name: teamId - required: true schema: type: string - '/v6/deployments/{id}/files': + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + requestBody: + content: + application/octet-stream: + schema: + $ref: '#/components/schemas/StackqlOctetStreamBody' + /v6/deployments/{id}/files: get: - description: Allows to retrieve the file structure of a deployment by supplying the deployment unique identifier. + description: Allows to retrieve the file structure of the source code of a deployment by supplying the deployment unique identifier. If the deployment was created with the Vercel CLI or the API directly with the `files` key, it will have a file tree that can be retrievable. operationId: listDeploymentFiles security: - bearerToken: [] @@ -6198,19 +13840,19 @@ paths: content: application/json: schema: - items: - $ref: '#/components/schemas/FileTree' - type: array + $ref: '#/components/schemas/ListDeploymentFilesResponse' '400': description: One of the provided values in the request query is invalid. '401': - description: '' + description: The request is not authorized. '403': description: You do not have permission to access this resource. '404': description: |- File tree not found Deployment not found + '410': + description: '' parameters: - name: id description: The unique deployment identifier @@ -6219,15 +13861,21 @@ paths: schema: description: The unique deployment identifier type: string - - description: The Team identifier or slug to perform the request on behalf of. + - description: The Team identifier to perform the request on behalf of. in: query name: teamId - required: true schema: type: string - '/v6/deployments/{id}/files/{fileId}': + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + /v8/deployments/{id}/files/{file_id}: get: - description: Allows to retrieve the content of a file by supplying the file identifier and the deployment unique identifier. The response body will contain the raw content of the file. + description: Allows to retrieve the content of a file by supplying the file identifier and the deployment unique identifier. The response body will contain a JSON response containing the contents of the file encoded as base64. operationId: getDeploymentFileContents security: - bearerToken: [] @@ -6238,13 +13886,15 @@ paths: '400': description: One of the provided values in the request query is invalid. '401': - description: '' + description: The request is not authorized. '403': description: You do not have permission to access this resource. '404': description: |- File not found Deployment not found + '410': + description: Invalid API version. parameters: - name: id description: The unique deployment identifier @@ -6253,7 +13903,7 @@ paths: schema: description: The unique deployment identifier type: string - - name: fileId + - name: file_id description: The unique file identifier in: path required: true @@ -6267,15 +13917,21 @@ paths: schema: description: Path to the file to fetch (only for Git deployments) type: string - - description: The Team identifier or slug to perform the request on behalf of. + - description: The Team identifier to perform the request on behalf of. in: query name: teamId - required: true schema: type: string - /v6/deployments: + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + /v7/deployments: get: - description: 'List deployments under the authenticated user or team. If a deployment hasn''t finished uploading (is incomplete), the `url` property will have a value of `null`.' + description: List deployments under the authenticated user or team. If a deployment hasn't finished uploading (is incomplete), the `url` property will have a value of `null`. operationId: getDeployments security: - bearerToken: [] @@ -6294,6 +13950,19 @@ paths: deployments: items: properties: + createdAt: + type: number + readyState: + type: string + enum: + - BLOCKED + - BUILDING + - CANCELED + - DELETED + - ERROR + - INITIALIZING + - QUEUED + - READY uid: type: string description: The unique identifier of the deployment. @@ -6302,6 +13971,9 @@ paths: type: string description: The name of the deployment. example: docs + projectId: + type: string + description: The project ID of the deployment url: type: string description: The URL of the deployment. @@ -6310,36 +13982,51 @@ paths: type: number description: Timestamp of when the deployment got created. example: 1609492210000 + defaultRoute: + type: string + description: The default route that should be used for screenshots and links if configured with microfrontends. + example: /docs + deleted: + type: number + description: Timestamp of when the deployment got deleted. + example: 1609492210000 + undeleted: + type: number + description: Timestamp of when the deployment was undeleted. + example: 1609492210000 + softDeletedByRetention: + type: boolean + enum: + - false + - true + description: Optional flag to indicate if the deployment was soft deleted by retention policy. + example: true source: type: string enum: + - api-trigger-git-deploy - cli + - clone/repo + - drop - git + - git-deploy-hook - import - import/repo - - clone/repo + - redeploy + - v0-web description: The source of the deployment. example: cli state: type: string enum: + - BLOCKED - BUILDING - - ERROR - - INITIALIZING - - QUEUED - - READY - CANCELED - description: In which state is the deployment. - example: READY - readyState: - type: string - enum: - - BUILDING + - DELETED - ERROR - INITIALIZING - QUEUED - READY - - CANCELED description: In which state is the deployment. example: READY type: @@ -6352,8 +14039,16 @@ paths: properties: uid: type: string - description: The unique identifier of the user. + description: Stable creator id across principal types. This may be a user ID, an app ID, an integration configuration ID, or `system`. example: eLrCnEgbKhsHyfbiNR7E8496 + type: + type: string + enum: + - app + - integration + - system + - user + description: Principal type of the deployment creator. Defaults to `"user"` if absent (legacy deployments created before principal attribution was recorded). email: type: string description: The email address of the user. @@ -6373,7 +14068,7 @@ paths: required: - uid type: object - description: Metadata information of the user who created the deployment. + description: Metadata information of the deployment creator. meta: additionalProperties: type: string @@ -6386,6 +14081,7 @@ paths: enum: - production - staging + - null description: On which environment has the deployment been deployed to. example: production aliasError: @@ -6405,10 +14101,9 @@ paths: oneOf: - type: number - type: boolean - createdAt: - type: number - description: Timestamp of when the deployment got created. - example: 1609492210000 + enum: + - false + - true buildingAt: type: number description: Timestamp of when the deployment started building at. @@ -6420,87 +14115,192 @@ paths: readySubstate: type: string enum: - - STAGED - PROMOTED - description: 'Since June 2023 Substate of deployment when readyState is ''READY'' Tracks whether or not deployment has seen production traffic: - STAGED: never seen production traffic - PROMOTED: has seen production traffic' + - ROLLING + - STAGED + description: 'Substate of deployment when readyState is ''READY'' Tracks whether or not deployment has seen production traffic: - STAGED: never seen production traffic - ROLLING: in the process of gradually transitioning production traffic - PROMOTED: has seen production traffic' checksState: type: string enum: + - completed - registered - running - - completed description: State of all registered checks checksConclusion: type: string enum: - - succeeded + - canceled - failed - skipped - - canceled + - succeeded description: Conclusion for checks + checks: + properties: + deployment-alias: + properties: + state: + type: string + enum: + - failed + - pending + - succeeded + startedAt: + type: number + completedAt: + type: number + required: + - startedAt + - state + type: object + description: Detailed information about v2 deployment checks. Includes information about blocked workflows in the deployment lifecycle. + required: + - deployment-alias + type: object + description: Detailed information about v2 deployment checks. Includes information about blocked workflows in the deployment lifecycle. inspectorUrl: nullable: true type: string description: Vercel URL to inspect the deployment. - example: 'https://vercel.com/acme/nextjs/J1hXN00qjUeoYfpEEf7dnDtpSiVq' + example: https://vercel.com/acme/nextjs/J1hXN00qjUeoYfpEEf7dnDtpSiVq + errorCode: + type: string + description: Error code when the deployment is in an error state. + example: BUILD_FAILED + errorMessage: + nullable: true + type: string + description: Error message when the deployment is in an canceled or error state. + example: The Deployment has been canceled because this project was not affected + oomReport: + type: string + enum: + - out-of-memory + description: Indicates if the deployment encountered an out-of-memory error. + example: out-of-memory isRollbackCandidate: nullable: true type: boolean + enum: + - false + - true + - null description: Deployment can be used for instant rollback + prebuilt: + type: boolean + enum: + - false + - true + manualProvisioning: + properties: + state: + type: string + enum: + - COMPLETE + - PENDING + - TIMEOUT + description: Current provisioning state + completedAt: + type: number + description: Timestamp when manual provisioning completed + required: + - state + type: object projectSettings: properties: framework: nullable: true type: string enum: - - blitzjs - - nextjs - - gatsby - - remix + - actix-web + - angular + - ash - astro - - hexo - - eleventy - - docusaurus-2 + - axum + - blitzjs + - brunch + - bun + - container + - create-react-app + - django - docusaurus - - preact - - solidstart + - docusaurus-2 - dojo + - eleventy + - elysia - ember - - vue - - scully + - eve + - express + - factory-eve + - fastapi + - fasthtml + - fastify + - flask + - gatsby + - go + - gridsome + - h3 + - hexo + - hono + - hugo + - hydrogen - ionic-angular - - angular + - ionic-react + - jekyll + - koa + - mastra + - middleman + - nestjs + - nextjs + - nitro + - node + - nuxtjs + - parcel - polymer + - preact + - python + - react-router + - redwoodjs + - remix + - ruby + - rust + - saber + - sanity + - sanity-v2 + - sapper + - scully + - services + - solidstart + - solidstart-1 + - stencil + - storybook - svelte - sveltekit - sveltekit-1 - - ionic-react - - create-react-app - - gridsome + - tanstack-start + - tanstack-start-lovable - umijs - - sapper - - saber - - stencil - - nuxtjs - - redwoodjs - - hugo - - jekyll - - brunch - - middleman - - zola - - hydrogen - vite - vitepress + - vue - vuepress - - parcel - - sanity - - storybook + - xmcp + - zola + - null gitForkProtection: type: boolean + enum: + - false + - true customerSupportCodeVisibility: type: boolean + enum: + - false + - true gitLFS: type: boolean + enum: + - false + - true devCommand: nullable: true type: string @@ -6513,77 +14313,300 @@ paths: nodeVersion: type: string enum: - - 18.x - - 16.x - - 14.x - - 12.x - 10.x + - 12.x + - 14.x + - 16.x + - 18.x + - 20.x + - 22.x + - 24.x + - 8.10.x outputDirectory: nullable: true type: string - publicSource: - nullable: true - type: boolean rootDirectory: nullable: true type: string - serverlessFunctionRegion: - nullable: true - type: string sourceFilesOutsideRootDirectory: type: boolean + enum: + - false + - true commandForIgnoringBuildStep: nullable: true type: string createdAt: type: number + speedInsights: + properties: + id: + type: string + enabledAt: + type: number + disabledAt: + type: number + canceledAt: + type: number + hasData: + type: boolean + enum: + - false + - true + dataReceivedAt: + type: number + description: When the first free (not Speed Insights Plus) production data point was observed, in ms. Set once by subscriber-analytics-events; projects that already had data before this field shipped get it backfilled on their next batch, so it reads "first free data point observed", not necessarily "first ever". + paidAt: + type: number + required: + - id + type: object + webAnalytics: + properties: + id: + type: string + disabledAt: + type: number + canceledAt: + type: number + enabledAt: + type: number + hasData: + type: boolean + enum: + - true + required: + - id + type: object skipGitConnectDuringLink: type: boolean - gitComments: + enum: + - false + - true + gitComments: + properties: + onPullRequest: + type: boolean + enum: + - false + - true + description: Whether the Vercel bot should comment on PRs + onCommit: + type: boolean + enum: + - false + - true + description: Whether the Vercel bot should comment on commits + required: + - onCommit + - onPullRequest + type: object + description: Since June '23 + type: object + description: The project settings which was used for this deployment + connectBuildsEnabled: + type: boolean + enum: + - false + - true + description: The flag saying if Secure Compute network is used for builds + connectConfigurationId: + type: string + description: The ID of Secure Compute network used for this deployment + passiveConnectConfigurationId: + type: string + description: The ID of Secure Compute network used for this deployment's passive functions + expiration: + type: number + description: The expiration configured by the project retention policy + proposedExpiration: + type: number + description: The expiration proposed to replace the existing expiration + platform: + properties: + source: + properties: + name: + type: string + description: Display name of the platform. + required: + - name + type: object + description: The external platform that created the deployment (e.g. its display name). + origin: + properties: + type: + type: string + enum: + - id + - url + description: Whether the value is an opaque identifier or a URL. + value: + type: string + description: The identifier or URL pointing to the originating entity. + required: + - type + - value + type: object + description: Reference back to the entity on the platform that initiated the deployment. + creator: + properties: + name: + type: string + description: Display name of the platform user. + avatar: + type: string + description: URL of the platform user's avatar image. + required: + - name + type: object + description: The user on the external platform who triggered the deployment. + meta: + additionalProperties: + type: string + type: object + description: Arbitrary key-value metadata provided by the platform. + required: + - creator + - origin + - source + type: object + description: Metadata about the source platform that triggered the deployment. + customEnvironment: + properties: + id: + type: string + slug: + type: string + required: + - id + type: object + description: The custom environment used for this deployment, if any + seatBlock: + properties: + blockCode: + type: string + enum: + - COMMIT_AUTHOR_REQUIRED + - TEAM_ACCESS_REQUIRED + description: 'The NSNB decision code for the seat block. TODO: We should consolidate block types.' + userId: + type: string + description: The blocked vercel user ID. + isVerified: + type: boolean + enum: + - false + - true + description: Determines if the user was verified during the block. In the git integration case, the commit sender was the author. + gitUserId: + oneOf: + - type: string + - type: number + gitProvider: + type: string + enum: + - bitbucket + - github + - gitlab + description: The git provider type associated with gitUserId. + required: + - blockCode + type: object + description: NSNB Blocked metadata + attribution: + properties: + commitMeta: properties: - onPullRequest: - type: boolean - description: Whether the Vercel bot should comment on PRs - onCommit: + email: + type: string + description: Email from git commit author + name: + type: string + description: Name from git commit author + isVerified: type: boolean - description: Whether the Vercel bot should comment on commits + enum: + - false + - true + description: Whether the commit was signed/verified (GitHub only, others return undefined) + type: object + description: Commit metadata from the git commit author + gitUser: + properties: + id: + oneOf: + - type: string + - type: number + login: + type: string + description: Git provider username/login + type: + type: string + description: User type + provider: + type: string + description: The git provider (github, gitlab, bitbucket) required: - - onPullRequest - - onCommit + - id + - login type: object - description: Since June '23 + description: Git provider user associated with the commit author email (only set if resolved) + vercelUser: + properties: + id: + type: string + description: Vercel user ID + username: + type: string + description: Vercel username + teamRoles: + items: + type: string + type: array + description: Team roles at time of deployment + required: + - id + - username + type: object + description: Vercel user linked to the git provider account (only set if resolved) type: object - description: The project settings which was used for this deployment - connectBuildsEnabled: - type: boolean - description: The flag saying if Vercel Connect configuration is used for builds - connectConfigurationId: - type: string - description: The ID of Vercel Connect configuration used for this deployment + description: Commit attribution metadata required: - - uid - - name - - url - created - - type + - createdAt - creator - inspectorUrl + - name + - projectId + - readyState + - type + - uid + - url type: object type: array required: - - pagination - deployments + - pagination type: object '400': description: One of the provided values in the request query is invalid. '401': - description: '' + description: The request is not authorized. '403': description: You do not have permission to access this resource. '404': description: '' + '410': + description: '' '422': description: '' + x-vercel-cli: + supportedSubcommands: true + supportedProduction: false + aliases: + - ls + - list parameters: - name: app description: Name of the deployment. @@ -6608,21 +14631,31 @@ paths: type: number example: 10 - name: projectId - description: Filter deployments from the given `projectId`. + description: Filter deployments from the given ID or name. in: query schema: - description: Filter deployments from the given `projectId`. + description: Filter deployments from the given ID or name. type: string example: QmXGTs7mvAMMC7WW5ebrM33qKG32QK3h4vmQMjmY + - name: projectIds + description: Filter deployments from the given project IDs. Cannot be used when projectId is specified. + in: query + schema: + description: Filter deployments from the given project IDs. Cannot be used when projectId is specified. + type: array + items: + type: string + example: + - prj_123 + - prj_456 + minItems: 1 + maxItems: 20 - name: target description: Filter deployments based on the environment. in: query schema: description: Filter deployments based on the environment. type: string - enum: - - production - - preview example: production - name: to description: 'Gets the deployment created before this Date timestamp. (default: current time)' @@ -6638,7 +14671,7 @@ paths: schema: description: Filter out deployments based on users who have created the deployment. type: string - example: 'kr1PsOIzqEL5Xg6M4VZcZosf,K4amb7K9dAt5R2vBJWF32bmY' + example: kr1PsOIzqEL5Xg6M4VZcZosf,K4amb7K9dAt5R2vBJWF32bmY - name: since description: Get Deployments created after this JavaScript timestamp. in: query @@ -6654,27 +14687,45 @@ paths: type: number example: 1540095775951 - name: state - description: 'Filter deployments based on their state (`BUILDING`, `ERROR`, `INITIALIZING`, `QUEUED`, `READY`, `CANCELED`)' + description: Filter deployments based on their state (`BUILDING`, `ERROR`, `INITIALIZING`, `QUEUED`, `READY`, `CANCELED`, `BLOCKED`) in: query schema: - description: 'Filter deployments based on their state (`BUILDING`, `ERROR`, `INITIALIZING`, `QUEUED`, `READY`, `CANCELED`)' + description: Filter deployments based on their state (`BUILDING`, `ERROR`, `INITIALIZING`, `QUEUED`, `READY`, `CANCELED`, `BLOCKED`) type: string - example: 'BUILDING,READY' + example: BUILDING,READY - name: rollbackCandidate description: Filter deployments based on their rollback candidacy in: query schema: description: Filter deployments based on their rollback candidacy type: boolean - - description: The Team identifier or slug to perform the request on behalf of. + - name: branch + description: Filter deployments based on the branch name + in: query + schema: + description: Filter deployments based on the branch name + type: string + - name: sha + description: Filter deployments based on the SHA + in: query + schema: + description: Filter deployments based on the SHA + type: string + - description: The Team identifier to perform the request on behalf of. in: query name: teamId - required: true schema: type: string - '/v13/deployments/{id}': + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + /v13/deployments/{id}: delete: - description: 'This API allows you to delete a deployment, either by supplying its `id` in the URL or the `url` of the deployment as a query parameter. You can obtain the ID, for example, by listing all deployments.' + description: This API allows you to delete a deployment, either by supplying its `id` in the URL or the `url` of the deployment as a query parameter. You can obtain the ID, for example, by listing all deployments. operationId: deleteDeployment security: - bearerToken: [] @@ -6698,17 +14749,19 @@ paths: - DELETED description: A constant with the final state of the deployment. required: - - uid - state + - uid type: object '400': description: One of the provided values in the request query is invalid. '401': - description: '' + description: The request is not authorized. '403': description: You do not have permission to access this resource. '404': description: The deployment was not found + '410': + description: '' parameters: - name: id description: The ID of the deployment to be deleted @@ -6719,16 +14772,763 @@ paths: example: dpl_5WJWYSyB7BpgTj3EuwF37WMRBXBtPQ2iTMJHJBJyRfd type: string - name: url - description: 'A Deployment or Alias URL. In case it is passed, the ID will be ignored' + description: A Deployment or Alias URL. In case it is passed, the ID will be ignored in: query required: false schema: - description: 'A Deployment or Alias URL. In case it is passed, the ID will be ignored' - example: 'https://files-orcin-xi.vercel.app/' + description: A Deployment or Alias URL. In case it is passed, the ID will be ignored + example: https://files-orcin-xi.vercel.app/ type: string - - description: The Team identifier or slug to perform the request on behalf of. + - description: The Team identifier to perform the request on behalf of. in: query name: teamId - required: true schema: type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug +components: + schemas: + FlagJSONValue: + nullable: true + type: string + items: + $ref: '#/components/schemas/FlagJSONValue' + description: 'TODO: The following types will eventually be exported by a more relevant package.' + additionalProperties: + $ref: '#/components/schemas/FlagJSONValue' + enum: + - false + - true + FileTree: + properties: + name: + type: string + description: The name of the file tree entry + example: my-file.json + type: + type: string + enum: + - directory + - file + - invalid + - lambda + - middleware + - symlink + description: String indicating the type of file tree entry. + example: file + uid: + type: string + description: The unique identifier of the file (only valid for the `file` type) + example: 2d4aad419917f15b1146e9e03ddc9bb31747e4d0 + children: + items: + $ref: '#/components/schemas/FileTree' + type: array + description: The list of children files of the directory (only valid for the `directory` type) + contentType: + type: string + description: The content-type of the file (only valid for the `file` type) + example: application/json + mode: + type: number + description: The file "mode" indicating file type and permissions. + required: + - mode + - name + - type + type: object + description: A deployment file tree entry + Pagination: + properties: + count: + type: number + description: Amount of items in the current page. + example: 20 + next: + nullable: true + type: number + description: Timestamp that must be used to request the next page. + example: 1540095775951 + prev: + nullable: true + type: number + description: Timestamp that must be used to request the previous page. + example: 1540095775951 + required: + - count + - next + - prev + type: object + description: This object contains information related to the pagination of the current request, including the necessary parameters to get the next or previous page of data. + GetDeploymentEventsResponse: + type: object + properties: + deployment_events: + type: array + items: + oneOf: + - properties: + type: + type: string + enum: + - command + - delimiter + - deployment-state + - edge-function-invocation + - exit + - fatal + - metric + - middleware + - middleware-invocation + - report + - stderr + - stdout + created: + type: number + payload: + properties: + deploymentId: + type: string + info: + properties: + type: + type: string + name: + type: string + entrypoint: + type: string + path: + type: string + step: + type: string + readyState: + type: string + serviceName: + type: string + required: + - name + - type + type: object + text: + type: string + id: + type: string + date: + type: number + serial: + type: string + created: + type: number + statusCode: + type: number + requestId: + type: string + proxy: + properties: + timestamp: + type: number + method: + type: string + host: + type: string + path: + type: string + statusCode: + type: number + userAgent: + items: + type: string + type: array + referer: + type: string + clientIp: + type: string + region: + type: string + scheme: + type: string + responseByteSize: + type: number + cacheId: + type: string + pathType: + type: string + pathTypeVariant: + type: string + vercelId: + type: string + vercelCache: + type: string + enum: + - BYPASS + - HIT + - MISS + - PRERENDER + - REVALIDATED + - STALE + lambdaRegion: + type: string + wafAction: + type: string + enum: + - bypass + - challenge + - deny + - log + - rate_limit + wafRuleId: + type: string + required: + - host + - method + - timestamp + type: object + required: + - date + - deploymentId + - id + - serial + type: object + required: + - created + - payload + - type + type: object + - properties: + created: + type: number + date: + type: number + deploymentId: + type: string + id: + type: string + info: + properties: + type: + type: string + name: + type: string + entrypoint: + type: string + path: + type: string + step: + type: string + readyState: + type: string + serviceName: + type: string + required: + - name + - type + type: object + serial: + type: string + text: + type: string + type: + type: string + enum: + - command + - delimiter + - deployment-state + - edge-function-invocation + - exit + - fatal + - metric + - middleware + - middleware-invocation + - report + - stderr + - stdout + level: + type: string + enum: + - error + - warning + required: + - created + - date + - deploymentId + - id + - info + - serial + - type + type: object + - oneOf: + - properties: + type: + type: string + enum: + - command + - delimiter + - deployment-state + - edge-function-invocation + - exit + - fatal + - metric + - middleware + - middleware-invocation + - report + - stderr + - stdout + created: + type: number + payload: + properties: + deploymentId: + type: string + info: + properties: + type: + type: string + name: + type: string + entrypoint: + type: string + path: + type: string + step: + type: string + readyState: + type: string + serviceName: + type: string + required: + - name + - type + type: object + text: + type: string + id: + type: string + date: + type: number + serial: + type: string + created: + type: number + statusCode: + type: number + requestId: + type: string + proxy: + properties: + timestamp: + type: number + method: + type: string + host: + type: string + path: + type: string + statusCode: + type: number + userAgent: + items: + type: string + type: array + referer: + type: string + clientIp: + type: string + region: + type: string + scheme: + type: string + responseByteSize: + type: number + cacheId: + type: string + pathType: + type: string + pathTypeVariant: + type: string + vercelId: + type: string + vercelCache: + type: string + enum: + - BYPASS + - HIT + - MISS + - PRERENDER + - REVALIDATED + - STALE + lambdaRegion: + type: string + wafAction: + type: string + enum: + - bypass + - challenge + - deny + - log + - rate_limit + wafRuleId: + type: string + required: + - host + - method + - timestamp + type: object + required: + - date + - deploymentId + - id + - serial + type: object + required: + - created + - payload + - type + type: object + - properties: + created: + type: number + date: + type: number + deploymentId: + type: string + id: + type: string + info: + properties: + type: + type: string + name: + type: string + entrypoint: + type: string + path: + type: string + step: + type: string + readyState: + type: string + serviceName: + type: string + required: + - name + - type + type: object + serial: + type: string + text: + type: string + type: + type: string + enum: + - command + - delimiter + - deployment-state + - edge-function-invocation + - exit + - fatal + - metric + - middleware + - middleware-invocation + - report + - stderr + - stdout + level: + type: string + enum: + - error + - warning + required: + - created + - date + - deploymentId + - id + - info + - serial + - type + type: object + - properties: + type: + type: string + enum: + - alias-assigned + deploymentId: + type: string + date: + type: number + alias: + items: + type: string + type: array + aliasError: + nullable: true + properties: + code: + type: string + message: + type: string + required: + - code + - message + type: object + aliasWarning: + nullable: true + properties: + code: + type: string + message: + type: string + link: + type: string + action: + type: string + required: + - code + - message + type: object + required: + - alias + - aliasError + - aliasWarning + - date + - deploymentId + - type + type: object + nullable: true + ListDeploymentFilesResponse: + type: object + properties: + deployment_files: + type: array + items: + $ref: '#/components/schemas/FileTree' + StackqlTextResponse: + type: object + description: 'Wrapper for non-JSON response bodies (jsonl, ndjson, streamed json, octet-stream): one row carrying the raw body text.' + properties: + items: + type: array + items: + type: object + properties: + contents: + type: string + description: Raw response body. + StackqlOctetStreamBody: + type: object + description: 'Raw request body for octet-stream uploads: the text in `value` is sent verbatim as the request body.' + properties: + value: + type: string + description: Raw body content (sent as-is). + required: + - value + x-stackQL-resources: + deployment_events: + id: vercel.deployments.deployment_events + name: deployment_events + title: Deployment Events + methods: + list: + operation: + $ref: '#/paths/~1v3~1deployments~1{id_or_url}~1events/get' + response: + mediaType: application/json + openAPIDocKey: '200' + objectKey: $.deployment_events + overrideMediaType: application/json + schema_override: + $ref: '#/components/schemas/GetDeploymentEventsResponse' + transform: + body: |- + {{- $wrapped := printf "{\"deployment_events\":%s}" . -}} + {{- $wrapped -}} + type: golang_template_text_v0.3.0 + request: + nativeCasing: camel + config: + queryParamPushdown: + top: + paramName: limit + maxValue: 100 + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/deployment_events/methods/list' + insert: [] + update: [] + delete: [] + replace: [] + deployments: + id: vercel.deployments.deployments + name: deployments + title: Deployments + methods: + update_integration_action: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v1~1deployments~1{deployment_id}~1integrations~1{integration_configuration_id}~1resources~1{resource_id}~1actions~1{action}/patch' + response: + mediaType: application/json + openAPIDocKey: '202' + request: + nativeCasing: camel + get: + operation: + $ref: '#/paths/~1v13~1deployments~1{id_or_url}/get' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + create: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v13~1deployments/post' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + cancel: + operation: + $ref: '#/paths/~1v12~1deployments~1{id}~1cancel/patch' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + list: + operation: + $ref: '#/paths/~1v7~1deployments/get' + response: + mediaType: application/json + openAPIDocKey: '200' + objectKey: $.deployments + request: + nativeCasing: camel + config: + pagination: + requestToken: + key: until + location: query + responseToken: + key: $.pagination.next + location: body + queryParamPushdown: + top: + paramName: limit + maxValue: 100 + delete: + operation: + $ref: '#/paths/~1v13~1deployments~1{id}/delete' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/deployments/methods/get' + - $ref: '#/components/x-stackQL-resources/deployments/methods/list' + insert: + - $ref: '#/components/x-stackQL-resources/deployments/methods/create' + update: [] + delete: + - $ref: '#/components/x-stackQL-resources/deployments/methods/delete' + replace: [] + runtime_logs: + id: vercel.deployments.runtime_logs + name: runtime_logs + title: Runtime Logs + methods: + list: + operation: + $ref: '#/paths/~1v1~1projects~1{project_id}~1deployments~1{deployment_id}~1runtime-logs/get' + response: + mediaType: text/plain + openAPIDocKey: '200' + overrideMediaType: application/json + schema_override: + $ref: '#/components/schemas/StackqlTextResponse' + objectKey: $.items + transform: + type: golang_template_text_v0.3.0 + body: '{"items":[{"contents": {{ toJson . }}}]}' + request: + nativeCasing: camel + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/runtime_logs/methods/list' + insert: [] + update: [] + delete: [] + replace: [] + files: + id: vercel.deployments.files + name: files + title: Files + methods: + upload: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v2~1files/post' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + mediaType: application/octet-stream + required: + - value + schema_override: + $ref: '#/components/schemas/StackqlOctetStreamBody' + transform: + type: golang_template_json_v0.1.0 + body: '{{ .value }}' + nativeCasing: camel + sqlVerbs: + select: [] + insert: [] + update: [] + delete: [] + replace: [] + deployment_files: + id: vercel.deployments.deployment_files + name: deployment_files + title: Deployment Files + methods: + list: + operation: + $ref: '#/paths/~1v6~1deployments~1{id}~1files/get' + response: + mediaType: application/json + openAPIDocKey: '200' + objectKey: $.deployment_files + overrideMediaType: application/json + schema_override: + $ref: '#/components/schemas/ListDeploymentFilesResponse' + transform: + body: |- + {{- $wrapped := printf "{\"deployment_files\":%s}" . -}} + {{- $wrapped -}} + type: golang_template_text_v0.3.0 + request: + nativeCasing: camel + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/deployment_files/methods/list' + insert: [] + update: [] + delete: [] + replace: [] +servers: + - url: https://api.vercel.com diff --git a/provider-dev/openapi/src/vercel/v00.00.00000/services/dns.yaml b/provider-dev/openapi/src/vercel/v00.00.00000/services/dns.yaml index a214593..e67f2aa 100644 --- a/provider-dev/openapi/src/vercel/v00.00.00000/services/dns.yaml +++ b/provider-dev/openapi/src/vercel/v00.00.00000/services/dns.yaml @@ -1,99 +1,10 @@ openapi: 3.0.3 -servers: - - url: 'https://api.vercel.com' - description: Production API info: - contact: - email: support@vercel.com - name: Vercel Support - url: 'https://vercel.com/support' + title: dns API + description: vercel dns API version: 0.0.1 - title: Vercel API - dns - description: dns -components: - schemas: - Pagination: - properties: - count: - type: number - description: Amount of items in the current page. - example: 20 - next: - nullable: true - type: number - description: Timestamp that must be used to request the next page. - example: 1540095775951 - prev: - nullable: true - type: number - description: Timestamp that must be used to request the previous page. - example: 1540095775951 - required: - - count - - next - - prev - type: object - description: 'This object contains information related to the pagination of the current request, including the necessary parameters to get the next or previous page of data.' - responses: {} - securitySchemes: - bearerToken: - type: http - description: Default authentication mechanism - scheme: bearer - oauth2: - type: oauth2 - flows: - authorizationCode: - authorizationUrl: 'https://api.vercel.com/oauth/authorize' - tokenUrl: 'https://api.vercel.com/oauth/access_token' - scopes: {} - x-stackQL-resources: - domains_records: - id: vercel.dns.domains_records - name: domains_records - title: Domains Records - methods: - get_records: - operation: - $ref: '#/paths/~1v4~1domains~1{domain}~1records/get' - response: - mediaType: application/json - openAPIDocKey: '200' - objectKey: $._records - _get_records: - operation: - $ref: '#/paths/~1v4~1domains~1{domain}~1records/get' - response: - mediaType: application/json - openAPIDocKey: '200' - create_record: - operation: - $ref: '#/paths/~1v2~1domains~1{domain}~1records/post' - response: - mediaType: application/json - openAPIDocKey: '200' - update_record: - operation: - $ref: '#/paths/~1v1~1domains~1records~1{recordId}/patch' - response: - mediaType: application/json - openAPIDocKey: '200' - remove_record: - operation: - $ref: '#/paths/~1v2~1domains~1{domain}~1records~1{recordId}/delete' - response: - mediaType: application/json - openAPIDocKey: '200' - sqlVerbs: - select: - - $ref: '#/components/x-stackQL-resources/domains_records/methods/get_records' - insert: - - $ref: '#/components/x-stackQL-resources/domains_records/methods/create_record' - update: [] - delete: - - $ref: '#/components/x-stackQL-resources/domains_records/methods/remove_record' paths: - '/v4/domains/{domain}/records': + /v5/domains/{domain}/records: get: description: Retrieves a list of DNS records created for a domain name. By default it returns 20 records if no limit is provided. The rest can be retrieved using the pagination options. operationId: getRecords @@ -108,136 +19,89 @@ paths: content: application/json: schema: - oneOf: - - type: string - - properties: - records: - items: - properties: - id: - type: string - slug: - type: string - name: - type: string - type: - type: string - enum: - - A - - AAAA - - ALIAS - - CAA - - CNAME - - MX - - SRV - - TXT - - NS - value: - type: string - mxPriority: - type: number - priority: - type: number - creator: - type: string - created: - nullable: true - type: number - updated: - nullable: true - type: number - createdAt: - nullable: true - type: number - updatedAt: - nullable: true - type: number - required: - - id - - slug - - name - - type - - value - - creator - - created - - updated - - createdAt - - updatedAt - type: object - type: array - required: - - records - type: object - - properties: - records: - items: - properties: - id: - type: string - slug: - type: string - name: - type: string - type: - type: string - enum: - - A - - AAAA - - ALIAS - - CAA - - CNAME - - MX - - SRV - - TXT - - NS - value: - type: string - mxPriority: - type: number - priority: - type: number - creator: - type: string - created: - nullable: true - type: number - updated: - nullable: true - type: number - createdAt: - nullable: true - type: number - updatedAt: - nullable: true - type: number - required: - - id - - slug - - name - - type - - value - - creator - - created - - updated - - createdAt - - updatedAt - type: object - type: array - pagination: - $ref: '#/components/schemas/Pagination' - required: - - records - - pagination - type: object - description: Successful response retrieving a list of paginated DNS records. + properties: + records: + items: + properties: + id: + type: string + slug: + type: string + name: + type: string + type: + type: string + enum: + - A + - AAAA + - ALIAS + - CAA + - CNAME + - HTTPS + - MX + - NS + - SRV + - TXT + value: + type: string + mxPriority: + type: number + priority: + type: number + creator: + type: string + created: + nullable: true + type: number + updated: + nullable: true + type: number + createdAt: + nullable: true + type: number + updatedAt: + nullable: true + type: number + ttl: + type: number + comment: + type: string + required: + - created + - createdAt + - creator + - id + - name + - slug + - type + - updated + - updatedAt + - value + type: object + type: array + pagination: + $ref: '#/components/schemas/Pagination' + required: + - records + - pagination + type: object + description: Successful response retrieving a list of paginated DNS records. '400': description: One of the provided values in the request query is invalid. '401': - description: '' + description: The request is not authorized. '403': description: You do not have permission to access this resource. '404': description: '' + '410': + description: '' + x-vercel-cli: + supportedSubcommands: true + supportedProduction: false + aliases: + - ls + - list parameters: - name: domain in: path @@ -245,6 +109,8 @@ paths: schema: type: string example: example.com + x-vercel-cli: + kind: argument - name: limit description: Maximum number of records to list from a request. in: query @@ -269,13 +135,19 @@ paths: description: Get records created before this JavaScript timestamp. type: string example: 1612264332000 - - description: The Team identifier or slug to perform the request on behalf of. + - description: The Team identifier to perform the request on behalf of. in: query name: teamId - required: true schema: type: string - '/v2/domains/{domain}/records': + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + /v2/domains/{domain}/records: post: description: Creates a DNS record for a domain. operationId: createRecord @@ -290,40 +162,38 @@ paths: content: application/json: schema: - oneOf: - - properties: - uid: - type: string - updated: - type: number - required: - - uid - - updated - type: object - - properties: - uid: - type: string - description: The id of the newly created DNS record - example: rec_V0fra8eEgQwEpFhYG2vTzC3K - required: - - uid - type: object + properties: + uid: + type: string + updated: + type: number + required: + - updated + - uid + type: object '400': description: |- One of the provided values in the request body is invalid. One of the provided values in the request query is invalid. '401': - description: '' + description: The request is not authorized. '402': - description: |- - The account was soft-blocked for an unhandled reason. - The account is missing a payment so payment method must be updated + description: The account is missing a payment so payment method must be updated '403': description: You do not have permission to access this resource. '404': description: '' '409': description: '' + '410': + description: '' + x-vercel-cli: + supportedSubcommands: true + supportedProduction: false + bodyArguments: + - name + - type + - value parameters: - name: domain description: The domain used to create the DNS record. @@ -333,21 +203,34 @@ paths: description: The domain used to create the DNS record. type: string example: example.com - - description: The Team identifier or slug to perform the request on behalf of. + x-vercel-cli: + kind: argument + - description: The Team identifier to perform the request on behalf of. in: query name: teamId - required: true schema: type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug requestBody: content: application/json: schema: required: - type + - value + - name + - mxPriority + - srv + - https properties: type: - description: 'The type of record, it could be one of the valid DNS records.' + description: The type of record, it could be one of the valid DNS records. type: string enum: - A @@ -355,325 +238,94 @@ paths: - ALIAS - CAA - CNAME + - HTTPS - MX - SRV - TXT - NS - anyOf: - - type: object - additionalProperties: false - required: - - type - - value - - name - properties: - name: - description: A subdomain name or an empty string for the root domain. - type: string - example: subdomain - type: - description: Must be of type `A`. - type: string - enum: - - A - ttl: - description: The TTL value. Must be a number between 60 and 2147483647. Default value is 60. - type: number - minimum: 60 - maximum: 2147483647 - example: 60 - value: - description: The record value must be a valid IPv4 address. - type: string - format: ipv4 - example: 192.0.2.42 - comment: - type: string - description: A comment to add context on what this DNS record is for - example: used to verify ownership of domain - maxLength: 500 - - type: object - additionalProperties: false - required: - - type - - value - - name - properties: - name: - description: A subdomain name or an empty string for the root domain. - type: string - example: subdomain - type: - description: Must be of type `AAAA`. - type: string - enum: - - AAAA - ttl: - description: The TTL value. Must be a number between 60 and 2147483647. Default value is 60. - type: number - minimum: 60 - maximum: 2147483647 - example: 60 - value: - description: An AAAA record pointing to an IPv6 address. - type: string - format: ipv6 - example: '2001:DB8::42' - comment: - type: string - description: A comment to add context on what this DNS record is for - example: used to verify ownership of domain - maxLength: 500 - - type: object - additionalProperties: false - required: - - type - - value - - name - properties: - name: - description: A subdomain name or an empty string for the root domain. - type: string - example: subdomain - type: - description: Must be of type `ALIAS`. - type: string - enum: - - ALIAS - ttl: - description: The TTL value. Must be a number between 60 and 2147483647. Default value is 60. - type: number - minimum: 60 - maximum: 2147483647 - example: 60 - value: - description: An ALIAS virtual record pointing to a hostname resolved to an A record on server side. - type: string - example: cname.vercel-dns.com - comment: - type: string - description: A comment to add context on what this DNS record is for - example: used to verify ownership of domain - maxLength: 500 - - type: object - additionalProperties: false - required: - - type - - value - - name - properties: - name: - description: A subdomain name or an empty string for the root domain. - type: string - example: subdomain - type: - description: Must be of type `CAA`. - type: string - enum: - - CAA - ttl: - description: The TTL value. Must be a number between 60 and 2147483647. Default value is 60. - type: number - minimum: 60 - maximum: 2147483647 - example: 60 - value: - description: A CAA record to specify which Certificate Authorities (CAs) are allowed to issue certificates for the domain. - type: string - example: 0 issue \"letsencrypt.org\" - comment: - type: string - description: A comment to add context on what this DNS record is for - example: used to verify ownership of domain - maxLength: 500 - - type: object - additionalProperties: false - required: - - type - - name - properties: - name: - description: A subdomain name or an empty string for the root domain. - type: string - example: subdomain - type: - description: Must be of type `CNAME`. - type: string - enum: - - CNAME - ttl: - description: The TTL value. Must be a number between 60 and 2147483647. Default value is 60. - type: number - minimum: 60 - maximum: 2147483647 - example: 60 - value: - description: A CNAME record mapping to another domain name. - type: string - example: cname.vercel-dns.com - comment: - type: string - description: A comment to add context on what this DNS record is for - example: used to verify ownership of domain - maxLength: 500 - - type: object - additionalProperties: false - required: - - type - - value - - name - - mxPriority - properties: - name: - description: A subdomain name or an empty string for the root domain. - type: string - example: subdomain - type: - description: Must be of type `MX`. - type: string - enum: - - MX - ttl: - description: The TTL value. Must be a number between 60 and 2147483647. Default value is 60. - type: number - minimum: 60 - maximum: 2147483647 - example: 60 - value: - description: An MX record specifying the mail server responsible for accepting messages on behalf of the domain name. - type: string - example: 10 mail.example.com. - mxPriority: - type: number - minimum: 0 - maximum: 65535 - example: 10 - comment: - type: string - description: A comment to add context on what this DNS record is for - example: used to verify ownership of domain - maxLength: 500 - - type: object - additionalProperties: false - required: - - type - - name - - srv - properties: - name: - description: A subdomain name or an empty string for the root domain. - type: string - name: subdomain - type: - description: Must be of type `SRV`. - type: string - enum: - - SRV - ttl: - description: The TTL value. Must be a number between 60 and 2147483647. Default value is 60. - type: number - minimum: 60 - maximum: 2147483647 - example: 60 - srv: - type: object - additionalProperties: false - required: - - weight - - port - - priority - properties: - priority: - anyOf: - - type: number - minimum: 0 - maximum: 65535 - example: 10 - - type: 'null' - weight: - anyOf: - - type: number - minimum: 0 - maximum: 65535 - example: 10 - - type: 'null' - port: - anyOf: - - type: number - minimum: 0 - maximum: 65535 - example: 5000 - - type: 'null' - target: - type: string - example: host.example.com - comment: - type: string - description: A comment to add context on what this DNS record is for - example: used to verify ownership of domain - maxLength: 500 - - type: object + name: + description: A subdomain name or an empty string for the root domain. + type: string + example: subdomain + ttl: + description: The TTL value. Must be a number between 60 and 2147483647. Default value is 60. + type: number + minimum: 60 + maximum: 2147483647 + example: 60 + value: + description: The record value must be a valid IPv4 address. + type: string + format: ipv4 + example: 192.0.2.42 + comment: + type: string + description: A comment to add context on what this DNS record is for + example: used to verify ownership of domain + maxLength: 500 + mxPriority: + type: number + minimum: 0 + maximum: 65535 + example: 10 + srv: + type: object additionalProperties: false required: - - type - - value - - name + - weight + - port + - priority + - target properties: - name: - description: A subdomain name or an empty string for the root domain. - type: string - name: subdomain - type: - description: Must be of type `TXT`. - type: string - enum: - - TXT - ttl: - description: The TTL value. Must be a number between 60 and 2147483647. Default value is 60. - type: number - minimum: 60 - maximum: 2147483647 - example: 60 - value: - description: A TXT record containing arbitrary text. - type: string - example: hello - comment: + priority: + anyOf: + - type: number + minimum: 0 + maximum: 65535 + example: 10 + nullable: true + weight: + anyOf: + - type: number + minimum: 0 + maximum: 65535 + example: 10 + nullable: true + port: + anyOf: + - type: number + minimum: 0 + maximum: 65535 + example: 5000 + nullable: true + target: type: string - description: A comment to add context on what this DNS record is for - example: used to verify ownership of domain - maxLength: 500 - - type: object + example: host.example.com + https: + type: object additionalProperties: false required: - - type - - name + - priority + - target properties: - name: - description: A subdomain name. - type: string - example: subdomain - type: - description: Must be of type `NS`. - type: string - enum: - - NS - ttl: - description: The TTL value. Must be a number between 60 and 2147483647. Default value is 60. - type: number - minimum: 60 - maximum: 2147483647 - example: 60 - value: - description: An NS domain value. + priority: + anyOf: + - type: number + minimum: 0 + maximum: 65535 + example: 10 + nullable: true + target: type: string - example: ns1.example.com - comment: + example: host.example.com + params: type: string - description: A comment to add context on what this DNS record is for - example: used to verify ownership of domain - maxLength: 500 - '/v1/domains/records/{recordId}': + example: alpn=h2,h3 + type: object + additionalProperties: false + required: true + x-speakeasy-test: false + /v1/domains/records/{record_id}: patch: description: Updates an existing DNS record for a domain name. operationId: updateRecord @@ -689,18 +341,24 @@ paths: application/json: schema: properties: - comment: + id: + type: string + name: + type: string + type: + type: string + enum: + - record + - record-sys + value: type: string - createdAt: - nullable: true - type: number creator: type: string domain: type: string - id: - type: string - name: + ttl: + type: number + comment: type: string recordType: type: string @@ -710,19 +368,14 @@ paths: - ALIAS - CAA - CNAME + - HTTPS - MX + - NS - SRV - TXT - - NS - ttl: + createdAt: + nullable: true type: number - type: - type: string - enum: - - record - - record-sys - value: - type: string required: - creator - domain @@ -737,19 +390,22 @@ paths: One of the provided values in the request body is invalid. One of the provided values in the request query is invalid. '401': - description: '' + description: The request is not authorized. '402': - description: |- - The account was soft-blocked for an unhandled reason. - The account is missing a payment so payment method must be updated + description: The account is missing a payment so payment method must be updated '403': description: You do not have permission to access this resource. '404': description: '' '409': description: '' + '410': + description: '' + x-vercel-cli: + supportedSubcommands: true + supportedProduction: false parameters: - - name: recordId + - name: record_id description: The id of the DNS record in: path required: true @@ -757,16 +413,25 @@ paths: description: The id of the DNS record example: rec_2qn7pzrx89yxy34vezpd31y9 type: string - - description: The Team identifier or slug to perform the request on behalf of. + x-vercel-cli: + kind: argument + - description: The Team identifier to perform the request on behalf of. in: query name: teamId - required: true schema: type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug requestBody: content: application/json: schema: + additionalProperties: false properties: name: type: string @@ -785,10 +450,12 @@ paths: - ALIAS - CAA - CNAME + - HTTPS - MX - SRV - TXT - NS + - null type: string description: The type of the DNS record example: A @@ -833,13 +500,162 @@ paths: nullable: true type: object nullable: true + https: + additionalProperties: false + required: + - priority + - target + properties: + priority: + description: '' + type: integer + nullable: true + target: + type: string + description: '' + example: example2.com. + maxLength: 255 + nullable: true + params: + description: '' + type: string + nullable: true + type: object + nullable: true comment: type: string description: A comment to add context on what this DNS record is for example: used to verify ownership of domain maxLength: 500 type: object - '/v2/domains/{domain}/records/{recordId}': + required: true + /domains/{domain}/records: + put: + description: '' + operationId: replaceDomainsByDomainRecords + security: [] + tags: [] + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + recordIds: + items: + type: string + type: array + required: + - recordIds + type: object + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '409': + description: '' + '410': + description: '' + '415': + description: '' + parameters: + - name: domain + description: The domain name + in: path + required: true + schema: + type: string + description: The domain name + example: example.com + /domains/records/{record_id}: + get: + description: '' + operationId: getDomainsRecordsByRecordId + security: [] + tags: [] + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + type: + type: string + enum: + - A + - AAAA + - ALIAS + - CAA + - CNAME + - HTTPS + - MX + - NS + - SRV + - TXT + id: + type: string + name: + type: string + value: + type: string + creator: + type: string + domain: + type: string + ttl: + type: number + comment: + type: string + recordType: + type: string + enum: + - A + - AAAA + - ALIAS + - CAA + - CNAME + - HTTPS + - MX + - NS + - SRV + - TXT + createdAt: + nullable: true + type: number + required: + - creator + - domain + - id + - name + - recordType + - type + - value + type: object + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + parameters: + - name: record_id + description: The unique ID of the DNS record + in: path + required: true + schema: + type: string + description: The unique ID of the DNS record + /v2/domains/{domain}/records/{record_id}: delete: description: Removes an existing DNS record from a domain name. operationId: removeRecord @@ -854,15 +670,21 @@ paths: content: application/json: schema: - type: object + type: string + description: (opaque JSON object) '400': description: One of the provided values in the request query is invalid. '401': - description: '' + description: The request is not authorized. '403': description: You do not have permission to access this resource. '404': description: '' + '410': + description: '' + x-vercel-cli: + supportedSubcommands: true + supportedProduction: false parameters: - name: domain in: path @@ -870,15 +692,136 @@ paths: schema: type: string example: example.com - - name: recordId + x-vercel-cli: + kind: argument + - name: record_id in: path required: true schema: type: string example: rec_V0fra8eEgQwEpFhYG2vTzC3K - - description: The Team identifier or slug to perform the request on behalf of. + x-vercel-cli: + kind: argument + - description: The Team identifier to perform the request on behalf of. in: query name: teamId - required: true schema: type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug +components: + schemas: + Pagination: + properties: + count: + type: number + description: Amount of items in the current page. + example: 20 + next: + nullable: true + type: number + description: Timestamp that must be used to request the next page. + example: 1540095775951 + prev: + nullable: true + type: number + description: Timestamp that must be used to request the previous page. + example: 1540095775951 + required: + - count + - next + - prev + type: object + description: This object contains information related to the pagination of the current request, including the necessary parameters to get the next or previous page of data. + x-stackQL-resources: + records: + id: vercel.dns.records + name: records + title: Records + methods: + list: + operation: + $ref: '#/paths/~1v5~1domains~1{domain}~1records/get' + response: + mediaType: application/json + openAPIDocKey: '200' + objectKey: $.records + request: + nativeCasing: camel + config: + pagination: + requestToken: + key: until + location: query + responseToken: + key: $.pagination.next + location: body + queryParamPushdown: + top: + paramName: limit + maxValue: 100 + create: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v2~1domains~1{domain}~1records/post' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + update: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v1~1domains~1records~1{record_id}/patch' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + replace: + operation: + $ref: '#/paths/~1domains~1{domain}~1records/put' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + get: + operation: + $ref: '#/paths/~1domains~1records~1{record_id}/get' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + delete: + operation: + $ref: '#/paths/~1v2~1domains~1{domain}~1records~1{record_id}/delete' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/records/methods/list' + - $ref: '#/components/x-stackQL-resources/records/methods/get' + insert: + - $ref: '#/components/x-stackQL-resources/records/methods/create' + update: + - $ref: '#/components/x-stackQL-resources/records/methods/update' + delete: + - $ref: '#/components/x-stackQL-resources/records/methods/delete' + replace: + - $ref: '#/components/x-stackQL-resources/records/methods/replace' +servers: + - url: https://api.vercel.com diff --git a/provider-dev/openapi/src/vercel/v00.00.00000/services/domains.yaml b/provider-dev/openapi/src/vercel/v00.00.00000/services/domains.yaml index 85273b2..0d015df 100644 --- a/provider-dev/openapi/src/vercel/v00.00.00000/services/domains.yaml +++ b/provider-dev/openapi/src/vercel/v00.00.00000/services/domains.yaml @@ -1,527 +1,511 @@ openapi: 3.0.3 -servers: - - url: 'https://api.vercel.com' - description: Production API info: - contact: - email: support@vercel.com - name: Vercel Support - url: 'https://vercel.com/support' + title: domains API + description: vercel domains API version: 0.0.1 - title: Vercel API - domains - description: domains -components: - schemas: - Pagination: - properties: - count: - type: number - description: Amount of items in the current page. - example: 20 - next: - nullable: true - type: number - description: Timestamp that must be used to request the next page. - example: 1540095775951 - prev: - nullable: true - type: number - description: Timestamp that must be used to request the previous page. - example: 1540095775951 - required: - - count - - next - - prev - type: object - description: 'This object contains information related to the pagination of the current request, including the necessary parameters to get the next or previous page of data.' - responses: {} - securitySchemes: - bearerToken: - type: http - description: Default authentication mechanism - scheme: bearer - oauth2: - type: oauth2 - flows: - authorizationCode: - authorizationUrl: 'https://api.vercel.com/oauth/authorize' - tokenUrl: 'https://api.vercel.com/oauth/access_token' - scopes: {} - x-stackQL-resources: - domains: - id: vercel.domains.domains - name: domains - title: Domains - methods: - buy_domain: - operation: - $ref: '#/paths/~1v4~1domains~1buy/post' - response: - mediaType: application/json - openAPIDocKey: '200' - get_domain: - operation: - $ref: '#/paths/~1v5~1domains~1{domain}/get' - response: - mediaType: application/json - openAPIDocKey: '200' - objectKey: $.domain - _get_domain: - operation: - $ref: '#/paths/~1v5~1domains~1{domain}/get' - response: - mediaType: application/json - openAPIDocKey: '200' - get_domains: - operation: - $ref: '#/paths/~1v5~1domains/get' - response: - mediaType: application/json - openAPIDocKey: '200' - objectKey: $.domains - _get_domains: - operation: - $ref: '#/paths/~1v5~1domains/get' - response: - mediaType: application/json - openAPIDocKey: '200' - create_or_transfer_domain: - operation: - $ref: '#/paths/~1v5~1domains/post' - response: - mediaType: application/json - openAPIDocKey: '200' - patch_domain: - operation: - $ref: '#/paths/~1v3~1domains~1{domain}/patch' - response: - mediaType: application/json - openAPIDocKey: '200' - delete_domain: - operation: - $ref: '#/paths/~1v6~1domains~1{domain}/delete' - response: - mediaType: application/json - openAPIDocKey: '200' - sqlVerbs: - select: - - $ref: '#/components/x-stackQL-resources/domains/methods/get_domain' - - $ref: '#/components/x-stackQL-resources/domains/methods/get_domains' - insert: - - $ref: '#/components/x-stackQL-resources/domains/methods/create_or_transfer_domain' - update: [] - delete: - - $ref: '#/components/x-stackQL-resources/domains/methods/delete_domain' - price: - id: vercel.domains.price - name: price - title: Price - methods: - check_domain_price: - operation: - $ref: '#/paths/~1v4~1domains~1price/get' - response: - mediaType: application/json - openAPIDocKey: '200' - sqlVerbs: - select: - - $ref: '#/components/x-stackQL-resources/price/methods/check_domain_price' - insert: [] - update: [] - delete: [] - status: - id: vercel.domains.status - name: status - title: Status - methods: - check_domain_status: - operation: - $ref: '#/paths/~1v4~1domains~1status/get' - response: - mediaType: application/json - openAPIDocKey: '200' - sqlVerbs: - select: - - $ref: '#/components/x-stackQL-resources/status/methods/check_domain_status' - insert: [] - update: [] - delete: [] - domain_registry: - id: vercel.domains.domain_registry - name: domain_registry - title: Domain Registry - methods: - get_domain_transfer: - operation: - $ref: '#/paths/~1v1~1domains~1{domain}~1registry/get' - response: - mediaType: application/json - openAPIDocKey: '200' - sqlVerbs: - select: - - $ref: '#/components/x-stackQL-resources/domain_registry/methods/get_domain_transfer' - insert: [] - update: [] - delete: [] - config: - id: vercel.domains.config - name: config - title: Config - methods: - get_domain_config: - operation: - $ref: '#/paths/~1v6~1domains~1{domain}~1config/get' - response: - mediaType: application/json - openAPIDocKey: '200' - sqlVerbs: - select: - - $ref: '#/components/x-stackQL-resources/config/methods/get_domain_config' - insert: [] - update: [] - delete: [] paths: - /v4/domains/buy: - post: - description: Allows to purchase the specified domain. - operationId: buyDomain + /v6/domains/{domain}/config: + get: + description: Get a Domain's configuration. + operationId: getDomainConfig security: - bearerToken: [] - summary: Purchase a domain + summary: Get a Domain's configuration tags: - domains responses: - '201': - description: Successful response for purchasing a Domain. + '200': + description: '' content: application/json: schema: properties: - domain: - properties: - uid: - type: string - ns: - items: + configuredBy: + nullable: true + type: string + enum: + - A + - CNAME + - dns-01 + - http + - null + description: 'How we see the domain''s configuration. - `CNAME`: Domain has a CNAME pointing to Vercel. - `A`: Domain''s A record is resolving to Vercel. - `http`: Domain is resolving to Vercel but may be behind a Proxy. - `dns-01`: Domain is not resolving to Vercel but dns-01 challenge is enabled. - `null`: Domain is not resolving to Vercel.' + acceptedChallenges: + items: + type: string + enum: + - dns-01 + - http-01 + description: Which challenge types the domain can use for issuing certs. + type: array + description: Which challenge types the domain can use for issuing certs. + recommendedIPv4: + items: + properties: + rank: + type: number + value: + items: + type: string + type: array + required: + - rank + - value + type: object + description: Recommended IPv4s for the domain. rank=1 is the preferred value(s) to use. Only using 1 ip value is acceptable. + type: array + description: Recommended IPv4s for the domain. rank=1 is the preferred value(s) to use. Only using 1 ip value is acceptable. + recommendedCNAME: + items: + properties: + rank: + type: number + value: type: string - type: array - verified: - type: boolean - created: - type: number - pending: - type: boolean - required: - - uid - - ns - - verified - - created - - pending - type: object + required: + - rank + - value + type: object + description: Recommended CNAMEs for the domain. rank=1 is the preferred value to use. + type: array + description: Recommended CNAMEs for the domain. rank=1 is the preferred value to use. + misconfigured: + type: boolean + enum: + - false + - true + description: Whether or not the domain is configured AND we can automatically generate a TLS certificate. required: - - domain + - acceptedChallenges + - configuredBy + - misconfigured + - recommendedCNAME + - recommendedIPv4 type: object - '202': - description: Domain purchase is being processed asynchronously. + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '410': + description: '' + parameters: + - name: domain + description: The name of the domain. + in: path + required: true + schema: + description: The name of the domain. + type: string + example: example.com + - name: projectIdOrName + description: The project id or name that will be associated with the domain. Use this when the domain is not yet associated with a project. + in: query + required: false + schema: + description: The project id or name that will be associated with the domain. Use this when the domain is not yet associated with a project. + type: string + - name: strict + description: When true, the response will only include the nameservers assigned directly to the specified domain. When false and there are no nameservers assigned directly to the specified domain, the response will include the nameservers of the domain's parent zone. + in: query + required: false + schema: + enum: + - 'true' + - 'false' + description: When true, the response will only include the nameservers assigned directly to the specified domain. When false and there are no nameservers assigned directly to the specified domain, the response will include the nameservers of the domain's parent zone. + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + /v9/domains/{domain}/verification: + get: + description: Get the TXT verification record needed to claim ownership of a domain for the authenticated team. The caller must add this TXT record to `_vercel.{domain}` in their DNS configuration, then call POST /domains/:domain/claim to complete the ownership transfer. + operationId: getDomainVerificationRecord + security: + - bearerToken: [] + summary: Get Domain Verification Record + tags: + - domains + responses: + '200': + description: Returns the TXT record needed to verify domain ownership. content: application/json: schema: properties: - domain: - properties: - uid: - type: string - ns: - items: - type: string - type: array - verified: - type: boolean - created: - type: number - pending: - type: boolean - required: - - uid - - ns - - verified - - created - - pending - type: object + txtRecord: + type: string + verificationDomain: + type: string required: - - domain + - txtRecord + - verificationDomain type: object '400': - description: One of the provided values in the request body is invalid. + description: One of the provided values in the request query is invalid. '401': - description: '' + description: The request is not authorized. '403': description: You do not have permission to access this resource. - '409': + '404': description: '' - '429': + '410': description: '' parameters: - - description: The Team identifier or slug to perform the request on behalf of. + - name: domain + description: The domain name to get the verification record for + in: path + required: true + schema: + description: The domain name to get the verification record for + type: string + example: example.com + - description: The Team identifier to perform the request on behalf of. in: query name: teamId - required: true schema: type: string - requestBody: - content: - application/json: - schema: - additionalProperties: false - type: object - required: - - name - properties: - name: - description: The domain name to purchase. - type: string - example: example.com - expectedPrice: - description: The price you expect to be charged for the purchase. - type: number - example: 10 - renew: - description: Indicates whether the domain should be automatically renewed. - type: boolean - example: true - /v4/domains/price: - get: - description: Check the price to purchase a domain and how long a single purchase period is. - operationId: checkDomainPrice + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + /v9/domains/{domain}/claim: + post: + description: Claim ownership of a domain for the authenticated team by verifying a TXT record. The caller must first add a TXT record to `_vercel.{domain}` (obtained from GET /domains/:domain/verification), then call this endpoint to complete the ownership transfer. If the TXT record is verified, the domain ownership will be transferred to the caller's team, even if the domain is currently owned by another user or team. + operationId: claimDomainOwnership security: - bearerToken: [] - summary: Check the price for a domain + summary: Claim Domain Ownership tags: - domains responses: '200': - description: Successful response which returns the price of the domain and the period. + description: Domain ownership successfully claimed. content: application/json: schema: properties: - price: - type: number - description: The domain price in USD. - example: 20 - period: - type: number - description: The number of years the domain could be held before paying again. - example: 1 + domain: + properties: + expiresAt: + nullable: true + type: number + description: Timestamp in milliseconds at which the domain is set to expire. null if not bought with Vercel. + verified: + type: boolean + enum: + - false + - true + description: If the domain has the ownership verified. + example: true + nameservers: + items: + type: string + type: array + description: A list of the current nameservers of the domain. + example: + - ns1.nameserver.net + - ns2.nameserver.net + intendedNameservers: + items: + type: string + type: array + description: A list of the intended nameservers for the domain to point to Vercel DNS. + example: + - ns1.vercel-dns.com + - ns2.vercel-dns.com + customNameservers: + items: + type: string + type: array + description: A list of custom nameservers for the domain to point to. Only applies to domains purchased with Vercel. + example: + - ns1.nameserver.net + - ns2.nameserver.net + creator: + properties: + username: + type: string + email: + type: string + customerId: + nullable: true + type: string + isDomainReseller: + type: boolean + enum: + - false + - true + id: + type: string + required: + - email + - id + - username + type: object + description: An object containing information of the domain creator, including the user's id, username, and email. + example: + id: ZspSRT4ljIEEmMHgoDwKWDei + username: vercel_user + email: demo@example.com + echMode: + type: string + enum: + - auto + - disabled + - enabled + description: Whether the domain is enrolled in Encrypted Client Hello. `auto` leaves the decision to Vercel, `enabled` always enrolls, and `disabled` never enrolls and opts out of automatic enrollment. + example: auto + name: + type: string + description: The domain name. + example: example.com + teamId: + nullable: true + type: string + boughtAt: + nullable: true + type: number + description: If it was purchased through Vercel, the timestamp in milliseconds when it was purchased. + example: 1613602938882 + createdAt: + type: number + description: Timestamp in milliseconds when the domain was created in the registry. + example: 1613602938882 + id: + type: string + description: The unique identifier of the domain. + example: EmTbe5CEJyTk2yVAHBUWy4A3sRusca3GCwRjTC1bpeVnt1 + renew: + type: boolean + enum: + - false + - true + description: Indicates whether the domain is set to automatically renew. + example: true + serviceType: + type: string + enum: + - external + - na + - zeit.world + description: The type of service the domain is handled by. `external` if the DNS is externally handled, `zeit.world` if handled with Vercel, or `na` if the service is not available. + example: zeit.world + transferredAt: + nullable: true + type: number + description: Timestamp in milliseconds at which the domain was successfully transferred into Vercel. `null` if the transfer is still processing or was never transferred in. + example: 1613602938882 + transferStartedAt: + type: number + description: If transferred into Vercel, timestamp in milliseconds when the domain transfer was initiated. + example: 1613602938882 + userId: + type: string + required: + - boughtAt + - createdAt + - creator + - echMode + - expiresAt + - id + - intendedNameservers + - name + - nameservers + - serviceType + - teamId + - userId + - verified + type: object required: - - price - - period + - domain type: object - description: Successful response which returns the price of the domain and the period. '400': description: One of the provided values in the request query is invalid. '401': - description: '' + description: The request is not authorized. '403': description: You do not have permission to access this resource. - parameters: - - name: name - description: The name of the domain for which the price needs to be checked. - in: query - required: true - schema: - description: The name of the domain for which the price needs to be checked. - type: string - example: example.com - - name: type - description: In which status of the domain the price needs to be checked. - in: query - required: false - schema: - description: In which status of the domain the price needs to be checked. - type: string - enum: - - new - - renewal - example: new - - description: The Team identifier or slug to perform the request on behalf of. - in: query - name: teamId - required: true - schema: - type: string - /v4/domains/status: - get: - description: Check if a domain name is available for purchase. - operationId: checkDomainStatus - security: - - bearerToken: [] - summary: Check a Domain Availability - tags: - - domains - responses: - '200': - description: Successful response checking if a Domain's name is available. - content: - application/json: - schema: - properties: - available: - type: boolean - required: - - available - type: object - '400': - description: One of the provided values in the request query is invalid. - '401': + '404': + description: '' + '410': description: '' - '403': - description: You do not have permission to access this resource. parameters: - - name: name - description: The name of the domain for which we would like to check the status. - in: query + - name: domain + description: The domain name to claim ownership of + in: path required: true schema: - description: The name of the domain for which we would like to check the status. + description: The domain name to claim ownership of type: string example: example.com - - description: The Team identifier or slug to perform the request on behalf of. + - description: The Team identifier to perform the request on behalf of. in: query name: teamId - required: true - schema: - type: string - '/v1/domains/{domain}/registry': - get: - description: Fetch domain transfer availability or transfer status if a transfer is in progress. - operationId: getDomainTransfer - security: - - bearerToken: [] - summary: Get domain transfer info. - tags: - - domains - responses: - '200': - description: '' - content: - application/json: - schema: - properties: - transferable: - type: boolean - description: Whether or not the domain is transferable - transferPolicy: - nullable: true - type: string - enum: - - charge-and-renew - - no-charge-no-change - - no-change - - new-term - - not-supported - description: 'The domain''s transfer policy (depends on TLD requirements). `charge-and-renew`: transfer will charge for renewal and will renew the existing domain''s registration. `no-charge-no-change`: transfer will have no change to registration period and does not require charge. `no-change`: transfer charge is required, but no change in registration period. `new-term`: transfer charge is required and a new registry term is set based on the transfer date. `not-supported`: transfers are not supported for this domain or TLD. `null`: This TLD is not supported by Vercel''s Registrar.' - reason: - type: string - description: Description associated with transferable state. - status: - type: string - enum: - - pending_owner - - pending_admin - - pending_registry - - completed - - cancelled - - undef - - unknown - description: 'The current state of an ongoing transfer. `pending_owner`: Awaiting approval by domain''s admin contact (every transfer begins with this status). If approval is not given within five days, the transfer is cancelled. `pending_admin`: Waiting for approval by Vercel Registrar admin. `pending_registry`: Awaiting registry approval (the transfer completes after 7 days unless it is declined by the current registrar). `completed`: The transfer completed successfully. `cancelled`: The transfer was cancelled. `undef`: No transfer exists for this domain. `unknown`: This TLD is not supported by Vercel''s Registrar.' - required: - - transferable - - transferPolicy - - reason - - status - type: object - '400': - description: '' - '401': - description: '' - '403': - description: You do not have permission to access this resource. - parameters: - - name: domain - description: The name of the domain. - in: path - required: true schema: type: string - description: The name of the domain. - - description: The Team identifier or slug to perform the request on behalf of. + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. in: query - name: teamId - required: true + name: slug schema: type: string - '/v6/domains/{domain}/config': + example: my-team-url-slug + /v1/domains/{domain}/project-domains: get: - description: Get a Domain's configuration. - operationId: getDomainConfig + description: List all project domains associated with an apex domain owned by the authenticated account. + operationId: getDomainProjectDomains security: - bearerToken: [] - summary: Get a Domain's configuration + summary: List Project Domains by Apex Domain tags: - domains responses: '200': - description: '' + description: Successful response retrieving project domains for an apex domain. content: application/json: schema: properties: - configuredBy: - nullable: true - type: string - enum: - - CNAME - - A - - http - description: 'How we see the domain''s configuration. - `CNAME`: Domain has a CNAME pointing to Vercel. - `A`: Domain''s A record is resolving to Vercel. - `http`: Domain is resolving to Vercel but may be behind a Proxy. - `null`: Domain is not resolving to Vercel.' - acceptedChallenges: + projectDomains: items: - type: string - enum: - - dns-01 - - http-01 - description: Which challenge types the domain can use for issuing certs. + properties: + name: + type: string + apexName: + type: string + projectId: + type: string + redirect: + nullable: true + type: string + redirectStatusCode: + nullable: true + type: number + enum: + - 301 + - 302 + - 307 + - 308 + - null + gitBranch: + nullable: true + type: string + customEnvironmentId: + nullable: true + type: string + updatedAt: + type: number + createdAt: + type: number + verified: + type: boolean + enum: + - false + - true + description: '`true` if the domain is verified for use with the project. If `false` it will not be used as an alias on this project until the challenge in `verification` is completed.' + verification: + items: + properties: + type: + type: string + domain: + type: string + value: + type: string + reason: + type: string + required: + - domain + - reason + - type + - value + type: object + description: 'A list of verification challenges, one of which must be completed to verify the domain for use on the project. After the challenge is complete `POST /projects/:idOrName/domains/:domain/verify` to verify the domain. Possible challenges: - If `verification.type = TXT` the `verification.domain` will be checked for a TXT record matching `verification.value`.' + type: array + description: 'A list of verification challenges, one of which must be completed to verify the domain for use on the project. After the challenge is complete `POST /projects/:idOrName/domains/:domain/verify` to verify the domain. Possible challenges: - If `verification.type = TXT` the `verification.domain` will be checked for a TXT record matching `verification.value`.' + required: + - apexName + - name + - projectId + - verified + type: object type: array - description: Which challenge types the domain can use for issuing certs. - misconfigured: - type: boolean - description: Whether or not the domain is configured AND we can automatically generate a TLS certificate. + pagination: + $ref: '#/components/schemas/Pagination' required: - - misconfigured + - pagination + - projectDomains type: object '400': description: One of the provided values in the request query is invalid. '401': - description: '' + description: The request is not authorized. '403': description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' parameters: - name: domain - description: The name of the domain. + description: The apex domain name. in: path required: true schema: - description: The name of the domain. + description: The apex domain name. type: string example: example.com - - description: The Team identifier or slug to perform the request on behalf of. + - name: limit + description: Maximum number of project domains to list from a request. + in: query + required: false + schema: + description: Maximum number of project domains to list from a request. + type: number + example: 20 + - name: since + description: Get project domains created after this JavaScript timestamp. + in: query + required: false + schema: + description: Get project domains created after this JavaScript timestamp. + type: number + example: 1609499532000 + - name: until + description: Get project domains created before this JavaScript timestamp. + in: query + required: false + schema: + description: Get project domains created before this JavaScript timestamp. + type: number + example: 1612264332000 + - description: The Team identifier to perform the request on behalf of. in: query name: teamId - required: true schema: type: string - '/v5/domains/{domain}': + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + /v5/domains/{domain}: get: description: Get information for a single domain in an account or team. operationId: getDomain @@ -541,8 +525,18 @@ paths: properties: suffix: type: boolean + enum: + - false + - true + expiresAt: + nullable: true + type: number + description: Timestamp in milliseconds at which the domain is set to expire. null if not bought with Vercel. verified: type: boolean + enum: + - false + - true description: If the domain has the ownership verified. example: true nameservers: @@ -580,55 +574,63 @@ paths: type: string isDomainReseller: type: boolean + enum: + - false + - true id: type: string required: - - username - email - id + - username type: object - description: 'An object containing information of the domain creator, including the user''s id, username, and email.' + description: An object containing information of the domain creator, including the user's id, username, and email. example: id: ZspSRT4ljIEEmMHgoDwKWDei username: vercel_user email: demo@example.com + echMode: + type: string + enum: + - auto + - disabled + - enabled + description: Whether the domain is enrolled in Encrypted Client Hello. `auto` leaves the decision to Vercel, `enabled` always enrolls, and `disabled` never enrolls and opts out of automatic enrollment. + example: auto + name: + type: string + description: The domain name. + example: example.com + teamId: + nullable: true + type: string boughtAt: nullable: true type: number - description: 'If it was purchased through Vercel, the timestamp in milliseconds when it was purchased.' + description: If it was purchased through Vercel, the timestamp in milliseconds when it was purchased. example: 1613602938882 createdAt: type: number description: Timestamp in milliseconds when the domain was created in the registry. example: 1613602938882 - expiresAt: - nullable: true - type: number - description: Timestamp in milliseconds at which the domain is set to expire. `null` if not bought with Vercel. - example: 1613602938882 id: type: string description: The unique identifier of the domain. example: EmTbe5CEJyTk2yVAHBUWy4A3sRusca3GCwRjTC1bpeVnt1 - name: - type: string - description: The domain name. - example: example.com - orderedAt: - type: number - description: Timestamp in milliseconds at which the domain was ordered. - example: 1613602938882 renew: type: boolean + enum: + - false + - true description: Indicates whether the domain is set to automatically renew. example: true serviceType: type: string enum: - - zeit.world - external - na - description: 'The type of service the domain is handled by. `external` if the DNS is externally handled, `zeit.world` if handled with Vercel, or `na` if the service is not available.' + - zeit.world + description: The type of service the domain is handled by. `external` if the DNS is externally handled, `zeit.world` if handled with Vercel, or `na` if the service is not available. example: zeit.world transferredAt: nullable: true @@ -637,20 +639,25 @@ paths: example: 1613602938882 transferStartedAt: type: number - description: 'If transferred into Vercel, timestamp in milliseconds when the domain transfer was initiated.' + description: If transferred into Vercel, timestamp in milliseconds when the domain transfer was initiated. example: 1613602938882 + userId: + type: string required: - - suffix - - verified - - nameservers - - intendedNameservers - - creator - boughtAt - createdAt + - creator + - echMode - expiresAt - id + - intendedNameservers - name + - nameservers - serviceType + - suffix + - teamId + - userId + - verified type: object required: - domain @@ -658,11 +665,16 @@ paths: '400': description: One of the provided values in the request query is invalid. '401': - description: '' + description: The request is not authorized. '403': description: You do not have permission to access this resource. '404': description: '' + '410': + description: '' + x-vercel-cli: + supportedSubcommands: true + supportedProduction: false parameters: - name: domain description: The name of the domain. @@ -672,12 +684,20 @@ paths: description: The name of the domain. type: string example: example.com - - description: The Team identifier or slug to perform the request on behalf of. + x-vercel-cli: + kind: argument + - description: The Team identifier to perform the request on behalf of. in: query name: teamId - required: true schema: type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug /v5/domains: get: description: Retrieves a list of domains registered for the authenticated user or team. By default it returns the last 20 domains if no limit is provided. @@ -697,8 +717,15 @@ paths: domains: items: properties: + expiresAt: + nullable: true + type: number + description: Timestamp in milliseconds at which the domain is set to expire. null if not bought with Vercel. verified: type: boolean + enum: + - false + - true description: If the domain has the ownership verified. example: true nameservers: @@ -736,55 +763,63 @@ paths: type: string isDomainReseller: type: boolean + enum: + - false + - true id: type: string required: - - username - email - id + - username type: object - description: 'An object containing information of the domain creator, including the user''s id, username, and email.' + description: An object containing information of the domain creator, including the user's id, username, and email. example: id: ZspSRT4ljIEEmMHgoDwKWDei username: vercel_user email: demo@example.com - renew: - type: boolean - description: Indicates whether the domain is set to automatically renew. - example: true + echMode: + type: string + enum: + - auto + - disabled + - enabled + description: Whether the domain is enrolled in Encrypted Client Hello. `auto` leaves the decision to Vercel, `enabled` always enrolls, and `disabled` never enrolls and opts out of automatic enrollment. + example: auto + name: + type: string + description: The domain name. + example: example.com + teamId: + nullable: true + type: string boughtAt: nullable: true type: number - description: 'If it was purchased through Vercel, the timestamp in milliseconds when it was purchased.' + description: If it was purchased through Vercel, the timestamp in milliseconds when it was purchased. example: 1613602938882 createdAt: type: number description: Timestamp in milliseconds when the domain was created in the registry. example: 1613602938882 - expiresAt: - nullable: true - type: number - description: Timestamp in milliseconds at which the domain is set to expire. `null` if not bought with Vercel. - example: 1613602938882 id: type: string description: The unique identifier of the domain. example: EmTbe5CEJyTk2yVAHBUWy4A3sRusca3GCwRjTC1bpeVnt1 - name: - type: string - description: The domain name. - example: example.com - orderedAt: - type: number - description: Timestamp in milliseconds at which the domain was ordered. - example: 1613602938882 + renew: + type: boolean + enum: + - false + - true + description: Indicates whether the domain is set to automatically renew. + example: true serviceType: type: string enum: - - zeit.world - external - na - description: 'The type of service the domain is handled by. `external` if the DNS is externally handled, `zeit.world` if handled with Vercel, or `na` if the service is not available.' + - zeit.world + description: The type of service the domain is handled by. `external` if the DNS is externally handled, `zeit.world` if handled with Vercel, or `na` if the service is not available. example: zeit.world transferredAt: nullable: true @@ -793,19 +828,24 @@ paths: example: 1613602938882 transferStartedAt: type: number - description: 'If transferred into Vercel, timestamp in milliseconds when the domain transfer was initiated.' + description: If transferred into Vercel, timestamp in milliseconds when the domain transfer was initiated. example: 1613602938882 + userId: + type: string required: - - verified - - nameservers - - intendedNameservers - - creator - boughtAt - createdAt + - creator + - echMode - expiresAt - id + - intendedNameservers - name + - nameservers - serviceType + - teamId + - userId + - verified type: object type: array pagination: @@ -817,11 +857,19 @@ paths: '400': description: One of the provided values in the request query is invalid. '401': - description: '' + description: The request is not authorized. '403': description: You do not have permission to access this resource. '409': description: '' + '410': + description: '' + x-vercel-cli: + supportedSubcommands: true + supportedProduction: false + aliases: + - ls + - list parameters: - name: limit description: Maximum number of domains to list from a request. @@ -844,18 +892,25 @@ paths: description: Get domains created before this JavaScript timestamp. type: number example: 1612264332000 - - description: The Team identifier or slug to perform the request on behalf of. + - description: The Team identifier to perform the request on behalf of. in: query name: teamId - required: true schema: type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + /v7/domains: post: - description: This endpoint is used for adding a new apex domain name with Vercel for the authenticating user. Can also be used for initiating a domain transfer request from an external Registrar to Vercel. + description: 'This endpoint is used for adding a new apex domain name with Vercel for the authenticating user. Note: This endpoint is no longer used for initiating domain transfers from external registrars to Vercel. For this, please use the endpoint [Transfer-in a domain](https://vercel.com/docs/rest-api/reference/endpoints/domains-registrar/transfer-in-a-domain).' operationId: createOrTransferDomain security: - bearerToken: [] - summary: Register or transfer-in a new Domain + summary: Add an existing domain to the Vercel platform tags: - domains responses: @@ -867,8 +922,15 @@ paths: properties: domain: properties: + expiresAt: + nullable: true + type: number + description: Timestamp in milliseconds at which the domain is set to expire. null if not bought with Vercel. verified: type: boolean + enum: + - false + - true description: If the domain has the ownership verified. example: true nameservers: @@ -906,55 +968,63 @@ paths: type: string isDomainReseller: type: boolean + enum: + - false + - true id: type: string required: - - username - email - id + - username type: object - description: 'An object containing information of the domain creator, including the user''s id, username, and email.' + description: An object containing information of the domain creator, including the user's id, username, and email. example: id: ZspSRT4ljIEEmMHgoDwKWDei username: vercel_user email: demo@example.com - id: + echMode: + type: string + enum: + - auto + - disabled + - enabled + description: Whether the domain is enrolled in Encrypted Client Hello. `auto` leaves the decision to Vercel, `enabled` always enrolls, and `disabled` never enrolls and opts out of automatic enrollment. + example: auto + name: + type: string + description: The domain name. + example: example.com + teamId: + nullable: true type: string - description: The unique identifier of the domain. - example: EmTbe5CEJyTk2yVAHBUWy4A3sRusca3GCwRjTC1bpeVnt1 boughtAt: nullable: true type: number - description: 'If it was purchased through Vercel, the timestamp in milliseconds when it was purchased.' + description: If it was purchased through Vercel, the timestamp in milliseconds when it was purchased. example: 1613602938882 createdAt: type: number description: Timestamp in milliseconds when the domain was created in the registry. example: 1613602938882 - expiresAt: - nullable: true - type: number - description: Timestamp in milliseconds at which the domain is set to expire. `null` if not bought with Vercel. - example: 1613602938882 - name: + id: type: string - description: The domain name. - example: example.com - orderedAt: - type: number - description: Timestamp in milliseconds at which the domain was ordered. - example: 1613602938882 + description: The unique identifier of the domain. + example: EmTbe5CEJyTk2yVAHBUWy4A3sRusca3GCwRjTC1bpeVnt1 renew: type: boolean + enum: + - false + - true description: Indicates whether the domain is set to automatically renew. example: true serviceType: type: string enum: - - zeit.world - external - na - description: 'The type of service the domain is handled by. `external` if the DNS is externally handled, `zeit.world` if handled with Vercel, or `na` if the service is not available.' + - zeit.world + description: The type of service the domain is handled by. `external` if the DNS is externally handled, `zeit.world` if handled with Vercel, or `na` if the service is not available. example: zeit.world transferredAt: nullable: true @@ -963,19 +1033,24 @@ paths: example: 1613602938882 transferStartedAt: type: number - description: 'If transferred into Vercel, timestamp in milliseconds when the domain transfer was initiated.' + description: If transferred into Vercel, timestamp in milliseconds when the domain transfer was initiated. example: 1613602938882 + userId: + type: string required: - - verified - - nameservers - - intendedNameservers - - creator - - id - boughtAt - createdAt + - creator + - echMode - expiresAt + - id + - intendedNameservers - name + - nameservers - serviceType + - teamId + - userId + - verified type: object required: - domain @@ -983,99 +1058,68 @@ paths: '400': description: One of the provided values in the request body is invalid. '401': - description: '' + description: The request is not authorized. '402': - description: |- - The account was soft-blocked for an unhandled reason. - The account is missing a payment so payment method must be updated + description: The account is missing a payment so payment method must be updated '403': description: You do not have permission to access this resource. '404': description: '' '409': + description: The domain is not allowed to be used + '410': description: '' + x-vercel-cli: + supportedSubcommands: true + supportedProduction: false + bodyArguments: + - name parameters: - - description: The Team identifier or slug to perform the request on behalf of. + - description: The Team identifier to perform the request on behalf of. in: query name: teamId - required: true schema: type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug requestBody: content: application/json: schema: properties: method: - description: The domain operation to perform. It can be either `add` or `transfer-in`. + description: The domain operation to perform. It can be either `add` or `move-in`. type: string - example: transfer-in - oneOf: - - additionalProperties: false - type: object - description: add - required: - - name - properties: - name: - description: The domain name you want to add. - type: string - example: example.com - cdnEnabled: - description: Whether the domain has the Vercel Edge Network enabled or not. - type: boolean - example: true - zone: - type: boolean - method: - description: The domain operation to perform. - type: string - example: add - - additionalProperties: false - type: object - description: move-in - required: - - method - - name - properties: - name: - description: The domain name you want to add. - type: string - example: example.com - method: - description: The domain operation to perform. - type: string - example: move-in - token: - description: The move-in token from Move Requested email. - type: string - example: fdhfr820ad#@FAdlj$$ - - additionalProperties: false - type: object - description: transfer-in - required: - - method - - name - properties: - name: - description: The domain name you want to add. - type: string - example: example.com - method: - description: The domain operation to perform. - type: string - example: transfer-in - authCode: - description: The authorization code assigned to the domain. - type: string - example: fdhfr820ad#@FAdlj$$ - expectedPrice: - description: The price you expect to be charged for the required 1 year renewal. - type: number - example: 8 - '/v3/domains/{domain}': + example: add + name: + description: The domain name you want to add. + type: string + example: example.com + cdnEnabled: + description: Whether the domain has the Vercel CDN enabled or not. + type: boolean + example: true + zone: + description: Whether to create a DNS zone on Vercel. Set `true` if using Vercel nameservers. + type: boolean + token: + description: The move-in token from Move Requested email. + type: string + example: fdhfr820ad#@FAdlj$$ + type: object + additionalProperties: false + description: add + required: + - name + - method + /v3/domains/{domain}: patch: - description: Update or move apex domain. + description: 'Update or move apex domain. Note: This endpoint is no longer used for updating auto-renew or nameservers. For this, please use the endpoints [Update auto-renew for a domain](https://vercel.com/docs/rest-api/reference/endpoints/domains-registrar/update-auto-renew-for-a-domain) and [Update nameservers for a domain](https://vercel.com/docs/rest-api/reference/endpoints/domains-registrar/update-nameservers-for-a-domain).' operationId: patchDomain security: - bearerToken: [] @@ -1088,95 +1132,112 @@ paths: content: application/json: schema: - oneOf: - - properties: - moved: - type: boolean - required: - - moved - type: object - - properties: - moved: - type: boolean - token: - type: string - required: - - moved - - token - type: object - - properties: - renew: - type: boolean - customNameservers: - items: - type: string - type: array - zone: - type: boolean - type: object + properties: + moved: + type: boolean + enum: + - false + - true + token: + type: string + renew: + type: boolean + enum: + - false + - true + customNameservers: + items: + type: string + type: array + zone: + type: boolean + enum: + - false + - true + echMode: + type: string + enum: + - auto + - disabled + - enabled + required: + - moved + - token + - echMode + type: object '400': description: |- One of the provided values in the request body is invalid. One of the provided values in the request query is invalid. '401': - description: '' + description: The request is not authorized. '403': description: You do not have permission to access this resource. '404': description: '' '409': description: '' + '410': + description: '' + '500': + description: '' parameters: - name: domain - description: The name of the domain. in: path - required: true schema: type: string - description: The name of the domain. - - description: The Team identifier or slug to perform the request on behalf of. + required: true + - description: The Team identifier to perform the request on behalf of. in: query name: teamId - required: true schema: type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug requestBody: content: application/json: schema: - oneOf: - - type: object - description: update - additionalProperties: false - properties: - op: - example: update - type: string - renew: - description: Specifies whether domain should be renewed. - type: boolean - customNameservers: - description: The custom nameservers for this project. - items: - type: string - maxItems: 4 - minItems: 0 - type: array - uniqueItems: true - zone: - description: Specifies whether this is a DNS zone that intends to use Vercel's nameservers. - type: boolean - - type: object - description: move-out - additionalProperties: false - properties: - op: - example: move-out - type: string - destination: - description: User or team to move domain to - type: string - '/v6/domains/{domain}': + type: object + description: update + additionalProperties: false + properties: + op: + example: update + type: string + renew: + description: This field is deprecated. Please use PATCH /v1/registrar/domains/{domainName}/auto-renew instead. + type: boolean + deprecated: true + customNameservers: + description: This field is deprecated. Please use PATCH /v1/registrar/domains/{domainName}/nameservers instead. + items: + type: string + maxItems: 4 + minItems: 0 + type: array + uniqueItems: true + deprecated: true + zone: + description: Specifies whether this is a DNS zone that intends to use Vercel's nameservers. + type: boolean + echMode: + description: Encrypted Client Hello enrollment. 'auto' leaves it to Vercel, 'disabled' never enrolls and opts out of automatic enrollment. + type: string + enum: + - auto + - disabled + destination: + description: User or team to move domain to + type: string + required: true + x-speakeasy-test: false + /v6/domains/{domain}: delete: description: Delete a previously registered domain name from Vercel. Deleting a domain will automatically remove any associated aliases. operationId: deleteDomain @@ -1200,13 +1261,18 @@ paths: '400': description: One of the provided values in the request query is invalid. '401': - description: '' + description: The request is not authorized. '403': description: You do not have permission to access this resource. '404': description: '' '409': description: '' + '410': + description: '' + x-vercel-cli: + supportedSubcommands: true + supportedProduction: false parameters: - name: domain description: The name of the domain. @@ -1216,9 +1282,201 @@ paths: description: The name of the domain. type: string example: example.com - - description: The Team identifier or slug to perform the request on behalf of. + x-vercel-cli: + kind: argument + - description: The Team identifier to perform the request on behalf of. in: query name: teamId - required: true schema: type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug +components: + schemas: + Pagination: + properties: + count: + type: number + description: Amount of items in the current page. + example: 20 + next: + nullable: true + type: number + description: Timestamp that must be used to request the next page. + example: 1540095775951 + prev: + nullable: true + type: number + description: Timestamp that must be used to request the previous page. + example: 1540095775951 + required: + - count + - next + - prev + type: object + description: This object contains information related to the pagination of the current request, including the necessary parameters to get the next or previous page of data. + x-stackQL-resources: + domain_config: + id: vercel.domains.domain_config + name: domain_config + title: Domain Config + methods: + get: + operation: + $ref: '#/paths/~1v6~1domains~1{domain}~1config/get' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/domain_config/methods/get' + insert: [] + update: [] + delete: [] + replace: [] + domain_verification: + id: vercel.domains.domain_verification + name: domain_verification + title: Domain Verification + methods: + get: + operation: + $ref: '#/paths/~1v9~1domains~1{domain}~1verification/get' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/domain_verification/methods/get' + insert: [] + update: [] + delete: [] + replace: [] + domains: + id: vercel.domains.domains + name: domains + title: Domains + methods: + claim_ownership: + operation: + $ref: '#/paths/~1v9~1domains~1{domain}~1claim/post' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + get: + operation: + $ref: '#/paths/~1v5~1domains~1{domain}/get' + response: + mediaType: application/json + openAPIDocKey: '200' + objectKey: $.domain + request: + nativeCasing: camel + list: + operation: + $ref: '#/paths/~1v5~1domains/get' + response: + mediaType: application/json + openAPIDocKey: '200' + objectKey: $.domains + request: + nativeCasing: camel + config: + pagination: + requestToken: + key: until + location: query + responseToken: + key: $.pagination.next + location: body + queryParamPushdown: + top: + paramName: limit + maxValue: 100 + create: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v7~1domains/post' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + update: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v3~1domains~1{domain}/patch' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + delete: + operation: + $ref: '#/paths/~1v6~1domains~1{domain}/delete' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/domains/methods/get' + - $ref: '#/components/x-stackQL-resources/domains/methods/list' + insert: + - $ref: '#/components/x-stackQL-resources/domains/methods/create' + update: + - $ref: '#/components/x-stackQL-resources/domains/methods/update' + delete: + - $ref: '#/components/x-stackQL-resources/domains/methods/delete' + replace: [] + domain_project_domains: + id: vercel.domains.domain_project_domains + name: domain_project_domains + title: Domain Project Domains + methods: + list: + operation: + $ref: '#/paths/~1v1~1domains~1{domain}~1project-domains/get' + response: + mediaType: application/json + openAPIDocKey: '200' + objectKey: $.projectDomains + request: + nativeCasing: camel + config: + pagination: + requestToken: + key: until + location: query + responseToken: + key: $.pagination.next + location: body + queryParamPushdown: + top: + paramName: limit + maxValue: 100 + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/domain_project_domains/methods/list' + insert: [] + update: [] + delete: [] + replace: [] +servers: + - url: https://api.vercel.com diff --git a/provider-dev/openapi/src/vercel/v00.00.00000/services/domains_registrar.yaml b/provider-dev/openapi/src/vercel/v00.00.00000/services/domains_registrar.yaml new file mode 100644 index 0000000..60c558e --- /dev/null +++ b/provider-dev/openapi/src/vercel/v00.00.00000/services/domains_registrar.yaml @@ -0,0 +1,3578 @@ +openapi: 3.0.3 +info: + title: domains_registrar API + description: vercel domains_registrar API + version: 0.0.1 +paths: + /v1/registrar/tlds/supported: + get: + tags: + - domains-registrar + operationId: getSupportedTlds + parameters: + - name: teamId + in: query + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + required: false + security: + - bearerToken: [] + responses: + '200': + description: A list of the TLDs supported by Vercel. + content: + application/json: + schema: + $ref: '#/components/schemas/GetSupportedTldsResponse' + '400': + description: There was something wrong with the request + content: + application/json: + schema: + $ref: '#/components/schemas/HttpApiDecodeError' + '401': + description: Unauthorized + content: + application/json: + schema: + $ref: '#/components/schemas/Unauthorized' + '403': + description: NotAuthorizedForScope + content: + application/json: + schema: + $ref: '#/components/schemas/NotAuthorizedForScope' + '429': + description: TooManyRequests + content: + application/json: + schema: + $ref: '#/components/schemas/TooManyRequests' + '500': + description: InternalServerError + content: + application/json: + schema: + $ref: '#/components/schemas/InternalServerError' + description: Get a list of TLDs supported by Vercel + summary: Get supported TLDs + /v1/registrar/tlds/{tld}: + get: + tags: + - domains-registrar + operationId: getTld + parameters: + - name: tld + in: path + schema: + $ref: '#/components/schemas/TldName' + required: true + - name: teamId + in: query + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + required: false + security: + - bearerToken: [] + responses: + '200': + description: Success + content: + application/json: + schema: + type: object + required: + - supportedLanguageCodes + properties: + supportedLanguageCodes: + type: object + properties: {} + additionalProperties: + type: string + description: The language codes that are supported for the TLD. The key is the language code, and the value is the name of the language. + additionalProperties: false + '400': + description: There was something wrong with the request + content: + application/json: + schema: + type: object + required: + - status + - code + - message + - issues + properties: + status: + type: number + enum: + - 400 + code: + type: string + enum: + - tld_not_supported + message: + type: string + issues: + type: array + items: + $ref: '#/components/schemas/Issue' + additionalProperties: false + description: The TLD is not currently supported. + '401': + description: Unauthorized + content: + application/json: + schema: + $ref: '#/components/schemas/Unauthorized' + '403': + description: NotAuthorizedForScope + content: + application/json: + schema: + $ref: '#/components/schemas/NotAuthorizedForScope' + '429': + description: TooManyRequests + content: + application/json: + schema: + $ref: '#/components/schemas/TooManyRequests' + '500': + description: InternalServerError + content: + application/json: + schema: + $ref: '#/components/schemas/InternalServerError' + description: Get the metadata for a specific TLD. + summary: Get TLD + /v1/registrar/tlds/{tld}/price: + get: + tags: + - domains-registrar + operationId: getTldPrice + parameters: + - name: tld + in: path + schema: + $ref: '#/components/schemas/TldName' + required: true + - name: years + in: query + schema: + type: string + description: The number of years to get the price for. If not provided, the minimum number of years for the TLD will be used. + required: false + description: The number of years to get the price for. If not provided, the minimum number of years for the TLD will be used. + - name: teamId + in: query + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + required: false + security: + - bearerToken: [] + responses: + '200': + description: Success + content: + application/json: + schema: + type: object + required: + - years + - purchasePrice + - renewalPrice + - transferPrice + properties: + years: + type: number + description: The number of years the returned price is for. + purchasePrice: + type: number + minimum: 0.01 + renewalPrice: + type: number + minimum: 0.01 + transferPrice: + type: number + minimum: 0.01 + additionalProperties: false + '400': + description: There was something wrong with the request + content: + application/json: + schema: + type: object + required: + - status + - code + - message + - issues + properties: + status: + type: number + enum: + - 400 + code: + type: string + enum: + - tld_not_supported + message: + type: string + issues: + type: array + items: + $ref: '#/components/schemas/Issue' + additionalProperties: false + description: The TLD is not currently supported. + '401': + description: Unauthorized + content: + application/json: + schema: + $ref: '#/components/schemas/Unauthorized' + '403': + description: NotAuthorizedForScope + content: + application/json: + schema: + $ref: '#/components/schemas/NotAuthorizedForScope' + '429': + description: TooManyRequests + content: + application/json: + schema: + $ref: '#/components/schemas/TooManyRequests' + '500': + description: InternalServerError + content: + application/json: + schema: + $ref: '#/components/schemas/InternalServerError' + description: Get price data for a specific TLD. This only reflects base prices for the given TLD. Premium domains may have different prices. Use the [Get price data for a domain](https://vercel.com/docs/rest-api/reference/endpoints/domains-registrar/get-price-data-for-a-domain) endpoint to get the price data for a specific domain. + summary: Get TLD price data + /v1/registrar/domains/{domain}/availability: + get: + tags: + - domains-registrar + operationId: getDomainAvailability + parameters: + - name: domain + in: path + schema: + $ref: '#/components/schemas/DomainName' + required: true + - name: teamId + in: query + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + required: false + security: + - bearerToken: [] + responses: + '200': + description: Success + content: + application/json: + schema: + type: object + required: + - available + properties: + available: + type: boolean + additionalProperties: false + '400': + description: There was something wrong with the request + content: + application/json: + schema: + $ref: '#/components/schemas/HttpApiDecodeError' + '401': + description: Unauthorized + content: + application/json: + schema: + $ref: '#/components/schemas/Unauthorized' + '403': + description: NotAuthorizedForScope + content: + application/json: + schema: + $ref: '#/components/schemas/NotAuthorizedForScope' + '404': + description: NotFound + content: + application/json: + schema: + $ref: '#/components/schemas/NotFound' + '429': + description: TooManyRequests + content: + application/json: + schema: + $ref: '#/components/schemas/TooManyRequests' + '500': + description: InternalServerError + content: + application/json: + schema: + $ref: '#/components/schemas/InternalServerError' + description: Get availability for a specific domain. If the domain is available, it can be purchased using the [Buy a domain](https://vercel.com/docs/rest-api/reference/endpoints/domains-registrar/buy-a-domain) endpoint or the [Buy multiple domains](https://vercel.com/docs/rest-api/reference/endpoints/domains-registrar/buy-multiple-domains) endpoint. + summary: Get availability for a domain + /v1/registrar/domains/{domain}/price: + get: + tags: + - domains-registrar + operationId: getDomainPrice + parameters: + - name: domain + in: path + schema: + $ref: '#/components/schemas/DomainName' + required: true + - name: years + in: query + schema: + type: string + description: The number of years to get the price for. If not provided, the minimum number of years for the TLD will be used. + required: false + description: The number of years to get the price for. If not provided, the minimum number of years for the TLD will be used. + - name: teamId + in: query + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + required: false + security: + - bearerToken: [] + responses: + '200': + description: Success + content: + application/json: + schema: + type: object + required: + - years + - purchasePrice + - renewalPrice + - transferPrice + properties: + years: + type: number + purchasePrice: + type: number + minimum: 0.01 + renewalPrice: + type: number + minimum: 0.01 + transferPrice: + type: number + minimum: 0.01 + additionalProperties: false + '400': + description: There was something wrong with the request + content: + application/json: + schema: + type: object + required: + - status + - code + - message + - issues + properties: + status: + type: number + enum: + - 400 + code: + type: string + enum: + - bad_request + message: + type: string + issues: + type: array + items: + $ref: '#/components/schemas/Issue' + additionalProperties: false + description: The domain name (excluding the TLD) is too short. + '401': + description: Unauthorized + content: + application/json: + schema: + $ref: '#/components/schemas/Unauthorized' + '403': + description: NotAuthorizedForScope + content: + application/json: + schema: + $ref: '#/components/schemas/NotAuthorizedForScope' + '429': + description: TooManyRequests + content: + application/json: + schema: + $ref: '#/components/schemas/TooManyRequests' + '500': + description: InternalServerError + content: + application/json: + schema: + $ref: '#/components/schemas/InternalServerError' + description: Get price data for a specific domain + summary: Get price data for a domain + /v1/registrar/domains/availability: + post: + tags: + - domains-registrar + operationId: getBulkAvailability + parameters: + - name: teamId + in: query + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + required: false + security: + - bearerToken: [] + responses: + '200': + description: Success + content: + application/json: + schema: + type: object + required: + - results + properties: + results: + type: array + items: + type: object + required: + - domain + - available + properties: + domain: + $ref: '#/components/schemas/DomainName' + available: + type: boolean + additionalProperties: false + additionalProperties: false + '400': + description: There was something wrong with the request + content: + application/json: + schema: + $ref: '#/components/schemas/HttpApiDecodeError' + '401': + description: Unauthorized + content: + application/json: + schema: + $ref: '#/components/schemas/Unauthorized' + '403': + description: NotAuthorizedForScope + content: + application/json: + schema: + $ref: '#/components/schemas/NotAuthorizedForScope' + '429': + description: TooManyRequests + content: + application/json: + schema: + $ref: '#/components/schemas/TooManyRequests' + '500': + description: InternalServerError + content: + application/json: + schema: + $ref: '#/components/schemas/InternalServerError' + description: Get availability for multiple domains. If the domains are available, they can be purchased using the [Buy a domain](https://vercel.com/docs/rest-api/reference/endpoints/domains-registrar/buy-a-domain) endpoint or the [Buy multiple domains](https://vercel.com/docs/rest-api/reference/endpoints/domains-registrar/buy-multiple-domains) endpoint. + summary: Get availability for multiple domains + requestBody: + content: + application/json: + schema: + type: object + required: + - domains + properties: + domains: + type: array + minItems: 1 + items: + $ref: '#/components/schemas/DomainName' + description: an array of at most 50 item(s) + title: maxItems(50) + maxItems: 50 + additionalProperties: false + required: true + /v1/registrar/domains/{domain}/auth-code: + get: + tags: + - domains-registrar + operationId: getDomainAuthCode + parameters: + - name: domain + in: path + schema: + $ref: '#/components/schemas/DomainName' + required: true + - name: teamId + in: query + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + required: false + security: + - bearerToken: [] + responses: + '200': + description: Success + content: + application/json: + schema: + type: object + required: + - authCode + properties: + authCode: + type: string + additionalProperties: false + '400': + description: There was something wrong with the request + content: + application/json: + schema: + type: object + required: + - status + - code + - message + - issues + properties: + status: + type: number + enum: + - 400 + code: + type: string + enum: + - domain_not_registered + message: + type: string + issues: + type: array + items: + $ref: '#/components/schemas/Issue' + additionalProperties: false + description: The domain is not registered with Vercel. + '401': + description: Unauthorized + content: + application/json: + schema: + $ref: '#/components/schemas/Unauthorized' + '403': + description: NotAuthorizedForScope + content: + application/json: + schema: + type: object + required: + - status + - code + - message + properties: + status: + type: number + enum: + - 403 + code: + type: string + enum: + - not_authorized_for_scope + message: + type: string + additionalProperties: false + '404': + description: The domain was not found in our system. + content: + application/json: + schema: + $ref: '#/components/schemas/DomainNotFound' + '409': + description: The domain cannot be transfered out until the specified date. + content: + application/json: + schema: + $ref: '#/components/schemas/DomainCannotBeTransferedOutUntil' + '429': + description: TooManyRequests + content: + application/json: + schema: + $ref: '#/components/schemas/TooManyRequests' + '500': + description: InternalServerError + content: + application/json: + schema: + $ref: '#/components/schemas/InternalServerError' + description: Get the auth code for a domain. This is required to transfer a domain from Vercel to another registrar. + summary: Get the auth code for a domain + /v1/registrar/domains/{domain}/buy: + post: + tags: + - domains-registrar + operationId: buySingleDomain + parameters: + - name: domain + in: path + schema: + $ref: '#/components/schemas/DomainName' + required: true + - name: teamId + in: query + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + required: false + security: + - bearerToken: [] + responses: + '200': + description: Success + content: + application/json: + schema: + type: object + required: + - orderId + - _links + properties: + orderId: + $ref: '#/components/schemas/OrderId' + _links: + type: object + additionalProperties: + type: object + required: + - href + - method + properties: + href: + type: string + method: + type: string + enum: + - GET + - POST + - PUT + - DELETE + - PATCH + additionalProperties: false + additionalProperties: false + '400': + description: There was something wrong with the request + content: + application/json: + schema: + type: object + required: + - status + - code + - message + - issues + properties: + status: + type: number + enum: + - 400 + code: + type: string + enum: + - domain_too_short + message: + type: string + issues: + type: array + items: + $ref: '#/components/schemas/Issue' + additionalProperties: false + description: The domain name (excluding the TLD) is too short. + '401': + description: Unauthorized + content: + application/json: + schema: + $ref: '#/components/schemas/Unauthorized' + '403': + description: NotAuthorizedForScope + content: + application/json: + schema: + type: object + required: + - status + - code + - message + properties: + status: + type: number + enum: + - 403 + code: + type: string + enum: + - not_authorized_for_scope + message: + type: string + additionalProperties: false + '429': + description: TooManyRequests + content: + application/json: + schema: + $ref: '#/components/schemas/TooManyRequests' + '500': + description: InternalServerError + content: + application/json: + schema: + $ref: '#/components/schemas/InternalServerError' + description: Buy a domain + summary: Buy a domain + requestBody: + content: + application/json: + schema: + type: object + required: + - autoRenew + - years + - expectedPrice + - contactInformation + properties: + autoRenew: + type: boolean + description: Whether the domain should be auto-renewed before it expires. This can be configured later through the Vercel Dashboard or the [Update auto-renew for a domain](https://vercel.com/docs/rest-api/reference/endpoints/domains-registrar/update-auto-renew-for-a-domain) endpoint. + years: + type: number + description: The number of years to purchase the domain for. + expectedPrice: + type: number + minimum: 0.01 + contactInformation: + type: object + required: + - firstName + - lastName + - email + - phone + - address1 + - city + - state + - zip + - country + properties: + firstName: + $ref: '#/components/schemas/NonEmptyTrimmedString' + lastName: + $ref: '#/components/schemas/NonEmptyTrimmedString' + email: + $ref: '#/components/schemas/EmailAddress' + phone: + $ref: '#/components/schemas/E164PhoneNumber' + address1: + $ref: '#/components/schemas/NonEmptyTrimmedString' + address2: + $ref: '#/components/schemas/NonEmptyTrimmedString' + city: + $ref: '#/components/schemas/NonEmptyTrimmedString' + state: + $ref: '#/components/schemas/NonEmptyTrimmedString' + zip: + $ref: '#/components/schemas/NonEmptyTrimmedString' + country: + $ref: '#/components/schemas/CountryCode' + companyName: + $ref: '#/components/schemas/NonEmptyTrimmedString' + fax: + $ref: '#/components/schemas/E164PhoneNumber' + additional: + type: object + properties: {} + additionalProperties: false + description: The contact information for the domain. Some TLDs require additional contact information. Use the [Get contact info schema](https://vercel.com/docs/rest-api/reference/endpoints/domains-registrar/get-contact-info-schema) endpoint to retrieve the required fields. + languageCode: + type: string + description: The language code for the domain. For punycode domains, this must be provided. The list of supported language codes for a TLD can be retrieved from the [Get TLD](https://vercel.com/docs/rest-api/reference/endpoints/domains-registrar/get-tld) endpoint. + additionalProperties: false + required: true + /v1/registrar/domains/buy: + post: + tags: + - domains-registrar + operationId: buyDomains + parameters: + - name: teamId + in: query + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + required: false + security: + - bearerToken: [] + responses: + '200': + description: Success + content: + application/json: + schema: + type: object + required: + - orderId + - _links + properties: + orderId: + $ref: '#/components/schemas/OrderId' + _links: + type: object + additionalProperties: + type: object + required: + - href + - method + properties: + href: + type: string + method: + type: string + enum: + - GET + - POST + - PUT + - DELETE + - PATCH + additionalProperties: false + additionalProperties: false + '400': + description: There was something wrong with the request + content: + application/json: + schema: + type: object + required: + - status + - code + - message + - issues + properties: + status: + type: number + enum: + - 400 + code: + type: string + enum: + - domain_too_short + message: + type: string + issues: + type: array + items: + $ref: '#/components/schemas/Issue' + additionalProperties: false + description: The domain name (excluding the TLD) is too short. + '401': + description: Unauthorized + content: + application/json: + schema: + $ref: '#/components/schemas/Unauthorized' + '403': + description: NotAuthorizedForScope + content: + application/json: + schema: + type: object + required: + - status + - code + - message + properties: + status: + type: number + enum: + - 403 + code: + type: string + enum: + - not_authorized_for_scope + message: + type: string + additionalProperties: false + '429': + description: TooManyRequests + content: + application/json: + schema: + $ref: '#/components/schemas/TooManyRequests' + '500': + description: InternalServerError + content: + application/json: + schema: + $ref: '#/components/schemas/InternalServerError' + description: Buy multiple domains at once + summary: Buy multiple domains + requestBody: + content: + application/json: + schema: + type: object + required: + - domains + - contactInformation + properties: + domains: + type: array + minItems: 1 + items: + type: object + required: + - domainName + - autoRenew + - years + - expectedPrice + properties: + domainName: + $ref: '#/components/schemas/DomainName' + autoRenew: + type: boolean + description: Whether the domain should be auto-renewed before it expires. This can be configured later through the Vercel Dashboard or the [Update auto-renew for a domain](https://vercel.com/docs/rest-api/reference/endpoints/domains-registrar/update-auto-renew-for-a-domain) endpoint. + years: + type: number + description: The number of years to purchase the domain for. + expectedPrice: + type: number + minimum: 0.01 + languageCode: + type: string + description: The language code for the domain. For punycode domains, this must be provided. The list of supported language codes for a TLD can be retrieved from the [Get TLD](https://vercel.com/docs/rest-api/reference/endpoints/domains-registrar/get-tld) endpoint. + additionalProperties: false + contactInformation: + type: object + required: + - firstName + - lastName + - email + - phone + - address1 + - city + - state + - zip + - country + properties: + firstName: + $ref: '#/components/schemas/NonEmptyTrimmedString' + lastName: + $ref: '#/components/schemas/NonEmptyTrimmedString' + email: + $ref: '#/components/schemas/EmailAddress' + phone: + $ref: '#/components/schemas/E164PhoneNumber' + address1: + $ref: '#/components/schemas/NonEmptyTrimmedString' + address2: + $ref: '#/components/schemas/NonEmptyTrimmedString' + city: + $ref: '#/components/schemas/NonEmptyTrimmedString' + state: + $ref: '#/components/schemas/NonEmptyTrimmedString' + zip: + $ref: '#/components/schemas/NonEmptyTrimmedString' + country: + $ref: '#/components/schemas/CountryCode' + companyName: + $ref: '#/components/schemas/NonEmptyTrimmedString' + fax: + $ref: '#/components/schemas/E164PhoneNumber' + additional: + type: object + properties: {} + additionalProperties: false + description: The contact information for the domain. Some TLDs require additional contact information. Use the [Get contact info schema](https://vercel.com/docs/rest-api/reference/endpoints/domains-registrar/get-contact-info-schema) endpoint to retrieve the required fields. + additionalProperties: false + required: true + /v1/registrar/domains/{domain}/transfer: + post: + tags: + - domains-registrar + operationId: transferInDomain + parameters: + - name: domain + in: path + schema: + $ref: '#/components/schemas/DomainName' + required: true + - name: teamId + in: query + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + required: false + security: + - bearerToken: [] + responses: + '200': + description: Success + content: + application/json: + schema: + type: object + required: + - orderId + - _links + properties: + orderId: + $ref: '#/components/schemas/OrderId' + _links: + type: object + additionalProperties: + type: object + required: + - href + - method + properties: + href: + type: string + method: + type: string + enum: + - GET + - POST + - PUT + - DELETE + - PATCH + additionalProperties: false + additionalProperties: false + '400': + description: There was something wrong with the request + content: + application/json: + schema: + type: object + required: + - status + - code + - message + - issues + properties: + status: + type: number + enum: + - 400 + code: + type: string + enum: + - bad_request + message: + type: string + issues: + type: array + items: + $ref: '#/components/schemas/Issue' + additionalProperties: false + description: The domain is already owned by another team or user. + '401': + description: Unauthorized + content: + application/json: + schema: + $ref: '#/components/schemas/Unauthorized' + '403': + description: NotAuthorizedForScope + content: + application/json: + schema: + type: object + required: + - status + - code + - message + properties: + status: + type: number + enum: + - 403 + code: + type: string + enum: + - not_authorized_for_scope + message: + type: string + additionalProperties: false + '429': + description: TooManyRequests + content: + application/json: + schema: + $ref: '#/components/schemas/TooManyRequests' + '500': + description: InternalServerError + content: + application/json: + schema: + $ref: '#/components/schemas/InternalServerError' + description: Transfer a domain in from another registrar + summary: Transfer-in a domain + requestBody: + content: + application/json: + schema: + type: object + required: + - authCode + - autoRenew + - years + - expectedPrice + - contactInformation + properties: + authCode: + type: string + description: The auth code for the domain. You must obtain this code from the losing registrar. + autoRenew: + type: boolean + description: Whether the domain should be auto-renewed before it expires. This can be configured later through the Vercel Dashboard or the [Update auto-renew for a domain](https://vercel.com/docs/rest-api/reference/endpoints/domains-registrar/update-auto-renew-for-a-domain) endpoint. + years: + type: number + description: The number of years to renew the domain for once it is transferred in. This must be a valid number of transfer years for the TLD. + expectedPrice: + type: number + minimum: 0.01 + contactInformation: + type: object + required: + - firstName + - lastName + - email + - phone + - address1 + - city + - state + - zip + - country + properties: + firstName: + $ref: '#/components/schemas/NonEmptyTrimmedString' + lastName: + $ref: '#/components/schemas/NonEmptyTrimmedString' + email: + $ref: '#/components/schemas/EmailAddress' + phone: + $ref: '#/components/schemas/E164PhoneNumber' + address1: + $ref: '#/components/schemas/NonEmptyTrimmedString' + address2: + $ref: '#/components/schemas/NonEmptyTrimmedString' + city: + $ref: '#/components/schemas/NonEmptyTrimmedString' + state: + $ref: '#/components/schemas/NonEmptyTrimmedString' + zip: + $ref: '#/components/schemas/NonEmptyTrimmedString' + country: + $ref: '#/components/schemas/CountryCode' + companyName: + $ref: '#/components/schemas/NonEmptyTrimmedString' + fax: + $ref: '#/components/schemas/E164PhoneNumber' + additionalProperties: false + additionalProperties: false + required: true + get: + tags: + - domains-registrar + operationId: getDomainTransferIn + parameters: + - name: domain + in: path + schema: + $ref: '#/components/schemas/DomainName' + required: true + - name: teamId + in: query + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + required: false + security: + - bearerToken: [] + responses: + '200': + description: Success + content: + application/json: + schema: + type: object + required: + - status + properties: + status: + type: string + enum: + - canceled + - canceled_pending_refund + - completed + - created + - failed + - pending + - pending_insert + - pending_new_auth_code + - pending_transfer + - pending_unlock + - pending_registry_unlock + - rejected + - submitting_transfer + additionalProperties: false + '400': + description: There was something wrong with the request + content: + application/json: + schema: + $ref: '#/components/schemas/HttpApiDecodeError' + '401': + description: Unauthorized + content: + application/json: + schema: + $ref: '#/components/schemas/Unauthorized' + '403': + description: NotAuthorizedForScope + content: + application/json: + schema: + type: object + required: + - status + - code + - message + properties: + status: + type: number + enum: + - 403 + code: + type: string + enum: + - not_authorized_for_scope + message: + type: string + additionalProperties: false + '404': + description: NotFound + content: + application/json: + schema: + $ref: '#/components/schemas/NotFound' + '429': + description: TooManyRequests + content: + application/json: + schema: + $ref: '#/components/schemas/TooManyRequests' + '500': + description: InternalServerError + content: + application/json: + schema: + $ref: '#/components/schemas/InternalServerError' + description: Get the transfer status for a domain + summary: Get a domain's transfer status + /v1/registrar/domains/{domain}/renew: + post: + tags: + - domains-registrar + operationId: renewDomain + parameters: + - name: domain + in: path + schema: + $ref: '#/components/schemas/DomainName' + required: true + - name: teamId + in: query + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + required: false + security: + - bearerToken: [] + responses: + '200': + description: Success + content: + application/json: + schema: + type: object + required: + - orderId + - _links + properties: + orderId: + $ref: '#/components/schemas/OrderId' + _links: + type: object + additionalProperties: + type: object + required: + - href + - method + properties: + href: + type: string + method: + type: string + enum: + - GET + - POST + - PUT + - DELETE + - PATCH + additionalProperties: false + additionalProperties: false + '400': + description: There was something wrong with the request + content: + application/json: + schema: + type: object + required: + - status + - code + - message + - issues + properties: + status: + type: number + enum: + - 400 + code: + type: string + enum: + - bad_request + message: + type: string + issues: + type: array + items: + $ref: '#/components/schemas/Issue' + additionalProperties: false + description: The domain name (excluding the TLD) is too short. + '401': + description: Unauthorized + content: + application/json: + schema: + $ref: '#/components/schemas/Unauthorized' + '403': + description: NotAuthorizedForScope + content: + application/json: + schema: + type: object + required: + - status + - code + - message + properties: + status: + type: number + enum: + - 403 + code: + type: string + enum: + - not_authorized_for_scope + message: + type: string + additionalProperties: false + '404': + description: The domain was not found in our system. + content: + application/json: + schema: + $ref: '#/components/schemas/DomainNotFound' + '429': + description: TooManyRequests + content: + application/json: + schema: + $ref: '#/components/schemas/TooManyRequests' + '500': + description: InternalServerError + content: + application/json: + schema: + $ref: '#/components/schemas/InternalServerError' + description: Renew a domain + summary: Renew a domain + requestBody: + content: + application/json: + schema: + type: object + required: + - years + - expectedPrice + properties: + years: + type: number + description: The number of years to renew the domain for. + expectedPrice: + type: number + minimum: 0.01 + contactInformation: + type: object + required: + - firstName + - lastName + - email + - phone + - address1 + - city + - state + - zip + - country + properties: + firstName: + $ref: '#/components/schemas/NonEmptyTrimmedString' + lastName: + $ref: '#/components/schemas/NonEmptyTrimmedString' + email: + $ref: '#/components/schemas/EmailAddress' + phone: + $ref: '#/components/schemas/E164PhoneNumber' + address1: + $ref: '#/components/schemas/NonEmptyTrimmedString' + address2: + $ref: '#/components/schemas/NonEmptyTrimmedString' + city: + $ref: '#/components/schemas/NonEmptyTrimmedString' + state: + $ref: '#/components/schemas/NonEmptyTrimmedString' + zip: + $ref: '#/components/schemas/NonEmptyTrimmedString' + country: + $ref: '#/components/schemas/CountryCode' + companyName: + $ref: '#/components/schemas/NonEmptyTrimmedString' + fax: + $ref: '#/components/schemas/E164PhoneNumber' + additionalProperties: false + additionalProperties: false + required: true + /v1/registrar/domains/{domain}/auto-renew: + patch: + tags: + - domains-registrar + operationId: updateDomainAutoRenew + parameters: + - name: domain + in: path + schema: + $ref: '#/components/schemas/DomainName' + required: true + - name: teamId + in: query + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + required: false + security: + - bearerToken: [] + responses: + '204': + description: Success + '400': + description: There was something wrong with the request + content: + application/json: + schema: + type: object + required: + - status + - code + - message + - issues + properties: + status: + type: number + enum: + - 400 + code: + type: string + enum: + - domain_already_renewing + message: + type: string + issues: + type: array + items: + $ref: '#/components/schemas/Issue' + additionalProperties: false + description: The domain is already renewing. + '401': + description: Unauthorized + content: + application/json: + schema: + $ref: '#/components/schemas/Unauthorized' + '403': + description: NotAuthorizedForScope + content: + application/json: + schema: + type: object + required: + - status + - code + - message + properties: + status: + type: number + enum: + - 403 + code: + type: string + enum: + - not_authorized_for_scope + message: + type: string + additionalProperties: false + '404': + description: The domain was not found in our system. + content: + application/json: + schema: + $ref: '#/components/schemas/DomainNotFound' + '429': + description: TooManyRequests + content: + application/json: + schema: + $ref: '#/components/schemas/TooManyRequests' + '500': + description: InternalServerError + content: + application/json: + schema: + $ref: '#/components/schemas/InternalServerError' + description: Update the auto-renew setting for a domain + summary: Update auto-renew for a domain + requestBody: + content: + application/json: + schema: + type: object + required: + - autoRenew + properties: + autoRenew: + type: boolean + additionalProperties: false + required: true + /v1/registrar/domains/{domain}/nameservers: + patch: + tags: + - domains-registrar + operationId: updateDomainNameservers + parameters: + - name: domain + in: path + schema: + $ref: '#/components/schemas/DomainName' + required: true + - name: teamId + in: query + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + required: false + security: + - bearerToken: [] + responses: + '204': + description: Success + '400': + description: There was something wrong with the request + content: + application/json: + schema: + type: object + required: + - status + - code + - message + - issues + properties: + status: + type: number + enum: + - 400 + code: + type: string + enum: + - domain_not_registered + message: + type: string + issues: + type: array + items: + $ref: '#/components/schemas/Issue' + additionalProperties: false + description: The domain is not registered with Vercel. + '401': + description: Unauthorized + content: + application/json: + schema: + $ref: '#/components/schemas/Unauthorized' + '403': + description: NotAuthorizedForScope + content: + application/json: + schema: + type: object + required: + - status + - code + - message + properties: + status: + type: number + enum: + - 403 + code: + type: string + enum: + - not_authorized_for_scope + message: + type: string + additionalProperties: false + '404': + description: The domain was not found in our system. + content: + application/json: + schema: + $ref: '#/components/schemas/DomainNotFound' + '429': + description: TooManyRequests + content: + application/json: + schema: + $ref: '#/components/schemas/TooManyRequests' + '500': + description: InternalServerError + content: + application/json: + schema: + $ref: '#/components/schemas/InternalServerError' + description: Update the nameservers for a domain. Pass an empty array to use Vercel's default nameservers. + summary: Update nameservers for a domain + requestBody: + content: + application/json: + schema: + type: object + required: + - nameservers + properties: + nameservers: + type: array + items: + $ref: '#/components/schemas/Nameserver' + additionalProperties: false + required: true + /v1/registrar/domains/{domain}/contact-verification: + get: + tags: + - domains-registrar + operationId: getDomainContactVerification + parameters: + - name: domain + in: path + schema: + $ref: '#/components/schemas/DomainName' + required: true + - name: teamId + in: query + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + required: false + security: + - bearerToken: [] + responses: + '200': + description: The registrant contact has been verified. + content: + application/json: + schema: + type: object + required: + - verified + - verifyBy + - email + properties: + verified: + type: boolean + enum: + - true + verifyBy: + $ref: '#/components/schemas/DateFromString' + email: + type: string + additionalProperties: false + description: The registrant contact has been verified. + title: Verified + '400': + description: There was something wrong with the request + content: + application/json: + schema: + type: object + required: + - status + - code + - message + - issues + properties: + status: + type: number + enum: + - 400 + code: + type: string + enum: + - bought_too_recently + message: + type: string + issues: + type: array + items: + $ref: '#/components/schemas/Issue' + additionalProperties: false + description: The domain was bought too recently to determine verification status. + '401': + description: Unauthorized + content: + application/json: + schema: + $ref: '#/components/schemas/Unauthorized' + '403': + description: NotAuthorizedForScope + content: + application/json: + schema: + type: object + required: + - status + - code + - message + properties: + status: + type: number + enum: + - 403 + code: + type: string + enum: + - not_authorized_for_scope + message: + type: string + additionalProperties: false + '404': + description: The domain was not found in our system. + content: + application/json: + schema: + $ref: '#/components/schemas/DomainNotFound' + '429': + description: TooManyRequests + content: + application/json: + schema: + $ref: '#/components/schemas/TooManyRequests' + '500': + description: InternalServerError + content: + application/json: + schema: + $ref: '#/components/schemas/InternalServerError' + description: Get the registrant contact verification status for a domain. Use this after purchasing a domain to determine whether the contact has been verified. Note that a bought_too_recently error will be returned if the domain was bought less than 30 minutes before the request. + summary: Get contact verification status for a domain + /v1/registrar/domains/{domain}/contact-info/schema: + get: + tags: + - domains-registrar + operationId: getContactInfoSchema + parameters: + - name: domain + in: path + schema: + $ref: '#/components/schemas/DomainName' + required: true + - name: teamId + in: query + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + required: false + security: + - bearerToken: [] + responses: + '200': + description: Success + content: + application/json: + schema: + type: object + properties: {} + '400': + description: There was something wrong with the request + content: + application/json: + schema: + type: object + required: + - status + - code + - message + - issues + properties: + status: + type: number + enum: + - 400 + code: + type: string + enum: + - bad_request + message: + type: string + issues: + type: array + items: + $ref: '#/components/schemas/Issue' + additionalProperties: false + description: The request did not match the expected schema + '401': + description: Unauthorized + content: + application/json: + schema: + $ref: '#/components/schemas/Unauthorized' + '403': + description: NotAuthorizedForScope + content: + application/json: + schema: + $ref: '#/components/schemas/NotAuthorizedForScope' + '429': + description: TooManyRequests + content: + application/json: + schema: + $ref: '#/components/schemas/TooManyRequests' + '500': + description: InternalServerError + content: + application/json: + schema: + $ref: '#/components/schemas/InternalServerError' + description: Some TLDs require additional contact information. Use this endpoint to get the schema for the tld-specific contact information for a domain. + summary: Get contact info schema + /v1/registrar/orders/{order_id}: + get: + tags: + - domains-registrar + operationId: getOrder + parameters: + - name: order_id + in: path + schema: + $ref: '#/components/schemas/OrderId' + required: true + - name: teamId + in: query + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + required: false + security: + - bearerToken: [] + responses: + '200': + description: Success + content: + application/json: + schema: + type: object + required: + - orderId + - domains + - status + properties: + orderId: + $ref: '#/components/schemas/OrderId' + domains: + type: array + items: + anyOf: + - type: object + required: + - purchaseType + - autoRenew + - years + - domainName + - status + - price + properties: + purchaseType: + type: string + enum: + - purchase + autoRenew: + type: boolean + years: + type: number + description: The number of years the domain is being purchased for. + domainName: + $ref: '#/components/schemas/DomainName' + status: + type: string + enum: + - pending + - completed + - failed + - refunded + - refund-failed + price: + type: number + minimum: 0.01 + error: + anyOf: + - anyOf: + - type: object + required: + - code + - details + properties: + code: + type: string + enum: + - unsupported-language-code + details: + type: object + required: + - detectedLanguageCode + properties: + detectedLanguageCode: + type: string + additionalProperties: false + additionalProperties: false + - type: object + required: + - code + - details + properties: + code: + type: string + enum: + - incorrect-language-code + details: + type: object + required: + - detectedLanguageCode + properties: + detectedLanguageCode: + type: string + additionalProperties: false + additionalProperties: false + - type: object + required: + - code + properties: + code: + type: string + enum: + - client-transfer-prohibited + additionalProperties: false + - type: object + required: + - code + properties: + code: + type: string + enum: + - incorrect-auth-code + additionalProperties: false + - type: object + required: + - code + properties: + code: + type: string + enum: + - claims-notice-required + additionalProperties: false + - type: object + required: + - code + - details + properties: + code: + type: string + enum: + - cannot-transfer-in-until + details: + type: object + required: + - numDaysUntilTransferrable + properties: + numDaysUntilTransferrable: + type: number + additionalProperties: false + additionalProperties: false + - type: object + required: + - code + properties: + code: + type: string + enum: + - account-transfer-required + additionalProperties: false + - type: object + required: + - code + properties: + code: + type: string + enum: + - price-change + additionalProperties: false + - type: object + required: + - code + properties: + code: + type: string + enum: + - unavailable-legal + additionalProperties: false + - type: object + required: + - code + - details + properties: + code: + type: string + enum: + - invalid-contact + details: + type: object + properties: + invalidField: + type: string + enum: + - firstName + - lastName + - email + - phone + - address1 + - address2 + - city + - state + - zip + - country + - companyName + - fax + additionalProperties: false + additionalProperties: false + - type: object + required: + - code + properties: + code: + type: string + details: + title: unknown + additionalProperties: false + additionalProperties: false + - type: object + required: + - purchaseType + - years + - domainName + - status + - price + properties: + purchaseType: + type: string + enum: + - renewal + years: + type: number + description: The number of years the domain is being renewed for. + domainName: + $ref: '#/components/schemas/DomainName' + status: + type: string + enum: + - pending + - completed + - failed + - refunded + - refund-failed + price: + type: number + minimum: 0.01 + error: + anyOf: + - anyOf: + - type: object + required: + - code + - details + properties: + code: + type: string + enum: + - unsupported-language-code + details: + type: object + required: + - detectedLanguageCode + properties: + detectedLanguageCode: + type: string + additionalProperties: false + additionalProperties: false + - type: object + required: + - code + - details + properties: + code: + type: string + enum: + - incorrect-language-code + details: + type: object + required: + - detectedLanguageCode + properties: + detectedLanguageCode: + type: string + additionalProperties: false + additionalProperties: false + - type: object + required: + - code + properties: + code: + type: string + enum: + - client-transfer-prohibited + additionalProperties: false + - type: object + required: + - code + properties: + code: + type: string + enum: + - incorrect-auth-code + additionalProperties: false + - type: object + required: + - code + properties: + code: + type: string + enum: + - claims-notice-required + additionalProperties: false + - type: object + required: + - code + - details + properties: + code: + type: string + enum: + - cannot-transfer-in-until + details: + type: object + required: + - numDaysUntilTransferrable + properties: + numDaysUntilTransferrable: + type: number + additionalProperties: false + additionalProperties: false + - type: object + required: + - code + properties: + code: + type: string + enum: + - account-transfer-required + additionalProperties: false + - type: object + required: + - code + properties: + code: + type: string + enum: + - price-change + additionalProperties: false + - type: object + required: + - code + properties: + code: + type: string + enum: + - unavailable-legal + additionalProperties: false + - type: object + required: + - code + - details + properties: + code: + type: string + enum: + - invalid-contact + details: + type: object + properties: + invalidField: + type: string + enum: + - firstName + - lastName + - email + - phone + - address1 + - address2 + - city + - state + - zip + - country + - companyName + - fax + additionalProperties: false + additionalProperties: false + - type: object + required: + - code + properties: + code: + type: string + details: + title: unknown + additionalProperties: false + additionalProperties: false + - type: object + required: + - purchaseType + - autoRenew + - years + - domainName + - status + - price + properties: + purchaseType: + type: string + enum: + - transfer + autoRenew: + type: boolean + years: + type: number + description: The number of years the domain is being transferred for. + domainName: + $ref: '#/components/schemas/DomainName' + status: + type: string + enum: + - pending + - completed + - failed + - refunded + - refund-failed + price: + type: number + minimum: 0.01 + error: + anyOf: + - anyOf: + - type: object + required: + - code + - details + properties: + code: + type: string + enum: + - unsupported-language-code + details: + type: object + required: + - detectedLanguageCode + properties: + detectedLanguageCode: + type: string + additionalProperties: false + additionalProperties: false + - type: object + required: + - code + - details + properties: + code: + type: string + enum: + - incorrect-language-code + details: + type: object + required: + - detectedLanguageCode + properties: + detectedLanguageCode: + type: string + additionalProperties: false + additionalProperties: false + - type: object + required: + - code + properties: + code: + type: string + enum: + - client-transfer-prohibited + additionalProperties: false + - type: object + required: + - code + properties: + code: + type: string + enum: + - incorrect-auth-code + additionalProperties: false + - type: object + required: + - code + properties: + code: + type: string + enum: + - claims-notice-required + additionalProperties: false + - type: object + required: + - code + - details + properties: + code: + type: string + enum: + - cannot-transfer-in-until + details: + type: object + required: + - numDaysUntilTransferrable + properties: + numDaysUntilTransferrable: + type: number + additionalProperties: false + additionalProperties: false + - type: object + required: + - code + properties: + code: + type: string + enum: + - account-transfer-required + additionalProperties: false + - type: object + required: + - code + properties: + code: + type: string + enum: + - price-change + additionalProperties: false + - type: object + required: + - code + properties: + code: + type: string + enum: + - unavailable-legal + additionalProperties: false + - type: object + required: + - code + - details + properties: + code: + type: string + enum: + - invalid-contact + details: + type: object + properties: + invalidField: + type: string + enum: + - firstName + - lastName + - email + - phone + - address1 + - address2 + - city + - state + - zip + - country + - companyName + - fax + additionalProperties: false + additionalProperties: false + - type: object + required: + - code + properties: + code: + type: string + details: + title: unknown + additionalProperties: false + additionalProperties: false + status: + type: string + enum: + - draft + - purchasing + - completed + - failed + error: + anyOf: + - type: object + required: + - code + properties: + code: + type: string + enum: + - payment-failed + additionalProperties: false + - type: object + required: + - code + - details + properties: + code: + type: string + enum: + - tld-outage + details: + type: object + required: + - tlds + properties: + tlds: + type: array + items: + type: object + required: + - tldName + - endsAt + properties: + tldName: + type: string + endsAt: + type: string + additionalProperties: false + additionalProperties: false + additionalProperties: false + - type: object + required: + - code + - details + properties: + code: + type: string + enum: + - price-mismatch + details: + type: object + required: + - expectedPrice + properties: + expectedPrice: + type: number + actualPrice: + type: number + additionalProperties: false + additionalProperties: false + - type: object + required: + - code + properties: + code: + type: string + enum: + - unexpected-error + additionalProperties: false + - type: object + required: + - code + - details + properties: + code: + type: string + enum: + - claims-required + details: + type: object + required: + - message + - domainNames + properties: + message: + type: string + domainNames: + type: array + items: + type: string + additionalProperties: false + additionalProperties: false + - type: object + required: + - code + properties: + code: + type: string + enum: + - domain-mismatch + additionalProperties: false + type: object + required: + - code + properties: + code: + type: string + details: + title: unknown + additionalProperties: false + additionalProperties: false + '400': + description: There was something wrong with the request + content: + application/json: + schema: + $ref: '#/components/schemas/HttpApiDecodeError' + '401': + description: Unauthorized + content: + application/json: + schema: + $ref: '#/components/schemas/Unauthorized' + '403': + description: NotAuthorizedForScope + content: + application/json: + schema: + type: object + required: + - status + - code + - message + properties: + status: + type: number + enum: + - 403 + code: + type: string + enum: + - not_authorized_for_scope + message: + type: string + additionalProperties: false + '404': + description: NotFound + content: + application/json: + schema: + $ref: '#/components/schemas/NotFound' + '429': + description: TooManyRequests + content: + application/json: + schema: + $ref: '#/components/schemas/TooManyRequests' + '500': + description: InternalServerError + content: + application/json: + schema: + $ref: '#/components/schemas/InternalServerError' + description: Get information about a domain order by its ID + summary: Get a domain order +components: + schemas: + TldName: + type: string + description: A valid TLD name + HttpApiDecodeError: + type: object + required: + - issues + - message + properties: + issues: + type: array + items: + $ref: '#/components/schemas/Issue' + message: + type: string + additionalProperties: false + description: The request did not match the expected schema + Unauthorized: + type: object + required: + - status + - code + - message + properties: + status: + type: number + enum: + - 401 + code: + type: string + enum: + - unauthorized + message: + type: string + reason: + type: string + additionalProperties: false + NotAuthorizedForScope: + type: object + required: + - status + - code + - message + properties: + status: + type: number + enum: + - 403 + code: + type: string + enum: + - not_authorized_for_scope + message: + type: string + additionalProperties: false + TooManyRequests: + type: object + required: + - status + - code + - message + - retryAfter + - limit + properties: + status: + type: number + enum: + - 429 + code: + type: string + enum: + - too_many_requests + message: + type: string + retryAfter: + type: object + required: + - value + - str + properties: + value: + type: number + str: + type: string + additionalProperties: false + limit: + type: object + required: + - total + - remaining + - reset + properties: + total: + type: number + remaining: + type: number + reset: + type: number + additionalProperties: false + additionalProperties: false + InternalServerError: + type: object + required: + - status + - code + - message + properties: + status: + type: number + enum: + - 500 + code: + type: string + enum: + - internal_server_error + message: + type: string + additionalProperties: false + TldNotSupported: + type: object + required: + - status + - code + - message + properties: + status: + type: number + enum: + - 400 + code: + type: string + enum: + - tld_not_supported + message: + type: string + additionalProperties: false + description: The TLD is not currently supported. + DomainName: + type: string + description: A valid domain name + NotFound: + type: object + required: + - status + - code + - message + properties: + status: + type: number + enum: + - 404 + code: + type: string + enum: + - not_found + message: + type: string + additionalProperties: false + BadRequest: + type: object + required: + - status + - code + - message + properties: + status: + type: number + enum: + - 400 + code: + type: string + enum: + - bad_request + message: + type: string + additionalProperties: false + DomainTooShort: + type: object + required: + - status + - code + - message + properties: + status: + type: number + enum: + - 400 + code: + type: string + enum: + - domain_too_short + message: + type: string + additionalProperties: false + description: The domain name (excluding the TLD) is too short. + DomainNotRegistered: + type: object + required: + - status + - code + - message + properties: + status: + type: number + enum: + - 400 + code: + type: string + enum: + - domain_not_registered + message: + type: string + additionalProperties: false + description: The domain is not registered with Vercel. + Forbidden: + type: object + required: + - status + - code + - message + properties: + status: + type: number + enum: + - 403 + code: + type: string + enum: + - forbidden + message: + type: string + additionalProperties: false + DomainNotFound: + type: object + required: + - status + - code + - message + properties: + status: + type: number + enum: + - 404 + code: + type: string + enum: + - domain_not_found + message: + type: string + additionalProperties: false + description: The domain was not found in our system. + DomainCannotBeTransferedOutUntil: + type: object + required: + - status + - code + - message + properties: + status: + type: number + enum: + - 409 + code: + type: string + enum: + - domain_cannot_be_transfered_out_until + message: + type: string + additionalProperties: false + description: The domain cannot be transfered out until the specified date. + OrderId: + type: string + description: A valid order ID + OrderTooExpensive: + type: object + required: + - status + - code + - message + properties: + status: + type: number + enum: + - 400 + code: + type: string + enum: + - order_too_expensive + message: + type: string + additionalProperties: false + description: The total price of the order is too high. + InvalidAdditionalContactInfo: + type: object + required: + - status + - code + - message + properties: + status: + type: number + enum: + - 400 + code: + type: string + enum: + - invalid_additional_contact_info + message: + type: string + additionalProperties: false + description: Additional contact information provided for the TLD is invalid. + AdditionalContactInfoRequired: + type: object + required: + - status + - code + - message + properties: + status: + type: number + enum: + - 400 + code: + type: string + enum: + - additional_contact_info_required + message: + type: string + additionalProperties: false + description: Additional contact information is required for the TLD. + ExpectedPriceMismatch: + type: object + required: + - status + - code + - message + properties: + status: + type: number + enum: + - 400 + code: + type: string + enum: + - expected_price_mismatch + message: + type: string + additionalProperties: false + description: The expected price passed does not match the actual price. + DomainNotAvailable: + type: object + required: + - status + - code + - message + properties: + status: + type: number + enum: + - 400 + code: + type: string + enum: + - domain_not_available + message: + type: string + additionalProperties: false + description: The domain is not available. + LanguageCodeRequired: + type: object + required: + - status + - code + - message + properties: + status: + type: number + enum: + - 400 + code: + type: string + enum: + - language_code_required + message: + type: string + additionalProperties: false + description: A language code is required for punycode domains. + NonEmptyTrimmedString: + type: string + description: a non empty string + title: nonEmptyString + pattern: ^\S[\s\S]*\S$|^\S$|^$ + minLength: 1 + EmailAddress: + type: string + description: A valid RFC 5322 email address + title: nonEmptyString + minLength: 1 + E164PhoneNumber: + type: string + description: A valid E.164 phone number + title: nonEmptyString + minLength: 1 + pattern: ^(?=(?:\D*\d){8,15}$)\+[1-9]\d{0,2}\.?\d+$ + CountryCode: + type: string + description: A valid ISO 3166-1 alpha-2 country code + TooManyDomains: + type: object + required: + - status + - code + - message + properties: + status: + type: number + enum: + - 400 + code: + type: string + enum: + - too_many_domains + message: + type: string + additionalProperties: false + description: The number of domains in the order is too high. + DuplicateDomains: + type: object + required: + - status + - code + - message + properties: + status: + type: number + enum: + - 400 + code: + type: string + enum: + - duplicate_domains + message: + type: string + additionalProperties: false + description: Duplicate domains were provided. + DomainAlreadyOwned: + type: object + required: + - status + - code + - message + properties: + status: + type: number + enum: + - 400 + code: + type: string + enum: + - domain_already_owned + message: + type: string + additionalProperties: false + description: The domain is already owned by another team or user. + DNSSECEnabled: + type: object + required: + - status + - code + - message + properties: + status: + type: number + enum: + - 400 + code: + type: string + enum: + - dnssec_enabled + message: + type: string + additionalProperties: false + description: The operation cannot be completed because DNSSEC is enabled for the domain. + DomainAlreadyRenewing: + type: object + required: + - status + - code + - message + properties: + status: + type: number + enum: + - 400 + code: + type: string + enum: + - domain_already_renewing + message: + type: string + additionalProperties: false + description: The domain is already renewing. + DomainNotRenewable: + type: object + required: + - status + - code + - message + properties: + status: + type: number + enum: + - 400 + code: + type: string + enum: + - domain_not_renewable + message: + type: string + additionalProperties: false + description: The domain is not renewable. + Nameserver: + type: string + description: A valid nameserver + ContactVerified: + type: object + required: + - verified + properties: + verified: + type: boolean + enum: + - true + additionalProperties: false + description: The registrant contact has been verified. + title: Verified + ContactPendingVerification: + type: object + required: + - verified + - verifyBy + - email + properties: + verified: + type: boolean + enum: + - false + verifyBy: + $ref: '#/components/schemas/DateFromString' + email: + type: string + additionalProperties: false + description: The registrant contact has not yet been verified. The contact must be verified by `verifyBy`, and a verification email is sent to `email`. + title: Pending verification + BoughtTooRecently: + type: object + required: + - status + - code + - message + properties: + status: + type: number + enum: + - 400 + code: + type: string + enum: + - bought_too_recently + message: + type: string + additionalProperties: false + description: The domain was bought too recently to determine verification status. + Issue: + type: object + required: + - path + - message + properties: + path: + type: array + items: + $ref: '#/components/schemas/PropertyKey' + description: The path to the property where the issue occurred + message: + type: string + description: A descriptive message explaining the issue + additionalProperties: false + description: Represents an error encountered while parsing a value to match the schema + DateFromString: + type: string + description: a string to be decoded into a Date + PropertyKey: + type: string + required: + - _tag + - key + properties: + _tag: + type: string + enum: + - symbol + key: + type: string + additionalProperties: false + description: an object to be decoded into a globally shared symbol + GetSupportedTldsResponse: + type: object + properties: + supported_tlds: + type: array + items: + $ref: '#/components/schemas/TldName' + StackqlTextResponse: + type: object + description: 'Wrapper for non-JSON response bodies (jsonl, ndjson, streamed json, octet-stream): one row carrying the raw body text.' + properties: + items: + type: array + items: + type: object + properties: + contents: + type: string + description: Raw response body. + x-stackQL-resources: + tlds: + id: vercel.domains_registrar.tlds + name: tlds + title: Tlds + methods: + list: + operation: + $ref: '#/paths/~1v1~1registrar~1tlds~1supported/get' + response: + mediaType: application/json + openAPIDocKey: '200' + objectKey: $.supported_tlds + overrideMediaType: application/json + schema_override: + $ref: '#/components/schemas/GetSupportedTldsResponse' + transform: + body: |- + {{- $wrapped := printf "{\"supported_tlds\":%s}" . -}} + {{- $wrapped -}} + type: golang_template_text_v0.3.0 + request: + nativeCasing: camel + get: + operation: + $ref: '#/paths/~1v1~1registrar~1tlds~1{tld}/get' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/tlds/methods/get' + - $ref: '#/components/x-stackQL-resources/tlds/methods/list' + insert: [] + update: [] + delete: [] + replace: [] + tld_prices: + id: vercel.domains_registrar.tld_prices + name: tld_prices + title: Tld Prices + methods: + get: + operation: + $ref: '#/paths/~1v1~1registrar~1tlds~1{tld}~1price/get' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/tld_prices/methods/get' + insert: [] + update: [] + delete: [] + replace: [] + domain_availability: + id: vercel.domains_registrar.domain_availability + name: domain_availability + title: Domain Availability + methods: + get: + operation: + $ref: '#/paths/~1v1~1registrar~1domains~1{domain}~1availability/get' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + get_bulk: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v1~1registrar~1domains~1availability/post' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/domain_availability/methods/get' + insert: [] + update: [] + delete: [] + replace: [] + domain_prices: + id: vercel.domains_registrar.domain_prices + name: domain_prices + title: Domain Prices + methods: + get: + operation: + $ref: '#/paths/~1v1~1registrar~1domains~1{domain}~1price/get' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/domain_prices/methods/get' + insert: [] + update: [] + delete: [] + replace: [] + domain_auth_codes: + id: vercel.domains_registrar.domain_auth_codes + name: domain_auth_codes + title: Domain Auth Codes + methods: + get: + operation: + $ref: '#/paths/~1v1~1registrar~1domains~1{domain}~1auth-code/get' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/domain_auth_codes/methods/get' + insert: [] + update: [] + delete: [] + replace: [] + orders: + id: vercel.domains_registrar.orders + name: orders + title: Orders + methods: + buy_domain: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v1~1registrar~1domains~1{domain}~1buy/post' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + buy_domains: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v1~1registrar~1domains~1buy/post' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + transfer_in_domain: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v1~1registrar~1domains~1{domain}~1transfer/post' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + renew_domain: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v1~1registrar~1domains~1{domain}~1renew/post' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + get: + operation: + $ref: '#/paths/~1v1~1registrar~1orders~1{order_id}/get' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/orders/methods/get' + insert: [] + update: [] + delete: [] + replace: [] + domain_transfers: + id: vercel.domains_registrar.domain_transfers + name: domain_transfers + title: Domain Transfers + methods: + get: + operation: + $ref: '#/paths/~1v1~1registrar~1domains~1{domain}~1transfer/get' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/domain_transfers/methods/get' + insert: [] + update: [] + delete: [] + replace: [] + domains: + id: vercel.domains_registrar.domains + name: domains + title: Domains + methods: + update_auto_renew: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v1~1registrar~1domains~1{domain}~1auto-renew/patch' + response: + mediaType: application/json + openAPIDocKey: '204' + request: + nativeCasing: camel + update_nameservers: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v1~1registrar~1domains~1{domain}~1nameservers/patch' + response: + mediaType: application/json + openAPIDocKey: '204' + request: + nativeCasing: camel + sqlVerbs: + select: [] + insert: [] + update: [] + delete: [] + replace: [] + domain_contact_verification: + id: vercel.domains_registrar.domain_contact_verification + name: domain_contact_verification + title: Domain Contact Verification + methods: + get: + operation: + $ref: '#/paths/~1v1~1registrar~1domains~1{domain}~1contact-verification/get' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/domain_contact_verification/methods/get' + insert: [] + update: [] + delete: [] + replace: [] + contact_info_schema: + id: vercel.domains_registrar.contact_info_schema + name: contact_info_schema + title: Contact Info Schema + methods: + get: + operation: + $ref: '#/paths/~1v1~1registrar~1domains~1{domain}~1contact-info~1schema/get' + response: + mediaType: text/plain + openAPIDocKey: '200' + overrideMediaType: application/json + schema_override: + $ref: '#/components/schemas/StackqlTextResponse' + objectKey: $.items + transform: + type: golang_template_text_v0.3.0 + body: '{"items":[{"contents": {{ toJson . }}}]}' + request: + nativeCasing: camel + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/contact_info_schema/methods/get' + insert: [] + update: [] + delete: [] + replace: [] +servers: + - url: https://api.vercel.com diff --git a/provider-dev/openapi/src/vercel/v00.00.00000/services/drains.yaml b/provider-dev/openapi/src/vercel/v00.00.00000/services/drains.yaml new file mode 100644 index 0000000..b58c2cb --- /dev/null +++ b/provider-dev/openapi/src/vercel/v00.00.00000/services/drains.yaml @@ -0,0 +1,2408 @@ +openapi: 3.0.3 +info: + title: drains API + description: vercel drains API + version: 0.0.1 +paths: + /v1/drains: + post: + description: Create a new Drain with the provided configuration. + operationId: createDrain + security: + - bearerToken: [] + summary: Create a new Drain + tags: + - drains + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + id: + type: string + createdAt: + type: number + updatedAt: + type: number + projectIds: + items: + type: string + type: array + name: + type: string + teamId: + nullable: true + type: string + ownerId: + type: string + status: + type: string + enum: + - disabled + - enabled + - errored + firstErrorTimestamp: + type: number + disabledAt: + type: number + disabledBy: + type: string + disabledReason: + type: string + enum: + - account-plan-downgrade + - disabled-by-admin + - disabled-by-owner + - feature-not-available + - limits-exceeded + schemas: + properties: + log: + type: string + description: (opaque JSON object) + trace: + type: string + description: (opaque JSON object) + analytics: + type: string + description: (opaque JSON object) + speed_insights: + type: string + description: (opaque JSON object) + ai_gateway: + type: string + description: (opaque JSON object) + audit_log: + type: string + description: (opaque JSON object) + connect: + type: string + description: (opaque JSON object) + type: object + delivery: + oneOf: + - properties: + type: + type: string + enum: + - http + endpoint: + type: string + encoding: + type: string + enum: + - json + - ndjson + compression: + type: string + enum: + - gzip + - none + headers: + additionalProperties: + type: string + type: object + secret: + oneOf: + - type: string + - properties: + kind: + type: string + enum: + - INTEGRATION_SECRET + required: + - kind + type: object + required: + - encoding + - endpoint + - headers + - type + type: object + - properties: + type: + type: string + enum: + - otlphttp + endpoint: + properties: + traces: + type: string + required: + - traces + type: object + encoding: + type: string + enum: + - json + - proto + headers: + additionalProperties: + type: string + type: object + secret: + oneOf: + - type: string + - properties: + kind: + type: string + enum: + - INTEGRATION_SECRET + required: + - kind + type: object + required: + - encoding + - endpoint + - headers + - type + type: object + - properties: + type: + type: string + enum: + - clickhouse + endpoint: + type: string + table: + type: string + required: + - endpoint + - table + - type + type: object + - properties: + type: + type: string + enum: + - s3 + endpoint: + type: string + encoding: + type: string + enum: + - json + - ndjson + compression: + type: string + enum: + - none + fileStructure: + type: string + enum: + - hive + roleArn: + type: string + region: + type: string + serverSideEncryption: + type: string + enum: + - AES256 + - aws:kms + - aws:kms:dsse + objectAcl: + type: string + enum: + - authenticated-read + - aws-exec-read + - bucket-owner-full-control + - bucket-owner-read + - private + - public-read + - public-read-write + required: + - compression + - encoding + - endpoint + - fileStructure + - region + - roleArn + - type + type: object + - properties: + type: + type: string + enum: + - internal + target: + type: string + enum: + - vercel-otel-traces-db + required: + - target + - type + type: object + sampling: + items: + properties: + type: + type: string + enum: + - head_sampling + rate: + type: number + env: + type: string + enum: + - preview + - production + requestPath: + type: string + required: + - rate + - type + type: object + type: array + source: + oneOf: + - properties: + kind: + type: string + enum: + - self-served + required: + - kind + type: object + - properties: + kind: + type: string + enum: + - integration + resourceId: + type: string + externalResourceId: + type: string + integrationId: + type: string + integrationConfigurationId: + type: string + required: + - integrationConfigurationId + - integrationId + - kind + type: object + filterV2: + properties: + version: + type: string + enum: + - v2 + filter: + oneOf: + - properties: + type: + type: string + enum: + - basic + project: + properties: + ids: + items: + type: string + type: array + type: object + log: + properties: + sources: + items: + type: string + enum: + - build + - edge + - external + - firewall + - lambda + - redirect + - static + type: array + legacy_excludeCachedStaticAssetLogs: + type: boolean + enum: + - false + - true + type: object + deployment: + properties: + environments: + items: + type: string + enum: + - preview + - production + type: array + type: object + required: + - type + type: object + - properties: + type: + type: string + enum: + - odata + text: + type: string + required: + - text + - type + type: object + required: + - filter + - version + type: object + integrationIcon: + type: string + integrationConfigurationUri: + type: string + integrationWebsite: + type: string + projectAccess: + oneOf: + - properties: + access: + type: string + enum: + - all + managedBy: + type: string + enum: + - drain + - integration + required: + - access + - managedBy + type: object + - properties: + access: + type: string + enum: + - some + projectIds: + items: + type: string + type: array + managedBy: + type: string + enum: + - drain + - integration + required: + - access + - managedBy + - projectIds + type: object + required: + - createdAt + - delivery + - id + - name + - ownerId + - schemas + - source + - updatedAt + type: object + '400': + description: One of the provided values in the request body is invalid. + '401': + description: The request is not authorized. + '402': + description: '' + '403': + description: You do not have permission to access this resource. + '410': + description: '' + parameters: + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + requestBody: + content: + application/json: + schema: + type: object + additionalProperties: false + required: + - name + - projects + - schemas + properties: + name: + type: string + projects: + type: string + enum: + - some + - all + projectIds: + type: array + items: + type: string + filter: + type: object + additionalProperties: false + required: + - version + - filter + properties: + version: + type: string + filter: + oneOf: + - type: object + additionalProperties: false + required: + - type + properties: + type: + type: string + project: + type: object + additionalProperties: false + properties: + ids: + type: array + items: + type: string + log: + type: object + additionalProperties: false + properties: + sources: + type: array + items: + type: string + enum: + - build + - edge + - lambda + - static + - external + - firewall + - redirect + deployment: + type: object + additionalProperties: false + properties: + environments: + type: array + items: + type: string + enum: + - production + - preview + - type: object + additionalProperties: false + required: + - type + - text + properties: + type: + type: string + text: + type: string + schemas: + type: object + additionalProperties: + type: object + required: + - version + properties: + version: + type: string + delivery: + type: object + additionalProperties: false + required: + - type + - endpoint + - encoding + - headers + - compression + - fileStructure + - roleArn + - region + properties: + type: + type: string + endpoint: + type: string + compression: + type: string + enum: + - gzip + - none + encoding: + type: string + enum: + - json + - ndjson + headers: + type: object + additionalProperties: + type: string + secret: + type: string + fileStructure: + type: string + enum: + - hive + roleArn: + type: string + region: + type: string + serverSideEncryption: + type: string + enum: + - AES256 + - aws:kms + - aws:kms:dsse + default: AES256 + objectAcl: + type: string + enum: + - private + - bucket-owner-read + - bucket-owner-full-control + sampling: + type: array + maxItems: 10 + items: + type: object + additionalProperties: false + required: + - type + - rate + properties: + type: + type: string + rate: + type: number + minimum: 0 + maximum: 1 + description: Sampling rate from 0 to 1 (e.g., 0.1 for 10%) + env: + type: string + enum: + - production + - preview + description: Environment to apply sampling to + requestPath: + type: string + description: Request path prefix to apply the sampling rule to + transforms: + type: array + items: + type: object + required: + - id + properties: + id: + type: string + source: + type: object + oneOf: + - properties: + kind: + type: string + default: integration + externalResourceId: + type: string + additionalProperties: false + required: + - externalResourceId + type: object + - properties: + kind: + type: string + default: integration + resourceId: + type: string + additionalProperties: false + required: + - resourceId + type: object + - properties: + kind: + type: string + default: integration + additionalProperties: false + required: + - kind + type: object + properties: + kind: + type: string + default: self-served + additionalProperties: false + required: + - kind + get: + description: Allows to retrieve the list of Drains of the authenticated team. + operationId: getDrains + security: + - bearerToken: [] + summary: Retrieve a list of all Drains + tags: + - drains + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + drains: + items: + properties: + id: + type: string + createdAt: + type: number + updatedAt: + type: number + projectIds: + items: + type: string + type: array + name: + type: string + teamId: + nullable: true + type: string + ownerId: + type: string + status: + type: string + enum: + - disabled + - enabled + - errored + firstErrorTimestamp: + type: number + disabledAt: + type: number + disabledBy: + type: string + disabledReason: + type: string + enum: + - account-plan-downgrade + - disabled-by-admin + - disabled-by-owner + - feature-not-available + - limits-exceeded + schemas: + properties: + log: + type: string + description: (opaque JSON object) + trace: + type: string + description: (opaque JSON object) + analytics: + type: string + description: (opaque JSON object) + speed_insights: + type: string + description: (opaque JSON object) + ai_gateway: + type: string + description: (opaque JSON object) + audit_log: + type: string + description: (opaque JSON object) + connect: + type: string + description: (opaque JSON object) + type: object + delivery: + oneOf: + - properties: + type: + type: string + enum: + - http + endpoint: + type: string + encoding: + type: string + enum: + - json + - ndjson + compression: + type: string + enum: + - gzip + - none + headers: + additionalProperties: + type: string + type: object + secret: + oneOf: + - type: string + - properties: + kind: + type: string + enum: + - INTEGRATION_SECRET + required: + - kind + type: object + required: + - encoding + - endpoint + - headers + - type + type: object + - properties: + type: + type: string + enum: + - otlphttp + endpoint: + properties: + traces: + type: string + required: + - traces + type: object + encoding: + type: string + enum: + - json + - proto + headers: + additionalProperties: + type: string + type: object + secret: + oneOf: + - type: string + - properties: + kind: + type: string + enum: + - INTEGRATION_SECRET + required: + - kind + type: object + required: + - encoding + - endpoint + - headers + - type + type: object + - properties: + type: + type: string + enum: + - clickhouse + endpoint: + type: string + table: + type: string + required: + - endpoint + - table + - type + type: object + - properties: + type: + type: string + enum: + - s3 + endpoint: + type: string + encoding: + type: string + enum: + - json + - ndjson + compression: + type: string + enum: + - none + fileStructure: + type: string + enum: + - hive + roleArn: + type: string + region: + type: string + serverSideEncryption: + type: string + enum: + - AES256 + - aws:kms + - aws:kms:dsse + objectAcl: + type: string + enum: + - authenticated-read + - aws-exec-read + - bucket-owner-full-control + - bucket-owner-read + - private + - public-read + - public-read-write + required: + - compression + - encoding + - endpoint + - fileStructure + - region + - roleArn + - type + type: object + - properties: + type: + type: string + enum: + - internal + target: + type: string + enum: + - vercel-otel-traces-db + required: + - target + - type + type: object + sampling: + items: + properties: + type: + type: string + enum: + - head_sampling + rate: + type: number + env: + type: string + enum: + - preview + - production + requestPath: + type: string + required: + - rate + - type + type: object + type: array + source: + oneOf: + - properties: + kind: + type: string + enum: + - self-served + required: + - kind + type: object + - properties: + kind: + type: string + enum: + - integration + resourceId: + type: string + externalResourceId: + type: string + integrationId: + type: string + integrationConfigurationId: + type: string + required: + - integrationConfigurationId + - integrationId + - kind + type: object + filterV2: + properties: + version: + type: string + enum: + - v2 + filter: + oneOf: + - properties: + type: + type: string + enum: + - basic + project: + properties: + ids: + items: + type: string + type: array + type: object + log: + properties: + sources: + items: + type: string + enum: + - build + - edge + - external + - firewall + - lambda + - redirect + - static + type: array + legacy_excludeCachedStaticAssetLogs: + type: boolean + enum: + - false + - true + type: object + deployment: + properties: + environments: + items: + type: string + enum: + - preview + - production + type: array + type: object + required: + - type + type: object + - properties: + type: + type: string + enum: + - odata + text: + type: string + required: + - text + - type + type: object + required: + - filter + - version + type: object + integrationIcon: + type: string + integrationConfigurationUri: + type: string + integrationWebsite: + type: string + projectAccess: + oneOf: + - properties: + access: + type: string + enum: + - all + managedBy: + type: string + enum: + - drain + - integration + required: + - access + - managedBy + type: object + - properties: + access: + type: string + enum: + - some + projectIds: + items: + type: string + type: array + managedBy: + type: string + enum: + - drain + - integration + required: + - access + - managedBy + - projectIds + type: object + required: + - createdAt + - delivery + - id + - name + - ownerId + - schemas + - source + - updatedAt + type: object + type: array + required: + - drains + type: object + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + parameters: + - name: projectId + in: query + schema: + type: string + - name: includeMetadata + in: query + schema: + type: boolean + default: false + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + /v1/drains/{id}: + delete: + description: Delete a specific Drain by passing the drain id in the URL. + operationId: deleteDrain + security: + - bearerToken: [] + summary: Delete a drain + tags: + - drains + responses: + '204': + description: '' + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + parameters: + - name: id + in: path + required: true + schema: + type: string + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + get: + description: Get the information for a specific Drain by passing the drain id in the URL. + operationId: getDrain + security: + - bearerToken: [] + summary: Find a Drain by id + tags: + - drains + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + id: + type: string + createdAt: + type: number + updatedAt: + type: number + projectIds: + items: + type: string + type: array + name: + type: string + teamId: + nullable: true + type: string + ownerId: + type: string + status: + type: string + enum: + - disabled + - enabled + - errored + firstErrorTimestamp: + type: number + disabledAt: + type: number + disabledBy: + type: string + disabledReason: + type: string + enum: + - account-plan-downgrade + - disabled-by-admin + - disabled-by-owner + - feature-not-available + - limits-exceeded + schemas: + properties: + log: + type: string + description: (opaque JSON object) + trace: + type: string + description: (opaque JSON object) + analytics: + type: string + description: (opaque JSON object) + speed_insights: + type: string + description: (opaque JSON object) + ai_gateway: + type: string + description: (opaque JSON object) + audit_log: + type: string + description: (opaque JSON object) + connect: + type: string + description: (opaque JSON object) + type: object + delivery: + oneOf: + - properties: + type: + type: string + enum: + - http + endpoint: + type: string + encoding: + type: string + enum: + - json + - ndjson + compression: + type: string + enum: + - gzip + - none + headers: + additionalProperties: + type: string + type: object + secret: + oneOf: + - type: string + - properties: + kind: + type: string + enum: + - INTEGRATION_SECRET + required: + - kind + type: object + required: + - encoding + - endpoint + - headers + - type + type: object + - properties: + type: + type: string + enum: + - otlphttp + endpoint: + properties: + traces: + type: string + required: + - traces + type: object + encoding: + type: string + enum: + - json + - proto + headers: + additionalProperties: + type: string + type: object + secret: + oneOf: + - type: string + - properties: + kind: + type: string + enum: + - INTEGRATION_SECRET + required: + - kind + type: object + required: + - encoding + - endpoint + - headers + - type + type: object + - properties: + type: + type: string + enum: + - clickhouse + endpoint: + type: string + table: + type: string + required: + - endpoint + - table + - type + type: object + - properties: + type: + type: string + enum: + - s3 + endpoint: + type: string + encoding: + type: string + enum: + - json + - ndjson + compression: + type: string + enum: + - none + fileStructure: + type: string + enum: + - hive + roleArn: + type: string + region: + type: string + serverSideEncryption: + type: string + enum: + - AES256 + - aws:kms + - aws:kms:dsse + objectAcl: + type: string + enum: + - authenticated-read + - aws-exec-read + - bucket-owner-full-control + - bucket-owner-read + - private + - public-read + - public-read-write + required: + - compression + - encoding + - endpoint + - fileStructure + - region + - roleArn + - type + type: object + - properties: + type: + type: string + enum: + - internal + target: + type: string + enum: + - vercel-otel-traces-db + required: + - target + - type + type: object + sampling: + items: + properties: + type: + type: string + enum: + - head_sampling + rate: + type: number + env: + type: string + enum: + - preview + - production + requestPath: + type: string + required: + - rate + - type + type: object + type: array + source: + oneOf: + - properties: + kind: + type: string + enum: + - self-served + required: + - kind + type: object + - properties: + kind: + type: string + enum: + - integration + resourceId: + type: string + externalResourceId: + type: string + integrationId: + type: string + integrationConfigurationId: + type: string + required: + - integrationConfigurationId + - integrationId + - kind + type: object + filterV2: + properties: + version: + type: string + enum: + - v2 + filter: + oneOf: + - properties: + type: + type: string + enum: + - basic + project: + properties: + ids: + items: + type: string + type: array + type: object + log: + properties: + sources: + items: + type: string + enum: + - build + - edge + - external + - firewall + - lambda + - redirect + - static + type: array + legacy_excludeCachedStaticAssetLogs: + type: boolean + enum: + - false + - true + type: object + deployment: + properties: + environments: + items: + type: string + enum: + - preview + - production + type: array + type: object + required: + - type + type: object + - properties: + type: + type: string + enum: + - odata + text: + type: string + required: + - text + - type + type: object + required: + - filter + - version + type: object + integrationIcon: + type: string + integrationConfigurationUri: + type: string + integrationWebsite: + type: string + projectAccess: + oneOf: + - properties: + access: + type: string + enum: + - all + managedBy: + type: string + enum: + - drain + - integration + required: + - access + - managedBy + type: object + - properties: + access: + type: string + enum: + - some + projectIds: + items: + type: string + type: array + managedBy: + type: string + enum: + - drain + - integration + required: + - access + - managedBy + - projectIds + type: object + required: + - createdAt + - delivery + - id + - name + - ownerId + - schemas + - source + - updatedAt + type: object + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + parameters: + - name: id + in: path + required: true + schema: + type: string + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + patch: + description: Update the configuration of an existing drain. + operationId: updateDrain + security: + - bearerToken: [] + summary: Update an existing Drain + tags: + - drains + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + id: + type: string + createdAt: + type: number + updatedAt: + type: number + projectIds: + items: + type: string + type: array + name: + type: string + teamId: + nullable: true + type: string + ownerId: + type: string + status: + type: string + enum: + - disabled + - enabled + - errored + firstErrorTimestamp: + type: number + disabledAt: + type: number + disabledBy: + type: string + disabledReason: + type: string + enum: + - account-plan-downgrade + - disabled-by-admin + - disabled-by-owner + - feature-not-available + - limits-exceeded + schemas: + properties: + log: + type: string + description: (opaque JSON object) + trace: + type: string + description: (opaque JSON object) + analytics: + type: string + description: (opaque JSON object) + speed_insights: + type: string + description: (opaque JSON object) + ai_gateway: + type: string + description: (opaque JSON object) + audit_log: + type: string + description: (opaque JSON object) + connect: + type: string + description: (opaque JSON object) + type: object + delivery: + oneOf: + - properties: + type: + type: string + enum: + - http + endpoint: + type: string + encoding: + type: string + enum: + - json + - ndjson + compression: + type: string + enum: + - gzip + - none + headers: + additionalProperties: + type: string + type: object + secret: + oneOf: + - type: string + - properties: + kind: + type: string + enum: + - INTEGRATION_SECRET + required: + - kind + type: object + required: + - encoding + - endpoint + - headers + - type + type: object + - properties: + type: + type: string + enum: + - otlphttp + endpoint: + properties: + traces: + type: string + required: + - traces + type: object + encoding: + type: string + enum: + - json + - proto + headers: + additionalProperties: + type: string + type: object + secret: + oneOf: + - type: string + - properties: + kind: + type: string + enum: + - INTEGRATION_SECRET + required: + - kind + type: object + required: + - encoding + - endpoint + - headers + - type + type: object + - properties: + type: + type: string + enum: + - clickhouse + endpoint: + type: string + table: + type: string + required: + - endpoint + - table + - type + type: object + - properties: + type: + type: string + enum: + - s3 + endpoint: + type: string + encoding: + type: string + enum: + - json + - ndjson + compression: + type: string + enum: + - none + fileStructure: + type: string + enum: + - hive + roleArn: + type: string + region: + type: string + serverSideEncryption: + type: string + enum: + - AES256 + - aws:kms + - aws:kms:dsse + objectAcl: + type: string + enum: + - authenticated-read + - aws-exec-read + - bucket-owner-full-control + - bucket-owner-read + - private + - public-read + - public-read-write + required: + - compression + - encoding + - endpoint + - fileStructure + - region + - roleArn + - type + type: object + - properties: + type: + type: string + enum: + - internal + target: + type: string + enum: + - vercel-otel-traces-db + required: + - target + - type + type: object + sampling: + items: + properties: + type: + type: string + enum: + - head_sampling + rate: + type: number + env: + type: string + enum: + - preview + - production + requestPath: + type: string + required: + - rate + - type + type: object + type: array + source: + oneOf: + - properties: + kind: + type: string + enum: + - self-served + required: + - kind + type: object + - properties: + kind: + type: string + enum: + - integration + resourceId: + type: string + externalResourceId: + type: string + integrationId: + type: string + integrationConfigurationId: + type: string + required: + - integrationConfigurationId + - integrationId + - kind + type: object + filterV2: + properties: + version: + type: string + enum: + - v2 + filter: + oneOf: + - properties: + type: + type: string + enum: + - basic + project: + properties: + ids: + items: + type: string + type: array + type: object + log: + properties: + sources: + items: + type: string + enum: + - build + - edge + - external + - firewall + - lambda + - redirect + - static + type: array + legacy_excludeCachedStaticAssetLogs: + type: boolean + enum: + - false + - true + type: object + deployment: + properties: + environments: + items: + type: string + enum: + - preview + - production + type: array + type: object + required: + - type + type: object + - properties: + type: + type: string + enum: + - odata + text: + type: string + required: + - text + - type + type: object + required: + - filter + - version + type: object + integrationIcon: + type: string + integrationConfigurationUri: + type: string + integrationWebsite: + type: string + projectAccess: + oneOf: + - properties: + access: + type: string + enum: + - all + managedBy: + type: string + enum: + - drain + - integration + required: + - access + - managedBy + type: object + - properties: + access: + type: string + enum: + - some + projectIds: + items: + type: string + type: array + managedBy: + type: string + enum: + - drain + - integration + required: + - access + - managedBy + - projectIds + type: object + required: + - createdAt + - delivery + - id + - name + - ownerId + - schemas + - source + - updatedAt + type: object + '400': + description: |- + One of the provided values in the request body is invalid. + One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '402': + description: '' + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + parameters: + - name: id + in: path + required: true + schema: + type: string + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + requestBody: + content: + application/json: + schema: + type: object + additionalProperties: false + properties: + name: + type: string + projects: + type: string + enum: + - some + - all + projectIds: + type: array + items: + type: string + nullable: true + filter: + type: string + additionalProperties: false + required: + - version + - filter + properties: + version: + type: string + filter: + oneOf: + - type: object + additionalProperties: false + required: + - type + properties: + type: + type: string + project: + type: object + additionalProperties: false + properties: + ids: + type: array + items: + type: string + log: + type: object + additionalProperties: false + properties: + sources: + type: array + items: + type: string + enum: + - build + - edge + - lambda + - static + - external + - firewall + - redirect + deployment: + type: object + additionalProperties: false + properties: + environments: + type: array + items: + type: string + enum: + - production + - preview + - type: object + additionalProperties: false + required: + - type + - text + properties: + type: + type: string + text: + type: string + schemas: + type: object + additionalProperties: + type: object + required: + - version + properties: + version: + type: string + delivery: + type: object + additionalProperties: false + required: + - type + - endpoint + - encoding + - headers + - compression + - fileStructure + - roleArn + - region + properties: + type: + type: string + endpoint: + type: string + compression: + type: string + enum: + - gzip + - none + encoding: + type: string + enum: + - json + - ndjson + headers: + type: object + additionalProperties: + type: string + secret: + type: string + fileStructure: + type: string + enum: + - hive + roleArn: + type: string + region: + type: string + serverSideEncryption: + type: string + enum: + - AES256 + - aws:kms + - aws:kms:dsse + default: AES256 + objectAcl: + type: string + enum: + - private + - bucket-owner-read + - bucket-owner-full-control + sampling: + type: array + maxItems: 10 + items: + type: object + additionalProperties: false + required: + - type + - rate + properties: + type: + type: string + rate: + type: number + minimum: 0 + maximum: 1 + description: Sampling rate from 0 to 1 (e.g., 0.1 for 10%) + env: + type: string + enum: + - production + - preview + description: Environment to apply sampling to + requestPath: + type: string + description: Request path prefix to apply the sampling rule to + nullable: true + transforms: + type: array + items: + type: object + required: + - id + properties: + id: + type: string + nullable: true + status: + type: string + enum: + - enabled + - disabled + source: + type: object + oneOf: + - properties: + kind: + type: string + default: integration + externalResourceId: + type: string + additionalProperties: false + required: + - externalResourceId + type: object + - properties: + kind: + type: string + default: integration + resourceId: + type: string + additionalProperties: false + required: + - resourceId + type: object + - properties: + kind: + type: string + default: integration + additionalProperties: false + required: + - kind + type: object + properties: + kind: + type: string + default: self-served + additionalProperties: false + required: + - kind + /v1/drains/test: + post: + description: Validate the delivery configuration of a Drain using sample events. + operationId: testDrain + security: + - bearerToken: [] + summary: Validate Drain delivery configuration + tags: + - drains + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + status: + type: string + error: + type: string + endpoint: + type: string + required: + - endpoint + - error + - status + type: object + '400': + description: One of the provided values in the request body is invalid. + '401': + description: The request is not authorized. + '402': + description: '' + '403': + description: You do not have permission to access this resource. + '410': + description: '' + parameters: + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + requestBody: + content: + application/json: + schema: + type: object + additionalProperties: false + required: + - schemas + - delivery + properties: + schemas: + type: object + additionalProperties: + type: object + required: + - version + properties: + version: + type: string + delivery: + type: object + additionalProperties: false + required: + - type + - endpoint + - encoding + - headers + - compression + - fileStructure + - roleArn + - region + properties: + type: + type: string + endpoint: + type: string + compression: + type: string + enum: + - gzip + - none + encoding: + type: string + enum: + - json + - ndjson + headers: + type: object + additionalProperties: + type: string + secret: + type: string + fileStructure: + type: string + enum: + - hive + roleArn: + type: string + region: + type: string + serverSideEncryption: + type: string + enum: + - AES256 + - aws:kms + - aws:kms:dsse + default: AES256 + objectAcl: + type: string + enum: + - private + - bucket-owner-read + - bucket-owner-full-control +components: + x-stackQL-resources: + drains: + id: vercel.drains.drains + name: drains + title: Drains + methods: + create: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v1~1drains/post' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + list: + operation: + $ref: '#/paths/~1v1~1drains/get' + response: + mediaType: application/json + openAPIDocKey: '200' + objectKey: $.drains + request: + nativeCasing: camel + delete: + operation: + $ref: '#/paths/~1v1~1drains~1{id}/delete' + response: + mediaType: application/json + openAPIDocKey: '204' + request: + nativeCasing: camel + get: + operation: + $ref: '#/paths/~1v1~1drains~1{id}/get' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + update: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v1~1drains~1{id}/patch' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + test: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v1~1drains~1test/post' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/drains/methods/get' + - $ref: '#/components/x-stackQL-resources/drains/methods/list' + insert: + - $ref: '#/components/x-stackQL-resources/drains/methods/create' + update: + - $ref: '#/components/x-stackQL-resources/drains/methods/update' + delete: + - $ref: '#/components/x-stackQL-resources/drains/methods/delete' + replace: [] +servers: + - url: https://api.vercel.com diff --git a/provider-dev/openapi/src/vercel/v00.00.00000/services/edge_cache.yaml b/provider-dev/openapi/src/vercel/v00.00.00000/services/edge_cache.yaml new file mode 100644 index 0000000..3f80153 --- /dev/null +++ b/provider-dev/openapi/src/vercel/v00.00.00000/services/edge_cache.yaml @@ -0,0 +1,319 @@ +openapi: 3.0.3 +info: + title: edge_cache API + description: vercel edge_cache API + version: 0.0.1 +paths: + /v1/edge-cache/invalidate-by-tags: + post: + description: Marks a cache tag as stale, causing cache entries associated with that tag to be revalidated in the background on the next request. + operationId: invalidateByTags + security: + - bearerToken: [] + summary: Invalidate by tag + tags: + - edge-cache + responses: + '200': + description: '' + '400': + description: |- + One of the provided values in the request body is invalid. + One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + parameters: + - name: projectIdOrName + in: query + required: true + schema: + type: string + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + requestBody: + content: + application/json: + schema: + additionalProperties: false + type: object + required: + - tags + properties: + tags: + items: + maxLength: 256 + type: string + maxItems: 16 + minItems: 1 + type: array + maxLength: 8196 + target: + enum: + - production + - preview + type: string + /v1/edge-cache/dangerously-delete-by-tags: + post: + description: Marks a cache tag as deleted, causing cache entries associated with that tag to be revalidated in the foreground on the next request. Use this method with caution because one tag can be associated with many paths and deleting the cache can cause many concurrent requests to the origin leading to cache stampede problem. This method is for advanced use cases and is not recommended; prefer using `invalidateByTag` instead. + operationId: dangerouslyDeleteByTags + security: + - bearerToken: [] + summary: Dangerously delete by tag + tags: + - edge-cache + responses: + '200': + description: '' + '400': + description: |- + One of the provided values in the request body is invalid. + One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + parameters: + - name: projectIdOrName + in: query + required: true + schema: + type: string + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + requestBody: + content: + application/json: + schema: + additionalProperties: false + type: object + required: + - tags + properties: + revalidationDeadlineSeconds: + minimum: 0 + maximum: 31536000 + type: integer + tags: + items: + maxLength: 256 + type: string + maxItems: 16 + minItems: 1 + type: array + maxLength: 8196 + target: + enum: + - production + - preview + type: string + /v1/edge-cache/invalidate-by-src-images: + post: + description: Marks a source image as stale, causing its corresponding transformed images to be revalidated in the background on the next request. + operationId: invalidateBySrcImages + security: + - bearerToken: [] + summary: Invalidate by source image + tags: + - edge-cache + responses: + '200': + description: '' + '400': + description: |- + One of the provided values in the request body is invalid. + One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '402': + description: '' + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + parameters: + - name: projectIdOrName + in: query + required: true + schema: + type: string + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + requestBody: + content: + application/json: + schema: + additionalProperties: false + type: object + required: + - srcImages + properties: + srcImages: + items: + type: string + maxItems: 8 + minItems: 1 + type: array + /v1/edge-cache/dangerously-delete-by-src-images: + post: + description: Marks a source image as deleted, causing cache entries associated with that source image to be revalidated in the foreground on the next request. Use this method with caution because one source image can be associated with many paths and deleting the cache can cause many concurrent requests to the origin leading to cache stampede problem. This method is for advanced use cases and is not recommended; prefer using `invalidateBySrcImage` instead. + operationId: dangerouslyDeleteBySrcImages + security: + - bearerToken: [] + summary: Dangerously delete by source image + tags: + - edge-cache + responses: + '200': + description: '' + '400': + description: |- + One of the provided values in the request body is invalid. + One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '402': + description: '' + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + parameters: + - name: projectIdOrName + in: query + required: true + schema: + type: string + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + requestBody: + content: + application/json: + schema: + additionalProperties: false + type: object + required: + - srcImages + properties: + revalidationDeadlineSeconds: + minimum: 0 + maximum: 31536000 + type: integer + srcImages: + items: + type: string + maxItems: 8 + minItems: 1 + type: array +components: + x-stackQL-resources: + cache: + id: vercel.edge_cache.cache + name: cache + title: Cache + methods: + invalidate_by_tags: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v1~1edge-cache~1invalidate-by-tags/post' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + delete_by_tags: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v1~1edge-cache~1dangerously-delete-by-tags/post' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + invalidate_by_src_images: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v1~1edge-cache~1invalidate-by-src-images/post' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + delete_by_src_images: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v1~1edge-cache~1dangerously-delete-by-src-images/post' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + sqlVerbs: + select: [] + insert: [] + update: [] + delete: [] + replace: [] +servers: + - url: https://api.vercel.com diff --git a/provider-dev/openapi/src/vercel/v00.00.00000/services/edge_config.yaml b/provider-dev/openapi/src/vercel/v00.00.00000/services/edge_config.yaml index 247b785..9c8a7c2 100644 --- a/provider-dev/openapi/src/vercel/v00.00.00000/services/edge_config.yaml +++ b/provider-dev/openapi/src/vercel/v00.00.00000/services/edge_config.yaml @@ -1,291 +1,54 @@ openapi: 3.0.3 -servers: - - url: 'https://api.vercel.com' - description: Production API info: - contact: - email: support@vercel.com - name: Vercel Support - url: 'https://vercel.com/support' + title: edge_config API + description: vercel edge_config API version: 0.0.1 - title: Vercel API - edge_config - description: edge-config -components: - schemas: - EdgeConfigItem: - properties: - key: - type: string - value: - $ref: '#/components/schemas/EdgeConfigItemValue' - edgeConfigId: - type: string - createdAt: - type: number - updatedAt: - type: number - required: - - key - - value - - edgeConfigId - - createdAt - - updatedAt - type: object - description: The EdgeConfig. - EdgeConfigItemValue: - nullable: true - oneOf: - - type: string - - type: number - - type: boolean - - additionalProperties: - $ref: '#/components/schemas/EdgeConfigItemValue' - type: object - - items: - $ref: '#/components/schemas/EdgeConfigItemValue' - type: array - EdgeConfigToken: - properties: - token: - type: string - label: - type: string - id: - type: string - description: 'This is not the token itself, but rather an id to identify the token by' - edgeConfigId: - type: string - createdAt: - type: number - required: - - token - - label - - id - - edgeConfigId - - createdAt - type: object - description: The EdgeConfig. - responses: {} - securitySchemes: - bearerToken: - type: http - description: Default authentication mechanism - scheme: bearer - oauth2: - type: oauth2 - flows: - authorizationCode: - authorizationUrl: 'https://api.vercel.com/oauth/authorize' - tokenUrl: 'https://api.vercel.com/oauth/access_token' - scopes: {} - x-stackQL-resources: - edge_config: - id: vercel.edge_config.edge_config - name: edge_config - title: Edge Config - methods: - get_edge_configs: - operation: - $ref: '#/paths/~1v1~1edge-config/get' - response: - mediaType: application/json - openAPIDocKey: '200' - create_edge_config: - operation: - $ref: '#/paths/~1v1~1edge-config/post' - response: - mediaType: application/json - openAPIDocKey: '200' - get_edge_config: - operation: - $ref: '#/paths/~1v1~1edge-config~1{edgeConfigId}/get' - response: - mediaType: application/json - openAPIDocKey: '200' - update_edge_config: - operation: - $ref: '#/paths/~1v1~1edge-config~1{edgeConfigId}/put' - response: - mediaType: application/json - openAPIDocKey: '200' - delete_edge_config: - operation: - $ref: '#/paths/~1v1~1edge-config~1{edgeConfigId}/delete' - response: - mediaType: application/json - openAPIDocKey: '200' - sqlVerbs: - select: - - $ref: '#/components/x-stackQL-resources/edge_config/methods/get_edge_config' - - $ref: '#/components/x-stackQL-resources/edge_config/methods/get_edge_configs' - insert: - - $ref: '#/components/x-stackQL-resources/edge_config/methods/create_edge_config' - update: [] - delete: - - $ref: '#/components/x-stackQL-resources/edge_config/methods/delete_edge_config' - items: - id: vercel.edge_config.items - name: items - title: Items - methods: - get_edge_config_items: - operation: - $ref: '#/paths/~1v1~1edge-config~1{edgeConfigId}~1items/get' - response: - mediaType: application/json - openAPIDocKey: '200' - patcht_edge_config_items: - operation: - $ref: '#/paths/~1v1~1edge-config~1{edgeConfigId}~1items/patch' - response: - mediaType: application/json - openAPIDocKey: '200' - sqlVerbs: - select: - - $ref: '#/components/x-stackQL-resources/items/methods/get_edge_config_items' - insert: [] - update: [] - delete: [] - item: - id: vercel.edge_config.item - name: item - title: Item - methods: - get_edge_config_item: - operation: - $ref: '#/paths/~1v1~1edge-config~1{edgeConfigId}~1item~1{edgeConfigItemKey}/get' - response: - mediaType: application/json - openAPIDocKey: '200' - sqlVerbs: - select: - - $ref: '#/components/x-stackQL-resources/item/methods/get_edge_config_item' - insert: [] - update: [] - delete: [] - tokens: - id: vercel.edge_config.tokens - name: tokens - title: Tokens - methods: - get_edge_config_tokens: - operation: - $ref: '#/paths/~1v1~1edge-config~1{edgeConfigId}~1tokens/get' - response: - mediaType: application/json - openAPIDocKey: '200' - delete_edge_config_tokens: - operation: - $ref: '#/paths/~1v1~1edge-config~1{edgeConfigId}~1tokens/delete' - response: - mediaType: application/json - openAPIDocKey: '200' - sqlVerbs: - select: - - $ref: '#/components/x-stackQL-resources/tokens/methods/get_edge_config_tokens' - insert: [] - update: [] - delete: - - $ref: '#/components/x-stackQL-resources/tokens/methods/delete_edge_config_tokens' - token: - id: vercel.edge_config.token - name: token - title: Token - methods: - get_edge_config_token: - operation: - $ref: '#/paths/~1v1~1edge-config~1{edgeConfigId}~1token~1{token}/get' - response: - mediaType: application/json - openAPIDocKey: '200' - create_edge_config_token: - operation: - $ref: '#/paths/~1v1~1edge-config~1{edgeConfigId}~1token/post' - response: - mediaType: application/json - openAPIDocKey: '200' - sqlVerbs: - select: - - $ref: '#/components/x-stackQL-resources/token/methods/get_edge_config_token' - insert: - - $ref: '#/components/x-stackQL-resources/token/methods/create_edge_config_token' - update: [] - delete: [] paths: - /v1/edge-config: + /v1/global-config: get: - description: Returns all Edge Configs. + description: Returns all Global Configs. operationId: getEdgeConfigs security: - bearerToken: [] - summary: Get Edge Configs + summary: Get Global Configs tags: - - edge-config + - global-config responses: '200': - description: List of all edge configs. + description: List of all global configs. content: application/json: schema: - properties: - id: - type: string - createdAt: - type: number - ownerId: - type: string - slug: - type: string - description: Name for the Edge Config Names are not unique. Must start with an alphabetic character and can contain only alphanumeric characters and underscores). - updatedAt: - type: number - digest: - type: string - transfer: - properties: - fromAccountId: - type: string - startedAt: - type: number - doneAt: - nullable: true - type: number - required: - - fromAccountId - - startedAt - - doneAt - type: object - description: Keeps track of the current state of the Edge Config while it gets transferred. - sizeInBytes: - type: number - itemCount: - type: number - required: - - sizeInBytes - - itemCount - type: object - description: List of all edge configs. + $ref: '#/components/schemas/GetEdgeConfigsResponse' '400': description: One of the provided values in the request query is invalid. '401': - description: '' + description: The request is not authorized. '403': description: You do not have permission to access this resource. + '410': + description: '' parameters: - - description: The Team identifier or slug to perform the request on behalf of. + - description: The Team identifier to perform the request on behalf of. in: query name: teamId - required: true schema: type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug post: - description: Creates an Edge Config. + description: Creates a Global Config. operationId: createEdgeConfig security: - bearerToken: [] - summary: Create an Edge Config + summary: Create a Global Config tags: - - edge-config + - global-config responses: '201': description: '' @@ -293,19 +56,40 @@ paths: application/json: schema: properties: - createdAt: - type: number - updatedAt: - type: number id: type: string - slug: + createdAt: + type: number + createdBy: type: string - description: Name for the Edge Config Names are not unique. Must start with an alphabetic character and can contain only alphanumeric characters and underscores). + description: The ID of the user who created the Global Config, optional because it is not always set. ownerId: type: string + slug: + type: string + description: Name for the Global Config Names are not unique. Must start with an alphabetic character and can contain only alphanumeric characters and underscores). + updatedAt: + type: number digest: type: string + purpose: + properties: + type: + type: string + enum: + - flags + projectId: + type: string + resourceId: + type: string + required: + - projectId + - type + - resourceId + type: object + deletedAt: + nullable: true + type: number transfer: properties: fromAccountId: @@ -316,37 +100,49 @@ paths: nullable: true type: number required: + - doneAt - fromAccountId - startedAt - - doneAt type: object - description: Keeps track of the current state of the Edge Config while it gets transferred. + description: Keeps track of the current state of the Global Config while it gets transferred. + schema: + type: string + description: (opaque JSON object) + syncedToDynamoAt: + type: number + description: Timestamp of when the Global Config was synced to DynamoDB initially. It is only set when syncing the entire Global Config, not when updating. sizeInBytes: type: number itemCount: type: number required: - - sizeInBytes + - createdAt + - digest + - id - itemCount + - ownerId + - sizeInBytes + - slug + - updatedAt type: object - description: An Edge Config + description: A Global Config '400': description: One of the provided values in the request body is invalid. '401': - description: '' + description: The request is not authorized. '402': - description: |- - The account was soft-blocked for an unhandled reason. - The account is missing a payment so payment method must be updated + description: The account is missing a payment so payment method must be updated '403': description: You do not have permission to access this resource. + '410': + description: '' parameters: - - description: The Team identifier or slug to perform the request on behalf of. + - description: The Team identifier to perform the request on behalf of. in: query name: teamId - required: true schema: type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l requestBody: content: application/json: @@ -356,60 +152,62 @@ paths: - slug properties: slug: - maxLength: 32 - pattern: '^[\\w-]+$' + maxLength: 64 + pattern: ^[\w-]+$ type: string items: type: object - propertyNames: - maxLength: 256 - pattern: '^[\\w-]+$' - type: string - additionalProperties: - oneOf: - - oneOf: - - type: string - - type: number - - type: boolean - - type: 'null' - - type: object - - type: array - items: - oneOf: - - type: string - - type: number - - type: boolean - - type: 'null' - - type: object - '/v1/edge-config/{edgeConfigId}': + additionalProperties: {} + /v1/global-config/{edge_config_id}: get: - description: Returns an Edge Config. + description: Returns a Global Config. operationId: getEdgeConfig security: - bearerToken: [] - summary: Get an Edge Config + summary: Get a Global Config tags: - - edge-config + - global-config responses: '200': - description: The EdgeConfig. + description: The Global Config. content: application/json: schema: properties: - createdAt: - type: number - updatedAt: - type: number id: type: string - slug: + createdAt: + type: number + createdBy: type: string - description: Name for the Edge Config Names are not unique. Must start with an alphabetic character and can contain only alphanumeric characters and underscores). + description: The ID of the user who created the Global Config, optional because it is not always set. ownerId: type: string + slug: + type: string + description: Name for the Global Config Names are not unique. Must start with an alphabetic character and can contain only alphanumeric characters and underscores). + updatedAt: + type: number digest: type: string + purpose: + properties: + type: + type: string + enum: + - flags + projectId: + type: string + resourceId: + type: string + required: + - projectId + - type + - resourceId + type: object + deletedAt: + nullable: true + type: number transfer: properties: fromAccountId: @@ -420,50 +218,68 @@ paths: nullable: true type: number required: + - doneAt - fromAccountId - startedAt - - doneAt type: object - description: Keeps track of the current state of the Edge Config while it gets transferred. + description: Keeps track of the current state of the Global Config while it gets transferred. + schema: + type: string + description: (opaque JSON object) + syncedToDynamoAt: + type: number + description: Timestamp of when the Global Config was synced to DynamoDB initially. It is only set when syncing the entire Global Config, not when updating. sizeInBytes: type: number itemCount: type: number required: - - sizeInBytes + - createdAt + - digest + - id - itemCount + - ownerId + - sizeInBytes + - slug + - updatedAt type: object - description: The EdgeConfig. + description: The Global Config. '400': description: One of the provided values in the request query is invalid. '401': - description: '' + description: The request is not authorized. '403': description: You do not have permission to access this resource. '404': description: '' + '410': + description: '' parameters: - - name: edgeConfigId - description: Edge config id. + - name: edge_config_id in: path required: true schema: type: string - description: Edge config id. - - description: The Team identifier or slug to perform the request on behalf of. + - description: The Team identifier to perform the request on behalf of. in: query name: teamId - required: true schema: type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug put: - description: Updates an Edge Config. + description: Updates a Global Config. operationId: updateEdgeConfig security: - bearerToken: [] - summary: Update an Edge Config + summary: Update a Global Config tags: - - edge-config + - global-config responses: '200': description: '' @@ -471,19 +287,40 @@ paths: application/json: schema: properties: - createdAt: - type: number - updatedAt: - type: number id: type: string - slug: + createdAt: + type: number + createdBy: type: string - description: Name for the Edge Config Names are not unique. Must start with an alphabetic character and can contain only alphanumeric characters and underscores). + description: The ID of the user who created the Global Config, optional because it is not always set. ownerId: type: string + slug: + type: string + description: Name for the Global Config Names are not unique. Must start with an alphabetic character and can contain only alphanumeric characters and underscores). + updatedAt: + type: number digest: type: string + purpose: + properties: + type: + type: string + enum: + - flags + projectId: + type: string + resourceId: + type: string + required: + - projectId + - type + - resourceId + type: object + deletedAt: + nullable: true + type: number transfer: properties: fromAccountId: @@ -494,48 +331,60 @@ paths: nullable: true type: number required: + - doneAt - fromAccountId - startedAt - - doneAt type: object - description: Keeps track of the current state of the Edge Config while it gets transferred. + description: Keeps track of the current state of the Global Config while it gets transferred. + schema: + type: string + description: (opaque JSON object) + syncedToDynamoAt: + type: number + description: Timestamp of when the Global Config was synced to DynamoDB initially. It is only set when syncing the entire Global Config, not when updating. sizeInBytes: type: number itemCount: type: number required: - - sizeInBytes + - createdAt + - digest + - id - itemCount + - ownerId + - sizeInBytes + - slug + - updatedAt type: object - description: An Edge Config + description: A Global Config '400': description: |- One of the provided values in the request body is invalid. One of the provided values in the request query is invalid. '401': - description: '' + description: The request is not authorized. '402': - description: |- - The account was soft-blocked for an unhandled reason. - The account is missing a payment so payment method must be updated + description: The account is missing a payment so payment method must be updated '403': description: You do not have permission to access this resource. '404': description: '' + '409': + description: '' + '410': + description: '' parameters: - - name: edgeConfigId - description: Edge config id. + - name: edge_config_id in: path required: true schema: type: string - description: Edge config id. - - description: The Team identifier or slug to perform the request on behalf of. + - description: The Team identifier to perform the request on behalf of. in: query name: teamId - required: true schema: type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l requestBody: content: application/json: @@ -545,88 +394,103 @@ paths: - slug properties: slug: - maxLength: 32 - pattern: '^[\\w-]+$' + maxLength: 64 + pattern: ^[\w-]+$ type: string delete: - description: Delete an Edge Config by id. + description: Delete a Global Config by id. operationId: deleteEdgeConfig security: - bearerToken: [] - summary: Delete an Edge Config + summary: Delete a Global Config tags: - - edge-config + - global-config responses: '204': description: '' '400': description: One of the provided values in the request query is invalid. '401': - description: '' + description: The request is not authorized. '403': description: You do not have permission to access this resource. '404': description: '' + '409': + description: '' + '410': + description: '' parameters: - - name: edgeConfigId - description: Edge config id. + - name: edge_config_id in: path required: true schema: type: string - description: Edge config id. - - description: The Team identifier or slug to perform the request on behalf of. + - description: The Team identifier to perform the request on behalf of. in: query name: teamId - required: true schema: type: string - '/v1/edge-config/{edgeConfigId}/items': + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + /v1/global-config/{edge_config_id}/items: get: - description: Returns all items of an Edge Config. + description: Returns all items of a Global Config. operationId: getEdgeConfigItems security: - bearerToken: [] - summary: Get Edge Config items + summary: Get Global Config items tags: - - edge-config + - global-config responses: '200': - description: The EdgeConfig. + description: List of all Global Config items. content: application/json: schema: - $ref: '#/components/schemas/EdgeConfigItem' + $ref: '#/components/schemas/GetEdgeConfigItemsResponse' '400': description: One of the provided values in the request query is invalid. '401': - description: '' + description: The request is not authorized. '403': description: You do not have permission to access this resource. '404': description: '' + '410': + description: '' parameters: - - name: edgeConfigId - description: Edge config id. + - name: edge_config_id in: path required: true schema: type: string - description: Edge config id. - - description: The Team identifier or slug to perform the request on behalf of. + pattern: ^ecfg_ + - description: The Team identifier to perform the request on behalf of. in: query name: teamId - required: true schema: type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug patch: - description: Update multiple Edge Config Items in batch. - operationId: patchtEdgeConfigItems + description: Update multiple Global Config Items in batch. + operationId: patchEdgeConfigItems security: - bearerToken: [] - summary: Update Edge Config items in batch + summary: Update Global Config items in batch tags: - - edge-config + - global-config responses: '200': description: '' @@ -644,31 +508,38 @@ paths: One of the provided values in the request body is invalid. One of the provided values in the request query is invalid. '401': - description: '' + description: The request is not authorized. '402': - description: |- - The account was soft-blocked for an unhandled reason. - The account is missing a payment so payment method must be updated + description: The account is missing a payment so payment method must be updated '403': description: You do not have permission to access this resource. '404': description: '' '409': description: '' + '410': + description: '' + '412': + description: '' parameters: - - name: edgeConfigId - description: Edge config id. + - name: edge_config_id in: path required: true schema: type: string - description: Edge config id. - - description: The Team identifier or slug to perform the request on behalf of. + pattern: ^ecfg_ + - description: The Team identifier to perform the request on behalf of. in: query name: teamId - required: true schema: type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug requestBody: content: application/json: @@ -683,138 +554,318 @@ paths: items: oneOf: - type: object - required: - - operation - - key - - value properties: operation: - oneOf: - - const: create - - const: update - - const: upsert + enum: + - create + - update + - upsert + - delete key: maxLength: 256 - pattern: '^[\\w-]+$' + pattern: ^[\w-]+$ type: string - value: + value: {} + description: oneOf: - - oneOf: - - type: string - - type: number - - type: boolean - - type: 'null' - - type: object - - type: array - items: - oneOf: - - type: string - - type: number - - type: boolean - - type: 'null' - - type: object - - type: object - required: - - operation - - key - properties: - operation: - const: delete - key: - maxLength: 256 - pattern: '^[\\w-]+$' - type: string - '/v1/edge-config/{edgeConfigId}/item/{edgeConfigItemKey}': + - type: string + maxLength: 512 + - type: string + anyOf: + - properties: + operation: {} + required: + - operation + - key + - value + type: object + - properties: + operation: + enum: + - update + - upsert + required: + - operation + - key + - value + type: object + - properties: + operation: + enum: + - update + - upsert + required: + - operation + - key + - description + type: object + - properties: + operation: {} + required: + - operation + - key + not: + required: + - value + - description + type: object + /v1/global-config/{edge_config_id}/schema: get: - description: Returns a specific Edge Config Item. - operationId: getEdgeConfigItem + description: Returns the schema of a Global Config. + operationId: getEdgeConfigSchema security: - bearerToken: [] - summary: Get an Edge Config item + summary: Get Global Config schema tags: - - edge-config + - global-config responses: '200': - description: The EdgeConfig. + description: The Global Config. content: application/json: schema: - $ref: '#/components/schemas/EdgeConfigItem' + nullable: true + type: string + description: The Global Config. (opaque JSON object) '400': description: One of the provided values in the request query is invalid. '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + parameters: + - name: edge_config_id + in: path + required: true + schema: + type: string + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + post: + description: Update a Global Config's schema. + operationId: patchEdgeConfigSchema + security: + - bearerToken: [] + summary: Update Global Config schema + tags: + - global-config + responses: + '200': description: '' + content: + application/json: + schema: + nullable: true + type: string + description: The JSON schema uploaded by the user (opaque JSON object) + '400': + description: |- + One of the provided values in the request body is invalid. + One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '402': + description: The account is missing a payment so payment method must be updated '403': description: You do not have permission to access this resource. '404': description: '' + '409': + description: '' + '410': + description: '' parameters: - - name: edgeConfigId - description: Edge config id. + - name: edge_config_id in: path required: true schema: type: string - description: Edge config id. - - name: edgeConfigItemKey - description: Edge config id item key. + - name: dryRun + in: query + required: false + schema: + type: string + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + requestBody: + content: + application/json: + schema: + type: object + additionalProperties: false + required: + - definition + properties: + definition: {} + delete: + description: Deletes the schema of existing Global Config. + operationId: deleteEdgeConfigSchema + security: + - bearerToken: [] + summary: Delete a Global Config's schema + tags: + - global-config + responses: + '204': + description: '' + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '402': + description: The account is missing a payment so payment method must be updated + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '409': + description: '' + '410': + description: '' + parameters: + - name: edge_config_id in: path required: true schema: type: string - description: Edge config id item key. - - description: The Team identifier or slug to perform the request on behalf of. + - description: The Team identifier to perform the request on behalf of. in: query name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + /v1/global-config/{edge_config_id}/item/{edge_config_item_key}: + get: + description: Returns a specific Global Config Item. + operationId: getEdgeConfigItem + security: + - bearerToken: [] + summary: Get a Global Config item + tags: + - global-config + responses: + '200': + description: The Global Config. + content: + application/json: + schema: + $ref: '#/components/schemas/GlobalConfigItem' + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + parameters: + - name: edge_config_id + in: path + required: true + schema: + type: string + pattern: ^ecfg_ + - name: edge_config_item_key + in: path required: true schema: type: string - '/v1/edge-config/{edgeConfigId}/tokens': + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + /v1/global-config/{edge_config_id}/tokens: get: - description: Returns all tokens of an Edge Config. + description: Returns all tokens of a Global Config. operationId: getEdgeConfigTokens security: - bearerToken: [] - summary: Get all tokens of an Edge Config + summary: Get all tokens of a Global Config tags: - - edge-config + - global-config responses: '200': - description: The EdgeConfig. + description: The Global Config. content: application/json: schema: - $ref: '#/components/schemas/EdgeConfigToken' + $ref: '#/components/schemas/GetEdgeConfigTokensResponse' '400': description: One of the provided values in the request query is invalid. '401': - description: '' + description: The request is not authorized. '403': description: You do not have permission to access this resource. '404': description: '' + '410': + description: '' parameters: - - name: edgeConfigId - description: Edge config id. + - name: edge_config_id in: path required: true schema: type: string - description: Edge config id. - - description: The Team identifier or slug to perform the request on behalf of. + - description: The Team identifier to perform the request on behalf of. in: query name: teamId - required: true schema: type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug delete: - description: Deletes one or more tokens of an existing Edge Config. + description: Deletes one or more tokens of an existing Global Config. operationId: deleteEdgeConfigTokens security: - bearerToken: [] - summary: Delete one or more Edge Config tokens + summary: Delete one or more Global Config tokens tags: - - edge-config + - global-config responses: '204': description: '' @@ -823,94 +874,114 @@ paths: One of the provided values in the request body is invalid. One of the provided values in the request query is invalid. '401': - description: '' + description: The request is not authorized. '402': - description: |- - The account was soft-blocked for an unhandled reason. - The account is missing a payment so payment method must be updated + description: The account is missing a payment so payment method must be updated '403': description: You do not have permission to access this resource. '404': description: '' + '409': + description: '' + '410': + description: '' parameters: - - name: edgeConfigId - description: Edge config id. + - name: edge_config_id in: path required: true schema: type: string - description: Edge config id. - - description: The Team identifier or slug to perform the request on behalf of. + pattern: ^ecfg_ + - description: The Team identifier to perform the request on behalf of. in: query name: teamId - required: true schema: type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug requestBody: content: application/json: schema: type: object additionalProperties: false - required: - - tokens properties: tokens: type: array + minItems: 1 items: type: string - '/v1/edge-config/{edgeConfigId}/token/{token}': + ids: + type: array + minItems: 1 + items: + type: string + required: + - tokens + - ids + /v1/global-config/{edge_config_id}/token/{token}: get: - description: Return meta data about an Edge Config token. + description: Return meta data about a Global Config token. operationId: getEdgeConfigToken security: - bearerToken: [] - summary: Get Edge Config token meta data + summary: Get Global Config token meta data tags: - - edge-config + - global-config responses: '200': - description: The EdgeConfig. + description: The Global Config. content: application/json: schema: - $ref: '#/components/schemas/EdgeConfigToken' + $ref: '#/components/schemas/GlobalConfigToken' '400': description: One of the provided values in the request query is invalid. '401': - description: '' + description: The request is not authorized. '403': description: You do not have permission to access this resource. '404': description: '' + '410': + description: '' parameters: - - name: edgeConfigId - description: Edge config id. + - name: edge_config_id in: path required: true schema: type: string - description: Edge config id. - name: token in: path required: true schema: type: string - - description: The Team identifier or slug to perform the request on behalf of. + - description: The Team identifier to perform the request on behalf of. in: query name: teamId - required: true schema: type: string - '/v1/edge-config/{edgeConfigId}/token': + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + /v1/global-config/{edge_config_id}/token: post: - description: Adds a token to an existing Edge Config. + description: Adds a token to an existing Global Config. operationId: createEdgeConfigToken security: - bearerToken: [] - summary: Create an Edge Config token + summary: Create a Global Config token tags: - - edge-config + - global-config responses: '201': description: '' @@ -923,37 +994,44 @@ paths: id: type: string required: - - token - id + - token type: object '400': description: |- One of the provided values in the request body is invalid. One of the provided values in the request query is invalid. '401': - description: '' + description: The request is not authorized. '402': - description: |- - The account was soft-blocked for an unhandled reason. - The account is missing a payment so payment method must be updated + description: The account is missing a payment so payment method must be updated '403': description: You do not have permission to access this resource. '404': description: '' + '409': + description: '' + '410': + description: '' parameters: - - name: edgeConfigId - description: Edge config id. + - name: edge_config_id in: path required: true schema: type: string - description: Edge config id. - - description: The Team identifier or slug to perform the request on behalf of. + pattern: ^ecfg_ + - description: The Team identifier to perform the request on behalf of. in: query name: teamId - required: true schema: type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug requestBody: content: application/json: @@ -966,3 +1044,748 @@ paths: label: maxLength: 52 type: string + /v1/global-config/{edge_config_id}/backups/{edge_config_backup_version_id}: + get: + description: Retrieves a specific version of a Global Config from backup storage. + operationId: getEdgeConfigBackup + security: + - bearerToken: [] + summary: Get Global Config backup + tags: + - global-config + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + id: + type: string + lastModified: + type: number + backup: + properties: + slug: + type: string + description: Name for the Global Config Names are not unique. Must start with an alphabetic character and can contain only alphanumeric characters and underscores). + updatedAt: + type: number + items: + additionalProperties: + properties: + createdAt: + type: number + updatedAt: + type: number + value: + $ref: '#/components/schemas/GlobalConfigItemValue' + description: + type: string + required: + - createdAt + - updatedAt + - value + type: object + type: object + digest: + type: string + required: + - digest + - items + - slug + - updatedAt + type: object + metadata: + properties: + updatedAt: + type: string + updatedBy: + type: string + itemsCount: + type: number + itemsBytes: + type: number + type: object + user: + properties: + id: + type: string + username: + type: string + email: + type: string + name: + type: string + avatar: + type: string + required: + - email + - id + - username + type: object + required: + - backup + - id + - lastModified + - metadata + - user + type: object + description: The object the API responds with when requesting a Global Config backup + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + parameters: + - name: edge_config_id + in: path + required: true + schema: + type: string + - name: edge_config_backup_version_id + in: path + required: true + schema: + type: string + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + /v1/global-config/{edge_config_id}/backups/{edge_config_backup_version_id}/restore: + post: + description: Restores a Global Config backup. + operationId: restoreEdgeConfigBackup + security: + - bearerToken: [] + summary: Restore Global Config backup + tags: + - global-config + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + status: + type: string + enum: + - ok + restoredFrom: + type: string + previousDigest: + type: string + digest: + type: string + required: + - digest + - previousDigest + - restoredFrom + - status + type: object + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '402': + description: The account is missing a payment so payment method must be updated + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '409': + description: '' + '410': + description: '' + '412': + description: '' + parameters: + - name: edge_config_id + in: path + required: true + schema: + type: string + pattern: ^ecfg_ + - name: edge_config_backup_version_id + in: path + required: true + schema: + type: string + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + /v1/global-config/{edge_config_id}/backups: + get: + description: Returns backups of a Global Config. + operationId: getEdgeConfigBackups + security: + - bearerToken: [] + summary: Get Global Config backups + tags: + - global-config + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + backups: + items: + properties: + metadata: + properties: + updatedAt: + type: string + updatedBy: + type: string + itemsCount: + type: number + itemsBytes: + type: number + type: object + id: + type: string + lastModified: + type: number + required: + - id + - lastModified + type: object + type: array + pagination: + properties: + hasNext: + type: boolean + enum: + - false + - true + next: + type: string + required: + - hasNext + type: object + required: + - backups + - pagination + type: object + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + parameters: + - name: edge_config_id + in: path + required: true + schema: + type: string + - name: next + in: query + required: false + schema: + type: string + - name: limit + in: query + required: false + schema: + type: number + minimum: 0 + maximum: 50 + - name: metadata + in: query + required: false + schema: + type: string + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug +components: + schemas: + GlobalConfigItem: + properties: + key: + type: string + value: + $ref: '#/components/schemas/GlobalConfigItemValue' + description: + type: string + edgeConfigId: + type: string + createdAt: + type: number + updatedAt: + type: number + required: + - createdAt + - edgeConfigId + - key + - updatedAt + - value + type: object + description: The Global Config. + GlobalConfigToken: + properties: + partialToken: + type: string + description: A partially-masked representation of the token, safe to display in UIs. The format is the first 3 characters of the token followed by a fixed 8-character `*` mask (e.g. `550e8400-e29b-41d4-a716-446655440000` → `550********`). The mask length is intentionally fixed (not proportional to the original token length) to avoid leaking the token length. Prefer this field for display/reference in UIs and logs. The full, plaintext token is only disclosed once at creation time via `POST /v1/edge-config/:edgeConfigId/token`; use `id` to reference a token in subsequent calls (e.g. when deleting). + label: + type: string + id: + type: string + description: This is not the token itself, but rather an id to identify the token by + edgeConfigId: + type: string + createdAt: + type: number + token: + type: string + description: 'Deprecated: the full, plaintext token. - Returned once by `POST /v1/edge-config/:edgeConfigId/token` (create). - Still returned by `GET /v1/edge-config/:edgeConfigId/token/:token` (detail) for backwards compatibility, but scheduled for removal. - **Not** returned by `GET /v1/edge-config/:edgeConfigId/tokens` (list); use `partialToken` for display and `id` to reference tokens. Do not rely on this field being present on read operations. Prefer `partialToken` for display and `id` for references.' + required: + - createdAt + - edgeConfigId + - id + - label + - partialToken + type: object + description: The Global Config. + GlobalConfigItemValue: + nullable: true + type: string + additionalProperties: + $ref: '#/components/schemas/GlobalConfigItemValue' + items: + $ref: '#/components/schemas/GlobalConfigItemValue' + enum: + - false + - true + GetEdgeConfigsResponse: + type: object + properties: + edge_configs: + type: array + items: + properties: + id: + type: string + createdAt: + type: number + createdBy: + type: string + description: The ID of the user who created the Global Config, optional because it is not always set. + ownerId: + type: string + slug: + type: string + description: Name for the Global Config Names are not unique. Must start with an alphabetic character and can contain only alphanumeric characters and underscores). + updatedAt: + type: number + digest: + type: string + purpose: + oneOf: + - properties: + type: + type: string + enum: + - flags + projectId: + type: string + required: + - projectId + - type + type: object + - properties: + type: + type: string + enum: + - experimentation + resourceId: + type: string + required: + - resourceId + - type + type: object + deletedAt: + nullable: true + type: number + transfer: + properties: + fromAccountId: + type: string + startedAt: + type: number + doneAt: + nullable: true + type: number + required: + - doneAt + - fromAccountId + - startedAt + type: object + description: Keeps track of the current state of the Global Config while it gets transferred. + schema: + type: string + description: (opaque JSON object) + syncedToDynamoAt: + type: number + description: Timestamp of when the Global Config was synced to DynamoDB initially. It is only set when syncing the entire Global Config, not when updating. + sizeInBytes: + type: number + itemCount: + type: number + required: + - createdAt + - digest + - id + - itemCount + - ownerId + - sizeInBytes + - slug + - updatedAt + type: object + description: List of all global configs. + GetEdgeConfigItemsResponse: + type: object + properties: + edge_config_items: + type: array + items: + $ref: '#/components/schemas/GlobalConfigItem' + GetEdgeConfigTokensResponse: + type: object + properties: + edge_config_tokens: + type: array + items: + $ref: '#/components/schemas/GlobalConfigToken' + StackqlTextResponse: + type: object + description: 'Wrapper for non-JSON response bodies (jsonl, ndjson, streamed json, octet-stream): one row carrying the raw body text.' + properties: + items: + type: array + items: + type: object + properties: + contents: + type: string + description: Raw response body. + x-stackQL-resources: + edge_configs: + id: vercel.edge_config.edge_configs + name: edge_configs + title: Edge Configs + methods: + list: + operation: + $ref: '#/paths/~1v1~1global-config/get' + response: + mediaType: application/json + openAPIDocKey: '200' + objectKey: $.edge_configs + overrideMediaType: application/json + schema_override: + $ref: '#/components/schemas/GetEdgeConfigsResponse' + transform: + body: |- + {{- $wrapped := printf "{\"edge_configs\":%s}" . -}} + {{- $wrapped -}} + type: golang_template_text_v0.3.0 + request: + nativeCasing: camel + create: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v1~1global-config/post' + response: + mediaType: application/json + openAPIDocKey: '201' + request: + nativeCasing: camel + get: + operation: + $ref: '#/paths/~1v1~1global-config~1{edge_config_id}/get' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + update: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v1~1global-config~1{edge_config_id}/put' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + delete: + operation: + $ref: '#/paths/~1v1~1global-config~1{edge_config_id}/delete' + response: + mediaType: application/json + openAPIDocKey: '204' + request: + nativeCasing: camel + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/edge_configs/methods/get' + - $ref: '#/components/x-stackQL-resources/edge_configs/methods/list' + insert: + - $ref: '#/components/x-stackQL-resources/edge_configs/methods/create' + update: + - $ref: '#/components/x-stackQL-resources/edge_configs/methods/update' + delete: + - $ref: '#/components/x-stackQL-resources/edge_configs/methods/delete' + replace: [] + items: + id: vercel.edge_config.items + name: items + title: Items + methods: + list: + operation: + $ref: '#/paths/~1v1~1global-config~1{edge_config_id}~1items/get' + response: + mediaType: application/json + openAPIDocKey: '200' + objectKey: $.edge_config_items + overrideMediaType: application/json + schema_override: + $ref: '#/components/schemas/GetEdgeConfigItemsResponse' + transform: + body: |- + {{- $wrapped := printf "{\"edge_config_items\":%s}" . -}} + {{- $wrapped -}} + type: golang_template_text_v0.3.0 + request: + nativeCasing: camel + update: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v1~1global-config~1{edge_config_id}~1items/patch' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + get: + operation: + $ref: '#/paths/~1v1~1global-config~1{edge_config_id}~1item~1{edge_config_item_key}/get' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/items/methods/get' + - $ref: '#/components/x-stackQL-resources/items/methods/list' + insert: [] + update: + - $ref: '#/components/x-stackQL-resources/items/methods/update' + delete: [] + replace: [] + schema: + id: vercel.edge_config.schema + name: schema + title: Schema + methods: + get: + operation: + $ref: '#/paths/~1v1~1global-config~1{edge_config_id}~1schema/get' + response: + mediaType: text/plain + openAPIDocKey: '200' + overrideMediaType: application/json + schema_override: + $ref: '#/components/schemas/StackqlTextResponse' + objectKey: $.items + transform: + type: golang_template_text_v0.3.0 + body: '{"items":[{"contents": {{ toJson . }}}]}' + request: + nativeCasing: camel + update: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v1~1global-config~1{edge_config_id}~1schema/post' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + delete: + operation: + $ref: '#/paths/~1v1~1global-config~1{edge_config_id}~1schema/delete' + response: + mediaType: application/json + openAPIDocKey: '204' + request: + nativeCasing: camel + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/schema/methods/get' + insert: [] + update: + - $ref: '#/components/x-stackQL-resources/schema/methods/update' + delete: + - $ref: '#/components/x-stackQL-resources/schema/methods/delete' + replace: [] + tokens: + id: vercel.edge_config.tokens + name: tokens + title: Tokens + methods: + list: + operation: + $ref: '#/paths/~1v1~1global-config~1{edge_config_id}~1tokens/get' + response: + mediaType: application/json + openAPIDocKey: '200' + objectKey: $.edge_config_tokens + overrideMediaType: application/json + schema_override: + $ref: '#/components/schemas/GetEdgeConfigTokensResponse' + transform: + body: |- + {{- $wrapped := printf "{\"edge_config_tokens\":%s}" . -}} + {{- $wrapped -}} + type: golang_template_text_v0.3.0 + request: + nativeCasing: camel + delete: + operation: + $ref: '#/paths/~1v1~1global-config~1{edge_config_id}~1tokens/delete' + response: + mediaType: application/json + openAPIDocKey: '204' + request: + nativeCasing: camel + get: + operation: + $ref: '#/paths/~1v1~1global-config~1{edge_config_id}~1token~1{token}/get' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + create: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v1~1global-config~1{edge_config_id}~1token/post' + response: + mediaType: application/json + openAPIDocKey: '201' + request: + nativeCasing: camel + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/tokens/methods/get' + - $ref: '#/components/x-stackQL-resources/tokens/methods/list' + insert: + - $ref: '#/components/x-stackQL-resources/tokens/methods/create' + update: [] + delete: + - $ref: '#/components/x-stackQL-resources/tokens/methods/delete' + replace: [] + backups: + id: vercel.edge_config.backups + name: backups + title: Backups + methods: + get: + operation: + $ref: '#/paths/~1v1~1global-config~1{edge_config_id}~1backups~1{edge_config_backup_version_id}/get' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + restore: + operation: + $ref: '#/paths/~1v1~1global-config~1{edge_config_id}~1backups~1{edge_config_backup_version_id}~1restore/post' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + list: + operation: + $ref: '#/paths/~1v1~1global-config~1{edge_config_id}~1backups/get' + response: + mediaType: application/json + openAPIDocKey: '200' + objectKey: $.backups + request: + nativeCasing: camel + config: + pagination: + requestToken: + key: next + location: query + responseToken: + key: $.pagination.next + location: body + queryParamPushdown: + top: + paramName: limit + maxValue: 100 + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/backups/methods/get' + - $ref: '#/components/x-stackQL-resources/backups/methods/list' + insert: [] + update: [] + delete: [] + replace: [] +servers: + - url: https://api.vercel.com diff --git a/provider-dev/openapi/src/vercel/v00.00.00000/services/environments.yaml b/provider-dev/openapi/src/vercel/v00.00.00000/services/environments.yaml new file mode 100644 index 0000000..7dc26b9 --- /dev/null +++ b/provider-dev/openapi/src/vercel/v00.00.00000/services/environments.yaml @@ -0,0 +1,2210 @@ +openapi: 3.0.3 +info: + title: environments API + description: vercel environments API + version: 0.0.1 +paths: + /v1/env: + post: + description: Creates shared environment variable(s) for a team. + operationId: createSharedEnvVariable + security: + - bearerToken: [] + summary: Create one or more shared environment variables + tags: + - environment + responses: + '201': + description: '' + content: + application/json: + schema: + properties: + created: + items: + properties: + created: + type: string + format: date-time + description: The date when the Shared Env Var was created. + example: '2021-02-10T13:11:49.180Z' + key: + type: string + description: The name of the Shared Env Var. + example: my-api-key + ownerId: + nullable: true + type: string + description: The unique identifier of the owner (team) the Shared Env Var was created for. + example: team_LLHUOMOoDlqOp8wPE4kFo9pE + id: + type: string + description: The unique identifier of the Shared Env Var. + example: env_XCG7t7AIHuO2SBA8667zNUiM + createdBy: + nullable: true + type: string + description: The unique identifier of the user who created the Shared Env Var. + example: 2qDDuGFTWXBLDNnqZfWPDp1A + deletedBy: + nullable: true + type: string + description: The unique identifier of the user who deleted the Shared Env Var. + example: 2qDDuGFTWXBLDNnqZfWPDp1A + updatedBy: + nullable: true + type: string + description: The unique identifier of the user who last updated the Shared Env Var. + example: 2qDDuGFTWXBLDNnqZfWPDp1A + createdAt: + type: number + description: Timestamp for when the Shared Env Var was created. + example: 1609492210000 + deletedAt: + type: number + description: Timestamp for when the Shared Env Var was (soft) deleted. + example: 1609492210000 + updatedAt: + type: number + description: Timestamp for when the Shared Env Var was last updated. + example: 1609492210000 + value: + type: string + description: The value of the Shared Env Var. + projectId: + items: + type: string + type: array + description: The unique identifiers of the projects which the Shared Env Var is linked to. + example: + - prj_2WjyKQmM8ZnGcJsPWMrHRHrE + - prj_2WjyKQmM8ZnGcJsPWMrasEFg + type: + type: string + enum: + - encrypted + - plain + - sensitive + - system + description: The type of this cosmos doc instance, if blank, assume secret. + example: encrypted + target: + items: + type: string + enum: + - development + - preview + - production + example: production + description: environments this env variable targets + type: array + description: environments this env variable targets + example: production + applyToAllCustomEnvironments: + type: boolean + enum: + - false + - true + description: whether or not this env varible applies to custom environments + customEnvironmentIds: + items: + type: string + type: array + description: The custom environment IDs that this Shared Env Var is scoped to. + decrypted: + type: boolean + enum: + - false + - true + description: whether or not this env variable is decrypted + comment: + type: string + description: A user provided comment that describes what this Shared Env Var is for. + lastEditedByDisplayName: + type: string + description: The last editor full name or username. + type: object + type: array + failed: + items: + properties: + error: + properties: + code: + type: string + message: + type: string + key: + type: string + envVarId: + type: string + envVarKey: + type: string + action: + type: string + link: + type: string + value: + oneOf: + - type: string + - items: + type: string + enum: + - development + - development + - preview + - preview + - production + type: array + gitBranch: + type: string + target: + oneOf: + - items: + type: string + enum: + - development + - development + - preview + - preview + - production + type: array + - type: string + enum: + - development + - development + - preview + - preview + - production + project: + type: string + required: + - code + - message + type: object + required: + - error + type: object + type: array + required: + - created + - failed + type: object + '400': + description: One of the provided values in the request body is invalid. + '401': + description: The request is not authorized. + '402': + description: The account is missing a payment so payment method must be updated + '403': + description: You do not have permission to access this resource. + '410': + description: '' + x-vercel-cli: + supportedSubcommands: true + supportedProduction: false + parameters: + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + requestBody: + content: + application/json: + schema: + type: object + required: + - evs + - target + - applyToAllCustomEnvironments + - customEnvironmentIds + properties: + evs: + type: array + maximum: 50 + minimum: 1 + items: + type: object + required: + - key + - value + properties: + key: + description: The name of the Shared Environment Variable + type: string + example: API_URL + value: + description: The value of the Shared Environment Variable + type: string + example: https://api.vercel.com + comment: + type: string + description: A comment to add context on what this Shared Environment Variable is for + example: database connection string for production + maxLength: 500 + type: + description: The type of environment variable + type: string + enum: + - encrypted + - sensitive + example: encrypted + target: + description: The target environment of the Shared Environment Variable + type: array + items: + enum: + - production + - preview + - development + example: + - production + - preview + projectId: + description: Associate a Shared Environment Variable to projects. + type: array + items: + type: string + example: + - prj_2WjyKQmM8ZnGcJsPWMrHRHrE + - prj_2WjyKQmM8ZnGcJsPWMrHRCRV + deprecated: true + get: + description: Lists all Shared Environment Variables for a team, taking into account optional filters. + operationId: listSharedEnvVariable + security: + - bearerToken: [] + summary: Lists all Shared Environment Variables for a team + tags: + - environment + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + data: + items: + properties: + securityIssues: + items: + type: string + enum: + - flags-secret-needs-split + - readable-secret + type: array + created: + type: string + format: date-time + description: The date when the Shared Env Var was created. + example: '2021-02-10T13:11:49.180Z' + key: + type: string + description: The name of the Shared Env Var. + example: my-api-key + ownerId: + nullable: true + type: string + description: The unique identifier of the owner (team) the Shared Env Var was created for. + example: team_LLHUOMOoDlqOp8wPE4kFo9pE + id: + type: string + description: The unique identifier of the Shared Env Var. + example: env_XCG7t7AIHuO2SBA8667zNUiM + createdBy: + nullable: true + type: string + description: The unique identifier of the user who created the Shared Env Var. + example: 2qDDuGFTWXBLDNnqZfWPDp1A + deletedBy: + nullable: true + type: string + description: The unique identifier of the user who deleted the Shared Env Var. + example: 2qDDuGFTWXBLDNnqZfWPDp1A + updatedBy: + nullable: true + type: string + description: The unique identifier of the user who last updated the Shared Env Var. + example: 2qDDuGFTWXBLDNnqZfWPDp1A + createdAt: + type: number + description: Timestamp for when the Shared Env Var was created. + example: 1609492210000 + deletedAt: + type: number + description: Timestamp for when the Shared Env Var was (soft) deleted. + example: 1609492210000 + updatedAt: + type: number + description: Timestamp for when the Shared Env Var was last updated. + example: 1609492210000 + value: + type: string + description: The value of the Shared Env Var. + projectId: + items: + type: string + type: array + description: The unique identifiers of the projects which the Shared Env Var is linked to. + example: + - prj_2WjyKQmM8ZnGcJsPWMrHRHrE + - prj_2WjyKQmM8ZnGcJsPWMrasEFg + type: + type: string + enum: + - encrypted + - plain + - sensitive + - system + description: The type of this cosmos doc instance, if blank, assume secret. + example: encrypted + target: + items: + type: string + enum: + - development + - preview + - production + example: production + description: environments this env variable targets + type: array + description: environments this env variable targets + example: production + applyToAllCustomEnvironments: + type: boolean + enum: + - false + - true + description: whether or not this env varible applies to custom environments + customEnvironmentIds: + items: + type: string + type: array + description: The custom environment IDs that this Shared Env Var is scoped to. + decrypted: + type: boolean + enum: + - false + - true + description: whether or not this env variable is decrypted + comment: + type: string + description: A user provided comment that describes what this Shared Env Var is for. + lastEditedByDisplayName: + type: string + description: The last editor full name or username. + required: + - created + - decrypted + - id + - key + - securityIssues + type: object + type: array + pagination: + $ref: '#/components/schemas/Pagination' + required: + - data + - pagination + type: object + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + x-vercel-cli: + supportedSubcommands: true + supportedProduction: false + aliases: + - ls + - list + parameters: + - name: search + in: query + schema: + type: string + - name: projectId + description: Filter SharedEnvVariables that belong to a project + in: query + schema: + description: Filter SharedEnvVariables that belong to a project + type: string + example: prj_2WjyKQmM8ZnGcJsPWMrHRHrE + - name: ids + description: Filter SharedEnvVariables based on comma separated ids + in: query + schema: + description: Filter SharedEnvVariables based on comma separated ids + type: string + example: env_2WjyKQmM8ZnGcJsPWMrHRHrE,env_2WjyKQmM8ZnGcJsPWMrHRCRV + - name: exclude_ids + description: Filter SharedEnvVariables based on comma separated ids + in: query + schema: + description: Filter SharedEnvVariables based on comma separated ids + type: string + example: env_2WjyKQmM8ZnGcJsPWMrHRHrE,env_2WjyKQmM8ZnGcJsPWMrHRCRV + - name: exclude-ids + description: Filter SharedEnvVariables based on comma separated ids + in: query + schema: + description: Filter SharedEnvVariables based on comma separated ids + type: string + example: env_2WjyKQmM8ZnGcJsPWMrHRHrE,env_2WjyKQmM8ZnGcJsPWMrHRCRV + - name: exclude_projectId + description: Filter SharedEnvVariables that belong to a project + in: query + schema: + description: Filter SharedEnvVariables that belong to a project + type: string + example: prj_2WjyKQmM8ZnGcJsPWMrHRHrE + - name: exclude-projectId + description: Filter SharedEnvVariables that belong to a project + in: query + schema: + description: Filter SharedEnvVariables that belong to a project + type: string + example: prj_2WjyKQmM8ZnGcJsPWMrHRHrE + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + patch: + description: Updates a given Shared Environment Variable for a Team. + operationId: updateSharedEnvVariable + security: + - bearerToken: [] + summary: Updates one or more shared environment variables + tags: + - environment + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + updated: + items: + properties: + created: + type: string + format: date-time + description: The date when the Shared Env Var was created. + example: '2021-02-10T13:11:49.180Z' + key: + type: string + description: The name of the Shared Env Var. + example: my-api-key + ownerId: + nullable: true + type: string + description: The unique identifier of the owner (team) the Shared Env Var was created for. + example: team_LLHUOMOoDlqOp8wPE4kFo9pE + id: + type: string + description: The unique identifier of the Shared Env Var. + example: env_XCG7t7AIHuO2SBA8667zNUiM + createdBy: + nullable: true + type: string + description: The unique identifier of the user who created the Shared Env Var. + example: 2qDDuGFTWXBLDNnqZfWPDp1A + deletedBy: + nullable: true + type: string + description: The unique identifier of the user who deleted the Shared Env Var. + example: 2qDDuGFTWXBLDNnqZfWPDp1A + updatedBy: + nullable: true + type: string + description: The unique identifier of the user who last updated the Shared Env Var. + example: 2qDDuGFTWXBLDNnqZfWPDp1A + createdAt: + type: number + description: Timestamp for when the Shared Env Var was created. + example: 1609492210000 + deletedAt: + type: number + description: Timestamp for when the Shared Env Var was (soft) deleted. + example: 1609492210000 + updatedAt: + type: number + description: Timestamp for when the Shared Env Var was last updated. + example: 1609492210000 + value: + type: string + description: The value of the Shared Env Var. + projectId: + items: + type: string + type: array + description: The unique identifiers of the projects which the Shared Env Var is linked to. + example: + - prj_2WjyKQmM8ZnGcJsPWMrHRHrE + - prj_2WjyKQmM8ZnGcJsPWMrasEFg + type: + type: string + enum: + - encrypted + - plain + - sensitive + - system + description: The type of this cosmos doc instance, if blank, assume secret. + example: encrypted + target: + items: + type: string + enum: + - development + - preview + - production + example: production + description: environments this env variable targets + type: array + description: environments this env variable targets + example: production + applyToAllCustomEnvironments: + type: boolean + enum: + - false + - true + description: whether or not this env varible applies to custom environments + customEnvironmentIds: + items: + type: string + type: array + description: The custom environment IDs that this Shared Env Var is scoped to. + decrypted: + type: boolean + enum: + - false + - true + description: whether or not this env variable is decrypted + comment: + type: string + description: A user provided comment that describes what this Shared Env Var is for. + lastEditedByDisplayName: + type: string + description: The last editor full name or username. + type: object + type: array + failed: + items: + properties: + error: + properties: + code: + type: string + message: + type: string + key: + type: string + envVarId: + type: string + envVarKey: + type: string + action: + type: string + link: + type: string + value: + oneOf: + - type: string + - items: + type: string + enum: + - development + - development + - preview + - preview + - production + type: array + gitBranch: + type: string + target: + oneOf: + - items: + type: string + enum: + - development + - development + - preview + - preview + - production + type: array + - type: string + enum: + - development + - development + - preview + - preview + - production + project: + type: string + required: + - code + - message + type: object + required: + - error + type: object + type: array + required: + - failed + - updated + type: object + '400': + description: One of the provided values in the request body is invalid. + '401': + description: The request is not authorized. + '402': + description: The account is missing a payment so payment method must be updated + '403': + description: You do not have permission to access this resource. + '410': + description: '' + x-vercel-cli: + supportedSubcommands: true + supportedProduction: false + parameters: + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + requestBody: + content: + application/json: + schema: + additionalProperties: false + type: object + required: + - updates + properties: + updates: + description: An object where each key is an environment variable ID (not the key name) and the value is the update to apply + type: object + example: + env_2WjyKQmM8ZnGcJsPWMrHRHrE: + key: API_URL + value: https://api.vercel.com + target: + - production + - preview + projectIdUpdates: + link: + - prj_2WjyKQmM8ZnGcJsPWMrHRHrE + additionalProperties: + type: object + additionalProperties: false + properties: + key: + description: The name of the Shared Environment Variable + type: string + example: API_URL + value: + description: The value of the Shared Environment Variable + type: string + example: https://api.vercel.com + target: + description: The target environment of the Shared Environment Variable + type: array + items: + enum: + - production + - preview + - development + example: + - production + - preview + projectId: + description: Associate a Shared Environment Variable to projects. + type: array + items: + type: string + example: + - prj_2WjyKQmM8ZnGcJsPWMrHRHrE + - prj_2WjyKQmM8ZnGcJsPWMrHRCRV + projectIdUpdates: + description: Incrementally update project linking without specifying the full list + type: object + additionalProperties: false + properties: + link: + description: Project IDs to add to this environment variable + type: array + items: + type: string + example: + - prj_2WjyKQmM8ZnGcJsPWMrHRHrE + unlink: + description: Project IDs to remove from this environment variable + type: array + items: + type: string + example: + - prj_2WjyKQmM8ZnGcJsPWMrHRCRV + type: + description: The new type of the Shared Environment Variable + type: string + enum: + - encrypted + - sensitive + example: encrypted + comment: + type: string + description: A comment to add context on what this Shared Environment Variable is for + example: database connection string for production + maxLength: 500 + delete: + description: Deletes one or many Shared Environment Variables for a given team. + operationId: deleteSharedEnvVariable + security: + - bearerToken: [] + summary: Delete one or more Env Var + tags: + - environment + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + deleted: + items: + type: string + type: array + failed: + items: + properties: + error: + properties: + code: + type: string + message: + type: string + key: + type: string + envVarId: + type: string + envVarKey: + type: string + action: + type: string + link: + type: string + value: + oneOf: + - type: string + - items: + type: string + enum: + - development + - development + - preview + - preview + - production + type: array + gitBranch: + type: string + target: + oneOf: + - items: + type: string + enum: + - development + - development + - preview + - preview + - production + type: array + - type: string + enum: + - development + - development + - preview + - preview + - production + project: + type: string + required: + - code + - message + type: object + required: + - error + type: object + type: array + required: + - deleted + - failed + type: object + '400': + description: One of the provided values in the request body is invalid. + '401': + description: The request is not authorized. + '402': + description: The account is missing a payment so payment method must be updated + '403': + description: You do not have permission to access this resource. + '410': + description: '' + x-vercel-cli: + supportedSubcommands: true + supportedProduction: false + parameters: + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + requestBody: + content: + application/json: + schema: + type: object + required: + - ids + properties: + ids: + description: IDs of the Shared Environment Variables to delete + minimum: 1 + maximum: 50 + type: array + items: + type: string + example: + - env_abc123 + - env_abc124 + /v1/env/{id}: + get: + description: Retrieve the decrypted value of a Shared Environment Variable by id. + operationId: getSharedEnvVar + security: + - bearerToken: [] + summary: Retrieve the decrypted value of a Shared Environment Variable by id. + tags: + - environment + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + created: + type: string + format: date-time + description: The date when the Shared Env Var was created. + example: '2021-02-10T13:11:49.180Z' + key: + type: string + description: The name of the Shared Env Var. + example: my-api-key + ownerId: + nullable: true + type: string + description: The unique identifier of the owner (team) the Shared Env Var was created for. + example: team_LLHUOMOoDlqOp8wPE4kFo9pE + id: + type: string + description: The unique identifier of the Shared Env Var. + example: env_XCG7t7AIHuO2SBA8667zNUiM + createdBy: + nullable: true + type: string + description: The unique identifier of the user who created the Shared Env Var. + example: 2qDDuGFTWXBLDNnqZfWPDp1A + deletedBy: + nullable: true + type: string + description: The unique identifier of the user who deleted the Shared Env Var. + example: 2qDDuGFTWXBLDNnqZfWPDp1A + updatedBy: + nullable: true + type: string + description: The unique identifier of the user who last updated the Shared Env Var. + example: 2qDDuGFTWXBLDNnqZfWPDp1A + createdAt: + type: number + description: Timestamp for when the Shared Env Var was created. + example: 1609492210000 + deletedAt: + type: number + description: Timestamp for when the Shared Env Var was (soft) deleted. + example: 1609492210000 + updatedAt: + type: number + description: Timestamp for when the Shared Env Var was last updated. + example: 1609492210000 + value: + type: string + description: The value of the Shared Env Var. + projectId: + items: + type: string + type: array + description: The unique identifiers of the projects which the Shared Env Var is linked to. + example: + - prj_2WjyKQmM8ZnGcJsPWMrHRHrE + - prj_2WjyKQmM8ZnGcJsPWMrasEFg + type: + type: string + enum: + - encrypted + - plain + - sensitive + - system + description: The type of this cosmos doc instance, if blank, assume secret. + example: encrypted + target: + items: + type: string + enum: + - development + - preview + - production + example: production + description: environments this env variable targets + type: array + description: environments this env variable targets + example: production + applyToAllCustomEnvironments: + type: boolean + enum: + - false + - true + description: whether or not this env varible applies to custom environments + customEnvironmentIds: + items: + type: string + type: array + description: The custom environment IDs that this Shared Env Var is scoped to. + decrypted: + type: boolean + enum: + - false + - true + description: whether or not this env variable is decrypted + comment: + type: string + description: A user provided comment that describes what this Shared Env Var is for. + lastEditedByDisplayName: + type: string + description: The last editor full name or username. + type: object + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '410': + description: '' + x-vercel-cli: + supportedSubcommands: true + supportedProduction: false + parameters: + - name: id + description: The unique ID for the Shared Environment Variable to get the decrypted value. + in: path + required: true + schema: + description: The unique ID for the Shared Environment Variable to get the decrypted value. + type: string + x-vercel-cli: + kind: argument + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + /v1/env/{id}/unlink/{project_id}: + patch: + description: Disconnects a shared environment variable for a given project + operationId: unlinkSharedEnvVariable + security: + - bearerToken: [] + summary: Disconnects a shared environment variable for a given project + tags: + - environment + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + id: + type: string + required: + - id + type: object + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '410': + description: '' + parameters: + - name: id + description: The unique ID for the Shared Environment Variable to unlink from the project. + in: path + required: true + schema: + description: The unique ID for the Shared Environment Variable to unlink from the project. + type: string + - name: project_id + in: path + required: true + schema: + type: string + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + /v9/projects/{id_or_name}/custom-environments: + post: + description: Creates a custom environment for the current project. Cannot be named 'Production' or 'Preview'. + operationId: createCustomEnvironment + security: + - bearerToken: [] + summary: Create a custom environment for the current project. + tags: + - environment + responses: + '201': + description: '' + content: + application/json: + schema: + properties: + id: + type: string + description: 'Unique identifier for the custom environment (format: env_*)' + slug: + type: string + description: URL-friendly name of the environment + type: + type: string + enum: + - development + - preview + - production + description: The type of environment (production, preview, or development) + description: + type: string + description: Optional description of the environment's purpose + branchMatcher: + properties: + type: + type: string + enum: + - endsWith + - equals + - startsWith + description: The type of matching to perform + pattern: + type: string + description: The pattern to match against branch names + required: + - pattern + - type + type: object + description: Configuration for matching git branches to this environment + domains: + items: + properties: + name: + type: string + apexName: + type: string + projectId: + type: string + redirect: + nullable: true + type: string + redirectStatusCode: + nullable: true + type: number + enum: + - 301 + - 302 + - 307 + - 308 + - null + gitBranch: + nullable: true + type: string + customEnvironmentId: + nullable: true + type: string + updatedAt: + type: number + createdAt: + type: number + verified: + type: boolean + enum: + - false + - true + description: '`true` if the domain is verified for use with the project. If `false` it will not be used as an alias on this project until the challenge in `verification` is completed.' + verification: + items: + properties: + type: + type: string + domain: + type: string + value: + type: string + reason: + type: string + required: + - domain + - reason + - type + - value + type: object + description: 'A list of verification challenges, one of which must be completed to verify the domain for use on the project. After the challenge is complete `POST /projects/:idOrName/domains/:domain/verify` to verify the domain. Possible challenges: - If `verification.type = TXT` the `verification.domain` will be checked for a TXT record matching `verification.value`.' + type: array + description: 'A list of verification challenges, one of which must be completed to verify the domain for use on the project. After the challenge is complete `POST /projects/:idOrName/domains/:domain/verify` to verify the domain. Possible challenges: - If `verification.type = TXT` the `verification.domain` will be checked for a TXT record matching `verification.value`.' + required: + - apexName + - name + - projectId + - verified + type: object + description: List of domains associated with this environment + type: array + description: List of domains associated with this environment + currentDeploymentAliases: + items: + type: string + type: array + description: List of aliases for the current deployment + createdAt: + type: number + description: Timestamp when the environment was created + updatedAt: + type: number + description: Timestamp when the environment was last updated + required: + - createdAt + - id + - slug + - type + - updatedAt + type: object + description: Internal representation of a custom environment with all required properties + '400': + description: |- + One of the provided values in the request body is invalid. + One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '402': + description: The account is missing a payment so payment method must be updated + '403': + description: You do not have permission to access this resource. + '410': + description: '' + '500': + description: '' + parameters: + - name: id_or_name + description: The unique project identifier or the project name + in: path + required: true + schema: + description: The unique project identifier or the project name + type: string + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + requestBody: + content: + application/json: + schema: + type: object + properties: + slug: + description: The slug of the custom environment to create. + type: string + maxLength: 32 + description: + description: Description of the custom environment. This is optional. + type: string + maxLength: 256 + branchMatcher: + required: + - type + - pattern + description: How we want to determine a matching branch. This is optional. + type: object + properties: + type: + description: Type of matcher. One of "equals", "startsWith", or "endsWith". + enum: + - equals + - startsWith + - endsWith + pattern: + description: Git branch name or portion thereof. + type: string + maxLength: 100 + copyEnvVarsFrom: + description: Where to copy environment variables from. This is optional. + type: string + get: + description: Retrieve custom environments for the project. Must not be named 'Production' or 'Preview'. + operationId: getProjectsByIdOrNameCustomEnvironments + security: + - bearerToken: [] + summary: Retrieve custom environments + tags: + - environment + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + accountLimit: + properties: + total: + type: number + required: + - total + type: object + description: The maximum number of custom environments allowed either by the team's plan type or a custom override. + environments: + items: + properties: + type: + type: string + enum: + - development + - preview + - production + description: The type of environment (production, preview, or development) + description: + type: string + description: Optional description of the environment's purpose + createdAt: + type: number + description: Timestamp when the environment was created + updatedAt: + type: number + description: Timestamp when the environment was last updated + slug: + type: string + description: URL-friendly name of the environment + id: + type: string + description: 'Unique identifier for the custom environment (format: env_*)' + domains: + items: + properties: + name: + type: string + apexName: + type: string + projectId: + type: string + redirect: + nullable: true + type: string + redirectStatusCode: + nullable: true + type: number + enum: + - 301 + - 302 + - 307 + - 308 + - null + gitBranch: + nullable: true + type: string + customEnvironmentId: + nullable: true + type: string + updatedAt: + type: number + createdAt: + type: number + verified: + type: boolean + enum: + - false + - true + description: '`true` if the domain is verified for use with the project. If `false` it will not be used as an alias on this project until the challenge in `verification` is completed.' + verification: + items: + properties: + type: + type: string + domain: + type: string + value: + type: string + reason: + type: string + required: + - domain + - reason + - type + - value + type: object + description: 'A list of verification challenges, one of which must be completed to verify the domain for use on the project. After the challenge is complete `POST /projects/:idOrName/domains/:domain/verify` to verify the domain. Possible challenges: - If `verification.type = TXT` the `verification.domain` will be checked for a TXT record matching `verification.value`.' + type: array + description: 'A list of verification challenges, one of which must be completed to verify the domain for use on the project. After the challenge is complete `POST /projects/:idOrName/domains/:domain/verify` to verify the domain. Possible challenges: - If `verification.type = TXT` the `verification.domain` will be checked for a TXT record matching `verification.value`.' + required: + - apexName + - name + - projectId + - verified + type: object + description: List of domains associated with this environment + type: array + description: List of domains associated with this environment + branchMatcher: + properties: + type: + type: string + enum: + - endsWith + - equals + - startsWith + description: The type of matching to perform + pattern: + type: string + description: The pattern to match against branch names + required: + - pattern + - type + type: object + description: Configuration for matching git branches to this environment + currentDeploymentAliases: + items: + type: string + type: array + description: List of aliases for the current deployment + required: + - createdAt + - id + - slug + - type + - updatedAt + type: object + type: array + required: + - accountLimit + - environments + type: object + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '410': + description: '' + parameters: + - name: id_or_name + description: The unique project identifier or the project name + in: path + required: true + schema: + description: The unique project identifier or the project name + type: string + - name: gitBranch + description: Fetch custom environments for a specific git branch + in: query + required: false + schema: + description: Fetch custom environments for a specific git branch + type: string + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + /v9/projects/{id_or_name}/custom-environments/{environment_slug_or_id}: + get: + description: Retrieve a custom environment for the project. Must not be named 'Production' or 'Preview'. + operationId: getCustomEnvironment + security: + - bearerToken: [] + summary: Retrieve a custom environment + tags: + - environment + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + id: + type: string + description: 'Unique identifier for the custom environment (format: env_*)' + slug: + type: string + description: URL-friendly name of the environment + type: + type: string + enum: + - development + - preview + - production + description: The type of environment (production, preview, or development) + description: + type: string + description: Optional description of the environment's purpose + branchMatcher: + properties: + type: + type: string + enum: + - endsWith + - equals + - startsWith + description: The type of matching to perform + pattern: + type: string + description: The pattern to match against branch names + required: + - pattern + - type + type: object + description: Configuration for matching git branches to this environment + domains: + items: + properties: + name: + type: string + apexName: + type: string + projectId: + type: string + redirect: + nullable: true + type: string + redirectStatusCode: + nullable: true + type: number + enum: + - 301 + - 302 + - 307 + - 308 + - null + gitBranch: + nullable: true + type: string + customEnvironmentId: + nullable: true + type: string + updatedAt: + type: number + createdAt: + type: number + verified: + type: boolean + enum: + - false + - true + description: '`true` if the domain is verified for use with the project. If `false` it will not be used as an alias on this project until the challenge in `verification` is completed.' + verification: + items: + properties: + type: + type: string + domain: + type: string + value: + type: string + reason: + type: string + required: + - domain + - reason + - type + - value + type: object + description: 'A list of verification challenges, one of which must be completed to verify the domain for use on the project. After the challenge is complete `POST /projects/:idOrName/domains/:domain/verify` to verify the domain. Possible challenges: - If `verification.type = TXT` the `verification.domain` will be checked for a TXT record matching `verification.value`.' + type: array + description: 'A list of verification challenges, one of which must be completed to verify the domain for use on the project. After the challenge is complete `POST /projects/:idOrName/domains/:domain/verify` to verify the domain. Possible challenges: - If `verification.type = TXT` the `verification.domain` will be checked for a TXT record matching `verification.value`.' + required: + - apexName + - name + - projectId + - verified + type: object + description: List of domains associated with this environment + type: array + description: List of domains associated with this environment + currentDeploymentAliases: + items: + type: string + type: array + description: List of aliases for the current deployment + createdAt: + type: number + description: Timestamp when the environment was created + updatedAt: + type: number + description: Timestamp when the environment was last updated + required: + - createdAt + - id + - slug + - type + - updatedAt + type: object + description: Internal representation of a custom environment with all required properties + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + parameters: + - name: id_or_name + description: The unique project identifier or the project name + in: path + required: true + schema: + description: The unique project identifier or the project name + type: string + - name: environment_slug_or_id + description: The unique custom environment identifier within the project + in: path + required: true + schema: + description: The unique custom environment identifier within the project + type: string + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + patch: + description: Update a custom environment for the project. Must not be named 'Production' or 'Preview'. + operationId: updateCustomEnvironment + security: + - bearerToken: [] + summary: Update a custom environment + tags: + - environment + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + id: + type: string + description: 'Unique identifier for the custom environment (format: env_*)' + slug: + type: string + description: URL-friendly name of the environment + type: + type: string + enum: + - development + - preview + - production + description: The type of environment (production, preview, or development) + description: + type: string + description: Optional description of the environment's purpose + branchMatcher: + properties: + type: + type: string + enum: + - endsWith + - equals + - startsWith + description: The type of matching to perform + pattern: + type: string + description: The pattern to match against branch names + required: + - pattern + - type + type: object + description: Configuration for matching git branches to this environment + domains: + items: + properties: + name: + type: string + apexName: + type: string + projectId: + type: string + redirect: + nullable: true + type: string + redirectStatusCode: + nullable: true + type: number + enum: + - 301 + - 302 + - 307 + - 308 + - null + gitBranch: + nullable: true + type: string + customEnvironmentId: + nullable: true + type: string + updatedAt: + type: number + createdAt: + type: number + verified: + type: boolean + enum: + - false + - true + description: '`true` if the domain is verified for use with the project. If `false` it will not be used as an alias on this project until the challenge in `verification` is completed.' + verification: + items: + properties: + type: + type: string + domain: + type: string + value: + type: string + reason: + type: string + required: + - domain + - reason + - type + - value + type: object + description: 'A list of verification challenges, one of which must be completed to verify the domain for use on the project. After the challenge is complete `POST /projects/:idOrName/domains/:domain/verify` to verify the domain. Possible challenges: - If `verification.type = TXT` the `verification.domain` will be checked for a TXT record matching `verification.value`.' + type: array + description: 'A list of verification challenges, one of which must be completed to verify the domain for use on the project. After the challenge is complete `POST /projects/:idOrName/domains/:domain/verify` to verify the domain. Possible challenges: - If `verification.type = TXT` the `verification.domain` will be checked for a TXT record matching `verification.value`.' + required: + - apexName + - name + - projectId + - verified + type: object + description: List of domains associated with this environment + type: array + description: List of domains associated with this environment + currentDeploymentAliases: + items: + type: string + type: array + description: List of aliases for the current deployment + createdAt: + type: number + description: Timestamp when the environment was created + updatedAt: + type: number + description: Timestamp when the environment was last updated + required: + - createdAt + - id + - slug + - type + - updatedAt + type: object + description: Internal representation of a custom environment with all required properties + '400': + description: |- + One of the provided values in the request body is invalid. + One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '402': + description: The account is missing a payment so payment method must be updated + '403': + description: You do not have permission to access this resource. + '410': + description: '' + '500': + description: '' + parameters: + - name: id_or_name + description: The unique project identifier or the project name + in: path + required: true + schema: + description: The unique project identifier or the project name + type: string + - name: environment_slug_or_id + description: The unique custom environment identifier within the project + in: path + required: true + schema: + description: The unique custom environment identifier within the project + type: string + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + requestBody: + content: + application/json: + schema: + type: object + properties: + slug: + description: The slug of the custom environment. + type: string + maxLength: 32 + description: + description: Description of the custom environment. This is optional. + type: string + maxLength: 256 + branchMatcher: + required: + - type + - pattern + description: How we want to determine a matching branch. This is optional. + type: object + properties: + type: + description: Type of matcher. One of "equals", "startsWith", or "endsWith". + enum: + - equals + - startsWith + - endsWith + pattern: + description: Git branch name or portion thereof. + type: string + maxLength: 100 + nullable: true + delete: + description: Remove a custom environment for the project. Must not be named 'Production' or 'Preview'. + operationId: removeCustomEnvironment + security: + - bearerToken: [] + summary: Remove a custom environment + tags: + - environment + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + id: + type: string + description: 'Unique identifier for the custom environment (format: env_*)' + slug: + type: string + description: URL-friendly name of the environment + type: + type: string + enum: + - development + - preview + - production + description: The type of environment (production, preview, or development) + description: + type: string + description: Optional description of the environment's purpose + branchMatcher: + properties: + type: + type: string + enum: + - endsWith + - equals + - startsWith + description: The type of matching to perform + pattern: + type: string + description: The pattern to match against branch names + required: + - pattern + - type + type: object + description: Configuration for matching git branches to this environment + domains: + items: + properties: + name: + type: string + apexName: + type: string + projectId: + type: string + redirect: + nullable: true + type: string + redirectStatusCode: + nullable: true + type: number + enum: + - 301 + - 302 + - 307 + - 308 + - null + gitBranch: + nullable: true + type: string + customEnvironmentId: + nullable: true + type: string + updatedAt: + type: number + createdAt: + type: number + verified: + type: boolean + enum: + - false + - true + description: '`true` if the domain is verified for use with the project. If `false` it will not be used as an alias on this project until the challenge in `verification` is completed.' + verification: + items: + properties: + type: + type: string + domain: + type: string + value: + type: string + reason: + type: string + required: + - domain + - reason + - type + - value + type: object + description: 'A list of verification challenges, one of which must be completed to verify the domain for use on the project. After the challenge is complete `POST /projects/:idOrName/domains/:domain/verify` to verify the domain. Possible challenges: - If `verification.type = TXT` the `verification.domain` will be checked for a TXT record matching `verification.value`.' + type: array + description: 'A list of verification challenges, one of which must be completed to verify the domain for use on the project. After the challenge is complete `POST /projects/:idOrName/domains/:domain/verify` to verify the domain. Possible challenges: - If `verification.type = TXT` the `verification.domain` will be checked for a TXT record matching `verification.value`.' + required: + - apexName + - name + - projectId + - verified + type: object + description: List of domains associated with this environment + type: array + description: List of domains associated with this environment + currentDeploymentAliases: + items: + type: string + type: array + description: List of aliases for the current deployment + createdAt: + type: number + description: Timestamp when the environment was created + updatedAt: + type: number + description: Timestamp when the environment was last updated + required: + - createdAt + - id + - slug + - type + - updatedAt + type: object + description: Internal representation of a custom environment with all required properties + '400': + description: |- + One of the provided values in the request body is invalid. + One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '410': + description: '' + parameters: + - name: id_or_name + description: The unique project identifier or the project name + in: path + required: true + schema: + description: The unique project identifier or the project name + type: string + - name: environment_slug_or_id + description: The unique custom environment identifier within the project + in: path + required: true + schema: + description: The unique custom environment identifier within the project + type: string + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + requestBody: + content: + application/json: + schema: + type: object + properties: + deleteUnassignedEnvironmentVariables: + description: Delete Environment Variables that are not assigned to any environments. + type: boolean +components: + schemas: + Pagination: + properties: + count: + type: number + description: Amount of items in the current page. + example: 20 + next: + nullable: true + type: number + description: Timestamp that must be used to request the next page. + example: 1540095775951 + prev: + nullable: true + type: number + description: Timestamp that must be used to request the previous page. + example: 1540095775951 + required: + - count + - next + - prev + type: object + description: This object contains information related to the pagination of the current request, including the necessary parameters to get the next or previous page of data. + x-stackQL-resources: + shared_env_variables: + id: vercel.environments.shared_env_variables + name: shared_env_variables + title: Shared Env Variables + methods: + create: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v1~1env/post' + response: + mediaType: application/json + openAPIDocKey: '201' + request: + nativeCasing: camel + list: + operation: + $ref: '#/paths/~1v1~1env/get' + response: + mediaType: application/json + openAPIDocKey: '200' + objectKey: $.data + request: + nativeCasing: camel + update: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v1~1env/patch' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + delete: + operation: + $ref: '#/paths/~1v1~1env/delete' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + get: + operation: + $ref: '#/paths/~1v1~1env~1{id}/get' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + unlink: + operation: + $ref: '#/paths/~1v1~1env~1{id}~1unlink~1{project_id}/patch' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/shared_env_variables/methods/get' + - $ref: '#/components/x-stackQL-resources/shared_env_variables/methods/list' + insert: + - $ref: '#/components/x-stackQL-resources/shared_env_variables/methods/create' + update: + - $ref: '#/components/x-stackQL-resources/shared_env_variables/methods/update' + delete: + - $ref: '#/components/x-stackQL-resources/shared_env_variables/methods/delete' + replace: [] + custom_environments: + id: vercel.environments.custom_environments + name: custom_environments + title: Custom Environments + methods: + create: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v9~1projects~1{id_or_name}~1custom-environments/post' + response: + mediaType: application/json + openAPIDocKey: '201' + request: + nativeCasing: camel + list: + operation: + $ref: '#/paths/~1v9~1projects~1{id_or_name}~1custom-environments/get' + response: + mediaType: application/json + openAPIDocKey: '200' + objectKey: $.environments + request: + nativeCasing: camel + get: + operation: + $ref: '#/paths/~1v9~1projects~1{id_or_name}~1custom-environments~1{environment_slug_or_id}/get' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + update: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v9~1projects~1{id_or_name}~1custom-environments~1{environment_slug_or_id}/patch' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + delete: + operation: + $ref: '#/paths/~1v9~1projects~1{id_or_name}~1custom-environments~1{environment_slug_or_id}/delete' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/custom_environments/methods/get' + - $ref: '#/components/x-stackQL-resources/custom_environments/methods/list' + insert: + - $ref: '#/components/x-stackQL-resources/custom_environments/methods/create' + update: + - $ref: '#/components/x-stackQL-resources/custom_environments/methods/update' + delete: + - $ref: '#/components/x-stackQL-resources/custom_environments/methods/delete' + replace: [] +servers: + - url: https://api.vercel.com diff --git a/provider-dev/openapi/src/vercel/v00.00.00000/services/feature_flags.yaml b/provider-dev/openapi/src/vercel/v00.00.00000/services/feature_flags.yaml new file mode 100644 index 0000000..b848d01 --- /dev/null +++ b/provider-dev/openapi/src/vercel/v00.00.00000/services/feature_flags.yaml @@ -0,0 +1,6538 @@ +openapi: 3.0.3 +info: + title: feature_flags API + description: vercel feature_flags API + version: 0.0.1 +paths: + /v2/projects/{project_id_or_name}/feature-flags/flags: + get: + description: Retrieve feature flags for a project. Returns an opaque cursor for pagination. + operationId: listFlagsV2 + security: + - bearerToken: [] + summary: List flags + tags: + - feature-flags + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + pagination: + properties: + next: + nullable: true + type: string + required: + - next + type: object + data: + items: + oneOf: + - $ref: '#/components/schemas/Flag' + - $ref: '#/components/schemas/MarketplaceFlag' + type: array + required: + - data + - pagination + type: object + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '402': + description: The account is missing a payment so payment method must be updated + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + parameters: + - name: project_id_or_name + description: The project id or name + in: path + required: true + schema: + description: The project id or name + type: string + - name: state + description: The state of the flags to retrieve. Defaults to `active`. + in: query + required: false + schema: + type: string + enum: + - active + - archived + description: The state of the flags to retrieve. Defaults to `active`. + - name: limit + description: Maximum number of flags to return. + in: query + required: false + schema: + description: Maximum number of flags to return. + type: integer + minimum: 1 + maximum: 100 + default: 25 + - name: cursor + description: Pagination cursor to continue from. + in: query + required: false + schema: + description: Pagination cursor to continue from. + type: string + - name: search + description: Search flags by their slug or description. Case-insensitive. + in: query + required: false + schema: + description: Search flags by their slug or description. Case-insensitive. + type: string + maxLength: 256 + - name: tags + description: Filter flags by tag. Repeat the parameter for multiple tags (all must match). + in: query + required: false + schema: + description: Filter flags by tag. Repeat the parameter for multiple tags (all must match). + type: array + items: + type: string + - name: createdBy + description: Filter flags by the id of the entity that created them (a user or team id). + in: query + required: false + schema: + description: Filter flags by the id of the entity that created them (a user or team id). + type: string + maxLength: 256 + - name: maintainerIds + description: Filter flags by maintainer user id. Repeat the parameter for multiple maintainers (any may match). + in: query + required: false + schema: + description: Filter flags by maintainer user id. Repeat the parameter for multiple maintainers (any may match). + type: array + items: + type: string + maxLength: 24 + maxItems: 25 + - name: includeMarketplaceFlags + description: Whether to include Marketplace experimentation items in the paginated response. Defaults to false. + in: query + required: false + schema: + description: Whether to include Marketplace experimentation items in the paginated response. Defaults to false. + type: boolean + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + /v1/projects/{project_id_or_name}/feature-flags/flags: + get: + description: Retrieve feature flags for a project. The list can be filtered by state and supports pagination. + operationId: listFlags + security: + - bearerToken: [] + summary: List flags + tags: + - feature-flags + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + data: + items: + $ref: '#/components/schemas/Flag' + type: array + pagination: + properties: + next: + nullable: true + type: string + required: + - next + type: object + required: + - data + - pagination + type: object + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '402': + description: The account is missing a payment so payment method must be updated + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + parameters: + - name: project_id_or_name + description: The project id or name + in: path + required: true + schema: + description: The project id or name + type: string + - name: state + description: The state of the flags to retrieve. Defaults to `active`. + in: query + required: false + schema: + type: string + enum: + - active + - archived + description: The state of the flags to retrieve. Defaults to `active`. + - name: withMetadata + description: Deprecated. Whether to include creator metadata in each flag in the response. Resolve creator identity client-side (e.g. via the team members endpoint) instead; this parameter will be removed in a future release. Use `GET /v1/projects/:id/feature-flags/flags/:flagIdOrSlug?withMetadata=true` for single-flag lookups that need creator metadata. + in: query + required: false + schema: + description: Deprecated. Whether to include creator metadata in each flag in the response. Resolve creator identity client-side (e.g. via the team members endpoint) instead; this parameter will be removed in a future release. Use `GET /v1/projects/:id/feature-flags/flags/:flagIdOrSlug?withMetadata=true` for single-flag lookups that need creator metadata. + type: boolean + deprecated: true + - name: limit + description: Maximum number of flags to return. When not set, all flags are returned. + in: query + required: false + schema: + description: Maximum number of flags to return. When not set, all flags are returned. + type: integer + minimum: 1 + maximum: 100 + - name: cursor + description: Pagination cursor to continue from. + in: query + required: false + schema: + description: Pagination cursor to continue from. + type: string + - name: search + description: Search flags by their slug or description. Case-insensitive. + in: query + required: false + schema: + description: Search flags by their slug or description. Case-insensitive. + type: string + maxLength: 256 + - name: tags + description: Filter flags by tag. Repeat the parameter for multiple tags (all must match). + in: query + required: false + schema: + description: Filter flags by tag. Repeat the parameter for multiple tags (all must match). + type: array + items: + type: string + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + put: + description: Create a new feature flag for a project. The flag must have a unique slug within the project and specify its kind (boolean, string, number, or json). + operationId: createFlag + security: + - bearerToken: [] + summary: Create a flag + tags: + - feature-flags + responses: + '201': + description: '' + content: + application/json: + schema: + properties: + description: + type: string + variants: + items: + type: string + description: (opaque JSON object) + type: array + id: + type: string + environments: + additionalProperties: + properties: + reuse: + properties: + active: + type: boolean + enum: + - false + - true + environment: + type: string + required: + - active + - environment + type: object + targets: + additionalProperties: + additionalProperties: + additionalProperties: + items: + properties: + note: + type: string + value: + type: string + required: + - value + type: object + type: array + type: object + type: object + type: object + revision: + type: number + pausedOutcome: + properties: + type: + type: string + enum: + - variant + variantId: + type: string + required: + - type + - variantId + type: object + fallthrough: + oneOf: + - properties: + type: + type: string + enum: + - variant + variantId: + type: string + required: + - type + - variantId + type: object + - properties: + type: + type: string + enum: + - split + base: + properties: + type: + type: string + enum: + - entity + kind: + type: string + attribute: + type: string + required: + - attribute + - kind + - type + type: object + weights: + additionalProperties: + type: number + type: object + defaultVariantId: + type: string + required: + - base + - defaultVariantId + - type + - weights + type: object + - properties: + type: + type: string + enum: + - rollout + base: + properties: + type: + type: string + enum: + - entity + kind: + type: string + attribute: + type: string + required: + - attribute + - kind + - type + type: object + defaultVariantId: + type: string + startTimestamp: + type: number + rollFromVariantId: + type: string + rollToVariantId: + type: string + slots: + items: + properties: + promille: + type: number + durationMs: + type: number + required: + - durationMs + - promille + type: object + type: array + required: + - base + - defaultVariantId + - rollFromVariantId + - rollToVariantId + - slots + - startTimestamp + - type + type: object + - properties: + type: + type: string + enum: + - experiment + required: + - type + type: object + active: + type: boolean + enum: + - false + - true + rules: + items: + properties: + id: + type: string + outcome: + oneOf: + - properties: + type: + type: string + enum: + - variant + variantId: + type: string + required: + - type + - variantId + type: object + - properties: + type: + type: string + enum: + - split + base: + properties: + type: + type: string + enum: + - entity + kind: + type: string + attribute: + type: string + required: + - attribute + - kind + - type + type: object + weights: + additionalProperties: + type: number + type: object + defaultVariantId: + type: string + required: + - base + - defaultVariantId + - type + - weights + type: object + - properties: + type: + type: string + enum: + - rollout + base: + properties: + type: + type: string + enum: + - entity + kind: + type: string + attribute: + type: string + required: + - attribute + - kind + - type + type: object + defaultVariantId: + type: string + startTimestamp: + type: number + rollFromVariantId: + type: string + rollToVariantId: + type: string + slots: + items: + properties: + promille: + type: number + durationMs: + type: number + required: + - durationMs + - promille + type: object + type: array + required: + - base + - defaultVariantId + - rollFromVariantId + - rollToVariantId + - slots + - startTimestamp + - type + type: object + - properties: + type: + type: string + enum: + - experiment + required: + - type + type: object + conditions: + items: + properties: + rhs: + oneOf: + - type: string + - type: number + - properties: + type: + type: string + enum: + - list + - list/inline + items: + items: + oneOf: + - properties: + label: + type: string + note: + type: string + value: + type: number + required: + - value + type: object + - properties: + label: + type: string + note: + type: string + value: + type: string + required: + - value + type: object + type: array + required: + - items + - type + type: object + - properties: + type: + type: string + enum: + - regex + pattern: + type: string + flags: + type: string + required: + - flags + - pattern + - type + type: object + - type: boolean + enum: + - false + - true + cmpOptions: + properties: + ignoreCase: + type: boolean + enum: + - false + - true + type: object + lhs: + oneOf: + - properties: + type: + type: string + enum: + - segment + required: + - type + type: object + - properties: + type: + type: string + enum: + - entity + kind: + type: string + attribute: + type: string + required: + - attribute + - kind + - type + type: object + cmp: + type: string + enum: + - '!contains' + - '!endsWith' + - '!eq' + - '!ex' + - '!oneOf' + - '!regex' + - '!startsWith' + - after + - before + - contains + - containsAllOf + - containsAnyOf + - containsNoneOf + - endsWith + - eq + - ex + - gt + - gte + - lt + - lte + - oneOf + - regex + - startsWith + required: + - cmp + - lhs + type: object + type: array + required: + - conditions + - id + - outcome + type: object + type: array + required: + - active + - fallthrough + - pausedOutcome + - rules + type: object + type: object + kind: + type: string + enum: + - boolean + - json + - number + - string + revision: + type: number + seed: + type: number + state: + type: string + enum: + - active + - archived + maintainerIds: + items: + type: string + type: array + permanent: + type: boolean + enum: + - false + - true + tags: + items: + type: string + type: array + slug: + type: string + createdAt: + type: number + updatedAt: + type: number + updatedBy: + type: string + createdBy: + type: string + ownerId: + type: string + projectId: + type: string + typeName: + type: string + enum: + - flag + required: + - createdAt + - createdBy + - environments + - id + - kind + - ownerId + - projectId + - revision + - seed + - slug + - state + - typeName + - updatedAt + - variants + type: object + '400': + description: |- + One of the provided values in the request body is invalid. + One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '402': + description: The account is missing a payment so payment method must be updated + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '409': + description: '' + '410': + description: '' + parameters: + - name: project_id_or_name + description: The project id or name + in: path + required: true + schema: + description: The project id or name + type: string + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + requestBody: + content: + application/json: + schema: + type: object + additionalProperties: false + properties: + slug: + description: A unique (per project) key for the flag, composed of letters, numbers, dashes, and underscores + type: string + pattern: ^[a-zA-Z0-9_-]{1,512}$ + kind: + description: The kind of flag + enum: + - boolean + - string + - number + - json + variants: + type: array + description: The variants of the flag + items: + type: object + additionalProperties: false + properties: + id: + description: The id of the variant + type: string + label: + description: A label for the variant + type: string + description: + description: A description of the variant + type: string + value: + anyOf: + - type: string + - type: number + - type: boolean + - type: string + description: (opaque JSON object) + - type: array + items: {} + - type: string + required: + - id + - value + environments: + type: object + description: The configuration for the flag in different environments + additionalProperties: + type: object + additionalProperties: false + properties: + active: + type: boolean + reuse: + type: object + description: Allows linking this environment to another environment so this flag will be evaluated with the other flag's configuration + additionalProperties: false + required: + - active + - environment + properties: + active: + type: boolean + description: Whether the reuse is active or not + environment: + type: string + description: The environment to link to + targets: + type: object + description: Allows assigning targets to variants while bypassing the flag's rules + additionalProperties: + type: object + additionalProperties: + type: object + additionalProperties: + type: array + items: + type: object + additionalProperties: false + properties: + note: + type: string + value: + type: string + required: + - value + maxItems: 10000 + pausedOutcome: + type: object + additionalProperties: false + properties: + type: {} + variantId: + type: string + required: + - type + - variantId + rules: + type: array + items: + type: object + additionalProperties: false + properties: + id: + type: string + conditions: + type: array + items: + type: object + additionalProperties: false + properties: + lhs: + anyOf: + - type: object + additionalProperties: false + properties: + type: {} + required: + - type + - type: object + additionalProperties: false + properties: + type: {} + kind: + type: string + attribute: + type: string + required: + - type + - kind + - attribute + cmp: + type: string + enum: + - eq + - '!eq' + - oneOf + - '!oneOf' + - containsAllOf + - containsAnyOf + - containsNoneOf + - startsWith + - '!startsWith' + - endsWith + - '!endsWith' + - contains + - '!contains' + - ex + - '!ex' + - gt + - gte + - lt + - lte + - regex + - '!regex' + - before + - after + rhs: + anyOf: + - type: object + additionalProperties: false + properties: + type: + type: string + enum: + - list/inline + - list + items: + type: array + items: + anyOf: + - type: object + additionalProperties: false + properties: + label: + type: string + note: + type: string + value: + type: number + required: + - value + - type: object + additionalProperties: false + properties: + label: + type: string + note: + type: string + value: + type: string + required: + - value + maxItems: 10000 + required: + - type + - items + - type: object + additionalProperties: false + properties: + type: {} + pattern: + type: string + flags: + type: string + required: + - type + - pattern + - flags + - type: string + - type: number + - type: boolean + cmpOptions: + type: object + additionalProperties: false + properties: + ignoreCase: + type: boolean + required: + - lhs + - cmp + outcome: + anyOf: + - type: object + additionalProperties: false + properties: + type: {} + variantId: + type: string + required: + - type + - variantId + - type: object + additionalProperties: false + properties: + type: {} + base: + type: object + additionalProperties: false + properties: + type: {} + kind: + type: string + attribute: + type: string + required: + - type + - kind + - attribute + weights: + type: object + additionalProperties: + type: number + description: The distribution for each variant + defaultVariantId: + type: string + description: This variant will be used when the base attribute does not exist + required: + - type + - base + - weights + - defaultVariantId + - type: object + additionalProperties: false + properties: + type: {} + base: + type: object + additionalProperties: false + properties: + type: {} + kind: + type: string + attribute: + type: string + required: + - type + - kind + - attribute + startTimestamp: + type: number + description: Epoch ms when the rollout begins + rollFromVariantId: + type: string + description: The variant to roll away from + rollToVariantId: + type: string + description: The variant to roll towards + defaultVariantId: + type: string + description: This variant will be used when the base attribute does not exist + slots: + type: array + description: 'Each slot defines a promille and how long it is served for. After all slots expire, 100% is served indefinitely. The final implicit 100% slot does not need to be listed. Example: [[5_000, 21_600_000], [10_000, 28_800_000]] means 5‰ for 6h, then 10‰ for 8h, then 100% indefinitely.' + items: + type: object + additionalProperties: false + properties: + promille: + type: number + minimum: 0 + maximum: 100000 + description: Promille of traffic for rollToVariant (0-100_000, where 1_000 = 1%) + durationMs: + type: number + minimum: 0 + description: How long this promille is served in ms before moving to the next slot. + required: + - promille + - durationMs + minItems: 1 + required: + - type + - base + - startTimestamp + - rollFromVariantId + - rollToVariantId + - defaultVariantId + - slots + required: + - id + - conditions + - outcome + maxItems: 10000 + fallthrough: + anyOf: + - type: object + additionalProperties: false + properties: + type: {} + variantId: + type: string + required: + - type + - variantId + - type: object + additionalProperties: false + properties: + type: {} + base: + type: object + additionalProperties: false + properties: + type: {} + kind: + type: string + attribute: + type: string + required: + - type + - kind + - attribute + weights: + type: object + additionalProperties: + type: number + description: The distribution for each variant + defaultVariantId: + type: string + description: This variant will be used when the base attribute does not exist + required: + - type + - base + - weights + - defaultVariantId + - type: object + additionalProperties: false + properties: + type: {} + base: + type: object + additionalProperties: false + properties: + type: {} + kind: + type: string + attribute: + type: string + required: + - type + - kind + - attribute + startTimestamp: + type: number + description: Epoch ms when the rollout begins + rollFromVariantId: + type: string + description: The variant to roll away from + rollToVariantId: + type: string + description: The variant to roll towards + defaultVariantId: + type: string + description: This variant will be used when the base attribute does not exist + slots: + type: array + description: 'Each slot defines a promille and how long it is served for. After all slots expire, 100% is served indefinitely. The final implicit 100% slot does not need to be listed. Example: [[5_000, 21_600_000], [10_000, 28_800_000]] means 5‰ for 6h, then 10‰ for 8h, then 100% indefinitely.' + items: + type: object + additionalProperties: false + properties: + promille: + type: number + minimum: 0 + maximum: 100000 + description: Promille of traffic for rollToVariant (0-100_000, where 1_000 = 1%) + durationMs: + type: number + minimum: 0 + description: How long this promille is served in ms before moving to the next slot. + required: + - promille + - durationMs + minItems: 1 + required: + - type + - base + - startTimestamp + - rollFromVariantId + - rollToVariantId + - defaultVariantId + - slots + revision: + type: number + description: The revision of the environment config + required: + - active + - pausedOutcome + - rules + - fallthrough + maxProperties: 10 + seed: + type: number + minimum: 0 + maximum: 100000 + description: A random seed to prevent split points in different flags from having the same targets + description: + description: A description of the flag + type: string + state: + type: string + enum: + - active + - archived + maintainerIds: + description: The user ids of the maintainers of the flag + type: array + items: + type: string + maxLength: 24 + maxItems: 5 + permanent: + description: Whether this flag is marked as permanent, indicating it should not be removed + type: boolean + tags: + description: Tags for categorizing the flag + type: array + items: + type: string + maxLength: 64 + maxItems: 20 + uniqueItems: true + required: + - slug + - kind + - environments + /v1/projects/{project_id_or_name}/feature-flags/flags/{flag_id_or_slug}: + get: + description: Retrieve a specific feature flag by its ID or slug. + operationId: getFlag + security: + - bearerToken: [] + summary: Get a flag + tags: + - feature-flags + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/Flag' + '304': + description: '' + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '402': + description: The account is missing a payment so payment method must be updated + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + parameters: + - name: project_id_or_name + description: The project id or name + in: path + required: true + schema: + description: The project id or name + type: string + - name: flag_id_or_slug + description: The flag id or name + in: path + required: true + schema: + description: The flag id or name + type: string + - name: ifMatch + description: Etag to match, can be used interchangeably with the `if-match` header + in: query + required: false + schema: + description: Etag to match, can be used interchangeably with the `if-match` header + type: string + - name: withMetadata + description: Whether to include metadata in the response + in: query + required: false + schema: + description: Whether to include metadata in the response + type: boolean + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + patch: + description: Update an existing feature flag. This endpoint supports partial updates, allowing you to modify specific properties like variants, environments, or state without providing the full flag configuration. + operationId: updateFlag + security: + - bearerToken: [] + summary: Update a flag + tags: + - feature-flags + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + description: + type: string + variants: + items: + type: string + description: (opaque JSON object) + type: array + id: + type: string + environments: + additionalProperties: + properties: + reuse: + properties: + active: + type: boolean + enum: + - false + - true + environment: + type: string + required: + - active + - environment + type: object + targets: + additionalProperties: + additionalProperties: + additionalProperties: + items: + properties: + note: + type: string + value: + type: string + required: + - value + type: object + type: array + type: object + type: object + type: object + revision: + type: number + pausedOutcome: + properties: + type: + type: string + enum: + - variant + variantId: + type: string + required: + - type + - variantId + type: object + fallthrough: + oneOf: + - properties: + type: + type: string + enum: + - variant + variantId: + type: string + required: + - type + - variantId + type: object + - properties: + type: + type: string + enum: + - split + base: + properties: + type: + type: string + enum: + - entity + kind: + type: string + attribute: + type: string + required: + - attribute + - kind + - type + type: object + weights: + additionalProperties: + type: number + type: object + defaultVariantId: + type: string + required: + - base + - defaultVariantId + - type + - weights + type: object + - properties: + type: + type: string + enum: + - rollout + base: + properties: + type: + type: string + enum: + - entity + kind: + type: string + attribute: + type: string + required: + - attribute + - kind + - type + type: object + defaultVariantId: + type: string + startTimestamp: + type: number + rollFromVariantId: + type: string + rollToVariantId: + type: string + slots: + items: + properties: + promille: + type: number + durationMs: + type: number + required: + - durationMs + - promille + type: object + type: array + required: + - base + - defaultVariantId + - rollFromVariantId + - rollToVariantId + - slots + - startTimestamp + - type + type: object + - properties: + type: + type: string + enum: + - experiment + required: + - type + type: object + active: + type: boolean + enum: + - false + - true + rules: + items: + properties: + id: + type: string + outcome: + oneOf: + - properties: + type: + type: string + enum: + - variant + variantId: + type: string + required: + - type + - variantId + type: object + - properties: + type: + type: string + enum: + - split + base: + properties: + type: + type: string + enum: + - entity + kind: + type: string + attribute: + type: string + required: + - attribute + - kind + - type + type: object + weights: + additionalProperties: + type: number + type: object + defaultVariantId: + type: string + required: + - base + - defaultVariantId + - type + - weights + type: object + - properties: + type: + type: string + enum: + - rollout + base: + properties: + type: + type: string + enum: + - entity + kind: + type: string + attribute: + type: string + required: + - attribute + - kind + - type + type: object + defaultVariantId: + type: string + startTimestamp: + type: number + rollFromVariantId: + type: string + rollToVariantId: + type: string + slots: + items: + properties: + promille: + type: number + durationMs: + type: number + required: + - durationMs + - promille + type: object + type: array + required: + - base + - defaultVariantId + - rollFromVariantId + - rollToVariantId + - slots + - startTimestamp + - type + type: object + - properties: + type: + type: string + enum: + - experiment + required: + - type + type: object + conditions: + items: + properties: + rhs: + oneOf: + - type: string + - type: number + - properties: + type: + type: string + enum: + - list + - list/inline + items: + items: + oneOf: + - properties: + label: + type: string + note: + type: string + value: + type: number + required: + - value + type: object + - properties: + label: + type: string + note: + type: string + value: + type: string + required: + - value + type: object + type: array + required: + - items + - type + type: object + - properties: + type: + type: string + enum: + - regex + pattern: + type: string + flags: + type: string + required: + - flags + - pattern + - type + type: object + - type: boolean + enum: + - false + - true + cmpOptions: + properties: + ignoreCase: + type: boolean + enum: + - false + - true + type: object + lhs: + oneOf: + - properties: + type: + type: string + enum: + - segment + required: + - type + type: object + - properties: + type: + type: string + enum: + - entity + kind: + type: string + attribute: + type: string + required: + - attribute + - kind + - type + type: object + cmp: + type: string + enum: + - '!contains' + - '!endsWith' + - '!eq' + - '!ex' + - '!oneOf' + - '!regex' + - '!startsWith' + - after + - before + - contains + - containsAllOf + - containsAnyOf + - containsNoneOf + - endsWith + - eq + - ex + - gt + - gte + - lt + - lte + - oneOf + - regex + - startsWith + required: + - cmp + - lhs + type: object + type: array + required: + - conditions + - id + - outcome + type: object + type: array + required: + - active + - fallthrough + - pausedOutcome + - rules + type: object + type: object + kind: + type: string + enum: + - boolean + - json + - number + - string + revision: + type: number + seed: + type: number + state: + type: string + enum: + - active + - archived + maintainerIds: + items: + type: string + type: array + permanent: + type: boolean + enum: + - false + - true + tags: + items: + type: string + type: array + slug: + type: string + createdAt: + type: number + updatedAt: + type: number + updatedBy: + type: string + createdBy: + type: string + ownerId: + type: string + projectId: + type: string + typeName: + type: string + enum: + - flag + metadata: + properties: + creator: + properties: + id: + type: string + name: + type: string + required: + - id + - name + type: object + type: object + required: + - createdAt + - createdBy + - environments + - id + - kind + - ownerId + - projectId + - revision + - seed + - slug + - state + - typeName + - updatedAt + - variants + type: object + '304': + description: '' + '400': + description: |- + One of the provided values in the request body is invalid. + One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '402': + description: The account is missing a payment so payment method must be updated + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '409': + description: '' + '410': + description: '' + parameters: + - name: project_id_or_name + description: The project id or name + in: path + required: true + schema: + description: The project id or name + type: string + - name: flag_id_or_slug + description: The flag id or name + in: path + required: true + schema: + description: The flag id or name + type: string + - name: ifMatch + description: Etag to match, can be used interchangeably with the `if-match` header + in: query + required: false + schema: + description: Etag to match, can be used interchangeably with the `if-match` header + type: string + - name: withMetadata + description: Whether to include metadata in the response + in: query + required: false + schema: + description: Whether to include metadata in the response + type: boolean + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + requestBody: + content: + application/json: + schema: + type: object + additionalProperties: false + properties: + createdBy: + description: The user who created this patch + type: string + message: + description: Additional message for this version + type: string + variants: + type: array + description: The variants of the flag + items: + type: object + additionalProperties: false + properties: + id: + description: The id of the variant + type: string + label: + description: A label for the variant + type: string + description: + description: A description of the variant + type: string + value: + anyOf: + - type: string + - type: number + - type: boolean + - type: string + description: (opaque JSON object) + - type: array + items: {} + - type: string + required: + - id + - value + environments: + type: object + description: The configuration for the flag in different environments + additionalProperties: + type: object + additionalProperties: false + properties: + active: + type: boolean + reuse: + type: object + description: Allows linking this environment to another environment so this flag will be evaluated with the other flag's configuration + additionalProperties: false + required: + - active + - environment + properties: + active: + type: boolean + description: Whether the reuse is active or not + environment: + type: string + description: The environment to link to + targets: + type: object + description: Allows assigning targets to variants while bypassing the flag's rules + additionalProperties: + type: object + additionalProperties: + type: object + additionalProperties: + type: array + items: + type: object + additionalProperties: false + properties: + note: + type: string + value: + type: string + required: + - value + maxItems: 10000 + pausedOutcome: + type: object + additionalProperties: false + properties: + type: {} + variantId: + type: string + required: + - type + - variantId + rules: + type: array + items: + type: object + additionalProperties: false + properties: + id: + type: string + conditions: + type: array + items: + type: object + additionalProperties: false + properties: + lhs: + anyOf: + - type: object + additionalProperties: false + properties: + type: {} + required: + - type + - type: object + additionalProperties: false + properties: + type: {} + kind: + type: string + attribute: + type: string + required: + - type + - kind + - attribute + cmp: + type: string + enum: + - eq + - '!eq' + - oneOf + - '!oneOf' + - containsAllOf + - containsAnyOf + - containsNoneOf + - startsWith + - '!startsWith' + - endsWith + - '!endsWith' + - contains + - '!contains' + - ex + - '!ex' + - gt + - gte + - lt + - lte + - regex + - '!regex' + - before + - after + rhs: + anyOf: + - type: object + additionalProperties: false + properties: + type: + type: string + enum: + - list/inline + - list + items: + type: array + items: + anyOf: + - type: object + additionalProperties: false + properties: + label: + type: string + note: + type: string + value: + type: number + required: + - value + - type: object + additionalProperties: false + properties: + label: + type: string + note: + type: string + value: + type: string + required: + - value + maxItems: 10000 + required: + - type + - items + - type: object + additionalProperties: false + properties: + type: {} + pattern: + type: string + flags: + type: string + required: + - type + - pattern + - flags + - type: string + - type: number + - type: boolean + cmpOptions: + type: object + additionalProperties: false + properties: + ignoreCase: + type: boolean + required: + - lhs + - cmp + outcome: + anyOf: + - type: object + additionalProperties: false + properties: + type: {} + variantId: + type: string + required: + - type + - variantId + - type: object + additionalProperties: false + properties: + type: {} + base: + type: object + additionalProperties: false + properties: + type: {} + kind: + type: string + attribute: + type: string + required: + - type + - kind + - attribute + weights: + type: object + additionalProperties: + type: number + description: The distribution for each variant + defaultVariantId: + type: string + description: This variant will be used when the base attribute does not exist + required: + - type + - base + - weights + - defaultVariantId + - type: object + additionalProperties: false + properties: + type: {} + base: + type: object + additionalProperties: false + properties: + type: {} + kind: + type: string + attribute: + type: string + required: + - type + - kind + - attribute + startTimestamp: + type: number + description: Epoch ms when the rollout begins + rollFromVariantId: + type: string + description: The variant to roll away from + rollToVariantId: + type: string + description: The variant to roll towards + defaultVariantId: + type: string + description: This variant will be used when the base attribute does not exist + slots: + type: array + description: 'Each slot defines a promille and how long it is served for. After all slots expire, 100% is served indefinitely. The final implicit 100% slot does not need to be listed. Example: [[5_000, 21_600_000], [10_000, 28_800_000]] means 5‰ for 6h, then 10‰ for 8h, then 100% indefinitely.' + items: + type: object + additionalProperties: false + properties: + promille: + type: number + minimum: 0 + maximum: 100000 + description: Promille of traffic for rollToVariant (0-100_000, where 1_000 = 1%) + durationMs: + type: number + minimum: 0 + description: How long this promille is served in ms before moving to the next slot. + required: + - promille + - durationMs + minItems: 1 + required: + - type + - base + - startTimestamp + - rollFromVariantId + - rollToVariantId + - defaultVariantId + - slots + required: + - id + - conditions + - outcome + maxItems: 10000 + fallthrough: + anyOf: + - type: object + additionalProperties: false + properties: + type: {} + variantId: + type: string + required: + - type + - variantId + - type: object + additionalProperties: false + properties: + type: {} + base: + type: object + additionalProperties: false + properties: + type: {} + kind: + type: string + attribute: + type: string + required: + - type + - kind + - attribute + weights: + type: object + additionalProperties: + type: number + description: The distribution for each variant + defaultVariantId: + type: string + description: This variant will be used when the base attribute does not exist + required: + - type + - base + - weights + - defaultVariantId + - type: object + additionalProperties: false + properties: + type: {} + base: + type: object + additionalProperties: false + properties: + type: {} + kind: + type: string + attribute: + type: string + required: + - type + - kind + - attribute + startTimestamp: + type: number + description: Epoch ms when the rollout begins + rollFromVariantId: + type: string + description: The variant to roll away from + rollToVariantId: + type: string + description: The variant to roll towards + defaultVariantId: + type: string + description: This variant will be used when the base attribute does not exist + slots: + type: array + description: 'Each slot defines a promille and how long it is served for. After all slots expire, 100% is served indefinitely. The final implicit 100% slot does not need to be listed. Example: [[5_000, 21_600_000], [10_000, 28_800_000]] means 5‰ for 6h, then 10‰ for 8h, then 100% indefinitely.' + items: + type: object + additionalProperties: false + properties: + promille: + type: number + minimum: 0 + maximum: 100000 + description: Promille of traffic for rollToVariant (0-100_000, where 1_000 = 1%) + durationMs: + type: number + minimum: 0 + description: How long this promille is served in ms before moving to the next slot. + required: + - promille + - durationMs + minItems: 1 + required: + - type + - base + - startTimestamp + - rollFromVariantId + - rollToVariantId + - defaultVariantId + - slots + revision: + type: number + description: The revision of the environment config + required: + - active + - pausedOutcome + - rules + - fallthrough + maxProperties: 10 + seed: + type: number + minimum: 0 + maximum: 100000 + description: A random seed to prevent split points in different flags from having the same targets + description: + description: A description of the flag + type: string + state: + type: string + enum: + - active + - archived + maintainerIds: + description: The user ids of the maintainers of the flag + type: array + items: + type: string + maxLength: 24 + maxItems: 5 + permanent: + description: Whether this flag is marked as permanent, indicating it should not be removed + type: boolean + tags: + description: Tags for categorizing the flag + type: array + items: + type: string + maxLength: 64 + maxItems: 20 + uniqueItems: true + delete: + description: Permanently delete a feature flag from the project. This action cannot be undone. Consider archiving the flag instead if you may need it in the future. + operationId: deleteFlag + security: + - bearerToken: [] + summary: Delete a flag + tags: + - feature-flags + responses: + '204': + description: '' + '304': + description: '' + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '402': + description: The account is missing a payment so payment method must be updated + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '409': + description: '' + '410': + description: '' + parameters: + - name: project_id_or_name + description: The project id or name + in: path + required: true + schema: + description: The project id or name + type: string + - name: flag_id_or_slug + description: The flag id or name + in: path + required: true + schema: + description: The flag id or name + type: string + - name: ifMatch + description: Etag to match, can be used interchangeably with the `if-match` header + in: query + required: false + schema: + description: Etag to match, can be used interchangeably with the `if-match` header + type: string + - name: withMetadata + description: Whether to include metadata in the response + in: query + required: false + schema: + description: Whether to include metadata in the response + type: boolean + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + /v1/projects/{project_id_or_name}/feature-flags/flags/{flag_id_or_slug}/versions: + get: + description: Lists flag versions for a given flag. + operationId: listFlagVersions + security: + - bearerToken: [] + summary: List flag versions + tags: + - feature-flags + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + versions: + items: + properties: + id: + type: string + revision: + type: number + createdAt: + type: number + createdBy: + type: string + message: + type: string + flagId: + type: string + changedEnvironments: + items: + type: string + type: array + data: + properties: + description: + type: string + variants: + items: + type: string + description: (opaque JSON object) + type: array + environments: + additionalProperties: + properties: + reuse: + properties: + active: + type: boolean + enum: + - false + - true + environment: + type: string + required: + - active + - environment + type: object + targets: + additionalProperties: + additionalProperties: + additionalProperties: + items: + properties: + note: + type: string + value: + type: string + required: + - value + type: object + type: array + type: object + type: object + type: object + revision: + type: number + pausedOutcome: + properties: + type: + type: string + enum: + - variant + variantId: + type: string + required: + - type + - variantId + type: object + fallthrough: + oneOf: + - properties: + type: + type: string + enum: + - variant + variantId: + type: string + required: + - type + - variantId + type: object + - properties: + type: + type: string + enum: + - split + base: + properties: + type: + type: string + enum: + - entity + kind: + type: string + attribute: + type: string + required: + - attribute + - kind + - type + type: object + weights: + additionalProperties: + type: number + type: object + defaultVariantId: + type: string + required: + - base + - defaultVariantId + - type + - weights + type: object + - properties: + type: + type: string + enum: + - rollout + base: + properties: + type: + type: string + enum: + - entity + kind: + type: string + attribute: + type: string + required: + - attribute + - kind + - type + type: object + defaultVariantId: + type: string + startTimestamp: + type: number + rollFromVariantId: + type: string + rollToVariantId: + type: string + slots: + items: + properties: + promille: + type: number + durationMs: + type: number + required: + - durationMs + - promille + type: object + type: array + required: + - base + - defaultVariantId + - rollFromVariantId + - rollToVariantId + - slots + - startTimestamp + - type + type: object + - properties: + type: + type: string + enum: + - experiment + required: + - type + type: object + active: + type: boolean + enum: + - false + - true + rules: + items: + properties: + id: + type: string + outcome: + oneOf: + - properties: + type: + type: string + enum: + - variant + variantId: + type: string + required: + - type + - variantId + type: object + - properties: + type: + type: string + enum: + - split + base: + properties: + type: + type: string + enum: + - entity + kind: + type: string + attribute: + type: string + required: + - attribute + - kind + - type + type: object + weights: + additionalProperties: + type: number + type: object + defaultVariantId: + type: string + required: + - base + - defaultVariantId + - type + - weights + type: object + - properties: + type: + type: string + enum: + - rollout + base: + properties: + type: + type: string + enum: + - entity + kind: + type: string + attribute: + type: string + required: + - attribute + - kind + - type + type: object + defaultVariantId: + type: string + startTimestamp: + type: number + rollFromVariantId: + type: string + rollToVariantId: + type: string + slots: + items: + properties: + promille: + type: number + durationMs: + type: number + required: + - durationMs + - promille + type: object + type: array + required: + - base + - defaultVariantId + - rollFromVariantId + - rollToVariantId + - slots + - startTimestamp + - type + type: object + - properties: + type: + type: string + enum: + - experiment + required: + - type + type: object + conditions: + items: + properties: + rhs: + oneOf: + - type: string + - type: number + - properties: + type: + type: string + enum: + - list + - list/inline + items: + items: + oneOf: + - properties: + label: + type: string + note: + type: string + value: + type: number + required: + - value + type: object + - properties: + label: + type: string + note: + type: string + value: + type: string + required: + - value + type: object + type: array + required: + - items + - type + type: object + - properties: + type: + type: string + enum: + - regex + pattern: + type: string + flags: + type: string + required: + - flags + - pattern + - type + type: object + - type: boolean + enum: + - false + - true + cmpOptions: + properties: + ignoreCase: + type: boolean + enum: + - false + - true + type: object + lhs: + oneOf: + - properties: + type: + type: string + enum: + - segment + required: + - type + type: object + - properties: + type: + type: string + enum: + - entity + kind: + type: string + attribute: + type: string + required: + - attribute + - kind + - type + type: object + cmp: + type: string + enum: + - '!contains' + - '!endsWith' + - '!eq' + - '!ex' + - '!oneOf' + - '!regex' + - '!startsWith' + - after + - before + - contains + - containsAllOf + - containsAnyOf + - containsNoneOf + - endsWith + - eq + - ex + - gt + - gte + - lt + - lte + - oneOf + - regex + - startsWith + required: + - cmp + - lhs + type: object + type: array + required: + - conditions + - id + - outcome + type: object + type: array + required: + - active + - fallthrough + - pausedOutcome + - rules + type: object + type: object + seed: + type: number + state: + type: string + enum: + - active + - archived + maintainerIds: + items: + type: string + type: array + permanent: + type: boolean + enum: + - false + - true + tags: + items: + type: string + type: array + required: + - environments + - seed + - state + - variants + type: object + metadata: + properties: + creator: + properties: + id: + type: string + name: + type: string + required: + - id + - name + type: object + type: object + required: + - changedEnvironments + - createdAt + - data + - flagId + - id + - revision + type: object + type: array + pagination: + type: string + description: (opaque JSON object) + required: + - pagination + - versions + type: object + '304': + description: '' + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '402': + description: The account is missing a payment so payment method must be updated + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + parameters: + - name: project_id_or_name + in: path + required: true + schema: + type: string + - name: flag_id_or_slug + in: path + required: true + schema: + type: string + - name: limit + in: query + required: false + schema: + type: number + minimum: 1 + maximum: 100 + default: 20 + - name: cursor + description: Pagination cursor + in: query + required: false + schema: + type: string + description: Pagination cursor + - name: environment + description: Environment to filter by + in: query + required: false + schema: + type: string + description: Environment to filter by + - name: withMetadata + description: Whether to include metadata + in: query + required: false + schema: + type: boolean + description: Whether to include metadata + default: false + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + /v1/projects/{project_id_or_name}/feature-flags/settings: + get: + description: Retrieve feature flag settings for a project. + operationId: getFlagSettings + security: + - bearerToken: [] + summary: Get project flag settings + tags: + - feature-flags + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + typeName: + type: string + enum: + - settings + projectId: + type: string + ownerId: + type: string + enabled: + type: boolean + enum: + - false + - true + environments: + items: + type: string + type: array + entities: + items: + properties: + kind: + type: string + label: + type: string + attributes: + items: + properties: + key: + type: string + type: + type: string + labels: + items: + properties: + label: + type: string + value: + type: string + required: + - label + - value + type: object + type: array + required: + - key + - type + type: object + type: array + required: + - attributes + - kind + - label + type: object + type: array + createdAt: + type: number + updatedAt: + type: number + metadata: + properties: + activeFlagCount: + type: number + archivedFlagCount: + type: number + segmentCount: + type: number + packSizeInBytes: + type: number + packRevision: + type: number + configUpdatedAt: + type: number + required: + - activeFlagCount + - archivedFlagCount + - packSizeInBytes + - segmentCount + type: object + required: + - enabled + - entities + - environments + - metadata + - projectId + - typeName + type: object + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '402': + description: The account is missing a payment so payment method must be updated + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + parameters: + - name: project_id_or_name + description: The project id or name + in: path + required: true + schema: + description: The project id or name + type: string + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + patch: + description: Update feature flag settings for a project. + operationId: updateFlagSettings + security: + - bearerToken: [] + summary: Update project flag settings + tags: + - feature-flags + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + typeName: + type: string + enum: + - settings + projectId: + type: string + ownerId: + type: string + enabled: + type: boolean + enum: + - false + - true + environments: + items: + type: string + type: array + entities: + items: + properties: + kind: + type: string + label: + type: string + attributes: + items: + properties: + key: + type: string + type: + type: string + labels: + items: + properties: + label: + type: string + value: + type: string + required: + - label + - value + type: object + type: array + required: + - key + - type + type: object + type: array + required: + - attributes + - kind + - label + type: object + type: array + createdAt: + type: number + updatedAt: + type: number + metadata: + properties: + activeFlagCount: + type: number + archivedFlagCount: + type: number + segmentCount: + type: number + packSizeInBytes: + type: number + packRevision: + type: number + configUpdatedAt: + type: number + required: + - activeFlagCount + - archivedFlagCount + - packSizeInBytes + - segmentCount + type: object + required: + - enabled + - entities + - environments + - metadata + - projectId + - typeName + type: object + '201': + description: '' + content: + application/json: + schema: + properties: + typeName: + type: string + enum: + - settings + projectId: + type: string + ownerId: + type: string + enabled: + type: boolean + enum: + - false + - true + environments: + items: + type: string + type: array + entities: + items: + properties: + kind: + type: string + label: + type: string + attributes: + items: + properties: + key: + type: string + type: + type: string + labels: + items: + properties: + label: + type: string + value: + type: string + required: + - label + - value + type: object + type: array + required: + - key + - type + type: object + type: array + required: + - attributes + - kind + - label + type: object + type: array + createdAt: + type: number + updatedAt: + type: number + metadata: + properties: + activeFlagCount: + type: number + archivedFlagCount: + type: number + segmentCount: + type: number + packSizeInBytes: + type: number + packRevision: + type: number + configUpdatedAt: + type: number + required: + - activeFlagCount + - archivedFlagCount + - packSizeInBytes + - segmentCount + type: object + required: + - enabled + - entities + - environments + - metadata + - projectId + - typeName + type: object + '400': + description: |- + One of the provided values in the request body is invalid. + One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '402': + description: The account is missing a payment so payment method must be updated + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '409': + description: '' + '410': + description: '' + parameters: + - name: project_id_or_name + description: The project id or name + in: path + required: true + schema: + description: The project id or name + type: string + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + requestBody: + content: + application/json: + schema: + type: object + additionalProperties: false + properties: + enabled: + type: boolean + entities: + type: array + maxItems: 32 + items: + type: object + additionalProperties: false + required: + - kind + - label + - attributes + properties: + kind: + type: string + maxLength: 128 + label: + type: string + maxLength: 128 + attributes: + type: array + maxItems: 32 + items: + type: object + additionalProperties: false + required: + - key + - type + properties: + key: + type: string + maxLength: 128 + type: + type: string + maxLength: 128 + labels: + type: array + maxItems: 256 + items: + type: object + additionalProperties: false + required: + - label + - value + properties: + label: + type: string + maxLength: 128 + value: + type: string + maxLength: 128 + environments: + description: The environments to sync + type: array + items: + type: string + /v1/teams/{team_id}/feature-flags/settings: + get: + description: Retrieve feature flag settings for projects in a team. + operationId: listTeamFlagSettings + security: + - bearerToken: [] + summary: List team project flag settings + tags: + - feature-flags + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + data: + items: + properties: + typeName: + type: string + enum: + - settings + projectId: + type: string + ownerId: + type: string + enabled: + type: boolean + enum: + - false + - true + environments: + items: + type: string + type: array + entities: + items: + properties: + kind: + type: string + label: + type: string + attributes: + items: + properties: + key: + type: string + type: + type: string + labels: + items: + properties: + label: + type: string + value: + type: string + required: + - label + - value + type: object + type: array + required: + - key + - type + type: object + type: array + required: + - attributes + - kind + - label + type: object + type: array + createdAt: + type: number + updatedAt: + type: number + metadata: + properties: + activeFlagCount: + type: number + archivedFlagCount: + type: number + segmentCount: + type: number + packSizeInBytes: + type: number + packRevision: + type: number + configUpdatedAt: + type: number + required: + - activeFlagCount + - archivedFlagCount + - packSizeInBytes + - segmentCount + type: object + required: + - enabled + - entities + - environments + - metadata + - projectId + - typeName + type: object + type: array + pagination: + properties: + next: + nullable: true + type: string + required: + - next + type: object + required: + - data + - pagination + type: object + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '410': + description: '' + parameters: + - name: limit + description: Maximum number of settings to return. + in: query + required: false + schema: + description: Maximum number of settings to return. + type: integer + minimum: 1 + maximum: 100 + default: 20 + - name: cursor + description: Pagination cursor to continue from. + in: query + required: false + schema: + description: Pagination cursor to continue from. + type: string + - description: The Team identifier to perform the request on behalf of. + in: path + name: team_id + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + required: true + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + /v2/teams/{team_id}/feature-flags/flags: + get: + description: Retrieve all feature flags for a team across all projects. Returns an opaque cursor for pagination. + operationId: listTeamFlagsV2 + security: + - bearerToken: [] + summary: List all flags for a team + tags: + - feature-flags + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + pagination: + properties: + next: + nullable: true + type: string + required: + - next + type: object + data: + items: + oneOf: + - $ref: '#/components/schemas/Flag' + - $ref: '#/components/schemas/MarketplaceFlag' + type: array + required: + - data + - pagination + type: object + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '410': + description: '' + parameters: + - name: state + description: The state of the flags to retrieve. Defaults to `active`. + in: query + required: false + schema: + type: string + enum: + - active + - archived + description: The state of the flags to retrieve. Defaults to `active`. + - name: limit + description: Maximum number of flags to return. + in: query + required: false + schema: + description: Maximum number of flags to return. + type: integer + minimum: 1 + maximum: 100 + default: 25 + - name: cursor + description: Pagination cursor to continue from. + in: query + required: false + schema: + description: Pagination cursor to continue from. + type: string + - name: search + description: Search flags by their slug or description. Case-insensitive. + in: query + required: false + schema: + description: Search flags by their slug or description. Case-insensitive. + type: string + maxLength: 256 + - name: kind + description: The kind of flags to retrieve. + in: query + required: false + schema: + description: The kind of flags to retrieve. + type: string + enum: + - boolean + - string + - number + - json + - name: tags + description: Filter flags by tag. Repeat the parameter for multiple tags (all must match). + in: query + required: false + schema: + description: Filter flags by tag. Repeat the parameter for multiple tags (all must match). + type: array + items: + type: string + - name: createdBy + description: Filter flags by the id of the entity that created them (a user or team id). + in: query + required: false + schema: + description: Filter flags by the id of the entity that created them (a user or team id). + type: string + maxLength: 256 + - name: maintainerIds + description: Filter flags by maintainer user id. Repeat the parameter for multiple maintainers (any may match). + in: query + required: false + schema: + description: Filter flags by maintainer user id. Repeat the parameter for multiple maintainers (any may match). + type: array + items: + type: string + maxLength: 24 + maxItems: 25 + - name: includeMarketplaceFlags + description: Whether to include Marketplace experimentation items in the paginated response. Defaults to false. + in: query + required: false + schema: + description: Whether to include Marketplace experimentation items in the paginated response. Defaults to false. + type: boolean + - description: The Team identifier to perform the request on behalf of. + in: path + name: team_id + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + required: true + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + /v1/teams/{team_id}/feature-flags/flags: + get: + description: Retrieve all feature flags for a team across all projects. The list can be filtered by state and supports pagination. + operationId: listTeamFlags + security: + - bearerToken: [] + summary: List all flags for a team + tags: + - feature-flags + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + data: + items: + $ref: '#/components/schemas/Flag' + type: array + pagination: + properties: + next: + nullable: true + type: string + required: + - next + type: object + required: + - data + - pagination + type: object + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '410': + description: '' + parameters: + - name: state + description: The state of the flags to retrieve. Defaults to `active`. + in: query + required: false + schema: + type: string + enum: + - active + - archived + description: The state of the flags to retrieve. Defaults to `active`. + - name: withMetadata + description: Deprecated. Whether to include creator metadata in each flag in the response. Resolve creator identity client-side (e.g. via the team members endpoint) instead; this parameter will be removed in a future release. + in: query + required: false + schema: + description: Deprecated. Whether to include creator metadata in each flag in the response. Resolve creator identity client-side (e.g. via the team members endpoint) instead; this parameter will be removed in a future release. + type: boolean + deprecated: true + - name: limit + description: Maximum number of flags to return. + in: query + required: false + schema: + description: Maximum number of flags to return. + type: integer + minimum: 1 + maximum: 100 + default: 20 + - name: cursor + description: Pagination cursor to continue from. + in: query + required: false + schema: + description: Pagination cursor to continue from. + type: string + - name: search + description: Search flags by their slug or description. Case-insensitive. + in: query + required: false + schema: + description: Search flags by their slug or description. Case-insensitive. + type: string + maxLength: 256 + - name: kind + description: The kind of flags to retrieve. + in: query + required: false + schema: + description: The kind of flags to retrieve. + type: string + enum: + - boolean + - string + - number + - json + - name: tags + description: Filter flags by tag. Repeat the parameter for multiple tags (all must match). + in: query + required: false + schema: + description: Filter flags by tag. Repeat the parameter for multiple tags (all must match). + type: array + items: + type: string + - description: The Team identifier to perform the request on behalf of. + in: path + name: team_id + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + required: true + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + /v1/projects/{project_id_or_name}/feature-flags/segments: + put: + description: Create a new feature flag segment. + operationId: createFlagSegment + security: + - bearerToken: [] + summary: Create a segment + tags: + - feature-flags + responses: + '201': + description: '' + content: + application/json: + schema: + properties: + description: + type: string + createdBy: + type: string + usedByFlags: + items: + type: string + type: array + usedBySegments: + items: + type: string + type: array + data: + properties: + rules: + items: + properties: + id: + type: string + outcome: + oneOf: + - properties: + type: + type: string + enum: + - all + required: + - type + type: object + - properties: + type: + type: string + enum: + - split + base: + properties: + type: + type: string + enum: + - entity + kind: + type: string + attribute: + type: string + required: + - attribute + - kind + - type + type: object + passPromille: + type: number + required: + - base + - passPromille + - type + type: object + conditions: + items: + properties: + rhs: + oneOf: + - type: string + - type: number + - properties: + type: + type: string + enum: + - list + - list/inline + items: + items: + oneOf: + - properties: + label: + type: string + note: + type: string + value: + type: number + required: + - value + type: object + - properties: + label: + type: string + note: + type: string + value: + type: string + required: + - value + type: object + type: array + required: + - items + - type + type: object + - properties: + type: + type: string + enum: + - regex + pattern: + type: string + flags: + type: string + required: + - flags + - pattern + - type + type: object + - type: boolean + enum: + - false + - true + cmpOptions: + properties: + ignoreCase: + type: boolean + enum: + - false + - true + type: object + lhs: + oneOf: + - properties: + type: + type: string + enum: + - segment + required: + - type + type: object + - properties: + type: + type: string + enum: + - entity + kind: + type: string + attribute: + type: string + required: + - attribute + - kind + - type + type: object + cmp: + type: string + enum: + - '!contains' + - '!endsWith' + - '!eq' + - '!ex' + - '!oneOf' + - '!regex' + - '!startsWith' + - after + - before + - contains + - containsAllOf + - containsAnyOf + - containsNoneOf + - endsWith + - eq + - ex + - gt + - gte + - lt + - lte + - oneOf + - regex + - startsWith + required: + - cmp + - lhs + type: object + type: array + required: + - conditions + - id + - outcome + type: object + type: array + include: + additionalProperties: + additionalProperties: + items: + properties: + note: + type: string + value: + type: string + required: + - value + type: object + type: array + type: object + type: object + exclude: + additionalProperties: + additionalProperties: + items: + properties: + note: + type: string + value: + type: string + required: + - value + type: object + type: array + type: object + type: object + type: object + id: + type: string + label: + type: string + slug: + type: string + createdAt: + type: number + updatedAt: + type: number + projectId: + type: string + typeName: + type: string + enum: + - segment + hint: + type: string + required: + - createdAt + - data + - hint + - id + - label + - projectId + - slug + - typeName + - updatedAt + type: object + '400': + description: |- + One of the provided values in the request body is invalid. + One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '402': + description: The account is missing a payment so payment method must be updated + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '409': + description: '' + '410': + description: '' + parameters: + - name: project_id_or_name + description: The project id or name + in: path + required: true + schema: + description: The project id or name + type: string + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + requestBody: + content: + application/json: + schema: + type: object + additionalProperties: false + properties: + slug: + type: string + createdBy: + description: The entity who created the segment + type: string + label: + type: string + description: + type: string + data: + type: object + additionalProperties: false + description: The data of the segment + properties: + rules: + type: array + items: + type: object + additionalProperties: false + properties: + id: + type: string + conditions: + type: array + items: + type: object + additionalProperties: false + properties: + lhs: + anyOf: + - type: object + additionalProperties: false + properties: + type: {} + required: + - type + - type: object + additionalProperties: false + properties: + type: {} + kind: + type: string + attribute: + type: string + required: + - type + - kind + - attribute + cmp: + type: string + enum: + - eq + - '!eq' + - oneOf + - '!oneOf' + - containsAllOf + - containsAnyOf + - containsNoneOf + - startsWith + - '!startsWith' + - endsWith + - '!endsWith' + - contains + - '!contains' + - ex + - '!ex' + - gt + - gte + - lt + - lte + - regex + - '!regex' + - before + - after + rhs: + anyOf: + - type: object + additionalProperties: false + properties: + type: + type: string + enum: + - list/inline + - list + items: + type: array + items: + anyOf: + - type: object + additionalProperties: false + properties: + label: + type: string + note: + type: string + value: + type: number + required: + - value + - type: object + additionalProperties: false + properties: + label: + type: string + note: + type: string + value: + type: string + required: + - value + maxItems: 10000 + required: + - type + - items + - type: object + additionalProperties: false + properties: + type: {} + pattern: + type: string + flags: + type: string + required: + - type + - pattern + - flags + - type: string + - type: number + - type: boolean + cmpOptions: + type: object + additionalProperties: false + properties: + ignoreCase: + type: boolean + required: + - lhs + - cmp + outcome: + anyOf: + - type: object + additionalProperties: false + properties: + type: {} + required: + - type + - type: object + additionalProperties: false + properties: + type: {} + base: + type: object + additionalProperties: false + properties: + type: {} + kind: + type: string + attribute: + type: string + required: + - type + - kind + - attribute + passPromille: + type: number + required: + - type + - base + - passPromille + required: + - conditions + - outcome + - id + maxItems: 10000 + include: + type: object + additionalProperties: + type: object + additionalProperties: + type: array + items: + type: object + additionalProperties: false + properties: + note: + type: string + value: + type: string + required: + - value + maxItems: 10000 + exclude: + type: object + additionalProperties: + type: object + additionalProperties: + type: array + items: + type: object + additionalProperties: false + properties: + note: + type: string + value: + type: string + required: + - value + maxItems: 10000 + hint: + type: string + required: + - slug + - label + - data + - hint + get: + description: List all feature flag segments for a project. + operationId: listFlagSegments + security: + - bearerToken: [] + summary: List segments + tags: + - feature-flags + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + data: + items: + $ref: '#/components/schemas/Segment' + type: array + required: + - data + type: object + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '402': + description: The account is missing a payment so payment method must be updated + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + parameters: + - name: project_id_or_name + description: The project id or name + in: path + required: true + schema: + description: The project id or name + type: string + - name: withMetadata + description: Whether to include metadata + in: query + required: false + schema: + type: boolean + description: Whether to include metadata + default: false + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + /v1/projects/{project_id_or_name}/feature-flags/segments/{segment_id_or_slug}: + get: + description: Retrieve a feature flag segment by ID or slug. + operationId: getFlagSegment + security: + - bearerToken: [] + summary: Get a segment + tags: + - feature-flags + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/Segment' + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '402': + description: The account is missing a payment so payment method must be updated + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + parameters: + - name: project_id_or_name + description: The project id or name + in: path + required: true + schema: + description: The project id or name + type: string + - name: segment_id_or_slug + description: The segment slug + in: path + required: true + schema: + description: The segment slug + type: string + - name: withMetadata + description: Whether to include metadata + in: query + required: false + schema: + type: boolean + description: Whether to include metadata + default: false + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + delete: + description: Delete a feature flag segment. + operationId: deleteFlagSegment + security: + - bearerToken: [] + summary: Delete a segment + tags: + - feature-flags + responses: + '204': + description: '' + '304': + description: '' + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '402': + description: The account is missing a payment so payment method must be updated + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '409': + description: '' + '410': + description: '' + parameters: + - name: project_id_or_name + description: The project id or name + in: path + required: true + schema: + description: The project id or name + type: string + - name: segment_id_or_slug + description: The segment slug + in: path + required: true + schema: + description: The segment slug + type: string + - name: withMetadata + description: Whether to include metadata + in: query + required: false + schema: + type: boolean + description: Whether to include metadata + default: false + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + patch: + description: Update an existing feature flag segment. + operationId: updateFlagSegment + security: + - bearerToken: [] + summary: Update a segment + tags: + - feature-flags + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + description: + type: string + createdBy: + type: string + usedByFlags: + items: + type: string + type: array + usedBySegments: + items: + type: string + type: array + data: + properties: + rules: + items: + properties: + id: + type: string + outcome: + oneOf: + - properties: + type: + type: string + enum: + - all + required: + - type + type: object + - properties: + type: + type: string + enum: + - split + base: + properties: + type: + type: string + enum: + - entity + kind: + type: string + attribute: + type: string + required: + - attribute + - kind + - type + type: object + passPromille: + type: number + required: + - base + - passPromille + - type + type: object + conditions: + items: + properties: + rhs: + oneOf: + - type: string + - type: number + - properties: + type: + type: string + enum: + - list + - list/inline + items: + items: + oneOf: + - properties: + label: + type: string + note: + type: string + value: + type: number + required: + - value + type: object + - properties: + label: + type: string + note: + type: string + value: + type: string + required: + - value + type: object + type: array + required: + - items + - type + type: object + - properties: + type: + type: string + enum: + - regex + pattern: + type: string + flags: + type: string + required: + - flags + - pattern + - type + type: object + - type: boolean + enum: + - false + - true + cmpOptions: + properties: + ignoreCase: + type: boolean + enum: + - false + - true + type: object + lhs: + oneOf: + - properties: + type: + type: string + enum: + - segment + required: + - type + type: object + - properties: + type: + type: string + enum: + - entity + kind: + type: string + attribute: + type: string + required: + - attribute + - kind + - type + type: object + cmp: + type: string + enum: + - '!contains' + - '!endsWith' + - '!eq' + - '!ex' + - '!oneOf' + - '!regex' + - '!startsWith' + - after + - before + - contains + - containsAllOf + - containsAnyOf + - containsNoneOf + - endsWith + - eq + - ex + - gt + - gte + - lt + - lte + - oneOf + - regex + - startsWith + required: + - cmp + - lhs + type: object + type: array + required: + - conditions + - id + - outcome + type: object + type: array + include: + additionalProperties: + additionalProperties: + items: + properties: + note: + type: string + value: + type: string + required: + - value + type: object + type: array + type: object + type: object + exclude: + additionalProperties: + additionalProperties: + items: + properties: + note: + type: string + value: + type: string + required: + - value + type: object + type: array + type: object + type: object + type: object + id: + type: string + label: + type: string + slug: + type: string + createdAt: + type: number + updatedAt: + type: number + projectId: + type: string + typeName: + type: string + enum: + - segment + hint: + type: string + metadata: + properties: + creator: + properties: + id: + type: string + name: + type: string + required: + - id + - name + type: object + type: object + required: + - createdAt + - data + - hint + - id + - label + - projectId + - slug + - typeName + - updatedAt + type: object + '400': + description: |- + One of the provided values in the request body is invalid. + One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '402': + description: The account is missing a payment so payment method must be updated + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '409': + description: '' + '410': + description: '' + parameters: + - name: project_id_or_name + description: The project id or name + in: path + required: true + schema: + description: The project id or name + type: string + - name: segment_id_or_slug + description: The segment slug + in: path + required: true + schema: + description: The segment slug + type: string + - name: withMetadata + description: Whether to include metadata + in: query + required: false + schema: + type: boolean + description: Whether to include metadata + default: false + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + requestBody: + content: + application/json: + schema: + type: object + additionalProperties: false + properties: + operations: + type: array + items: + type: object + additionalProperties: false + properties: + action: + type: string + enum: + - add + - remove + field: + type: string + enum: + - include + - exclude + entity: + type: string + attribute: + type: string + value: + type: object + additionalProperties: false + properties: + note: + type: string + value: + type: string + required: + - value + required: + - action + - field + - entity + - attribute + - value + label: + type: string + description: + type: string + data: + type: object + additionalProperties: false + description: The data of the segment + properties: + rules: + type: array + items: + type: object + additionalProperties: false + properties: + id: + type: string + conditions: + type: array + items: + type: object + additionalProperties: false + properties: + lhs: + anyOf: + - type: object + additionalProperties: false + properties: + type: {} + required: + - type + - type: object + additionalProperties: false + properties: + type: {} + kind: + type: string + attribute: + type: string + required: + - type + - kind + - attribute + cmp: + type: string + enum: + - eq + - '!eq' + - oneOf + - '!oneOf' + - containsAllOf + - containsAnyOf + - containsNoneOf + - startsWith + - '!startsWith' + - endsWith + - '!endsWith' + - contains + - '!contains' + - ex + - '!ex' + - gt + - gte + - lt + - lte + - regex + - '!regex' + - before + - after + rhs: + anyOf: + - type: object + additionalProperties: false + properties: + type: + type: string + enum: + - list/inline + - list + items: + type: array + items: + anyOf: + - type: object + additionalProperties: false + properties: + label: + type: string + note: + type: string + value: + type: number + required: + - value + - type: object + additionalProperties: false + properties: + label: + type: string + note: + type: string + value: + type: string + required: + - value + maxItems: 10000 + required: + - type + - items + - type: object + additionalProperties: false + properties: + type: {} + pattern: + type: string + flags: + type: string + required: + - type + - pattern + - flags + - type: string + - type: number + - type: boolean + cmpOptions: + type: object + additionalProperties: false + properties: + ignoreCase: + type: boolean + required: + - lhs + - cmp + outcome: + anyOf: + - type: object + additionalProperties: false + properties: + type: {} + required: + - type + - type: object + additionalProperties: false + properties: + type: {} + base: + type: object + additionalProperties: false + properties: + type: {} + kind: + type: string + attribute: + type: string + required: + - type + - kind + - attribute + passPromille: + type: number + required: + - type + - base + - passPromille + required: + - conditions + - outcome + - id + maxItems: 10000 + include: + type: object + additionalProperties: + type: object + additionalProperties: + type: array + items: + type: object + additionalProperties: false + properties: + note: + type: string + value: + type: string + required: + - value + maxItems: 10000 + exclude: + type: object + additionalProperties: + type: object + additionalProperties: + type: array + items: + type: object + additionalProperties: false + properties: + note: + type: string + value: + type: string + required: + - value + maxItems: 10000 + hint: + type: string + /v1/deployments/{deployment_id}/feature-flags: + get: + description: Retrieve the feature flags of a deployment. + operationId: getDeploymentFeatureFlags + security: + - bearerToken: [] + summary: Retrieve the feature flags of a deployment + tags: + - feature-flags + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + flags: + items: + type: string + description: (opaque JSON object) + type: array + status: + nullable: true + properties: + deploymentId: + type: string + projectId: + type: string + responseStatus: + type: number + description: The HTTP status code from the flags discovery endpoint. + flagCount: + type: number + description: The number of flag definitions returned by the flags discovery endpoint. + createdAt: + type: number + required: + - createdAt + - deploymentId + - flagCount + - projectId + - responseStatus + type: object + required: + - flags + - status + type: object + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + parameters: + - name: deployment_id + in: path + required: true + schema: + type: string + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + /v1/projects/{project_id_or_name}/feature-flags/sdk-keys: + get: + description: Gets all SDK keys for a project. + operationId: getSdkKeys + security: + - bearerToken: [] + summary: Get all SDK keys + tags: + - feature-flags + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + data: + items: + properties: + hashKey: + type: string + projectId: + type: string + type: + type: string + enum: + - client + - mobile + - server + environment: + type: string + createdBy: + type: string + createdAt: + type: number + updatedAt: + type: number + label: + type: string + deletedAt: + type: number + partialKeyValue: + type: string + description: Partially-masked representation of the SDK key value, safe to display in UIs. The value is the `vf__` prefix followed by the first 3 characters of the secret portion and a fixed 8-character `*` mask (e.g. `vf_server_abc********`). + required: + - createdAt + - createdBy + - environment + - hashKey + - partialKeyValue + - projectId + - type + - updatedAt + type: object + description: Shared metadata for a Flags SDK key, safe to return on both LIST and CREATE. Never contains cleartext secrets. + type: array + required: + - data + type: object + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '402': + description: The account is missing a payment so payment method must be updated + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + parameters: + - name: project_id_or_name + description: The project id or name + in: path + required: true + schema: + description: The project id or name + type: string + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + put: + description: Creates an SDK key. + operationId: createSdkKey + security: + - bearerToken: [] + summary: Create an SDK key + tags: + - feature-flags + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/FlagsSdkKeyWithSecrets' + '400': + description: |- + One of the provided values in the request body is invalid. + One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '402': + description: The account is missing a payment so payment method must be updated + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '409': + description: '' + '410': + description: '' + parameters: + - name: project_id_or_name + description: The project id or name + in: path + required: true + schema: + description: The project id or name + type: string + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + requestBody: + content: + application/json: + schema: + type: object + additionalProperties: false + required: + - sdkKeyType + - environment + properties: + sdkKeyType: + type: string + enum: + - server + - mobile + - client + environment: + type: string + label: + type: string + /v1/projects/{project_id_or_name}/feature-flags/sdk-keys/{hash_key}: + delete: + description: Deletes an SDK key. + operationId: deleteSdkKey + security: + - bearerToken: [] + summary: Delete an SDK key + tags: + - feature-flags + responses: + '204': + description: '' + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '402': + description: The account is missing a payment so payment method must be updated + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '409': + description: '' + '410': + description: '' + parameters: + - name: project_id_or_name + description: The project id or name + in: path + required: true + schema: + type: string + description: The project id or name + - name: hash_key + description: The SDK key hash key to delete + in: path + required: true + schema: + type: string + description: The SDK key hash key to delete + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug +components: + schemas: + Flag: + properties: + description: + type: string + variants: + items: + type: string + description: (opaque JSON object) + type: array + id: + type: string + environments: + additionalProperties: + properties: + reuse: + properties: + active: + type: boolean + enum: + - false + - true + environment: + type: string + required: + - active + - environment + type: object + targets: + additionalProperties: + additionalProperties: + additionalProperties: + items: + properties: + note: + type: string + value: + type: string + required: + - value + type: object + type: array + type: object + type: object + type: object + revision: + type: number + pausedOutcome: + properties: + type: + type: string + enum: + - variant + variantId: + type: string + required: + - type + - variantId + type: object + fallthrough: + oneOf: + - properties: + type: + type: string + enum: + - variant + variantId: + type: string + required: + - type + - variantId + type: object + - properties: + type: + type: string + enum: + - split + base: + properties: + type: + type: string + enum: + - entity + kind: + type: string + attribute: + type: string + required: + - attribute + - kind + - type + type: object + weights: + additionalProperties: + type: number + type: object + defaultVariantId: + type: string + required: + - base + - defaultVariantId + - type + - weights + type: object + - properties: + type: + type: string + enum: + - rollout + base: + properties: + type: + type: string + enum: + - entity + kind: + type: string + attribute: + type: string + required: + - attribute + - kind + - type + type: object + defaultVariantId: + type: string + startTimestamp: + type: number + rollFromVariantId: + type: string + rollToVariantId: + type: string + slots: + items: + properties: + promille: + type: number + durationMs: + type: number + required: + - durationMs + - promille + type: object + type: array + required: + - base + - defaultVariantId + - rollFromVariantId + - rollToVariantId + - slots + - startTimestamp + - type + type: object + - properties: + type: + type: string + enum: + - experiment + required: + - type + type: object + active: + type: boolean + enum: + - false + - true + rules: + items: + properties: + id: + type: string + outcome: + oneOf: + - properties: + type: + type: string + enum: + - variant + variantId: + type: string + required: + - type + - variantId + type: object + - properties: + type: + type: string + enum: + - split + base: + properties: + type: + type: string + enum: + - entity + kind: + type: string + attribute: + type: string + required: + - attribute + - kind + - type + type: object + weights: + additionalProperties: + type: number + type: object + defaultVariantId: + type: string + required: + - base + - defaultVariantId + - type + - weights + type: object + - properties: + type: + type: string + enum: + - rollout + base: + properties: + type: + type: string + enum: + - entity + kind: + type: string + attribute: + type: string + required: + - attribute + - kind + - type + type: object + defaultVariantId: + type: string + startTimestamp: + type: number + rollFromVariantId: + type: string + rollToVariantId: + type: string + slots: + items: + properties: + promille: + type: number + durationMs: + type: number + required: + - durationMs + - promille + type: object + type: array + required: + - base + - defaultVariantId + - rollFromVariantId + - rollToVariantId + - slots + - startTimestamp + - type + type: object + - properties: + type: + type: string + enum: + - experiment + required: + - type + type: object + conditions: + items: + properties: + rhs: + oneOf: + - type: string + - type: number + - properties: + type: + type: string + enum: + - list + - list/inline + items: + items: + oneOf: + - properties: + label: + type: string + note: + type: string + value: + type: number + required: + - value + type: object + - properties: + label: + type: string + note: + type: string + value: + type: string + required: + - value + type: object + type: array + required: + - items + - type + type: object + - properties: + type: + type: string + enum: + - regex + pattern: + type: string + flags: + type: string + required: + - flags + - pattern + - type + type: object + - type: boolean + enum: + - false + - true + cmpOptions: + properties: + ignoreCase: + type: boolean + enum: + - false + - true + type: object + lhs: + oneOf: + - properties: + type: + type: string + enum: + - segment + required: + - type + type: object + - properties: + type: + type: string + enum: + - entity + kind: + type: string + attribute: + type: string + required: + - attribute + - kind + - type + type: object + cmp: + type: string + enum: + - '!contains' + - '!endsWith' + - '!eq' + - '!ex' + - '!oneOf' + - '!regex' + - '!startsWith' + - after + - before + - contains + - containsAllOf + - containsAnyOf + - containsNoneOf + - endsWith + - eq + - ex + - gt + - gte + - lt + - lte + - oneOf + - regex + - startsWith + required: + - cmp + - lhs + type: object + type: array + required: + - conditions + - id + - outcome + type: object + type: array + required: + - active + - fallthrough + - pausedOutcome + - rules + type: object + type: object + kind: + type: string + enum: + - boolean + - json + - number + - string + revision: + type: number + seed: + type: number + state: + type: string + enum: + - active + - archived + maintainerIds: + items: + type: string + type: array + permanent: + type: boolean + enum: + - false + - true + tags: + items: + type: string + type: array + slug: + type: string + createdAt: + type: number + updatedAt: + type: number + updatedBy: + type: string + createdBy: + type: string + ownerId: + type: string + projectId: + type: string + typeName: + type: string + enum: + - flag + metadata: + properties: + creator: + properties: + id: + type: string + name: + type: string + required: + - id + - name + type: object + type: object + required: + - createdAt + - createdBy + - environments + - id + - kind + - ownerId + - projectId + - revision + - seed + - slug + - state + - typeName + - updatedAt + - variants + type: object + MarketplaceFlag: + properties: + typeName: + type: string + enum: + - marketplaceFlag + id: + type: string + externalId: + type: string + slug: + type: string + origin: + type: string + ownerId: + type: string + projectId: + type: string + resourceId: + type: string + integrationConfigurationId: + type: string + state: + type: string + enum: + - active + - archived + name: + type: string + description: + type: string + category: + type: string + enum: + - experiment + - flag + createdAt: + type: number + updatedAt: + type: number + required: + - externalId + - id + - integrationConfigurationId + - origin + - ownerId + - projectId + - resourceId + - slug + - state + - typeName + type: object + Segment: + properties: + description: + type: string + createdBy: + type: string + usedByFlags: + items: + type: string + type: array + usedBySegments: + items: + type: string + type: array + data: + properties: + rules: + items: + properties: + id: + type: string + outcome: + oneOf: + - properties: + type: + type: string + enum: + - all + required: + - type + type: object + - properties: + type: + type: string + enum: + - split + base: + properties: + type: + type: string + enum: + - entity + kind: + type: string + attribute: + type: string + required: + - attribute + - kind + - type + type: object + passPromille: + type: number + required: + - base + - passPromille + - type + type: object + conditions: + items: + properties: + rhs: + oneOf: + - type: string + - type: number + - properties: + type: + type: string + enum: + - list + - list/inline + items: + items: + oneOf: + - properties: + label: + type: string + note: + type: string + value: + type: number + required: + - value + type: object + - properties: + label: + type: string + note: + type: string + value: + type: string + required: + - value + type: object + type: array + required: + - items + - type + type: object + - properties: + type: + type: string + enum: + - regex + pattern: + type: string + flags: + type: string + required: + - flags + - pattern + - type + type: object + - type: boolean + enum: + - false + - true + cmpOptions: + properties: + ignoreCase: + type: boolean + enum: + - false + - true + type: object + lhs: + oneOf: + - properties: + type: + type: string + enum: + - segment + required: + - type + type: object + - properties: + type: + type: string + enum: + - entity + kind: + type: string + attribute: + type: string + required: + - attribute + - kind + - type + type: object + cmp: + type: string + enum: + - '!contains' + - '!endsWith' + - '!eq' + - '!ex' + - '!oneOf' + - '!regex' + - '!startsWith' + - after + - before + - contains + - containsAllOf + - containsAnyOf + - containsNoneOf + - endsWith + - eq + - ex + - gt + - gte + - lt + - lte + - oneOf + - regex + - startsWith + required: + - cmp + - lhs + type: object + type: array + required: + - conditions + - id + - outcome + type: object + type: array + include: + additionalProperties: + additionalProperties: + items: + properties: + note: + type: string + value: + type: string + required: + - value + type: object + type: array + type: object + type: object + exclude: + additionalProperties: + additionalProperties: + items: + properties: + note: + type: string + value: + type: string + required: + - value + type: object + type: array + type: object + type: object + type: object + id: + type: string + label: + type: string + slug: + type: string + createdAt: + type: number + updatedAt: + type: number + projectId: + type: string + typeName: + type: string + enum: + - segment + hint: + type: string + metadata: + properties: + creator: + properties: + id: + type: string + name: + type: string + required: + - id + - name + type: object + type: object + required: + - createdAt + - data + - hint + - id + - label + - projectId + - slug + - typeName + - updatedAt + type: object + FlagsSdkKeyWithSecrets: + properties: + hashKey: + type: string + projectId: + type: string + type: + type: string + enum: + - client + - mobile + - server + environment: + type: string + createdBy: + type: string + createdAt: + type: number + updatedAt: + type: number + label: + type: string + deletedAt: + type: number + partialKeyValue: + type: string + description: Partially-masked representation of the SDK key value, safe to display in UIs. The value is the `vf__` prefix followed by the first 3 characters of the secret portion and a fixed 8-character `*` mask (e.g. `vf_server_abc********`). + keyValue: + type: string + description: Cleartext value of the SDK key. + tokenValue: + type: string + description: Cleartext value of the Global Config token, when the project has a Global Config connection. + required: + - createdAt + - createdBy + - environment + - hashKey + - keyValue + - partialKeyValue + - projectId + - type + - updatedAt + type: object + description: Representation of a Flags SDK key returned by CREATE. Includes cleartext secrets (`keyValue`, `tokenValue`, `connectionString`) which are only ever disclosed once, on creation. + x-stackQL-resources: + flags: + id: vercel.feature_flags.flags + name: flags + title: Flags + methods: + list: + operation: + $ref: '#/paths/~1v2~1projects~1{project_id_or_name}~1feature-flags~1flags/get' + response: + mediaType: application/json + openAPIDocKey: '200' + objectKey: $.data + request: + nativeCasing: camel + config: + pagination: + requestToken: + key: cursor + location: query + responseToken: + key: $.pagination.next + location: body + queryParamPushdown: + top: + paramName: limit + maxValue: 100 + list_v1: + operation: + $ref: '#/paths/~1v1~1projects~1{project_id_or_name}~1feature-flags~1flags/get' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + create: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v1~1projects~1{project_id_or_name}~1feature-flags~1flags/put' + response: + mediaType: application/json + openAPIDocKey: '201' + request: + nativeCasing: camel + get: + operation: + $ref: '#/paths/~1v1~1projects~1{project_id_or_name}~1feature-flags~1flags~1{flag_id_or_slug}/get' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + update: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v1~1projects~1{project_id_or_name}~1feature-flags~1flags~1{flag_id_or_slug}/patch' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + delete: + operation: + $ref: '#/paths/~1v1~1projects~1{project_id_or_name}~1feature-flags~1flags~1{flag_id_or_slug}/delete' + response: + mediaType: application/json + openAPIDocKey: '204' + request: + nativeCasing: camel + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/flags/methods/get' + - $ref: '#/components/x-stackQL-resources/flags/methods/list' + insert: + - $ref: '#/components/x-stackQL-resources/flags/methods/create' + update: + - $ref: '#/components/x-stackQL-resources/flags/methods/update' + delete: + - $ref: '#/components/x-stackQL-resources/flags/methods/delete' + replace: [] + flag_versions: + id: vercel.feature_flags.flag_versions + name: flag_versions + title: Flag Versions + methods: + list: + operation: + $ref: '#/paths/~1v1~1projects~1{project_id_or_name}~1feature-flags~1flags~1{flag_id_or_slug}~1versions/get' + response: + mediaType: application/json + openAPIDocKey: '200' + objectKey: $.versions + request: + nativeCasing: camel + config: + queryParamPushdown: + top: + paramName: limit + maxValue: 100 + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/flag_versions/methods/list' + insert: [] + update: [] + delete: [] + replace: [] + settings: + id: vercel.feature_flags.settings + name: settings + title: Settings + methods: + get: + operation: + $ref: '#/paths/~1v1~1projects~1{project_id_or_name}~1feature-flags~1settings/get' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + update: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v1~1projects~1{project_id_or_name}~1feature-flags~1settings/patch' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/settings/methods/get' + insert: [] + update: + - $ref: '#/components/x-stackQL-resources/settings/methods/update' + delete: [] + replace: [] + team_settings: + id: vercel.feature_flags.team_settings + name: team_settings + title: Team Settings + methods: + list: + operation: + $ref: '#/paths/~1v1~1teams~1{team_id}~1feature-flags~1settings/get' + response: + mediaType: application/json + openAPIDocKey: '200' + objectKey: $.data + request: + nativeCasing: camel + config: + pagination: + requestToken: + key: cursor + location: query + responseToken: + key: $.pagination.next + location: body + queryParamPushdown: + top: + paramName: limit + maxValue: 100 + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/team_settings/methods/list' + insert: [] + update: [] + delete: [] + replace: [] + team_flags: + id: vercel.feature_flags.team_flags + name: team_flags + title: Team Flags + methods: + list: + operation: + $ref: '#/paths/~1v2~1teams~1{team_id}~1feature-flags~1flags/get' + response: + mediaType: application/json + openAPIDocKey: '200' + objectKey: $.data + request: + nativeCasing: camel + config: + pagination: + requestToken: + key: cursor + location: query + responseToken: + key: $.pagination.next + location: body + queryParamPushdown: + top: + paramName: limit + maxValue: 100 + list_v1: + operation: + $ref: '#/paths/~1v1~1teams~1{team_id}~1feature-flags~1flags/get' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/team_flags/methods/list' + insert: [] + update: [] + delete: [] + replace: [] + segments: + id: vercel.feature_flags.segments + name: segments + title: Segments + methods: + create: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v1~1projects~1{project_id_or_name}~1feature-flags~1segments/put' + response: + mediaType: application/json + openAPIDocKey: '201' + request: + nativeCasing: camel + list: + operation: + $ref: '#/paths/~1v1~1projects~1{project_id_or_name}~1feature-flags~1segments/get' + response: + mediaType: application/json + openAPIDocKey: '200' + objectKey: $.data + request: + nativeCasing: camel + get: + operation: + $ref: '#/paths/~1v1~1projects~1{project_id_or_name}~1feature-flags~1segments~1{segment_id_or_slug}/get' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + delete: + operation: + $ref: '#/paths/~1v1~1projects~1{project_id_or_name}~1feature-flags~1segments~1{segment_id_or_slug}/delete' + response: + mediaType: application/json + openAPIDocKey: '204' + request: + nativeCasing: camel + update: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v1~1projects~1{project_id_or_name}~1feature-flags~1segments~1{segment_id_or_slug}/patch' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/segments/methods/get' + - $ref: '#/components/x-stackQL-resources/segments/methods/list' + insert: + - $ref: '#/components/x-stackQL-resources/segments/methods/create' + update: + - $ref: '#/components/x-stackQL-resources/segments/methods/update' + delete: + - $ref: '#/components/x-stackQL-resources/segments/methods/delete' + replace: [] + deployment_flags: + id: vercel.feature_flags.deployment_flags + name: deployment_flags + title: Deployment Flags + methods: + get: + operation: + $ref: '#/paths/~1v1~1deployments~1{deployment_id}~1feature-flags/get' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/deployment_flags/methods/get' + insert: [] + update: [] + delete: [] + replace: [] + sdk_keys: + id: vercel.feature_flags.sdk_keys + name: sdk_keys + title: Sdk Keys + methods: + list: + operation: + $ref: '#/paths/~1v1~1projects~1{project_id_or_name}~1feature-flags~1sdk-keys/get' + response: + mediaType: application/json + openAPIDocKey: '200' + objectKey: $.data + request: + nativeCasing: camel + create: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v1~1projects~1{project_id_or_name}~1feature-flags~1sdk-keys/put' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + delete: + operation: + $ref: '#/paths/~1v1~1projects~1{project_id_or_name}~1feature-flags~1sdk-keys~1{hash_key}/delete' + response: + mediaType: application/json + openAPIDocKey: '204' + request: + nativeCasing: camel + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/sdk_keys/methods/list' + insert: + - $ref: '#/components/x-stackQL-resources/sdk_keys/methods/create' + update: [] + delete: + - $ref: '#/components/x-stackQL-resources/sdk_keys/methods/delete' + replace: [] +servers: + - url: https://api.vercel.com diff --git a/provider-dev/openapi/src/vercel/v00.00.00000/services/integrations.yaml b/provider-dev/openapi/src/vercel/v00.00.00000/services/integrations.yaml index 0147015..0234fdb 100644 --- a/provider-dev/openapi/src/vercel/v00.00.00000/services/integrations.yaml +++ b/provider-dev/openapi/src/vercel/v00.00.00000/services/integrations.yaml @@ -1,500 +1,229 @@ openapi: 3.0.3 -servers: - - url: 'https://api.vercel.com' - description: Production API info: - contact: - email: support@vercel.com - name: Vercel Support - url: 'https://vercel.com/support' + title: integrations API + description: vercel integrations API version: 0.0.1 - title: Vercel API - integrations - description: integrations -components: - schemas: {} - responses: {} - securitySchemes: - bearerToken: - type: http - description: Default authentication mechanism - scheme: bearer - oauth2: - type: oauth2 - flows: - authorizationCode: - authorizationUrl: 'https://api.vercel.com/oauth/authorize' - tokenUrl: 'https://api.vercel.com/oauth/access_token' - scopes: {} - x-stackQL-resources: - configuration: - id: vercel.integrations.configuration - name: configuration - title: Configuration - methods: - get_configurations: - operation: - $ref: '#/paths/~1v1~1integrations~1configurations/get' - response: - mediaType: application/json - openAPIDocKey: '200' - get_configuration: - operation: - $ref: '#/paths/~1v1~1integrations~1configuration~1{id}/get' - response: - mediaType: application/json - openAPIDocKey: '200' - delete_configuration: - operation: - $ref: '#/paths/~1v1~1integrations~1configuration~1{id}/delete' - response: - mediaType: application/json - openAPIDocKey: '200' - sqlVerbs: - select: - - $ref: '#/components/x-stackQL-resources/configuration/methods/get_configuration' - - $ref: '#/components/x-stackQL-resources/configuration/methods/get_configurations' - insert: [] - update: [] - delete: - - $ref: '#/components/x-stackQL-resources/configuration/methods/delete_configuration' - git_namespaces: - id: vercel.integrations.git_namespaces - name: git_namespaces - title: Git Namespaces - methods: - git_namespaces: - operation: - $ref: '#/paths/~1v1~1integrations~1git-namespaces/get' - response: - mediaType: application/json - openAPIDocKey: '200' - sqlVerbs: - select: - - $ref: '#/components/x-stackQL-resources/git_namespaces/methods/git_namespaces' - insert: [] - update: [] - delete: [] - search_repo: - id: vercel.integrations.search_repo - name: search_repo - title: Search Repo - methods: - git_namespaces: - operation: - $ref: '#/paths/~1v1~1integrations~1search-repo/get' - response: - mediaType: application/json - openAPIDocKey: '200' - sqlVerbs: - select: - - $ref: '#/components/x-stackQL-resources/search_repo/methods/git_namespaces' - insert: [] - update: [] - delete: [] paths: - /v1/integrations/configurations: + /v1/integrations/git-namespaces: get: - description: 'Allows to retrieve all configurations for an authenticated integration. When the `project` view is used, configurations generated for the authorization flow will be filtered out of the results.' - operationId: getConfigurations + description: Lists git namespaces for a supported provider. Supported providers are `github`, `gitlab` and `bitbucket`. If the provider is not provided, it will try to obtain it from the user that authenticated the request. + operationId: gitNamespaces security: - bearerToken: [] - summary: Get configurations for the authenticated user or team + summary: List git namespaces by provider tags: - integrations responses: '200': - description: The list of configurations for the authenticated user + description: '' content: application/json: schema: - oneOf: - - items: + $ref: '#/components/schemas/GitNamespacesResponse' + '400': + description: One of the provided values in the request query is invalid. + '401': + description: '' + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + '429': + description: '' + '500': + description: '' + parameters: + - name: host + description: The custom Git host if using a custom Git provider, like GitHub Enterprise Server + in: query + schema: + description: The custom Git host if using a custom Git provider, like GitHub Enterprise Server + type: string + example: ghes-test.now.systems + - name: provider + in: query + schema: + enum: + - github + - github-limited + - github-custom-host + - gitlab + - bitbucket + - name: viewerMetadata + description: When true, includes the viewer object for each namespace. + in: query + schema: + description: When true, includes the viewer object for each namespace. + type: boolean + /v1/integrations/search-repo: + get: + description: Lists git repositories linked to a namespace `id` for a supported provider. A specific namespace `id` can be obtained via the `git-namespaces` endpoint. Supported providers are `github`, `gitlab` and `bitbucket`. If the provider or namespace is not provided, it will try to obtain it from the user that authenticated the request. + operationId: searchRepo + security: + - bearerToken: [] + summary: List git repositories linked to namespace by provider + tags: + - integrations + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + error: + properties: + code: + type: string + enum: + - installation_not_found + message: + type: string + required: + - code + - message + type: object + gitAccount: + properties: + provider: + type: string + namespaceId: + nullable: true + type: string + required: + - namespaceId + - provider + type: object + repos: + items: properties: - completedAt: - type: number - description: A timestamp that tells you when the configuration was installed successfully - example: 1558531915505 - createdAt: - type: number - description: A timestamp that tells you when the configuration was created - example: 1558531915505 id: type: string - description: The unique identifier of the configuration - example: icfg_3bwCLgxL8qt5kjRLcv2Dit7F - integrationId: - type: string - description: The unique identifier of the app the configuration was created for - example: oac_xzpVzcUOgcB1nrVlirtKhbWV - ownerId: - type: string - description: The user or team ID that owns the configuration - example: kr1PsOIzqEL5Xg6M4VZcZosf - projects: - items: - type: string - type: array - description: 'When a configuration is limited to access certain projects, this will contain each of the project ID it is allowed to access. If it is not defined, the configuration has full access.' - example: - - prj_xQxbutw1HpL6HLYPAzt5h75m8NjO - source: + provider: type: string enum: - - marketplace - - deploy-button - - external - description: Source defines where the configuration was installed from. It is used to analyze user engagement for integration installations in product metrics. - example: marketplace - removedLogDrainsAt: - type: number - removedProjectEnvsAt: - type: number - removedTokensAt: - type: number - removedWebhooksAt: - type: number - slug: + - cursor-origin + url: type: string - description: The slug of the integration the configuration is created for. - example: slack - teamId: - nullable: true + name: type: string - description: 'When the configuration was created for a team, this will show the ID of the team.' - example: team_nLlpyC6RE1qxydlFKbrxDlud - type: + slug: type: string - enum: - - integration-configuration - updatedAt: - type: number - description: A timestamp that tells you when the configuration was updated. - example: 1558531915505 - userId: + namespace: type: string - description: The ID of the user that created the configuration. - example: kr1PsOIzqEL5Xg6M4VZcZosf - scopes: - items: - type: string - type: array - description: The resources that are allowed to be accessed by the configuration. - example: - - 'read:project' - - 'read-write:log-drain' - scopesQueue: - items: - properties: - scopes: - properties: - added: - items: - type: string - enum: - - 'read:integration-configuration' - - 'read-write:integration-configuration' - - 'read:deployment' - - 'read-write:deployment' - - 'read-write:deployment-check' - - 'read:project' - - 'read-write:project' - - 'read-write:project-env-vars' - - 'read-write:global-project-env-vars' - - 'read:team' - - 'read:user' - - 'read-write:log-drain' - - 'read:domain' - - 'read-write:domain' - - 'read-write:edge-config' - - 'read-write:otel-endpoint' - - 'read:monitoring' - type: array - upgraded: - items: - type: string - enum: - - 'read:integration-configuration' - - 'read-write:integration-configuration' - - 'read:deployment' - - 'read-write:deployment' - - 'read-write:deployment-check' - - 'read:project' - - 'read-write:project' - - 'read-write:project-env-vars' - - 'read-write:global-project-env-vars' - - 'read:team' - - 'read:user' - - 'read-write:log-drain' - - 'read:domain' - - 'read-write:domain' - - 'read-write:edge-config' - - 'read-write:otel-endpoint' - - 'read:monitoring' - type: array - required: - - added - - upgraded - type: object - note: - type: string - requestedAt: - type: number - confirmedAt: - type: number - required: - - scopes - - note - - requestedAt - type: object - type: array - disabledAt: - type: number - description: 'A timestamp that tells you when the configuration was disabled. Note: Configurations can be disabled when the associated user loses access to a team. They do not function during this time until the configuration is ''transferred'', meaning the associated user is changed to one with access to the team.' - example: 1558531915505 - deletedAt: - nullable: true - type: number - description: A timestamp that tells you when the configuration was updated. - example: 1558531915505 - disabledReason: + ownerType: type: string enum: - - log-drain-high-error-rate - - log-drains-add-on-disabled-by-owner - - account-plan-downgrade - - disabled-by-admin - - original-owner-left-the-team - required: - - createdAt - - id - - integrationId - - ownerId - - slug - - type - - updatedAt - - userId - - scopes - type: object - type: array - - items: - properties: - integration: + - team + - user + owner: properties: - name: - type: string - icon: + id: type: string - category: + name: type: string - isLegacy: - type: boolean - flags: - items: - type: string - type: array - assignedBetaLabelAt: - type: number required: + - id - name - - icon - - category - - isLegacy type: object - completedAt: - type: number - description: A timestamp that tells you when the configuration was installed successfully - example: 1558531915505 - createdAt: - type: number - description: A timestamp that tells you when the configuration was created - example: 1558531915505 - id: - type: string - description: The unique identifier of the configuration - example: icfg_3bwCLgxL8qt5kjRLcv2Dit7F - integrationId: - type: string - description: The unique identifier of the app the configuration was created for - example: oac_xzpVzcUOgcB1nrVlirtKhbWV - ownerId: - type: string - description: The user or team ID that owns the configuration - example: kr1PsOIzqEL5Xg6M4VZcZosf - projects: - items: - type: string - type: array - description: 'When a configuration is limited to access certain projects, this will contain each of the project ID it is allowed to access. If it is not defined, the configuration has full access.' - example: - - prj_xQxbutw1HpL6HLYPAzt5h75m8NjO - source: - type: string + private: + type: boolean enum: - - marketplace - - deploy-button - - external - description: Source defines where the configuration was installed from. It is used to analyze user engagement for integration installations in product metrics. - example: marketplace - removedLogDrainsAt: - type: number - removedProjectEnvsAt: - type: number - removedTokensAt: - type: number - removedWebhooksAt: - type: number - slug: - type: string - description: The slug of the integration the configuration is created for. - example: slack - teamId: - nullable: true - type: string - description: 'When the configuration was created for a team, this will show the ID of the team.' - example: team_nLlpyC6RE1qxydlFKbrxDlud - type: + - false + - true + defaultBranch: type: string - enum: - - integration-configuration updatedAt: type: number - description: A timestamp that tells you when the configuration was updated. - example: 1558531915505 - userId: - type: string - description: The ID of the user that created the configuration. - example: kr1PsOIzqEL5Xg6M4VZcZosf - scopes: - items: - type: string - type: array - description: The resources that are allowed to be accessed by the configuration. - example: - - 'read:project' - - 'read-write:log-drain' - scopesQueue: - items: - properties: - scopes: - properties: - added: - items: - type: string - enum: - - 'read:integration-configuration' - - 'read-write:integration-configuration' - - 'read:deployment' - - 'read-write:deployment' - - 'read-write:deployment-check' - - 'read:project' - - 'read-write:project' - - 'read-write:project-env-vars' - - 'read-write:global-project-env-vars' - - 'read:team' - - 'read:user' - - 'read-write:log-drain' - - 'read:domain' - - 'read-write:domain' - - 'read-write:edge-config' - - 'read-write:otel-endpoint' - - 'read:monitoring' - type: array - upgraded: - items: - type: string - enum: - - 'read:integration-configuration' - - 'read-write:integration-configuration' - - 'read:deployment' - - 'read-write:deployment' - - 'read-write:deployment-check' - - 'read:project' - - 'read-write:project' - - 'read-write:project-env-vars' - - 'read-write:global-project-env-vars' - - 'read:team' - - 'read:user' - - 'read-write:log-drain' - - 'read:domain' - - 'read-write:domain' - - 'read-write:edge-config' - - 'read-write:otel-endpoint' - - 'read:monitoring' - type: array - required: - - added - - upgraded - type: object - note: - type: string - requestedAt: - type: number - confirmedAt: - type: number - required: - - scopes - - note - - requestedAt - type: object - type: array - disabledAt: - type: number - description: 'A timestamp that tells you when the configuration was disabled. Note: Configurations can be disabled when the associated user loses access to a team. They do not function during this time until the configuration is ''transferred'', meaning the associated user is changed to one with access to the team.' - example: 1558531915505 - deletedAt: - nullable: true - type: number - description: A timestamp that tells you when the configuration was updated. - example: 1558531915505 - disabledReason: - type: string - enum: - - log-drain-high-error-rate - - log-drains-add-on-disabled-by-owner - - account-plan-downgrade - - disabled-by-admin - - original-owner-left-the-team required: - - integration - - createdAt + - defaultBranch - id - - integrationId - - ownerId + - name + - namespace + - owner + - ownerType + - private + - provider - slug - - type - updatedAt - - userId - - scopes + - url type: object type: array + required: + - error + - gitAccount + - repos + type: object '400': description: One of the provided values in the request query is invalid. '401': description: '' '403': description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + '429': + description: '' + '500': + description: '' + '502': + description: '' parameters: - - name: view + - name: query in: query - required: true schema: type: string - enum: - - account - - project - - description: The Team identifier or slug to perform the request on behalf of. + - name: namespaceId + in: query + schema: + nullable: true + oneOf: + - type: string + - type: number + - name: provider + in: query + schema: + enum: + - github + - github-limited + - github-custom-host + - gitlab + - bitbucket + - cursor-origin + - name: installationId + in: query + schema: + type: string + - name: host + description: The custom Git host if using a custom Git provider, like GitHub Enterprise Server + in: query + schema: + description: The custom Git host if using a custom Git provider, like GitHub Enterprise Server + type: string + example: ghes-test.now.systems + - description: The Team identifier to perform the request on behalf of. in: query name: teamId - required: true schema: type: string - '/v1/integrations/configuration/{id}': + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + /v1/integrations/integration/{integration_id_or_slug}/products/{product_id_or_slug}/plans: get: - description: Allows to retrieve a the configuration with the provided id in case it exists. The authenticated user or team must be the owner of the config in order to access it. - operationId: getConfiguration + description: Get a list of billing plans for an integration and product. + operationId: getBillingPlans security: - bearerToken: [] - summary: Retrieve an integration configuration + summary: List integration billing plans tags: - integrations responses: @@ -503,607 +232,5725 @@ paths: content: application/json: schema: - oneOf: - - properties: - completedAt: - type: number - description: A timestamp that tells you when the configuration was installed successfully - example: 1558531915505 - createdAt: - type: number - description: A timestamp that tells you when the configuration was created - example: 1558531915505 - id: - type: string - description: The unique identifier of the configuration - example: icfg_3bwCLgxL8qt5kjRLcv2Dit7F - integrationId: - type: string - description: The unique identifier of the app the configuration was created for - example: oac_xzpVzcUOgcB1nrVlirtKhbWV - ownerId: - type: string - description: The user or team ID that owns the configuration - example: kr1PsOIzqEL5Xg6M4VZcZosf - projects: - items: + properties: + plans: + items: + properties: + type: type: string - type: array - description: 'When a configuration is limited to access certain projects, this will contain each of the project ID it is allowed to access. If it is not defined, the configuration has full access.' - example: - - prj_xQxbutw1HpL6HLYPAzt5h75m8NjO - source: - type: string - enum: - - marketplace - - deploy-button - - external - description: Source defines where the configuration was installed from. It is used to analyze user engagement for integration installations in product metrics. - example: marketplace - removedLogDrainsAt: - type: number - removedProjectEnvsAt: - type: number - removedTokensAt: - type: number - removedWebhooksAt: - type: number - slug: - type: string - description: The slug of the integration the configuration is created for. - example: slack - teamId: - nullable: true - type: string - description: 'When the configuration was created for a team, this will show the ID of the team.' - example: team_nLlpyC6RE1qxydlFKbrxDlud - type: - type: string - enum: - - integration-configuration - updatedAt: - type: number - description: A timestamp that tells you when the configuration was updated. - example: 1558531915505 - userId: - type: string - description: The ID of the user that created the configuration. - example: kr1PsOIzqEL5Xg6M4VZcZosf - scopes: - items: + enum: + - prepayment + - subscription + id: type: string - type: array - description: The resources that are allowed to be accessed by the configuration. - example: - - 'read:project' - - 'read-write:log-drain' - scopesQueue: - items: - properties: - scopes: - properties: - added: - items: - type: string - enum: - - 'read:integration-configuration' - - 'read-write:integration-configuration' - - 'read:deployment' - - 'read-write:deployment' - - 'read-write:deployment-check' - - 'read:project' - - 'read-write:project' - - 'read-write:project-env-vars' - - 'read-write:global-project-env-vars' - - 'read:team' - - 'read:user' - - 'read-write:log-drain' - - 'read:domain' - - 'read-write:domain' - - 'read-write:edge-config' - - 'read-write:otel-endpoint' - - 'read:monitoring' - type: array - upgraded: - items: - type: string - enum: - - 'read:integration-configuration' - - 'read-write:integration-configuration' - - 'read:deployment' - - 'read-write:deployment' - - 'read-write:deployment-check' - - 'read:project' - - 'read-write:project' - - 'read-write:project-env-vars' - - 'read-write:global-project-env-vars' - - 'read:team' - - 'read:user' - - 'read-write:log-drain' - - 'read:domain' - - 'read-write:domain' - - 'read-write:edge-config' - - 'read-write:otel-endpoint' - - 'read:monitoring' - type: array - required: - - added - - upgraded - type: object - note: - type: string - requestedAt: - type: number - confirmedAt: - type: number - required: - - scopes - - note - - requestedAt - type: object - type: array - disabledAt: - type: number - description: 'A timestamp that tells you when the configuration was disabled. Note: Configurations can be disabled when the associated user loses access to a team. They do not function during this time until the configuration is ''transferred'', meaning the associated user is changed to one with access to the team.' - example: 1558531915505 - deletedAt: - nullable: true - type: number - description: A timestamp that tells you when the configuration was updated. - example: 1558531915505 - disabledReason: - type: string - enum: - - log-drain-high-error-rate - - log-drains-add-on-disabled-by-owner - - account-plan-downgrade - - disabled-by-admin - - original-owner-left-the-team - required: - - createdAt - - id - - integrationId - - ownerId - - slug - - type - - updatedAt - - userId - - scopes - type: object - - properties: - projectSelection: - type: string - enum: - - selected - - all - description: A string representing the permission for projects. Possible values are `all` or `selected`. - example: all - completedAt: - type: number - description: A timestamp that tells you when the configuration was installed successfully - example: 1558531915505 - createdAt: - type: number - description: A timestamp that tells you when the configuration was created - example: 1558531915505 - id: - type: string - description: The unique identifier of the configuration - example: icfg_3bwCLgxL8qt5kjRLcv2Dit7F - integrationId: - type: string - description: The unique identifier of the app the configuration was created for - example: oac_xzpVzcUOgcB1nrVlirtKhbWV - ownerId: - type: string - description: The user or team ID that owns the configuration - example: kr1PsOIzqEL5Xg6M4VZcZosf - projects: - items: + name: type: string - type: array - description: 'When a configuration is limited to access certain projects, this will contain each of the project ID it is allowed to access. If it is not defined, the configuration has full access.' - example: - - prj_xQxbutw1HpL6HLYPAzt5h75m8NjO - source: - type: string - enum: - - marketplace - - deploy-button - - external - description: Source defines where the configuration was installed from. It is used to analyze user engagement for integration installations in product metrics. - example: marketplace - removedLogDrainsAt: - type: number - removedProjectEnvsAt: - type: number - removedTokensAt: - type: number - removedWebhooksAt: - type: number - slug: - type: string - description: The slug of the integration the configuration is created for. - example: slack - teamId: - nullable: true - type: string - description: 'When the configuration was created for a team, this will show the ID of the team.' - example: team_nLlpyC6RE1qxydlFKbrxDlud - type: - type: string - enum: - - integration-configuration - updatedAt: - type: number - description: A timestamp that tells you when the configuration was updated. - example: 1558531915505 - userId: - type: string - description: The ID of the user that created the configuration. - example: kr1PsOIzqEL5Xg6M4VZcZosf - scopes: - items: + scope: type: string - type: array - description: The resources that are allowed to be accessed by the configuration. - example: - - 'read:project' - - 'read-write:log-drain' - scopesQueue: - items: - properties: - scopes: - properties: - added: - items: - type: string - enum: - - 'read:integration-configuration' - - 'read-write:integration-configuration' - - 'read:deployment' - - 'read-write:deployment' - - 'read-write:deployment-check' - - 'read:project' - - 'read-write:project' - - 'read-write:project-env-vars' - - 'read-write:global-project-env-vars' - - 'read:team' - - 'read:user' - - 'read-write:log-drain' - - 'read:domain' - - 'read-write:domain' - - 'read-write:edge-config' - - 'read-write:otel-endpoint' - - 'read:monitoring' - type: array - upgraded: - items: - type: string - enum: - - 'read:integration-configuration' - - 'read-write:integration-configuration' - - 'read:deployment' - - 'read-write:deployment' - - 'read-write:deployment-check' - - 'read:project' - - 'read-write:project' - - 'read-write:project-env-vars' - - 'read-write:global-project-env-vars' - - 'read:team' - - 'read:user' - - 'read-write:log-drain' - - 'read:domain' - - 'read-write:domain' - - 'read-write:edge-config' - - 'read-write:otel-endpoint' - - 'read:monitoring' - type: array - required: - - added - - upgraded - type: object - note: - type: string - requestedAt: - type: number - confirmedAt: - type: number - required: - - scopes - - note - - requestedAt - type: object - type: array - disabledAt: - type: number - description: 'A timestamp that tells you when the configuration was disabled. Note: Configurations can be disabled when the associated user loses access to a team. They do not function during this time until the configuration is ''transferred'', meaning the associated user is changed to one with access to the team.' - example: 1558531915505 - deletedAt: - nullable: true - type: number - description: A timestamp that tells you when the configuration was updated. - example: 1558531915505 - disabledReason: - type: string - enum: - - log-drain-high-error-rate - - log-drains-add-on-disabled-by-owner - - account-plan-downgrade - - disabled-by-admin - - original-owner-left-the-team - canConfigureOpenTelemetry: - type: boolean - required: - - projectSelection - - createdAt - - id - - integrationId - - ownerId - - slug - - type - - updatedAt - - userId - - scopes - type: object + enum: + - installation + - resource + description: + type: string + paymentMethodRequired: + type: boolean + enum: + - false + - true + preauthorizationAmount: + type: number + initialCharge: + type: string + minimumAmount: + type: string + maximumAmount: + type: string + maximumAmountAutoPurchasePerPeriod: + type: string + cost: + type: string + details: + items: + properties: + label: + type: string + value: + type: string + required: + - label + type: object + type: array + highlightedDetails: + items: + properties: + label: + type: string + value: + type: string + required: + - label + type: object + type: array + quote: + items: + properties: + line: + type: string + amount: + type: string + required: + - amount + - line + type: object + type: array + effectiveDate: + type: string + disabled: + type: boolean + enum: + - false + - true + required: + - description + - id + - name + - paymentMethodRequired + - scope + - type + type: object + type: array + required: + - plans + type: object '400': description: One of the provided values in the request query is invalid. '401': - description: '' + description: The request is not authorized. '403': description: You do not have permission to access this resource. '404': - description: The configuration was not found + description: '' + '410': + description: '' parameters: - - name: id - description: ID of the configuration to check + - name: integration_id_or_slug in: path required: true schema: type: string - description: ID of the configuration to check - example: icfg_cuwj0AdCdH3BwWT4LPijCC7t - - description: The Team identifier or slug to perform the request on behalf of. + - name: integrationConfigurationId in: query - name: teamId + required: false + schema: + type: string + - name: product_id_or_slug + in: path required: true schema: type: string - delete: - description: 'Allows to remove the configuration with the `id` provided in the parameters. The configuration and all of its resources will be removed. This includes Webhooks, LogDrains and Project Env variables.' - operationId: deleteConfiguration + - name: metadata + in: query + required: false + schema: + type: string + - name: source + in: query + required: false + schema: + type: string + enum: + - marketplace + - deploy-button + - external + - v0 + - resource-claims + - cli + - oauth + - backoffice + - import-recommended-integrations + - organization + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + /v1/integrations/installations/{integration_configuration_id}/resources/{resource_id}/connections: + post: + description: Connects an integration resource to a Vercel project. This endpoint establishes a connection between a provisioned integration resource (from storage APIs like `POST /v1/storage/stores/integration/direct`) and a specific Vercel project. + operationId: connectIntegrationResourceToProject security: - bearerToken: [] - summary: Delete an integration configuration + summary: Connect integration resource to project tags: - integrations responses: - '204': - description: The configuration was successfully removed + '201': + description: '' '400': - description: One of the provided values in the request query is invalid. + description: |- + One of the provided values in the request body is invalid. + One of the provided values in the request query is invalid. '401': - description: '' + description: The request is not authorized. '403': description: You do not have permission to access this resource. '404': - description: The configuration was not found + description: '' + '410': + description: '' parameters: - - name: id - description: ID of the configuration to delete + - name: integration_configuration_id + in: path + required: true + schema: + type: string + - name: resource_id in: path required: true schema: type: string - description: ID of the configuration to delete - - description: The Team identifier or slug to perform the request on behalf of. + - description: The Team identifier to perform the request on behalf of. in: query name: teamId - required: true schema: type: string - /v1/integrations/git-namespaces: + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + requestBody: + content: + application/json: + schema: + type: object + required: + - projectId + properties: + projectId: + type: string + envVarEnvironments: + type: array + items: + type: string + enum: + - production + - preview + - development + makeEnvVarsSensitive: + type: boolean + /v1/integrations/configurations: get: - description: 'Lists git namespaces for a supported provider. Supported providers are `github`, `gitlab` and `bitbucket`. If the provider is not provided, it will try to obtain it from the user that authenticated the request.' - operationId: gitNamespaces + description: Allows to retrieve all configurations for an authenticated integration. When the `project` view is used, configurations generated for the authorization flow will be filtered out of the results. + operationId: getConfigurations security: - bearerToken: [] - summary: List git namespaces by provider + summary: Get configurations for the authenticated user or team tags: - integrations responses: '200': - description: '' + description: The list of configurations for the authenticated user content: application/json: schema: - items: - properties: - provider: - type: string - slug: - type: string - id: - oneOf: - - type: string - - type: number - ownerType: - type: string - name: - type: string - isAccessRestricted: - type: boolean - installationId: - type: number - requireReauth: - type: boolean - required: - - provider - - slug - - id - - ownerType - type: object - type: array + $ref: '#/components/schemas/GetConfigurationsResponse' '400': description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. '403': description: You do not have permission to access this resource. + '410': + description: '' parameters: - - name: host - description: 'The custom Git host if using a custom Git provider, like GitHub Enterprise Server' + - name: view in: query + required: true schema: - description: 'The custom Git host if using a custom Git provider, like GitHub Enterprise Server' type: string - example: ghes-test.now.systems - - name: provider - in: query + enum: + - account + - project + - name: installationType + in: query + required: false schema: type: string enum: - - github - - github-custom-host - - gitlab - - bitbucket - - description: The Team identifier or slug to perform the request on behalf of. + - marketplace + - external + - provisioning + - name: integrationIdOrSlug + description: ID of the integration + in: query + required: false + schema: + type: string + description: ID of the integration + - description: The Team identifier to perform the request on behalf of. in: query name: teamId - required: true schema: type: string - /v1/integrations/search-repo: + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + x-speakeasy-test: false + /v1/integrations/configuration/{id}: get: - description: 'Lists git repositories linked to a namespace `id` for a supported provider. A specific namespace `id` can be obtained via the `git-namespaces` endpoint. Supported providers are `github`, `gitlab` and `bitbucket`. If the provider or namespace is not provided, it will try to obtain it from the user that authenticated the request.' - operationId: gitNamespaces + description: Allows to retrieve a the configuration with the provided id in case it exists. The authenticated user or team must be the owner of the config in order to access it. + operationId: getConfiguration security: - bearerToken: [] - summary: List git repositories linked to namespace by provider + summary: Retrieve an integration configuration tags: - integrations responses: '200': - description: '' + description: The configuration with the provided id content: application/json: schema: properties: - gitAccount: + projectSelection: + type: string + enum: + - all + - selected + description: A string representing the permission for projects. Possible values are `all` or `selected`. + example: all + notification: properties: - provider: + level: type: string enum: - - github - - github-custom-host - - gitlab - - bitbucket - namespaceId: - nullable: true - oneOf: - - type: string - - type: number + - error + - info + - warn + title: + type: string + message: + type: string + href: + type: string required: - - provider - - namespaceId + - level + - title type: object - repos: + transferRequest: + oneOf: + - properties: + kind: + type: string + enum: + - transfer-to-marketplace + metadata: + additionalProperties: true + type: object + billingPlan: + properties: + id: + type: string + type: + type: string + enum: + - prepayment + - subscription + scope: + type: string + enum: + - installation + - resource + name: + type: string + description: + type: string + paymentMethodRequired: + type: boolean + enum: + - false + - true + preauthorizationAmount: + type: number + required: + - description + - id + - name + - type + type: object + requestId: + type: string + transferId: + type: string + requester: + properties: + name: + type: string + email: + type: string + required: + - name + type: object + createdAt: + type: number + expiresAt: + type: number + discardedAt: + type: number + discardedBy: + type: string + approvedAt: + type: number + approvedBy: + type: string + authorizationId: + type: string + required: + - createdAt + - expiresAt + - kind + - requestId + - requester + - transferId + type: object + - properties: + kind: + type: string + enum: + - transfer-from-marketplace + requestId: + type: string + transferId: + type: string + requester: + properties: + name: + type: string + email: + type: string + required: + - name + type: object + createdAt: + type: number + expiresAt: + type: number + discardedAt: + type: number + discardedBy: + type: string + approvedAt: + type: number + approvedBy: + type: string + authorizationId: + type: string + required: + - createdAt + - expiresAt + - kind + - requestId + - requester + - transferId + type: object + projects: + items: + type: string + type: array + description: When a configuration is limited to access certain projects, this will contain each of the project ID it is allowed to access. If it is not defined, the configuration has full access. + example: + - prj_xQxbutw1HpL6HLYPAzt5h75m8NjO + status: + type: string + enum: + - error + - onboarding + - pending + - ready + - resumed + - suspended + - uninstalled + description: The configuration status. Optional. If not defined, assume 'ready'. + type: + type: string + enum: + - integration-configuration + id: + type: string + description: The unique identifier of the configuration + example: icfg_3bwCLgxL8qt5kjRLcv2Dit7F + slug: + type: string + description: The slug of the integration the configuration is created for. + example: slack + createdAt: + type: number + description: A timestamp that tells you when the configuration was created + example: 1558531915505 + updatedAt: + type: number + description: A timestamp that tells you when the configuration was updated. + example: 1558531915505 + ownerId: + type: string + description: The user or team ID that owns the configuration + example: kr1PsOIzqEL5Xg6M4VZcZosf + deletedAt: + nullable: true + type: number + description: A timestamp that tells you when the configuration was deleted. + example: 1558531915505 + integrationId: + type: string + description: The unique identifier of the app the configuration was created for + example: oac_xzpVzcUOgcB1nrVlirtKhbWV + userId: + type: string + description: The ID of the user that created the configuration. + example: kr1PsOIzqEL5Xg6M4VZcZosf + teamId: + nullable: true + type: string + description: When the configuration was created for a team, this will show the ID of the team. + example: team_nLlpyC6RE1qxydlFKbrxDlud + scopes: + items: + type: string + type: array + description: The resources that are allowed to be accessed by the configuration. + example: + - read:project + - read-write:log-drain + canConfigureOpenTelemetry: + type: boolean + enum: + - false + - true + completedAt: + type: number + description: A timestamp that tells you when the configuration was installed successfully + example: 1558531915505 + externalId: + type: string + description: An external identifier defined by the integration vendor. + source: + type: string + enum: + - backoffice + - cli + - deploy-button + - external + - import-recommended-integrations + - marketplace + - oauth + - organization + - resource-claims + - v0 + description: Source defines where the configuration was installed from. It is used to analyze user engagement for integration installations in product metrics. + example: marketplace + disabledAt: + type: number + description: 'A timestamp that tells you when the configuration was disabled. Note: Configurations can be disabled when the associated user loses access to a team. They do not function during this time until the configuration is ''transferred'', meaning the associated user is changed to one with access to the team.' + example: 1558531915505 + deleteRequestedAt: + nullable: true + type: number + description: A timestamp that tells you when the configuration deletion has been started for cases when the deletion needs to be settled/approved by partners, such as when marketplace invoices have been paid. + example: 1558531915505 + customerDeleteRequestedAt: + nullable: true + type: number + description: Record when the customer initited deletion, independent of whether `deleteRequestedAt` gets set. + disabledReason: + type: string + enum: + - account-plan-downgrade + - disabled-by-admin + - disabled-by-owner + - feature-not-available + - original-owner-left-the-team + - original-owner-role-downgraded + installationType: + type: string + enum: + - external + - marketplace + description: 'Defines the installation type. - ''external'' integrations are installed via the existing integrations flow - ''marketplace'' integrations are natively installed: - when accepting the TOS of a partner during the store creation process - if undefined, assume ''external''' + acceptedPoliciesInheritedFromInstallationId: + type: string + description: Historical parent installation from which acceptedPolicies were inherited. This is immutable provenance, not current authorization or relationship truth. + required: + - createdAt + - id + - integrationId + - notification + - ownerId + - projectSelection + - scopes + - slug + - transferRequest + - type + - updatedAt + - userId + type: object + description: The configuration with the provided id + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: The configuration was not found + '410': + description: '' + parameters: + - name: id + description: ID of the configuration to check + in: path + required: true + schema: + type: string + description: ID of the configuration to check + example: icfg_cuwj0AdCdH3BwWT4LPijCC7t + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + delete: + description: Allows to remove the configuration with the `id` provided in the parameters. The configuration and all of its resources will be removed. This includes Webhooks, LogDrains and Project Env variables. + operationId: deleteConfiguration + security: + - bearerToken: [] + summary: Delete an integration configuration + tags: + - integrations + responses: + '204': + description: The configuration was successfully removed + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: The configuration was not found + '410': + description: '' + parameters: + - name: id + in: path + required: true + schema: + type: string + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + /v1/integrations/configuration/{id}/products: + get: + description: Returns products available for an integration configuration. Each product includes a `metadataSchema` field with the JSON Schema for required and optional metadata fields. + operationId: getConfigurationProducts + security: + - bearerToken: [] + summary: List products for integration configuration + tags: + - integrations + responses: + '200': + description: List of products available for this integration configuration + content: + application/json: + schema: + properties: + products: items: properties: id: - oneOf: - - type: string - - type: number - provider: type: string - enum: - - github - - github-custom-host - - gitlab - - bitbucket - url: + slug: type: string name: type: string - slug: - type: string - namespace: + protocols: + properties: + storage: + properties: + status: + type: string + enum: + - disabled + - enabled + repl: + properties: + enabled: + type: boolean + enum: + - false + - true + supportsReadOnlyMode: + type: boolean + enum: + - false + - true + welcomeMessage: + type: string + required: + - enabled + - supportsReadOnlyMode + type: object + required: + - status + type: object + experimentation: + properties: + status: + type: string + enum: + - disabled + - enabled + edgeConfigSyncingSupport: + type: boolean + enum: + - false + - true + required: + - status + type: object + ai: + properties: + status: + type: string + enum: + - disabled + - enabled + required: + - status + type: object + authentication: + properties: + status: + type: string + enum: + - disabled + - enabled + appUrlRegistrationSupport: + type: boolean + enum: + - false + - true + description: The partner accepts Vercel-managed app URLs via `protocolSettings.authentication.appUrls` on provision-resource and update-resource, and reconciles them into its trusted-origin / redirect-URL allowlist. When absent, consumers surface the URL for a one-time manual registration instead. + required: + - status + type: object + observability: + properties: + status: + type: string + enum: + - disabled + - enabled + required: + - status + type: object + video: + properties: + status: + type: string + enum: + - disabled + - enabled + required: + - status + type: object + workflow: + properties: + status: + type: string + enum: + - disabled + - enabled + required: + - status + type: object + checks: + properties: + status: + type: string + enum: + - disabled + - enabled + required: + - status + type: object + logDrain: + properties: + status: + type: string + enum: + - disabled + - enabled + endpoint: + type: string + headers: + additionalProperties: + type: string + type: object + format: + type: string + enum: + - json + - ndjson + required: + - endpoint + - format + - status + type: object + traceDrain: + properties: + status: + type: string + enum: + - disabled + - enabled + endpoint: + type: string + headers: + additionalProperties: + type: string + type: object + format: + type: string + enum: + - json + - proto + required: + - endpoint + - format + - status + type: object + messaging: + properties: + status: + type: string + enum: + - disabled + - enabled + required: + - status + type: object + other: + properties: + status: + type: string + enum: + - disabled + - enabled + required: + - status + type: object + type: object + primaryProtocol: type: string - owner: + enum: + - ai + - authentication + - checks + - experimentation + - logDrain + - messaging + - observability + - other + - storage + - traceDrain + - video + - workflow + metadataSchema: properties: - id: - oneOf: - - type: string - - type: number - name: + type: type: string + enum: + - object + properties: + additionalProperties: + oneOf: + - properties: + type: + type: string + enum: + - string + ui:control: + type: string + enum: + - input + description: + type: string + enum: + items: + type: string + type: array + maxLength: + type: number + minLength: + type: number + pattern: + type: string + default: + type: string + ui:label: + type: string + ui:read-only: + oneOf: + - properties: + expr: + type: string + required: + - expr + type: object + - type: boolean + enum: + - false + - true + - type: string + enum: + - create + - update + ui:hidden: + oneOf: + - properties: + expr: + type: string + required: + - expr + type: object + - type: boolean + enum: + - false + - true + - type: string + enum: + - create + - update + ui:disabled: + oneOf: + - properties: + expr: + type: string + required: + - expr + type: object + - type: boolean + enum: + - false + - true + - type: string + enum: + - create + - update + ui:description: + oneOf: + - type: string + - properties: + expr: + type: string + required: + - expr + type: object + ui:formatted-value: + properties: + expr: + type: string + required: + - expr + type: object + ui:paid-only: + type: boolean + enum: + - false + - true + ui:placeholder: + type: string + required: + - type + - ui:control + type: object + - properties: + type: + type: string + enum: + - number + ui:control: + type: string + enum: + - input + minimum: + type: number + maximum: + type: number + description: + type: string + exclusiveMaximum: + type: number + exclusiveMinimum: + type: number + default: + type: number + ui:label: + type: string + ui:read-only: + oneOf: + - properties: + expr: + type: string + required: + - expr + type: object + - type: boolean + enum: + - false + - true + - type: string + enum: + - create + - update + ui:hidden: + oneOf: + - properties: + expr: + type: string + required: + - expr + type: object + - type: boolean + enum: + - false + - true + - type: string + enum: + - create + - update + ui:disabled: + oneOf: + - properties: + expr: + type: string + required: + - expr + type: object + - type: boolean + enum: + - false + - true + - type: string + enum: + - create + - update + ui:description: + oneOf: + - type: string + - properties: + expr: + type: string + required: + - expr + type: object + ui:formatted-value: + properties: + expr: + type: string + required: + - expr + type: object + ui:paid-only: + type: boolean + enum: + - false + - true + ui:placeholder: + type: string + required: + - type + - ui:control + type: object + - properties: + type: + type: string + enum: + - boolean + ui:control: + type: string + enum: + - toggle + description: + type: string + default: + type: boolean + enum: + - false + - true + ui:label: + type: string + ui:read-only: + oneOf: + - properties: + expr: + type: string + required: + - expr + type: object + - type: boolean + enum: + - false + - true + - type: string + enum: + - create + - update + ui:hidden: + oneOf: + - properties: + expr: + type: string + required: + - expr + type: object + - type: boolean + enum: + - false + - true + - type: string + enum: + - create + - update + ui:disabled: + oneOf: + - properties: + expr: + type: string + required: + - expr + type: object + - type: boolean + enum: + - false + - true + - type: string + enum: + - create + - update + ui:description: + oneOf: + - type: string + - properties: + expr: + type: string + required: + - expr + type: object + ui:formatted-value: + properties: + expr: + type: string + required: + - expr + type: object + ui:paid-only: + type: boolean + enum: + - false + - true + required: + - type + - ui:control + type: object + - properties: + type: + type: string + enum: + - array + items: + properties: + type: + type: string + enum: + - number + minimum: + type: number + maximum: + type: number + description: + type: string + exclusiveMaximum: + type: number + exclusiveMinimum: + type: number + default: + type: number + required: + - type + type: object + ui:control: + type: string + enum: + - slider + ui:steps: + items: + type: number + type: array + description: + type: string + maxItems: + type: number + minItems: + type: number + default: + items: + type: number + type: array + ui:label: + type: string + ui:read-only: + oneOf: + - properties: + expr: + type: string + required: + - expr + type: object + - type: boolean + enum: + - false + - true + - type: string + enum: + - create + - update + ui:hidden: + oneOf: + - properties: + expr: + type: string + required: + - expr + type: object + - type: boolean + enum: + - false + - true + - type: string + enum: + - create + - update + ui:disabled: + oneOf: + - properties: + expr: + type: string + required: + - expr + type: object + - type: boolean + enum: + - false + - true + - type: string + enum: + - create + - update + ui:description: + oneOf: + - type: string + - properties: + expr: + type: string + required: + - expr + type: object + ui:formatted-value: + properties: + expr: + type: string + required: + - expr + type: object + ui:paid-only: + type: boolean + enum: + - false + - true + required: + - items + - type + - ui:control + - ui:steps + type: object + - properties: + type: + type: string + enum: + - string + ui:control: + type: string + enum: + - select + ui:options: + items: + properties: + value: + type: string + label: + type: string + description: + type: string + disabled: + oneOf: + - properties: + expr: + type: string + required: + - expr + type: object + - type: boolean + enum: + - false + - true + - type: string + enum: + - create + - update + hidden: + oneOf: + - properties: + expr: + type: string + required: + - expr + type: object + - type: boolean + enum: + - false + - true + - type: string + enum: + - create + - update + required: + - label + - value + type: object + type: array + description: + type: string + enum: + items: + type: string + type: array + maxLength: + type: number + minLength: + type: number + pattern: + type: string + default: + type: string + ui:label: + type: string + ui:read-only: + oneOf: + - properties: + expr: + type: string + required: + - expr + type: object + - type: boolean + enum: + - false + - true + - type: string + enum: + - create + - update + ui:hidden: + oneOf: + - properties: + expr: + type: string + required: + - expr + type: object + - type: boolean + enum: + - false + - true + - type: string + enum: + - create + - update + ui:disabled: + oneOf: + - properties: + expr: + type: string + required: + - expr + type: object + - type: boolean + enum: + - false + - true + - type: string + enum: + - create + - update + ui:description: + oneOf: + - type: string + - properties: + expr: + type: string + required: + - expr + type: object + ui:formatted-value: + properties: + expr: + type: string + required: + - expr + type: object + ui:paid-only: + type: boolean + enum: + - false + - true + ui:placeholder: + type: string + required: + - type + - ui:control + - ui:options + type: object + - properties: + type: + type: string + enum: + - string + ui:control: + type: string + enum: + - radio-button + ui:options: + items: + properties: + value: + type: string + label: + type: string + description: + type: string + disabled: + oneOf: + - properties: + expr: + type: string + required: + - expr + type: object + - type: boolean + enum: + - false + - true + - type: string + enum: + - create + - update + hidden: + oneOf: + - properties: + expr: + type: string + required: + - expr + type: object + - type: boolean + enum: + - false + - true + - type: string + enum: + - create + - update + required: + - label + - value + type: object + type: array + description: + type: string + enum: + items: + type: string + type: array + maxLength: + type: number + minLength: + type: number + pattern: + type: string + default: + type: string + ui:label: + type: string + ui:read-only: + oneOf: + - properties: + expr: + type: string + required: + - expr + type: object + - type: boolean + enum: + - false + - true + - type: string + enum: + - create + - update + ui:hidden: + oneOf: + - properties: + expr: + type: string + required: + - expr + type: object + - type: boolean + enum: + - false + - true + - type: string + enum: + - create + - update + ui:disabled: + oneOf: + - properties: + expr: + type: string + required: + - expr + type: object + - type: boolean + enum: + - false + - true + - type: string + enum: + - create + - update + ui:description: + oneOf: + - type: string + - properties: + expr: + type: string + required: + - expr + type: object + ui:formatted-value: + properties: + expr: + type: string + required: + - expr + type: object + ui:paid-only: + type: boolean + enum: + - false + - true + ui:placeholder: + type: string + required: + - type + - ui:control + - ui:options + type: object + - properties: + type: + type: string + enum: + - array + items: + properties: + type: + type: string + enum: + - string + description: + type: string + enum: + items: + type: string + type: array + maxLength: + type: number + minLength: + type: number + pattern: + type: string + default: + type: string + required: + - type + type: object + ui:control: + type: string + enum: + - multi-select + ui:options: + items: + properties: + value: + type: string + label: + type: string + description: + type: string + disabled: + oneOf: + - properties: + expr: + type: string + required: + - expr + type: object + - type: boolean + enum: + - false + - true + - type: string + enum: + - create + - update + hidden: + oneOf: + - properties: + expr: + type: string + required: + - expr + type: object + - type: boolean + enum: + - false + - true + - type: string + enum: + - create + - update + required: + - label + - value + type: object + type: array + description: + type: string + maxItems: + type: number + minItems: + type: number + default: + items: + type: string + type: array + example: + items: + type: string + type: array + ui:label: + type: string + ui:read-only: + oneOf: + - properties: + expr: + type: string + required: + - expr + type: object + - type: boolean + enum: + - false + - true + - type: string + enum: + - create + - update + ui:hidden: + oneOf: + - properties: + expr: + type: string + required: + - expr + type: object + - type: boolean + enum: + - false + - true + - type: string + enum: + - create + - update + ui:disabled: + oneOf: + - properties: + expr: + type: string + required: + - expr + type: object + - type: boolean + enum: + - false + - true + - type: string + enum: + - create + - update + ui:description: + oneOf: + - type: string + - properties: + expr: + type: string + required: + - expr + type: object + ui:formatted-value: + properties: + expr: + type: string + required: + - expr + type: object + ui:paid-only: + type: boolean + enum: + - false + - true + ui:placeholder: + type: string + required: + - items + - type + - ui:control + - ui:options + type: object + - properties: + type: + type: string + enum: + - string + ui:control: + type: string + enum: + - vercel-region + ui:options: + items: + oneOf: + - properties: + value: + type: string + label: + type: string + description: + type: string + disabled: + oneOf: + - properties: + expr: + type: string + required: + - expr + type: object + - type: boolean + enum: + - false + - true + - type: string + enum: + - create + - update + hidden: + oneOf: + - properties: + expr: + type: string + required: + - expr + type: object + - type: boolean + enum: + - false + - true + - type: string + enum: + - create + - update + required: + - label + - value + type: object + - type: string + - properties: + value: + type: string + description: + type: string + disabled: + oneOf: + - properties: + expr: + type: string + required: + - expr + type: object + - type: boolean + enum: + - false + - true + - type: string + enum: + - create + - update + hidden: + oneOf: + - properties: + expr: + type: string + required: + - expr + type: object + - type: boolean + enum: + - false + - true + - type: string + enum: + - create + - update + required: + - value + type: object + type: array + description: + type: string + enum: + items: + type: string + type: array + maxLength: + type: number + minLength: + type: number + pattern: + type: string + default: + type: string + ui:label: + type: string + ui:read-only: + oneOf: + - properties: + expr: + type: string + required: + - expr + type: object + - type: boolean + enum: + - false + - true + - type: string + enum: + - create + - update + ui:hidden: + oneOf: + - properties: + expr: + type: string + required: + - expr + type: object + - type: boolean + enum: + - false + - true + - type: string + enum: + - create + - update + ui:disabled: + oneOf: + - properties: + expr: + type: string + required: + - expr + type: object + - type: boolean + enum: + - false + - true + - type: string + enum: + - create + - update + ui:description: + oneOf: + - type: string + - properties: + expr: + type: string + required: + - expr + type: object + ui:formatted-value: + properties: + expr: + type: string + required: + - expr + type: object + ui:paid-only: + type: boolean + enum: + - false + - true + ui:placeholder: + type: string + required: + - type + - ui:control + - ui:options + type: object + - properties: + type: + type: string + enum: + - array + items: + properties: + type: + type: string + enum: + - string + description: + type: string + enum: + items: + type: string + type: array + maxLength: + type: number + minLength: + type: number + pattern: + type: string + default: + type: string + required: + - type + type: object + ui:control: + type: string + enum: + - multi-vercel-region + ui:options: + items: + oneOf: + - properties: + value: + type: string + label: + type: string + description: + type: string + disabled: + oneOf: + - properties: + expr: + type: string + required: + - expr + type: object + - type: boolean + enum: + - false + - true + - type: string + enum: + - create + - update + hidden: + oneOf: + - properties: + expr: + type: string + required: + - expr + type: object + - type: boolean + enum: + - false + - true + - type: string + enum: + - create + - update + required: + - label + - value + type: object + - type: string + - properties: + value: + type: string + description: + type: string + disabled: + oneOf: + - properties: + expr: + type: string + required: + - expr + type: object + - type: boolean + enum: + - false + - true + - type: string + enum: + - create + - update + hidden: + oneOf: + - properties: + expr: + type: string + required: + - expr + type: object + - type: boolean + enum: + - false + - true + - type: string + enum: + - create + - update + required: + - value + type: object + type: array + description: + type: string + maxItems: + type: number + minItems: + type: number + default: + items: + type: string + type: array + example: + items: + type: string + type: array + ui:label: + type: string + ui:read-only: + oneOf: + - properties: + expr: + type: string + required: + - expr + type: object + - type: boolean + enum: + - false + - true + - type: string + enum: + - create + - update + ui:hidden: + oneOf: + - properties: + expr: + type: string + required: + - expr + type: object + - type: boolean + enum: + - false + - true + - type: string + enum: + - create + - update + ui:disabled: + oneOf: + - properties: + expr: + type: string + required: + - expr + type: object + - type: boolean + enum: + - false + - true + - type: string + enum: + - create + - update + ui:description: + oneOf: + - type: string + - properties: + expr: + type: string + required: + - expr + type: object + ui:formatted-value: + properties: + expr: + type: string + required: + - expr + type: object + ui:paid-only: + type: boolean + enum: + - false + - true + ui:placeholder: + type: string + required: + - items + - type + - ui:control + - ui:options + type: object + - properties: + type: + type: string + enum: + - string + ui:control: + type: string + enum: + - vercel-country + ui:options: + items: + oneOf: + - properties: + value: + type: string + label: + type: string + description: + type: string + disabled: + oneOf: + - properties: + expr: + type: string + required: + - expr + type: object + - type: boolean + enum: + - false + - true + - type: string + enum: + - create + - update + hidden: + oneOf: + - properties: + expr: + type: string + required: + - expr + type: object + - type: boolean + enum: + - false + - true + - type: string + enum: + - create + - update + required: + - label + - value + type: object + - type: string + - properties: + value: + type: string + description: + type: string + disabled: + oneOf: + - properties: + expr: + type: string + required: + - expr + type: object + - type: boolean + enum: + - false + - true + - type: string + enum: + - create + - update + hidden: + oneOf: + - properties: + expr: + type: string + required: + - expr + type: object + - type: boolean + enum: + - false + - true + - type: string + enum: + - create + - update + required: + - value + type: object + type: array + description: + type: string + enum: + items: + type: string + type: array + maxLength: + type: number + minLength: + type: number + pattern: + type: string + default: + type: string + ui:label: + type: string + ui:read-only: + oneOf: + - properties: + expr: + type: string + required: + - expr + type: object + - type: boolean + enum: + - false + - true + - type: string + enum: + - create + - update + ui:hidden: + oneOf: + - properties: + expr: + type: string + required: + - expr + type: object + - type: boolean + enum: + - false + - true + - type: string + enum: + - create + - update + ui:disabled: + oneOf: + - properties: + expr: + type: string + required: + - expr + type: object + - type: boolean + enum: + - false + - true + - type: string + enum: + - create + - update + ui:description: + oneOf: + - type: string + - properties: + expr: + type: string + required: + - expr + type: object + ui:formatted-value: + properties: + expr: + type: string + required: + - expr + type: object + ui:paid-only: + type: boolean + enum: + - false + - true + ui:placeholder: + type: string + required: + - type + - ui:control + - ui:options + type: object + - properties: + type: + type: string + enum: + - string + ui:control: + type: string + enum: + - domain + description: + type: string + enum: + items: + type: string + type: array + maxLength: + type: number + minLength: + type: number + pattern: + type: string + default: + type: string + ui:label: + type: string + ui:read-only: + oneOf: + - properties: + expr: + type: string + required: + - expr + type: object + - type: boolean + enum: + - false + - true + - type: string + enum: + - create + - update + ui:hidden: + oneOf: + - properties: + expr: + type: string + required: + - expr + type: object + - type: boolean + enum: + - false + - true + - type: string + enum: + - create + - update + ui:disabled: + oneOf: + - properties: + expr: + type: string + required: + - expr + type: object + - type: boolean + enum: + - false + - true + - type: string + enum: + - create + - update + ui:description: + oneOf: + - type: string + - properties: + expr: + type: string + required: + - expr + type: object + ui:formatted-value: + properties: + expr: + type: string + required: + - expr + type: object + ui:paid-only: + type: boolean + enum: + - false + - true + ui:placeholder: + type: string + required: + - type + - ui:control + type: object + - properties: + type: + type: string + enum: + - string + ui:control: + type: string + enum: + - git-namespace + description: + type: string + ui:label: + type: string + ui:read-only: + oneOf: + - properties: + expr: + type: string + required: + - expr + type: object + - type: boolean + enum: + - false + - true + - type: string + enum: + - create + - update + ui:hidden: + oneOf: + - properties: + expr: + type: string + required: + - expr + type: object + - type: boolean + enum: + - false + - true + - type: string + enum: + - create + - update + ui:disabled: + oneOf: + - properties: + expr: + type: string + required: + - expr + type: object + - type: boolean + enum: + - false + - true + - type: string + enum: + - create + - update + ui:description: + oneOf: + - type: string + - properties: + expr: + type: string + required: + - expr + type: object + ui:formatted-value: + properties: + expr: + type: string + required: + - expr + type: object + ui:paid-only: + type: boolean + enum: + - false + - true + ui:placeholder: + type: string + git:providers: + items: + type: string + enum: + - bitbucket + - github + - gitlab + type: array + required: + - type + - ui:control + type: object + type: object + required: + items: + type: string + type: array + ui:order: + items: + type: string + type: array required: - - id - - name + - properties + - type type: object - ownerType: - type: string - enum: - - user - - team - private: - type: boolean - defaultBranch: - type: string - updatedAt: - type: number required: - id - - provider - - url + - metadataSchema - name + - protocols - slug - - namespace - - owner - - ownerType - - private - - defaultBranch - - updatedAt type: object type: array + integration: + properties: + id: + type: string + slug: + type: string + name: + type: string + required: + - id + - name + - slug + type: object + configuration: + properties: + id: + type: string + required: + - id + type: object required: - - gitAccount - - repos + - configuration + - integration + - products type: object '400': description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. '403': description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + '500': + description: '' parameters: - - name: query - in: query + - name: id + description: ID of the integration configuration + in: path + required: true schema: type: string - - name: namespaceId + description: ID of the integration configuration + example: icfg_cuwj0AdCdH3BwWT4LPijCC7t + - description: The Team identifier to perform the request on behalf of. in: query + name: teamId schema: type: string - nullable: true - - name: provider - in: query - schema: - enum: - - github - - github-custom-host - - gitlab - - bitbucket - - name: installationId + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. in: query + name: slug schema: type: string - - name: host - description: 'The custom Git host if using a custom Git provider, like GitHub Enterprise Server' + example: my-team-url-slug + /v1/storage/stores/integration/direct: + post: + description: Creates an integration store with automatic billing plan handling. For free resources, omit `billingPlanId` to auto-discover free plans. For paid resources, provide a `billingPlanId` from the billing plans endpoint. + operationId: createIntegrationStoreDirect + security: + - bearerToken: [] + summary: Create integration store (free and paid plans) + tags: + - integrations + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + store: + nullable: true + type: object + properties: + projectsMetadata: + items: + properties: + id: + type: string + projectId: + type: string + name: + type: string + framework: + nullable: true + type: string + enum: + - actix-web + - angular + - ash + - astro + - axum + - blitzjs + - brunch + - bun + - container + - create-react-app + - django + - docusaurus + - docusaurus-2 + - dojo + - eleventy + - elysia + - ember + - eve + - express + - factory-eve + - fastapi + - fasthtml + - fastify + - flask + - gatsby + - go + - gridsome + - h3 + - hexo + - hono + - hugo + - hydrogen + - ionic-angular + - ionic-react + - jekyll + - koa + - mastra + - middleman + - nestjs + - nextjs + - nitro + - node + - nuxtjs + - parcel + - polymer + - preact + - python + - react-router + - redwoodjs + - remix + - ruby + - rust + - saber + - sanity + - sanity-v2 + - sapper + - scully + - services + - solidstart + - solidstart-1 + - stencil + - storybook + - svelte + - sveltekit + - sveltekit-1 + - tanstack-start + - tanstack-start-lovable + - umijs + - vite + - vitepress + - vue + - vuepress + - xmcp + - zola + - null + latestDeployment: + type: string + environments: + items: + type: string + type: array + envVarPrefix: + nullable: true + type: string + environmentVariables: + items: + type: string + type: array + deployments: + properties: + required: + type: boolean + enum: + - false + - true + actions: + items: + properties: + slug: + type: string + environments: + items: + type: string + type: array + required: + - environments + - slug + type: object + type: array + required: + - actions + - required + type: object + makeEnvVarsSensitive: + type: boolean + enum: + - false + - true + required: + - envVarPrefix + - environmentVariables + - environments + - id + - name + - projectId + type: object + type: array + projectFilter: + properties: + git: + properties: + providers: + oneOf: + - items: + type: string + enum: + - bitbucket + - github + - gitlab + type: array + - type: string + enum: + - '*' + owners: + items: + type: string + type: array + repos: + items: + type: string + type: array + required: + - providers + type: object + type: object + totalConnectedProjects: + type: number + usageQuotaExceeded: + type: boolean + enum: + - false + - true + status: + nullable: true + type: string + enum: + - available + - error + - initializing + - limits-exceeded-suspended + - limits-exceeded-suspended-store-count + - onboarding + - suspended + - uninstalled + - null + ownership: + type: string + enum: + - linked + - owned + - sandbox + capabilities: + properties: + mcp: + type: boolean + enum: + - false + - true + mcpReadonly: + type: boolean + enum: + - false + - true + sso: + type: boolean + enum: + - false + - true + billable: + type: boolean + enum: + - false + - true + transferable: + type: boolean + enum: + - false + - true + secretsSync: + type: boolean + enum: + - false + - true + secretRotation: + oneOf: + - properties: + maxDelayHours: + type: number + customRotationWarning: + type: string + required: + - maxDelayHours + type: object + - type: boolean + enum: + - false + projects: + type: boolean + enum: + - false + - true + v0: + type: boolean + enum: + - false + - true + autoSensitive: + type: boolean + enum: + - false + - true + agentTools: + type: boolean + enum: + - false + - true + type: object + metadata: + additionalProperties: + oneOf: + - type: string + - type: number + - items: + type: string + type: array + - items: + type: number + type: array + - type: boolean + enum: + - false + - true + type: object + externalResourceId: + type: string + externalResourceStatus: + nullable: true + type: string + enum: + - error + - onboarding + - pending + - ready + - resumed + - suspended + - uninstalled + - null + directPartnerConsoleUrl: + type: string + product: + properties: + id: + type: string + name: + type: string + slug: + type: string + iconUrl: + type: string + capabilities: + properties: + mcp: + type: boolean + enum: + - false + - true + mcpReadonly: + type: boolean + enum: + - false + - true + sso: + type: boolean + enum: + - false + - true + billable: + type: boolean + enum: + - false + - true + transferable: + type: boolean + enum: + - false + - true + secretsSync: + type: boolean + enum: + - false + - true + secretRotation: + oneOf: + - properties: + maxDelayHours: + type: number + customRotationWarning: + type: string + required: + - maxDelayHours + type: object + - type: boolean + enum: + - false + sandbox: + type: boolean + enum: + - false + - true + linking: + type: boolean + enum: + - false + - true + projects: + type: boolean + enum: + - false + - true + v0: + type: boolean + enum: + - false + - true + importResource: + type: boolean + enum: + - false + - true + connectedImportResource: + type: boolean + enum: + - false + - true + nativeImportResource: + type: boolean + enum: + - false + - true + databaseUI: + type: boolean + enum: + - false + - true + v0Flavors: + type: boolean + enum: + - false + - true + autoSensitive: + type: boolean + enum: + - false + - true + agentTools: + type: boolean + enum: + - false + - true + type: object + shortDescription: + type: string + metadataSchema: + properties: + type: + type: string + enum: + - object + properties: + additionalProperties: + oneOf: + - properties: + type: + type: string + enum: + - string + ui:control: + type: string + enum: + - input + default: + type: string + enum: + items: + type: string + type: array + maxLength: + type: number + minLength: + type: number + pattern: + type: string + description: + type: string + ui:label: + type: string + ui:read-only: + oneOf: + - properties: + expr: + type: string + required: + - expr + type: object + - type: boolean + enum: + - false + - true + - type: string + enum: + - create + - update + ui:hidden: + oneOf: + - properties: + expr: + type: string + required: + - expr + type: object + - type: boolean + enum: + - false + - true + - type: string + enum: + - create + - update + ui:disabled: + oneOf: + - properties: + expr: + type: string + required: + - expr + type: object + - type: boolean + enum: + - false + - true + - type: string + enum: + - create + - update + ui:description: + oneOf: + - type: string + - properties: + expr: + type: string + required: + - expr + type: object + ui:formatted-value: + properties: + expr: + type: string + required: + - expr + type: object + ui:paid-only: + type: boolean + enum: + - false + - true + ui:placeholder: + type: string + required: + - type + - ui:control + type: object + - properties: + type: + type: string + enum: + - number + ui:control: + type: string + enum: + - input + default: + type: number + maximum: + type: number + exclusiveMaximum: + type: number + minimum: + type: number + exclusiveMinimum: + type: number + description: + type: string + ui:label: + type: string + ui:read-only: + oneOf: + - properties: + expr: + type: string + required: + - expr + type: object + - type: boolean + enum: + - false + - true + - type: string + enum: + - create + - update + ui:hidden: + oneOf: + - properties: + expr: + type: string + required: + - expr + type: object + - type: boolean + enum: + - false + - true + - type: string + enum: + - create + - update + ui:disabled: + oneOf: + - properties: + expr: + type: string + required: + - expr + type: object + - type: boolean + enum: + - false + - true + - type: string + enum: + - create + - update + ui:description: + oneOf: + - type: string + - properties: + expr: + type: string + required: + - expr + type: object + ui:formatted-value: + properties: + expr: + type: string + required: + - expr + type: object + ui:paid-only: + type: boolean + enum: + - false + - true + ui:placeholder: + type: string + required: + - type + - ui:control + type: object + - properties: + type: + type: string + enum: + - boolean + ui:control: + type: string + enum: + - toggle + default: + type: boolean + enum: + - false + - true + description: + type: string + ui:label: + type: string + ui:read-only: + oneOf: + - properties: + expr: + type: string + required: + - expr + type: object + - type: boolean + enum: + - false + - true + - type: string + enum: + - create + - update + ui:hidden: + oneOf: + - properties: + expr: + type: string + required: + - expr + type: object + - type: boolean + enum: + - false + - true + - type: string + enum: + - create + - update + ui:disabled: + oneOf: + - properties: + expr: + type: string + required: + - expr + type: object + - type: boolean + enum: + - false + - true + - type: string + enum: + - create + - update + ui:description: + oneOf: + - type: string + - properties: + expr: + type: string + required: + - expr + type: object + ui:formatted-value: + properties: + expr: + type: string + required: + - expr + type: object + ui:paid-only: + type: boolean + enum: + - false + - true + required: + - type + - ui:control + type: object + - properties: + type: + type: string + enum: + - array + items: + properties: + type: + type: string + enum: + - number + default: + type: number + maximum: + type: number + exclusiveMaximum: + type: number + minimum: + type: number + exclusiveMinimum: + type: number + description: + type: string + required: + - type + type: object + ui:control: + type: string + enum: + - slider + ui:steps: + items: + type: number + type: array + default: + items: + type: number + type: array + maxItems: + type: number + minItems: + type: number + description: + type: string + ui:label: + type: string + ui:read-only: + oneOf: + - properties: + expr: + type: string + required: + - expr + type: object + - type: boolean + enum: + - false + - true + - type: string + enum: + - create + - update + ui:hidden: + oneOf: + - properties: + expr: + type: string + required: + - expr + type: object + - type: boolean + enum: + - false + - true + - type: string + enum: + - create + - update + ui:disabled: + oneOf: + - properties: + expr: + type: string + required: + - expr + type: object + - type: boolean + enum: + - false + - true + - type: string + enum: + - create + - update + ui:description: + oneOf: + - type: string + - properties: + expr: + type: string + required: + - expr + type: object + ui:formatted-value: + properties: + expr: + type: string + required: + - expr + type: object + ui:paid-only: + type: boolean + enum: + - false + - true + required: + - items + - type + - ui:control + - ui:steps + type: object + - properties: + type: + type: string + enum: + - string + ui:control: + type: string + enum: + - select + ui:options: + items: + properties: + value: + type: string + label: + type: string + description: + type: string + disabled: + oneOf: + - properties: + expr: + type: string + required: + - expr + type: object + - type: boolean + enum: + - false + - true + - type: string + enum: + - create + - update + hidden: + oneOf: + - properties: + expr: + type: string + required: + - expr + type: object + - type: boolean + enum: + - false + - true + - type: string + enum: + - create + - update + required: + - label + - value + type: object + type: array + default: + type: string + enum: + items: + type: string + type: array + maxLength: + type: number + minLength: + type: number + pattern: + type: string + description: + type: string + ui:label: + type: string + ui:read-only: + oneOf: + - properties: + expr: + type: string + required: + - expr + type: object + - type: boolean + enum: + - false + - true + - type: string + enum: + - create + - update + ui:hidden: + oneOf: + - properties: + expr: + type: string + required: + - expr + type: object + - type: boolean + enum: + - false + - true + - type: string + enum: + - create + - update + ui:disabled: + oneOf: + - properties: + expr: + type: string + required: + - expr + type: object + - type: boolean + enum: + - false + - true + - type: string + enum: + - create + - update + ui:description: + oneOf: + - type: string + - properties: + expr: + type: string + required: + - expr + type: object + ui:formatted-value: + properties: + expr: + type: string + required: + - expr + type: object + ui:paid-only: + type: boolean + enum: + - false + - true + ui:placeholder: + type: string + required: + - type + - ui:control + - ui:options + type: object + - properties: + type: + type: string + enum: + - string + ui:control: + type: string + enum: + - radio-button + ui:options: + items: + properties: + value: + type: string + label: + type: string + description: + type: string + disabled: + oneOf: + - properties: + expr: + type: string + required: + - expr + type: object + - type: boolean + enum: + - false + - true + - type: string + enum: + - create + - update + hidden: + oneOf: + - properties: + expr: + type: string + required: + - expr + type: object + - type: boolean + enum: + - false + - true + - type: string + enum: + - create + - update + required: + - label + - value + type: object + type: array + default: + type: string + enum: + items: + type: string + type: array + maxLength: + type: number + minLength: + type: number + pattern: + type: string + description: + type: string + ui:label: + type: string + ui:read-only: + oneOf: + - properties: + expr: + type: string + required: + - expr + type: object + - type: boolean + enum: + - false + - true + - type: string + enum: + - create + - update + ui:hidden: + oneOf: + - properties: + expr: + type: string + required: + - expr + type: object + - type: boolean + enum: + - false + - true + - type: string + enum: + - create + - update + ui:disabled: + oneOf: + - properties: + expr: + type: string + required: + - expr + type: object + - type: boolean + enum: + - false + - true + - type: string + enum: + - create + - update + ui:description: + oneOf: + - type: string + - properties: + expr: + type: string + required: + - expr + type: object + ui:formatted-value: + properties: + expr: + type: string + required: + - expr + type: object + ui:paid-only: + type: boolean + enum: + - false + - true + ui:placeholder: + type: string + required: + - type + - ui:control + - ui:options + type: object + - properties: + type: + type: string + enum: + - array + items: + properties: + type: + type: string + enum: + - string + default: + type: string + enum: + items: + type: string + type: array + maxLength: + type: number + minLength: + type: number + pattern: + type: string + description: + type: string + required: + - type + type: object + ui:control: + type: string + enum: + - multi-select + ui:options: + items: + properties: + value: + type: string + label: + type: string + description: + type: string + disabled: + oneOf: + - properties: + expr: + type: string + required: + - expr + type: object + - type: boolean + enum: + - false + - true + - type: string + enum: + - create + - update + hidden: + oneOf: + - properties: + expr: + type: string + required: + - expr + type: object + - type: boolean + enum: + - false + - true + - type: string + enum: + - create + - update + required: + - label + - value + type: object + type: array + default: + items: + type: string + type: array + maxItems: + type: number + minItems: + type: number + description: + type: string + ui:label: + type: string + ui:read-only: + oneOf: + - properties: + expr: + type: string + required: + - expr + type: object + - type: boolean + enum: + - false + - true + - type: string + enum: + - create + - update + ui:hidden: + oneOf: + - properties: + expr: + type: string + required: + - expr + type: object + - type: boolean + enum: + - false + - true + - type: string + enum: + - create + - update + ui:disabled: + oneOf: + - properties: + expr: + type: string + required: + - expr + type: object + - type: boolean + enum: + - false + - true + - type: string + enum: + - create + - update + ui:description: + oneOf: + - type: string + - properties: + expr: + type: string + required: + - expr + type: object + ui:formatted-value: + properties: + expr: + type: string + required: + - expr + type: object + ui:paid-only: + type: boolean + enum: + - false + - true + ui:placeholder: + type: string + example: + items: + type: string + type: array + required: + - items + - type + - ui:control + - ui:options + type: object + - properties: + type: + type: string + enum: + - string + ui:control: + type: string + enum: + - vercel-region + ui:options: + items: + oneOf: + - properties: + value: + type: string + label: + type: string + description: + type: string + disabled: + oneOf: + - properties: + expr: + type: string + required: + - expr + type: object + - type: boolean + enum: + - false + - true + - type: string + enum: + - create + - update + hidden: + oneOf: + - properties: + expr: + type: string + required: + - expr + type: object + - type: boolean + enum: + - false + - true + - type: string + enum: + - create + - update + required: + - label + - value + type: object + - type: string + - properties: + value: + type: string + description: + type: string + disabled: + oneOf: + - properties: + expr: + type: string + required: + - expr + type: object + - type: boolean + enum: + - false + - true + - type: string + enum: + - create + - update + hidden: + oneOf: + - properties: + expr: + type: string + required: + - expr + type: object + - type: boolean + enum: + - false + - true + - type: string + enum: + - create + - update + required: + - value + type: object + type: array + default: + type: string + enum: + items: + type: string + type: array + maxLength: + type: number + minLength: + type: number + pattern: + type: string + description: + type: string + ui:label: + type: string + ui:read-only: + oneOf: + - properties: + expr: + type: string + required: + - expr + type: object + - type: boolean + enum: + - false + - true + - type: string + enum: + - create + - update + ui:hidden: + oneOf: + - properties: + expr: + type: string + required: + - expr + type: object + - type: boolean + enum: + - false + - true + - type: string + enum: + - create + - update + ui:disabled: + oneOf: + - properties: + expr: + type: string + required: + - expr + type: object + - type: boolean + enum: + - false + - true + - type: string + enum: + - create + - update + ui:description: + oneOf: + - type: string + - properties: + expr: + type: string + required: + - expr + type: object + ui:formatted-value: + properties: + expr: + type: string + required: + - expr + type: object + ui:paid-only: + type: boolean + enum: + - false + - true + ui:placeholder: + type: string + required: + - type + - ui:control + - ui:options + type: object + - properties: + type: + type: string + enum: + - array + items: + properties: + type: + type: string + enum: + - string + default: + type: string + enum: + items: + type: string + type: array + maxLength: + type: number + minLength: + type: number + pattern: + type: string + description: + type: string + required: + - type + type: object + ui:control: + type: string + enum: + - multi-vercel-region + ui:options: + items: + oneOf: + - properties: + value: + type: string + label: + type: string + description: + type: string + disabled: + oneOf: + - properties: + expr: + type: string + required: + - expr + type: object + - type: boolean + enum: + - false + - true + - type: string + enum: + - create + - update + hidden: + oneOf: + - properties: + expr: + type: string + required: + - expr + type: object + - type: boolean + enum: + - false + - true + - type: string + enum: + - create + - update + required: + - label + - value + type: object + - type: string + - properties: + value: + type: string + description: + type: string + disabled: + oneOf: + - properties: + expr: + type: string + required: + - expr + type: object + - type: boolean + enum: + - false + - true + - type: string + enum: + - create + - update + hidden: + oneOf: + - properties: + expr: + type: string + required: + - expr + type: object + - type: boolean + enum: + - false + - true + - type: string + enum: + - create + - update + required: + - value + type: object + type: array + default: + items: + type: string + type: array + maxItems: + type: number + minItems: + type: number + description: + type: string + ui:label: + type: string + ui:read-only: + oneOf: + - properties: + expr: + type: string + required: + - expr + type: object + - type: boolean + enum: + - false + - true + - type: string + enum: + - create + - update + ui:hidden: + oneOf: + - properties: + expr: + type: string + required: + - expr + type: object + - type: boolean + enum: + - false + - true + - type: string + enum: + - create + - update + ui:disabled: + oneOf: + - properties: + expr: + type: string + required: + - expr + type: object + - type: boolean + enum: + - false + - true + - type: string + enum: + - create + - update + ui:description: + oneOf: + - type: string + - properties: + expr: + type: string + required: + - expr + type: object + ui:formatted-value: + properties: + expr: + type: string + required: + - expr + type: object + ui:paid-only: + type: boolean + enum: + - false + - true + ui:placeholder: + type: string + example: + items: + type: string + type: array + required: + - items + - type + - ui:control + - ui:options + type: object + - properties: + type: + type: string + enum: + - string + ui:control: + type: string + enum: + - vercel-country + ui:options: + items: + oneOf: + - properties: + value: + type: string + label: + type: string + description: + type: string + disabled: + oneOf: + - properties: + expr: + type: string + required: + - expr + type: object + - type: boolean + enum: + - false + - true + - type: string + enum: + - create + - update + hidden: + oneOf: + - properties: + expr: + type: string + required: + - expr + type: object + - type: boolean + enum: + - false + - true + - type: string + enum: + - create + - update + required: + - label + - value + type: object + - type: string + - properties: + value: + type: string + description: + type: string + disabled: + oneOf: + - properties: + expr: + type: string + required: + - expr + type: object + - type: boolean + enum: + - false + - true + - type: string + enum: + - create + - update + hidden: + oneOf: + - properties: + expr: + type: string + required: + - expr + type: object + - type: boolean + enum: + - false + - true + - type: string + enum: + - create + - update + required: + - value + type: object + type: array + default: + type: string + enum: + items: + type: string + type: array + maxLength: + type: number + minLength: + type: number + pattern: + type: string + description: + type: string + ui:label: + type: string + ui:read-only: + oneOf: + - properties: + expr: + type: string + required: + - expr + type: object + - type: boolean + enum: + - false + - true + - type: string + enum: + - create + - update + ui:hidden: + oneOf: + - properties: + expr: + type: string + required: + - expr + type: object + - type: boolean + enum: + - false + - true + - type: string + enum: + - create + - update + ui:disabled: + oneOf: + - properties: + expr: + type: string + required: + - expr + type: object + - type: boolean + enum: + - false + - true + - type: string + enum: + - create + - update + ui:description: + oneOf: + - type: string + - properties: + expr: + type: string + required: + - expr + type: object + ui:formatted-value: + properties: + expr: + type: string + required: + - expr + type: object + ui:paid-only: + type: boolean + enum: + - false + - true + ui:placeholder: + type: string + required: + - type + - ui:control + - ui:options + type: object + - properties: + type: + type: string + enum: + - string + ui:control: + type: string + enum: + - domain + default: + type: string + enum: + items: + type: string + type: array + maxLength: + type: number + minLength: + type: number + pattern: + type: string + description: + type: string + ui:label: + type: string + ui:read-only: + oneOf: + - properties: + expr: + type: string + required: + - expr + type: object + - type: boolean + enum: + - false + - true + - type: string + enum: + - create + - update + ui:hidden: + oneOf: + - properties: + expr: + type: string + required: + - expr + type: object + - type: boolean + enum: + - false + - true + - type: string + enum: + - create + - update + ui:disabled: + oneOf: + - properties: + expr: + type: string + required: + - expr + type: object + - type: boolean + enum: + - false + - true + - type: string + enum: + - create + - update + ui:description: + oneOf: + - type: string + - properties: + expr: + type: string + required: + - expr + type: object + ui:formatted-value: + properties: + expr: + type: string + required: + - expr + type: object + ui:paid-only: + type: boolean + enum: + - false + - true + ui:placeholder: + type: string + required: + - type + - ui:control + type: object + - properties: + type: + type: string + enum: + - string + ui:control: + type: string + enum: + - git-namespace + description: + type: string + ui:label: + type: string + ui:read-only: + oneOf: + - properties: + expr: + type: string + required: + - expr + type: object + - type: boolean + enum: + - false + - true + - type: string + enum: + - create + - update + ui:hidden: + oneOf: + - properties: + expr: + type: string + required: + - expr + type: object + - type: boolean + enum: + - false + - true + - type: string + enum: + - create + - update + ui:disabled: + oneOf: + - properties: + expr: + type: string + required: + - expr + type: object + - type: boolean + enum: + - false + - true + - type: string + enum: + - create + - update + ui:description: + oneOf: + - type: string + - properties: + expr: + type: string + required: + - expr + type: object + ui:formatted-value: + properties: + expr: + type: string + required: + - expr + type: object + ui:paid-only: + type: boolean + enum: + - false + - true + ui:placeholder: + type: string + git:providers: + items: + type: string + enum: + - bitbucket + - github + - gitlab + type: array + required: + - type + - ui:control + type: object + type: object + required: + items: + type: string + type: array + ui:order: + items: + type: string + type: array + required: + - properties + - type + type: object + resourceLinks: + items: + properties: + href: + type: string + title: + type: string + required: + - href + - title + type: object + type: array + tags: + items: + type: string + enum: + - ai + - authentication + - blob + - checks + - drains + - edge-config + - experimentation + - kv + - libsql + - logDrain + - mcp + - messaging + - mysql + - observability + - other + - postgres + - rds + - redis + - sqlite + - storage + - tag_agents + - tag_ai + - tag_analytics + - tag_authentication + - tag_checks + - tag_cms + - tag_code_repository + - tag_code_review + - tag_code_security + - tag_code_testing + - tag_commerce + - tag_databases + - tag_dev_tools + - tag_experimentation + - tag_flags + - tag_logDrain + - tag_logging + - tag_messaging + - tag_monitoring + - tag_observability + - tag_other + - tag_payments + - tag_performance + - tag_productivity + - tag_searching + - tag_security + - tag_storage + - tag_support_agent + - tag_testing + - tag_traceDrain + - tag_video + - tag_web_automation + - tag_workflow + - traceDrain + - vector + - video + - workflow + type: array + projectConnectionScopes: + items: + type: string + enum: + - read-write:deployment + - read-write:deployment-check + - read-write:domain + - read-write:drains + - read-write:global-project-env-vars + - read-write:integration-deployment-action + - read-write:log-drain + - read-write:project-env-vars + - read-write:project-protection-bypass + - read:deployment + - read:domain + - read:project + type: array + showSSOLinkOnProjectConnection: + type: boolean + enum: + - false + - true + disableResourceRenaming: + type: boolean + enum: + - false + - true + resourceTitle: + type: string + description: Custom resource title to display during installation and configuration. If not provided, defaults to protocol-based defaults. + example: Instance + agentSkills: + items: + type: string + type: array + description: URLs to skills/guides for how AI agents should use this product. Providers can specify these to help agents understand how to interact with their integration. + repl: + properties: + enabled: + type: boolean + enum: + - false + - true + supportsReadOnlyMode: + type: boolean + enum: + - false + - true + welcomeMessage: + type: string + required: + - enabled + - supportsReadOnlyMode + type: object + guides: + items: + properties: + framework: + type: string + title: + type: string + steps: + items: + properties: + title: + type: string + content: + type: string + actions: + items: + properties: + type: + type: string + enum: + - add_drain + - configure_project_connections + - connect_to_project + required: + - type + type: object + type: array + required: + - content + - title + type: object + type: array + required: + - framework + - steps + - title + type: object + type: array + integration: + properties: + id: + type: string + name: + type: string + slug: + type: string + supportsInstallationBillingPlans: + type: boolean + enum: + - false + - true + icon: + type: string + capabilities: + properties: + provisioning: + type: boolean + enum: + - false + - true + mcp: + type: boolean + enum: + - false + - true + mcpReadonly: + type: boolean + enum: + - false + - true + sso: + type: boolean + enum: + - false + - true + billable: + type: boolean + enum: + - false + - true + transferable: + type: boolean + enum: + - false + - true + templateCloneOnly: + type: boolean + enum: + - false + - true + checks: + type: boolean + enum: + - false + - true + connectedProvisioning: + type: boolean + enum: + - false + - true + secretRotation: + oneOf: + - properties: + maxDelayHours: + type: number + customRotationWarning: + type: string + required: + - maxDelayHours + type: object + - type: boolean + enum: + - false + importResource: + type: boolean + enum: + - false + - true + connectedImportResource: + type: boolean + enum: + - false + - true + nativeImportResource: + type: boolean + enum: + - false + - true + requiresBrowserInstall: + type: boolean + enum: + - false + - true + v0Flavors: + type: boolean + enum: + - false + - true + flexCommitEligible: + type: boolean + enum: + - false + - true + updateConfiguration: + type: boolean + enum: + - false + - true + maxAllowedTeams: + type: number + type: object + flags: + items: + type: string + type: array + required: + - icon + - id + - name + - slug + type: object + integrationConfigurationId: + type: string + supportedProtocols: + items: + type: string + enum: + - ai + - authentication + - checks + - experimentation + - logDrain + - messaging + - observability + - other + - storage + - traceDrain + - video + - workflow + type: array + primaryProtocol: + type: string + enum: + - ai + - authentication + - checks + - experimentation + - logDrain + - messaging + - observability + - other + - storage + - traceDrain + - video + - workflow + logDrainStatus: + type: string + enum: + - disabled + - enabled + required: + - integration + - integrationConfigurationId + - supportedProtocols + type: object + protocolSettings: + properties: + experimentation: + properties: + edgeConfigSyncingEnabled: + type: boolean + enum: + - false + - true + edgeConfigId: + type: string + globalConfigId: + type: string + globalConfigSyncingEnabled: + type: boolean + enum: + - false + - true + edgeConfigTokenId: + type: string + type: object + authentication: + properties: + appUrls: + items: + properties: + url: + type: string + target: + type: string + enum: + - development + - preview + - production + required: + - target + - url + type: object + type: array + type: object + type: object + notification: + properties: + title: + type: string + level: + type: string + enum: + - error + - info + - warn + message: + type: string + href: + type: string + required: + - level + - title + type: object + secrets: + items: + properties: + name: + type: string + length: + type: number + frameworkPublishable: + type: boolean + enum: + - false + - true + required: + - length + - name + type: object + type: array + billingPlan: + properties: + id: + type: string + type: + type: string + enum: + - prepayment + - subscription + description: + type: string + name: + type: string + scope: + type: string + enum: + - installation + - resource + paymentMethodRequired: + type: boolean + enum: + - false + - true + preauthorizationAmount: + type: number + initialCharge: + type: string + minimumAmount: + type: string + maximumAmount: + type: string + maximumAmountAutoPurchasePerPeriod: + type: string + cost: + type: string + details: + items: + properties: + label: + type: string + value: + type: string + required: + - label + type: object + type: array + highlightedDetails: + items: + properties: + label: + type: string + value: + type: string + required: + - label + type: object + type: array + quote: + items: + properties: + line: + type: string + amount: + type: string + required: + - amount + - line + type: object + type: array + effectiveDate: + type: string + disabled: + type: boolean + enum: + - false + - true + required: + - description + - id + - name + - paymentMethodRequired + - scope + - type + type: object + secretRotationRequestedAt: + type: number + description: The timestamp when secret rotation was requested. + secretRotationRequestedReason: + type: string + description: The reason for the secret rotation request. + secretRotationRequestedBy: + type: string + description: The ID of the user/team who requested the secret rotation. + secretRotationCompletedAt: + type: number + description: The timestamp when secret rotation was completed. + parentId: + type: string + description: The ID of the parent resource. Used to establish a parent-child relationship between resources, such as sandbox resources linking to their owner account resource. + targets: + items: + type: string + enum: + - development + - preview + - production + description: The deployment targets that this resource is available for. + type: array + description: The deployment targets that this resource is available for. + required: + - externalResourceId + - product + - projectsMetadata + - secrets + - status + - usageQuotaExceeded + required: + - store + type: object + '400': + description: One of the provided values in the request body is invalid. + '401': + description: The request is not authorized. + '402': + description: The account is missing a payment so payment method must be updated + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '409': + description: '' + '410': + description: '' + '500': + description: '' + parameters: + - description: The Team identifier to perform the request on behalf of. in: query + name: teamId schema: - description: 'The custom Git host if using a custom Git provider, like GitHub Enterprise Server' type: string - example: ghes-test.now.systems - - description: The Team identifier or slug to perform the request on behalf of. + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. in: query - name: teamId - required: true + name: slug schema: type: string + example: my-team-url-slug + requestBody: + content: + application/json: + schema: + type: object + required: + - name + - integrationConfigurationId + - integrationProductIdOrSlug + properties: + name: + type: string + maxLength: 128 + description: Human-readable name for the storage resource + example: my-dev-database + integrationConfigurationId: + type: string + description: ID of your integration configuration. Get this from GET /v1/integrations/configurations + example: icfg_cuwj0AdCdH3BwWT4LPijCC7t + pattern: ^icfg_[a-zA-Z0-9]+$ + integrationProductIdOrSlug: + type: string + description: ID or slug of the integration product. Get available products from GET /v1/integrations/configuration/{id}/products + example: iap_postgres_db + pattern: ^iap_[a-zA-Z0-9_]+$ + metadata: + type: object + description: Optional key-value pairs for resource metadata + additionalProperties: + oneOf: + - type: string + - type: number + - type: boolean + - type: array + items: + type: string + - type: array + items: + type: number + example: + environment: development + project: my-app + tags: + - database + - postgres + externalId: + type: string + description: Optional external identifier for tracking purposes + example: dev-db-001 + protocolSettings: + type: object + description: Protocol-specific configuration settings + additionalProperties: true + example: + experimentation: + edgeConfigSyncingEnabled: true + source: + type: string + enum: + - marketplace + - deploy-button + - external + - v0 + - resource-claims + - cli + - oauth + - backoffice + - import-recommended-integrations + - organization + description: Source of the store creation request + example: marketplace + default: marketplace + billingPlanId: + type: string + description: ID of the billing plan for paid resources. Get available plans from GET /integrations/integration/{id}/products/{productId}/plans. If not provided, automatically discovers free billing plans. + example: bp_abc123def456 + paymentMethodId: + type: string + description: Payment method ID for paid resources. Optional - uses default payment method if not provided. + example: pm_1AbcDefGhiJklMno + prepaymentAmountCents: + type: number + minimum: 50 + description: Amount in cents for prepayment billing plans. Required only for prepayment plans with variable amounts. + example: 5000 +components: + schemas: + GitNamespacesResponse: + type: object + properties: + git_namespaces: + type: array + items: + properties: + provider: + type: string + slug: + type: string + id: + oneOf: + - type: string + - type: number + ownerType: + type: string + name: + type: string + isAccessRestricted: + type: boolean + enum: + - false + - true + installationId: + type: number + requireReauth: + type: boolean + enum: + - false + - true + viewer: + properties: + canCreateApp: + type: boolean + enum: + - false + - true + role: + oneOf: + - type: string + - type: number + type: object + required: + - id + - ownerType + - provider + - slug + type: object + GetConfigurationsResponse: + type: object + properties: + configurations: + type: array + items: + properties: + completedAt: + type: number + description: A timestamp that tells you when the configuration was installed successfully + example: 1558531915505 + createdAt: + type: number + description: A timestamp that tells you when the configuration was created + example: 1558531915505 + id: + type: string + description: The unique identifier of the configuration + example: icfg_3bwCLgxL8qt5kjRLcv2Dit7F + integrationId: + type: string + description: The unique identifier of the app the configuration was created for + example: oac_xzpVzcUOgcB1nrVlirtKhbWV + ownerId: + type: string + description: The user or team ID that owns the configuration + example: kr1PsOIzqEL5Xg6M4VZcZosf + status: + type: string + enum: + - error + - onboarding + - pending + - ready + - resumed + - suspended + - uninstalled + description: The configuration status. Optional. If not defined, assume 'ready'. + externalId: + type: string + description: An external identifier defined by the integration vendor. + projects: + items: + type: string + type: array + description: When a configuration is limited to access certain projects, this will contain each of the project ID it is allowed to access. If it is not defined, the configuration has full access. + example: + - prj_xQxbutw1HpL6HLYPAzt5h75m8NjO + source: + type: string + enum: + - backoffice + - cli + - deploy-button + - external + - import-recommended-integrations + - marketplace + - oauth + - organization + - resource-claims + - v0 + description: Source defines where the configuration was installed from. It is used to analyze user engagement for integration installations in product metrics. + example: marketplace + slug: + type: string + description: The slug of the integration the configuration is created for. + example: slack + teamId: + nullable: true + type: string + description: When the configuration was created for a team, this will show the ID of the team. + example: team_nLlpyC6RE1qxydlFKbrxDlud + type: + type: string + enum: + - integration-configuration + updatedAt: + type: number + description: A timestamp that tells you when the configuration was updated. + example: 1558531915505 + userId: + type: string + description: The ID of the user that created the configuration. + example: kr1PsOIzqEL5Xg6M4VZcZosf + scopes: + items: + type: string + type: array + description: The resources that are allowed to be accessed by the configuration. + example: + - read:project + - read-write:log-drain + disabledAt: + type: number + description: 'A timestamp that tells you when the configuration was disabled. Note: Configurations can be disabled when the associated user loses access to a team. They do not function during this time until the configuration is ''transferred'', meaning the associated user is changed to one with access to the team.' + example: 1558531915505 + deletedAt: + nullable: true + type: number + description: A timestamp that tells you when the configuration was deleted. + example: 1558531915505 + deleteRequestedAt: + nullable: true + type: number + description: A timestamp that tells you when the configuration deletion has been started for cases when the deletion needs to be settled/approved by partners, such as when marketplace invoices have been paid. + example: 1558531915505 + customerDeleteRequestedAt: + nullable: true + type: number + description: Record when the customer initited deletion, independent of whether `deleteRequestedAt` gets set. + disabledReason: + type: string + enum: + - account-plan-downgrade + - disabled-by-admin + - disabled-by-owner + - feature-not-available + - original-owner-left-the-team + - original-owner-role-downgraded + installationType: + type: string + enum: + - external + - marketplace + description: 'Defines the installation type. - ''external'' integrations are installed via the existing integrations flow - ''marketplace'' integrations are natively installed: - when accepting the TOS of a partner during the store creation process - if undefined, assume ''external''' + acceptedPoliciesInheritedFromInstallationId: + type: string + description: Historical parent installation from which acceptedPolicies were inherited. This is immutable provenance, not current authorization or relationship truth. + type: object + description: The list of configurations for the authenticated user + x-stackQL-resources: + git_namespaces: + id: vercel.integrations.git_namespaces + name: git_namespaces + title: Git Namespaces + methods: + list: + operation: + $ref: '#/paths/~1v1~1integrations~1git-namespaces/get' + response: + mediaType: application/json + openAPIDocKey: '200' + objectKey: $.git_namespaces + overrideMediaType: application/json + schema_override: + $ref: '#/components/schemas/GitNamespacesResponse' + transform: + body: |- + {{- $wrapped := printf "{\"git_namespaces\":%s}" . -}} + {{- $wrapped -}} + type: golang_template_text_v0.3.0 + request: + nativeCasing: camel + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/git_namespaces/methods/list' + insert: [] + update: [] + delete: [] + replace: [] + repos: + id: vercel.integrations.repos + name: repos + title: Repos + methods: + search: + operation: + $ref: '#/paths/~1v1~1integrations~1search-repo/get' + response: + mediaType: application/json + openAPIDocKey: '200' + objectKey: $.repos + request: + nativeCasing: camel + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/repos/methods/search' + insert: [] + update: [] + delete: [] + replace: [] + billing_plans: + id: vercel.integrations.billing_plans + name: billing_plans + title: Billing Plans + methods: + list: + operation: + $ref: '#/paths/~1v1~1integrations~1integration~1{integration_id_or_slug}~1products~1{product_id_or_slug}~1plans/get' + response: + mediaType: application/json + openAPIDocKey: '200' + objectKey: $.plans + request: + nativeCasing: camel + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/billing_plans/methods/list' + insert: [] + update: [] + delete: [] + replace: [] + configurations: + id: vercel.integrations.configurations + name: configurations + title: Configurations + methods: + connect_resource_to_project: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v1~1integrations~1installations~1{integration_configuration_id}~1resources~1{resource_id}~1connections/post' + response: + mediaType: application/json + openAPIDocKey: '201' + request: + nativeCasing: camel + list: + operation: + $ref: '#/paths/~1v1~1integrations~1configurations/get' + response: + mediaType: application/json + openAPIDocKey: '200' + objectKey: $.configurations + overrideMediaType: application/json + schema_override: + $ref: '#/components/schemas/GetConfigurationsResponse' + transform: + body: |- + {{- $wrapped := printf "{\"configurations\":%s}" . -}} + {{- $wrapped -}} + type: golang_template_text_v0.3.0 + request: + nativeCasing: camel + get: + operation: + $ref: '#/paths/~1v1~1integrations~1configuration~1{id}/get' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + delete: + operation: + $ref: '#/paths/~1v1~1integrations~1configuration~1{id}/delete' + response: + mediaType: application/json + openAPIDocKey: '204' + request: + nativeCasing: camel + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/configurations/methods/get' + - $ref: '#/components/x-stackQL-resources/configurations/methods/list' + insert: [] + update: [] + delete: + - $ref: '#/components/x-stackQL-resources/configurations/methods/delete' + replace: [] + configuration_products: + id: vercel.integrations.configuration_products + name: configuration_products + title: Configuration Products + methods: + list: + operation: + $ref: '#/paths/~1v1~1integrations~1configuration~1{id}~1products/get' + response: + mediaType: application/json + openAPIDocKey: '200' + objectKey: $.products + request: + nativeCasing: camel + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/configuration_products/methods/list' + insert: [] + update: [] + delete: [] + replace: [] + stores: + id: vercel.integrations.stores + name: stores + title: Stores + methods: + create_direct: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v1~1storage~1stores~1integration~1direct/post' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + sqlVerbs: + select: [] + insert: + - $ref: '#/components/x-stackQL-resources/stores/methods/create_direct' + update: [] + delete: [] + replace: [] +servers: + - url: https://api.vercel.com diff --git a/provider-dev/openapi/src/vercel/v00.00.00000/services/kms.yaml b/provider-dev/openapi/src/vercel/v00.00.00000/services/kms.yaml new file mode 100644 index 0000000..646ae19 --- /dev/null +++ b/provider-dev/openapi/src/vercel/v00.00.00000/services/kms.yaml @@ -0,0 +1,2171 @@ +openapi: 3.0.3 +info: + title: kms API + description: vercel kms API + version: 0.0.1 +paths: + /v1/kms/issuers: + get: + description: Retrieve the list of KMS issuers that belong to the authenticated team. The results are paginated. + operationId: listKmsIssuers + security: + - bearerToken: [] + summary: List issuers + tags: + - kms + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + issuers: + items: + properties: + id: + type: string + ownerId: + type: string + name: + type: string + algorithm: + type: string + enum: + - ES256 + - ES384 + - ES512 + - EdDSA + - PS256 + - PS384 + - PS512 + - RS256 + - RS384 + - RS512 + origin: + type: string + enum: + - external + - vercel + managedBy: + type: string + claimsSchema: + additionalProperties: true + type: object + createdAt: + type: string + updatedAt: + type: string + signingKeys: + items: + properties: + keyId: + type: string + description: The server-minted, unique record identifier. Use this to address the key on the activate / certificate endpoints. + importKeyId: + type: string + description: The caller-supplied key id (imported keys only), used as the JWT/JWKS `kid`. Not unique across an issuer's keys; omitted for generated keys. + issuerId: + type: string + algorithm: + type: string + status: + type: string + enum: + - active + - pending + - revoking + publicKey: + properties: + kty: + type: string + kid: + type: string + alg: + type: string + use: + type: string + key_ops: + items: + type: string + type: array + x5c: + items: + type: string + type: array + description: The X.509 certificate chain (RFC 7517 §4.7). Each entry is the base64 DER (not base64url) of a certificate. For keys minted with a stored certificate this holds the single self-signed cert as `[x5c]`. + x5t#S256: + type: string + description: The base64url SHA-256 thumbprint of the DER certificate in `x5c[0]` (RFC 7517 §4.9). + type: object + publicKeyFingerprint: + type: string + publicKeyPem: + type: string + description: The public key in SPKI PEM form, ready to render. Present whenever the key has public key material. Derived from `publicKey`; the embedded certificate members (`x5c`/`x5t#S256`) do not affect it. + certificatePem: + type: string + description: The stored X.509 certificate (from `publicKey.x5c[0]`) in PEM form, ready to render. Present only for keys created with a stored certificate; omitted for keys created before certificates were stored. + createdAt: + type: string + updatedAt: + type: string + revokeAt: + type: string + activateAt: + type: string + activatedAt: + type: string + description: When the key became the active signer. Present for active and revoking keys (and absent for pending keys and rows predating this field). + required: + - algorithm + - createdAt + - issuerId + - keyId + - status + - updatedAt + type: object + type: array + policies: + items: + oneOf: + - properties: + kind: + type: string + enum: + - project-grant + teamId: + type: string + projectId: + type: string + environments: + items: + type: string + type: array + description: Environments whose OIDC tokens this grant authorizes. Each entry is either a system environment slug (`production`, `preview`, `development`) or a custom environment ID (prefixed `env_`). Custom environments are matched against the token's `custom_environment_id` claim (the stable ID); system environments against its `environment` claim. + tokenClaims: + additionalProperties: true + type: object + createdAt: + type: string + updatedAt: + type: string + required: + - createdAt + - environments + - kind + - projectId + - teamId + - updatedAt + type: object + - properties: + kind: + type: string + enum: + - connex-grant + clientId: + type: string + tokenClaims: + additionalProperties: true + type: object + createdAt: + type: string + updatedAt: + type: string + required: + - clientId + - createdAt + - kind + - updatedAt + type: object + type: array + required: + - algorithm + - createdAt + - id + - name + - origin + - ownerId + - policies + - signingKeys + - updatedAt + type: object + type: array + pagination: + properties: + count: + type: number + next: + nullable: true + type: string + required: + - count + - next + type: object + required: + - issuers + - pagination + type: object + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '410': + description: '' + parameters: + - name: limit + description: Maximum number of issuers to return. + in: query + schema: + type: integer + minimum: 1 + maximum: 100 + description: Maximum number of issuers to return. + - name: next + description: Continuation cursor to retrieve the next page of results. + in: query + schema: + type: string + maxLength: 1024 + pattern: ^[A-Za-z0-9_-]+$ + description: Continuation cursor to retrieve the next page of results. + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + post: + description: Create a new KMS issuer for the authenticated team. An issuer owns the asymmetric signing keys that are used to sign tokens and messages. + operationId: createKmsIssuer + security: + - bearerToken: [] + summary: Create an issuer + tags: + - kms + responses: + '201': + description: '' + content: + application/json: + schema: + properties: + id: + type: string + ownerId: + type: string + name: + type: string + algorithm: + type: string + enum: + - ES256 + - ES384 + - ES512 + - EdDSA + - PS256 + - PS384 + - PS512 + - RS256 + - RS384 + - RS512 + origin: + type: string + enum: + - external + - vercel + managedBy: + type: string + claimsSchema: + additionalProperties: true + type: object + createdAt: + type: string + updatedAt: + type: string + signingKeys: + items: + properties: + keyId: + type: string + description: The server-minted, unique record identifier. Use this to address the key on the activate / certificate endpoints. + importKeyId: + type: string + description: The caller-supplied key id (imported keys only), used as the JWT/JWKS `kid`. Not unique across an issuer's keys; omitted for generated keys. + issuerId: + type: string + algorithm: + type: string + status: + type: string + enum: + - active + - pending + - revoking + publicKey: + properties: + kty: + type: string + kid: + type: string + alg: + type: string + use: + type: string + key_ops: + items: + type: string + type: array + x5c: + items: + type: string + type: array + description: The X.509 certificate chain (RFC 7517 §4.7). Each entry is the base64 DER (not base64url) of a certificate. For keys minted with a stored certificate this holds the single self-signed cert as `[x5c]`. + x5t#S256: + type: string + description: The base64url SHA-256 thumbprint of the DER certificate in `x5c[0]` (RFC 7517 §4.9). + type: object + publicKeyFingerprint: + type: string + publicKeyPem: + type: string + description: The public key in SPKI PEM form, ready to render. Present whenever the key has public key material. Derived from `publicKey`; the embedded certificate members (`x5c`/`x5t#S256`) do not affect it. + certificatePem: + type: string + description: The stored X.509 certificate (from `publicKey.x5c[0]`) in PEM form, ready to render. Present only for keys created with a stored certificate; omitted for keys created before certificates were stored. + createdAt: + type: string + updatedAt: + type: string + revokeAt: + type: string + activateAt: + type: string + activatedAt: + type: string + description: When the key became the active signer. Present for active and revoking keys (and absent for pending keys and rows predating this field). + required: + - algorithm + - createdAt + - issuerId + - keyId + - status + - updatedAt + type: object + type: array + policies: + items: + oneOf: + - properties: + kind: + type: string + enum: + - project-grant + teamId: + type: string + projectId: + type: string + environments: + items: + type: string + type: array + description: Environments whose OIDC tokens this grant authorizes. Each entry is either a system environment slug (`production`, `preview`, `development`) or a custom environment ID (prefixed `env_`). Custom environments are matched against the token's `custom_environment_id` claim (the stable ID); system environments against its `environment` claim. + tokenClaims: + additionalProperties: true + type: object + createdAt: + type: string + updatedAt: + type: string + required: + - createdAt + - environments + - kind + - projectId + - teamId + - updatedAt + type: object + - properties: + kind: + type: string + enum: + - connex-grant + clientId: + type: string + tokenClaims: + additionalProperties: true + type: object + createdAt: + type: string + updatedAt: + type: string + required: + - clientId + - createdAt + - kind + - updatedAt + type: object + type: array + required: + - algorithm + - createdAt + - id + - name + - origin + - ownerId + - policies + - signingKeys + - updatedAt + type: object + '400': + description: One of the provided values in the request body is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + parameters: + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + requestBody: + content: + application/json: + schema: + type: object + additionalProperties: false + required: + - name + properties: + name: + type: string + description: The name of the issuer. + algorithm: + type: string + description: The signing algorithm to use for the issuer. EdDSA is not accepted for new issuers. + enum: + - RS256 + - RS384 + - RS512 + - PS256 + - PS384 + - PS512 + - ES256 + - ES384 + - ES512 + default: RS512 + claimsSchema: + type: object + description: A JSON Schema used to validate the resolved token claims when signing tokens for this issuer. + additionalProperties: true + policy: + type: object + additionalProperties: false + required: + - kind + - teamId + - projectId + - environments + - clientId + properties: + kind: + type: string + enum: + - project-grant + teamId: + type: string + description: The team ID for the project grant policy. + projectId: + type: string + description: The project ID for the project grant policy. + environments: + type: array + description: The environments for the project grant policy. Each entry is a system environment (production, preview, development) or a custom environment ID (env_...). + items: + type: string + pattern: ^(?:production|preview|development|env_.+)$ + minItems: 1 + uniqueItems: true + tokenClaims: + type: object + description: The claims that KMS should include in signed JWTs for this policy. + additionalProperties: true + clientId: + type: string + description: The Connex client ID for the Connex grant policy. + importKey: + type: string + description: The PEM-encoded private key to use for the issuer. + importKeyId: + type: string + description: The key id to use as the imported key's JWT/JWKS `kid`. Only allowed when `importKey` is provided. Not required to be unique; the addressable key id is the server-minted `keyId` returned in the response. + maxLength: 128 + pattern: ^[A-Za-z0-9._-]+$ + /v1/kms/issuers/{issuer_id}/sign/message: + post: + description: 'Sign a raw message with a KMS issuer''s active signing key. Authenticate the request with a Vercel OIDC token in the `Authorization: Bearer` header; the issuer''s policies decide which workloads are allowed to sign.' + operationId: signKmsMessage + security: + - bearerToken: [] + summary: Sign a message + tags: + - kms + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + signature: + properties: + payload: + type: string + signature: + type: string + header: + properties: + alg: + type: string + description: JWS "alg" (Algorithm) Header Parameter + b64: + type: boolean + enum: + - false + - true + description: This JWS Extension Header Parameter modifies the JWS Payload representation and the JWS Signing Input computation as per {@link https://www.rfc-editor.org/rfc/rfc7797 RFC7797}. + crit: + items: + type: string + type: array + description: JWS "crit" (Critical) Header Parameter + kid: + type: string + description: '"kid" (Key ID) Header Parameter' + x5t: + type: string + description: '"x5t" (X.509 Certificate SHA-1 Thumbprint) Header Parameter' + x5c: + items: + type: string + type: array + description: '"x5c" (X.509 Certificate Chain) Header Parameter' + x5u: + type: string + description: '"x5u" (X.509 URL) Header Parameter' + jku: + type: string + description: '"jku" (JWK Set URL) Header Parameter' + jwk: + properties: + 'n': + type: string + description: RSA JWK "n" (Modulus) Parameter + e: + type: string + description: RSA JWK "e" (Exponent) Parameter + kty: + type: string + description: JWK "kty" (Key Type) Parameter + crv: + type: string + description: '- EC JWK "crv" (Curve) Parameter - OKP JWK "crv" (The Subtype of Key Pair) Parameter' + x: + type: string + description: '- EC JWK "x" (X Coordinate) Parameter - OKP JWK "x" (The public key) Parameter' + 'y': + type: string + description: EC JWK "y" (Y Coordinate) Parameter + alg: + type: string + description: JWK "alg" (Algorithm) Parameter + pub: + type: string + description: AKP JWK "pub" (Public Key) Parameter + type: object + description: '"jwk" (JSON Web Key) Header Parameter' + typ: + type: string + description: '"typ" (Type) Header Parameter' + cty: + type: string + description: '"cty" (Content Type) Header Parameter' + type: object + description: The "header" member MUST be present and contain the value JWS Unprotected Header when the JWS Unprotected Header value is non- empty; otherwise, it MUST be absent. This value is represented as an unencoded JSON object, rather than as a string. These Header Parameter values are not integrity protected. + protected: + type: string + description: The "protected" member MUST be present and contain the value BASE64URL(UTF8(JWS Protected Header)) when the JWS Protected Header value is non-empty; otherwise, it MUST be absent. These Header Parameter values are integrity protected. + required: + - payload + - signature + type: object + description: Flattened JWS JSON Serialization Syntax token. Payload is returned as an empty string when JWS Unencoded Payload ({@link https://www.rfc-editor.org/rfc/rfc7797 RFC7797}) is used. + required: + - signature + type: object + '400': + description: |- + One of the provided values in the request body is invalid. + One of the provided values in the request query is invalid. + '401': + description: '' + '403': + description: '' + '404': + description: '' + '429': + description: '' + parameters: + - name: issuer_id + description: The ID of the issuer. + in: path + required: true + schema: + type: string + description: The ID of the issuer. + requestBody: + content: + application/json: + schema: + type: object + required: + - message + properties: + message: + type: string + description: Base64-encoded message to be signed. + maxLength: 44000 + pattern: ^[A-Za-z0-9+/]*={0,2}$ + /v1/kms/issuers/{issuer_id}/sign/token: + post: + description: 'Sign a JWT with a KMS issuer''s active signing key. Authenticate the request with a Vercel OIDC token in the `Authorization: Bearer` header; the issuer''s policies decide which workloads are allowed to sign.' + operationId: signKmsToken + security: + - bearerToken: [] + summary: Sign a token + tags: + - kms + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + token: + type: string + required: + - token + type: object + '400': + description: |- + One of the provided values in the request body is invalid. + One of the provided values in the request query is invalid. + '401': + description: '' + '403': + description: '' + '404': + description: '' + '429': + description: '' + parameters: + - name: issuer_id + description: The ID of the issuer. + in: path + required: true + schema: + type: string + description: The ID of the issuer. + requestBody: + content: + application/json: + schema: + type: object + properties: + claims: + type: string + description: The claims to include in the token. (opaque JSON object) + maxProperties: 128 + headers: + type: string + description: Additional headers to include in the token. (opaque JSON object) + maxProperties: 64 + ttl: + type: number + description: The time-to-live for the token, in seconds. + default: 300 + nullable: true + /v1/kms/issuers/{issuer_id}/keys: + post: + description: Create a new signing key for a KMS issuer. Depending on the activation mode, the key is activated automatically once its public key has propagated, or manually via the activate endpoint. + operationId: createKmsSigningKey + security: + - bearerToken: [] + summary: Create a signing key + tags: + - kms + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + keyId: + type: string + description: The server-minted, unique record identifier. Use this to address the key on the activate / certificate endpoints. + importKeyId: + type: string + description: The caller-supplied key id (imported keys only), used as the JWT/JWKS `kid`. Not unique across an issuer's keys; omitted for generated keys. + issuerId: + type: string + algorithm: + type: string + status: + type: string + enum: + - active + - pending + - revoking + publicKey: + properties: + kty: + type: string + kid: + type: string + alg: + type: string + use: + type: string + key_ops: + items: + type: string + type: array + x5c: + items: + type: string + type: array + description: The X.509 certificate chain (RFC 7517 §4.7). Each entry is the base64 DER (not base64url) of a certificate. For keys minted with a stored certificate this holds the single self-signed cert as `[x5c]`. + x5t#S256: + type: string + description: The base64url SHA-256 thumbprint of the DER certificate in `x5c[0]` (RFC 7517 §4.9). + type: object + publicKeyFingerprint: + type: string + publicKeyPem: + type: string + description: The public key in SPKI PEM form, ready to render. Present whenever the key has public key material. Derived from `publicKey`; the embedded certificate members (`x5c`/`x5t#S256`) do not affect it. + certificatePem: + type: string + description: The stored X.509 certificate (from `publicKey.x5c[0]`) in PEM form, ready to render. Present only for keys created with a stored certificate; omitted for keys created before certificates were stored. + createdAt: + type: string + updatedAt: + type: string + revokeAt: + type: string + activateAt: + type: string + activatedAt: + type: string + description: When the key became the active signer. Present for active and revoking keys (and absent for pending keys and rows predating this field). + required: + - algorithm + - createdAt + - issuerId + - keyId + - status + - updatedAt + type: object + '400': + description: |- + One of the provided values in the request body is invalid. + One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '409': + description: '' + '410': + description: '' + parameters: + - name: issuer_id + description: The ID of the issuer. + in: path + required: true + schema: + type: string + description: The ID of the issuer. + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + requestBody: + content: + application/json: + schema: + type: object + additionalProperties: false + properties: + activation: + type: string + enum: + - automatic + - manual + description: Whether the new key is activated automatically after its public key has propagated, or manually via the activate endpoint. Defaults to `automatic`. + revokePreviousAfterHours: + type: number + minimum: 0 + description: For automatic activation, how many hours after activation the previous signing key should stop being used. Defaults to a 1 hour grace period so already-issued tokens keep verifying. + revokePreviousAt: + description: Deprecated. The ISO date string or timestamp when the previous signing key should stop being used. Converted to a relative grace and applied at activation, not creation. Prefer revokePreviousAfterHours. + type: string + importKey: + type: string + description: The PEM-encoded private key to use for the issuer. + importKeyId: + type: string + description: The key id to use as the imported key's JWT/JWKS `kid`. Only allowed when `importKey` is provided. Not required to be unique; the addressable key id is the server-minted `keyId` returned in the response. + maxLength: 128 + pattern: ^[A-Za-z0-9._-]+$ + /v1/kms/issuers/{issuer_id}/keys/{key_id}/activate: + post: + description: Activate a pending signing key so the issuer starts signing with it. + operationId: activateKmsSigningKey + security: + - bearerToken: [] + summary: Activate a signing key + tags: + - kms + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + keyId: + type: string + description: The server-minted, unique record identifier. Use this to address the key on the activate / certificate endpoints. + importKeyId: + type: string + description: The caller-supplied key id (imported keys only), used as the JWT/JWKS `kid`. Not unique across an issuer's keys; omitted for generated keys. + issuerId: + type: string + algorithm: + type: string + status: + type: string + enum: + - active + - pending + - revoking + publicKey: + properties: + kty: + type: string + kid: + type: string + alg: + type: string + use: + type: string + key_ops: + items: + type: string + type: array + x5c: + items: + type: string + type: array + description: The X.509 certificate chain (RFC 7517 §4.7). Each entry is the base64 DER (not base64url) of a certificate. For keys minted with a stored certificate this holds the single self-signed cert as `[x5c]`. + x5t#S256: + type: string + description: The base64url SHA-256 thumbprint of the DER certificate in `x5c[0]` (RFC 7517 §4.9). + type: object + publicKeyFingerprint: + type: string + publicKeyPem: + type: string + description: The public key in SPKI PEM form, ready to render. Present whenever the key has public key material. Derived from `publicKey`; the embedded certificate members (`x5c`/`x5t#S256`) do not affect it. + certificatePem: + type: string + description: The stored X.509 certificate (from `publicKey.x5c[0]`) in PEM form, ready to render. Present only for keys created with a stored certificate; omitted for keys created before certificates were stored. + createdAt: + type: string + updatedAt: + type: string + revokeAt: + type: string + activateAt: + type: string + activatedAt: + type: string + description: When the key became the active signer. Present for active and revoking keys (and absent for pending keys and rows predating this field). + required: + - algorithm + - createdAt + - issuerId + - keyId + - status + - updatedAt + type: object + '400': + description: |- + One of the provided values in the request body is invalid. + One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '409': + description: '' + '410': + description: '' + parameters: + - name: issuer_id + description: The ID of the issuer. + in: path + required: true + schema: + type: string + description: The ID of the issuer. + - name: key_id + description: The ID of the pending signing key to activate. + in: path + required: true + schema: + type: string + description: The ID of the pending signing key to activate. + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + requestBody: + content: + application/json: + schema: + type: object + additionalProperties: false + properties: + revokePreviousAfterHours: + type: number + minimum: 0 + description: How many hours after activation the previously-active key should stop being used. Defaults to a 1 hour grace period so already-issued tokens keep verifying. + /v1/kms/issuers/{issuer_id}/keys/{key_id}/revoke: + post: + description: Immediately revoke a signing key that is already scheduled for revocation. + operationId: revokeKmsSigningKey + security: + - bearerToken: [] + summary: Revoke a signing key + tags: + - kms + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + id: + type: string + ownerId: + type: string + name: + type: string + algorithm: + type: string + enum: + - ES256 + - ES384 + - ES512 + - EdDSA + - PS256 + - PS384 + - PS512 + - RS256 + - RS384 + - RS512 + origin: + type: string + enum: + - external + - vercel + managedBy: + type: string + claimsSchema: + additionalProperties: true + type: object + createdAt: + type: string + updatedAt: + type: string + signingKeys: + items: + properties: + keyId: + type: string + description: The server-minted, unique record identifier. Use this to address the key on the activate / certificate endpoints. + importKeyId: + type: string + description: The caller-supplied key id (imported keys only), used as the JWT/JWKS `kid`. Not unique across an issuer's keys; omitted for generated keys. + issuerId: + type: string + algorithm: + type: string + status: + type: string + enum: + - active + - pending + - revoking + publicKey: + properties: + kty: + type: string + kid: + type: string + alg: + type: string + use: + type: string + key_ops: + items: + type: string + type: array + x5c: + items: + type: string + type: array + description: The X.509 certificate chain (RFC 7517 §4.7). Each entry is the base64 DER (not base64url) of a certificate. For keys minted with a stored certificate this holds the single self-signed cert as `[x5c]`. + x5t#S256: + type: string + description: The base64url SHA-256 thumbprint of the DER certificate in `x5c[0]` (RFC 7517 §4.9). + type: object + publicKeyFingerprint: + type: string + publicKeyPem: + type: string + description: The public key in SPKI PEM form, ready to render. Present whenever the key has public key material. Derived from `publicKey`; the embedded certificate members (`x5c`/`x5t#S256`) do not affect it. + certificatePem: + type: string + description: The stored X.509 certificate (from `publicKey.x5c[0]`) in PEM form, ready to render. Present only for keys created with a stored certificate; omitted for keys created before certificates were stored. + createdAt: + type: string + updatedAt: + type: string + revokeAt: + type: string + activateAt: + type: string + activatedAt: + type: string + description: When the key became the active signer. Present for active and revoking keys (and absent for pending keys and rows predating this field). + required: + - algorithm + - createdAt + - issuerId + - keyId + - status + - updatedAt + type: object + type: array + policies: + items: + oneOf: + - properties: + kind: + type: string + enum: + - project-grant + teamId: + type: string + projectId: + type: string + environments: + items: + type: string + type: array + description: Environments whose OIDC tokens this grant authorizes. Each entry is either a system environment slug (`production`, `preview`, `development`) or a custom environment ID (prefixed `env_`). Custom environments are matched against the token's `custom_environment_id` claim (the stable ID); system environments against its `environment` claim. + tokenClaims: + additionalProperties: true + type: object + createdAt: + type: string + updatedAt: + type: string + required: + - createdAt + - environments + - kind + - projectId + - teamId + - updatedAt + type: object + - properties: + kind: + type: string + enum: + - connex-grant + clientId: + type: string + tokenClaims: + additionalProperties: true + type: object + createdAt: + type: string + updatedAt: + type: string + required: + - clientId + - createdAt + - kind + - updatedAt + type: object + type: array + required: + - algorithm + - createdAt + - id + - name + - origin + - ownerId + - policies + - signingKeys + - updatedAt + type: object + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '409': + description: '' + '410': + description: '' + parameters: + - name: issuer_id + description: The ID of the issuer. + in: path + required: true + schema: + type: string + description: The ID of the issuer. + - name: key_id + description: The ID of the signing key to revoke immediately. The key must already be scheduled for revocation. + in: path + required: true + schema: + type: string + description: The ID of the signing key to revoke immediately. The key must already be scheduled for revocation. + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + /v1/kms/issuers/{issuer_id}: + get: + description: Retrieve a single KMS issuer by its ID. Accepts either a team bearer token (existing path) or an OIDC token authorized by one of the issuer's policies (e.g. a connex-grant token). The OIDC path returns the issuer without policies, since a policy token only proves signing access, not management access. + operationId: getKmsIssuer + security: + - bearerToken: [] + summary: Get an issuer + tags: + - kms + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + id: + type: string + ownerId: + type: string + name: + type: string + algorithm: + type: string + enum: + - ES256 + - ES384 + - ES512 + - EdDSA + - PS256 + - PS384 + - PS512 + - RS256 + - RS384 + - RS512 + origin: + type: string + enum: + - external + - vercel + managedBy: + type: string + claimsSchema: + additionalProperties: true + type: object + createdAt: + type: string + updatedAt: + type: string + signingKeys: + items: + properties: + keyId: + type: string + description: The server-minted, unique record identifier. Use this to address the key on the activate / certificate endpoints. + importKeyId: + type: string + description: The caller-supplied key id (imported keys only), used as the JWT/JWKS `kid`. Not unique across an issuer's keys; omitted for generated keys. + issuerId: + type: string + algorithm: + type: string + status: + type: string + enum: + - active + - pending + - revoking + publicKey: + properties: + kty: + type: string + kid: + type: string + alg: + type: string + use: + type: string + key_ops: + items: + type: string + type: array + x5c: + items: + type: string + type: array + description: The X.509 certificate chain (RFC 7517 §4.7). Each entry is the base64 DER (not base64url) of a certificate. For keys minted with a stored certificate this holds the single self-signed cert as `[x5c]`. + x5t#S256: + type: string + description: The base64url SHA-256 thumbprint of the DER certificate in `x5c[0]` (RFC 7517 §4.9). + type: object + publicKeyFingerprint: + type: string + publicKeyPem: + type: string + description: The public key in SPKI PEM form, ready to render. Present whenever the key has public key material. Derived from `publicKey`; the embedded certificate members (`x5c`/`x5t#S256`) do not affect it. + certificatePem: + type: string + description: The stored X.509 certificate (from `publicKey.x5c[0]`) in PEM form, ready to render. Present only for keys created with a stored certificate; omitted for keys created before certificates were stored. + createdAt: + type: string + updatedAt: + type: string + revokeAt: + type: string + activateAt: + type: string + activatedAt: + type: string + description: When the key became the active signer. Present for active and revoking keys (and absent for pending keys and rows predating this field). + required: + - algorithm + - createdAt + - issuerId + - keyId + - status + - updatedAt + type: object + type: array + policies: + items: + oneOf: + - properties: + kind: + type: string + enum: + - project-grant + teamId: + type: string + projectId: + type: string + environments: + items: + type: string + type: array + description: Environments whose OIDC tokens this grant authorizes. Each entry is either a system environment slug (`production`, `preview`, `development`) or a custom environment ID (prefixed `env_`). Custom environments are matched against the token's `custom_environment_id` claim (the stable ID); system environments against its `environment` claim. + tokenClaims: + additionalProperties: true + type: object + createdAt: + type: string + updatedAt: + type: string + required: + - createdAt + - environments + - kind + - projectId + - teamId + - updatedAt + type: object + - properties: + kind: + type: string + enum: + - connex-grant + clientId: + type: string + tokenClaims: + additionalProperties: true + type: object + createdAt: + type: string + updatedAt: + type: string + required: + - clientId + - createdAt + - kind + - updatedAt + type: object + type: array + required: + - algorithm + - createdAt + - id + - name + - origin + - ownerId + - policies + - signingKeys + - updatedAt + type: object + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + parameters: + - name: issuer_id + description: The ID of the issuer. + in: path + required: true + schema: + type: string + description: The ID of the issuer. + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + patch: + description: Update a KMS issuer's name or claims schema. + operationId: updateKmsIssuer + security: + - bearerToken: [] + summary: Update an issuer + tags: + - kms + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + id: + type: string + ownerId: + type: string + name: + type: string + algorithm: + type: string + enum: + - ES256 + - ES384 + - ES512 + - EdDSA + - PS256 + - PS384 + - PS512 + - RS256 + - RS384 + - RS512 + origin: + type: string + enum: + - external + - vercel + managedBy: + type: string + claimsSchema: + additionalProperties: true + type: object + createdAt: + type: string + updatedAt: + type: string + signingKeys: + items: + properties: + keyId: + type: string + description: The server-minted, unique record identifier. Use this to address the key on the activate / certificate endpoints. + importKeyId: + type: string + description: The caller-supplied key id (imported keys only), used as the JWT/JWKS `kid`. Not unique across an issuer's keys; omitted for generated keys. + issuerId: + type: string + algorithm: + type: string + status: + type: string + enum: + - active + - pending + - revoking + publicKey: + properties: + kty: + type: string + kid: + type: string + alg: + type: string + use: + type: string + key_ops: + items: + type: string + type: array + x5c: + items: + type: string + type: array + description: The X.509 certificate chain (RFC 7517 §4.7). Each entry is the base64 DER (not base64url) of a certificate. For keys minted with a stored certificate this holds the single self-signed cert as `[x5c]`. + x5t#S256: + type: string + description: The base64url SHA-256 thumbprint of the DER certificate in `x5c[0]` (RFC 7517 §4.9). + type: object + publicKeyFingerprint: + type: string + publicKeyPem: + type: string + description: The public key in SPKI PEM form, ready to render. Present whenever the key has public key material. Derived from `publicKey`; the embedded certificate members (`x5c`/`x5t#S256`) do not affect it. + certificatePem: + type: string + description: The stored X.509 certificate (from `publicKey.x5c[0]`) in PEM form, ready to render. Present only for keys created with a stored certificate; omitted for keys created before certificates were stored. + createdAt: + type: string + updatedAt: + type: string + revokeAt: + type: string + activateAt: + type: string + activatedAt: + type: string + description: When the key became the active signer. Present for active and revoking keys (and absent for pending keys and rows predating this field). + required: + - algorithm + - createdAt + - issuerId + - keyId + - status + - updatedAt + type: object + type: array + policies: + items: + oneOf: + - properties: + kind: + type: string + enum: + - project-grant + teamId: + type: string + projectId: + type: string + environments: + items: + type: string + type: array + description: Environments whose OIDC tokens this grant authorizes. Each entry is either a system environment slug (`production`, `preview`, `development`) or a custom environment ID (prefixed `env_`). Custom environments are matched against the token's `custom_environment_id` claim (the stable ID); system environments against its `environment` claim. + tokenClaims: + additionalProperties: true + type: object + createdAt: + type: string + updatedAt: + type: string + required: + - createdAt + - environments + - kind + - projectId + - teamId + - updatedAt + type: object + - properties: + kind: + type: string + enum: + - connex-grant + clientId: + type: string + tokenClaims: + additionalProperties: true + type: object + createdAt: + type: string + updatedAt: + type: string + required: + - clientId + - createdAt + - kind + - updatedAt + type: object + type: array + required: + - algorithm + - createdAt + - id + - name + - origin + - ownerId + - policies + - signingKeys + - updatedAt + type: object + '400': + description: |- + One of the provided values in the request body is invalid. + One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + parameters: + - name: issuer_id + description: The ID of the issuer. + in: path + required: true + schema: + type: string + description: The ID of the issuer. + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + requestBody: + content: + application/json: + schema: + type: object + additionalProperties: false + minProperties: 1 + properties: + name: + type: string + description: The name of the issuer. + claimsSchema: + type: object + description: A JSON Schema used to validate the resolved token claims when signing tokens for this issuer. Pass null to remove it. + additionalProperties: true + nullable: true + delete: + description: Delete a KMS issuer and its signing keys. + operationId: deleteKmsIssuer + security: + - bearerToken: [] + summary: Delete an issuer + tags: + - kms + responses: + '204': + description: '' + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + parameters: + - name: issuer_id + description: The ID of the issuer. + in: path + required: true + schema: + type: string + description: The ID of the issuer. + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + /v1/kms/issuers/{issuer_id}/policies: + post: + description: Attach a policy to a KMS issuer that grants a project's deployments permission to sign with it. + operationId: createKmsIssuerPolicy + security: + - bearerToken: [] + summary: Create an issuer policy + tags: + - kms + responses: + '201': + description: '' + content: + application/json: + schema: + properties: + kind: + type: string + enum: + - project-grant + teamId: + type: string + projectId: + type: string + environments: + items: + type: string + type: array + description: Environments whose OIDC tokens this grant authorizes. Each entry is either a system environment slug (`production`, `preview`, `development`) or a custom environment ID (prefixed `env_`). Custom environments are matched against the token's `custom_environment_id` claim (the stable ID); system environments against its `environment` claim. + tokenClaims: + additionalProperties: true + type: object + createdAt: + type: string + updatedAt: + type: string + clientId: + type: string + required: + - createdAt + - environments + - kind + - projectId + - teamId + - updatedAt + - clientId + type: object + '400': + description: |- + One of the provided values in the request body is invalid. + One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + parameters: + - name: issuer_id + description: The ID of the issuer. + in: path + required: true + schema: + type: string + description: The ID of the issuer. + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + requestBody: + content: + application/json: + schema: + type: object + additionalProperties: false + required: + - kind + - projectId + - environments + properties: + kind: + type: string + enum: + - project-grant + projectId: + type: string + description: The project ID for the project grant policy. + environments: + type: array + description: The environments for the project grant policy. Each entry is a system environment (production, preview, development) or a custom environment ID (env_...). + items: + type: string + pattern: ^(?:production|preview|development|env_.+)$ + minItems: 1 + uniqueItems: true + tokenClaims: + type: object + description: The claims that KMS should include in signed JWTs for this policy. + additionalProperties: true + /v1/kms/issuers/{issuer_id}/policies/{kind}/{policy_key}: + patch: + description: Update an existing KMS issuer policy's environments or token claims. + operationId: updateKmsIssuerPolicy + security: + - bearerToken: [] + summary: Update an issuer policy + tags: + - kms + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + kind: + type: string + enum: + - project-grant + teamId: + type: string + projectId: + type: string + environments: + items: + type: string + type: array + description: Environments whose OIDC tokens this grant authorizes. Each entry is either a system environment slug (`production`, `preview`, `development`) or a custom environment ID (prefixed `env_`). Custom environments are matched against the token's `custom_environment_id` claim (the stable ID); system environments against its `environment` claim. + tokenClaims: + additionalProperties: true + type: object + createdAt: + type: string + updatedAt: + type: string + clientId: + type: string + required: + - createdAt + - environments + - kind + - projectId + - teamId + - updatedAt + - clientId + type: object + '400': + description: |- + One of the provided values in the request body is invalid. + One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + parameters: + - name: issuer_id + description: The ID of the issuer. + in: path + required: true + schema: + type: string + description: The ID of the issuer. + - name: kind + description: The issuer policy kind. + in: path + required: true + schema: + type: string + enum: + - project-grant + description: The issuer policy kind. + - name: policy_key + description: The policy identifier. + in: path + required: true + schema: + type: string + description: The policy identifier. + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + requestBody: + content: + application/json: + schema: + type: object + additionalProperties: false + properties: + environments: + type: array + description: The environments for the project grant policy. Each entry is a system environment (production, preview, development) or a custom environment ID (env_...). + items: + type: string + pattern: ^(?:production|preview|development|env_.+)$ + minItems: 1 + uniqueItems: true + tokenClaims: + type: object + description: The claims that KMS should include in signed JWTs for this policy. Pass null to remove them. + additionalProperties: true + nullable: true + delete: + description: Remove a policy from a KMS issuer. + operationId: deleteKmsIssuerPolicy + security: + - bearerToken: [] + summary: Delete an issuer policy + tags: + - kms + responses: + '204': + description: '' + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + parameters: + - name: issuer_id + description: The ID of the issuer. + in: path + required: true + schema: + type: string + description: The ID of the issuer. + - name: kind + description: The issuer policy kind. + in: path + required: true + schema: + type: string + enum: + - project-grant + - connex-grant + description: The issuer policy kind. + - name: policy_key + description: The policy identifier. + in: path + required: true + schema: + type: string + description: The policy identifier. + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug +components: + x-stackQL-resources: + issuers: + id: vercel.kms.issuers + name: issuers + title: Issuers + methods: + list: + operation: + $ref: '#/paths/~1v1~1kms~1issuers/get' + response: + mediaType: application/json + openAPIDocKey: '200' + objectKey: $.issuers + request: + nativeCasing: camel + config: + pagination: + requestToken: + key: next + location: query + responseToken: + key: $.pagination.next + location: body + queryParamPushdown: + top: + paramName: limit + maxValue: 100 + create: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v1~1kms~1issuers/post' + response: + mediaType: application/json + openAPIDocKey: '201' + request: + nativeCasing: camel + sign_message: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v1~1kms~1issuers~1{issuer_id}~1sign~1message/post' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + sign_token: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v1~1kms~1issuers~1{issuer_id}~1sign~1token/post' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + get: + operation: + $ref: '#/paths/~1v1~1kms~1issuers~1{issuer_id}/get' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + update: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v1~1kms~1issuers~1{issuer_id}/patch' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + delete: + operation: + $ref: '#/paths/~1v1~1kms~1issuers~1{issuer_id}/delete' + response: + mediaType: application/json + openAPIDocKey: '204' + request: + nativeCasing: camel + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/issuers/methods/get' + - $ref: '#/components/x-stackQL-resources/issuers/methods/list' + insert: + - $ref: '#/components/x-stackQL-resources/issuers/methods/create' + update: + - $ref: '#/components/x-stackQL-resources/issuers/methods/update' + delete: + - $ref: '#/components/x-stackQL-resources/issuers/methods/delete' + replace: [] + signing_keys: + id: vercel.kms.signing_keys + name: signing_keys + title: Signing Keys + methods: + create: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v1~1kms~1issuers~1{issuer_id}~1keys/post' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + activate: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v1~1kms~1issuers~1{issuer_id}~1keys~1{key_id}~1activate/post' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + revoke: + operation: + $ref: '#/paths/~1v1~1kms~1issuers~1{issuer_id}~1keys~1{key_id}~1revoke/post' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + sqlVerbs: + select: [] + insert: + - $ref: '#/components/x-stackQL-resources/signing_keys/methods/create' + update: [] + delete: [] + replace: [] + issuer_policies: + id: vercel.kms.issuer_policies + name: issuer_policies + title: Issuer Policies + methods: + create: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v1~1kms~1issuers~1{issuer_id}~1policies/post' + response: + mediaType: application/json + openAPIDocKey: '201' + request: + nativeCasing: camel + update: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v1~1kms~1issuers~1{issuer_id}~1policies~1{kind}~1{policy_key}/patch' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + delete: + operation: + $ref: '#/paths/~1v1~1kms~1issuers~1{issuer_id}~1policies~1{kind}~1{policy_key}/delete' + response: + mediaType: application/json + openAPIDocKey: '204' + request: + nativeCasing: camel + sqlVerbs: + select: [] + insert: + - $ref: '#/components/x-stackQL-resources/issuer_policies/methods/create' + update: + - $ref: '#/components/x-stackQL-resources/issuer_policies/methods/update' + delete: + - $ref: '#/components/x-stackQL-resources/issuer_policies/methods/delete' + replace: [] +servers: + - url: https://api.vercel.com diff --git a/provider-dev/openapi/src/vercel/v00.00.00000/services/log_drains.yaml b/provider-dev/openapi/src/vercel/v00.00.00000/services/log_drains.yaml index 00b667a..8ce11fe 100644 --- a/provider-dev/openapi/src/vercel/v00.00.00000/services/log_drains.yaml +++ b/provider-dev/openapi/src/vercel/v00.00.00000/services/log_drains.yaml @@ -1,474 +1,16 @@ openapi: 3.0.3 -servers: - - url: 'https://api.vercel.com' - description: Production API info: - contact: - email: support@vercel.com - name: Vercel Support - url: 'https://vercel.com/support' + title: log_drains API + description: vercel log_drains API version: 0.0.1 - title: Vercel API - log_drains - description: logDrains -components: - schemas: {} - responses: {} - securitySchemes: - bearerToken: - type: http - description: Default authentication mechanism - scheme: bearer - oauth2: - type: oauth2 - flows: - authorizationCode: - authorizationUrl: 'https://api.vercel.com/oauth/authorize' - tokenUrl: 'https://api.vercel.com/oauth/access_token' - scopes: {} - x-stackQL-resources: - integrations: - id: vercel.log_drains.integrations - name: integrations - title: Integrations - methods: - get_integration_log_drains: - operation: - $ref: '#/paths/~1v2~1integrations~1log-drains/get' - response: - mediaType: application/json - openAPIDocKey: '200' - create_log_drain: - operation: - $ref: '#/paths/~1v2~1integrations~1log-drains/post' - response: - mediaType: application/json - openAPIDocKey: '200' - delete_integration_log_drain: - operation: - $ref: '#/paths/~1v1~1integrations~1log-drains~1{id}/delete' - response: - mediaType: application/json - openAPIDocKey: '200' - sqlVerbs: - select: - - $ref: '#/components/x-stackQL-resources/integrations/methods/get_integration_log_drains' - insert: - - $ref: '#/components/x-stackQL-resources/integrations/methods/create_log_drain' - update: [] - delete: - - $ref: '#/components/x-stackQL-resources/integrations/methods/delete_integration_log_drain' - log_drains: - id: vercel.log_drains.log_drains - name: log_drains - title: Log Drains - methods: - get_configurable_log_drain: - operation: - $ref: '#/paths/~1v1~1log-drains~1{id}/get' - response: - mediaType: application/json - openAPIDocKey: '200' - delete_configurable_log_drain: - operation: - $ref: '#/paths/~1v1~1log-drains~1{id}/delete' - response: - mediaType: application/json - openAPIDocKey: '200' - get_configurable_log_drains: - operation: - $ref: '#/paths/~1v1~1log-drains/get' - response: - mediaType: application/json - openAPIDocKey: '200' - create_configurable_log_drain: - operation: - $ref: '#/paths/~1v1~1log-drains/post' - response: - mediaType: application/json - openAPIDocKey: '200' - sqlVerbs: - select: - - $ref: '#/components/x-stackQL-resources/log_drains/methods/get_configurable_log_drain' - - $ref: '#/components/x-stackQL-resources/log_drains/methods/get_configurable_log_drains' - insert: - - $ref: '#/components/x-stackQL-resources/log_drains/methods/create_configurable_log_drain' - update: [] - delete: - - $ref: '#/components/x-stackQL-resources/log_drains/methods/delete_configurable_log_drain' paths: - /v2/integrations/log-drains: - get: - description: 'Retrieves a list of all Integration log drains that are defined for the authenticated user or team. When using an OAuth2 token, the list is limited to log drains created by the authenticated integration.' - operationId: getIntegrationLogDrains - security: - - bearerToken: [] - summary: Retrieves a list of Integration log drains - tags: - - logDrains - responses: - '200': - description: A list of log drains - content: - application/json: - schema: - items: - properties: - clientId: - type: string - description: The oauth2 client application id that created this log drain - example: oac_xRhY4LAB7yLhUADD69EvV7ct - configurationId: - type: string - description: The client configuration this log drain was created with - example: icfg_cuwj0AdCdH3BwWT4LPijCC7t - createdAt: - type: number - description: A timestamp that tells you when the log drain was created - example: 1558531915505 - id: - type: string - description: The unique identifier of the log drain. Always prefixed with `ld_` - example: ld_nBuA7zCID8g4QZ8g - deliveryFormat: - type: string - enum: - - json - - ndjson - - syslog - description: The delivery log format - example: json - name: - type: string - description: The name of the log drain - example: My first log drain - ownerId: - type: string - description: The identifier of the team or user whose events will trigger the log drain - example: kr1PsOIzqEL5Xg6M4VZcZosf - projectId: - nullable: true - type: string - example: AbCgVkqoxXeXCDWehVir51LHGrrcWL4mkYm14W6UBPWQeb - projectIds: - items: - type: string - type: array - description: The identifier of the projects this log drain is associated with - example: AbCgVkqoxXeXCDWehVir51LHGrrcWL4mkYm14W6UBPWQeb - url: - type: string - description: The URL to call when logs are generated - example: 'https://example.com/log-drain' - sources: - items: - type: string - enum: - - static - - lambda - - build - - edge - - external - - deployment - description: The sources from which logs are currently being delivered to this log drain. - example: - - build - - edge - type: array - description: The sources from which logs are currently being delivered to this log drain. - example: - - build - - edge - createdFrom: - type: string - enum: - - self-served - - integration - description: Whether the log drain was created by an integration or by a user - example: integration - headers: - additionalProperties: - type: string - type: object - description: The headers to send with the request - example: '{"Authorization": "Bearer 123"}' - environment: - type: string - enum: - - preview - - production - description: The environment of log drain - example: production - branch: - type: string - description: The branch regexp of log drain - example: feature/* - required: - - createdAt - - id - - name - - ownerId - - url - type: object - type: array - '400': - description: '' - '401': - description: '' - '403': - description: You do not have permission to access this resource. - parameters: - - description: The Team identifier or slug to perform the request on behalf of. - in: query - name: teamId - required: true - schema: - type: string - post: - description: 'Creates an Integration log drain. This endpoint must be called with an OAuth2 client (integration), since log drains are tied to integrations. If it is called with a different token type it will produce a 400 error.' - operationId: createLogDrain - security: - - bearerToken: [] - summary: Creates a new Integration Log Drain - tags: - - logDrains - responses: - '200': - description: The log drain was successfully created - content: - application/json: - schema: - properties: - clientId: - type: string - description: The oauth2 client application id that created this log drain - example: oac_xRhY4LAB7yLhUADD69EvV7ct - configurationId: - type: string - description: The client configuration this log drain was created with - example: icfg_cuwj0AdCdH3BwWT4LPijCC7t - createdAt: - type: number - description: A timestamp that tells you when the log drain was created - example: 1558531915505 - id: - type: string - description: The unique identifier of the log drain. Always prefixed with `ld_` - example: ld_nBuA7zCID8g4QZ8g - deliveryFormat: - type: string - enum: - - json - - ndjson - - syslog - description: The delivery log format - example: json - name: - type: string - description: The name of the log drain - example: My first log drain - ownerId: - type: string - description: The identifier of the team or user whose events will trigger the log drain - example: kr1PsOIzqEL5Xg6M4VZcZosf - projectId: - nullable: true - type: string - example: AbCgVkqoxXeXCDWehVir51LHGrrcWL4mkYm14W6UBPWQeb - projectIds: - items: - type: string - type: array - description: The identifier of the projects this log drain is associated with - example: AbCgVkqoxXeXCDWehVir51LHGrrcWL4mkYm14W6UBPWQeb - url: - type: string - description: The URL to call when logs are generated - example: 'https://example.com/log-drain' - sources: - items: - type: string - enum: - - static - - lambda - - build - - edge - - external - - deployment - description: The sources from which logs are currently being delivered to this log drain. - example: - - build - - edge - type: array - description: The sources from which logs are currently being delivered to this log drain. - example: - - build - - edge - createdFrom: - type: string - enum: - - self-served - - integration - description: Whether the log drain was created by an integration or by a user - example: integration - headers: - additionalProperties: - type: string - type: object - description: The headers to send with the request - example: '{"Authorization": "Bearer 123"}' - environment: - type: string - enum: - - preview - - production - description: The environment of log drain - example: production - branch: - type: string - description: The branch regexp of log drain - example: feature/* - required: - - createdAt - - id - - name - - ownerId - - url - type: object - '400': - description: |- - One of the provided values in the request body is invalid. - The provided token is not from an OAuth2 Client - '401': - description: '' - '403': - description: You do not have permission to access this resource. - parameters: - - description: The Team identifier or slug to perform the request on behalf of. - in: query - name: teamId - required: true - schema: - type: string - requestBody: - content: - application/json: - schema: - properties: - name: - description: The name of the log drain - example: My first log drain - maxLength: 100 - pattern: '^[A-z0-9_ -]+$' - type: string - projectIds: - minItems: 1 - maxItems: 50 - type: array - items: - pattern: '^[a-zA-z0-9_]+$' - type: string - secret: - description: A secret to sign log drain notification headers so a consumer can verify their authenticity - example: a1Xsfd325fXcs - maxLength: 100 - pattern: '^[A-z0-9_ -]+$' - type: string - deliveryFormat: - description: The delivery log format - example: json - enum: - - json - - ndjson - - syslog - url: - description: 'The url where you will receive logs. The protocol must be `https://` or `http://` when type is `json` and `ndjson`, and `syslog+tls:` or `syslog:` when the type is `syslog`.' - example: 'https://example.com/log-drain' - format: uri - pattern: '^(https?|syslog\\+tls|syslog)://' - type: string - sources: - type: array - uniqueItems: true - items: - type: string - enum: - - static - - lambda - - build - - edge - - external - minItems: 1 - headers: - description: Headers to be sent together with the request - type: object - additionalProperties: - type: string - environment: - description: The environment of log drain - example: production - enum: - - preview - - production - branch: - description: The branch regexp of log drain - example: feature/* - type: string - previousLogDrainId: - description: The id of the log drain that was previously created and deleted - example: ld_1 - type: string - required: - - name - - url - type: object - '/v1/integrations/log-drains/{id}': - delete: - description: 'Deletes the Integration log drain with the provided `id`. When using an OAuth2 Token, the log drain can be deleted only if the integration owns it.' - operationId: deleteIntegrationLogDrain - security: - - bearerToken: [] - summary: Deletes the Integration log drain with the provided `id` - tags: - - logDrains - responses: - '204': - description: The log drain was successfully deleted - '400': - description: One of the provided values in the request query is invalid. - '401': - description: '' - '403': - description: You do not have permission to access this resource. - '404': - description: The log drain was not found - parameters: - - name: id - description: ID of the log drain to be deleted - in: path - required: true - schema: - description: ID of the log drain to be deleted - type: string - - name: updateFlow - description: 'If this API is being called as part of an update flow, this should be set to true' - in: query - required: false - schema: - description: 'If this API is being called as part of an update flow, this should be set to true' - type: boolean - - description: The Team identifier or slug to perform the request on behalf of. - in: query - name: teamId - required: true - schema: - type: string - '/v1/log-drains/{id}': + /v1/log-drains/{id}: get: description: Retrieves a Configurable Log Drain. This endpoint must be called with a team AccessToken (integration OAuth2 clients are not allowed). Only log drains owned by the authenticated team can be accessed. operationId: getConfigurableLogDrain security: - bearerToken: [] - summary: Retrieves a Configurable Log Drain + summary: Retrieves a Configurable Log Drain (deprecated) tags: - logDrains responses: @@ -477,118 +19,150 @@ paths: content: application/json: schema: + type: object properties: - id: - type: string - deliveryFormat: - type: string - enum: - - json - - ndjson - - syslog - url: - type: string - name: + createdFrom: type: string clientId: type: string configurationId: type: string - teamId: + projectsMetadata: nullable: true - type: string - ownerId: - type: string - projectIds: items: - type: string - type: array - createdAt: - type: number - sources: - items: - type: string - enum: - - static - - lambda - - build - - edge - - external - - deployment + properties: + id: + type: string + name: + type: string + framework: + nullable: true + type: string + enum: + - actix-web + - angular + - ash + - astro + - axum + - blitzjs + - brunch + - bun + - container + - create-react-app + - django + - docusaurus + - docusaurus-2 + - dojo + - eleventy + - elysia + - ember + - eve + - express + - factory-eve + - fastapi + - fasthtml + - fastify + - flask + - gatsby + - go + - gridsome + - h3 + - hexo + - hono + - hugo + - hydrogen + - ionic-angular + - ionic-react + - jekyll + - koa + - mastra + - middleman + - nestjs + - nextjs + - nitro + - node + - nuxtjs + - parcel + - polymer + - preact + - python + - react-router + - redwoodjs + - remix + - ruby + - rust + - saber + - sanity + - sanity-v2 + - sapper + - scully + - services + - solidstart + - solidstart-1 + - stencil + - storybook + - svelte + - sveltekit + - sveltekit-1 + - tanstack-start + - tanstack-start-lovable + - umijs + - vite + - vitepress + - vue + - vuepress + - xmcp + - zola + - null + latestDeployment: + type: string + required: + - id + - name + type: object type: array - headers: - additionalProperties: - type: string - type: object - environment: - type: string - enum: - - production - - preview - branch: - type: string - status: + integrationIcon: type: string - enum: - - enabled - - disabled - - errored - disabledAt: - type: number - disabledReason: - type: string - enum: - - log-drain-high-error-rate - - log-drains-add-on-disabled-by-owner - - disabled-by-admin - - account-plan-downgrade - disabledBy: + integrationConfigurationUri: type: string - firstErrorTimestamp: - type: number - secret: - type: string - createdFrom: + integrationWebsite: type: string - enum: - - self-served required: - - id - - deliveryFormat - - url - - name - - ownerId - - createdAt - - secret - type: object + - createdFrom '400': description: One of the provided values in the request query is invalid. '401': - description: '' + description: The request is not authorized. '403': description: You do not have permission to access this resource. '404': description: '' + '410': + description: '' parameters: - name: id - description: ID of the log drain. in: path required: true schema: type: string - description: ID of the log drain. - - description: The Team identifier or slug to perform the request on behalf of. + - description: The Team identifier to perform the request on behalf of. in: query name: teamId - required: true schema: type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug delete: description: Deletes a Configurable Log Drain. This endpoint must be called with a team AccessToken (integration OAuth2 clients are not allowed). Only log drains owned by the authenticated team can be deleted. operationId: deleteConfigurableLogDrain security: - bearerToken: [] - summary: Deletes a Configurable Log Drain + summary: Deletes a Configurable Log Drain (deprecated) tags: - logDrains responses: @@ -597,32 +171,38 @@ paths: '400': description: One of the provided values in the request query is invalid. '401': - description: '' + description: The request is not authorized. '403': description: You do not have permission to access this resource. '404': description: '' + '410': + description: '' parameters: - name: id - description: ID of the log drain to be deleted. in: path required: true schema: type: string - description: ID of the log drain to be deleted. - - description: The Team identifier or slug to perform the request on behalf of. + - description: The Team identifier to perform the request on behalf of. in: query name: teamId - required: true schema: type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug /v1/log-drains: get: - description: Retrieves a list of Configurable Log Drains. This endpoint must be called with a team AccessToken (integration OAuth2 clients are not allowed). Only log drains owned by the authenticated team can be accessed. - operationId: getConfigurableLogDrains + description: Retrieves a list of all the Log Drains owned by the account. This endpoint must be called with an account AccessToken (integration OAuth2 clients are not allowed). Only log drains owned by the authenticated account can be accessed. + operationId: getAllLogDrains security: - bearerToken: [] - summary: Retrieves a list of Configurable Log Drains + summary: Retrieves a list of all the Log Drains (deprecated) tags: - logDrains responses: @@ -631,232 +211,376 @@ paths: content: application/json: schema: - items: - properties: - id: - type: string - deliveryFormat: - type: string - enum: - - json - - ndjson - - syslog - url: - type: string - name: - type: string - clientId: - type: string - configurationId: - type: string - teamId: - nullable: true - type: string - ownerId: - type: string - projectIds: - items: - type: string - type: array - createdAt: - type: number - sources: - items: - type: string - enum: - - static - - lambda - - build - - edge - - external - - deployment - type: array - headers: - additionalProperties: - type: string - type: object - environment: - type: string - enum: - - production - - preview - branch: - type: string - status: - type: string - enum: - - enabled - - disabled - - errored - disabledAt: - type: number - disabledReason: - type: string - enum: - - log-drain-high-error-rate - - log-drains-add-on-disabled-by-owner - - disabled-by-admin - - account-plan-downgrade - disabledBy: - type: string - firstErrorTimestamp: - type: number - secret: - type: string - createdFrom: - type: string - enum: - - self-served - required: - - id - - deliveryFormat - - url - - name - - ownerId - - createdAt - - secret - type: object - type: array + $ref: '#/components/schemas/GetAllLogDrainsResponse' '400': description: One of the provided values in the request query is invalid. '401': - description: '' + description: The request is not authorized. '403': description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' parameters: - name: projectId in: query schema: - pattern: '^[a-zA-z0-9_]+$' + pattern: ^[a-zA-z0-9_]+$ type: string - - description: The Team identifier or slug to perform the request on behalf of. + - name: projectIdOrName + in: query + schema: + type: string + - name: includeMetadata + in: query + schema: + type: boolean + default: false + - description: The Team identifier to perform the request on behalf of. in: query name: teamId - required: true schema: type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug post: description: Creates a configurable log drain. This endpoint must be called with a team AccessToken (integration OAuth2 clients are not allowed) operationId: createConfigurableLogDrain security: - bearerToken: [] - summary: Creates a Configurable Log Drain + summary: Creates a Configurable Log Drain (deprecated) + tags: + - logDrains + responses: + '200': + description: '' + content: + application/json: + schema: + type: string + description: (opaque JSON object) + '400': + description: One of the provided values in the request body is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '410': + description: '' + parameters: + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + requestBody: + content: + application/json: + schema: + type: object + additionalProperties: false + required: + - deliveryFormat + - url + - sources + properties: + deliveryFormat: + description: The delivery log format + example: json + enum: + - json + - ndjson + url: + description: The log drain url + format: uri + pattern: ^(http|https)?:// + type: string + headers: + description: Headers to be sent together with the request + type: object + additionalProperties: + type: string + projectIds: + minItems: 1 + maxItems: 50 + type: array + items: + pattern: ^[a-zA-z0-9_]+$ + type: string + sources: + type: array + uniqueItems: true + items: + type: string + enum: + - static + - lambda + - build + - edge + - external + - firewall + minItems: 1 + environments: + type: array + uniqueItems: true + items: + type: string + enum: + - preview + - production + minItems: 1 + secret: + description: Custom secret of log drain + type: string + samplingRate: + type: number + description: The sampling rate for this log drain. It should be a percentage rate between 0 and 100. With max 2 decimal points + minimum: 0.01 + maximum: 1 + multipleOf: 0.01 + name: + type: string + description: The custom name of this log drain. + required: true + /v2/integrations/log-drains: + get: + description: Retrieves a list of all Integration log drains that are defined for the authenticated user or team. When using an OAuth2 token, the list is limited to log drains created by the authenticated integration. + operationId: getIntegrationLogDrains + security: + - bearerToken: [] + summary: Retrieves a list of Integration log drains (deprecated) tags: - logDrains responses: '200': + description: A list of log drains + content: + application/json: + schema: + $ref: '#/components/schemas/GetIntegrationLogDrainsResponse' + '400': + description: '' + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '410': description: '' + parameters: + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + post: + description: Creates an Integration log drain. This endpoint must be called with an OAuth2 client (integration), since log drains are tied to integrations. If it is called with a different token type it will produce a 400 error. + operationId: createLogDrain + security: + - bearerToken: [] + summary: Creates a new Integration Log Drain (deprecated) + tags: + - logDrains + responses: + '200': + description: The log drain was successfully created content: application/json: schema: properties: - secret: + clientId: + type: string + description: The oauth2 client application id that created this log drain + example: oac_xRhY4LAB7yLhUADD69EvV7ct + configurationId: type: string - description: The secret to validate the log-drain payload + description: The client configuration this log drain was created with + example: icfg_3bwCLgxL8qt5kjRLcv2Dit7F + createdAt: + type: number + description: A timestamp that tells you when the log drain was created + example: 1558531915505 id: type: string + description: The unique identifier of the log drain. Always prefixed with `ld_` + example: ld_nBuA7zCID8g4QZ8g deliveryFormat: type: string enum: - json - ndjson - - syslog - url: - type: string + - protobuf + description: The delivery log format + example: json name: type: string - clientId: - type: string - configurationId: + description: The name of the log drain + example: My first log drain + ownerId: type: string - teamId: + description: The identifier of the team or user whose events will trigger the log drain + example: kr1PsOIzqEL5Xg6M4VZcZosf + projectId: nullable: true type: string - ownerId: - type: string + example: AbCgVkqoxXeXCDWehVir51LHGrrcWL4mkYm14W6UBPWQeb projectIds: items: type: string type: array - createdAt: - type: number + description: The identifier of the projects this log drain is associated with + example: AbCgVkqoxXeXCDWehVir51LHGrrcWL4mkYm14W6UBPWQeb + url: + type: string + description: The URL to call when logs are generated + example: https://example.com/log-drain sources: items: type: string enum: - - static - - lambda - build - edge - external - - deployment + - firewall + - lambda + - redirect + - static + description: The sources from which logs are currently being delivered to this log drain. + example: + - build + - edge type: array + description: The sources from which logs are currently being delivered to this log drain. + example: + - build + - edge + createdFrom: + type: string + enum: + - integration + - self-served + description: Whether the log drain was created by an integration or by a user + example: integration headers: additionalProperties: type: string type: object - environment: - type: string - enum: + description: The headers to send with the request + example: '{"Authorization": "Bearer 123"}' + environments: + items: + type: string + enum: + - preview + - production + description: The environment of log drain + example: + - production + type: array + description: The environment of log drain + example: - production - - preview branch: type: string - status: - type: string - enum: - - enabled - - disabled - - errored - disabledAt: - type: number - disabledReason: - type: string - enum: - - log-drain-high-error-rate - - log-drains-add-on-disabled-by-owner - - disabled-by-admin - - account-plan-downgrade - disabledBy: - type: string - firstErrorTimestamp: + description: The branch regexp of log drain + example: feature/* + samplingRate: type: number - createdFrom: - type: string - enum: - - self-served + description: The sampling rate of log drain + example: 0.5 + source: + properties: + kind: + type: string + enum: + - self-served + resourceId: + type: string + externalResourceId: + type: string + integrationId: + type: string + integrationConfigurationId: + type: string + required: + - kind + - integrationConfigurationId + - integrationId + type: object required: + - createdAt - id - - deliveryFormat - - url - name - ownerId - - createdAt + - source + - url type: object '400': - description: One of the provided values in the request body is invalid. + description: |- + One of the provided values in the request body is invalid. + The provided token is not from an OAuth2 Client '401': - description: '' + description: The request is not authorized. '403': description: You do not have permission to access this resource. + '410': + description: '' parameters: - - description: The Team identifier or slug to perform the request on behalf of. + - description: The Team identifier to perform the request on behalf of. in: query name: teamId - required: true schema: type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug requestBody: content: application/json: schema: - type: object - additionalProperties: false - required: - - deliveryFormat - - url - - sources properties: + name: + description: The name of the log drain + example: My first log drain + maxLength: 100 + pattern: ^[A-z0-9_ -]+$ + type: string + projectIds: + minItems: 1 + maxItems: 50 + type: array + items: + pattern: ^[a-zA-z0-9_]+$ + type: string + secret: + description: A secret to sign log drain notification headers so a consumer can verify their authenticity + example: a1Xsfd325fXcs + maxLength: 100 + pattern: ^[A-z0-9_ -]+$ + type: string deliveryFormat: description: The delivery log format example: json @@ -864,22 +588,11 @@ paths: - json - ndjson url: - description: The log drain url + description: The url where you will receive logs. The protocol must be `https://` or `http://` when type is `json` and `ndjson`. + example: https://example.com/log-drain format: uri - pattern: '^(http|https)?://' + pattern: ^https?:// type: string - headers: - description: Headers to be sent together with the request - type: object - additionalProperties: - type: string - projectIds: - minItems: 1 - maxItems: 50 - type: array - items: - pattern: '^[a-zA-z0-9_]+$' - type: string sources: type: array uniqueItems: true @@ -891,17 +604,439 @@ paths: - build - edge - external + - firewall minItems: 1 - environment: - description: The environment of log drain - example: production + headers: + description: Headers to be sent together with the request + type: object + additionalProperties: + type: string + environments: + type: array + uniqueItems: true + items: + type: string + enum: + - preview + - production + minItems: 1 + required: + - name + - url + type: object + required: true + /v1/integrations/log-drains/{id}: + delete: + description: Deletes the Integration log drain with the provided `id`. When using an OAuth2 Token, the log drain can be deleted only if the integration owns it. + operationId: deleteIntegrationLogDrain + security: + - bearerToken: [] + summary: Deletes the Integration log drain with the provided `id` (deprecated) + tags: + - logDrains + responses: + '204': + description: The log drain was successfully deleted + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + parameters: + - name: id + description: ID of the log drain to be deleted + in: path + required: true + schema: + description: ID of the log drain to be deleted + type: string + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug +components: + schemas: + GetAllLogDrainsResponse: + type: object + properties: + log_drains: + type: array + items: + type: object + properties: + createdFrom: + type: string + clientId: + type: string + configurationId: + type: string + projectsMetadata: + nullable: true + items: + properties: + id: + type: string + name: + type: string + framework: + nullable: true + type: string + enum: + - actix-web + - angular + - ash + - astro + - axum + - blitzjs + - brunch + - bun + - container + - create-react-app + - django + - docusaurus + - docusaurus-2 + - dojo + - eleventy + - elysia + - ember + - eve + - express + - factory-eve + - fastapi + - fasthtml + - fastify + - flask + - gatsby + - go + - gridsome + - h3 + - hexo + - hono + - hugo + - hydrogen + - ionic-angular + - ionic-react + - jekyll + - koa + - mastra + - middleman + - nestjs + - nextjs + - nitro + - node + - nuxtjs + - parcel + - polymer + - preact + - python + - react-router + - redwoodjs + - remix + - ruby + - rust + - saber + - sanity + - sanity-v2 + - sapper + - scully + - services + - solidstart + - solidstart-1 + - stencil + - storybook + - svelte + - sveltekit + - sveltekit-1 + - tanstack-start + - tanstack-start-lovable + - umijs + - vite + - vitepress + - vue + - vuepress + - xmcp + - zola + - null + latestDeployment: + type: string + required: + - id + - name + type: object + type: array + integrationIcon: + type: string + integrationConfigurationUri: + type: string + integrationWebsite: + type: string + required: + - createdFrom + GetIntegrationLogDrainsResponse: + type: object + properties: + integration_log_drains: + type: array + items: + properties: + clientId: + type: string + description: The oauth2 client application id that created this log drain + example: oac_xRhY4LAB7yLhUADD69EvV7ct + configurationId: + type: string + description: The client configuration this log drain was created with + example: icfg_3bwCLgxL8qt5kjRLcv2Dit7F + createdAt: + type: number + description: A timestamp that tells you when the log drain was created + example: 1558531915505 + id: + type: string + description: The unique identifier of the log drain. Always prefixed with `ld_` + example: ld_nBuA7zCID8g4QZ8g + deliveryFormat: + type: string + enum: + - json + - ndjson + - protobuf + description: The delivery log format + example: json + name: + type: string + description: The name of the log drain + example: My first log drain + ownerId: + type: string + description: The identifier of the team or user whose events will trigger the log drain + example: kr1PsOIzqEL5Xg6M4VZcZosf + projectId: + nullable: true + type: string + example: AbCgVkqoxXeXCDWehVir51LHGrrcWL4mkYm14W6UBPWQeb + projectIds: + items: + type: string + type: array + description: The identifier of the projects this log drain is associated with + example: AbCgVkqoxXeXCDWehVir51LHGrrcWL4mkYm14W6UBPWQeb + url: + type: string + description: The URL to call when logs are generated + example: https://example.com/log-drain + sources: + items: + type: string enum: - - preview - - production - branch: - description: The branch regexp of log drain - example: feature/* + - build + - edge + - external + - firewall + - lambda + - redirect + - static + description: The sources from which logs are currently being delivered to this log drain. + example: + - build + - edge + type: array + description: The sources from which logs are currently being delivered to this log drain. + example: + - build + - edge + createdFrom: + type: string + enum: + - integration + - self-served + description: Whether the log drain was created by an integration or by a user + example: integration + headers: + additionalProperties: type: string - secret: - description: Custom secret of log drain + type: object + description: The headers to send with the request + example: '{"Authorization": "Bearer 123"}' + environments: + items: type: string + enum: + - preview + - production + description: The environment of log drain + example: + - production + type: array + description: The environment of log drain + example: + - production + branch: + type: string + description: The branch regexp of log drain + example: feature/* + samplingRate: + type: number + description: The sampling rate of log drain + example: 0.5 + source: + oneOf: + - properties: + kind: + type: string + enum: + - self-served + required: + - kind + type: object + - properties: + kind: + type: string + enum: + - integration + resourceId: + type: string + externalResourceId: + type: string + integrationId: + type: string + integrationConfigurationId: + type: string + required: + - integrationConfigurationId + - integrationId + - kind + type: object + required: + - createdAt + - id + - name + - ownerId + - source + - url + type: object + x-stackQL-resources: + log_drains: + id: vercel.log_drains.log_drains + name: log_drains + title: Log Drains + methods: + get: + operation: + $ref: '#/paths/~1v1~1log-drains~1{id}/get' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + delete: + operation: + $ref: '#/paths/~1v1~1log-drains~1{id}/delete' + response: + mediaType: application/json + openAPIDocKey: '204' + request: + nativeCasing: camel + list: + operation: + $ref: '#/paths/~1v1~1log-drains/get' + response: + mediaType: application/json + openAPIDocKey: '200' + objectKey: $.log_drains + overrideMediaType: application/json + schema_override: + $ref: '#/components/schemas/GetAllLogDrainsResponse' + transform: + body: |- + {{- $wrapped := printf "{\"log_drains\":%s}" . -}} + {{- $wrapped -}} + type: golang_template_text_v0.3.0 + request: + nativeCasing: camel + create: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v1~1log-drains/post' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/log_drains/methods/get' + - $ref: '#/components/x-stackQL-resources/log_drains/methods/list' + insert: + - $ref: '#/components/x-stackQL-resources/log_drains/methods/create' + update: [] + delete: + - $ref: '#/components/x-stackQL-resources/log_drains/methods/delete' + replace: [] + integration_log_drains: + id: vercel.log_drains.integration_log_drains + name: integration_log_drains + title: Integration Log Drains + methods: + list: + operation: + $ref: '#/paths/~1v2~1integrations~1log-drains/get' + response: + mediaType: application/json + openAPIDocKey: '200' + objectKey: $.integration_log_drains + overrideMediaType: application/json + schema_override: + $ref: '#/components/schemas/GetIntegrationLogDrainsResponse' + transform: + body: |- + {{- $wrapped := printf "{\"integration_log_drains\":%s}" . -}} + {{- $wrapped -}} + type: golang_template_text_v0.3.0 + request: + nativeCasing: camel + create: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v2~1integrations~1log-drains/post' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + delete: + operation: + $ref: '#/paths/~1v1~1integrations~1log-drains~1{id}/delete' + response: + mediaType: application/json + openAPIDocKey: '204' + request: + nativeCasing: camel + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/integration_log_drains/methods/list' + insert: + - $ref: '#/components/x-stackQL-resources/integration_log_drains/methods/create' + update: [] + delete: + - $ref: '#/components/x-stackQL-resources/integration_log_drains/methods/delete' + replace: [] +servers: + - url: https://api.vercel.com diff --git a/provider-dev/openapi/src/vercel/v00.00.00000/services/marketplace.yaml b/provider-dev/openapi/src/vercel/v00.00.00000/services/marketplace.yaml new file mode 100644 index 0000000..a2a7219 --- /dev/null +++ b/provider-dev/openapi/src/vercel/v00.00.00000/services/marketplace.yaml @@ -0,0 +1,2913 @@ +openapi: 3.0.3 +info: + title: marketplace API + description: vercel marketplace API + version: 0.0.1 +paths: + /v1/installations/{integration_configuration_id}: + patch: + description: This endpoint updates an integration installation. + operationId: update-installation + security: + - bearerToken: [] + summary: Update Installation + tags: + - marketplace + responses: + '204': + description: '' + '400': + description: |- + One of the provided values in the request body is invalid. + One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + parameters: + - name: integration_configuration_id + in: path + required: true + schema: + type: string + requestBody: + content: + application/json: + schema: + type: object + properties: + status: + type: string + enum: + - ready + - pending + - onboarding + - suspended + - resumed + - uninstalled + - error + externalId: + type: string + billingPlan: + type: object + required: + - id + - type + - name + properties: + id: + type: string + type: + type: string + enum: + - prepayment + - subscription + name: + type: string + description: + type: string + paymentMethodRequired: + type: boolean + cost: + type: string + details: + type: array + items: + type: object + properties: + label: + type: string + value: + type: string + required: + - label + additionalProperties: false + highlightedDetails: + type: array + items: + type: object + properties: + label: + type: string + value: + type: string + required: + - label + additionalProperties: false + effectiveDate: + type: string + additionalProperties: true + notification: + description: A notification to display to your customer. Send `null` to clear the current notification. + type: object + required: + - level + - title + properties: + level: + type: string + enum: + - info + - warn + - error + title: + type: string + message: + type: string + href: + type: string + format: uri + pattern: '^https?://|^sso:' + additionalProperties: false + /v1/installations/{integration_configuration_id}/account: + get: + description: Fetches the best account or user’s contact info + operationId: get-account-info + security: + - bearerToken: [] + summary: Get Account Information + tags: + - marketplace + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + name: + type: string + description: The name of the team the installation is tied to. + url: + type: string + description: A URL linking to the installation in the Vercel Dashboard. + contact: + nullable: true + properties: + email: + type: string + name: + type: string + required: + - email + type: object + description: The best contact for the integration, which can change as team members and their roles change. + required: + - contact + - url + type: object + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + parameters: + - name: integration_configuration_id + in: path + required: true + schema: + type: string + /v1/installations/{integration_configuration_id}/member/{member_id}: + get: + description: Returns the member role and other information for a given member ID ("user_id" claim in the SSO OIDC token). + operationId: get-member + security: + - bearerToken: [] + summary: Get Member Information + tags: + - marketplace + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + id: + type: string + role: + type: string + enum: + - ADMIN + - USER + description: '"The `ADMIN` role, by default, is provided to users capable of installing integrations, while the `USER` role can be granted to Vercel users with the Vercel `Billing` or Vercel `Viewer` role, which are considered to be Read-Only roles."' + globalUserId: + type: string + userEmail: + type: string + required: + - id + - role + type: object + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + parameters: + - name: integration_configuration_id + in: path + required: true + schema: + type: string + - name: member_id + in: path + required: true + schema: + type: string + /v1/installations/{integration_configuration_id}/credentials/rotate: + post: + description: 'Issues a replacement access token for an installation, so a partner can rotate a credential it believes is compromised without the customer having to reinstall. Authenticated by the credential being replaced plus the integration''s client secret: a leaked access token on its own cannot rotate itself, which would otherwise let an attacker take over the installation and lock the partner out. The previous credential intentionally stays valid so in-flight requests keep working. Retiring it is a separate, explicit operation — a partner is never left mid-rotation without a working credential.' + operationId: rotate-installation-credential + security: + - bearerToken: [] + summary: Rotate Installation Credential + tags: + - marketplace + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + scope: + type: string + expires_in: + type: number + access_token: + type: string + token_type: + type: string + enum: + - oauth2-token + required: + - access_token + - expires_in + - scope + - token_type + type: object + '400': + description: |- + One of the provided values in the request body is invalid. + One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '409': + description: '' + '410': + description: '' + parameters: + - name: integration_configuration_id + in: path + required: true + schema: + type: string + requestBody: + content: + application/json: + schema: + type: object + required: + - client_secret + properties: + client_secret: + type: string + maxLength: 512 + client_id: + type: string + additionalProperties: false + /v1/installations/{integration_configuration_id}/credentials/revoke: + post: + description: 'Retires a superseded installation credential, so a partner can complete a rotation it started with `POST /credentials/rotate` — the leaked credential stops working without the customer having to reinstall. Authenticated by a live installation credential plus the integration''s client secret. The credential to retire is named in the body rather than being the one that authenticates, so the ordinary flow is: rotate, store the replacement, then authenticate with the replacement and revoke the old one. Refuses to retire an installation''s last live credential. Rotation exists so remediation is not customer-visible; revoking the only credential would undo that and leave the install needing a reinstall.' + operationId: revoke-installation-credential + security: + - bearerToken: [] + summary: Revoke Installation Credential + tags: + - marketplace + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + revoked: + type: boolean + enum: + - false + - true + already_revoked: + type: boolean + enum: + - false + - true + required: + - already_revoked + - revoked + type: object + '400': + description: |- + One of the provided values in the request body is invalid. + One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '409': + description: '' + '410': + description: '' + parameters: + - name: integration_configuration_id + in: path + required: true + schema: + type: string + requestBody: + content: + application/json: + schema: + type: object + required: + - token + - client_secret + properties: + token: + type: string + maxLength: 512 + client_secret: + type: string + maxLength: 512 + client_id: + type: string + additionalProperties: false + /v1/installations/{integration_configuration_id}/events: + post: + description: 'Partner notifies Vercel of any changes made to an Installation or a Resource. Vercel is expected to use `list-resources` and other read APIs to get the new state.

`resource.updated` event should be dispatched when any state of a resource linked to Vercel is modified by the partner.
`installation.updated` event should be dispatched when an installation''s billing plan is changed via the provider instead of Vercel.

Resource update use cases:

- The user renames a database in the partner’s application. The partner should dispatch a `resource.updated` event to notify Vercel to update the resource in Vercel’s datastores.
- A resource has been suspended due to a lack of use. The partner should dispatch a `resource.updated` event to notify Vercel to update the resource''s status in Vercel''s datastores.
' + operationId: create-event + security: + - bearerToken: [] + summary: Create Event + tags: + - marketplace + responses: + '201': + description: '' + '400': + description: |- + One of the provided values in the request body is invalid. + One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + parameters: + - name: integration_configuration_id + in: path + required: true + schema: + type: string + requestBody: + content: + application/json: + schema: + type: object + required: + - event + properties: + event: + type: object + properties: + type: + type: string + enum: + - installation.updated + billingPlanId: + type: string + description: The installation-level billing plan ID + productId: + type: string + description: Partner-provided product slug or id + resourceId: + type: string + description: Partner provided resource ID + required: + - type + - resourceId + additionalProperties: false + additionalProperties: false + required: true + /v1/installations/{integration_configuration_id}/resources: + get: + description: Get all resources for a given installation ID. + operationId: get-integration-resources + security: + - bearerToken: [] + summary: Get Integration Resources + tags: + - marketplace + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + resources: + items: + properties: + partnerId: + type: string + description: The ID provided by the partner for the given resource + internalId: + type: string + description: The ID assigned by Vercel for the given resource + name: + type: string + description: The name of the resource as it is recorded in Vercel + status: + type: string + enum: + - error + - onboarding + - pending + - ready + - resumed + - suspended + - uninstalled + description: The current status of the resource + productId: + type: string + description: The ID of the product the resource is derived from + protocolSettings: + properties: + experimentation: + properties: + edgeConfigSyncingEnabled: + type: boolean + enum: + - false + - true + edgeConfigId: + type: string + globalConfigId: + type: string + globalConfigSyncingEnabled: + type: boolean + enum: + - false + - true + edgeConfigTokenId: + type: string + type: object + authentication: + properties: + appUrls: + items: + properties: + url: + type: string + target: + type: string + enum: + - development + - preview + - production + required: + - target + - url + type: object + type: array + type: object + type: object + description: Any settings provided for the resource to support its product's protocols + notification: + properties: + title: + type: string + level: + type: string + enum: + - error + - info + - warn + message: + type: string + href: + type: string + required: + - level + - title + type: object + description: The notification, if set, displayed to the user when viewing the resource in Vercel + billingPlanId: + type: string + description: The ID of the billing plan the resource is subscribed to, if applicable + metadata: + additionalProperties: + oneOf: + - type: string + - type: number + - items: + type: string + type: array + description: The configured metadata for the resource as defined by its product's Metadata Schema + - items: + type: number + type: array + description: The configured metadata for the resource as defined by its product's Metadata Schema + - type: boolean + enum: + - false + - true + type: object + description: The configured metadata for the resource as defined by its product's Metadata Schema + required: + - internalId + - name + - partnerId + - productId + type: object + type: array + required: + - resources + type: object + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + parameters: + - name: integration_configuration_id + in: path + required: true + schema: + type: string + /v1/installations/{integration_configuration_id}/resources/{resource_id}: + get: + description: Get a resource by its partner ID. + operationId: get-integration-resource + security: + - bearerToken: [] + summary: Get Integration Resource + tags: + - marketplace + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + id: + type: string + description: The ID provided by the 3rd party provider for the given resource + internalId: + type: string + description: The ID assigned by Vercel for the given resource + name: + type: string + description: The name of the resource as it is recorded in Vercel + status: + type: string + enum: + - error + - onboarding + - pending + - ready + - resumed + - suspended + - uninstalled + description: The current status of the resource + productId: + type: string + description: The ID of the product the resource is derived from + protocolSettings: + properties: + experimentation: + properties: + edgeConfigId: + type: string + globalConfigId: + type: string + type: object + authentication: + properties: + appUrls: + items: + properties: + url: + type: string + target: + type: string + enum: + - development + - preview + - production + required: + - target + - url + type: object + type: array + type: object + type: object + description: Any settings provided for the resource to support its product's protocols + notification: + properties: + title: + type: string + level: + type: string + enum: + - error + - info + - warn + message: + type: string + href: + type: string + required: + - level + - title + type: object + description: The notification, if set, displayed to the user when viewing the resource in Vercel + billingPlanId: + type: string + description: The ID of the billing plan the resource is subscribed to, if applicable + metadata: + additionalProperties: + oneOf: + - type: string + - type: number + - items: + type: string + type: array + description: The configured metadata for the resource as defined by its product's Metadata Schema + - items: + type: number + type: array + description: The configured metadata for the resource as defined by its product's Metadata Schema + - type: boolean + enum: + - false + - true + type: object + description: The configured metadata for the resource as defined by its product's Metadata Schema + required: + - id + - internalId + - name + - productId + type: object + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + parameters: + - name: integration_configuration_id + description: The ID of the integration configuration (installation) the resource belongs to + in: path + required: true + schema: + type: string + description: The ID of the integration configuration (installation) the resource belongs to + - name: resource_id + description: The ID provided by the 3rd party provider for the given resource + in: path + required: true + schema: + type: string + description: The ID provided by the 3rd party provider for the given resource + delete: + description: Delete a resource owned by the selected installation ID. + operationId: delete-integration-resource + security: + - bearerToken: [] + summary: Delete Integration Resource + tags: + - marketplace + responses: + '204': + description: '' + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + parameters: + - name: integration_configuration_id + in: path + required: true + schema: + type: string + - name: resource_id + in: path + required: true + schema: + type: string + put: + description: This endpoint imports (upserts) a resource to Vercel's installation. This may be needed if resources can be independently created on the partner's side and need to be synchronized to Vercel. When importing as part of the user-initiated import flow, call this endpoint before redirecting the user back to Vercel. See the [Import existing resources flow](https://vercel.com/docs/integrations/create-integration/marketplace-flows#import-existing-resources-flow) for the full contract. + operationId: import-resource + security: + - bearerToken: [] + summary: Import Resource + tags: + - marketplace + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + name: + type: string + required: + - name + type: object + '400': + description: |- + One of the provided values in the request body is invalid. + One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '409': + description: '' + '410': + description: '' + '422': + description: '' + parameters: + - name: integration_configuration_id + in: path + required: true + schema: + type: string + - name: resource_id + in: path + required: true + schema: + type: string + requestBody: + content: + application/json: + schema: + type: object + required: + - productId + - name + - status + properties: + ownership: + type: string + enum: + - owned + - linked + - sandbox + productId: + type: string + name: + type: string + status: + type: string + enum: + - ready + - pending + - onboarding + - suspended + - resumed + - uninstalled + - error + metadata: + type: object + additionalProperties: true + billingPlan: + type: object + required: + - id + - type + - name + properties: + id: + type: string + type: + type: string + enum: + - prepayment + - subscription + name: + type: string + description: + type: string + paymentMethodRequired: + type: boolean + cost: + type: string + details: + type: array + items: + type: object + properties: + label: + type: string + value: + type: string + required: + - label + additionalProperties: false + highlightedDetails: + type: array + items: + type: object + properties: + label: + type: string + value: + type: string + required: + - label + additionalProperties: false + effectiveDate: + type: string + additionalProperties: true + notification: + type: object + required: + - level + - title + properties: + level: + type: string + enum: + - info + - warn + - error + title: + type: string + message: + type: string + href: + type: string + format: uri + pattern: '^https?://|^sso:' + extras: + type: object + additionalProperties: true + secrets: + type: array + items: + type: object + required: + - name + - value + properties: + name: + type: string + value: + type: string + prefix: + type: string + environmentOverrides: + type: object + description: 'A map of environments to override values for the secret, used for setting different values across deployments in production, preview, and development environments. Note: the same value will be used for all deployments in the given environment.' + properties: + development: + type: string + description: Value used for development environment. + preview: + type: string + description: Value used for preview environment. + production: + type: string + description: Value used for production environment. + additionalProperties: false + additionalProperties: false + patch: + description: This endpoint updates an existing resource in the installation. All parameters are optional, allowing partial updates. + operationId: update-resource + security: + - bearerToken: [] + summary: Update Resource + tags: + - marketplace + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + name: + type: string + required: + - name + type: object + '400': + description: |- + One of the provided values in the request body is invalid. + One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '409': + description: '' + '410': + description: '' + '422': + description: '' + parameters: + - name: integration_configuration_id + in: path + required: true + schema: + type: string + - name: resource_id + in: path + required: true + schema: + type: string + requestBody: + content: + application/json: + schema: + type: object + properties: + ownership: + type: string + enum: + - owned + - linked + - sandbox + name: + type: string + status: + type: string + enum: + - ready + - pending + - onboarding + - suspended + - resumed + - uninstalled + - error + metadata: + type: object + additionalProperties: true + billingPlan: + type: object + required: + - id + - type + - name + properties: + id: + type: string + type: + type: string + enum: + - prepayment + - subscription + name: + type: string + description: + type: string + paymentMethodRequired: + type: boolean + cost: + type: string + details: + type: array + items: + type: object + properties: + label: + type: string + value: + type: string + required: + - label + additionalProperties: false + highlightedDetails: + type: array + items: + type: object + properties: + label: + type: string + value: + type: string + required: + - label + additionalProperties: false + effectiveDate: + type: string + additionalProperties: true + notification: + type: object + required: + - level + - title + properties: + level: + type: string + enum: + - info + - warn + - error + title: + type: string + message: + type: string + href: + type: string + format: uri + pattern: '^https?://|^sso:' + extras: + type: object + additionalProperties: true + secrets: + type: array + items: + type: object + required: + - name + - value + properties: + name: + type: string + value: + type: string + prefix: + type: string + environmentOverrides: + type: object + description: 'A map of environments to override values for the secret, used for setting different values across deployments in production, preview, and development environments. Note: the same value will be used for all deployments in the given environment.' + properties: + development: + type: string + description: Value used for development environment. + preview: + type: string + description: Value used for preview environment. + production: + type: string + description: Value used for production environment. + additionalProperties: false + required: + - secrets + properties: + secrets: + type: array + items: + type: object + required: + - name + - value + properties: + name: + type: string + value: + type: string + prefix: + type: string + environmentOverrides: + type: object + description: 'A map of environments to override values for the secret, used for setting different values across deployments in production, preview, and development environments. Note: the same value will be used for all deployments in the given environment.' + properties: + development: + type: string + description: Value used for development environment. + preview: + type: string + description: Value used for preview environment. + production: + type: string + description: Value used for production environment. + additionalProperties: false + partial: + type: boolean + description: If true, will only overwrite the provided secrets instead of replacing all secrets. + additionalProperties: false + additionalProperties: false + /v1/installations/{integration_configuration_id}/billing: + post: + description: Sends the billing and usage data. The partner should do this at least once a day and ideally once per hour.
Use the `credentials.access_token` we provided in the [Upsert Installation](#upsert-installation) body to authorize this request. + operationId: submit-billing-data + security: + - bearerToken: [] + summary: Submit Billing Data + tags: + - marketplace + responses: + '201': + description: '' + '400': + description: |- + One of the provided values in the request body is invalid. + One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + parameters: + - name: integration_configuration_id + in: path + required: true + schema: + type: string + requestBody: + content: + application/json: + schema: + type: object + properties: + timestamp: + type: string + format: date-time + description: Server time of your integration, used to determine the most recent data for race conditions & updates. Only the latest usage data for a given day, week, and month will be kept. + eod: + type: string + format: date-time + description: End of Day, the UTC datetime for when the end of the billing/usage day is in UTC time. This tells us which day the usage data is for, and also allows for your "end of day" to be different from UTC 00:00:00. eod must be within the period dates, and cannot be older than 24h earlier from our server's current time. + period: + type: object + description: Period for the billing cycle. The period end date cannot be older than 24 hours earlier than our current server's time. + properties: + start: + type: string + format: date-time + end: + type: string + format: date-time + required: + - start + - end + additionalProperties: false + billing: + description: Billing data (interim invoicing data). + type: array + items: + type: object + properties: + billingPlanId: + type: string + description: Partner's billing plan ID. + resourceId: + type: string + description: Partner's resource ID. + start: + type: string + format: date-time + description: Start and end are only needed if different from the period's start/end. + end: + type: string + format: date-time + description: Start and end are only needed if different from the period's start/end. + name: + type: string + description: Line item name. + details: + type: string + description: Line item details. + price: + type: string + pattern: ^[0-9]+(\.[0-9]+)?$ + description: Price per unit. + quantity: + type: number + description: Quantity of units. + units: + type: string + description: Units of the quantity. + total: + type: string + pattern: ^[0-9]+(\.[0-9]+)?$ + description: Total amount. + required: + - billingPlanId + - name + - price + - quantity + - units + - total + additionalProperties: false + properties: + items: + type: array + items: + type: object + properties: + billingPlanId: + type: string + description: Partner's billing plan ID. + resourceId: + type: string + description: Partner's resource ID. + start: + type: string + format: date-time + description: Start and end are only needed if different from the period's start/end. + end: + type: string + format: date-time + description: Start and end are only needed if different from the period's start/end. + name: + type: string + description: Line item name. + details: + type: string + description: Line item details. + price: + type: string + pattern: ^[0-9]+(\.[0-9]+)?$ + description: Price per unit. + quantity: + type: number + description: Quantity of units. + units: + type: string + description: Units of the quantity. + total: + type: string + pattern: ^[0-9]+(\.[0-9]+)?$ + description: Total amount. + required: + - billingPlanId + - name + - price + - quantity + - units + - total + additionalProperties: false + discounts: + type: array + items: + type: object + properties: + billingPlanId: + type: string + description: Partner's billing plan ID. + resourceId: + type: string + description: Partner's resource ID. + start: + type: string + format: date-time + description: Start and end are only needed if different from the period's start/end. + end: + type: string + format: date-time + description: Start and end are only needed if different from the period's start/end. + name: + type: string + description: Discount name. + details: + type: string + description: Discount details. + amount: + type: string + pattern: ^[0-9]+(\.[0-9]+)?$ + description: Discount amount. + required: + - billingPlanId + - name + - amount + additionalProperties: false + required: + - items + usage: + type: array + items: + type: object + properties: + resourceId: + type: string + description: Partner's resource ID. + name: + type: string + description: Metric name. + type: + type: string + description: |2- + + Type of the metric. + - total: measured total value, such as Database size + - interval: usage during the period, such as i/o or number of queries. + - rate: rate of usage, such as queries per second. + + enum: + - total + - interval + - rate + units: + type: string + description: 'Metric units. Example: "GB"' + dayValue: + type: number + description: Metric value for the day. Could be a final or an interim value for the day. + periodValue: + type: number + description: Metric value for the billing period. Could be a final or an interim value for the period. + planValue: + type: number + description: The limit value of the metric for a billing period, if a limit is defined by the plan. + required: + - name + - type + - units + - dayValue + - periodValue + additionalProperties: false + required: + - timestamp + - eod + - period + - billing + - usage + additionalProperties: false + required: true + /v1/installations/{integration_configuration_id}/billing/invoices: + post: + description: This endpoint allows the partner to submit an invoice to Vercel. The invoice is created in Vercel's billing system and sent to the customer. Depending on the type of billing plan, the invoice can be sent at a time of signup, at the start of the billing period, or at the end of the billing period.

Use the `credentials.access_token` we provided in the [Upsert Installation](#upsert-installation) body to authorize this request.
There are several limitations to the invoice submission:

1. A resource can only be billed once per the billing period and the billing plan.
2. The billing plan used to bill the resource must have been active for this resource during the billing period.
3. The billing plan used must be a subscription plan.
4. The interim usage data must be sent hourly for all types of subscriptions. See [Send subscription billing and usage data](#send-subscription-billing-and-usage-data) API on how to send interim billing and usage data.
5. If provided, `externalId` must be unique for the installation.
+ operationId: submit-invoice + security: + - bearerToken: [] + summary: Submit Invoice + tags: + - marketplace + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + invoiceId: + type: string + test: + type: boolean + enum: + - false + - true + validationErrors: + items: + type: string + type: array + type: object + '400': + description: |- + One of the provided values in the request body is invalid. + One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '409': + description: '' + '410': + description: '' + parameters: + - name: integration_configuration_id + in: path + required: true + schema: + type: string + requestBody: + content: + application/json: + schema: + type: object + properties: + externalId: + type: string + description: Partner-provided invoice identifier. If provided, it must be unique for this installation. + invoiceDate: + type: string + format: date-time + description: Invoice date. Must be within the period's start and end. + memo: + type: string + description: Additional memo for the invoice. + period: + type: object + description: Subscription period for this billing cycle. + properties: + start: + type: string + format: date-time + end: + type: string + format: date-time + required: + - start + - end + additionalProperties: false + items: + type: array + items: + type: object + properties: + resourceId: + type: string + description: Partner's resource ID. + billingPlanId: + type: string + description: Partner's billing plan ID. + start: + type: string + format: date-time + description: Start and end are only needed if different from the period's start/end. + end: + type: string + format: date-time + description: Start and end are only needed if different from the period's start/end. + name: + type: string + details: + type: string + price: + type: string + pattern: ^[0-9]+(\.[0-9]+)?$ + description: Currency amount as a decimal string. + quantity: + type: number + units: + type: string + total: + type: string + pattern: ^[0-9]+(\.[0-9]+)?$ + description: Currency amount as a decimal string. + required: + - billingPlanId + - name + - price + - quantity + - units + - total + additionalProperties: false + discounts: + type: array + items: + type: object + properties: + resourceId: + type: string + description: Partner's resource ID. + billingPlanId: + type: string + description: Partner's billing plan ID. + start: + type: string + format: date-time + description: Start and end are only needed if different from the period's start/end. + end: + type: string + format: date-time + description: Start and end are only needed if different from the period's start/end. + name: + type: string + details: + type: string + amount: + type: string + pattern: ^[0-9]+(\.[0-9]+)?$ + description: Currency amount as a decimal string. + required: + - billingPlanId + - name + - amount + additionalProperties: false + final: + type: boolean + description: Set this to `true` if this is the final invoice for the installation. Can only be set when the installation is pending deletion. + test: + type: object + description: Test mode + properties: + validate: + type: boolean + result: + type: string + enum: + - paid + - notpaid + - overdue + additionalProperties: false + required: + - invoiceDate + - period + - items + additionalProperties: false + required: true + /v1/installations/{integration_configuration_id}/billing/finalize: + post: + description: This endpoint allows the partner to mark an installation as finalized. This means you will not send any more invoices for the installation. Use this after a customer has requested uninstall and you have sent any remaining invoices. This will allow the uninstall process to proceed immediately after all invoices have been paid.
Use the `credentials.access_token` we provided in the [Upsert Installation](#upsert-installation) body to authorize this request. + operationId: finalize-installation + security: + - bearerToken: [] + summary: Finalize Installation + tags: + - marketplace + responses: + '204': + description: '' + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + parameters: + - name: integration_configuration_id + in: path + required: true + schema: + type: string + /v1/installations/{integration_configuration_id}/billing/invoices/{invoice_id}: + get: + description: Get Invoice details and status for a given invoice ID.

See [Billing Events with Webhooks documentation](https://vercel.com/docs/integrations/create-integration/marketplace-api#working-with-billing-events-through-webhooks) on how to receive invoice events. This endpoint is used to retrieve the invoice details. + operationId: get-invoice + security: + - bearerToken: [] + summary: Get Invoice + tags: + - marketplace + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + test: + type: boolean + enum: + - false + - true + description: Whether the invoice is in the testmode (no real transaction created). + invoiceId: + type: string + description: Vercel Marketplace Invoice ID. + externalId: + type: string + description: Partner-supplied Invoice ID, if applicable. + state: + type: string + enum: + - draft + - invoiced + - notpaid + - overdue + - paid + - pending + - refund_requested + - refunded + - scheduled + description: Invoice state. + invoiceNumber: + type: string + description: User-readable invoice number. + invoiceDate: + type: string + description: Invoice date. ISO 8601 timestamp. + period: + properties: + start: + type: string + end: + type: string + required: + - end + - start + type: object + description: Subscription period for this billing cycle. ISO 8601 timestamps. + paidAt: + type: string + description: Moment the invoice was paid. ISO 8601 timestamp. + refundedAt: + type: string + description: Most recent moment the invoice was refunded. ISO 8601 timestamp. + memo: + type: string + description: Additional memo for the invoice. + items: + items: + properties: + billingPlanId: + type: string + description: Partner's billing plan ID. + resourceId: + type: string + description: Partner's resource ID. If not specified, indicates installation-wide item. + start: + type: string + description: Start and end are only needed if different from the period's start/end. ISO 8601 timestamp. + end: + type: string + description: Start and end are only needed if different from the period's start/end. ISO 8601 timestamp. + name: + type: string + description: Invoice item name. + details: + type: string + description: Additional item details. + price: + type: string + description: Item price. A dollar-based decimal string. + quantity: + type: number + description: Item quantity. + units: + type: string + description: Units for item's quantity. + total: + type: string + description: Item total. A dollar-based decimal string. + required: + - billingPlanId + - name + - price + - quantity + - total + - units + type: object + description: Invoice items. + type: array + description: Invoice items. + discounts: + items: + properties: + billingPlanId: + type: string + description: Partner's billing plan ID. + resourceId: + type: string + description: Partner's resource ID. If not specified, indicates installation-wide discount. + start: + type: string + description: Start and end are only needed if different from the period's start/end. ISO 8601 timestamp. + end: + type: string + description: Start and end are only needed if different from the period's start/end. ISO 8601 timestamp. + name: + type: string + description: Discount name. + details: + type: string + description: Additional discount details. + amount: + type: string + description: Discount amount. A dollar-based decimal string. + required: + - amount + - billingPlanId + - name + type: object + description: Invoice discounts. + type: array + description: Invoice discounts. + total: + type: string + description: Invoice total amount. A dollar-based decimal string. + refundReason: + type: string + description: The reason for refund. Only applicable for states "refunded" or "refund_request". + refundTotal: + type: string + description: Refund amount. Only applicable for states "refunded" or "refund_request". A dollar-based decimal string. + created: + type: string + description: System creation date. ISO 8601 timestamp. + updated: + type: string + description: System update date. ISO 8601 timestamp. + required: + - created + - invoiceDate + - invoiceId + - items + - period + - state + - total + - updated + type: object + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + '429': + description: '' + parameters: + - name: integration_configuration_id + in: path + required: true + schema: + type: string + - name: invoice_id + in: path + required: true + schema: + type: string + /v1/installations/{integration_configuration_id}/billing/invoices/{invoice_id}/actions: + post: + description: This endpoint allows the partner to request a refund for an invoice to Vercel. The invoice is created using the [Submit Invoice API](#submit-invoice-api). + operationId: update-invoice + security: + - bearerToken: [] + summary: Invoice Actions + tags: + - marketplace + responses: + '204': + description: '' + '400': + description: |- + One of the provided values in the request body is invalid. + One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '409': + description: '' + '410': + description: '' + parameters: + - name: integration_configuration_id + in: path + required: true + schema: + type: string + - name: invoice_id + in: path + required: true + schema: + type: string + requestBody: + content: + application/json: + schema: + type: object + properties: + action: + type: string + enum: + - refund + reason: + type: string + description: Refund reason. + total: + type: string + pattern: ^[0-9]+(\.[0-9]+)?$ + description: The total amount to be refunded. Must be less than or equal to the total amount of the invoice. + required: + - action + - reason + - total + additionalProperties: false + required: true + /v1/installations/{integration_configuration_id}/billing/balance: + post: + description: Sends the prepayment balances. The partner should do this at least once a day and ideally once per hour.
Use the `credentials.access_token` we provided in the [Upsert Installation](#upsert-installation) body to authorize this request. + operationId: submit-prepayment-balances + security: + - bearerToken: [] + summary: Submit Prepayment Balances + tags: + - marketplace + responses: + '201': + description: '' + '400': + description: |- + One of the provided values in the request body is invalid. + One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + parameters: + - name: integration_configuration_id + in: path + required: true + schema: + type: string + requestBody: + content: + application/json: + schema: + type: object + properties: + timestamp: + type: string + format: date-time + description: Server time of your integration, used to determine the most recent data for race conditions & updates. Only the latest usage data for a given day, week, and month will be kept. + balances: + type: array + items: + type: object + description: A credit balance for a particular token type + properties: + resourceId: + type: string + description: Partner's resource ID, exclude if credits are tied to the installation and not an individual resource. + credit: + type: string + description: A human-readable description of the credits the user currently has, e.g. "2,000 Tokens" + nameLabel: + type: string + description: The name of the credits, for display purposes, e.g. "Tokens" + currencyValueInCents: + type: number + description: The dollar value of the credit balance, in USD and provided in cents, which is used to trigger automatic purchase thresholds. + required: + - currencyValueInCents + additionalProperties: false + required: + - timestamp + - balances + additionalProperties: false + /v1/installations/{integration_configuration_id}/products/{integration_product_id_or_slug}/resources/{resource_id}/secrets: + put: + description: This endpoint is deprecated and replaced with the endpoint [Update Resource Secrets](#update-resource-secrets).
This endpoint updates the secrets of a resource. If a resource has projects connected, the connected secrets are updated with the new secrets. The old secrets may still be used by existing connected projects because they are not automatically redeployed. Redeployment is a manual action and must be completed by the user. All new project connections will use the new secrets.

Use cases for this endpoint:

- Resetting the credentials of a database in the partner. If the user requests the credentials to be updated in the partner’s application, the partner post the new set of secrets to Vercel, the user should redeploy their application and the expire the old credentials.
+ operationId: update-resource-secrets + security: + - bearerToken: [] + summary: 'Deprecated: true. Update Resource Secrets (Deprecated)' + tags: + - marketplace + deprecated: true + responses: + '201': + description: '' + '400': + description: |- + One of the provided values in the request body is invalid. + One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '409': + description: '' + '410': + description: '' + '422': + description: '' + parameters: + - name: integration_configuration_id + in: path + required: true + schema: + type: string + - name: integration_product_id_or_slug + in: path + required: true + schema: + type: string + - name: resource_id + in: path + required: true + schema: + type: string + requestBody: + content: + application/json: + schema: + type: object + required: + - secrets + properties: + secrets: + type: array + items: + type: object + required: + - name + - value + properties: + name: + type: string + value: + type: string + prefix: + type: string + environmentOverrides: + type: object + description: 'A map of environments to override values for the secret, used for setting different values across deployments in production, preview, and development environments. Note: the same value will be used for all deployments in the given environment.' + properties: + development: + type: string + description: Value used for development environment. + preview: + type: string + description: Value used for preview environment. + production: + type: string + description: Value used for production environment. + additionalProperties: false + partial: + type: boolean + description: If true, will only update the provided secrets + additionalProperties: false + required: true + /v1/installations/{integration_configuration_id}/resources/{resource_id}/secrets: + put: + description: This endpoint updates the secrets of a resource. If a resource has projects connected, the connected secrets are updated with the new secrets. The old secrets may still be used by existing connected projects because they are not automatically redeployed. Redeployment is a manual action and must be completed by the user. All new project connections will use the new secrets.

Use cases for this endpoint:

- Resetting the credentials of a database in the partner. If the user requests the credentials to be updated in the partner’s application, the partner post the new set of secrets to Vercel, the user should redeploy their application and the expire the old credentials.
+ operationId: update-resource-secrets-by-id + security: + - bearerToken: [] + summary: Update Resource Secrets + tags: + - marketplace + responses: + '201': + description: '' + '400': + description: |- + One of the provided values in the request body is invalid. + One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '409': + description: '' + '410': + description: '' + '422': + description: '' + parameters: + - name: integration_configuration_id + in: path + required: true + schema: + type: string + - name: resource_id + in: path + required: true + schema: + type: string + requestBody: + content: + application/json: + schema: + type: object + required: + - secrets + properties: + secrets: + type: array + items: + type: object + required: + - name + - value + properties: + name: + type: string + value: + type: string + prefix: + type: string + environmentOverrides: + type: object + description: 'A map of environments to override values for the secret, used for setting different values across deployments in production, preview, and development environments. Note: the same value will be used for all deployments in the given environment.' + properties: + development: + type: string + description: Value used for development environment. + preview: + type: string + description: Value used for preview environment. + production: + type: string + description: Value used for production environment. + additionalProperties: false + partial: + type: boolean + description: If true, will only overwrite the provided secrets instead of replacing all secrets. + additionalProperties: false + /v1/integrations/sso/token: + post: + description: During the autorization process, Vercel sends the user to the provider [redirectLoginUrl](https://vercel.com/docs/integrations/create-integration/submit-integration#redirect-login-url), that includes the OAuth authorization `code` parameter. The provider then calls the SSO Token Exchange endpoint with the sent code and receives the OIDC token. They log the user in based on this token and redirects the user back to the Vercel account using deep-link parameters included the redirectLoginUrl. Providers should not persist the returned `id_token` in a database since the token will expire. See [**Authentication with SSO**](https://vercel.com/docs/integrations/create-integration/marketplace-api#authentication-with-sso) for more details. + operationId: exchange-sso-token + security: [] + summary: SSO Token Exchange + tags: + - authentication + - marketplace + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + id_token: + type: string + token_type: + nullable: true + type: string + expires_in: + type: number + access_token: + nullable: true + type: string + refresh_token: + type: string + required: + - access_token + - id_token + - token_type + - expires_in + - refresh_token + type: object + '400': + description: One of the provided values in the request body is invalid. + '403': + description: '' + '500': + description: '' + parameters: [] + requestBody: + content: + application/json: + schema: + type: object + required: + - code + - client_id + - client_secret + - grant_type + - refresh_token + properties: + code: + type: string + description: The sensitive code received from Vercel + state: + type: string + description: The state received from the initialization request + client_id: + type: string + description: The integration client id + client_secret: + type: string + description: The integration client secret + redirect_uri: + type: string + description: The integration redirect URI + grant_type: + type: string + description: The grant type, when using x-www-form-urlencoded content type + enum: + - authorization_code + refresh_token: + type: string + description: The refresh token received from previous token exchange + required: true + /v1/installations/{integration_configuration_id}/resources/{resource_id}/experimentation/items: + post: + description: Create one or multiple experimentation items + operationId: createInstallationsByIntegrationConfigurationIdResourcesByResourceIdExperimentationItems + security: + - bearerToken: [] + summary: Create one or multiple experimentation items + tags: + - marketplace + responses: + '204': + description: The items were created + '400': + description: |- + One of the provided values in the request body is invalid. + One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + parameters: + - name: integration_configuration_id + in: path + required: true + schema: + type: string + - name: resource_id + in: path + required: true + schema: + type: string + requestBody: + content: + application/json: + schema: + type: object + additionalProperties: false + required: + - items + properties: + items: + type: array + maxItems: 50 + items: + type: object + additionalProperties: false + required: + - id + - slug + - origin + properties: + id: + type: string + maxLength: 1024 + slug: + type: string + maxLength: 1024 + origin: + type: string + maxLength: 2048 + category: + type: string + enum: + - experiment + - flag + name: + type: string + maxLength: 1024 + description: + type: string + maxLength: 1024 + isArchived: + type: boolean + createdAt: + type: number + updatedAt: + type: number + x-speakeasy-name-override: createInstallationIntegrationConfiguration + /v1/installations/{integration_configuration_id}/resources/{resource_id}/experimentation/items/{item_id}: + patch: + description: Patch an existing experimentation item + operationId: updateInstallationsByIntegrationConfigurationIdResourcesByResourceIdExperimentationItemsByItemId + security: + - bearerToken: [] + summary: Patch an existing experimentation item + tags: + - marketplace + responses: + '204': + description: The item was updated + '400': + description: |- + One of the provided values in the request body is invalid. + One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + parameters: + - name: integration_configuration_id + in: path + required: true + schema: + type: string + - name: resource_id + in: path + required: true + schema: + type: string + - name: item_id + in: path + required: true + schema: + type: string + requestBody: + content: + application/json: + schema: + type: object + additionalProperties: false + required: + - slug + - origin + properties: + slug: + type: string + maxLength: 1024 + origin: + type: string + maxLength: 2048 + name: + type: string + maxLength: 1024 + category: + type: string + enum: + - experiment + - flag + description: + type: string + maxLength: 1024 + isArchived: + type: boolean + createdAt: + type: number + updatedAt: + type: number + x-speakeasy-name-override: updateInstallationIntegrationConfiguration + delete: + description: Delete an existing experimentation item + operationId: deleteInstallationsByIntegrationConfigurationIdResourcesByResourceIdExperimentationItemsByItemId + security: + - bearerToken: [] + summary: Delete an existing experimentation item + tags: + - marketplace + responses: + '204': + description: The item was deleted + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + parameters: + - name: integration_configuration_id + in: path + required: true + schema: + type: string + - name: resource_id + in: path + required: true + schema: + type: string + - name: item_id + in: path + required: true + schema: + type: string + x-speakeasy-name-override: deleteInstallationIntegrationConfiguration + /v1/installations/{integration_configuration_id}/resources/{resource_id}/experimentation/global-config: + head: + description: When the user enabled Global Config syncing, then this endpoint can be used by the partner to fetch the contents of the Global Config. + operationId: headInstallationsByIntegrationConfigurationIdResourcesByResourceIdExperimentationGlobalConfig + security: + - bearerToken: [] + summary: Get the data of a user-provided Global Config + tags: + - marketplace + responses: + '200': + description: The Global Config data + content: + application/json: + schema: + properties: + items: + additionalProperties: + $ref: '#/components/schemas/GlobalConfigItemValue' + type: object + updatedAt: + type: number + digest: + type: string + purpose: + type: string + enum: + - experimentation + - flags + required: + - digest + - items + - updatedAt + type: object + '304': + description: '' + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + parameters: + - name: integrationConfigurationId + in: path + required: true + schema: + type: string + - name: resourceId + in: path + required: true + schema: + type: string + get: + description: When the user enabled Global Config syncing, then this endpoint can be used by the partner to fetch the contents of the Global Config. + operationId: getInstallationsByIntegrationConfigurationIdResourcesByResourceIdExperimentationGlobalConfig + security: + - bearerToken: [] + summary: Get the data of a user-provided Global Config + tags: + - marketplace + responses: + '200': + description: The Global Config data + content: + application/json: + schema: + properties: + items: + additionalProperties: + $ref: '#/components/schemas/GlobalConfigItemValue' + type: object + updatedAt: + type: number + digest: + type: string + purpose: + type: string + enum: + - experimentation + - flags + required: + - digest + - items + - updatedAt + type: object + '304': + description: '' + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + parameters: + - name: integration_configuration_id + in: path + required: true + schema: + type: string + - name: resource_id + in: path + required: true + schema: + type: string + put: + description: When the user enabled Global Config syncing, then this endpoint can be used by the partner to push their configuration data into the relevant Global Config. + operationId: replaceInstallationsByIntegrationConfigurationIdResourcesByResourceIdExperimentationGlobalConfig + security: + - bearerToken: [] + summary: Push data into a user-provided Global Config + tags: + - marketplace + responses: + '200': + description: The Global Config was updated + content: + application/json: + schema: + properties: + items: + additionalProperties: + $ref: '#/components/schemas/GlobalConfigItemValue' + type: object + updatedAt: + type: number + digest: + type: string + purpose: + type: string + enum: + - experimentation + - flags + required: + - digest + - items + - updatedAt + type: object + '400': + description: |- + One of the provided values in the request body is invalid. + One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '409': + description: '' + '410': + description: '' + '412': + description: '' + parameters: + - name: integration_configuration_id + in: path + required: true + schema: + type: string + - name: resource_id + in: path + required: true + schema: + type: string + requestBody: + content: + application/json: + schema: + type: object + additionalProperties: false + required: + - data + properties: + data: + type: object + additionalProperties: {} +components: + schemas: + GlobalConfigItemValue: + nullable: true + type: string + additionalProperties: + $ref: '#/components/schemas/GlobalConfigItemValue' + items: + $ref: '#/components/schemas/GlobalConfigItemValue' + enum: + - false + - true + x-stackQL-resources: + installations: + id: vercel.marketplace.installations + name: installations + title: Installations + methods: + update: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v1~1installations~1{integration_configuration_id}/patch' + response: + mediaType: application/json + openAPIDocKey: '204' + request: + nativeCasing: camel + rotate_credential: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v1~1installations~1{integration_configuration_id}~1credentials~1rotate/post' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + revoke_credential: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v1~1installations~1{integration_configuration_id}~1credentials~1revoke/post' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + finalize: + operation: + $ref: '#/paths/~1v1~1installations~1{integration_configuration_id}~1billing~1finalize/post' + response: + mediaType: application/json + openAPIDocKey: '204' + request: + nativeCasing: camel + sqlVerbs: + select: [] + insert: [] + update: + - $ref: '#/components/x-stackQL-resources/installations/methods/update' + delete: [] + replace: [] + account_info: + id: vercel.marketplace.account_info + name: account_info + title: Account Info + methods: + get: + operation: + $ref: '#/paths/~1v1~1installations~1{integration_configuration_id}~1account/get' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/account_info/methods/get' + insert: [] + update: [] + delete: [] + replace: [] + members: + id: vercel.marketplace.members + name: members + title: Members + methods: + get: + operation: + $ref: '#/paths/~1v1~1installations~1{integration_configuration_id}~1member~1{member_id}/get' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/members/methods/get' + insert: [] + update: [] + delete: [] + replace: [] + events: + id: vercel.marketplace.events + name: events + title: Events + methods: + create: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v1~1installations~1{integration_configuration_id}~1events/post' + response: + mediaType: application/json + openAPIDocKey: '201' + request: + nativeCasing: camel + sqlVerbs: + select: [] + insert: + - $ref: '#/components/x-stackQL-resources/events/methods/create' + update: [] + delete: [] + replace: [] + resources: + id: vercel.marketplace.resources + name: resources + title: Resources + methods: + list: + operation: + $ref: '#/paths/~1v1~1installations~1{integration_configuration_id}~1resources/get' + response: + mediaType: application/json + openAPIDocKey: '200' + objectKey: $.resources + request: + nativeCasing: camel + get: + operation: + $ref: '#/paths/~1v1~1installations~1{integration_configuration_id}~1resources~1{resource_id}/get' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + delete: + operation: + $ref: '#/paths/~1v1~1installations~1{integration_configuration_id}~1resources~1{resource_id}/delete' + response: + mediaType: application/json + openAPIDocKey: '204' + request: + nativeCasing: camel + import: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v1~1installations~1{integration_configuration_id}~1resources~1{resource_id}/put' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + update: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v1~1installations~1{integration_configuration_id}~1resources~1{resource_id}/patch' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + update_secrets: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v1~1installations~1{integration_configuration_id}~1products~1{integration_product_id_or_slug}~1resources~1{resource_id}~1secrets/put' + response: + mediaType: application/json + openAPIDocKey: '201' + request: + nativeCasing: camel + update_secrets_by_id: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v1~1installations~1{integration_configuration_id}~1resources~1{resource_id}~1secrets/put' + response: + mediaType: application/json + openAPIDocKey: '201' + request: + nativeCasing: camel + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/resources/methods/get' + - $ref: '#/components/x-stackQL-resources/resources/methods/list' + insert: [] + update: + - $ref: '#/components/x-stackQL-resources/resources/methods/update' + delete: + - $ref: '#/components/x-stackQL-resources/resources/methods/delete' + replace: + - $ref: '#/components/x-stackQL-resources/resources/methods/import' + billing: + id: vercel.marketplace.billing + name: billing + title: Billing + methods: + submit: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v1~1installations~1{integration_configuration_id}~1billing/post' + response: + mediaType: application/json + openAPIDocKey: '201' + request: + nativeCasing: camel + submit_prepayment_balances: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v1~1installations~1{integration_configuration_id}~1billing~1balance/post' + response: + mediaType: application/json + openAPIDocKey: '201' + request: + nativeCasing: camel + sqlVerbs: + select: [] + insert: [] + update: [] + delete: [] + replace: [] + invoices: + id: vercel.marketplace.invoices + name: invoices + title: Invoices + methods: + create: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v1~1installations~1{integration_configuration_id}~1billing~1invoices/post' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + get: + operation: + $ref: '#/paths/~1v1~1installations~1{integration_configuration_id}~1billing~1invoices~1{invoice_id}/get' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + update: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v1~1installations~1{integration_configuration_id}~1billing~1invoices~1{invoice_id}~1actions/post' + response: + mediaType: application/json + openAPIDocKey: '204' + request: + nativeCasing: camel + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/invoices/methods/get' + insert: + - $ref: '#/components/x-stackQL-resources/invoices/methods/create' + update: [] + delete: [] + replace: [] + sso_tokens: + id: vercel.marketplace.sso_tokens + name: sso_tokens + title: Sso Tokens + methods: + exchange: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v1~1integrations~1sso~1token/post' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + sqlVerbs: + select: [] + insert: [] + update: [] + delete: [] + replace: [] + experimentation_items: + id: vercel.marketplace.experimentation_items + name: experimentation_items + title: Experimentation Items + methods: + create: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v1~1installations~1{integration_configuration_id}~1resources~1{resource_id}~1experimentation~1items/post' + response: + mediaType: application/json + openAPIDocKey: '204' + request: + nativeCasing: camel + update: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v1~1installations~1{integration_configuration_id}~1resources~1{resource_id}~1experimentation~1items~1{item_id}/patch' + response: + mediaType: application/json + openAPIDocKey: '204' + request: + nativeCasing: camel + delete: + operation: + $ref: '#/paths/~1v1~1installations~1{integration_configuration_id}~1resources~1{resource_id}~1experimentation~1items~1{item_id}/delete' + response: + mediaType: application/json + openAPIDocKey: '204' + request: + nativeCasing: camel + sqlVerbs: + select: [] + insert: + - $ref: '#/components/x-stackQL-resources/experimentation_items/methods/create' + update: + - $ref: '#/components/x-stackQL-resources/experimentation_items/methods/update' + delete: + - $ref: '#/components/x-stackQL-resources/experimentation_items/methods/delete' + replace: [] + experimentation_edge_config: + id: vercel.marketplace.experimentation_edge_config + name: experimentation_edge_config + title: Experimentation Edge Config + methods: + get: + operation: + $ref: '#/paths/~1v1~1installations~1{integration_configuration_id}~1resources~1{resource_id}~1experimentation~1global-config/get' + response: + mediaType: application/json + openAPIDocKey: '200' + objectKey: $ + request: + nativeCasing: camel + replace: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v1~1installations~1{integration_configuration_id}~1resources~1{resource_id}~1experimentation~1global-config/put' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/experimentation_edge_config/methods/get' + insert: [] + update: [] + delete: [] + replace: + - $ref: '#/components/x-stackQL-resources/experimentation_edge_config/methods/replace' +servers: + - url: https://api.vercel.com diff --git a/provider-dev/openapi/src/vercel/v00.00.00000/services/microfrontends.yaml b/provider-dev/openapi/src/vercel/v00.00.00000/services/microfrontends.yaml new file mode 100644 index 0000000..363dbca --- /dev/null +++ b/provider-dev/openapi/src/vercel/v00.00.00000/services/microfrontends.yaml @@ -0,0 +1,6004 @@ +openapi: 3.0.3 +info: + title: microfrontends API + description: vercel microfrontends API + version: 0.0.1 +paths: + /v1/microfrontends/groups: + get: + description: Get the microfrontends group IDs for a team. + operationId: getMicrofrontendsGroups + security: + - bearerToken: [] + summary: List microfrontends groups + tags: + - microfrontends + responses: + '200': + description: '' + content: + application/json: + schema: + type: object + properties: + groups: + type: array + items: + type: object + additionalProperties: true + maxMicrofrontendsGroupsPerTeam: + type: number + maxMicrofrontendsPerGroup: + type: number + '400': + description: '' + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '410': + description: '' + '500': + description: '' + parameters: + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + /v1/microfrontends/groups/{group_id}/projects: + get: + description: Get the microfrontends for a given group ID. + operationId: getMicrofrontendsInGroup + security: + - bearerToken: [] + summary: List projects in a microfrontends group + tags: + - microfrontends + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + projects: + items: + properties: + accountId: + type: string + creator: + oneOf: + - properties: + type: + type: string + enum: + - user + via: + nullable: true + oneOf: + - properties: + type: + type: string + enum: + - app + app: + properties: + id: + type: string + description: The internal ID of the Vercel App backing this principal. + clientId: + type: string + description: The protocol-facing OAuth client ID. This may differ from {@link id} when Client ID Metadata Documents (CIMD) are used. + required: + - id + type: object + required: + - app + - type + type: object + description: Set when a Vercel App or Integration acts on behalf of a {@link User}. Captures user-consented OAuth delegation that the ACL layer may inspect to evaluate scope restrictions. This is NOT for impersonation or token-exchange provenance — those live on `auth.token`, not on the principal. + - properties: + type: + type: string + enum: + - integration + integration: + properties: + integrationId: + type: string + configurationId: + type: string + required: + - configurationId + - integrationId + type: object + required: + - integration + - type + type: object + description: Set when a Vercel App or Integration acts on behalf of a {@link User}. Captures user-consented OAuth delegation that the ACL layer may inspect to evaluate scope restrictions. This is NOT for impersonation or token-exchange provenance — those live on `auth.token`, not on the principal. + user: + properties: + id: + type: string + required: + - id + type: object + required: + - type + - user + - via + type: object + - properties: + type: + type: string + enum: + - app + app: + properties: + id: + type: string + description: The internal ID of the Vercel App backing this principal. + clientId: + type: string + description: The protocol-facing OAuth client ID. This may differ from {@link id} when Client ID Metadata Documents (CIMD) are used. + required: + - id + type: object + required: + - app + - type + type: object + - properties: + type: + type: string + enum: + - integration + integration: + properties: + integrationId: + type: string + configurationId: + type: string + required: + - configurationId + - integrationId + type: object + required: + - integration + - type + type: object + - properties: + type: + type: string + enum: + - system + required: + - type + type: object + alias: + items: + properties: + configuredBy: + nullable: true + type: string + enum: + - A + - CNAME + - dns-01 + - http + - null + configuredChangedAt: + nullable: true + type: number + createdAt: + nullable: true + type: number + deployment: + nullable: true + properties: + id: + type: string + alias: + items: + type: string + type: array + aliasAssigned: + nullable: true + oneOf: + - type: number + - type: boolean + enum: + - false + - true + aliasError: + nullable: true + properties: + code: + type: string + message: + type: string + required: + - code + - message + type: object + aliasFinal: + nullable: true + type: string + automaticAliases: + items: + type: string + type: array + branchMatcher: + properties: + type: + type: string + enum: + - endsWith + - equals + - startsWith + description: The type of matching to perform + pattern: + type: string + description: The pattern to match against branch names + required: + - pattern + - type + type: object + buildingAt: + type: number + builds: + items: + properties: + use: + type: string + src: + type: string + dest: + type: string + required: + - use + type: object + type: array + checksConclusion: + type: string + enum: + - canceled + - failed + - skipped + - succeeded + checksState: + type: string + enum: + - completed + - registered + - running + connectBuildsEnabled: + type: boolean + enum: + - false + - true + connectConfigurationId: + type: string + createdAt: + type: number + createdIn: + type: string + creator: + nullable: true + properties: + email: + type: string + githubLogin: + type: string + gitlabLogin: + type: string + uid: + type: string + username: + type: string + required: + - email + - uid + - username + type: object + deletedAt: + type: number + deploymentHostname: + type: string + forced: + type: boolean + enum: + - false + - true + name: + type: string + meta: + additionalProperties: + type: string + type: object + monorepoManager: + nullable: true + type: string + oidcTokenClaims: + properties: + iss: + type: string + sub: + type: string + scope: + type: string + aud: + type: string + owner: + type: string + owner_id: + type: string + project: + type: string + project_id: + type: string + environment: + type: string + custom_environment_id: + type: string + mfe_group_ids: + items: + type: string + type: array + plan: + type: string + required: + - aud + - environment + - iss + - owner + - owner_id + - project + - project_id + - scope + - sub + type: object + plan: + type: string + enum: + - enterprise + - hobby + - pro + previewCommentsEnabled: + type: boolean + enum: + - false + - true + description: Whether or not preview comments are enabled for the deployment + example: false + private: + type: boolean + enum: + - false + - true + readyAt: + type: number + readyState: + type: string + enum: + - BLOCKED + - BUILDING + - CANCELED + - ERROR + - INITIALIZING + - QUEUED + - READY + readySubstate: + type: string + enum: + - PROMOTED + - ROLLING + - STAGED + requestedAt: + type: number + target: + nullable: true + type: string + teamId: + nullable: true + type: string + type: + type: string + enum: + - LAMBDAS + url: + type: string + userId: + type: string + description: Present for user creators; omitted for app/integration/system creators. + withCache: + type: boolean + enum: + - false + - true + required: + - createdAt + - createdIn + - creator + - deploymentHostname + - id + - name + - plan + - private + - readyState + - type + - url + type: object + domain: + type: string + environment: + type: string + enum: + - preview + - production + gitBranch: + nullable: true + type: string + redirect: + nullable: true + type: string + redirectStatusCode: + nullable: true + type: number + enum: + - 301 + - 302 + - 307 + - 308 + - null + target: + type: string + enum: + - PREVIEW + - PRODUCTION + - STAGING + required: + - deployment + - domain + - environment + - target + type: object + type: array + analytics: + properties: + id: + type: string + canceledAt: + nullable: true + type: number + disabledAt: + type: number + enabledAt: + type: number + paidAt: + type: number + sampleRatePercent: + nullable: true + type: number + spendLimitInDollars: + nullable: true + type: number + required: + - disabledAt + - enabledAt + - id + type: object + appliedCve55182Migration: + type: boolean + enum: + - false + - true + speedInsights: + properties: + id: + type: string + enabledAt: + type: number + disabledAt: + type: number + canceledAt: + type: number + hasData: + type: boolean + enum: + - false + - true + dataReceivedAt: + type: number + description: When the first free (not Speed Insights Plus) production data point was observed, in ms. Set once by subscriber-analytics-events; projects that already had data before this field shipped get it backfilled on their next batch, so it reads "first free data point observed", not necessarily "first ever". + paidAt: + type: number + required: + - id + type: object + autoExposeSystemEnvs: + type: boolean + enum: + - false + - true + autoAssignCustomDomains: + type: boolean + enum: + - false + - true + autoAssignCustomDomainsUpdatedBy: + type: string + buildCommand: + nullable: true + type: string + commandForIgnoringBuildStep: + nullable: true + type: string + connectConfigurations: + nullable: true + items: + properties: + envId: + oneOf: + - type: string + - type: string + enum: + - preview + - production + connectConfigurationId: + type: string + dc: + type: string + passive: + type: boolean + enum: + - false + - true + buildsEnabled: + type: boolean + enum: + - false + - true + aws: + properties: + subnetIds: + items: + type: string + type: array + securityGroupId: + type: string + required: + - subnetIds + type: object + createdAt: + type: number + updatedAt: + type: number + required: + - buildsEnabled + - connectConfigurationId + - createdAt + - envId + - passive + - updatedAt + type: object + type: array + connectConfigurationId: + nullable: true + type: string + connectBuildsEnabled: + type: boolean + enum: + - false + - true + passiveConnectConfigurationId: + nullable: true + type: string + createdAt: + type: number + customerSupportCodeVisibility: + type: boolean + enum: + - false + - true + crons: + properties: + enabledAt: + type: number + description: 'The time the feature was enabled for this project. Note: It enables automatically with the first Deployment that outputs cronjobs.' + disabledAt: + nullable: true + type: number + description: The time the feature was disabled for this project. + updatedAt: + type: number + deploymentId: + nullable: true + type: string + description: The ID of the Deployment from which the definitions originated. + definitions: + items: + properties: + host: + type: string + description: The hostname that should be used. + example: vercel.com + path: + type: string + description: The path that should be called for the cronjob. + example: /api/crons/sync-something?hello=world + schedule: + type: string + description: The cron expression. + example: 0 0 * * * + source: + type: string + enum: + - api + description: The origin of this definition. 'api' means created via the API. Undefined means it originated from a deployment (vercel.json). + description: + type: string + description: A human-readable description of what this cron job does. + hostInferred: + type: boolean + enum: + - false + - true + description: Whether the host was inferred from the production deployment URL rather than explicitly provided. + required: + - host + - path + - schedule + type: object + type: array + required: + - definitions + - deploymentId + - disabledAt + - enabledAt + - updatedAt + type: object + dataCache: + properties: + userDisabled: + type: boolean + enum: + - false + - true + storageSizeBytes: + nullable: true + type: number + unlimited: + type: boolean + enum: + - false + - true + required: + - userDisabled + type: object + deploymentExpiration: + properties: + expirationDays: + type: number + description: Number of days to keep non-production deployments (mostly preview deployments) before soft deletion. + expirationDaysProduction: + type: number + description: Number of days to keep production deployments before soft deletion. + expirationDaysCanceled: + type: number + description: Number of days to keep canceled deployments before soft deletion. + expirationDaysErrored: + type: number + description: Number of days to keep errored deployments before soft deletion. + deploymentsToKeep: + type: number + description: Minimum number of production deployments to keep for this project, even if they are over the production expiration limit. + type: object + description: Retention policies for deployments. These are enforced at the project level, but we also maintain an instance of this at the team level as a default policy that gets applied to new projects. + expiration: + oneOf: + - properties: + expiresAt: + type: number + description: Unix ms timestamp when the project is scheduled to expire. + required: + - expiresAt + type: object + - properties: + lockedAt: + type: number + description: Unix ms timestamp when the project was locked. + lockedBy: + type: string + description: userId of the actor that triggered the lock (system or admin). + required: + - lockedAt + - lockedBy + type: object + devCommand: + nullable: true + type: string + directoryListing: + type: boolean + enum: + - false + - true + installCommand: + nullable: true + type: string + env: + items: + properties: + target: + oneOf: + - items: + type: string + enum: + - development + - development + - preview + - preview + - production + type: array + - type: string + enum: + - development + - development + - preview + - preview + - production + type: + type: string + enum: + - encrypted + - plain + - secret + - sensitive + - system + sunsetSecretId: + type: string + description: This is used to identify variables that have been migrated from type secret to sensitive. + legacyValue: + type: string + description: Legacy now-encryption ciphertext, present after migration swaps value/vsmValue + decrypted: + type: boolean + enum: + - false + - true + value: + type: string + vsmValue: + type: string + id: + type: string + key: + type: string + configurationId: + nullable: true + type: string + createdAt: + type: number + updatedAt: + type: number + createdBy: + nullable: true + type: string + updatedBy: + nullable: true + type: string + gitBranch: + type: string + visibility: + type: string + enum: + - config + - secret + description: User-facing config/secret model. When set, authoritative for new code paths when the env-var-config-secret-ui flag is enabled. Legacy rows omit this field; legacy rows omit it and callers fall back to existing `type` behavior. + edgeConfigId: + nullable: true + type: string + edgeConfigTokenId: + nullable: true + type: string + contentHint: + nullable: true + oneOf: + - properties: + type: + type: string + enum: + - redis-url + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - redis-rest-api-url + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - redis-rest-api-token + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - redis-rest-api-read-only-token + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - blob-read-write-token + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - blob-store-id + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - blob-webhook-public-key + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - postgres-url + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - postgres-url-non-pooling + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - postgres-prisma-url + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - postgres-user + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - postgres-host + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - postgres-password + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - postgres-database + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - postgres-url-no-ssl + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - integration-store-secret + storeId: + type: string + integrationId: + type: string + integrationProductId: + type: string + integrationConfigurationId: + type: string + required: + - integrationConfigurationId + - integrationId + - integrationProductId + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - flags-connection-string + projectId: + type: string + required: + - projectId + - type + type: object + internalContentHint: + nullable: true + properties: + type: + type: string + enum: + - flags-secret + encryptedValue: + type: string + description: Contains the `value` of the env variable, encrypted with a special key to make decryption possible in the subscriber Lambda. + required: + - encryptedValue + - type + type: object + description: Similar to `contentHints`, but should not be exposed to the user. + comment: + type: string + customEnvironmentIds: + items: + type: string + type: array + required: + - key + - type + - value + type: object + type: array + customEnvironments: + items: + properties: + id: + type: string + description: 'Unique identifier for the custom environment (format: env_*)' + slug: + type: string + description: URL-friendly name of the environment + type: + type: string + enum: + - development + - preview + - production + description: The type of environment (production, preview, or development) + description: + type: string + description: Optional description of the environment's purpose + branchMatcher: + properties: + type: + type: string + enum: + - endsWith + - equals + - startsWith + description: The type of matching to perform + pattern: + type: string + description: The pattern to match against branch names + required: + - pattern + - type + type: object + description: Configuration for matching git branches to this environment + domains: + items: + properties: + name: + type: string + apexName: + type: string + projectId: + type: string + redirect: + nullable: true + type: string + redirectStatusCode: + nullable: true + type: number + enum: + - 301 + - 302 + - 307 + - 308 + - null + gitBranch: + nullable: true + type: string + customEnvironmentId: + nullable: true + type: string + updatedAt: + type: number + createdAt: + type: number + verified: + type: boolean + enum: + - false + - true + description: '`true` if the domain is verified for use with the project. If `false` it will not be used as an alias on this project until the challenge in `verification` is completed.' + verification: + items: + properties: + type: + type: string + domain: + type: string + value: + type: string + reason: + type: string + required: + - domain + - reason + - type + - value + type: object + description: 'A list of verification challenges, one of which must be completed to verify the domain for use on the project. After the challenge is complete `POST /projects/:idOrName/domains/:domain/verify` to verify the domain. Possible challenges: - If `verification.type = TXT` the `verification.domain` will be checked for a TXT record matching `verification.value`.' + type: array + description: 'A list of verification challenges, one of which must be completed to verify the domain for use on the project. After the challenge is complete `POST /projects/:idOrName/domains/:domain/verify` to verify the domain. Possible challenges: - If `verification.type = TXT` the `verification.domain` will be checked for a TXT record matching `verification.value`.' + required: + - apexName + - name + - projectId + - verified + type: object + description: List of domains associated with this environment + type: array + description: List of domains associated with this environment + currentDeploymentAliases: + items: + type: string + type: array + description: List of aliases for the current deployment + createdAt: + type: number + description: Timestamp when the environment was created + updatedAt: + type: number + description: Timestamp when the environment was last updated + required: + - createdAt + - id + - slug + - type + - updatedAt + type: object + description: Internal representation of a custom environment with all required properties + type: array + framework: + nullable: true + type: string + enum: + - actix-web + - angular + - ash + - astro + - axum + - blitzjs + - brunch + - bun + - container + - create-react-app + - django + - docusaurus + - docusaurus-2 + - dojo + - eleventy + - elysia + - ember + - eve + - express + - factory-eve + - fastapi + - fasthtml + - fastify + - flask + - gatsby + - go + - gridsome + - h3 + - hexo + - hono + - hugo + - hydrogen + - ionic-angular + - ionic-react + - jekyll + - koa + - mastra + - middleman + - nestjs + - nextjs + - nitro + - node + - nuxtjs + - parcel + - polymer + - preact + - python + - react-router + - redwoodjs + - remix + - ruby + - rust + - saber + - sanity + - sanity-v2 + - sapper + - scully + - services + - solidstart + - solidstart-1 + - stencil + - storybook + - svelte + - sveltekit + - sveltekit-1 + - tanstack-start + - tanstack-start-lovable + - umijs + - vite + - vitepress + - vue + - vuepress + - xmcp + - zola + - null + services: + items: + properties: + serviceName: + type: string + description: Service name from the deployment (Service.name). + serviceType: + type: string + enum: + - cron + - job + - web + - worker + description: Service kind (Service.type). Omitted for schemas that do not define one. + framework: + type: string + enum: + - actix-web + - angular + - ash + - astro + - axum + - blitzjs + - brunch + - bun + - container + - create-react-app + - django + - docusaurus + - docusaurus-2 + - dojo + - eleventy + - elysia + - ember + - eve + - express + - factory-eve + - fastapi + - fasthtml + - fastify + - flask + - gatsby + - go + - gridsome + - h3 + - hexo + - hono + - hugo + - hydrogen + - ionic-angular + - ionic-react + - jekyll + - koa + - mastra + - middleman + - nestjs + - nextjs + - nitro + - node + - nuxtjs + - parcel + - polymer + - preact + - python + - react-router + - redwoodjs + - remix + - ruby + - rust + - saber + - sanity + - sanity-v2 + - sapper + - scully + - services + - solidstart + - solidstart-1 + - stencil + - storybook + - svelte + - sveltekit + - sveltekit-1 + - tanstack-start + - tanstack-start-lovable + - umijs + - vite + - vitepress + - vue + - vuepress + - xmcp + - zola + description: Framework slug, when the service has one (omitted otherwise). + runtime: + type: string + description: Generic runtime, e.g. 'node' | 'python' | 'go' | 'ruby' | 'rust' (Service.runtime). Omitted for static builds. + required: + - serviceName + type: object + type: array + gitForkProtection: + type: boolean + enum: + - false + - true + gitLFS: + type: boolean + enum: + - false + - true + id: + type: string + ipBuckets: + items: + properties: + bucket: + type: string + default: + type: boolean + enum: + - false + - true + supportUntil: + type: number + required: + - bucket + type: object + type: array + jobs: + properties: + lint: + properties: + targets: + items: + type: string + type: array + required: + - targets + type: object + typecheck: + properties: + targets: + items: + type: string + type: array + required: + - targets + type: object + mfe-config-present: + properties: + targets: + items: + type: string + type: array + required: + - targets + type: object + type: object + latestDeployments: + items: + properties: + id: + type: string + alias: + items: + type: string + type: array + aliasAssigned: + nullable: true + oneOf: + - type: number + - type: boolean + enum: + - false + - true + aliasError: + nullable: true + properties: + code: + type: string + message: + type: string + required: + - code + - message + type: object + aliasFinal: + nullable: true + type: string + automaticAliases: + items: + type: string + type: array + branchMatcher: + properties: + type: + type: string + enum: + - endsWith + - equals + - startsWith + description: The type of matching to perform + pattern: + type: string + description: The pattern to match against branch names + required: + - pattern + - type + type: object + buildingAt: + type: number + builds: + items: + properties: + use: + type: string + src: + type: string + dest: + type: string + required: + - use + type: object + type: array + checksConclusion: + type: string + enum: + - canceled + - failed + - skipped + - succeeded + checksState: + type: string + enum: + - completed + - registered + - running + connectBuildsEnabled: + type: boolean + enum: + - false + - true + connectConfigurationId: + type: string + createdAt: + type: number + createdIn: + type: string + creator: + nullable: true + properties: + email: + type: string + githubLogin: + type: string + gitlabLogin: + type: string + uid: + type: string + username: + type: string + required: + - email + - uid + - username + type: object + deletedAt: + type: number + deploymentHostname: + type: string + forced: + type: boolean + enum: + - false + - true + name: + type: string + meta: + additionalProperties: + type: string + type: object + monorepoManager: + nullable: true + type: string + oidcTokenClaims: + properties: + iss: + type: string + sub: + type: string + scope: + type: string + aud: + type: string + owner: + type: string + owner_id: + type: string + project: + type: string + project_id: + type: string + environment: + type: string + custom_environment_id: + type: string + mfe_group_ids: + items: + type: string + type: array + plan: + type: string + required: + - aud + - environment + - iss + - owner + - owner_id + - project + - project_id + - scope + - sub + type: object + plan: + type: string + enum: + - enterprise + - hobby + - pro + previewCommentsEnabled: + type: boolean + enum: + - false + - true + description: Whether or not preview comments are enabled for the deployment + example: false + private: + type: boolean + enum: + - false + - true + readyAt: + type: number + readyState: + type: string + enum: + - BLOCKED + - BUILDING + - CANCELED + - ERROR + - INITIALIZING + - QUEUED + - READY + readySubstate: + type: string + enum: + - PROMOTED + - ROLLING + - STAGED + requestedAt: + type: number + target: + nullable: true + type: string + teamId: + nullable: true + type: string + type: + type: string + enum: + - LAMBDAS + url: + type: string + userId: + type: string + description: Present for user creators; omitted for app/integration/system creators. + withCache: + type: boolean + enum: + - false + - true + required: + - createdAt + - createdIn + - creator + - deploymentHostname + - id + - name + - plan + - private + - readyState + - type + - url + type: object + type: array + link: + oneOf: + - properties: + org: + type: string + repoOwnerId: + type: number + description: A new field, should be included in all new project links, is being added just in time when a deployment is created. This is needed for Protected Git scopes. + repo: + type: string + repoId: + type: number + type: + type: string + enum: + - github + createdAt: + type: number + deployHooks: + items: + properties: + createdAt: + type: number + id: + type: string + name: + type: string + ref: + type: string + url: + type: string + required: + - id + - name + - ref + - url + type: object + type: array + gitCredentialId: + type: string + updatedAt: + type: number + sourceless: + type: boolean + enum: + - false + - true + productionBranch: + type: string + required: + - deployHooks + - gitCredentialId + - org + - productionBranch + - type + type: object + - properties: + type: + type: string + enum: + - github-limited + createdAt: + type: number + org: + type: string + repoOwnerId: + type: number + description: A new field, should be included in all new project links, is being added just in time when a deployment is created. This is needed for Protected Git scopes. + repo: + type: string + repoId: + type: number + deployHooks: + items: + properties: + createdAt: + type: number + id: + type: string + name: + type: string + ref: + type: string + url: + type: string + required: + - id + - name + - ref + - url + type: object + type: array + gitCredentialId: + type: string + updatedAt: + type: number + sourceless: + type: boolean + enum: + - false + - true + productionBranch: + type: string + required: + - deployHooks + - gitCredentialId + - org + - productionBranch + - type + type: object + - properties: + org: + type: string + repoOwnerId: + type: number + description: A new field, should be included in all new project links, is being added just in time when a deployment is created. This is needed for Protected Git scopes. + repo: + type: string + repoId: + type: number + type: + type: string + enum: + - github-custom-host + host: + type: string + createdAt: + type: number + deployHooks: + items: + properties: + createdAt: + type: number + id: + type: string + name: + type: string + ref: + type: string + url: + type: string + required: + - id + - name + - ref + - url + type: object + type: array + gitCredentialId: + type: string + updatedAt: + type: number + sourceless: + type: boolean + enum: + - false + - true + productionBranch: + type: string + required: + - deployHooks + - gitCredentialId + - host + - org + - productionBranch + - type + type: object + - properties: + projectId: + type: string + projectName: + type: string + projectNameWithNamespace: + type: string + projectNamespace: + type: string + projectOwnerId: + type: number + description: A new field, should be included in all new project links, is being added just in time when a deployment is created. This is needed for Protected Git scopes. This is the id of the top level group that a namespace belongs to. Gitlab supports group nesting (up to 20 levels). + projectUrl: + type: string + type: + type: string + enum: + - gitlab + createdAt: + type: number + deployHooks: + items: + properties: + createdAt: + type: number + id: + type: string + name: + type: string + ref: + type: string + url: + type: string + required: + - id + - name + - ref + - url + type: object + type: array + gitCredentialId: + type: string + updatedAt: + type: number + sourceless: + type: boolean + enum: + - false + - true + productionBranch: + type: string + required: + - deployHooks + - gitCredentialId + - productionBranch + - projectId + - projectName + - projectNameWithNamespace + - projectNamespace + - projectUrl + - type + type: object + - properties: + name: + type: string + slug: + type: string + owner: + type: string + type: + type: string + enum: + - bitbucket + uuid: + type: string + workspaceUuid: + type: string + createdAt: + type: number + deployHooks: + items: + properties: + createdAt: + type: number + id: + type: string + name: + type: string + ref: + type: string + url: + type: string + required: + - id + - name + - ref + - url + type: object + type: array + gitCredentialId: + type: string + updatedAt: + type: number + sourceless: + type: boolean + enum: + - false + - true + productionBranch: + type: string + required: + - deployHooks + - gitCredentialId + - name + - owner + - productionBranch + - slug + - type + - uuid + - workspaceUuid + type: object + - properties: + org: + type: string + repo: + type: string + repoId: + type: string + type: + type: string + enum: + - vercel + createdAt: + type: number + deployHooks: + items: + properties: + createdAt: + type: number + id: + type: string + name: + type: string + ref: + type: string + url: + type: string + required: + - id + - name + - ref + - url + type: object + type: array + gitCredentialId: + type: string + updatedAt: + type: number + sourceless: + type: boolean + enum: + - false + - true + productionBranch: + type: string + required: + - deployHooks + - gitCredentialId + - org + - productionBranch + - repo + - repoId + - type + type: object + - properties: + org: + type: string + repo: + type: string + repoId: + type: string + type: + type: string + enum: + - v0 + createdAt: + type: number + deployHooks: + items: + properties: + createdAt: + type: number + id: + type: string + name: + type: string + ref: + type: string + url: + type: string + required: + - id + - name + - ref + - url + type: object + type: array + gitCredentialId: + type: string + updatedAt: + type: number + sourceless: + type: boolean + enum: + - false + - true + productionBranch: + type: string + required: + - deployHooks + - gitCredentialId + - org + - productionBranch + - repo + - repoId + - type + type: object + - properties: + owner: + type: string + description: Owner (namespace) slug, e.g. `acme`. + repo: + type: string + repoId: + type: string + description: Origin repository id. + ownerId: + type: string + description: Origin namespace id (`ns_…`) of the owner. + type: + type: string + enum: + - cursor-origin + createdAt: + type: number + deployHooks: + items: + properties: + createdAt: + type: number + id: + type: string + name: + type: string + ref: + type: string + url: + type: string + required: + - id + - name + - ref + - url + type: object + type: array + gitCredentialId: + type: string + updatedAt: + type: number + sourceless: + type: boolean + enum: + - false + - true + productionBranch: + type: string + required: + - deployHooks + - gitCredentialId + - owner + - ownerId + - productionBranch + - repo + - repoId + - type + type: object + blobs: + properties: + isDefaultApp: + type: boolean + enum: + - false + - true + description: Marks the team-level, Vercel-managed default blob project (`vercel-blob-default-project`) that orphan blob stores are scoped to when connected without an explicit project. Set only by internal storage flows and immutable after creation — guards rely on it to protect the connected stores from being lost when the project is deleted or transferred. + type: object + microfrontends: + oneOf: + - properties: + isDefaultApp: + type: boolean + enum: + - true + updatedAt: + type: number + description: Timestamp when the microfrontends settings were last updated. + groupIds: + type: array + items: + type: string + minItems: 1 + description: The group IDs of microfrontends that this project belongs to. Each microfrontend project must belong to a microfrontends group that is the set of microfrontends that are used together. + enabled: + type: boolean + enum: + - true + description: Whether microfrontends are enabled for this project. + defaultRoute: + type: string + description: A path that is used to take screenshots and as the default path in preview links when a domain for this microfrontend is shown in the UI. Includes the leading slash, e.g. `/docs` + freeProjectForLegacyLimits: + type: boolean + enum: + - false + - true + description: Whether the project was part of the legacy limits for hobby and pro-trial before billing was added. This field is only set when the team is upgraded to a paid plan and we are backfilling the subscription status. We cap the subscription to 2 projects and set this field for the 3rd project. When this field is set, the project is not charged for and we do not call any billing APIs for this project. + required: + - enabled + - groupIds + - isDefaultApp + - updatedAt + type: object + - properties: + isDefaultApp: + type: boolean + enum: + - false + routeObservabilityToThisProject: + type: boolean + enum: + - false + - true + description: Whether observability data should be routed to this microfrontend project or a root project. + doNotRouteWithMicrofrontendsRouting: + type: boolean + enum: + - false + - true + description: Whether to add microfrontends routing to aliases. This means domains in this project will route as a microfrontend. + updatedAt: + type: number + description: Timestamp when the microfrontends settings were last updated. + groupIds: + type: array + items: + type: string + minItems: 1 + description: The group IDs of microfrontends that this project belongs to. Each microfrontend project must belong to a microfrontends group that is the set of microfrontends that are used together. + enabled: + type: boolean + enum: + - true + description: Whether microfrontends are enabled for this project. + defaultRoute: + type: string + description: A path that is used to take screenshots and as the default path in preview links when a domain for this microfrontend is shown in the UI. Includes the leading slash, e.g. `/docs` + freeProjectForLegacyLimits: + type: boolean + enum: + - false + - true + description: Whether the project was part of the legacy limits for hobby and pro-trial before billing was added. This field is only set when the team is upgraded to a paid plan and we are backfilling the subscription status. We cap the subscription to 2 projects and set this field for the 3rd project. When this field is set, the project is not charged for and we do not call any billing APIs for this project. + required: + - enabled + - groupIds + - updatedAt + type: object + - properties: + updatedAt: + type: number + groupIds: + type: array + items: {} + minItems: 0 + maxItems: 0 + enabled: + type: boolean + enum: + - false + freeProjectForLegacyLimits: + type: boolean + enum: + - false + - true + required: + - enabled + - groupIds + - updatedAt + type: object + name: + type: string + nodeVersion: + type: string + enum: + - 10.x + - 12.x + - 14.x + - 16.x + - 18.x + - 20.x + - 22.x + - 24.x + - 8.10.x + optionsAllowlist: + nullable: true + properties: + paths: + items: + properties: + value: + type: string + required: + - value + type: object + type: array + required: + - paths + type: object + outputDirectory: + nullable: true + type: string + passwordProtection: + nullable: true + type: string + description: (opaque JSON object) + passport: + nullable: true + properties: + deploymentType: + type: string + enum: + - all + - all_except_custom_domains + - preview + - prod_deployment_urls_and_all_previews + connectorId: + type: string + required: + - connectorId + - deploymentType + type: object + protectionConfig: + properties: + sandboxUrls: + properties: + inheritDeploymentProtection: + type: boolean + enum: + - false + - true + type: object + type: object + sandbox: + properties: + region: + type: string + enum: + - arn1 + - bom1 + - cdg1 + - cle1 + - cpt1 + - dub1 + - fra1 + - gru1 + - hkg1 + - hnd1 + - iad1 + - icn1 + - kix1 + - lhr1 + - pdx1 + - sfo1 + - sin1 + - syd1 + - yul1 + failoverRegions: + items: + type: string + enum: + - arn1 + - bom1 + - cdg1 + - cle1 + - cpt1 + - dub1 + - fra1 + - gru1 + - hkg1 + - hnd1 + - iad1 + - icn1 + - kix1 + - lhr1 + - pdx1 + - sfo1 + - sin1 + - syd1 + - yul1 + type: array + type: object + productionDeploymentsFastLane: + type: boolean + enum: + - false + - true + resourceConfig: + properties: + fluid: + type: boolean + enum: + - false + - true + functionDefaultRegions: + items: + type: string + type: array + functionDefaultTimeout: + type: number + functionDefaultMemoryType: + type: string + enum: + - performance + - performance_xl + - standard + - standard_legacy + functionZeroConfigFailover: + type: boolean + enum: + - false + - true + elasticConcurrencyEnabled: + type: boolean + enum: + - false + - true + buildMachineType: + type: string + enum: + - basic + - enhanced + - standard + - turbo + buildMachineSelection: + type: string + enum: + - elastic + - fixed + buildMachineElasticLastUpdated: + type: number + buildMachineElasticReason: + type: string + enum: + - basic-floor + - build-timeout-failure + - enospc-failure + - enterprise-floor + - high-peak-disk + - high-peak-memory + - long-build-duration + - oom-failure + - short-build-duration + - sustained-high-cpu + isNSNBDisabled: + type: boolean + enum: + - false + - true + buildQueue: + properties: + configuration: + type: string + enum: + - SKIP_NAMESPACE_QUEUE + - WAIT_FOR_NAMESPACE_QUEUE + type: object + enableFunctionsBeta: + type: boolean + enum: + - false + - true + type: object + required: + - functionDefaultRegions + rollbackDescription: + properties: + userId: + type: string + description: The user who rolled back the project. + username: + type: string + description: The username of the user who rolled back the project. + description: + type: string + description: User-supplied explanation of why they rolled back the project. Limited to 250 characters. + createdAt: + type: number + description: Timestamp of when the rollback was requested. + required: + - createdAt + - description + - userId + - username + type: object + description: Description of why a project was rolled back, and by whom. Note that lastAliasRequest contains the from/to details of the rollback. + rollingRelease: + nullable: true + properties: + target: + type: string + description: The environment that the release targets, currently only supports production. Adding in case we want to configure with alias groups or custom environments. + example: production + stages: + nullable: true + items: + properties: + targetPercentage: + type: number + description: The percentage of traffic to serve to the canary deployment (0-100) + example: 25 + requireApproval: + type: boolean + enum: + - false + - true + description: Whether or not this stage requires manual approval to proceed + example: false + duration: + type: number + description: Duration in minutes for automatic advancement to the next stage + example: 600 + linearShift: + type: boolean + enum: + - false + - true + description: Whether to linearly shift traffic over the duration of this stage + example: false + required: + - targetPercentage + type: object + description: 'An array of all the stages required during a deployment release. Each stage defines a target percentage and advancement rules. The final stage must always have targetPercentage: 100.' + type: array + description: 'An array of all the stages required during a deployment release. Each stage defines a target percentage and advancement rules. The final stage must always have targetPercentage: 100.' + canaryResponseHeader: + type: boolean + enum: + - false + - true + description: Whether the request served by a canary deployment should return a header indicating a canary was served. Defaults to `false` when omitted. + example: false + gate: + properties: + enabled: + type: boolean + enum: + - false + - true + description: Whether automated gating is enabled for this project's rollouts. + checks: + items: + properties: + type: + type: string + enum: + - error-rate-5xx + description: The metric this check evaluates. + minSampleSize: + type: number + description: Minimum number of requests required in the window before the check can fail. Below this, the check is inconclusive rather than failing, so low-traffic stages don't gate on noise. Defaults to `100` when omitted. + example: 100 + excludeStatusCodes: + items: + type: number + type: array + description: Response status codes to ignore entirely — dropped from both the numerator (errors) and the denominator (total requests). Defaults to `[]` when omitted. + example: + - 503 + excludePaths: + items: + type: string + type: array + description: Request paths to ignore entirely — dropped from both the numerator (errors) and the denominator (total requests). Matched exactly against the request path with any query string removed; no prefix or glob matching. Defaults to `[]` when omitted. + example: + - /api/health + ingestWatermarkSeconds: + type: number + description: 'Seconds of ingest lag to allow for: the query''s upper bound is `now() - this value`, so the check never reads a window that is still filling. Defaults to `30` when omitted.' + example: 30 + required: + - type + type: object + description: The checks to evaluate. An empty array means nothing is evaluated. + type: array + description: The checks to evaluate. An empty array means nothing is evaluated. + failureThreshold: + type: number + description: How many failing evaluations within {@link windowSize} trip the gate. Defaults to `3` when omitted. + example: 3 + windowSize: + type: number + description: How many of the most recent evaluations {@link failureThreshold} is counted against. Defaults to `5` when omitted. + example: 5 + action: + type: string + enum: + - pause + - rollback + description: 'What to do when the gate trips: pause the rollout, or roll it back.' + dryRun: + type: boolean + enum: + - false + - true + description: When true, a tripped gate is only reported — {@link action} is not taken. + required: + - action + - checks + - dryRun + - enabled + type: object + description: 'Automated gating configuration. Omitted (the default) means no gating is configured, which is equivalent to `enabled: false`.' + required: + - target + type: object + description: Project-level rolling release configuration that defines how deployments should be gradually rolled out + defaultResourceConfig: + properties: + fluid: + type: boolean + enum: + - false + - true + functionDefaultRegions: + items: + type: string + type: array + functionDefaultTimeout: + type: number + functionDefaultMemoryType: + type: string + enum: + - performance + - performance_xl + - standard + - standard_legacy + functionZeroConfigFailover: + type: boolean + enum: + - false + - true + elasticConcurrencyEnabled: + type: boolean + enum: + - false + - true + buildMachineType: + type: string + enum: + - basic + - enhanced + - standard + - turbo + buildMachineSelection: + type: string + enum: + - elastic + - fixed + buildMachineElasticLastUpdated: + type: number + buildMachineElasticReason: + type: string + enum: + - basic-floor + - build-timeout-failure + - enospc-failure + - enterprise-floor + - high-peak-disk + - high-peak-memory + - long-build-duration + - oom-failure + - short-build-duration + - sustained-high-cpu + isNSNBDisabled: + type: boolean + enum: + - false + - true + buildQueue: + properties: + configuration: + type: string + enum: + - SKIP_NAMESPACE_QUEUE + - WAIT_FOR_NAMESPACE_QUEUE + type: object + enableFunctionsBeta: + type: boolean + enum: + - false + - true + type: object + required: + - functionDefaultRegions + rootDirectory: + nullable: true + type: string + serverlessFunctionZeroConfigFailover: + type: boolean + enum: + - false + - true + skewProtectionBoundaryAt: + type: number + skewProtectionMaxAge: + type: number + skewProtectionAllowedDomains: + items: + type: string + type: array + skipGitConnectDuringLink: + type: boolean + enum: + - false + - true + staticIps: + properties: + builds: + type: boolean + enum: + - false + - true + enabled: + type: boolean + enum: + - false + - true + regions: + items: + type: string + type: array + required: + - builds + - enabled + - regions + type: object + sourceFilesOutsideRootDirectory: + type: boolean + enum: + - false + - true + enableAffectedProjectsDeployments: + type: boolean + enum: + - false + - true + enableExternalRewriteCaching: + type: boolean + enum: + - false + - true + ssoProtection: + nullable: true + properties: + deploymentType: + type: string + enum: + - all + - all_except_custom_domains + - preview + - prod_deployment_urls_and_all_previews + cve55182MigrationAppliedFrom: + nullable: true + type: string + enum: + - all + - all_except_custom_domains + - preview + - prod_deployment_urls_and_all_previews + - null + april2026SecurityIncidentMigrationAppliedFrom: + nullable: true + type: string + enum: + - all + - all_except_custom_domains + - preview + - prod_deployment_urls_and_all_previews + - null + required: + - deploymentType + type: object + targets: + additionalProperties: + nullable: true + properties: + id: + type: string + alias: + items: + type: string + type: array + aliasAssigned: + nullable: true + oneOf: + - type: number + - type: boolean + enum: + - false + - true + aliasError: + nullable: true + properties: + code: + type: string + message: + type: string + required: + - code + - message + type: object + aliasFinal: + nullable: true + type: string + automaticAliases: + items: + type: string + type: array + branchMatcher: + properties: + type: + type: string + enum: + - endsWith + - equals + - startsWith + description: The type of matching to perform + pattern: + type: string + description: The pattern to match against branch names + required: + - pattern + - type + type: object + buildingAt: + type: number + builds: + items: + properties: + use: + type: string + src: + type: string + dest: + type: string + required: + - use + type: object + type: array + checksConclusion: + type: string + enum: + - canceled + - failed + - skipped + - succeeded + checksState: + type: string + enum: + - completed + - registered + - running + connectBuildsEnabled: + type: boolean + enum: + - false + - true + connectConfigurationId: + type: string + createdAt: + type: number + createdIn: + type: string + creator: + nullable: true + properties: + email: + type: string + githubLogin: + type: string + gitlabLogin: + type: string + uid: + type: string + username: + type: string + required: + - email + - uid + - username + type: object + deletedAt: + type: number + deploymentHostname: + type: string + forced: + type: boolean + enum: + - false + - true + name: + type: string + meta: + additionalProperties: + type: string + type: object + monorepoManager: + nullable: true + type: string + oidcTokenClaims: + properties: + iss: + type: string + sub: + type: string + scope: + type: string + aud: + type: string + owner: + type: string + owner_id: + type: string + project: + type: string + project_id: + type: string + environment: + type: string + custom_environment_id: + type: string + mfe_group_ids: + items: + type: string + type: array + plan: + type: string + required: + - aud + - environment + - iss + - owner + - owner_id + - project + - project_id + - scope + - sub + type: object + plan: + type: string + enum: + - enterprise + - hobby + - pro + previewCommentsEnabled: + type: boolean + enum: + - false + - true + description: Whether or not preview comments are enabled for the deployment + example: false + private: + type: boolean + enum: + - false + - true + readyAt: + type: number + readyState: + type: string + enum: + - BLOCKED + - BUILDING + - CANCELED + - ERROR + - INITIALIZING + - QUEUED + - READY + readySubstate: + type: string + enum: + - PROMOTED + - ROLLING + - STAGED + requestedAt: + type: number + target: + nullable: true + type: string + teamId: + nullable: true + type: string + type: + type: string + enum: + - LAMBDAS + url: + type: string + userId: + type: string + description: Present for user creators; omitted for app/integration/system creators. + withCache: + type: boolean + enum: + - false + - true + required: + - createdAt + - createdIn + - creator + - deploymentHostname + - id + - name + - plan + - private + - readyState + - type + - url + type: object + type: object + transferCompletedAt: + type: number + transferStartedAt: + type: number + transferToAccountId: + type: string + transferredFromAccountId: + type: string + updatedAt: + type: number + live: + type: boolean + enum: + - false + - true + enablePreviewFeedback: + nullable: true + type: boolean + enum: + - false + - true + - null + enableProductionFeedback: + nullable: true + type: boolean + enum: + - false + - true + - null + permissions: + properties: + aliasProject: + items: + $ref: '#/components/schemas/ACLAction' + type: array + aliasProtectionBypass: + items: + $ref: '#/components/schemas/ACLAction' + type: array + bulkRedirects: + items: + $ref: '#/components/schemas/ACLAction' + type: array + buildMachine: + items: + $ref: '#/components/schemas/ACLAction' + type: array + connectConfigurationLink: + items: + $ref: '#/components/schemas/ACLAction' + type: array + dataCacheNamespace: + items: + $ref: '#/components/schemas/ACLAction' + type: array + deployment: + items: + $ref: '#/components/schemas/ACLAction' + type: array + deploymentBuildLogs: + items: + $ref: '#/components/schemas/ACLAction' + type: array + deploymentCheck: + items: + $ref: '#/components/schemas/ACLAction' + type: array + deploymentCheckPreview: + items: + $ref: '#/components/schemas/ACLAction' + type: array + deploymentCheckReRunFromProductionBranch: + items: + $ref: '#/components/schemas/ACLAction' + type: array + deploymentProductionGit: + items: + $ref: '#/components/schemas/ACLAction' + type: array + deploymentV0: + items: + $ref: '#/components/schemas/ACLAction' + type: array + deploymentPreview: + items: + $ref: '#/components/schemas/ACLAction' + type: array + deploymentPrivate: + items: + $ref: '#/components/schemas/ACLAction' + type: array + deploymentPromote: + items: + $ref: '#/components/schemas/ACLAction' + type: array + deploymentRollback: + items: + $ref: '#/components/schemas/ACLAction' + type: array + edgeCacheNamespace: + items: + $ref: '#/components/schemas/ACLAction' + type: array + environments: + items: + $ref: '#/components/schemas/ACLAction' + type: array + job: + items: + $ref: '#/components/schemas/ACLAction' + type: array + logs: + items: + $ref: '#/components/schemas/ACLAction' + type: array + logsPreset: + items: + $ref: '#/components/schemas/ACLAction' + type: array + observabilityData: + items: + $ref: '#/components/schemas/ACLAction' + type: array + onDemandBuild: + items: + $ref: '#/components/schemas/ACLAction' + type: array + onDemandConcurrency: + items: + $ref: '#/components/schemas/ACLAction' + type: array + optionsAllowlist: + items: + $ref: '#/components/schemas/ACLAction' + type: array + passwordProtection: + items: + $ref: '#/components/schemas/ACLAction' + type: array + privateLinkEndpoint: + items: + $ref: '#/components/schemas/ACLAction' + type: array + productionAliasProtectionBypass: + items: + $ref: '#/components/schemas/ACLAction' + type: array + productionShareableLink: + items: + $ref: '#/components/schemas/ACLAction' + type: array + project: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectAccessGroup: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectAnalyticsSampling: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectAnalyticsUsage: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectCheck: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectCheckRun: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectDeploymentExpiration: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectDeploymentHook: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectDeploymentProtectionStrict: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectDomain: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectDomainCheckConfig: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectDomainMove: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectDomainVerify: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectEvent: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectEnvVars: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectEnvVarsProduction: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectEnvVarsUnownedByIntegration: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectFlags: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectFlagsProduction: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectFlagsSdkKey: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectFromV0: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectId: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectIntegrationConfiguration: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectLink: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectMember: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectMonitoring: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectOIDCToken: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectPermissions: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectProductionBranch: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectProtectionBypass: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectRollingRelease: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectRoutes: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectSupportCase: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectSupportCaseComment: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectTier: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectTransfer: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectTransferOut: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectUsage: + items: + $ref: '#/components/schemas/ACLAction' + type: array + pageIntegrity: + items: + $ref: '#/components/schemas/ACLAction' + type: array + seawallConfig: + items: + $ref: '#/components/schemas/ACLAction' + type: array + securityPlusConfiguration: + items: + $ref: '#/components/schemas/ACLAction' + type: array + shareableLink: + items: + $ref: '#/components/schemas/ACLAction' + type: array + shareableLinkStrict: + items: + $ref: '#/components/schemas/ACLAction' + type: array + sharedEnvVarConnection: + items: + $ref: '#/components/schemas/ACLAction' + type: array + skewProtection: + items: + $ref: '#/components/schemas/ACLAction' + type: array + analytics: + items: + $ref: '#/components/schemas/ACLAction' + type: array + trustedIps: + items: + $ref: '#/components/schemas/ACLAction' + type: array + trustedSources: + items: + $ref: '#/components/schemas/ACLAction' + type: array + v0Chat: + items: + $ref: '#/components/schemas/ACLAction' + type: array + vercelAuth: + items: + $ref: '#/components/schemas/ACLAction' + type: array + vercelRun: + items: + $ref: '#/components/schemas/ACLAction' + type: array + webAnalytics: + items: + $ref: '#/components/schemas/ACLAction' + type: array + workflowRunData: + items: + $ref: '#/components/schemas/ACLAction' + type: array + oauth2Connection: + items: + $ref: '#/components/schemas/ACLAction' + type: array + user: + items: + $ref: '#/components/schemas/ACLAction' + type: array + userConnection: + items: + $ref: '#/components/schemas/ACLAction' + type: array + userMfaConfiguration: + items: + $ref: '#/components/schemas/ACLAction' + type: array + userPreference: + items: + $ref: '#/components/schemas/ACLAction' + type: array + userSudo: + items: + $ref: '#/components/schemas/ACLAction' + type: array + webAuthn: + items: + $ref: '#/components/schemas/ACLAction' + type: array + accessGroup: + items: + $ref: '#/components/schemas/ACLAction' + type: array + agent: + items: + $ref: '#/components/schemas/ACLAction' + type: array + aiGatewayApiKey: + items: + $ref: '#/components/schemas/ACLAction' + type: array + aiGatewayApiKeyBypassAll: + items: + $ref: '#/components/schemas/ACLAction' + type: array + aiGatewayApiKeyOwnedBySelf: + items: + $ref: '#/components/schemas/ACLAction' + type: array + aiGatewayApiKeySpendAttribution: + items: + $ref: '#/components/schemas/ACLAction' + type: array + aiGatewayApiKeyZdrExemption: + items: + $ref: '#/components/schemas/ACLAction' + type: array + aiGatewayBudget: + items: + $ref: '#/components/schemas/ACLAction' + type: array + aiGatewayCredits: + items: + $ref: '#/components/schemas/ACLAction' + type: array + aiGatewayPrivateModels: + items: + $ref: '#/components/schemas/ACLAction' + type: array + aiGatewayGuardrails: + items: + $ref: '#/components/schemas/ACLAction' + type: array + aiGatewayRules: + items: + $ref: '#/components/schemas/ACLAction' + type: array + aiGatewaySettings: + items: + $ref: '#/components/schemas/ACLAction' + type: array + aiGatewayTranscripts: + items: + $ref: '#/components/schemas/ACLAction' + type: array + aiGatewayTranscriptsSettings: + items: + $ref: '#/components/schemas/ACLAction' + type: array + aiGatewayUsage: + items: + $ref: '#/components/schemas/ACLAction' + type: array + aiGatewayVirtualModelConfigs: + items: + $ref: '#/components/schemas/ACLAction' + type: array + alerts: + items: + $ref: '#/components/schemas/ACLAction' + type: array + alertRules: + items: + $ref: '#/components/schemas/ACLAction' + type: array + aliasGlobal: + items: + $ref: '#/components/schemas/ACLAction' + type: array + analyticsSampling: + items: + $ref: '#/components/schemas/ACLAction' + type: array + analyticsUsage: + items: + $ref: '#/components/schemas/ACLAction' + type: array + apiKey: + items: + $ref: '#/components/schemas/ACLAction' + type: array + apiKeyAiGateway: + items: + $ref: '#/components/schemas/ACLAction' + type: array + apiKeyOwnedBySelf: + items: + $ref: '#/components/schemas/ACLAction' + type: array + oauth2Application: + items: + $ref: '#/components/schemas/ACLAction' + type: array + vercelAppInstallation: + items: + $ref: '#/components/schemas/ACLAction' + type: array + vercelAppInstallationRequest: + items: + $ref: '#/components/schemas/ACLAction' + type: array + auditLog: + items: + $ref: '#/components/schemas/ACLAction' + type: array + automation: + items: + $ref: '#/components/schemas/ACLAction' + type: array + billingAddress: + items: + $ref: '#/components/schemas/ACLAction' + type: array + billingInformation: + items: + $ref: '#/components/schemas/ACLAction' + type: array + billingInvoice: + items: + $ref: '#/components/schemas/ACLAction' + type: array + billingInvoiceEmailRecipient: + items: + $ref: '#/components/schemas/ACLAction' + type: array + billingInvoiceLanguage: + items: + $ref: '#/components/schemas/ACLAction' + type: array + billingPlan: + items: + $ref: '#/components/schemas/ACLAction' + type: array + billingPurchaseOrder: + items: + $ref: '#/components/schemas/ACLAction' + type: array + billingRefund: + items: + $ref: '#/components/schemas/ACLAction' + type: array + billingTaxId: + items: + $ref: '#/components/schemas/ACLAction' + type: array + blob: + items: + $ref: '#/components/schemas/ACLAction' + type: array + blobStoreTokenSet: + items: + $ref: '#/components/schemas/ACLAction' + type: array + budget: + items: + $ref: '#/components/schemas/ACLAction' + type: array + cacheArtifact: + items: + $ref: '#/components/schemas/ACLAction' + type: array + cacheArtifactUsageEvent: + items: + $ref: '#/components/schemas/ACLAction' + type: array + codeChecks: + items: + $ref: '#/components/schemas/ACLAction' + type: array + codeOwners: + items: + $ref: '#/components/schemas/ACLAction' + type: array + ciInvocations: + items: + $ref: '#/components/schemas/ACLAction' + type: array + ciLogs: + items: + $ref: '#/components/schemas/ACLAction' + type: array + concurrentBuilds: + items: + $ref: '#/components/schemas/ACLAction' + type: array + connect: + items: + $ref: '#/components/schemas/ACLAction' + type: array + connectConfiguration: + items: + $ref: '#/components/schemas/ACLAction' + type: array + connectLogs: + items: + $ref: '#/components/schemas/ACLAction' + type: array + connexClient: + items: + $ref: '#/components/schemas/ACLAction' + type: array + connexClientProject: + items: + $ref: '#/components/schemas/ACLAction' + type: array + connexContact: + items: + $ref: '#/components/schemas/ACLAction' + type: array + connexInstallation: + items: + $ref: '#/components/schemas/ACLAction' + type: array + connexToken: + items: + $ref: '#/components/schemas/ACLAction' + type: array + buildMachineDefault: + items: + $ref: '#/components/schemas/ACLAction' + type: array + cursorOriginInstallation: + items: + $ref: '#/components/schemas/ACLAction' + type: array + dataCacheBillingSettings: + items: + $ref: '#/components/schemas/ACLAction' + type: array + defaultDeploymentProtection: + items: + $ref: '#/components/schemas/ACLAction' + type: array + deploymentPolicy: + items: + $ref: '#/components/schemas/ACLAction' + type: array + domain: + items: + $ref: '#/components/schemas/ACLAction' + type: array + domainAcceptDelegation: + items: + $ref: '#/components/schemas/ACLAction' + type: array + domainAuthCodes: + items: + $ref: '#/components/schemas/ACLAction' + type: array + domainCertificate: + items: + $ref: '#/components/schemas/ACLAction' + type: array + domainCheckConfig: + items: + $ref: '#/components/schemas/ACLAction' + type: array + domainMove: + items: + $ref: '#/components/schemas/ACLAction' + type: array + domainPurchase: + items: + $ref: '#/components/schemas/ACLAction' + type: array + domainRecord: + items: + $ref: '#/components/schemas/ACLAction' + type: array + domainTransferIn: + items: + $ref: '#/components/schemas/ACLAction' + type: array + drain: + items: + $ref: '#/components/schemas/ACLAction' + type: array + edgeConfig: + items: + $ref: '#/components/schemas/ACLAction' + type: array + edgeConfigItem: + items: + $ref: '#/components/schemas/ACLAction' + type: array + edgeConfigSchema: + items: + $ref: '#/components/schemas/ACLAction' + type: array + edgeConfigToken: + items: + $ref: '#/components/schemas/ACLAction' + type: array + endpointVerification: + items: + $ref: '#/components/schemas/ACLAction' + type: array + event: + items: + $ref: '#/components/schemas/ACLAction' + type: array + fileUpload: + items: + $ref: '#/components/schemas/ACLAction' + type: array + flagsExplorerSubscription: + items: + $ref: '#/components/schemas/ACLAction' + type: array + gitRepository: + items: + $ref: '#/components/schemas/ACLAction' + type: array + imageOptimizationNewPrice: + items: + $ref: '#/components/schemas/ACLAction' + type: array + integration: + items: + $ref: '#/components/schemas/ACLAction' + type: array + integrationAccount: + items: + $ref: '#/components/schemas/ACLAction' + type: array + integrationConfiguration: + items: + $ref: '#/components/schemas/ACLAction' + type: array + integrationConfigurationProjects: + items: + $ref: '#/components/schemas/ACLAction' + type: array + integrationConfigurationRole: + items: + $ref: '#/components/schemas/ACLAction' + type: array + integrationConfigurationTransfer: + items: + $ref: '#/components/schemas/ACLAction' + type: array + integrationDeploymentAction: + items: + $ref: '#/components/schemas/ACLAction' + type: array + integrationEvent: + items: + $ref: '#/components/schemas/ACLAction' + type: array + integrationLog: + items: + $ref: '#/components/schemas/ACLAction' + type: array + integrationResource: + items: + $ref: '#/components/schemas/ACLAction' + type: array + integrationResourceData: + items: + $ref: '#/components/schemas/ACLAction' + type: array + integrationResourceReplCommand: + items: + $ref: '#/components/schemas/ACLAction' + type: array + integrationResourceSecrets: + items: + $ref: '#/components/schemas/ACLAction' + type: array + integrationSSOSession: + items: + $ref: '#/components/schemas/ACLAction' + type: array + integrationStrict: + items: + $ref: '#/components/schemas/ACLAction' + type: array + integrationStoreTokenSet: + items: + $ref: '#/components/schemas/ACLAction' + type: array + integrationVercelConfigurationOverride: + items: + $ref: '#/components/schemas/ACLAction' + type: array + integrationPullRequest: + items: + $ref: '#/components/schemas/ACLAction' + type: array + ipBlocking: + items: + $ref: '#/components/schemas/ACLAction' + type: array + jobGlobal: + items: + $ref: '#/components/schemas/ACLAction' + type: array + kmsIssuer: + items: + $ref: '#/components/schemas/ACLAction' + type: array + kmsProjectGrant: + items: + $ref: '#/components/schemas/ACLAction' + type: array + logDrain: + items: + $ref: '#/components/schemas/ACLAction' + type: array + marketplaceBillingData: + items: + $ref: '#/components/schemas/ACLAction' + type: array + marketplaceExperimentationEdgeConfigData: + items: + $ref: '#/components/schemas/ACLAction' + type: array + marketplaceExperimentationItem: + items: + $ref: '#/components/schemas/ACLAction' + type: array + marketplaceFlexCommit: + items: + $ref: '#/components/schemas/ACLAction' + type: array + marketplaceInstallationMember: + items: + $ref: '#/components/schemas/ACLAction' + type: array + marketplaceInvoice: + items: + $ref: '#/components/schemas/ACLAction' + type: array + marketplaceSettings: + items: + $ref: '#/components/schemas/ACLAction' + type: array + Monitoring: + items: + $ref: '#/components/schemas/ACLAction' + type: array + monitoringAlert: + items: + $ref: '#/components/schemas/ACLAction' + type: array + monitoringChart: + items: + $ref: '#/components/schemas/ACLAction' + type: array + monitoringQuery: + items: + $ref: '#/components/schemas/ACLAction' + type: array + monitoringSettings: + items: + $ref: '#/components/schemas/ACLAction' + type: array + notificationCustomerBudget: + items: + $ref: '#/components/schemas/ACLAction' + type: array + notificationDeploymentFailed: + items: + $ref: '#/components/schemas/ACLAction' + type: array + notificationDomainConfiguration: + items: + $ref: '#/components/schemas/ACLAction' + type: array + notificationDomainExpire: + items: + $ref: '#/components/schemas/ACLAction' + type: array + notificationDomainMoved: + items: + $ref: '#/components/schemas/ACLAction' + type: array + notificationDomainPurchase: + items: + $ref: '#/components/schemas/ACLAction' + type: array + notificationDomainRenewal: + items: + $ref: '#/components/schemas/ACLAction' + type: array + notificationDomainTransfer: + items: + $ref: '#/components/schemas/ACLAction' + type: array + notificationDomainUnverified: + items: + $ref: '#/components/schemas/ACLAction' + type: array + NotificationMonitoringAlert: + items: + $ref: '#/components/schemas/ACLAction' + type: array + notificationPaymentFailed: + items: + $ref: '#/components/schemas/ACLAction' + type: array + notificationPreferences: + items: + $ref: '#/components/schemas/ACLAction' + type: array + notificationStatementOfReasons: + items: + $ref: '#/components/schemas/ACLAction' + type: array + notificationUsageAlert: + items: + $ref: '#/components/schemas/ACLAction' + type: array + oidcFederationPolicy: + items: + $ref: '#/components/schemas/ACLAction' + type: array + observabilityConfiguration: + items: + $ref: '#/components/schemas/ACLAction' + type: array + observabilityFunnel: + items: + $ref: '#/components/schemas/ACLAction' + type: array + observabilityNotebook: + items: + $ref: '#/components/schemas/ACLAction' + type: array + openTelemetryEndpoint: + items: + $ref: '#/components/schemas/ACLAction' + type: array + ownEvent: + items: + $ref: '#/components/schemas/ACLAction' + type: array + organization: + items: + $ref: '#/components/schemas/ACLAction' + type: array + organizationDomain: + items: + $ref: '#/components/schemas/ACLAction' + type: array + organizationTeam: + items: + $ref: '#/components/schemas/ACLAction' + type: array + passwordProtectionInvoiceItem: + items: + $ref: '#/components/schemas/ACLAction' + type: array + paymentMethod: + items: + $ref: '#/components/schemas/ACLAction' + type: array + permissions: + items: + $ref: '#/components/schemas/ACLAction' + type: array + postgres: + items: + $ref: '#/components/schemas/ACLAction' + type: array + postgresStoreTokenSet: + items: + $ref: '#/components/schemas/ACLAction' + type: array + previewDeploymentSuffix: + items: + $ref: '#/components/schemas/ACLAction' + type: array + privateCloudAccount: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectTransferIn: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectTransferRequest: + items: + $ref: '#/components/schemas/ACLAction' + type: array + proTrialOnboarding: + items: + $ref: '#/components/schemas/ACLAction' + type: array + rateLimit: + items: + $ref: '#/components/schemas/ACLAction' + type: array + redis: + items: + $ref: '#/components/schemas/ACLAction' + type: array + redisStoreTokenSet: + items: + $ref: '#/components/schemas/ACLAction' + type: array + remoteCaching: + items: + $ref: '#/components/schemas/ACLAction' + type: array + repository: + items: + $ref: '#/components/schemas/ACLAction' + type: array + samlConfig: + items: + $ref: '#/components/schemas/ACLAction' + type: array + secret: + items: + $ref: '#/components/schemas/ACLAction' + type: array + securityConfig: + items: + $ref: '#/components/schemas/ACLAction' + type: array + sensitiveEnvironmentVariablePolicy: + items: + $ref: '#/components/schemas/ACLAction' + type: array + sharedEnvVars: + items: + $ref: '#/components/schemas/ACLAction' + type: array + sharedEnvVarsProduction: + items: + $ref: '#/components/schemas/ACLAction' + type: array + space: + items: + $ref: '#/components/schemas/ACLAction' + type: array + spaceRun: + items: + $ref: '#/components/schemas/ACLAction' + type: array + storeIsLocked: + items: + $ref: '#/components/schemas/ACLAction' + type: array + storeTokenSetSensitive: + items: + $ref: '#/components/schemas/ACLAction' + type: array + storeTransfer: + items: + $ref: '#/components/schemas/ACLAction' + type: array + supportCase: + items: + $ref: '#/components/schemas/ACLAction' + type: array + supportCaseComment: + items: + $ref: '#/components/schemas/ACLAction' + type: array + team: + items: + $ref: '#/components/schemas/ACLAction' + type: array + teamAccessRequest: + items: + $ref: '#/components/schemas/ACLAction' + type: array + teamFellowMembership: + items: + $ref: '#/components/schemas/ACLAction' + type: array + teamGitExclusivity: + items: + $ref: '#/components/schemas/ACLAction' + type: array + teamInvite: + items: + $ref: '#/components/schemas/ACLAction' + type: array + teamInviteCode: + items: + $ref: '#/components/schemas/ACLAction' + type: array + teamInviteLink: + items: + $ref: '#/components/schemas/ACLAction' + type: array + teamJoin: + items: + $ref: '#/components/schemas/ACLAction' + type: array + teamMemberMfaStatus: + items: + $ref: '#/components/schemas/ACLAction' + type: array + teamMicrofrontends: + items: + $ref: '#/components/schemas/ACLAction' + type: array + teamOwnMembership: + items: + $ref: '#/components/schemas/ACLAction' + type: array + teamOwnMembershipDisconnectSAML: + items: + $ref: '#/components/schemas/ACLAction' + type: array + teamSudo: + items: + $ref: '#/components/schemas/ACLAction' + type: array + teamTokenInvalidation: + items: + $ref: '#/components/schemas/ACLAction' + type: array + token: + items: + $ref: '#/components/schemas/ACLAction' + type: array + toolbarComment: + items: + $ref: '#/components/schemas/ACLAction' + type: array + usage: + items: + $ref: '#/components/schemas/ACLAction' + type: array + usageCycle: + items: + $ref: '#/components/schemas/ACLAction' + type: array + vcrRepository: + items: + $ref: '#/components/schemas/ACLAction' + type: array + vpcPeeringConnection: + items: + $ref: '#/components/schemas/ACLAction' + type: array + webAnalyticsPlan: + items: + $ref: '#/components/schemas/ACLAction' + type: array + webhook: + items: + $ref: '#/components/schemas/ACLAction' + type: array + webhook-event: + items: + $ref: '#/components/schemas/ACLAction' + type: array + type: object + lastRollbackTarget: + nullable: true + type: string + description: (opaque JSON object) + lastAliasRequest: + nullable: true + properties: + fromDeploymentId: + nullable: true + type: string + toDeploymentId: + type: string + fromRollingReleaseId: + type: string + description: If rolling back from a rolling release, fromDeploymentId captures the "base" of that rolling release, and fromRollingReleaseId captures the "target" of that rolling release. + jobStatus: + type: string + enum: + - failed + - in-progress + - pending + - skipped + - succeeded + requestedAt: + type: number + type: + type: string + enum: + - promote + - rollback + required: + - fromDeploymentId + - jobStatus + - requestedAt + - toDeploymentId + - type + type: object + protectionBypass: + additionalProperties: + oneOf: + - properties: + createdAt: + type: number + createdBy: + type: string + scope: + type: string + enum: + - integration-automation-bypass + integrationId: + type: string + configurationId: + type: string + required: + - configurationId + - createdAt + - createdBy + - integrationId + - scope + type: object + - properties: + createdAt: + type: number + createdBy: + type: string + scope: + type: string + enum: + - automation-bypass + isEnvVar: + type: boolean + enum: + - false + - true + description: When there was only one bypass, it was automatically set as an env var on deployments. With multiple bypasses, there is always one bypass that is selected as the default, and gets set as an env var on deployments. As this is a new field, undefined means that the bypass is the env var. If there are any automation bypasses, exactly one must be the env var. + note: + type: string + description: Optional note about the bypass to be displayed in the UI + required: + - createdAt + - createdBy + - scope + type: object + type: object + hasActiveBranches: + type: boolean + enum: + - false + - true + trustedIps: + nullable: true + oneOf: + - properties: + deploymentType: + type: string + enum: + - all + - all_except_custom_domains + - preview + - prod_deployment_urls_and_all_previews + - production + addresses: + items: + properties: + value: + type: string + note: + type: string + required: + - value + type: object + type: array + protectionMode: + type: string + enum: + - additional + - exclusive + required: + - addresses + - deploymentType + - protectionMode + type: object + - properties: + deploymentType: + type: string + enum: + - all + - all_except_custom_domains + - preview + - prod_deployment_urls_and_all_previews + - production + required: + - deploymentType + type: object + trustedSources: + nullable: true + properties: + enableVercelCiSameRepository: + type: boolean + enum: + - false + - true + description: Allow same-team Vercel CI access to preview deployments built from the CI run's repository, using the deployment source rather than the current project repository link. Defaults to enabled when not stored; omitted or null Trusted Sources updates preserve the stored value. + projects: + additionalProperties: + properties: + label: + type: string + customAllow: + items: + properties: + from: + oneOf: + - properties: + slugs: + items: + type: string + type: array + description: System environment slugs (`production`, `preview`) and/or custom environment slugs defined on the referenced project. + preset: + type: string + enum: + - all-custom + required: + - slugs + type: object + description: The source envs on the trusted project that are allowed to access `to`. + - properties: + slugs: + items: + type: string + type: array + description: System environment slugs (`production`, `preview`) and/or custom environment slugs defined on the referenced project. + preset: + type: string + enum: + - all-custom + required: + - preset + type: object + description: The source envs on the trusted project that are allowed to access `to`. + to: + oneOf: + - properties: + slugs: + items: + type: string + type: array + description: System environment slugs (`production`, `preview`) and/or custom environment slugs defined on the referenced project. + preset: + type: string + enum: + - all-custom + required: + - slugs + type: object + description: The target envs on the current project that may be accessed. + - properties: + slugs: + items: + type: string + type: array + description: System environment slugs (`production`, `preview`) and/or custom environment slugs defined on the referenced project. + preset: + type: string + enum: + - all-custom + required: + - preset + type: object + description: The target envs on the current project that may be accessed. + required: + - from + - to + type: object + description: Optional overrides for the default same-env-by-slug matching. Provide explicit rules to allow cross-env access or presets. + type: array + description: Optional overrides for the default same-env-by-slug matching. Provide explicit rules to allow cross-env access or presets. + type: object + type: object + oidcProviders: + additionalProperties: + items: + properties: + to: + oneOf: + - properties: + slugs: + items: + type: string + type: array + description: System environment slugs (`production`, `preview`) and/or custom environment slugs defined on the referenced project. + preset: + type: string + enum: + - all-custom + required: + - slugs + type: object + description: The target envs on the current project that may be accessed. + - properties: + slugs: + items: + type: string + type: array + description: System environment slugs (`production`, `preview`) and/or custom environment slugs defined on the referenced project. + preset: + type: string + enum: + - all-custom + required: + - preset + type: object + description: The target envs on the current project that may be accessed. + label: + type: string + claims: + additionalProperties: + items: + type: string + type: array + type: object + required: + - claims + - to + type: object + type: array + type: object + type: object + gitComments: + properties: + onPullRequest: + type: boolean + enum: + - false + - true + description: Whether the Vercel bot should comment on PRs + onCommit: + type: boolean + enum: + - false + - true + description: Whether the Vercel bot should comment on commits + required: + - onCommit + - onPullRequest + type: object + gitProviderOptions: + properties: + createDeployments: + type: string + enum: + - disabled + - enabled + description: 'Whether the Vercel bot should automatically create GitHub deployments https://docs.github.com/en/rest/deployments/deployments#about-deployments NOTE: repository-dispatch events should be used instead' + disableRepositoryDispatchEvents: + type: boolean + enum: + - false + - true + description: 'Whether the Vercel bot should not automatically create GitHub repository-dispatch events on deployment events. https://vercel.com/docs/git/vercel-for-github#repository-dispatch-events - `true`: disable repository-dispatch events for this project (explicit override of the team setting). - `false`: enable repository-dispatch events for this project (explicit override of the team setting). - absent: inherit from `team.disableRepositoryDispatchEvents`.' + requireVerifiedCommits: + type: boolean + enum: + - false + - true + description: 'Whether the project requires commits to be signed & verified before deployments will be created. - `true`: require verified commits for this project (explicit override of the team setting). - `false`: do not require verified commits (explicit override of the team setting). - absent: inherit from `team.requireVerifiedCommits`.' + gitCommitStatus: + type: boolean + enum: + - false + - true + description: Whether Vercel should post commit statuses for this project. When omitted, commit statuses remain enabled. + consolidatedGitCommitStatus: + properties: + enabled: + type: boolean + enum: + - false + - true + description: Whether consolidated commit status is enabled. + propagateFailures: + type: boolean + enum: + - false + - true + description: Whether to propagate individual deployment failures to the consolidated status. + required: + - enabled + - propagateFailures + type: object + description: Configuration for consolidated git commit status reporting. When enabled, Vercel will post a single consolidated commit status instead of individual statuses for each deployment. + required: + - createDeployments + type: object + paused: + type: boolean + enum: + - false + - true + concurrencyBucketName: + type: string + webAnalytics: + properties: + id: + type: string + disabledAt: + type: number + canceledAt: + type: number + enabledAt: + type: number + hasData: + type: boolean + enum: + - true + required: + - id + type: object + security: + properties: + attackModeEnabled: + type: boolean + enum: + - false + - true + attackModeUpdatedAt: + type: number + firewallEnabled: + type: boolean + enum: + - false + - true + firewallUpdatedAt: + type: number + attackModeActiveUntil: + nullable: true + type: number + firewallConfigVersion: + type: number + rulesets: + additionalProperties: + properties: + action: + type: string + enum: + - allow + - bypass + - challenge + - deny + - log + - rate_limit + - redirect + rateLimit: + nullable: true + properties: + algo: + type: string + enum: + - fixed_window + - token_bucket + window: + type: number + limit: + type: number + keys: + items: + type: string + type: array + action: + nullable: true + type: string + enum: + - challenge + - deny + - log + - rate_limit + - null + required: + - algo + - keys + - limit + - window + type: object + redirect: + nullable: true + properties: + location: + type: string + permanent: + type: boolean + enum: + - false + - true + required: + - location + - permanent + type: object + actionDuration: + nullable: true + type: string + bypassSystem: + nullable: true + type: boolean + enum: + - false + - true + - null + logHeaders: + oneOf: + - items: + type: string + type: array + - type: string + enum: + - '*' + required: + - action + type: object + type: object + firewallSeawallEnabled: + type: boolean + enum: + - false + - true + ja3Enabled: + type: boolean + enum: + - false + - true + ja4Enabled: + type: boolean + enum: + - false + - true + firewallBypassIps: + items: + type: string + type: array + managedRules: + nullable: true + properties: + vercel_ruleset: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - challenge + - deny + - log + required: + - active + type: object + traffic_sources: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - challenge + - deny + - log + required: + - active + type: object + bot_filter: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - challenge + - deny + - log + required: + - active + type: object + ai_bots: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - challenge + - deny + - log + required: + - active + type: object + owasp: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - challenge + - deny + - log + required: + - active + type: object + required: + - ai_bots + - bot_filter + - owasp + - traffic_sources + - vercel_ruleset + type: object + botIdEnabled: + type: boolean + enum: + - false + - true + log_headers: + oneOf: + - items: + type: string + type: array + - type: string + enum: + - '*' + securityPlus: + type: boolean + enum: + - false + - true + securityPlusMetadata: + properties: + updatedAt: + type: number + firstEnabledAt: + type: number + description: Timestamp when the feature was first enabled. Never changes after initial enablement. + required: + - updatedAt + type: object + pageIntegrityEnabled: + type: boolean + enum: + - false + - true + description: Whether Page Integrity is enabled for this project. Used by the metadata service to gate DynamoDB lookups against the page-integrity-inventory table. + type: object + oidcTokenConfig: + properties: + enabled: + type: boolean + enum: + - false + - true + description: Whether or not to generate OpenID Connect JSON Web Tokens. + issuerMode: + type: string + enum: + - global + - team + description: '- team: `https://oidc.vercel.com/[team_slug]` - global: `https://oidc.vercel.com`' + type: object + deploymentPolicy: + nullable: true + properties: + gitSources: + nullable: true + items: + properties: + sources: + items: + oneOf: + - properties: + provider: + type: string + enum: + - bitbucket + - github + org: + type: string + repo: + type: string + required: + - org + - provider + type: object + description: Allowlist entry for GitHub and Bitbucket, whose repos are identified by a flat `org`/`repo` (Bitbucket's workspace/owner maps to `org`, its repo slug to `repo`). Omit `repo` to match any repo in the org. Org is matched case-insensitively. + - properties: + provider: + type: string + enum: + - gitlab + namespace: + type: string + project: + type: string + required: + - namespace + - provider + type: object + description: Allowlist entry for GitLab, which uses nested groups rather than a flat org/repo. `namespace` is the full group path (e.g. `group` or `group/subgroup`); `project` is the leaf project name. Omit `project` to match any project under the namespace. Namespace is matched case-insensitively. + type: array + enabled: + type: boolean + enum: + - false + - true + environments: + items: + oneOf: + - properties: + type: + type: string + enum: + - system + target: + type: string + enum: + - preview + - production + required: + - target + - type + type: object + - properties: + type: + type: string + enum: + - custom + environmentId: + type: string + required: + - environmentId + - type + type: object + type: array + required: + - enabled + - environments + - sources + type: object + description: '`enabled: true` with empty `sources` is deny-all.' + type: array + deploymentSources: + nullable: true + items: + properties: + sources: + items: + type: string + enum: + - cli + - deploy-hook + - git + - integration + - rest-api + - v0 + description: 'Customer-configurable deployment sources. Every deploy classifies to exactly one. JSON schema in `packages/deployment-policy/schemas/body.ts` enumerates exactly these values. - `''git''` — git provider webhook. - `''cli''` — Vercel CLI (legacy classic-token CLI and SIWV CLI both). - `''rest-api''` — direct user/team-token REST upload. Does NOT cover deploy hooks, Marketplace integrations, or first-party app tokens. - `''deploy-hook''` — project deploy-hook URL. The URL is the credential. - `''integration''` — third-party Marketplace actor: Marketplace integration token, user-delegated OAuth from a Marketplace app, or an unrecognized third-party Vercel App. First-party Vercel Apps are never `''integration''`. - `''v0''` — the v0 product surface (entitlement-gated). v0 deploys through the CLI under the hood, but classifies as its own source so a team can allow or deny v0 independently of `''cli''`. First-party Vercel apps (Toolbar, etc.) classify as `''first-party''` — see `ClassifiedSource` in `./checks`. They''re not in this union because they aren''t customer-configurable; they bypass `checkDeploymentSources` entirely. v0 is intentionally NOT among them: like the CLI, it''s a real product surface and is policy-controllable.' + type: array + enabled: + type: boolean + enum: + - false + - true + environments: + items: + oneOf: + - properties: + type: + type: string + enum: + - system + target: + type: string + enum: + - preview + - production + required: + - target + - type + type: object + - properties: + type: + type: string + enum: + - custom + environmentId: + type: string + required: + - environmentId + - type + type: object + type: array + required: + - enabled + - environments + - sources + type: object + description: '`enabled: true` with empty `sources` is deny-all.' + type: array + type: object + description: Project shape. `null` on a rule list clears the project's override for that rule type (fall back to team for every env); omitting is equivalent. Setting `deploymentPolicy` itself to `null` clears every override at once. Kept structurally distinct from {@link TeamDeploymentPolicy} so the two storage locations don't share a type by accident. + tier: + type: string + enum: + - advanced + - critical + - priority + usageStatus: + properties: + kind: + type: string + enum: + - flat + description: Billing mode. Always 'flat' for flat-rate projects. + exceededAllowanceUntil: + type: number + description: Timestamp until which the project has exceeded its CDN allowance. + bypassThrottleUntil: + type: number + description: Timestamp until which throttling is bypassed (project pays list rates for overage). + throttled: + type: boolean + enum: + - false + - true + description: Per-project throttle, set explicitly for this project (e.g. via the per-project Flat Rate CDN endpoint). + teamThrottled: + type: boolean + enum: + - false + - true + description: Synced from `team.billing.usageStatus.throttled`. When `true`, the team has throttled all of its projects regardless of `throttled`. The effective throttle the CDN enforces is `throttled || teamThrottled`. + required: + - kind + type: object + features: + properties: + webAnalytics: + type: boolean + enum: + - false + - true + type: object + v0: + type: boolean + enum: + - false + - true + v0Created: + type: boolean + enum: + - false + - true + abuse: + properties: + scanner: + type: string + history: + items: + properties: + scanner: + type: string + reason: + type: string + by: + type: string + byId: + type: string + at: + type: number + required: + - at + - by + - byId + - reason + - scanner + type: object + type: array + updatedAt: + type: number + block: + properties: + action: + type: string + enum: + - blocked + reason: + type: string + statusCode: + type: number + createdAt: + type: number + caseId: + type: string + actor: + type: string + comment: + type: string + ineligibleForAppeal: + type: boolean + enum: + - false + - true + isCascading: + type: boolean + enum: + - false + - true + required: + - action + - createdAt + - reason + - statusCode + type: object + blockHistory: + items: + oneOf: + - properties: + action: + type: string + enum: + - blocked + reason: + type: string + statusCode: + type: number + createdAt: + type: number + caseId: + type: string + actor: + type: string + comment: + type: string + ineligibleForAppeal: + type: boolean + enum: + - false + - true + isCascading: + type: boolean + enum: + - false + - true + required: + - action + - createdAt + - reason + - statusCode + type: object + - properties: + action: + type: string + enum: + - unblocked + createdAt: + type: number + caseId: + type: string + actor: + type: string + comment: + type: string + ineligibleForAppeal: + type: boolean + enum: + - false + - true + isCascading: + type: boolean + enum: + - false + - true + required: + - action + - createdAt + type: object + - properties: + action: + type: string + enum: + - route-blocked + route: + oneOf: + - properties: + src: + type: string + status: + type: number + expiry: + type: number + required: + - src + - status + type: object + - properties: + has: + items: + oneOf: + - properties: + type: + type: string + enum: + - header + key: + type: string + enum: + - x-vercel-ip-country + value: + properties: + eq: + type: string + required: + - eq + type: object + required: + - key + - type + - value + type: object + - properties: + type: + type: string + enum: + - host + value: + properties: + eq: + type: string + required: + - eq + type: object + required: + - type + - value + type: object + type: array + mitigate: + properties: + action: + type: string + enum: + - block_legal_cwc + required: + - action + type: object + src: + type: string + required: + - has + - mitigate + type: object + reason: + type: string + createdAt: + type: number + caseId: + type: string + actor: + type: string + comment: + type: string + ineligibleForAppeal: + type: boolean + enum: + - false + - true + isCascading: + type: boolean + enum: + - false + - true + required: + - action + - createdAt + - reason + - route + type: object + - properties: + action: + type: string + enum: + - route-unblocked + route: + oneOf: + - properties: + src: + type: string + status: + type: number + expiry: + type: number + required: + - src + - status + type: object + - properties: + has: + items: + oneOf: + - properties: + type: + type: string + enum: + - header + key: + type: string + enum: + - x-vercel-ip-country + value: + properties: + eq: + type: string + required: + - eq + type: object + required: + - key + - type + - value + type: object + - properties: + type: + type: string + enum: + - host + value: + properties: + eq: + type: string + required: + - eq + type: object + required: + - type + - value + type: object + type: array + mitigate: + properties: + action: + type: string + enum: + - block_legal_cwc + required: + - action + type: object + src: + type: string + required: + - has + - mitigate + type: object + statusCode: + type: number + createdAt: + type: number + caseId: + type: string + actor: + type: string + comment: + type: string + ineligibleForAppeal: + type: boolean + enum: + - false + - true + isCascading: + type: boolean + enum: + - false + - true + required: + - action + - createdAt + - route + type: object + type: array + interstitial: + type: boolean + enum: + - false + - true + interstitialHistory: + items: + properties: + action: + type: string + enum: + - add-deployment-interstitial + - add-project-interstitial + - remove-deployment-interstitial + - remove-project-interstitial + createdAt: + type: number + caseId: + type: string + reason: + type: string + actor: + type: string + comment: + type: string + required: + - action + - createdAt + type: object + type: array + required: + - history + - updatedAt + type: object + internalRoutes: + items: + oneOf: + - properties: + src: + type: string + status: + type: number + expiry: + type: number + required: + - src + - status + type: object + - properties: + has: + items: + oneOf: + - properties: + type: + type: string + enum: + - header + key: + type: string + enum: + - x-vercel-ip-country + value: + properties: + eq: + type: string + required: + - eq + type: object + required: + - key + - type + - value + type: object + - properties: + type: + type: string + enum: + - host + value: + properties: + eq: + type: string + required: + - eq + type: object + required: + - type + - value + type: object + type: array + mitigate: + properties: + action: + type: string + enum: + - block_legal_cwc + required: + - action + type: object + src: + type: string + required: + - has + - mitigate + type: object + type: array + hasDeployments: + type: boolean + enum: + - false + - true + dismissedToasts: + items: + properties: + key: + type: string + dismissedAt: + type: number + action: + type: string + enum: + - accept + - cancel + - delete + value: + nullable: true + oneOf: + - type: string + - type: number + - properties: + previousValue: + oneOf: + - type: string + - type: number + - type: boolean + enum: + - false + - true + currentValue: + oneOf: + - type: string + - type: number + - type: boolean + enum: + - false + - true + required: + - currentValue + - previousValue + type: object + - type: boolean + enum: + - false + - true + required: + - action + - dismissedAt + - key + - value + type: object + type: array + protectedSourcemaps: + type: boolean + enum: + - false + - true + tracing: + properties: + domains: + type: string + ignorePaths: + items: + type: string + type: array + samplingRules: + items: + properties: + rate: + type: number + env: + type: string + enum: + - preview + - production + requestPath: + type: string + destination: + type: string + enum: + - external + - internal + description: Which tracing destination this rule applies to. `internal` is the hidden Vercel production-tracing drain (internal delivery); `external` is any customer-configured drain. Derived from the owning drain's delivery type when project tracing is computed; absent on configs persisted before this field existed. + required: + - rate + type: object + type: array + type: object + avatar: + nullable: true + type: string + required: + - accountId + - alias + - defaultResourceConfig + - deploymentExpiration + - directoryListing + - id + - name + - nodeVersion + - resourceConfig + type: object + type: array + required: + - projects + type: object + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '410': + description: '' + parameters: + - name: group_id + in: path + required: true + schema: + type: string + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + /v1/microfrontends/{deployment_id}/config: + get: + description: Get the microfrontends config for a deployment. + operationId: getMicrofrontendsConfig + security: + - bearerToken: [] + summary: Get microfrontends config for a deployment + tags: + - microfrontends + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + config: + nullable: true + properties: + $schema: + type: string + description: See https://openapi.vercel.sh/microfrontends.json. + version: + type: string + enum: + - '1' + description: The version of the microfrontends config schema. + applications: + additionalProperties: + oneOf: + - properties: + development: + properties: + fallback: + type: string + description: 'Fallback for local development, could point to any environment. This is required for the default app. This value is used as the fallback for child apps as well if they do not have a fallback. If passing a string, include the protocol (optional), host (required) and port (optional). For example: `https://this.ismyhost:8080`. If omitted, the protocol defaults to HTTPS. If omitted, the port defaults to `80` for HTTP and `443` for HTTPS. See https://vercel.com/docs/microfrontends/local-development.' + local: + oneOf: + - type: string + - type: number + task: + type: string + description: The task to run when starting the development server. Should reference a script in the package.json of the application. The default value is "dev". See https://vercel.com/docs/microfrontends/local-development. + required: + - fallback + type: object + description: Development configuration for the default application. + packageName: + type: string + description: The name used to run the application, e.g. the `name` field in the `package.json`. This is used by the local proxy to map the application config to the locally running app. This is only necessary when the application name does not match the `name` used in `package.json`. See https://vercel.com/docs/microfrontends/configuration#application-naming. + projectId: + type: string + required: + - development + - projectId + type: object + - properties: + development: + properties: + fallback: + type: string + description: 'Fallback for local development, could point to any environment. If not provided for child apps, the fallback of the default app will be used. If passing a string, include the protocol (optional), host (required) and port (optional). For example: `https://this.ismyhost:8080`. If omitted, the protocol defaults to HTTPS. If omitted, the port defaults to `80` for HTTP and `443` for HTTPS. See https://vercel.com/docs/microfrontends/local-development.' + local: + oneOf: + - type: string + - type: number + task: + type: string + description: The task to run when starting the development server. Should reference a script in the package.json of the application. The default value is "dev". See https://vercel.com/docs/microfrontends/local-development. + type: object + description: Development configuration for the child application. + routing: + items: + properties: + group: + type: string + description: Group name for the paths. + flag: + type: string + description: The name of the feature flag that controls routing for this group of paths. See https://vercel.com/docs/microfrontends/path-routing#routing-changes-safely-with-flags. + paths: + items: + type: string + type: array + description: A list of path expressions that are routed to this application. See https://vercel.com/docs/microfrontends/path-routing#supported-path-expressions. + required: + - paths + type: object + description: Groups of path expressions that are routed to this application. See https://vercel.com/docs/microfrontends/path-routing. + type: array + description: Groups of path expressions that are routed to this application. See https://vercel.com/docs/microfrontends/path-routing. + assetPrefix: + type: string + description: The name of the asset prefix to use instead of the auto-generated name. The asset prefix is used to prefix all paths to static assets, such as JS, CSS, or images that are served by a specific application. It is necessary to ensure there are no conflicts with other applications on the same domain. An auto-generated asset prefix of the form `vc-ap-` is used when this field is not provided. When this field is provided, `/${assetPrefix}/:path*` must also be added to the list of paths in the `routing` field. Changing the asset prefix after a microfrontend application has already been deployed is not a forwards and backwards compatible change, and the asset prefix should be added to the `routing` field and deployed before setting the `assetPrefix` field. The default value is the auto-generated asset prefix of the form `vc-ap-`. See https://vercel.com/docs/microfrontends/path-routing#asset-prefix. + packageName: + type: string + description: The name used to run the application, e.g. the `name` field in the `package.json`. This is used by the local proxy to map the application config to the locally running app. This is only necessary when the application name does not match the `name` used in `package.json`. See https://vercel.com/docs/microfrontends/configuration#application-naming. + projectId: + type: string + required: + - projectId + - routing + type: object + type: object + options: + properties: + disableOverrides: + type: boolean + enum: + - false + - true + description: If you want to disable the overrides for the site. For example, if you are managing rewrites between applications externally, you may wish to disable the overrides on the toolbar as they will have no effect. See https://vercel.com/docs/microfrontends/managing-microfrontends/vercel-toolbar#routing-overrides. + localProxyPort: + type: number + description: The port number used by the local proxy server. The default value is 3024. See https://vercel.com/docs/microfrontends/local-development. + type: object + description: Optional configuration options for the microfrontend. + required: + - applications + type: object + description: projectIds are added when the config is uploaded to s3 deployment assets. + required: + - config + type: object + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + '500': + description: '' + parameters: + - name: deployment_id + description: The unique deployment identifier + in: path + required: true + schema: + description: The unique deployment identifier + type: string + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + /v1/microfrontends/projects/{project_id_or_name}/production-mfe-config: + get: + description: Get the microfrontends config for a project by ID or name. + operationId: getMicrofrontendsConfigForProject + security: + - bearerToken: [] + summary: Get microfrontends config for a project + tags: + - microfrontends + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + config: + nullable: true + properties: + $schema: + type: string + description: See https://openapi.vercel.sh/microfrontends.json. + version: + type: string + enum: + - '1' + description: The version of the microfrontends config schema. + applications: + additionalProperties: + oneOf: + - properties: + development: + properties: + fallback: + type: string + description: 'Fallback for local development, could point to any environment. This is required for the default app. This value is used as the fallback for child apps as well if they do not have a fallback. If passing a string, include the protocol (optional), host (required) and port (optional). For example: `https://this.ismyhost:8080`. If omitted, the protocol defaults to HTTPS. If omitted, the port defaults to `80` for HTTP and `443` for HTTPS. See https://vercel.com/docs/microfrontends/local-development.' + local: + oneOf: + - type: string + - type: number + task: + type: string + description: The task to run when starting the development server. Should reference a script in the package.json of the application. The default value is "dev". See https://vercel.com/docs/microfrontends/local-development. + required: + - fallback + type: object + description: Development configuration for the default application. + packageName: + type: string + description: The name used to run the application, e.g. the `name` field in the `package.json`. This is used by the local proxy to map the application config to the locally running app. This is only necessary when the application name does not match the `name` used in `package.json`. See https://vercel.com/docs/microfrontends/configuration#application-naming. + projectId: + type: string + required: + - development + - projectId + type: object + - properties: + development: + properties: + fallback: + type: string + description: 'Fallback for local development, could point to any environment. If not provided for child apps, the fallback of the default app will be used. If passing a string, include the protocol (optional), host (required) and port (optional). For example: `https://this.ismyhost:8080`. If omitted, the protocol defaults to HTTPS. If omitted, the port defaults to `80` for HTTP and `443` for HTTPS. See https://vercel.com/docs/microfrontends/local-development.' + local: + oneOf: + - type: string + - type: number + task: + type: string + description: The task to run when starting the development server. Should reference a script in the package.json of the application. The default value is "dev". See https://vercel.com/docs/microfrontends/local-development. + type: object + description: Development configuration for the child application. + routing: + items: + properties: + group: + type: string + description: Group name for the paths. + flag: + type: string + description: The name of the feature flag that controls routing for this group of paths. See https://vercel.com/docs/microfrontends/path-routing#routing-changes-safely-with-flags. + paths: + items: + type: string + type: array + description: A list of path expressions that are routed to this application. See https://vercel.com/docs/microfrontends/path-routing#supported-path-expressions. + required: + - paths + type: object + description: Groups of path expressions that are routed to this application. See https://vercel.com/docs/microfrontends/path-routing. + type: array + description: Groups of path expressions that are routed to this application. See https://vercel.com/docs/microfrontends/path-routing. + assetPrefix: + type: string + description: The name of the asset prefix to use instead of the auto-generated name. The asset prefix is used to prefix all paths to static assets, such as JS, CSS, or images that are served by a specific application. It is necessary to ensure there are no conflicts with other applications on the same domain. An auto-generated asset prefix of the form `vc-ap-` is used when this field is not provided. When this field is provided, `/${assetPrefix}/:path*` must also be added to the list of paths in the `routing` field. Changing the asset prefix after a microfrontend application has already been deployed is not a forwards and backwards compatible change, and the asset prefix should be added to the `routing` field and deployed before setting the `assetPrefix` field. The default value is the auto-generated asset prefix of the form `vc-ap-`. See https://vercel.com/docs/microfrontends/path-routing#asset-prefix. + packageName: + type: string + description: The name used to run the application, e.g. the `name` field in the `package.json`. This is used by the local proxy to map the application config to the locally running app. This is only necessary when the application name does not match the `name` used in `package.json`. See https://vercel.com/docs/microfrontends/configuration#application-naming. + projectId: + type: string + required: + - projectId + - routing + type: object + type: object + options: + properties: + disableOverrides: + type: boolean + enum: + - false + - true + description: If you want to disable the overrides for the site. For example, if you are managing rewrites between applications externally, you may wish to disable the overrides on the toolbar as they will have no effect. See https://vercel.com/docs/microfrontends/managing-microfrontends/vercel-toolbar#routing-overrides. + localProxyPort: + type: number + description: The port number used by the local proxy server. The default value is 3024. See https://vercel.com/docs/microfrontends/local-development. + type: object + description: Optional configuration options for the microfrontend. + required: + - applications + type: object + description: projectIds are added when the config is uploaded to s3 deployment assets. + required: + - config + type: object + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + '500': + description: '' + parameters: + - name: project_id_or_name + description: The name or ID of the project + in: path + required: true + schema: + description: The name or ID of the project + type: string + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + /v1/microfrontends/group: + post: + description: Creates a microfrontends group and attaches multiple projects in a single request. + operationId: createMicrofrontendsGroupWithApplications + security: + - bearerToken: [] + summary: Create a microfrontends group with applications + tags: + - microfrontends + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + newMicrofrontendsGroup: + properties: + id: + type: string + slug: + type: string + name: + type: string + fallbackEnvironment: + type: string + enablePolyrepoBranchRouting: + type: boolean + enum: + - false + - true + createdAt: + type: number + updatedAt: + type: number + required: + - createdAt + - enablePolyrepoBranchRouting + - fallbackEnvironment + - id + - name + - slug + - updatedAt + type: object + required: + - newMicrofrontendsGroup + type: object + '400': + description: One of the provided values in the request body is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '410': + description: '' + '500': + description: '' + parameters: + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + requestBody: + content: + application/json: + schema: + type: object + required: + - groupName + - defaultApp + - otherApplications + properties: + groupName: + type: string + example: MFE Group 1 + description: The name of the microfrontends group that will be used to identify the group + defaultApp: + type: object + required: + - projectId + description: The default app for the new microfrontend group + properties: + projectId: + type: string + description: The id of the project that will be used as the default app for the new microfrontend group + defaultRoute: + type: string + description: The default route for the default app of the new microfrontend group + otherApplications: + type: array + description: The list of other applications that will be used in the new microfrontend group + items: + type: object + required: + - projectId + properties: + projectId: + type: string + description: The id of the project that will be used in the new microfrontend group + defaultRoute: + type: string + description: The default route for the application in the new microfrontend group +components: + schemas: + ACLAction: + type: string + enum: + - create + - delete + - list + - read + - update + description: Enum containing the actions that can be performed against a resource. Group operations are included. + x-stackQL-resources: + groups: + id: vercel.microfrontends.groups + name: groups + title: Groups + methods: + list: + operation: + $ref: '#/paths/~1v1~1microfrontends~1groups/get' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + create: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v1~1microfrontends~1group/post' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/groups/methods/list' + insert: + - $ref: '#/components/x-stackQL-resources/groups/methods/create' + update: [] + delete: [] + replace: [] + group_projects: + id: vercel.microfrontends.group_projects + name: group_projects + title: Group Projects + methods: + list: + operation: + $ref: '#/paths/~1v1~1microfrontends~1groups~1{group_id}~1projects/get' + response: + mediaType: application/json + openAPIDocKey: '200' + objectKey: $.projects + request: + nativeCasing: camel + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/group_projects/methods/list' + insert: [] + update: [] + delete: [] + replace: [] + deployment_config: + id: vercel.microfrontends.deployment_config + name: deployment_config + title: Deployment Config + methods: + get: + operation: + $ref: '#/paths/~1v1~1microfrontends~1{deployment_id}~1config/get' + response: + mediaType: application/json + openAPIDocKey: '200' + objectKey: $.config + request: + nativeCasing: camel + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/deployment_config/methods/get' + insert: [] + update: [] + delete: [] + replace: [] + project_config: + id: vercel.microfrontends.project_config + name: project_config + title: Project Config + methods: + get: + operation: + $ref: '#/paths/~1v1~1microfrontends~1projects~1{project_id_or_name}~1production-mfe-config/get' + response: + mediaType: application/json + openAPIDocKey: '200' + objectKey: $.config + request: + nativeCasing: camel + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/project_config/methods/get' + insert: [] + update: [] + delete: [] + replace: [] +servers: + - url: https://api.vercel.com diff --git a/provider-dev/openapi/src/vercel/v00.00.00000/services/networking.yaml b/provider-dev/openapi/src/vercel/v00.00.00000/services/networking.yaml new file mode 100644 index 0000000..bcdfe6b --- /dev/null +++ b/provider-dev/openapi/src/vercel/v00.00.00000/services/networking.yaml @@ -0,0 +1,1083 @@ +openapi: 3.0.3 +info: + title: networking API + description: vercel networking API + version: 0.0.1 +paths: + /v1/connect/networks: + get: + description: Allows to list Secure Compute networks. + operationId: listNetworks + security: + - bearerToken: [] + summary: List Secure Compute networks + tags: + - networking + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ListNetworksResponse' + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '410': + description: '' + parameters: + - name: includeHostedZones + description: Whether to include Hosted Zones in the response + in: query + schema: + type: boolean + description: Whether to include Hosted Zones in the response + default: true + - name: includePeeringConnections + description: Whether to include VPC Peering connections in the response + in: query + schema: + type: boolean + description: Whether to include VPC Peering connections in the response + default: true + - name: includeProjects + description: Whether to include projects in the response + in: query + schema: + type: boolean + description: Whether to include projects in the response + default: true + - name: search + description: The query to use as a filter for returned networks + in: query + schema: + type: string + description: The query to use as a filter for returned networks + maxLength: 255 + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + post: + description: Allows to create a Secure Compute network. + operationId: createNetwork + security: + - bearerToken: [] + summary: Create a Secure Compute network + tags: + - networking + responses: + '201': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/Network' + '400': + description: One of the provided values in the request body is invalid. + '401': + description: The request is not authorized. + '402': + description: The account is missing a payment so payment method must be updated + '403': + description: You do not have permission to access this resource. + '409': + description: '' + '410': + description: '' + parameters: + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + requestBody: + content: + application/json: + schema: + type: object + additionalProperties: false + properties: + awsAvailabilityZoneIds: + type: array + items: + type: string + description: An AWS Availability Zone ID to use for the network + example: use1-az1 + minItems: 2 + maxItems: 2 + cidr: + type: string + description: The CIDR block of the network + example: 192.168.0.0/16 + name: + type: string + description: The name of the network + maxLength: 255 + region: + type: string + description: The region where the network will be created + example: iad1 + required: + - cidr + - name + - region + /v1/connect/networks/{network_id}: + delete: + description: Allows to delete a Secure Compute network. + operationId: deleteNetwork + security: + - bearerToken: [] + summary: Delete a Secure Compute network + tags: + - networking + responses: + '204': + description: '' + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '402': + description: '' + '403': + description: You do not have permission to access this resource. + '409': + description: '' + '410': + description: '' + parameters: + - name: network_id + description: The ID of the network to delete + in: path + required: true + schema: + type: string + description: The ID of the network to delete + example: uzrmorq7bn05z-fz + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + patch: + description: Allows to update a Secure Compute network. + operationId: updateNetwork + security: + - bearerToken: [] + summary: Update a Secure Compute network + tags: + - networking + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/Network' + '400': + description: |- + One of the provided values in the request body is invalid. + One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '410': + description: '' + parameters: + - name: network_id + description: The unique identifier of the Secure Compute network + in: path + required: true + schema: + type: string + description: The unique identifier of the Secure Compute network + example: uzrmorq7bn05z-fz + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + requestBody: + content: + application/json: + schema: + type: object + additionalProperties: false + properties: + name: + type: string + description: The name of the Secure Compute network + maxLength: 255 + required: + - name + get: + description: Allows to read a Secure Compute network. + operationId: readNetwork + security: + - bearerToken: [] + summary: Read a Secure Compute network + tags: + - networking + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/Network' + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '410': + description: '' + parameters: + - name: network_id + description: The unique identifier of the Secure Compute network + in: path + required: true + schema: + type: string + description: The unique identifier of the Secure Compute network + example: uzrmorq7bn05z-fz + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + /v1/networking/privatelink/endpoints: + post: + description: Creates a PrivateLink endpoint for a project. + operationId: createPrivateLinkEndpoint + security: + - bearerToken: [] + summary: Create a PrivateLink endpoint + tags: + - networking + responses: + '201': + description: The PrivateLink endpoint was created and is being provisioned. + content: + application/json: + schema: + $ref: '#/components/schemas/PrivateLinkEndpoint' + '400': + description: One of the provided values in the request body is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '409': + description: '' + '410': + description: '' + parameters: + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + requestBody: + content: + application/json: + schema: + type: object + additionalProperties: false + properties: + projectId: + type: string + description: The project ID to create the PrivateLink endpoint for. + example: prj_a1b2c3d4e5f6g7h8 + name: + type: string + description: The name of the PrivateLink endpoint, used as its label in the Vercel dashboard. + example: payments-db + maxLength: 255 + vercelRegion: + type: string + description: The Vercel region to provision the endpoint in. Advanced Networking must be enabled for the project in that region. The endpoint service itself may live in another AWS region. + example: iad1 + awsServiceName: + type: string + description: The name of the AWS VPC endpoint service to connect to. Its AWS region is read from the name; when that region differs from the one behind `vercelRegion`, the service must allow cross-region access. + example: com.amazonaws.vpce.us-east-1.vpce-svc-0123456789abcdef0 + enablePrivateDns: + type: boolean + description: Whether to resolve the endpoint service through its private DNS names, which are then returned in `privateDnsNames`. Defaults to `false`, in which case the endpoint is reachable through the DNS names in `awsDnsEntries`. + example: false + required: + - projectId + - name + - vercelRegion + - awsServiceName + get: + description: Lists all PrivateLink endpoints for a project. + operationId: listPrivateLinkEndpoints + security: + - bearerToken: [] + summary: List PrivateLink endpoints + tags: + - networking + responses: + '200': + description: The PrivateLink endpoints of the project. + content: + application/json: + schema: + $ref: '#/components/schemas/ListPrivateLinkEndpointsResponse' + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + parameters: + - name: projectId + description: The project ID to list PrivateLink endpoints for. + in: query + required: true + schema: + type: string + description: The project ID to list PrivateLink endpoints for. + example: prj_a1b2c3d4e5f6g7h8 + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + /v1/networking/privatelink/endpoints/{endpoint_id}: + get: + description: Reads a single PrivateLink endpoint. + operationId: readPrivateLinkEndpoint + security: + - bearerToken: [] + summary: Read a PrivateLink endpoint + tags: + - networking + responses: + '200': + description: The requested PrivateLink endpoint. + content: + application/json: + schema: + $ref: '#/components/schemas/PrivateLinkEndpoint' + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + parameters: + - name: projectId + description: The project ID the PrivateLink endpoint belongs to. + in: query + required: true + schema: + type: string + description: The project ID the PrivateLink endpoint belongs to. + example: prj_a1b2c3d4e5f6g7h8 + - name: endpoint_id + description: The unique identifier of the PrivateLink endpoint. + in: path + required: true + schema: + type: string + description: The unique identifier of the PrivateLink endpoint. + example: ple_a1b2c3d4e5f6g7h8 + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + delete: + description: Deletes a PrivateLink endpoint. + operationId: deletePrivateLinkEndpoint + security: + - bearerToken: [] + summary: Delete a PrivateLink endpoint + tags: + - networking + responses: + '204': + description: The PrivateLink endpoint was deleted. + content: + application/json: + schema: + nullable: true + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '409': + description: '' + '410': + description: '' + parameters: + - name: projectId + description: The project ID the PrivateLink endpoint belongs to. + in: query + required: true + schema: + type: string + description: The project ID the PrivateLink endpoint belongs to. + example: prj_a1b2c3d4e5f6g7h8 + - name: endpoint_id + description: The unique identifier of the PrivateLink endpoint. + in: path + required: true + schema: + type: string + description: The unique identifier of the PrivateLink endpoint. + example: ple_a1b2c3d4e5f6g7h8 + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + patch: + description: Updates a PrivateLink endpoint (name, privateDns). + operationId: updatePrivateLinkEndpoint + security: + - bearerToken: [] + summary: Update a PrivateLink endpoint + tags: + - networking + responses: + '200': + description: The updated PrivateLink endpoint. + content: + application/json: + schema: + $ref: '#/components/schemas/PrivateLinkEndpoint' + '400': + description: |- + One of the provided values in the request body is invalid. + One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '409': + description: '' + '410': + description: '' + parameters: + - name: projectId + description: The project ID the PrivateLink endpoint belongs to. + in: query + required: true + schema: + type: string + description: The project ID the PrivateLink endpoint belongs to. + example: prj_a1b2c3d4e5f6g7h8 + - name: endpoint_id + description: The unique identifier of the PrivateLink endpoint. + in: path + required: true + schema: + type: string + description: The unique identifier of the PrivateLink endpoint. + example: ple_a1b2c3d4e5f6g7h8 + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + requestBody: + content: + application/json: + schema: + type: object + additionalProperties: false + properties: + name: + type: string + description: A new name for the PrivateLink endpoint. When omitted, the current name is kept. + example: payments-db + maxLength: 255 + enablePrivateDns: + type: boolean + description: When `true`, resolves the endpoint service through its private DNS names, which are then returned in `privateDnsNames`. When `false`, clears them. When omitted, the current setting is kept. At least one of `name` or `enablePrivateDns` must be provided. + example: false + /v1/projects/{id_or_name}/shared-connect-links: + patch: + description: Allows configuring Static IPs for a project + operationId: updateStaticIps + security: + - bearerToken: [] + summary: Configures Static IPs for a project + tags: + - networking + - static-ips + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/UpdateStaticIpsResponse' + '400': + description: |- + One of the provided values in the request body is invalid. + One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '402': + description: '' + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '409': + description: '' + '410': + description: '' + '500': + description: '' + parameters: + - name: id_or_name + description: The unique project identifier or the project name + in: path + required: true + schema: + description: The unique project identifier or the project name + type: string + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + requestBody: + content: + application/json: + schema: + type: object + properties: + builds: + type: boolean + description: Whether to use Static IPs for builds. + regions: + type: array + items: + type: string + maxLength: 4 + description: The region in which to enable Static IPs. + example: iad1 + minItems: 0 + maxItems: 3 + uniqueItems: true + required: + - builds + - regions +components: + schemas: + Network: + properties: + awsAccountId: + type: string + description: The ID of the AWS Account in which the network exists. + awsAvailabilityZoneIds: + items: + type: string + type: array + description: The IDs of the AWS Availability Zones in which the network exists, if specified during creation. + awsRegion: + type: string + description: The AWS Region in which the network exists. + cidr: + type: string + description: The CIDR range of the Network. + createdAt: + type: number + description: The date at which the Network was created, represented as a UNIX timestamp since EPOCH. + egressIpAddresses: + items: + type: string + type: array + hostedZones: + properties: + count: + type: number + description: The number of AWS Route53 Hosted Zones associated with the Network. + required: + - count + type: object + description: Metadata about any AWS Route53 Hosted Zones associated with the Network. + id: + type: string + description: The unique identifier of the Network. + name: + type: string + description: The name of the network. + peeringConnections: + properties: + count: + type: number + description: The number of AWS Route53 Hosted Zones associated with the Network. + required: + - count + type: object + description: Metadata about any AWS Route53 Hosted Zones associated with the Network. + projects: + properties: + count: + type: number + ids: + items: + type: string + type: array + required: + - count + - ids + type: object + description: Metadata about any projects associated with the Network. + region: + type: string + description: The Vercel region in which the Network exists. + status: + type: string + enum: + - create_in_progress + - delete_in_progress + - error + - ready + description: The status of the Network. + teamId: + type: string + description: The unique identifier of the Team that owns the Network. + vpcId: + type: string + description: The ID of the VPC which hosts the network. + required: + - awsAccountId + - awsRegion + - cidr + - createdAt + - id + - name + - status + - teamId + type: object + PrivateLinkEndpoint: + properties: + endpointId: + type: string + description: The unique identifier of the PrivateLink endpoint. + example: ple_a1b2c3d4e5f6g7h8 + name: + type: string + description: The name of the PrivateLink endpoint, shown in the Vercel dashboard. + example: payments-db + teamId: + type: string + description: The identifier of the team that owns the PrivateLink endpoint. + example: team_a1b2c3d4e5f6g7h8 + projectId: + type: string + description: The identifier of the project the PrivateLink endpoint belongs to. + example: prj_a1b2c3d4e5f6g7h8 + vercelRegion: + type: string + description: The Vercel region the endpoint is provisioned in. + example: iad1 + awsServiceName: + type: string + description: The AWS VPC endpoint service the endpoint connects to. + example: com.amazonaws.vpce.us-east-1.vpce-svc-0123456789abcdef0 + vpcEndpointId: + type: string + description: The identifier of the underlying AWS VPC endpoint. Absent until AWS has created the endpoint. + example: vpce-0123456789abcdef0 + awsDnsEntries: + items: + type: string + type: array + description: The regional DNS names assigned to the endpoint by AWS. Use these to reach the service when private DNS is not enabled. + example: + - vpce-0123456789abcdef0-a1b2c3d4.vpce-svc-0123456789abcdef0.us-east-1.vpce.amazonaws.com + privateDnsNames: + items: + type: string + type: array + description: The private DNS names of the endpoint service, populated when private DNS is enabled for the endpoint. + example: + - payments.internal.example.com + status: + type: string + enum: + - available + - creating + - deleting + - failed + - pending-acceptance + - provisioning + - rejected + description: 'The current state of the endpoint. - `creating`: the endpoint is being created. - `pending-acceptance`: waiting for the endpoint service owner to accept the connection. Only occurs for services that require manual acceptance. - `provisioning`: the connection was accepted and AWS is finishing setup. - `available`: the endpoint is fully provisioned and ready to use. - `rejected`: the endpoint service owner rejected the connection. - `failed`: the endpoint could not be provisioned. - `deleting`: the endpoint is being deleted.' + example: available + statusMessage: + type: string + description: A human-readable explanation of why the endpoint could not be provisioned. Only set when `status` is `failed`, and absent for every other status including `rejected`, since AWS does not report a rejection reason. + example: Endpoint did not become available in time. Try deleting and recreating, or visit https://vercel.com/help if the issue persists. + createdAt: + type: number + description: Timestamp in milliseconds since the UNIX epoch for when the endpoint was created. + example: 1610963878358 + updatedAt: + type: number + description: Timestamp in milliseconds since the UNIX epoch for when the endpoint was last updated. + example: 1610963878358 + required: + - awsServiceName + - createdAt + - endpointId + - name + - projectId + - status + - teamId + - updatedAt + - vercelRegion + type: object + description: A PrivateLink endpoint, which connects a project to an AWS VPC endpoint service in a single region so that traffic reaches the service over AWS PrivateLink rather than the public internet. + ListNetworksResponse: + type: object + properties: + networks: + type: array + items: + $ref: '#/components/schemas/Network' + ListPrivateLinkEndpointsResponse: + type: object + properties: + private_link_endpoints: + type: array + items: + $ref: '#/components/schemas/PrivateLinkEndpoint' + UpdateStaticIpsResponse: + type: object + properties: + update_static_ips: + type: array + items: + properties: + envId: + oneOf: + - type: string + - type: string + enum: + - preview + - production + connectConfigurationId: + type: string + dc: + type: string + passive: + type: boolean + enum: + - false + - true + buildsEnabled: + type: boolean + enum: + - false + - true + aws: + properties: + subnetIds: + items: + type: string + type: array + securityGroupId: + type: string + required: + - subnetIds + type: object + createdAt: + type: number + updatedAt: + type: number + required: + - buildsEnabled + - connectConfigurationId + - createdAt + - envId + - passive + - updatedAt + type: object + x-stackQL-resources: + networks: + id: vercel.networking.networks + name: networks + title: Networks + methods: + list: + operation: + $ref: '#/paths/~1v1~1connect~1networks/get' + response: + mediaType: application/json + openAPIDocKey: '200' + objectKey: $.networks + overrideMediaType: application/json + schema_override: + $ref: '#/components/schemas/ListNetworksResponse' + transform: + body: |- + {{- $wrapped := printf "{\"networks\":%s}" . -}} + {{- $wrapped -}} + type: golang_template_text_v0.3.0 + request: + nativeCasing: camel + create: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v1~1connect~1networks/post' + response: + mediaType: application/json + openAPIDocKey: '201' + request: + nativeCasing: camel + delete: + operation: + $ref: '#/paths/~1v1~1connect~1networks~1{network_id}/delete' + response: + mediaType: application/json + openAPIDocKey: '204' + request: + nativeCasing: camel + update: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v1~1connect~1networks~1{network_id}/patch' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + get: + operation: + $ref: '#/paths/~1v1~1connect~1networks~1{network_id}/get' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/networks/methods/get' + - $ref: '#/components/x-stackQL-resources/networks/methods/list' + insert: + - $ref: '#/components/x-stackQL-resources/networks/methods/create' + update: + - $ref: '#/components/x-stackQL-resources/networks/methods/update' + delete: + - $ref: '#/components/x-stackQL-resources/networks/methods/delete' + replace: [] + privatelink_endpoints: + id: vercel.networking.privatelink_endpoints + name: privatelink_endpoints + title: Privatelink Endpoints + methods: + create: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v1~1networking~1privatelink~1endpoints/post' + response: + mediaType: application/json + openAPIDocKey: '201' + request: + nativeCasing: camel + list: + operation: + $ref: '#/paths/~1v1~1networking~1privatelink~1endpoints/get' + response: + mediaType: application/json + openAPIDocKey: '200' + objectKey: $.private_link_endpoints + overrideMediaType: application/json + schema_override: + $ref: '#/components/schemas/ListPrivateLinkEndpointsResponse' + transform: + body: |- + {{- $wrapped := printf "{\"private_link_endpoints\":%s}" . -}} + {{- $wrapped -}} + type: golang_template_text_v0.3.0 + request: + nativeCasing: camel + get: + operation: + $ref: '#/paths/~1v1~1networking~1privatelink~1endpoints~1{endpoint_id}/get' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + delete: + operation: + $ref: '#/paths/~1v1~1networking~1privatelink~1endpoints~1{endpoint_id}/delete' + response: + mediaType: application/json + openAPIDocKey: '204' + request: + nativeCasing: camel + update: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v1~1networking~1privatelink~1endpoints~1{endpoint_id}/patch' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/privatelink_endpoints/methods/get' + - $ref: '#/components/x-stackQL-resources/privatelink_endpoints/methods/list' + insert: + - $ref: '#/components/x-stackQL-resources/privatelink_endpoints/methods/create' + update: + - $ref: '#/components/x-stackQL-resources/privatelink_endpoints/methods/update' + delete: + - $ref: '#/components/x-stackQL-resources/privatelink_endpoints/methods/delete' + replace: [] + static_ips: + id: vercel.networking.static_ips + name: static_ips + title: Static Ips + methods: + update: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v1~1projects~1{id_or_name}~1shared-connect-links/patch' + response: + mediaType: application/json + openAPIDocKey: '200' + objectKey: $.update_static_ips + overrideMediaType: application/json + schema_override: + $ref: '#/components/schemas/UpdateStaticIpsResponse' + transform: + body: |- + {{- $wrapped := printf "{\"update_static_ips\":%s}" . -}} + {{- $wrapped -}} + type: golang_template_text_v0.3.0 + request: + nativeCasing: camel + sqlVerbs: + select: [] + insert: [] + update: + - $ref: '#/components/x-stackQL-resources/static_ips/methods/update' + delete: [] + replace: [] +servers: + - url: https://api.vercel.com diff --git a/provider-dev/openapi/src/vercel/v00.00.00000/services/observability.yaml b/provider-dev/openapi/src/vercel/v00.00.00000/services/observability.yaml new file mode 100644 index 0000000..5e95302 --- /dev/null +++ b/provider-dev/openapi/src/vercel/v00.00.00000/services/observability.yaml @@ -0,0 +1,420 @@ +openapi: 3.0.3 +info: + title: observability API + description: vercel observability API + version: 0.0.1 +paths: + /v1/observability/manage/configuration/projects: + get: + description: Lists the projects that are currently configured as disabled for Observability Plus on a team. + operationId: getObservabilityConfigurationProjects + security: + - bearerToken: [] + summary: Lists disabled Observability Plus projects + tags: + - observability + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + disabledProjects: + items: + properties: + id: + type: string + name: + type: string + disabledAt: + type: number + required: + - disabledAt + - id + type: object + type: array + required: + - disabledProjects + type: object + '400': + description: '' + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + parameters: + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + /v1/observability/manage/configuration/projects/{project_id_or_name}: + put: + description: Updates whether Observability Plus is disabled for a single project. + operationId: updateObservabilityConfigurationProject + security: + - bearerToken: [] + summary: Updates a disabled Observability Plus project setting + tags: + - observability + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + id: + type: string + disabledAt: + type: number + required: + - id + type: object + '400': + description: |- + One of the provided values in the request body is invalid. + One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + '429': + description: '' + parameters: + - name: project_id_or_name + description: The ID or name of the project to update + in: path + required: true + schema: + type: string + description: The ID or name of the project to update + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + requestBody: + content: + application/json: + schema: + type: object + additionalProperties: false + required: + - disabled + properties: + disabled: + type: boolean + description: Whether Observability Plus should be disabled for the project + /v2/observability/query: + post: + description: '' + operationId: createObservabilityQuery + security: [] + tags: [] + responses: + '200': + description: '' + content: + application/json: + schema: + type: string + description: (opaque JSON object) + '400': + description: One of the provided values in the request body is invalid. + '401': + description: The request is not authorized. + '402': + description: '' + '403': + description: You do not have permission to access this resource. + '408': + description: '' + '410': + description: '' + '413': + description: '' + '422': + description: '' + '500': + description: '' + '503': + description: '' + parameters: [] + requestBody: + content: + application/json: + schema: + type: object + required: + - metric + - scope + properties: + metric: + type: string + description: Metric id + scope: + type: string + description: Owner or project scope for the query (opaque JSON object) + aggregation: + type: string + description: 'Aggregation function to apply. Some aggregations require a dimension: use /, for example unique/visitor_id.' + groupBy: + type: array + items: + type: string + description: Dimensions to group results by. JSON dimensions support nested refs, for example event_data/checkout_step. Nested keys containing characters that OData cannot parse as an identifier, such as '-', spaces, quotes, or '/', must be wrapped in single quotes (escape embedded single quotes by doubling them), for example flags/'enable-comments-view' or event_data/'some property''s/value'. + filter: + type: string + description: Filter to apply to the query. JSON dimensions support nested refs, for example event_data/checkout_step eq 'payment'. Nested keys containing characters that OData cannot parse as an identifier, such as '-', spaces, quotes, or '/', must be wrapped in single quotes (escape embedded single quotes by doubling them), for example flags/'enable-comments-view' eq true or event_data/'some property''s/value' eq true. + limit: + type: number + description: Maximum number of results + orderBy: + type: string + description: Rollup column to order grouped results by. Use the generated rollup key for the requested metric and aggregation. Defaults to the query engine count rollup. + orderDirection: + type: string + enum: + - asc + - desc + description: Direction to order grouped results by. Defaults to desc. + granularity: + type: string + description: Time bucket size (opaque JSON object) + startTime: + type: string + description: Start timestamp + endTime: + type: string + description: End timestamp + bucketTimezone: + type: string + description: IANA timezone (e.g. Europe/Paris) used only to align calendar buckets (1d/1mo) to that zone's day/month boundaries. startTime/endTime and all output timestamps are always UTC. No effect on sub-day granularities. + additionalProperties: true + /v2/observability/schema: + get: + description: '' + operationId: getObservabilitySchema + security: [] + tags: [] + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + metrics: + items: + properties: + id: + type: string + description: + type: string + required: + - description + - id + type: object + type: array + required: + - metrics + type: object + '400': + description: '' + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '410': + description: '' + parameters: [] + /v2/observability/schema/{metric_id}: + get: + description: '' + operationId: getObservabilitySchemaByMetricId + security: [] + tags: [] + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/GetObservabilitySchemaByMetricIdResponse' + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '410': + description: '' + parameters: + - name: metric_id + in: path + required: true + schema: + type: string +components: + schemas: + GetObservabilitySchemaByMetricIdResponse: + type: object + properties: + observability_schema_by_metric_id: + type: array + items: + properties: + id: + type: string + description: + type: string + dimensions: + items: + properties: + name: + type: string + label: + type: string + description: + type: string + required: + - label + - name + type: object + type: array + unit: + type: string + aggregations: + items: + type: string + type: array + defaultAggregation: + type: string + required: + - aggregations + - defaultAggregation + - description + - dimensions + - id + - unit + type: object + x-stackQL-resources: + configuration_projects: + id: vercel.observability.configuration_projects + name: configuration_projects + title: Configuration Projects + methods: + list: + operation: + $ref: '#/paths/~1v1~1observability~1manage~1configuration~1projects/get' + response: + mediaType: application/json + openAPIDocKey: '200' + objectKey: $.disabledProjects + request: + nativeCasing: camel + update: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v1~1observability~1manage~1configuration~1projects~1{project_id_or_name}/put' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/configuration_projects/methods/list' + insert: [] + update: + - $ref: '#/components/x-stackQL-resources/configuration_projects/methods/update' + delete: [] + replace: [] + queries: + id: vercel.observability.queries + name: queries + title: Queries + methods: + run: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v2~1observability~1query/post' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + sqlVerbs: + select: [] + insert: [] + update: [] + delete: [] + replace: [] + schema: + id: vercel.observability.schema + name: schema + title: Schema + methods: + list: + operation: + $ref: '#/paths/~1v2~1observability~1schema/get' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + get: + operation: + $ref: '#/paths/~1v2~1observability~1schema~1{metric_id}/get' + response: + mediaType: application/json + openAPIDocKey: '200' + objectKey: $.observability_schema_by_metric_id + overrideMediaType: application/json + schema_override: + $ref: '#/components/schemas/GetObservabilitySchemaByMetricIdResponse' + transform: + body: |- + {{- $wrapped := printf "{\"observability_schema_by_metric_id\":%s}" . -}} + {{- $wrapped -}} + type: golang_template_text_v0.3.0 + request: + nativeCasing: camel + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/schema/methods/get' + - $ref: '#/components/x-stackQL-resources/schema/methods/list' + insert: [] + update: [] + delete: [] + replace: [] +servers: + - url: https://api.vercel.com diff --git a/provider-dev/openapi/src/vercel/v00.00.00000/services/project_members.yaml b/provider-dev/openapi/src/vercel/v00.00.00000/services/project_members.yaml index dcf88a2..43fe6f7 100644 --- a/provider-dev/openapi/src/vercel/v00.00.00000/services/project_members.yaml +++ b/provider-dev/openapi/src/vercel/v00.00.00000/services/project_members.yaml @@ -1,70 +1,10 @@ openapi: 3.0.3 -servers: - - url: 'https://api.vercel.com' - description: Production API info: - contact: - email: support@vercel.com - name: Vercel Support - url: 'https://vercel.com/support' + title: project_members API + description: vercel project_members API version: 0.0.1 - title: Vercel API - project_members - description: projectMembers -components: - schemas: {} - responses: {} - securitySchemes: - bearerToken: - type: http - description: Default authentication mechanism - scheme: bearer - oauth2: - type: oauth2 - flows: - authorizationCode: - authorizationUrl: 'https://api.vercel.com/oauth/authorize' - tokenUrl: 'https://api.vercel.com/oauth/access_token' - scopes: {} - x-stackQL-resources: - projects_members: - id: vercel.project_members.projects_members - name: projects_members - title: Projects Members - methods: - get_project_members: - operation: - $ref: '#/paths/~1v1~1projects~1{idOrName}~1members/get' - response: - mediaType: application/json - openAPIDocKey: '200' - objectKey: $.members - _get_project_members: - operation: - $ref: '#/paths/~1v1~1projects~1{idOrName}~1members/get' - response: - mediaType: application/json - openAPIDocKey: '200' - add_project_member: - operation: - $ref: '#/paths/~1v1~1projects~1{idOrName}~1members/post' - response: - mediaType: application/json - openAPIDocKey: '200' - remove_project_member: - operation: - $ref: '#/paths/~1v1~1projects~1{idOrName}~1members~1{uid}/delete' - response: - mediaType: application/json - openAPIDocKey: '200' - sqlVerbs: - select: - - $ref: '#/components/x-stackQL-resources/projects_members/methods/get_project_members' - insert: [] - update: [] - delete: - - $ref: '#/components/x-stackQL-resources/projects_members/methods/remove_project_member' paths: - '/v1/projects/{idOrName}/members': + /v1/projects/{id_or_name}/members: get: description: Lists all members of a project. operationId: getProjectMembers @@ -79,89 +19,117 @@ paths: content: application/json: schema: - oneOf: - - type: object - - properties: - members: - items: - properties: - avatar: - type: string - description: ID of the file for the Avatar of this member. - example: 123a6c5209bc3778245d011443644c8d27dc2c50 - email: - type: string - description: The email of this member. - example: jane.doe@example.com - role: - type: string - enum: - - ADMIN - - PROJECT_DEVELOPER - - PROJECT_VIEWER - description: Role of this user in the project. - example: ADMIN - uid: - type: string - description: The ID of this user. - example: zTuNVUXEAvvnNN3IaqinkyMw - username: - type: string - description: The unique username of this user. - example: jane-doe - name: - type: string - description: The name of this user. - example: Jane Doe - createdAt: - type: number - description: Timestamp in milliseconds when this member was added. - example: 1588720733602 - required: - - email - - role - - uid - - username - - createdAt - type: object - type: array - pagination: - properties: - hasNext: - type: boolean - count: - type: number - description: Amount of items in the current page. - example: 20 - next: - nullable: true - type: number - description: Timestamp that must be used to request the next page. - example: 1540095775951 - prev: - nullable: true - type: number - description: Timestamp that must be used to request the previous page. - example: 1540095775951 - required: - - hasNext - - count - - next - - prev - type: object + properties: + members: + items: + properties: + avatar: + type: string + description: ID of the file for the Avatar of this member. + example: 123a6c5209bc3778245d011443644c8d27dc2c50 + email: + type: string + description: The email of this member. + example: jane.doe@example.com + role: + type: string + enum: + - ADMIN + - PROJECT_DEVELOPER + - PROJECT_GUEST + - PROJECT_VIEWER + description: Role of this user in the project. + example: ADMIN + computedProjectRole: + type: string + enum: + - ADMIN + - PROJECT_DEVELOPER + - PROJECT_GUEST + - PROJECT_VIEWER + description: Role of this user in the project. + example: ADMIN + uid: + type: string + description: The ID of this user. + example: zTuNVUXEAvvnNN3IaqinkyMw + username: + type: string + description: The unique username of this user. + example: jane-doe + name: + type: string + description: The name of this user. + example: Jane Doe + createdAt: + type: number + description: Timestamp in milliseconds when this member was added. + example: 1588720733602 + teamRole: + type: string + enum: + - BILLING + - CONTRIBUTOR + - DEVELOPER + - MEMBER + - OWNER + - SECURITY + - VIEWER + - VIEWER_FOR_PLUS + description: The role of this user in the team. + example: CONTRIBUTOR + required: + - computedProjectRole + - createdAt + - email + - role + - teamRole + - uid + - username + type: object + type: array + pagination: + properties: + hasNext: + type: boolean + enum: + - false + - true + count: + type: number + description: Amount of items in the current page. + example: 20 + next: + nullable: true + type: number + description: Timestamp that must be used to request the next page. + example: 1540095775951 + prev: + nullable: true + type: number + description: Timestamp that must be used to request the previous page. + example: 1540095775951 required: - - members - - pagination + - count + - hasNext + - next + - prev type: object - description: Paginated list of members for the project. + required: + - members + - pagination + type: object + description: Paginated list of members for the project. '400': description: One of the provided values in the request query is invalid. '401': - description: '' + description: The request is not authorized. '403': description: You do not have permission to access this resource. + '410': + description: '' parameters: - - name: idOrName + - name: id_or_name description: The ID or name of the Project. in: path required: true @@ -196,18 +164,25 @@ paths: example: 1540095775951 type: integer - name: search - description: 'Search project members by their name, username, and email.' + description: Search project members by their name, username, and email. in: query required: false schema: - description: 'Search project members by their name, username, and email.' + description: Search project members by their name, username, and email. type: string - - description: The Team identifier or slug to perform the request on behalf of. + - description: The Team identifier to perform the request on behalf of. in: query name: teamId - required: true schema: type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + x-speakeasy-test: false post: description: Adds a new member to the project. operationId: addProjectMember @@ -234,13 +209,15 @@ paths: One of the provided values in the request body is invalid. One of the provided values in the request query is invalid. '401': - description: '' + description: The request is not authorized. '403': description: You do not have permission to access this resource. + '410': + description: '' '500': description: '' parameters: - - name: idOrName + - name: id_or_name description: The ID or name of the Project. in: path required: true @@ -248,12 +225,18 @@ paths: type: string description: The ID or name of the Project. example: prj_pavWOn1iLObbXLRiwVvzmPrTWyTf - - description: The Team identifier or slug to perform the request on behalf of. + - description: The Team identifier to perform the request on behalf of. in: query name: teamId - required: true schema: type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug requestBody: content: application/json: @@ -262,13 +245,9 @@ paths: additionalProperties: false required: - role - oneOf: - - required: - - uid - - required: - - username - - required: - - email + - uid + - username + - email properties: uid: type: string @@ -287,13 +266,14 @@ paths: description: The email of the team member that should be added to this project. role: type: string + example: ADMIN + description: The project role of the member that will be added. enum: - ADMIN - - PROJECT_DEVELOPER - PROJECT_VIEWER - example: ADMIN - description: The project role of the member that will be added. - '/v1/projects/{idOrName}/members/{uid}': + - PROJECT_DEVELOPER + required: true + /v1/projects/{id_or_name}/members/{uid}: delete: description: Remove a member from a specific project operationId: removeProjectMember @@ -317,11 +297,13 @@ paths: '400': description: One of the provided values in the request query is invalid. '401': - description: '' + description: The request is not authorized. '403': description: You do not have permission to access this resource. + '410': + description: '' parameters: - - name: idOrName + - name: id_or_name description: The ID or name of the Project. in: path required: true @@ -337,9 +319,73 @@ paths: type: string description: The user ID of the member. example: ndlgr43fadlPyCtREAqxxdyFK - - description: The Team identifier or slug to perform the request on behalf of. + - description: The Team identifier to perform the request on behalf of. in: query name: teamId - required: true schema: type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug +components: + x-stackQL-resources: + members: + id: vercel.project_members.members + name: members + title: Members + methods: + list: + operation: + $ref: '#/paths/~1v1~1projects~1{id_or_name}~1members/get' + response: + mediaType: application/json + openAPIDocKey: '200' + objectKey: $.members + request: + nativeCasing: camel + config: + pagination: + requestToken: + key: until + location: query + responseToken: + key: $.pagination.next + location: body + queryParamPushdown: + top: + paramName: limit + maxValue: 100 + add: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v1~1projects~1{id_or_name}~1members/post' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + remove: + operation: + $ref: '#/paths/~1v1~1projects~1{id_or_name}~1members~1{uid}/delete' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/members/methods/list' + insert: + - $ref: '#/components/x-stackQL-resources/members/methods/add' + update: [] + delete: + - $ref: '#/components/x-stackQL-resources/members/methods/remove' + replace: [] +servers: + - url: https://api.vercel.com diff --git a/provider-dev/openapi/src/vercel/v00.00.00000/services/project_routes.yaml b/provider-dev/openapi/src/vercel/v00.00.00000/services/project_routes.yaml new file mode 100644 index 0000000..60400fb --- /dev/null +++ b/provider-dev/openapi/src/vercel/v00.00.00000/services/project_routes.yaml @@ -0,0 +1,2656 @@ +openapi: 3.0.3 +info: + title: project_routes API + description: vercel project_routes API + version: 0.0.1 +paths: + /v1/projects/{project_id}/routes: + get: + description: Get the routing rules for a project. Supports searching by name/ID/pattern, filtering by route type, and diffing staged changes against production. + operationId: getRoutes + security: + - bearerToken: [] + summary: Get project routing rules + tags: + - project-routes + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + routes: + items: + properties: + id: + type: string + description: Unique identifier for the routing rule. + name: + type: string + description: Human-readable name for the routing rule. + description: + type: string + description: Optional description of what the routing rule does. + enabled: + type: boolean + enum: + - false + - true + description: Whether the routing rule is enabled. Defaults to true. + staged: + type: boolean + enum: + - false + - true + description: Whether this route is new and not yet published to production. Set to true only when a route is first created via add-route. Cleared (set to false) when a version is promoted to production. + route: + properties: + src: + type: string + dest: + type: string + headers: + additionalProperties: + type: string + type: object + methods: + items: + type: string + type: array + continue: + type: boolean + enum: + - false + - true + override: + type: boolean + enum: + - false + - true + caseSensitive: + type: boolean + enum: + - false + - true + check: + type: boolean + enum: + - false + - true + important: + type: boolean + enum: + - false + - true + status: + type: number + has: + items: + oneOf: + - properties: + type: + type: string + enum: + - host + value: + oneOf: + - type: string + - properties: + eq: + oneOf: + - type: string + - type: number + neq: + type: string + inc: + items: + type: string + type: array + ninc: + items: + type: string + type: array + pre: + type: string + suf: + type: string + re: + type: string + gt: + type: number + gte: + type: number + lt: + type: number + lte: + type: number + type: object + required: + - type + - value + type: object + - properties: + type: + type: string + enum: + - cookie + - header + - query + key: + type: string + value: + oneOf: + - type: string + - properties: + eq: + oneOf: + - type: string + - type: number + neq: + type: string + inc: + items: + type: string + type: array + ninc: + items: + type: string + type: array + pre: + type: string + suf: + type: string + re: + type: string + gt: + type: number + gte: + type: number + lt: + type: number + lte: + type: number + type: object + required: + - key + - type + type: object + type: array + missing: + items: + oneOf: + - properties: + type: + type: string + enum: + - host + value: + oneOf: + - type: string + - properties: + eq: + oneOf: + - type: string + - type: number + neq: + type: string + inc: + items: + type: string + type: array + ninc: + items: + type: string + type: array + pre: + type: string + suf: + type: string + re: + type: string + gt: + type: number + gte: + type: number + lt: + type: number + lte: + type: number + type: object + required: + - type + - value + type: object + - properties: + type: + type: string + enum: + - cookie + - header + - query + key: + type: string + value: + oneOf: + - type: string + - properties: + eq: + oneOf: + - type: string + - type: number + neq: + type: string + inc: + items: + type: string + type: array + ninc: + items: + type: string + type: array + pre: + type: string + suf: + type: string + re: + type: string + gt: + type: number + gte: + type: number + lt: + type: number + lte: + type: number + type: object + required: + - key + - type + type: object + type: array + mitigate: + properties: + action: + type: string + enum: + - challenge + - deny + required: + - action + type: object + transforms: + items: + oneOf: + - properties: + type: + type: string + enum: + - request.headers + - request.query + - response.headers + op: + type: string + enum: + - append + - delete + - set + target: + properties: + key: + oneOf: + - type: string + - properties: + eq: + oneOf: + - type: string + - type: number + neq: + type: string + inc: + items: + type: string + type: array + ninc: + items: + type: string + type: array + pre: + type: string + suf: + type: string + gt: + type: number + gte: + type: number + lt: + type: number + lte: + type: number + type: object + required: + - key + type: object + args: + oneOf: + - type: string + - items: + type: string + type: array + env: + items: + type: string + type: array + required: + - op + - target + - type + type: object + - properties: + type: + type: string + enum: + - request.path + op: + type: string + enum: + - set + args: + type: string + env: + items: + type: string + type: array + required: + - args + - op + - type + type: object + type: array + env: + items: + type: string + type: array + locale: + properties: + redirect: + additionalProperties: + type: string + type: object + cookie: + type: string + type: object + source: + type: string + description: Aliases for `src`, `dest`, and `status`. These provide consistency with the `rewrites`, `redirects`, and `headers` fields which use `source`, `destination`, and `statusCode`. During normalization, the string forms are converted to their canonical forms (`src`, `dest`, `status`) and stripped from the route object. `destination` may also be a service-targeted object, in which case routing is delegated into the named service's internal route table and the object is preserved as-is (not folded into `dest`). + destination: + oneOf: + - type: string + - properties: + type: + type: string + enum: + - service + description: Optional explicit format marker. The destination is identified by the presence of `service`, so `type` is no longer required. + service: + type: string + path: + type: string + description: Routing-only path used to select a route inside the target service. + required: + - service + type: object + statusCode: + type: number + middlewarePath: + type: string + description: A middleware key within the `output` key under the build result. Overrides a `middleware` definition. + middlewareRawSrc: + items: + type: string + type: array + description: The original middleware matchers. + middleware: + type: number + description: A middleware index in the `middleware` key under the build result + respectOriginCacheControl: + type: boolean + enum: + - false + - true + required: + - src + type: object + description: The route definition from @vercel/routing-utils. + rawSrc: + type: string + description: Original source pattern provided by user (path-to-regexp or regex). Used to display the user's input in API responses. + rawDest: + type: string + description: Original destination provided by user. + srcSyntax: + type: string + enum: + - equals + - path-to-regexp + - regex + description: The syntax type of the source pattern. Determines how the pattern is compiled to regex. + routeType: + type: string + enum: + - redirect + - rewrite + - set_status + - transform + description: Computed route type based on the route configuration. Only present in API responses, not stored in S3. + required: + - id + - name + - route + type: object + description: A routing rule with metadata for project-level routing. + type: array + version: + properties: + id: + type: string + description: Unique identifier for the version. + s3Key: + type: string + description: The S3 key where the routing rules are stored. + lastModified: + type: number + description: Timestamp of when this version was last modified. + createdBy: + type: string + description: The user who created this version. + isStaging: + type: boolean + enum: + - false + - true + description: Whether this version is staged and not yet promoted to production. + isLive: + type: boolean + enum: + - false + - true + description: Whether this version is currently live in production. + ruleCount: + type: number + description: The number of routing rules in this version. + alias: + type: string + description: The staging alias for previewing this version. + required: + - createdBy + - id + - lastModified + - s3Key + type: object + description: A version of routing rules stored in S3. + diffCount: + type: number + limit: + properties: + maxRoutes: + type: number + currentRoutes: + type: number + required: + - currentRoutes + - maxRoutes + type: object + required: + - diffCount + - routes + - version + - limit + type: object + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + parameters: + - name: project_id + in: path + required: true + schema: + type: string + - name: versionId + in: query + required: false + schema: + type: string + - name: q + in: query + required: false + schema: + type: string + - name: filter + in: query + required: false + schema: + type: string + enum: + - rewrite + - redirect + - set_status + - transform + - name: diff + in: query + required: false + schema: + oneOf: + - type: boolean + - type: string + enum: + - only + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + put: + description: Stage routing rules for a project. Set `overwrite` to true to replace all existing rules, or omit it to merge with existing rules by ID. Returns the new staged version. + operationId: stageRoutes + security: + - bearerToken: [] + summary: Stage routing rules + tags: + - project-routes + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + version: + properties: + id: + type: string + description: Unique identifier for the version. + s3Key: + type: string + description: The S3 key where the routing rules are stored. + lastModified: + type: number + description: Timestamp of when this version was last modified. + createdBy: + type: string + description: The user who created this version. + isStaging: + type: boolean + enum: + - false + - true + description: Whether this version is staged and not yet promoted to production. + isLive: + type: boolean + enum: + - false + - true + description: Whether this version is currently live in production. + ruleCount: + type: number + description: The number of routing rules in this version. + alias: + type: string + description: The staging alias for previewing this version. + required: + - createdBy + - id + - lastModified + - s3Key + type: object + description: A version of routing rules stored in S3. + required: + - version + type: object + '400': + description: |- + One of the provided values in the request body is invalid. + One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '409': + description: '' + '410': + description: '' + '500': + description: '' + parameters: + - name: project_id + in: path + required: true + schema: + type: string + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + requestBody: + content: + application/json: + schema: + type: object + properties: + overwrite: + type: boolean + routes: + type: array + default: [] + items: + type: object + required: + - id + - name + - route + properties: + id: + type: string + maxLength: 256 + name: + type: string + maxLength: 256 + description: + type: string + maxLength: 1024 + enabled: + type: boolean + route: + type: object + required: + - src + properties: + src: + type: string + dest: + type: string + headers: + type: string + description: (opaque JSON object) + caseSensitive: + type: boolean + status: + type: integer + has: + type: array + items: + type: object + properties: + type: + type: string + enum: + - host + - header + - cookie + - query + key: + type: string + value: + type: string + missing: + type: array + items: + type: object + properties: + type: + type: string + enum: + - host + - header + - cookie + - query + key: + type: string + value: + type: string + transforms: + type: array + items: + type: object + properties: + type: + type: string + enum: + - request.headers + - request.query + - response.headers + op: + type: string + enum: + - append + - set + - delete + target: + type: string + description: (opaque JSON object) + args: {} + env: + type: array + items: + type: string + respectOriginCacheControl: + type: boolean + post: + description: Add a single routing rule to a project at a specified position. Defaults to the end of the list if no position is provided. The route is enabled by default. Stages a new version with the added route. + operationId: addRoute + security: + - bearerToken: [] + summary: Add a routing rule + tags: + - project-routes + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + route: + properties: + routeType: + type: string + enum: + - redirect + - rewrite + - set_status + - transform + id: + type: string + description: Unique identifier for the routing rule. + name: + type: string + description: Human-readable name for the routing rule. + description: + type: string + description: Optional description of what the routing rule does. + enabled: + type: boolean + enum: + - false + - true + description: Whether the routing rule is enabled. Defaults to true. + staged: + type: boolean + enum: + - false + - true + description: Whether this route is new and not yet published to production. Set to true only when a route is first created via add-route. Cleared (set to false) when a version is promoted to production. + route: + properties: + src: + type: string + dest: + type: string + headers: + additionalProperties: + type: string + type: object + methods: + items: + type: string + type: array + continue: + type: boolean + enum: + - false + - true + override: + type: boolean + enum: + - false + - true + caseSensitive: + type: boolean + enum: + - false + - true + check: + type: boolean + enum: + - false + - true + important: + type: boolean + enum: + - false + - true + status: + type: number + has: + items: + oneOf: + - properties: + type: + type: string + enum: + - host + value: + oneOf: + - type: string + - properties: + eq: + oneOf: + - type: string + - type: number + neq: + type: string + inc: + items: + type: string + type: array + ninc: + items: + type: string + type: array + pre: + type: string + suf: + type: string + re: + type: string + gt: + type: number + gte: + type: number + lt: + type: number + lte: + type: number + type: object + required: + - type + - value + type: object + - properties: + type: + type: string + enum: + - cookie + - header + - query + key: + type: string + value: + oneOf: + - type: string + - properties: + eq: + oneOf: + - type: string + - type: number + neq: + type: string + inc: + items: + type: string + type: array + ninc: + items: + type: string + type: array + pre: + type: string + suf: + type: string + re: + type: string + gt: + type: number + gte: + type: number + lt: + type: number + lte: + type: number + type: object + required: + - key + - type + type: object + type: array + missing: + items: + oneOf: + - properties: + type: + type: string + enum: + - host + value: + oneOf: + - type: string + - properties: + eq: + oneOf: + - type: string + - type: number + neq: + type: string + inc: + items: + type: string + type: array + ninc: + items: + type: string + type: array + pre: + type: string + suf: + type: string + re: + type: string + gt: + type: number + gte: + type: number + lt: + type: number + lte: + type: number + type: object + required: + - type + - value + type: object + - properties: + type: + type: string + enum: + - cookie + - header + - query + key: + type: string + value: + oneOf: + - type: string + - properties: + eq: + oneOf: + - type: string + - type: number + neq: + type: string + inc: + items: + type: string + type: array + ninc: + items: + type: string + type: array + pre: + type: string + suf: + type: string + re: + type: string + gt: + type: number + gte: + type: number + lt: + type: number + lte: + type: number + type: object + required: + - key + - type + type: object + type: array + mitigate: + properties: + action: + type: string + enum: + - challenge + - deny + required: + - action + type: object + transforms: + items: + oneOf: + - properties: + type: + type: string + enum: + - request.headers + - request.query + - response.headers + op: + type: string + enum: + - append + - delete + - set + target: + properties: + key: + oneOf: + - type: string + - properties: + eq: + oneOf: + - type: string + - type: number + neq: + type: string + inc: + items: + type: string + type: array + ninc: + items: + type: string + type: array + pre: + type: string + suf: + type: string + gt: + type: number + gte: + type: number + lt: + type: number + lte: + type: number + type: object + required: + - key + type: object + args: + oneOf: + - type: string + - items: + type: string + type: array + env: + items: + type: string + type: array + required: + - op + - target + - type + type: object + - properties: + type: + type: string + enum: + - request.path + op: + type: string + enum: + - set + args: + type: string + env: + items: + type: string + type: array + required: + - args + - op + - type + type: object + type: array + env: + items: + type: string + type: array + locale: + properties: + redirect: + additionalProperties: + type: string + type: object + cookie: + type: string + type: object + source: + type: string + description: Aliases for `src`, `dest`, and `status`. These provide consistency with the `rewrites`, `redirects`, and `headers` fields which use `source`, `destination`, and `statusCode`. During normalization, the string forms are converted to their canonical forms (`src`, `dest`, `status`) and stripped from the route object. `destination` may also be a service-targeted object, in which case routing is delegated into the named service's internal route table and the object is preserved as-is (not folded into `dest`). + destination: + oneOf: + - type: string + - properties: + type: + type: string + enum: + - service + description: Optional explicit format marker. The destination is identified by the presence of `service`, so `type` is no longer required. + service: + type: string + path: + type: string + description: Routing-only path used to select a route inside the target service. + required: + - service + type: object + statusCode: + type: number + middlewarePath: + type: string + description: A middleware key within the `output` key under the build result. Overrides a `middleware` definition. + middlewareRawSrc: + items: + type: string + type: array + description: The original middleware matchers. + middleware: + type: number + description: A middleware index in the `middleware` key under the build result + respectOriginCacheControl: + type: boolean + enum: + - false + - true + required: + - src + type: object + description: The route definition from @vercel/routing-utils. + rawSrc: + type: string + description: Original source pattern provided by user (path-to-regexp or regex). Used to display the user's input in API responses. + rawDest: + type: string + description: Original destination provided by user. + srcSyntax: + type: string + enum: + - equals + - path-to-regexp + - regex + description: The syntax type of the source pattern. Determines how the pattern is compiled to regex. + required: + - id + - name + - route + type: object + version: + properties: + id: + type: string + description: Unique identifier for the version. + s3Key: + type: string + description: The S3 key where the routing rules are stored. + lastModified: + type: number + description: Timestamp of when this version was last modified. + createdBy: + type: string + description: The user who created this version. + isStaging: + type: boolean + enum: + - false + - true + description: Whether this version is staged and not yet promoted to production. + isLive: + type: boolean + enum: + - false + - true + description: Whether this version is currently live in production. + ruleCount: + type: number + description: The number of routing rules in this version. + alias: + type: string + description: The staging alias for previewing this version. + required: + - createdBy + - id + - lastModified + - s3Key + type: object + description: A version of routing rules stored in S3. + required: + - route + - version + type: object + '400': + description: |- + One of the provided values in the request body is invalid. + One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '409': + description: '' + '410': + description: '' + '500': + description: '' + parameters: + - name: project_id + in: path + required: true + schema: + type: string + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + requestBody: + content: + application/json: + schema: + type: object + required: + - route + properties: + route: + type: object + required: + - name + - route + properties: + name: + type: string + maxLength: 256 + description: + type: string + maxLength: 1024 + enabled: + type: boolean + srcSyntax: + type: string + enum: + - equals + - path-to-regexp + - regex + description: Pattern syntax type. If not provided, inferred from pattern. + route: + type: object + required: + - src + properties: + src: + type: string + dest: + type: string + headers: + type: string + description: (opaque JSON object) + caseSensitive: + type: boolean + status: + type: integer + has: + type: array + items: + type: object + properties: + type: + type: string + enum: + - host + - header + - cookie + - query + key: + type: string + value: + type: string + missing: + type: array + items: + type: object + properties: + type: + type: string + enum: + - host + - header + - cookie + - query + key: + type: string + value: + type: string + transforms: + type: array + items: + type: object + properties: + type: + type: string + enum: + - request.headers + - request.query + - response.headers + op: + type: string + enum: + - append + - set + - delete + target: + type: string + description: (opaque JSON object) + args: {} + env: + type: array + items: + type: string + respectOriginCacheControl: + type: boolean + position: + type: object + description: Controls where the route is inserted. Defaults to "end" if omitted. + properties: + placement: + type: string + enum: + - start + - end + - after + - before + description: '"after"/"before" require referenceId.' + referenceId: + type: string + description: Route ID to insert after/before. Required for "after"/"before". + delete: + description: Delete one or more routing rules from a project by ID. Stages a new version with the routes removed. + operationId: deleteRoutes + security: + - bearerToken: [] + summary: Delete routing rules + tags: + - project-routes + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + deletedCount: + type: number + version: + properties: + id: + type: string + description: Unique identifier for the version. + s3Key: + type: string + description: The S3 key where the routing rules are stored. + lastModified: + type: number + description: Timestamp of when this version was last modified. + createdBy: + type: string + description: The user who created this version. + isStaging: + type: boolean + enum: + - false + - true + description: Whether this version is staged and not yet promoted to production. + isLive: + type: boolean + enum: + - false + - true + description: Whether this version is currently live in production. + ruleCount: + type: number + description: The number of routing rules in this version. + alias: + type: string + description: The staging alias for previewing this version. + required: + - createdBy + - id + - lastModified + - s3Key + type: object + description: A version of routing rules stored in S3. + required: + - deletedCount + - version + type: object + '400': + description: |- + One of the provided values in the request body is invalid. + One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '409': + description: '' + '410': + description: '' + '500': + description: '' + parameters: + - name: project_id + in: path + required: true + schema: + type: string + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + requestBody: + content: + application/json: + schema: + type: object + required: + - routeIds + properties: + routeIds: + type: array + description: The IDs of the routes to delete + minItems: 1 + items: + type: string + /v1/projects/{project_id}/routes/{route_id}: + patch: + description: Replace a routing rule identified by its ID, or restore it from the current production version. Stages a new version with the modified route. + operationId: editRoute + security: + - bearerToken: [] + summary: Edit a routing rule + tags: + - project-routes + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + route: + properties: + routeType: + type: string + enum: + - redirect + - rewrite + - set_status + - transform + id: + type: string + description: Unique identifier for the routing rule. + name: + type: string + description: Human-readable name for the routing rule. + description: + type: string + description: Optional description of what the routing rule does. + enabled: + type: boolean + enum: + - false + - true + description: Whether the routing rule is enabled. Defaults to true. + staged: + type: boolean + enum: + - false + - true + description: Whether this route is new and not yet published to production. Set to true only when a route is first created via add-route. Cleared (set to false) when a version is promoted to production. + route: + properties: + src: + type: string + dest: + type: string + headers: + additionalProperties: + type: string + type: object + methods: + items: + type: string + type: array + continue: + type: boolean + enum: + - false + - true + override: + type: boolean + enum: + - false + - true + caseSensitive: + type: boolean + enum: + - false + - true + check: + type: boolean + enum: + - false + - true + important: + type: boolean + enum: + - false + - true + status: + type: number + has: + items: + oneOf: + - properties: + type: + type: string + enum: + - host + value: + oneOf: + - type: string + - properties: + eq: + oneOf: + - type: string + - type: number + neq: + type: string + inc: + items: + type: string + type: array + ninc: + items: + type: string + type: array + pre: + type: string + suf: + type: string + re: + type: string + gt: + type: number + gte: + type: number + lt: + type: number + lte: + type: number + type: object + required: + - type + - value + type: object + - properties: + type: + type: string + enum: + - cookie + - header + - query + key: + type: string + value: + oneOf: + - type: string + - properties: + eq: + oneOf: + - type: string + - type: number + neq: + type: string + inc: + items: + type: string + type: array + ninc: + items: + type: string + type: array + pre: + type: string + suf: + type: string + re: + type: string + gt: + type: number + gte: + type: number + lt: + type: number + lte: + type: number + type: object + required: + - key + - type + type: object + type: array + missing: + items: + oneOf: + - properties: + type: + type: string + enum: + - host + value: + oneOf: + - type: string + - properties: + eq: + oneOf: + - type: string + - type: number + neq: + type: string + inc: + items: + type: string + type: array + ninc: + items: + type: string + type: array + pre: + type: string + suf: + type: string + re: + type: string + gt: + type: number + gte: + type: number + lt: + type: number + lte: + type: number + type: object + required: + - type + - value + type: object + - properties: + type: + type: string + enum: + - cookie + - header + - query + key: + type: string + value: + oneOf: + - type: string + - properties: + eq: + oneOf: + - type: string + - type: number + neq: + type: string + inc: + items: + type: string + type: array + ninc: + items: + type: string + type: array + pre: + type: string + suf: + type: string + re: + type: string + gt: + type: number + gte: + type: number + lt: + type: number + lte: + type: number + type: object + required: + - key + - type + type: object + type: array + mitigate: + properties: + action: + type: string + enum: + - challenge + - deny + required: + - action + type: object + transforms: + items: + oneOf: + - properties: + type: + type: string + enum: + - request.headers + - request.query + - response.headers + op: + type: string + enum: + - append + - delete + - set + target: + properties: + key: + oneOf: + - type: string + - properties: + eq: + oneOf: + - type: string + - type: number + neq: + type: string + inc: + items: + type: string + type: array + ninc: + items: + type: string + type: array + pre: + type: string + suf: + type: string + gt: + type: number + gte: + type: number + lt: + type: number + lte: + type: number + type: object + required: + - key + type: object + args: + oneOf: + - type: string + - items: + type: string + type: array + env: + items: + type: string + type: array + required: + - op + - target + - type + type: object + - properties: + type: + type: string + enum: + - request.path + op: + type: string + enum: + - set + args: + type: string + env: + items: + type: string + type: array + required: + - args + - op + - type + type: object + type: array + env: + items: + type: string + type: array + locale: + properties: + redirect: + additionalProperties: + type: string + type: object + cookie: + type: string + type: object + source: + type: string + description: Aliases for `src`, `dest`, and `status`. These provide consistency with the `rewrites`, `redirects`, and `headers` fields which use `source`, `destination`, and `statusCode`. During normalization, the string forms are converted to their canonical forms (`src`, `dest`, `status`) and stripped from the route object. `destination` may also be a service-targeted object, in which case routing is delegated into the named service's internal route table and the object is preserved as-is (not folded into `dest`). + destination: + oneOf: + - type: string + - properties: + type: + type: string + enum: + - service + description: Optional explicit format marker. The destination is identified by the presence of `service`, so `type` is no longer required. + service: + type: string + path: + type: string + description: Routing-only path used to select a route inside the target service. + required: + - service + type: object + statusCode: + type: number + middlewarePath: + type: string + description: A middleware key within the `output` key under the build result. Overrides a `middleware` definition. + middlewareRawSrc: + items: + type: string + type: array + description: The original middleware matchers. + middleware: + type: number + description: A middleware index in the `middleware` key under the build result + respectOriginCacheControl: + type: boolean + enum: + - false + - true + required: + - src + type: object + description: The route definition from @vercel/routing-utils. + rawSrc: + type: string + description: Original source pattern provided by user (path-to-regexp or regex). Used to display the user's input in API responses. + rawDest: + type: string + description: Original destination provided by user. + srcSyntax: + type: string + enum: + - equals + - path-to-regexp + - regex + description: The syntax type of the source pattern. Determines how the pattern is compiled to regex. + required: + - id + - name + - route + type: object + version: + properties: + id: + type: string + description: Unique identifier for the version. + s3Key: + type: string + description: The S3 key where the routing rules are stored. + lastModified: + type: number + description: Timestamp of when this version was last modified. + createdBy: + type: string + description: The user who created this version. + isStaging: + type: boolean + enum: + - false + - true + description: Whether this version is staged and not yet promoted to production. + isLive: + type: boolean + enum: + - false + - true + description: Whether this version is currently live in production. + ruleCount: + type: number + description: The number of routing rules in this version. + alias: + type: string + description: The staging alias for previewing this version. + required: + - createdBy + - id + - lastModified + - s3Key + type: object + description: A version of routing rules stored in S3. + required: + - version + type: object + '400': + description: |- + One of the provided values in the request body is invalid. + One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '409': + description: '' + '410': + description: '' + '500': + description: '' + parameters: + - name: project_id + in: path + required: true + schema: + type: string + - name: route_id + in: path + required: true + schema: + type: string + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + requestBody: + content: + application/json: + schema: + type: object + properties: + route: + type: object + description: The full route object to replace the existing route with + required: + - name + - route + properties: + name: + type: string + maxLength: 256 + description: + type: string + maxLength: 1024 + enabled: + type: boolean + srcSyntax: + type: string + enum: + - equals + - path-to-regexp + - regex + description: Pattern syntax type. If not provided, inferred from pattern. + route: + type: object + required: + - src + properties: + src: + type: string + dest: + type: string + headers: + type: string + description: (opaque JSON object) + caseSensitive: + type: boolean + status: + type: integer + has: + type: array + items: + type: object + properties: + type: + type: string + enum: + - host + - header + - cookie + - query + key: + type: string + value: + type: string + missing: + type: array + items: + type: object + properties: + type: + type: string + enum: + - host + - header + - cookie + - query + key: + type: string + value: + type: string + transforms: + type: array + items: + type: object + properties: + type: + type: string + enum: + - request.headers + - request.query + - response.headers + op: + type: string + enum: + - append + - set + - delete + target: + type: string + description: (opaque JSON object) + args: {} + env: + type: array + items: + type: string + respectOriginCacheControl: + type: boolean + restore: + type: boolean + description: If true, restores the staged route to the value in the production version. + /v1/projects/{project_id}/routes/generate: + post: + description: Generate a routing rule configuration from a natural language description. Returns a suggested route configuration that can be reviewed and saved. + operationId: generateRoute + security: + - bearerToken: [] + summary: Generate a routing rule from natural language + tags: + - project-routes + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + route: + properties: + name: + type: string + description: + type: string + pathCondition: + properties: + value: + type: string + syntax: + type: string + enum: + - equals + - path-to-regexp + - regex + required: + - syntax + - value + type: object + conditions: + items: + properties: + field: + type: string + enum: + - cookie + - header + - host + - query + operator: + type: string + enum: + - contains + - eq + - exists + - re + key: + type: string + value: + type: string + missing: + type: boolean + enum: + - false + - true + required: + - field + - missing + - operator + type: object + type: array + actions: + items: + properties: + type: + type: string + enum: + - modify + - redirect + - rewrite + - set-status + subType: + type: string + enum: + - response-headers + - transform-request-header + - transform-request-query + dest: + type: string + status: + type: number + headers: + items: + properties: + key: + type: string + value: + type: string + op: + type: string + enum: + - append + - delete + - set + required: + - key + - op + type: object + type: array + required: + - type + type: object + type: array + required: + - actions + - description + - name + - pathCondition + type: object + error: + type: string + type: object + '400': + description: |- + One of the provided values in the request body is invalid. + One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '408': + description: '' + '410': + description: '' + '500': + description: '' + parameters: + - name: project_id + in: path + required: true + schema: + type: string + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + requestBody: + content: + application/json: + schema: + type: object + required: + - prompt + properties: + prompt: + type: string + maxLength: 2000 + currentRoute: + type: object + required: + - pathCondition + - actions + properties: + name: + type: string + description: + type: string + pathCondition: + type: object + properties: + value: + type: string + syntax: + type: string + conditions: + type: array + items: + type: object + properties: + field: + type: string + operator: + type: string + key: + type: string + value: + type: string + missing: + type: boolean + actions: + type: array + items: + type: object + properties: + type: + type: string + subType: + type: string + dest: + type: string + status: + type: integer + headers: + type: array + items: + type: object + properties: + key: + type: string + value: + type: string + op: + type: string + /v1/projects/{project_id}/routes/versions: + get: + description: 'Get the version history for a project''s routing rules. Returns the staging version (if one exists) followed by production versions, most recent first. The staging version has `isStaging: true` and the current production version has `isLive: true`.' + operationId: getRouteVersions + security: + - bearerToken: [] + summary: Get routing rule version history + tags: + - project-routes + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + versions: + items: + properties: + id: + type: string + description: Unique identifier for the version. + s3Key: + type: string + description: The S3 key where the routing rules are stored. + lastModified: + type: number + description: Timestamp of when this version was last modified. + createdBy: + type: string + description: The user who created this version. + isStaging: + type: boolean + enum: + - false + - true + description: Whether this version is staged and not yet promoted to production. + isLive: + type: boolean + enum: + - false + - true + description: Whether this version is currently live in production. + ruleCount: + type: number + description: The number of routing rules in this version. + alias: + type: string + description: The staging alias for previewing this version. + required: + - createdBy + - id + - lastModified + - s3Key + type: object + description: A version of routing rules stored in S3. + type: array + required: + - versions + type: object + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '410': + description: '' + parameters: + - name: project_id + in: path + required: true + schema: + type: string + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + post: + description: 'Promote staged routing rules to production, restore a previous production version, or discard staged changes. - `promote`: Publishes the staging version to production. - `restore`: Rolls back to a previous production version. - `discard`: Removes the staging version without publishing.' + operationId: updateRouteVersions + security: + - bearerToken: [] + summary: Promote, restore, or discard a routing rule version + tags: + - project-routes + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + version: + properties: + id: + type: string + description: Unique identifier for the version. + s3Key: + type: string + description: The S3 key where the routing rules are stored. + lastModified: + type: number + description: Timestamp of when this version was last modified. + createdBy: + type: string + description: The user who created this version. + isStaging: + type: boolean + enum: + - false + - true + description: Whether this version is staged and not yet promoted to production. + isLive: + type: boolean + enum: + - false + - true + description: Whether this version is currently live in production. + ruleCount: + type: number + description: The number of routing rules in this version. + alias: + type: string + description: The staging alias for previewing this version. + required: + - createdBy + - id + - lastModified + - s3Key + type: object + description: A version of routing rules stored in S3. + required: + - version + type: object + '400': + description: |- + One of the provided values in the request body is invalid. + One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '409': + description: '' + '410': + description: '' + '500': + description: '' + parameters: + - name: project_id + in: path + required: true + schema: + type: string + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + requestBody: + content: + application/json: + schema: + type: object + required: + - id + - action + properties: + id: + type: string + action: + type: string + enum: + - promote + - restore + - discard +components: + x-stackQL-resources: + routes: + id: vercel.project_routes.routes + name: routes + title: Routes + methods: + list: + operation: + $ref: '#/paths/~1v1~1projects~1{project_id}~1routes/get' + response: + mediaType: application/json + openAPIDocKey: '200' + objectKey: $.routes + request: + nativeCasing: camel + stage: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v1~1projects~1{project_id}~1routes/put' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + create: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v1~1projects~1{project_id}~1routes/post' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + delete: + operation: + $ref: '#/paths/~1v1~1projects~1{project_id}~1routes/delete' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + update: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v1~1projects~1{project_id}~1routes~1{route_id}/patch' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + generate: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v1~1projects~1{project_id}~1routes~1generate/post' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/routes/methods/list' + insert: + - $ref: '#/components/x-stackQL-resources/routes/methods/create' + update: + - $ref: '#/components/x-stackQL-resources/routes/methods/update' + delete: + - $ref: '#/components/x-stackQL-resources/routes/methods/delete' + replace: + - $ref: '#/components/x-stackQL-resources/routes/methods/stage' + versions: + id: vercel.project_routes.versions + name: versions + title: Versions + methods: + list: + operation: + $ref: '#/paths/~1v1~1projects~1{project_id}~1routes~1versions/get' + response: + mediaType: application/json + openAPIDocKey: '200' + objectKey: $.versions + request: + nativeCasing: camel + update: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v1~1projects~1{project_id}~1routes~1versions/post' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/versions/methods/list' + insert: [] + update: [] + delete: [] + replace: [] +servers: + - url: https://api.vercel.com diff --git a/provider-dev/openapi/src/vercel/v00.00.00000/services/projects.yaml b/provider-dev/openapi/src/vercel/v00.00.00000/services/projects.yaml index 7392c3e..d70db2c 100644 --- a/provider-dev/openapi/src/vercel/v00.00.00000/services/projects.yaml +++ b/provider-dev/openapi/src/vercel/v00.00.00000/services/projects.yaml @@ -1,226 +1,16 @@ openapi: 3.0.3 -servers: - - url: 'https://api.vercel.com' - description: Production API info: - contact: - email: support@vercel.com - name: Vercel Support - url: 'https://vercel.com/support' + title: projects API + description: vercel projects API version: 0.0.1 - title: Vercel API - projects - description: projects -components: - schemas: - ACLAction: - type: string - enum: - - create - - delete - - read - - update - - list - description: Enum containing the actions that can be performed against a resource. Group operations are included. - Pagination: - properties: - count: - type: number - description: Amount of items in the current page. - example: 20 - next: - nullable: true - type: number - description: Timestamp that must be used to request the next page. - example: 1540095775951 - prev: - nullable: true - type: number - description: Timestamp that must be used to request the previous page. - example: 1540095775951 - required: - - count - - next - - prev - type: object - description: 'This object contains information related to the pagination of the current request, including the necessary parameters to get the next or previous page of data.' - responses: {} - securitySchemes: - bearerToken: - type: http - description: Default authentication mechanism - scheme: bearer - oauth2: - type: oauth2 - flows: - authorizationCode: - authorizationUrl: 'https://api.vercel.com/oauth/authorize' - tokenUrl: 'https://api.vercel.com/oauth/access_token' - scopes: {} - x-stackQL-resources: - projects: - id: vercel.projects.projects - name: projects - title: Projects - methods: - update_project_data_cache: - operation: - $ref: '#/paths/~1v1~1data-cache~1projects~1{projectId}/patch' - response: - mediaType: application/json - openAPIDocKey: '200' - get_projects: - operation: - $ref: '#/paths/~1v9~1projects/get' - response: - mediaType: application/json - openAPIDocKey: '200' - objectKey: $.projects - _get_projects: - operation: - $ref: '#/paths/~1v9~1projects/get' - response: - mediaType: application/json - openAPIDocKey: '200' - create_project: - operation: - $ref: '#/paths/~1v9~1projects/post' - response: - mediaType: application/json - openAPIDocKey: '200' - get_project: - operation: - $ref: '#/paths/~1v9~1projects~1{idOrName}/get' - response: - mediaType: application/json - openAPIDocKey: '200' - update_project: - operation: - $ref: '#/paths/~1v9~1projects~1{idOrName}/patch' - response: - mediaType: application/json - openAPIDocKey: '200' - delete_project: - operation: - $ref: '#/paths/~1v9~1projects~1{idOrName}/delete' - response: - mediaType: application/json - openAPIDocKey: '200' - sqlVerbs: - select: - - $ref: '#/components/x-stackQL-resources/projects/methods/get_project' - - $ref: '#/components/x-stackQL-resources/projects/methods/get_projects' - insert: - - $ref: '#/components/x-stackQL-resources/projects/methods/create_project' - update: [] - delete: - - $ref: '#/components/x-stackQL-resources/projects/methods/delete_project' - domains: - id: vercel.projects.domains - name: domains - title: Domains - methods: - get_project_domains: - operation: - $ref: '#/paths/~1v9~1projects~1{idOrName}~1domains/get' - response: - mediaType: application/json - openAPIDocKey: '200' - objectKey: $.domains - _get_project_domains: - operation: - $ref: '#/paths/~1v9~1projects~1{idOrName}~1domains/get' - response: - mediaType: application/json - openAPIDocKey: '200' - get_project_domain: - operation: - $ref: '#/paths/~1v9~1projects~1{idOrName}~1domains~1{domain}/get' - response: - mediaType: application/json - openAPIDocKey: '200' - update_project_domain: - operation: - $ref: '#/paths/~1v9~1projects~1{idOrName}~1domains~1{domain}/patch' - response: - mediaType: application/json - openAPIDocKey: '200' - remove_project_domain: - operation: - $ref: '#/paths/~1v9~1projects~1{idOrName}~1domains~1{domain}/delete' - response: - mediaType: application/json - openAPIDocKey: '200' - add_project_domain: - operation: - $ref: '#/paths/~1v10~1projects~1{idOrName}~1domains/post' - response: - mediaType: application/json - openAPIDocKey: '200' - verify_project_domain: - operation: - $ref: '#/paths/~1v9~1projects~1{idOrName}~1domains~1{domain}~1verify/post' - response: - mediaType: application/json - openAPIDocKey: '200' - sqlVerbs: - select: - - $ref: '#/components/x-stackQL-resources/domains/methods/get_project_domain' - - $ref: '#/components/x-stackQL-resources/domains/methods/get_project_domains' - insert: [] - update: [] - delete: - - $ref: '#/components/x-stackQL-resources/domains/methods/remove_project_domain' - env: - id: vercel.projects.env - name: env - title: Env - methods: - filter_project_envs: - operation: - $ref: '#/paths/~1v9~1projects~1{idOrName}~1env/get' - response: - mediaType: application/json - openAPIDocKey: '200' - get_project_env: - operation: - $ref: '#/paths/~1v1~1projects~1{idOrName}~1env~1{id}/get' - response: - mediaType: application/json - openAPIDocKey: '200' - create_project_env: - operation: - $ref: '#/paths/~1v10~1projects~1{idOrName}~1env/post' - response: - mediaType: application/json - openAPIDocKey: '200' - remove_project_env: - operation: - $ref: '#/paths/~1v9~1projects~1{idOrName}~1env~1{id}/delete' - response: - mediaType: application/json - openAPIDocKey: '200' - edit_project_env: - operation: - $ref: '#/paths/~1v9~1projects~1{idOrName}~1env~1{id}/patch' - response: - mediaType: application/json - openAPIDocKey: '200' - sqlVerbs: - select: - - $ref: '#/components/x-stackQL-resources/env/methods/get_project_env' - insert: - - $ref: '#/components/x-stackQL-resources/env/methods/create_project_env' - update: [] - delete: - - $ref: '#/components/x-stackQL-resources/env/methods/remove_project_env' paths: - '/v1/data-cache/projects/{projectId}': - patch: - description: Update the data cache feature on a project. - operationId: updateProjectDataCache + /v10/projects: + get: + description: Allows to retrieve the list of projects of the authenticated user or team. The list will be paginated and the provided query parameters allow filtering the returned projects. + operationId: getProjects security: - bearerToken: [] - summary: Update the data cache feature + summary: Retrieve a list of projects tags: - projects responses: @@ -229,3295 +19,9561 @@ paths: content: application/json: schema: + nullable: true properties: - accountId: - type: string - analytics: - properties: - id: - type: string - canceledAt: - nullable: true - type: number - disabledAt: - type: number - enabledAt: - type: number - paidAt: - type: number - sampleRatePercent: - nullable: true - type: number - spendLimitInDollars: - nullable: true - type: number - required: - - id - - canceledAt - - disabledAt - - enabledAt - type: object - autoExposeSystemEnvs: - type: boolean - autoAssignCustomDomains: - type: boolean - autoAssignCustomDomainsUpdatedBy: - type: string - buildCommand: - nullable: true - type: string - commandForIgnoringBuildStep: - nullable: true - type: string - connectConfigurationId: - nullable: true - type: string - connectBuildsEnabled: - type: boolean - createdAt: - type: number - customerSupportCodeVisibility: - type: boolean - crons: - properties: - enabledAt: - type: number - description: 'The time the feature was enabled for this project. Note: It enables automatically with the first Deployment that outputs cronjobs.' - disabledAt: - nullable: true - type: number - description: The time the feature was disabled for this project. - updatedAt: - type: number - deploymentId: - nullable: true - type: string - description: The ID of the Deployment from which the definitions originated. - definitions: - items: - properties: - host: - type: string - description: The hostname that should be used. - example: vercel.com - path: - type: string - description: The path that should be called for the cronjob. - example: /api/crons/sync-something?hello=world - schedule: - type: string - description: The cron expression. - example: 0 0 * * * - required: - - host - - path - - schedule - type: object - type: array - required: - - enabledAt - - disabledAt - - updatedAt - - deploymentId - - definitions - type: object - dataCache: - properties: - userDisabled: - type: boolean - storageSizeBytes: - nullable: true - type: number - unlimited: - type: boolean - required: - - userDisabled - type: object - devCommand: - nullable: true - type: string - directoryListing: - type: boolean - installCommand: - nullable: true - type: string - env: + projects: items: properties: - target: - oneOf: - - items: - type: string - enum: - - production - - preview - - development - - preview - - development - type: array - - type: string - enum: - - production - - preview - - development - - preview - - development - type: - type: string - enum: - - secret - - system - - encrypted - - plain - - sensitive - id: - type: string - key: - type: string - value: - type: string - configurationId: - nullable: true - type: string - createdAt: - type: number - updatedAt: - type: number - createdBy: - nullable: true - type: string - updatedBy: - nullable: true - type: string - gitBranch: - type: string - edgeConfigId: - nullable: true - type: string - edgeConfigTokenId: - nullable: true + accountId: type: string - contentHint: - nullable: true + creator: oneOf: - properties: type: type: string enum: - - redis-url - storeId: - type: string - required: - - type - - storeId - type: object - - properties: - type: - type: string - enum: - - redis-rest-api-url - storeId: - type: string - required: - - type - - storeId - type: object - - properties: - type: - type: string - enum: - - redis-rest-api-token - storeId: - type: string - required: - - type - - storeId - type: object - - properties: - type: - type: string - enum: - - redis-rest-api-read-only-token - storeId: - type: string - required: - - type - - storeId - type: object - - properties: - type: - type: string - enum: - - blob-read-write-token - storeId: - type: string - required: - - type - - storeId - type: object - - properties: - type: - type: string - enum: - - postgres-url - storeId: - type: string - required: - - type - - storeId - type: object - - properties: - type: - type: string - enum: - - postgres-url-non-pooling - storeId: - type: string - required: - - type - - storeId - type: object - - properties: - type: - type: string - enum: - - postgres-prisma-url - storeId: - type: string - required: - - type - - storeId - type: object - - properties: - type: - type: string - enum: - - postgres-user - storeId: - type: string + - user + via: + nullable: true + oneOf: + - properties: + type: + type: string + enum: + - app + app: + properties: + id: + type: string + description: The internal ID of the Vercel App backing this principal. + clientId: + type: string + description: The protocol-facing OAuth client ID. This may differ from {@link id} when Client ID Metadata Documents (CIMD) are used. + required: + - id + type: object + required: + - app + - type + type: object + description: Set when a Vercel App or Integration acts on behalf of a {@link User}. Captures user-consented OAuth delegation that the ACL layer may inspect to evaluate scope restrictions. This is NOT for impersonation or token-exchange provenance — those live on `auth.token`, not on the principal. + - properties: + type: + type: string + enum: + - integration + integration: + properties: + integrationId: + type: string + configurationId: + type: string + required: + - configurationId + - integrationId + type: object + required: + - integration + - type + type: object + description: Set when a Vercel App or Integration acts on behalf of a {@link User}. Captures user-consented OAuth delegation that the ACL layer may inspect to evaluate scope restrictions. This is NOT for impersonation or token-exchange provenance — those live on `auth.token`, not on the principal. + user: + properties: + id: + type: string + required: + - id + type: object required: - type - - storeId + - user + - via type: object - properties: type: type: string enum: - - postgres-host - storeId: - type: string + - app + app: + properties: + id: + type: string + description: The internal ID of the Vercel App backing this principal. + clientId: + type: string + description: The protocol-facing OAuth client ID. This may differ from {@link id} when Client ID Metadata Documents (CIMD) are used. + required: + - id + type: object required: + - app - type - - storeId type: object - properties: type: type: string enum: - - postgres-password - storeId: - type: string + - integration + integration: + properties: + integrationId: + type: string + configurationId: + type: string + required: + - configurationId + - integrationId + type: object required: + - integration - type - - storeId type: object - properties: type: type: string enum: - - postgres-database - storeId: - type: string + - system required: - type - - storeId type: object - decrypted: - type: boolean - description: Whether `value` is decrypted. - required: - - type - - key - - value - type: object - type: array - framework: - nullable: true - type: string - enum: - - blitzjs - - nextjs - - gatsby - - remix - - astro - - hexo - - eleventy - - docusaurus-2 - - docusaurus - - preact - - solidstart - - dojo - - ember - - vue - - scully - - ionic-angular - - angular - - polymer - - svelte - - sveltekit - - sveltekit-1 - - ionic-react - - create-react-app - - gridsome - - umijs - - sapper - - saber - - stencil - - nuxtjs - - redwoodjs - - hugo - - jekyll - - brunch - - middleman - - zola - - hydrogen - - vite - - vitepress - - vuepress - - parcel - - sanity - - storybook - gitForkProtection: - type: boolean - gitLFS: - type: boolean - id: - type: string - latestDeployments: - items: - properties: alias: - items: - type: string - type: array - aliasAssigned: - nullable: true - oneOf: - - type: number - - type: boolean - aliasError: - nullable: true - properties: - code: - type: string - message: - type: string - required: - - code - - message - type: object - aliasFinal: - nullable: true - type: string - automaticAliases: - items: - type: string - type: array - builds: items: properties: - use: + configuredBy: + nullable: true type: string - src: + enum: + - A + - CNAME + - dns-01 + - http + - null + configuredChangedAt: + nullable: true + type: number + createdAt: + nullable: true + type: number + deployment: + nullable: true + properties: + id: + type: string + alias: + items: + type: string + type: array + aliasAssigned: + nullable: true + oneOf: + - type: number + - type: boolean + enum: + - false + - true + aliasError: + nullable: true + properties: + code: + type: string + message: + type: string + required: + - code + - message + type: object + aliasFinal: + nullable: true + type: string + automaticAliases: + items: + type: string + type: array + branchMatcher: + properties: + type: + type: string + enum: + - endsWith + - equals + - startsWith + description: The type of matching to perform + pattern: + type: string + description: The pattern to match against branch names + required: + - pattern + - type + type: object + buildingAt: + type: number + builds: + items: + properties: + use: + type: string + src: + type: string + dest: + type: string + required: + - use + type: object + type: array + checksConclusion: + type: string + enum: + - canceled + - failed + - skipped + - succeeded + checksState: + type: string + enum: + - completed + - registered + - running + connectBuildsEnabled: + type: boolean + enum: + - false + - true + connectConfigurationId: + type: string + createdAt: + type: number + createdIn: + type: string + creator: + nullable: true + properties: + email: + type: string + githubLogin: + type: string + gitlabLogin: + type: string + uid: + type: string + username: + type: string + required: + - email + - uid + - username + type: object + deletedAt: + type: number + deploymentHostname: + type: string + forced: + type: boolean + enum: + - false + - true + name: + type: string + meta: + additionalProperties: + type: string + type: object + monorepoManager: + nullable: true + type: string + oidcTokenClaims: + properties: + iss: + type: string + sub: + type: string + scope: + type: string + aud: + type: string + owner: + type: string + owner_id: + type: string + project: + type: string + project_id: + type: string + environment: + type: string + custom_environment_id: + type: string + mfe_group_ids: + items: + type: string + type: array + plan: + type: string + required: + - aud + - environment + - iss + - owner + - owner_id + - project + - project_id + - scope + - sub + type: object + plan: + type: string + enum: + - enterprise + - hobby + - pro + previewCommentsEnabled: + type: boolean + enum: + - false + - true + description: Whether or not preview comments are enabled for the deployment + example: false + private: + type: boolean + enum: + - false + - true + readyAt: + type: number + readyState: + type: string + enum: + - BLOCKED + - BUILDING + - CANCELED + - ERROR + - INITIALIZING + - QUEUED + - READY + readySubstate: + type: string + enum: + - PROMOTED + - ROLLING + - STAGED + requestedAt: + type: number + target: + nullable: true + type: string + teamId: + nullable: true + type: string + type: + type: string + enum: + - LAMBDAS + url: + type: string + userId: + type: string + description: Present for user creators; omitted for app/integration/system creators. + withCache: + type: boolean + enum: + - false + - true + required: + - createdAt + - createdIn + - creator + - deploymentHostname + - id + - name + - plan + - private + - readyState + - type + - url + type: object + domain: type: string - dest: + environment: + type: string + enum: + - preview + - production + gitBranch: + nullable: true + type: string + redirect: + nullable: true + type: string + redirectStatusCode: + nullable: true + type: number + enum: + - 301 + - 302 + - 307 + - 308 + - null + target: type: string + enum: + - PREVIEW + - PRODUCTION + - STAGING required: - - use + - deployment + - domain + - environment + - target type: object type: array - connectBuildsEnabled: - type: boolean - connectConfigurationId: - type: string - createdAt: - type: number - createdIn: - type: string - creator: - nullable: true + analytics: properties: - email: - type: string - githubLogin: - type: string - gitlabLogin: - type: string - uid: - type: string - username: + id: type: string + canceledAt: + nullable: true + type: number + disabledAt: + type: number + enabledAt: + type: number + paidAt: + type: number + sampleRatePercent: + nullable: true + type: number + spendLimitInDollars: + nullable: true + type: number required: - - email - - uid - - username + - disabledAt + - enabledAt + - id type: object - deploymentHostname: - type: string - name: - type: string - forced: + appliedCve55182Migration: type: boolean - id: - type: string - meta: - additionalProperties: - type: string - type: object - monorepoManager: - nullable: true - type: string - plan: - type: string enum: - - pro - - enterprise - - hobby - - oss - private: + - false + - true + autoExposeSystemEnvs: type: boolean - readyState: - type: string enum: - - BUILDING - - ERROR - - INITIALIZING - - QUEUED - - READY - - CANCELED - readySubstate: - type: string + - false + - true + autoAssignCustomDomains: + type: boolean enum: - - STAGED - - PROMOTED - requestedAt: - type: number - target: - nullable: true + - false + - true + autoAssignCustomDomainsUpdatedBy: type: string - teamId: + buildCommand: nullable: true type: string - type: + commandForIgnoringBuildStep: + nullable: true type: string + customerSupportCodeVisibility: + type: boolean enum: - - LAMBDAS - url: - type: string - userId: + - false + - true + createdAt: + type: number + devCommand: + nullable: true type: string - withCache: + directoryListing: type: boolean - checksConclusion: - type: string enum: - - succeeded - - failed - - skipped - - canceled - checksState: + - false + - true + deploymentExpiration: + properties: + expirationDays: + type: number + description: Number of days to keep non-production deployments (mostly preview deployments) before soft deletion. + expirationDaysProduction: + type: number + description: Number of days to keep production deployments before soft deletion. + expirationDaysCanceled: + type: number + description: Number of days to keep canceled deployments before soft deletion. + expirationDaysErrored: + type: number + description: Number of days to keep errored deployments before soft deletion. + deploymentsToKeep: + type: number + description: Minimum number of production deployments to keep for this project, even if they are over the production expiration limit. + type: object + description: Retention policies for deployments. These are enforced at the project level, but we also maintain an instance of this at the team level as a default policy that gets applied to new projects. + installCommand: + nullable: true type: string - enum: - - registered - - running - - completed - readyAt: - type: number - buildingAt: - type: number - previewCommentsEnabled: - type: boolean - description: Whether or not preview comments are enabled for the deployment - example: false - required: - - createdAt - - createdIn - - creator - - deploymentHostname - - name - - id - - plan - - private - - readyState - - type - - url - - userId - type: object - type: array - link: - oneOf: - - properties: - org: - type: string - repo: - type: string - repoId: - type: number - type: - type: string - enum: - - github - createdAt: - type: number - deployHooks: - items: - properties: - createdAt: - type: number - id: - type: string - name: - type: string - ref: - type: string - url: - type: string - required: - - id - - name - - ref - - url - type: object - type: array - gitCredentialId: - type: string - updatedAt: - type: number - sourceless: - type: boolean - productionBranch: - type: string - required: - - deployHooks - type: object - - properties: - projectId: - type: string - projectName: - type: string - projectNameWithNamespace: - type: string - projectNamespace: - type: string - projectUrl: - type: string - type: - type: string - enum: - - gitlab - createdAt: - type: number - deployHooks: - items: - properties: - createdAt: - type: number - id: - type: string - name: - type: string - ref: - type: string - url: - type: string - required: - - id - - name - - ref - - url - type: object - type: array - gitCredentialId: - type: string - updatedAt: - type: number - sourceless: - type: boolean - productionBranch: - type: string - required: - - deployHooks - type: object - - properties: - name: - type: string - slug: - type: string - owner: - type: string - type: - type: string - enum: - - bitbucket - uuid: - type: string - workspaceUuid: - type: string - createdAt: - type: number - deployHooks: - items: - properties: - createdAt: - type: number - id: - type: string - name: - type: string - ref: - type: string - url: - type: string - required: - - id - - name - - ref - - url - type: object - type: array - gitCredentialId: - type: string - updatedAt: - type: number - sourceless: - type: boolean - productionBranch: - type: string - required: - - deployHooks - type: object - name: - type: string - nodeVersion: - type: string - enum: - - 18.x - - 16.x - - 14.x - - 12.x - - 10.x - outputDirectory: - nullable: true - type: string - passwordProtection: - nullable: true - type: object - productionDeploymentsFastLane: - type: boolean - publicSource: - nullable: true - type: boolean - rootDirectory: - nullable: true - type: string - serverlessFunctionRegion: - nullable: true - type: string - skipGitConnectDuringLink: - type: boolean - sourceFilesOutsideRootDirectory: - type: boolean - ssoProtection: - nullable: true - properties: - deploymentType: - type: string - enum: - - all - - preview - - prod_deployment_urls_and_all_previews - required: - - deploymentType - type: object - targets: - additionalProperties: - nullable: true - properties: - alias: - items: - type: string - type: array - aliasAssigned: - nullable: true - oneOf: - - type: number - - type: boolean - aliasError: - nullable: true - properties: - code: - type: string - message: - type: string - required: - - code - - message - type: object - aliasFinal: - nullable: true - type: string - automaticAliases: + ipBuckets: items: - type: string + properties: + bucket: + type: string + default: + type: boolean + enum: + - false + - true + supportUntil: + type: number + required: + - bucket + type: object type: array - builds: + env: items: properties: - use: + target: + oneOf: + - items: + type: string + enum: + - development + - development + - preview + - preview + - production + type: array + - type: string + enum: + - development + - development + - preview + - preview + - production + type: type: string - src: + enum: + - encrypted + - plain + - secret + - sensitive + - system + sunsetSecretId: type: string - dest: + description: This is used to identify variables that have been migrated from type secret to sensitive. + legacyValue: type: string - required: - - use - type: object - type: array - connectBuildsEnabled: - type: boolean - connectConfigurationId: - type: string - createdAt: - type: number - createdIn: - type: string - creator: - nullable: true - properties: - email: - type: string - githubLogin: - type: string - gitlabLogin: - type: string - uid: - type: string - username: - type: string - required: - - email - - uid - - username - type: object - deploymentHostname: - type: string - name: - type: string - forced: - type: boolean - id: - type: string - meta: - additionalProperties: - type: string - type: object - monorepoManager: - nullable: true - type: string - plan: - type: string - enum: - - pro - - enterprise - - hobby - - oss - private: - type: boolean - readyState: - type: string - enum: - - BUILDING - - ERROR - - INITIALIZING - - QUEUED - - READY - - CANCELED - readySubstate: - type: string - enum: - - STAGED - - PROMOTED - requestedAt: - type: number - target: - nullable: true - type: string - teamId: + description: Legacy now-encryption ciphertext, present after migration swaps value/vsmValue + decrypted: + type: boolean + enum: + - false + - true + value: + type: string + vsmValue: + type: string + id: + type: string + key: + type: string + configurationId: + nullable: true + type: string + createdAt: + type: number + updatedAt: + type: number + createdBy: + nullable: true + type: string + updatedBy: + nullable: true + type: string + gitBranch: + type: string + visibility: + type: string + enum: + - config + - secret + description: User-facing config/secret model. When set, authoritative for new code paths when the env-var-config-secret-ui flag is enabled. Legacy rows omit this field; legacy rows omit it and callers fall back to existing `type` behavior. + edgeConfigId: + nullable: true + type: string + edgeConfigTokenId: + nullable: true + type: string + contentHint: + nullable: true + oneOf: + - properties: + type: + type: string + enum: + - redis-url + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - redis-rest-api-url + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - redis-rest-api-token + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - redis-rest-api-read-only-token + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - blob-read-write-token + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - blob-store-id + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - blob-webhook-public-key + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - postgres-url + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - postgres-url-non-pooling + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - postgres-prisma-url + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - postgres-user + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - postgres-host + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - postgres-password + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - postgres-database + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - postgres-url-no-ssl + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - integration-store-secret + storeId: + type: string + integrationId: + type: string + integrationProductId: + type: string + integrationConfigurationId: + type: string + required: + - integrationConfigurationId + - integrationId + - integrationProductId + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - flags-connection-string + projectId: + type: string + required: + - projectId + - type + type: object + internalContentHint: + nullable: true + properties: + type: + type: string + enum: + - flags-secret + encryptedValue: + type: string + description: Contains the `value` of the env variable, encrypted with a special key to make decryption possible in the subscriber Lambda. + required: + - encryptedValue + - type + type: object + description: Similar to `contentHints`, but should not be exposed to the user. + comment: + type: string + customEnvironmentIds: + items: + type: string + type: array + required: + - key + - type + - value + type: object + type: array + framework: nullable: true type: string - type: - type: string enum: - - LAMBDAS - url: - type: string - userId: - type: string - withCache: + - actix-web + - angular + - ash + - astro + - axum + - blitzjs + - brunch + - bun + - container + - create-react-app + - django + - docusaurus + - docusaurus-2 + - dojo + - eleventy + - elysia + - ember + - eve + - express + - factory-eve + - fastapi + - fasthtml + - fastify + - flask + - gatsby + - go + - gridsome + - h3 + - hexo + - hono + - hugo + - hydrogen + - ionic-angular + - ionic-react + - jekyll + - koa + - mastra + - middleman + - nestjs + - nextjs + - nitro + - node + - nuxtjs + - parcel + - polymer + - preact + - python + - react-router + - redwoodjs + - remix + - ruby + - rust + - saber + - sanity + - sanity-v2 + - sapper + - scully + - services + - solidstart + - solidstart-1 + - stencil + - storybook + - svelte + - sveltekit + - sveltekit-1 + - tanstack-start + - tanstack-start-lovable + - umijs + - vite + - vitepress + - vue + - vuepress + - xmcp + - zola + - null + gitForkProtection: type: boolean - checksConclusion: - type: string enum: - - succeeded - - failed - - skipped - - canceled - checksState: + - false + - true + id: type: string - enum: - - registered - - running - - completed - readyAt: - type: number - buildingAt: - type: number - previewCommentsEnabled: - type: boolean - description: Whether or not preview comments are enabled for the deployment - example: false - required: - - createdAt - - createdIn - - creator - - deploymentHostname - - name - - id - - plan - - private - - readyState - - type - - url - - userId - type: object - type: object - transferCompletedAt: - type: number - transferStartedAt: - type: number - transferToAccountId: - type: string - transferredFromAccountId: - type: string - updatedAt: - type: number - live: - type: boolean - enablePreviewFeedback: - nullable: true - type: boolean - permissions: - properties: - aliasGlobal: - items: - $ref: '#/components/schemas/ACLAction' - type: array - analyticsSampling: - items: - $ref: '#/components/schemas/ACLAction' - type: array - analyticsUsage: - items: - $ref: '#/components/schemas/ACLAction' - type: array - auditLog: - items: - $ref: '#/components/schemas/ACLAction' - type: array - billingAddress: - items: - $ref: '#/components/schemas/ACLAction' - type: array - billingInformation: - items: - $ref: '#/components/schemas/ACLAction' - type: array - billingInvoice: - items: - $ref: '#/components/schemas/ACLAction' - type: array - billingInvoiceEmailRecipient: - items: - $ref: '#/components/schemas/ACLAction' - type: array - billingInvoiceLanguage: - items: - $ref: '#/components/schemas/ACLAction' - type: array - billingPlan: - items: - $ref: '#/components/schemas/ACLAction' - type: array - billingPurchaseOrder: - items: - $ref: '#/components/schemas/ACLAction' - type: array - billingTaxId: - items: - $ref: '#/components/schemas/ACLAction' - type: array - blob: - items: - $ref: '#/components/schemas/ACLAction' - type: array - budget: - items: - $ref: '#/components/schemas/ACLAction' - type: array - cacheArtifact: - items: - $ref: '#/components/schemas/ACLAction' - type: array - cacheArtifactUsageEvent: - items: - $ref: '#/components/schemas/ACLAction' - type: array - concurrentBuilds: - items: - $ref: '#/components/schemas/ACLAction' - type: array - connect: - items: - $ref: '#/components/schemas/ACLAction' - type: array - connectConfiguration: - items: - $ref: '#/components/schemas/ACLAction' - type: array - domain: - items: - $ref: '#/components/schemas/ACLAction' - type: array - domainAcceptDelegation: - items: - $ref: '#/components/schemas/ACLAction' - type: array - domainAuthCodes: - items: - $ref: '#/components/schemas/ACLAction' - type: array - domainCertificate: - items: - $ref: '#/components/schemas/ACLAction' - type: array - domainCheckConfig: - items: - $ref: '#/components/schemas/ACLAction' - type: array - domainMove: - items: - $ref: '#/components/schemas/ACLAction' - type: array - domainPurchase: - items: - $ref: '#/components/schemas/ACLAction' - type: array - domainRecord: - items: - $ref: '#/components/schemas/ACLAction' - type: array - domainTransferIn: - items: - $ref: '#/components/schemas/ACLAction' - type: array - event: - items: - $ref: '#/components/schemas/ACLAction' - type: array - ownEvent: - items: - $ref: '#/components/schemas/ACLAction' - type: array - sensitiveEnvironmentVariablePolicy: - items: - $ref: '#/components/schemas/ACLAction' - type: array - fileUpload: - items: - $ref: '#/components/schemas/ACLAction' - type: array - gitRepository: - items: - $ref: '#/components/schemas/ACLAction' - type: array - ipBlocking: - items: - $ref: '#/components/schemas/ACLAction' - type: array - integration: - items: - $ref: '#/components/schemas/ACLAction' - type: array - integrationConfiguration: - items: - $ref: '#/components/schemas/ACLAction' - type: array - integrationConfigurationTransfer: - items: - $ref: '#/components/schemas/ACLAction' - type: array - integrationConfigurationProjects: - items: - $ref: '#/components/schemas/ACLAction' - type: array - integrationVercelConfigurationOverride: - items: - $ref: '#/components/schemas/ACLAction' - type: array - jobGlobal: - items: - $ref: '#/components/schemas/ACLAction' - type: array - logDrain: - items: - $ref: '#/components/schemas/ACLAction' - type: array - Monitoring: - items: - $ref: '#/components/schemas/ACLAction' - type: array - monitoringQuery: - items: - $ref: '#/components/schemas/ACLAction' - type: array - monitoringChart: - items: - $ref: '#/components/schemas/ACLAction' - type: array - monitoringAlert: - items: - $ref: '#/components/schemas/ACLAction' - type: array - notificationDeploymentFailed: - items: - $ref: '#/components/schemas/ACLAction' - type: array - notificationDomainConfiguration: - items: - $ref: '#/components/schemas/ACLAction' - type: array - notificationDomainExpire: - items: - $ref: '#/components/schemas/ACLAction' - type: array - notificationDomainMoved: - items: - $ref: '#/components/schemas/ACLAction' - type: array - notificationDomainPurchase: - items: - $ref: '#/components/schemas/ACLAction' - type: array - notificationDomainRenewal: - items: - $ref: '#/components/schemas/ACLAction' - type: array - notificationDomainTransfer: - items: - $ref: '#/components/schemas/ACLAction' - type: array - notificationDomainUnverified: - items: - $ref: '#/components/schemas/ACLAction' - type: array - NotificationMonitoringAlert: - items: - $ref: '#/components/schemas/ACLAction' - type: array - notificationPaymentFailed: - items: - $ref: '#/components/schemas/ACLAction' - type: array - notificationUsageAlert: - items: - $ref: '#/components/schemas/ACLAction' - type: array - notificationCustomerBudget: - items: - $ref: '#/components/schemas/ACLAction' - type: array - openTelemetryEndpoint: - items: - $ref: '#/components/schemas/ACLAction' - type: array - paymentMethod: - items: - $ref: '#/components/schemas/ACLAction' - type: array - permissions: - items: - $ref: '#/components/schemas/ACLAction' - type: array - postgres: - items: - $ref: '#/components/schemas/ACLAction' - type: array - previewDeploymentSuffix: - items: - $ref: '#/components/schemas/ACLAction' - type: array - proTrialOnboarding: - items: - $ref: '#/components/schemas/ACLAction' - type: array - seawallConfig: - items: - $ref: '#/components/schemas/ACLAction' - type: array - sharedEnvVars: - items: - $ref: '#/components/schemas/ACLAction' - type: array - sharedEnvVarsProduction: - items: - $ref: '#/components/schemas/ACLAction' - type: array - space: - items: - $ref: '#/components/schemas/ACLAction' - type: array - spaceRun: - items: - $ref: '#/components/schemas/ACLAction' - type: array - passwordProtectionInvoiceItem: - items: - $ref: '#/components/schemas/ACLAction' - type: array - rateLimit: - items: - $ref: '#/components/schemas/ACLAction' - type: array - redis: - items: - $ref: '#/components/schemas/ACLAction' - type: array - remoteCaching: - items: - $ref: '#/components/schemas/ACLAction' - type: array - samlConfig: - items: - $ref: '#/components/schemas/ACLAction' - type: array - secret: - items: - $ref: '#/components/schemas/ACLAction' - type: array - supportCase: - items: - $ref: '#/components/schemas/ACLAction' - type: array - supportCaseComment: - items: - $ref: '#/components/schemas/ACLAction' - type: array - dataCacheBillingSettings: - items: - $ref: '#/components/schemas/ACLAction' - type: array - team: - items: - $ref: '#/components/schemas/ACLAction' - type: array - teamAccessRequest: - items: - $ref: '#/components/schemas/ACLAction' - type: array - teamFellowMembership: - items: - $ref: '#/components/schemas/ACLAction' - type: array - teamInvite: - items: - $ref: '#/components/schemas/ACLAction' - type: array - teamInviteCode: - items: - $ref: '#/components/schemas/ACLAction' - type: array - teamJoin: - items: - $ref: '#/components/schemas/ACLAction' - type: array - teamOwnMembership: - items: - $ref: '#/components/schemas/ACLAction' - type: array - teamOwnMembershipDisconnectSAML: - items: - $ref: '#/components/schemas/ACLAction' - type: array - token: - items: - $ref: '#/components/schemas/ACLAction' - type: array - usage: - items: - $ref: '#/components/schemas/ACLAction' - type: array - usageCycle: - items: - $ref: '#/components/schemas/ACLAction' - type: array - user: - items: - $ref: '#/components/schemas/ACLAction' - type: array - userConnection: - items: - $ref: '#/components/schemas/ACLAction' - type: array - webAnalyticsPlan: - items: - $ref: '#/components/schemas/ACLAction' - type: array - edgeConfig: - items: - $ref: '#/components/schemas/ACLAction' - type: array - edgeConfigItem: - items: - $ref: '#/components/schemas/ACLAction' - type: array - edgeConfigToken: - items: - $ref: '#/components/schemas/ACLAction' - type: array - webhook: - items: - $ref: '#/components/schemas/ACLAction' - type: array - webhook-event: - items: - $ref: '#/components/schemas/ACLAction' - type: array - endpointVerification: - items: - $ref: '#/components/schemas/ACLAction' - type: array - projectTransferIn: - items: - $ref: '#/components/schemas/ACLAction' - type: array - aliasProject: - items: - $ref: '#/components/schemas/ACLAction' - type: array - aliasProtectionBypass: - items: - $ref: '#/components/schemas/ACLAction' - type: array - connectConfigurationLink: - items: - $ref: '#/components/schemas/ACLAction' - type: array - dataCacheNamespace: - items: - $ref: '#/components/schemas/ACLAction' - type: array - deployment: - items: - $ref: '#/components/schemas/ACLAction' - type: array - deploymentCheck: - items: - $ref: '#/components/schemas/ACLAction' - type: array - deploymentCheckPreview: - items: - $ref: '#/components/schemas/ACLAction' - type: array - deploymentCheckReRunFromProductionBranch: - items: - $ref: '#/components/schemas/ACLAction' - type: array - deploymentProductionGit: - items: - $ref: '#/components/schemas/ACLAction' - type: array - deploymentPreview: - items: - $ref: '#/components/schemas/ACLAction' - type: array - deploymentPrivate: - items: - $ref: '#/components/schemas/ACLAction' - type: array - deploymentPromote: - items: - $ref: '#/components/schemas/ACLAction' - type: array - deploymentRollback: - items: - $ref: '#/components/schemas/ACLAction' - type: array - logs: - items: - $ref: '#/components/schemas/ACLAction' - type: array - logsPreset: - items: - $ref: '#/components/schemas/ACLAction' - type: array - passwordProtection: - items: - $ref: '#/components/schemas/ACLAction' - type: array - job: - items: - $ref: '#/components/schemas/ACLAction' - type: array - project: - items: - $ref: '#/components/schemas/ACLAction' - type: array - projectAnalyticsSampling: - items: - $ref: '#/components/schemas/ACLAction' - type: array - projectDeploymentHook: - items: - $ref: '#/components/schemas/ACLAction' - type: array - projectDomain: - items: - $ref: '#/components/schemas/ACLAction' - type: array - projectDomainMove: - items: - $ref: '#/components/schemas/ACLAction' - type: array - projectDomainCheckConfig: - items: - $ref: '#/components/schemas/ACLAction' - type: array - projectEnvVars: - items: - $ref: '#/components/schemas/ACLAction' - type: array - projectEnvVarsProduction: - items: - $ref: '#/components/schemas/ACLAction' - type: array - projectEnvVarsUnownedByIntegration: - items: - $ref: '#/components/schemas/ACLAction' - type: array - projectId: - items: - $ref: '#/components/schemas/ACLAction' - type: array - projectIntegrationConfiguration: - items: - $ref: '#/components/schemas/ACLAction' - type: array - projectLink: - items: - $ref: '#/components/schemas/ACLAction' - type: array - projectMember: - items: - $ref: '#/components/schemas/ACLAction' - type: array - projectMonitoring: - items: - $ref: '#/components/schemas/ACLAction' - type: array - projectPermissions: - items: - $ref: '#/components/schemas/ACLAction' - type: array - projectProductionBranch: - items: - $ref: '#/components/schemas/ACLAction' - type: array - projectTransfer: - items: - $ref: '#/components/schemas/ACLAction' - type: array - projectTransferOut: - items: - $ref: '#/components/schemas/ACLAction' - type: array - projectProtectionBypass: - items: - $ref: '#/components/schemas/ACLAction' - type: array - projectUsage: - items: - $ref: '#/components/schemas/ACLAction' - type: array - projectAnalyticsUsage: - items: - $ref: '#/components/schemas/ACLAction' - type: array - analytics: - items: - $ref: '#/components/schemas/ACLAction' - type: array - trustedIps: - items: - $ref: '#/components/schemas/ACLAction' - type: array - webAnalytics: + latestDeployments: + items: + properties: + id: + type: string + alias: + items: + type: string + type: array + aliasAssigned: + nullable: true + oneOf: + - type: number + - type: boolean + enum: + - false + - true + aliasError: + nullable: true + properties: + code: + type: string + message: + type: string + required: + - code + - message + type: object + aliasFinal: + nullable: true + type: string + automaticAliases: + items: + type: string + type: array + branchMatcher: + properties: + type: + type: string + enum: + - endsWith + - equals + - startsWith + description: The type of matching to perform + pattern: + type: string + description: The pattern to match against branch names + required: + - pattern + - type + type: object + buildingAt: + type: number + builds: + items: + properties: + use: + type: string + src: + type: string + dest: + type: string + required: + - use + type: object + type: array + checksConclusion: + type: string + enum: + - canceled + - failed + - skipped + - succeeded + checksState: + type: string + enum: + - completed + - registered + - running + connectBuildsEnabled: + type: boolean + enum: + - false + - true + connectConfigurationId: + type: string + createdAt: + type: number + createdIn: + type: string + creator: + nullable: true + properties: + email: + type: string + githubLogin: + type: string + gitlabLogin: + type: string + uid: + type: string + username: + type: string + required: + - email + - uid + - username + type: object + deletedAt: + type: number + deploymentHostname: + type: string + forced: + type: boolean + enum: + - false + - true + name: + type: string + meta: + additionalProperties: + type: string + type: object + monorepoManager: + nullable: true + type: string + oidcTokenClaims: + properties: + iss: + type: string + sub: + type: string + scope: + type: string + aud: + type: string + owner: + type: string + owner_id: + type: string + project: + type: string + project_id: + type: string + environment: + type: string + custom_environment_id: + type: string + mfe_group_ids: + items: + type: string + type: array + plan: + type: string + required: + - aud + - environment + - iss + - owner + - owner_id + - project + - project_id + - scope + - sub + type: object + plan: + type: string + enum: + - enterprise + - hobby + - pro + previewCommentsEnabled: + type: boolean + enum: + - false + - true + description: Whether or not preview comments are enabled for the deployment + example: false + private: + type: boolean + enum: + - false + - true + readyAt: + type: number + readyState: + type: string + enum: + - BLOCKED + - BUILDING + - CANCELED + - ERROR + - INITIALIZING + - QUEUED + - READY + readySubstate: + type: string + enum: + - PROMOTED + - ROLLING + - STAGED + requestedAt: + type: number + target: + nullable: true + type: string + teamId: + nullable: true + type: string + type: + type: string + enum: + - LAMBDAS + url: + type: string + userId: + type: string + description: Present for user creators; omitted for app/integration/system creators. + withCache: + type: boolean + enum: + - false + - true + required: + - createdAt + - createdIn + - creator + - deploymentHostname + - id + - name + - plan + - private + - readyState + - type + - url + type: object + type: array + link: + oneOf: + - properties: + org: + type: string + repoOwnerId: + type: number + description: A new field, should be included in all new project links, is being added just in time when a deployment is created. This is needed for Protected Git scopes. + repo: + type: string + repoId: + type: number + type: + type: string + enum: + - github + createdAt: + type: number + deployHooks: + items: + properties: + createdAt: + type: number + id: + type: string + name: + type: string + ref: + type: string + url: + type: string + required: + - id + - name + - ref + - url + type: object + type: array + gitCredentialId: + type: string + updatedAt: + type: number + sourceless: + type: boolean + enum: + - false + - true + productionBranch: + type: string + required: + - deployHooks + - gitCredentialId + - org + - productionBranch + - type + type: object + - properties: + type: + type: string + enum: + - github-limited + repo: + type: string + repoId: + type: number + createdAt: + type: number + updatedAt: + type: number + org: + type: string + repoOwnerId: + type: number + description: A new field, should be included in all new project links, is being added just in time when a deployment is created. This is needed for Protected Git scopes. + deployHooks: + items: + properties: + createdAt: + type: number + id: + type: string + name: + type: string + ref: + type: string + url: + type: string + required: + - id + - name + - ref + - url + type: object + type: array + gitCredentialId: + type: string + sourceless: + type: boolean + enum: + - false + - true + productionBranch: + type: string + required: + - deployHooks + - gitCredentialId + - org + - productionBranch + - type + type: object + - properties: + org: + type: string + repoOwnerId: + type: number + description: A new field, should be included in all new project links, is being added just in time when a deployment is created. This is needed for Protected Git scopes. + repo: + type: string + repoId: + type: number + type: + type: string + enum: + - github-custom-host + host: + type: string + createdAt: + type: number + deployHooks: + items: + properties: + createdAt: + type: number + id: + type: string + name: + type: string + ref: + type: string + url: + type: string + required: + - id + - name + - ref + - url + type: object + type: array + gitCredentialId: + type: string + updatedAt: + type: number + sourceless: + type: boolean + enum: + - false + - true + productionBranch: + type: string + required: + - deployHooks + - gitCredentialId + - host + - org + - productionBranch + - type + type: object + - properties: + projectId: + type: string + projectName: + type: string + projectNameWithNamespace: + type: string + projectNamespace: + type: string + projectOwnerId: + type: number + description: A new field, should be included in all new project links, is being added just in time when a deployment is created. This is needed for Protected Git scopes. This is the id of the top level group that a namespace belongs to. Gitlab supports group nesting (up to 20 levels). + projectUrl: + type: string + type: + type: string + enum: + - gitlab + createdAt: + type: number + deployHooks: + items: + properties: + createdAt: + type: number + id: + type: string + name: + type: string + ref: + type: string + url: + type: string + required: + - id + - name + - ref + - url + type: object + type: array + gitCredentialId: + type: string + updatedAt: + type: number + sourceless: + type: boolean + enum: + - false + - true + productionBranch: + type: string + required: + - deployHooks + - gitCredentialId + - productionBranch + - projectId + - projectName + - projectNameWithNamespace + - projectNamespace + - projectUrl + - type + type: object + - properties: + name: + type: string + slug: + type: string + owner: + type: string + type: + type: string + enum: + - bitbucket + uuid: + type: string + workspaceUuid: + type: string + createdAt: + type: number + deployHooks: + items: + properties: + createdAt: + type: number + id: + type: string + name: + type: string + ref: + type: string + url: + type: string + required: + - id + - name + - ref + - url + type: object + type: array + gitCredentialId: + type: string + updatedAt: + type: number + sourceless: + type: boolean + enum: + - false + - true + productionBranch: + type: string + required: + - deployHooks + - gitCredentialId + - name + - owner + - productionBranch + - slug + - type + - uuid + - workspaceUuid + type: object + - properties: + org: + type: string + repo: + type: string + repoId: + type: string + type: + type: string + enum: + - vercel + createdAt: + type: number + deployHooks: + items: + properties: + createdAt: + type: number + id: + type: string + name: + type: string + ref: + type: string + url: + type: string + required: + - id + - name + - ref + - url + type: object + type: array + gitCredentialId: + type: string + updatedAt: + type: number + sourceless: + type: boolean + enum: + - false + - true + productionBranch: + type: string + required: + - deployHooks + - gitCredentialId + - org + - productionBranch + - repo + - repoId + - type + type: object + - properties: + org: + type: string + repo: + type: string + repoId: + type: string + type: + type: string + enum: + - v0 + createdAt: + type: number + deployHooks: + items: + properties: + createdAt: + type: number + id: + type: string + name: + type: string + ref: + type: string + url: + type: string + required: + - id + - name + - ref + - url + type: object + type: array + gitCredentialId: + type: string + updatedAt: + type: number + sourceless: + type: boolean + enum: + - false + - true + productionBranch: + type: string + required: + - deployHooks + - gitCredentialId + - org + - productionBranch + - repo + - repoId + - type + type: object + - properties: + owner: + type: string + description: Owner (namespace) slug, e.g. `acme`. + repo: + type: string + repoId: + type: string + description: Origin repository id. + ownerId: + type: string + description: Origin namespace id (`ns_…`) of the owner. + type: + type: string + enum: + - cursor-origin + createdAt: + type: number + deployHooks: + items: + properties: + createdAt: + type: number + id: + type: string + name: + type: string + ref: + type: string + url: + type: string + required: + - id + - name + - ref + - url + type: object + type: array + gitCredentialId: + type: string + updatedAt: + type: number + sourceless: + type: boolean + enum: + - false + - true + productionBranch: + type: string + required: + - deployHooks + - gitCredentialId + - owner + - ownerId + - productionBranch + - repo + - repoId + - type + type: object + name: + type: string + nodeVersion: + type: string + enum: + - 10.x + - 12.x + - 14.x + - 16.x + - 18.x + - 20.x + - 22.x + - 24.x + - 8.10.x + outputDirectory: + nullable: true + type: string + passwordProtection: + nullable: true + type: string + description: (opaque JSON object) + passport: + nullable: true + properties: + deploymentType: + type: string + enum: + - all + - all_except_custom_domains + - preview + - prod_deployment_urls_and_all_previews + connectorId: + type: string + required: + - connectorId + - deploymentType + type: object + resourceConfig: + properties: + elasticConcurrencyEnabled: + type: boolean + enum: + - false + - true + fluid: + type: boolean + enum: + - false + - true + functionDefaultRegions: + items: + type: string + type: array + functionDefaultTimeout: + type: number + functionDefaultMemoryType: + type: string + enum: + - performance + - performance_xl + - standard + - standard_legacy + functionZeroConfigFailover: + type: boolean + enum: + - false + - true + buildMachineType: + type: string + enum: + - basic + - enhanced + - standard + - turbo + buildMachineSelection: + type: string + enum: + - elastic + - fixed + buildMachineElasticLastUpdated: + type: number + buildMachineElasticReason: + type: string + enum: + - basic-floor + - build-timeout-failure + - enospc-failure + - enterprise-floor + - high-peak-disk + - high-peak-memory + - long-build-duration + - oom-failure + - short-build-duration + - sustained-high-cpu + isNSNBDisabled: + type: boolean + enum: + - false + - true + buildQueue: + properties: + configuration: + type: string + enum: + - SKIP_NAMESPACE_QUEUE + - WAIT_FOR_NAMESPACE_QUEUE + type: object + enableFunctionsBeta: + type: boolean + enum: + - false + - true + type: object + required: + - functionDefaultRegions + rollingRelease: + nullable: true + properties: + target: + type: string + description: The environment that the release targets, currently only supports production. Adding in case we want to configure with alias groups or custom environments. + example: production + stages: + nullable: true + items: + properties: + targetPercentage: + type: number + description: The percentage of traffic to serve to the canary deployment (0-100) + example: 25 + requireApproval: + type: boolean + enum: + - false + - true + description: Whether or not this stage requires manual approval to proceed + example: false + duration: + type: number + description: Duration in minutes for automatic advancement to the next stage + example: 600 + linearShift: + type: boolean + enum: + - false + - true + description: Whether to linearly shift traffic over the duration of this stage + example: false + required: + - targetPercentage + type: object + description: 'An array of all the stages required during a deployment release. Each stage defines a target percentage and advancement rules. The final stage must always have targetPercentage: 100.' + type: array + description: 'An array of all the stages required during a deployment release. Each stage defines a target percentage and advancement rules. The final stage must always have targetPercentage: 100.' + canaryResponseHeader: + type: boolean + enum: + - false + - true + description: Whether the request served by a canary deployment should return a header indicating a canary was served. Defaults to `false` when omitted. + example: false + gate: + properties: + enabled: + type: boolean + enum: + - false + - true + description: Whether automated gating is enabled for this project's rollouts. + checks: + items: + properties: + type: + type: string + enum: + - error-rate-5xx + description: The metric this check evaluates. + minSampleSize: + type: number + description: Minimum number of requests required in the window before the check can fail. Below this, the check is inconclusive rather than failing, so low-traffic stages don't gate on noise. Defaults to `100` when omitted. + example: 100 + excludeStatusCodes: + items: + type: number + type: array + description: Response status codes to ignore entirely — dropped from both the numerator (errors) and the denominator (total requests). Defaults to `[]` when omitted. + example: + - 503 + excludePaths: + items: + type: string + type: array + description: Request paths to ignore entirely — dropped from both the numerator (errors) and the denominator (total requests). Matched exactly against the request path with any query string removed; no prefix or glob matching. Defaults to `[]` when omitted. + example: + - /api/health + ingestWatermarkSeconds: + type: number + description: 'Seconds of ingest lag to allow for: the query''s upper bound is `now() - this value`, so the check never reads a window that is still filling. Defaults to `30` when omitted.' + example: 30 + required: + - type + type: object + description: The checks to evaluate. An empty array means nothing is evaluated. + type: array + description: The checks to evaluate. An empty array means nothing is evaluated. + failureThreshold: + type: number + description: How many failing evaluations within {@link windowSize} trip the gate. Defaults to `3` when omitted. + example: 3 + windowSize: + type: number + description: How many of the most recent evaluations {@link failureThreshold} is counted against. Defaults to `5` when omitted. + example: 5 + action: + type: string + enum: + - pause + - rollback + description: 'What to do when the gate trips: pause the rollout, or roll it back.' + dryRun: + type: boolean + enum: + - false + - true + description: When true, a tripped gate is only reported — {@link action} is not taken. + required: + - action + - checks + - dryRun + - enabled + type: object + description: 'Automated gating configuration. Omitted (the default) means no gating is configured, which is equivalent to `enabled: false`.' + required: + - target + type: object + description: Project-level rolling release configuration that defines how deployments should be gradually rolled out + rootDirectory: + nullable: true + type: string + serverlessFunctionRegion: + type: string + serverlessFunctionZeroConfigFailover: + type: boolean + enum: + - false + - true + speedInsights: + properties: + id: + type: string + enabledAt: + type: number + disabledAt: + type: number + canceledAt: + type: number + hasData: + type: boolean + enum: + - false + - true + dataReceivedAt: + type: number + description: When the first free (not Speed Insights Plus) production data point was observed, in ms. Set once by subscriber-analytics-events; projects that already had data before this field shipped get it backfilled on their next batch, so it reads "first free data point observed", not necessarily "first ever". + paidAt: + type: number + required: + - id + type: object + skipGitConnectDuringLink: + type: boolean + enum: + - false + - true + sourceFilesOutsideRootDirectory: + type: boolean + enum: + - false + - true + ssoProtection: + nullable: true + properties: + deploymentType: + type: string + enum: + - all + - all_except_custom_domains + - preview + - prod_deployment_urls_and_all_previews + cve55182MigrationAppliedFrom: + nullable: true + type: string + enum: + - all + - all_except_custom_domains + - preview + - prod_deployment_urls_and_all_previews + - null + april2026SecurityIncidentMigrationAppliedFrom: + nullable: true + type: string + enum: + - all + - all_except_custom_domains + - preview + - prod_deployment_urls_and_all_previews + - null + required: + - deploymentType + type: object + targets: + additionalProperties: + nullable: true + properties: + id: + type: string + alias: + items: + type: string + type: array + aliasAssigned: + nullable: true + oneOf: + - type: number + - type: boolean + enum: + - false + - true + aliasError: + nullable: true + properties: + code: + type: string + message: + type: string + required: + - code + - message + type: object + aliasFinal: + nullable: true + type: string + automaticAliases: + items: + type: string + type: array + branchMatcher: + properties: + type: + type: string + enum: + - endsWith + - equals + - startsWith + description: The type of matching to perform + pattern: + type: string + description: The pattern to match against branch names + required: + - pattern + - type + type: object + buildingAt: + type: number + builds: + items: + properties: + use: + type: string + src: + type: string + dest: + type: string + required: + - use + type: object + type: array + checksConclusion: + type: string + enum: + - canceled + - failed + - skipped + - succeeded + checksState: + type: string + enum: + - completed + - registered + - running + connectBuildsEnabled: + type: boolean + enum: + - false + - true + connectConfigurationId: + type: string + createdAt: + type: number + createdIn: + type: string + creator: + nullable: true + properties: + email: + type: string + githubLogin: + type: string + gitlabLogin: + type: string + uid: + type: string + username: + type: string + required: + - email + - uid + - username + type: object + deletedAt: + type: number + deploymentHostname: + type: string + forced: + type: boolean + enum: + - false + - true + name: + type: string + meta: + additionalProperties: + type: string + type: object + monorepoManager: + nullable: true + type: string + oidcTokenClaims: + properties: + iss: + type: string + sub: + type: string + scope: + type: string + aud: + type: string + owner: + type: string + owner_id: + type: string + project: + type: string + project_id: + type: string + environment: + type: string + custom_environment_id: + type: string + mfe_group_ids: + items: + type: string + type: array + plan: + type: string + required: + - aud + - environment + - iss + - owner + - owner_id + - project + - project_id + - scope + - sub + type: object + plan: + type: string + enum: + - enterprise + - hobby + - pro + previewCommentsEnabled: + type: boolean + enum: + - false + - true + description: Whether or not preview comments are enabled for the deployment + example: false + private: + type: boolean + enum: + - false + - true + readyAt: + type: number + readyState: + type: string + enum: + - BLOCKED + - BUILDING + - CANCELED + - ERROR + - INITIALIZING + - QUEUED + - READY + readySubstate: + type: string + enum: + - PROMOTED + - ROLLING + - STAGED + requestedAt: + type: number + target: + nullable: true + type: string + teamId: + nullable: true + type: string + type: + type: string + enum: + - LAMBDAS + url: + type: string + userId: + type: string + description: Present for user creators; omitted for app/integration/system creators. + withCache: + type: boolean + enum: + - false + - true + required: + - createdAt + - createdIn + - creator + - deploymentHostname + - id + - name + - plan + - private + - readyState + - type + - url + type: object + type: object + transferCompletedAt: + type: number + transferStartedAt: + type: number + transferToAccountId: + type: string + transferredFromAccountId: + type: string + trustedSources: + nullable: true + properties: + enableVercelCiSameRepository: + type: boolean + enum: + - false + - true + description: Allow same-team Vercel CI access to preview deployments built from the CI run's repository, using the deployment source rather than the current project repository link. Defaults to enabled when not stored; omitted or null Trusted Sources updates preserve the stored value. + projects: + additionalProperties: + properties: + label: + type: string + customAllow: + items: + properties: + from: + oneOf: + - properties: + slugs: + items: + type: string + type: array + description: System environment slugs (`production`, `preview`) and/or custom environment slugs defined on the referenced project. + preset: + type: string + enum: + - all-custom + required: + - slugs + type: object + description: The source envs on the trusted project that are allowed to access `to`. + - properties: + slugs: + items: + type: string + type: array + description: System environment slugs (`production`, `preview`) and/or custom environment slugs defined on the referenced project. + preset: + type: string + enum: + - all-custom + required: + - preset + type: object + description: The source envs on the trusted project that are allowed to access `to`. + to: + oneOf: + - properties: + slugs: + items: + type: string + type: array + description: System environment slugs (`production`, `preview`) and/or custom environment slugs defined on the referenced project. + preset: + type: string + enum: + - all-custom + required: + - slugs + type: object + description: The target envs on the current project that may be accessed. + - properties: + slugs: + items: + type: string + type: array + description: System environment slugs (`production`, `preview`) and/or custom environment slugs defined on the referenced project. + preset: + type: string + enum: + - all-custom + required: + - preset + type: object + description: The target envs on the current project that may be accessed. + required: + - from + - to + type: object + description: Optional overrides for the default same-env-by-slug matching. Provide explicit rules to allow cross-env access or presets. + type: array + description: Optional overrides for the default same-env-by-slug matching. Provide explicit rules to allow cross-env access or presets. + type: object + type: object + oidcProviders: + additionalProperties: + items: + properties: + to: + oneOf: + - properties: + slugs: + items: + type: string + type: array + description: System environment slugs (`production`, `preview`) and/or custom environment slugs defined on the referenced project. + preset: + type: string + enum: + - all-custom + required: + - slugs + type: object + description: The target envs on the current project that may be accessed. + - properties: + slugs: + items: + type: string + type: array + description: System environment slugs (`production`, `preview`) and/or custom environment slugs defined on the referenced project. + preset: + type: string + enum: + - all-custom + required: + - preset + type: object + description: The target envs on the current project that may be accessed. + label: + type: string + claims: + additionalProperties: + items: + type: string + type: array + type: object + required: + - claims + - to + type: object + type: array + type: object + type: object + updatedAt: + type: number + live: + type: boolean + enum: + - false + - true + hasActiveBranches: + type: boolean + enum: + - false + - true + gitComments: + properties: + onPullRequest: + type: boolean + enum: + - false + - true + description: Whether the Vercel bot should comment on PRs + onCommit: + type: boolean + enum: + - false + - true + description: Whether the Vercel bot should comment on commits + required: + - onCommit + - onPullRequest + type: object + gitProviderOptions: + properties: + createDeployments: + type: string + enum: + - disabled + - enabled + description: 'Whether the Vercel bot should automatically create GitHub deployments https://docs.github.com/en/rest/deployments/deployments#about-deployments NOTE: repository-dispatch events should be used instead' + disableRepositoryDispatchEvents: + type: boolean + enum: + - false + - true + description: 'Whether the Vercel bot should not automatically create GitHub repository-dispatch events on deployment events. https://vercel.com/docs/git/vercel-for-github#repository-dispatch-events - `true`: disable repository-dispatch events for this project (explicit override of the team setting). - `false`: enable repository-dispatch events for this project (explicit override of the team setting). - absent: inherit from `team.disableRepositoryDispatchEvents`.' + requireVerifiedCommits: + type: boolean + enum: + - false + - true + description: 'Whether the project requires commits to be signed & verified before deployments will be created. - `true`: require verified commits for this project (explicit override of the team setting). - `false`: do not require verified commits (explicit override of the team setting). - absent: inherit from `team.requireVerifiedCommits`.' + gitCommitStatus: + type: boolean + enum: + - false + - true + description: Whether Vercel should post commit statuses for this project. When omitted, commit statuses remain enabled. + consolidatedGitCommitStatus: + properties: + enabled: + type: boolean + enum: + - false + - true + description: Whether consolidated commit status is enabled. + propagateFailures: + type: boolean + enum: + - false + - true + description: Whether to propagate individual deployment failures to the consolidated status. + required: + - enabled + - propagateFailures + type: object + description: Configuration for consolidated git commit status reporting. When enabled, Vercel will post a single consolidated commit status instead of individual statuses for each deployment. + required: + - createDeployments + type: object + paused: + type: boolean + enum: + - false + - true + webAnalytics: + properties: + id: + type: string + disabledAt: + type: number + canceledAt: + type: number + enabledAt: + type: number + hasData: + type: boolean + enum: + - true + required: + - id + type: object + security: + properties: + attackModeEnabled: + type: boolean + enum: + - false + - true + attackModeUpdatedAt: + type: number + firewallEnabled: + type: boolean + enum: + - false + - true + firewallUpdatedAt: + type: number + attackModeActiveUntil: + nullable: true + type: number + firewallConfigVersion: + type: number + firewallRoutes: + items: + properties: + src: + oneOf: + - type: string + - properties: + re: + type: string + eq: + type: string + neq: + type: string + inc: + items: + type: string + type: array + ninc: + items: + type: string + type: array + pre: + type: string + suf: + type: string + gt: + type: number + gte: + type: number + lt: + type: number + lte: + type: number + list: + type: string + type: object + tierRequirement: + type: string + enum: + - advanced + - critical + - priority + has: + items: + properties: + type: + type: string + enum: + - cookie + - domain_environment + - environment + - header + - headers + - host + - initial_request_path + - ip_address + - method + - path + - protocol + - query + - region + - scheme + - trusted_source + key: + type: string + value: + oneOf: + - type: string + - properties: + re: + type: string + eq: + type: string + neq: + type: string + inc: + items: + type: string + type: array + ninc: + items: + type: string + type: array + pre: + type: string + suf: + type: string + gt: + type: number + gte: + type: number + lt: + type: number + lte: + type: number + list: + type: string + type: object + required: + - type + type: object + type: array + missing: + items: + properties: + type: + type: string + enum: + - cookie + - domain_environment + - environment + - header + - headers + - host + - initial_request_path + - ip_address + - method + - path + - protocol + - query + - region + - scheme + - trusted_source + key: + type: string + value: + oneOf: + - type: string + - properties: + re: + type: string + eq: + type: string + neq: + type: string + inc: + items: + type: string + type: array + ninc: + items: + type: string + type: array + pre: + type: string + suf: + type: string + gt: + type: number + gte: + type: number + lt: + type: number + lte: + type: number + list: + type: string + type: object + required: + - type + type: object + type: array + dest: + type: string + status: + type: number + handle: + type: string + enum: + - finalize + - init + mitigate: + properties: + action: + type: string + enum: + - bypass + - challenge + - deny + - log + - rate_limit + - redirect + rule_id: + type: string + ttl: + type: number + erl: + properties: + algo: + type: string + enum: + - fixed_window + - token_bucket + window: + type: number + limit: + type: number + keys: + items: + type: string + type: array + required: + - algo + - keys + - limit + - window + type: object + log_headers: + oneOf: + - items: + type: string + type: array + - type: string + enum: + - '*' + required: + - action + - rule_id + type: object + transforms: + items: + properties: + type: + type: string + enum: + - request.headers + op: + type: string + enum: + - append + target: + properties: + key: + type: string + required: + - key + type: object + args: + type: string + required: + - args + - op + - target + - type + type: object + type: array + type: object + type: array + rulesets: + additionalProperties: + properties: + action: + type: string + enum: + - allow + - bypass + - challenge + - deny + - log + - rate_limit + - redirect + rateLimit: + nullable: true + properties: + algo: + type: string + enum: + - fixed_window + - token_bucket + window: + type: number + limit: + type: number + keys: + items: + type: string + type: array + required: + - algo + - keys + - limit + - window + type: object + redirect: + nullable: true + properties: + location: + type: string + permanent: + type: boolean + enum: + - false + - true + required: + - location + - permanent + type: object + actionDuration: + nullable: true + type: string + bypassSystem: + nullable: true + type: boolean + enum: + - false + - true + - null + logHeaders: + oneOf: + - items: + type: string + type: array + - type: string + enum: + - '*' + required: + - action + type: object + type: object + firewallSeawallEnabled: + type: boolean + enum: + - false + - true + ja3Enabled: + type: boolean + enum: + - false + - true + ja4Enabled: + type: boolean + enum: + - false + - true + firewallBypassIps: + items: + type: string + type: array + managedRules: + nullable: true + properties: + vercel_ruleset: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - challenge + - deny + - log + required: + - active + type: object + traffic_sources: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - challenge + - deny + - log + required: + - active + type: object + bot_filter: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - challenge + - deny + - log + required: + - active + type: object + ai_bots: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - challenge + - deny + - log + required: + - active + type: object + owasp: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - challenge + - deny + - log + required: + - active + type: object + required: + - ai_bots + - bot_filter + - owasp + - traffic_sources + - vercel_ruleset + type: object + botIdEnabled: + type: boolean + enum: + - false + - true + requestLogsKey: + items: + type: string + type: array + log_headers: + oneOf: + - items: + type: string + type: array + - type: string + enum: + - '*' + securityPlus: + type: boolean + enum: + - false + - true + securityPlusMetadata: + properties: + updatedAt: + type: number + firstEnabledAt: + type: number + description: Timestamp when the feature was first enabled. Never changes after initial enablement. + required: + - updatedAt + type: object + pageIntegrityEnabled: + type: boolean + enum: + - false + - true + description: Whether Page Integrity is enabled for this project. Used by the metadata service to gate DynamoDB lookups against the page-integrity-inventory table. + type: object + oidcTokenConfig: + properties: + enabled: + type: boolean + enum: + - false + - true + description: Whether or not to generate OpenID Connect JSON Web Tokens. + issuerMode: + type: string + enum: + - global + - team + description: '- team: `https://oidc.vercel.com/[team_slug]` - global: `https://oidc.vercel.com`' + type: object + tier: + type: string + enum: + - advanced + - critical + - priority + abuse: + properties: + scanner: + type: string + history: + items: + properties: + scanner: + type: string + reason: + type: string + by: + type: string + byId: + type: string + at: + type: number + required: + - at + - by + - byId + - reason + - scanner + type: object + type: array + updatedAt: + type: number + block: + properties: + action: + type: string + enum: + - blocked + reason: + type: string + statusCode: + type: number + createdAt: + type: number + caseId: + type: string + actor: + type: string + comment: + type: string + ineligibleForAppeal: + type: boolean + enum: + - false + - true + isCascading: + type: boolean + enum: + - false + - true + required: + - action + - createdAt + - reason + - statusCode + type: object + blockHistory: + items: + oneOf: + - properties: + action: + type: string + enum: + - blocked + reason: + type: string + statusCode: + type: number + createdAt: + type: number + caseId: + type: string + actor: + type: string + comment: + type: string + ineligibleForAppeal: + type: boolean + enum: + - false + - true + isCascading: + type: boolean + enum: + - false + - true + required: + - action + - createdAt + - reason + - statusCode + type: object + - properties: + action: + type: string + enum: + - unblocked + createdAt: + type: number + caseId: + type: string + actor: + type: string + comment: + type: string + ineligibleForAppeal: + type: boolean + enum: + - false + - true + isCascading: + type: boolean + enum: + - false + - true + required: + - action + - createdAt + type: object + - properties: + action: + type: string + enum: + - route-blocked + route: + oneOf: + - properties: + src: + type: string + status: + type: number + expiry: + type: number + required: + - src + - status + type: object + - properties: + has: + items: + oneOf: + - properties: + type: + type: string + enum: + - header + key: + type: string + enum: + - x-vercel-ip-country + value: + properties: + eq: + type: string + required: + - eq + type: object + required: + - key + - type + - value + type: object + - properties: + type: + type: string + enum: + - host + value: + properties: + eq: + type: string + required: + - eq + type: object + required: + - type + - value + type: object + type: array + mitigate: + properties: + action: + type: string + enum: + - block_legal_cwc + required: + - action + type: object + src: + type: string + required: + - has + - mitigate + type: object + reason: + type: string + createdAt: + type: number + caseId: + type: string + actor: + type: string + comment: + type: string + ineligibleForAppeal: + type: boolean + enum: + - false + - true + isCascading: + type: boolean + enum: + - false + - true + required: + - action + - createdAt + - reason + - route + type: object + - properties: + action: + type: string + enum: + - route-unblocked + route: + oneOf: + - properties: + src: + type: string + status: + type: number + expiry: + type: number + required: + - src + - status + type: object + - properties: + has: + items: + oneOf: + - properties: + type: + type: string + enum: + - header + key: + type: string + enum: + - x-vercel-ip-country + value: + properties: + eq: + type: string + required: + - eq + type: object + required: + - key + - type + - value + type: object + - properties: + type: + type: string + enum: + - host + value: + properties: + eq: + type: string + required: + - eq + type: object + required: + - type + - value + type: object + type: array + mitigate: + properties: + action: + type: string + enum: + - block_legal_cwc + required: + - action + type: object + src: + type: string + required: + - has + - mitigate + type: object + statusCode: + type: number + createdAt: + type: number + caseId: + type: string + actor: + type: string + comment: + type: string + ineligibleForAppeal: + type: boolean + enum: + - false + - true + isCascading: + type: boolean + enum: + - false + - true + required: + - action + - createdAt + - route + type: object + type: array + interstitial: + type: boolean + enum: + - false + - true + interstitialHistory: + items: + properties: + action: + type: string + enum: + - add-deployment-interstitial + - add-project-interstitial + - remove-deployment-interstitial + - remove-project-interstitial + createdAt: + type: number + caseId: + type: string + reason: + type: string + actor: + type: string + comment: + type: string + required: + - action + - createdAt + type: object + type: array + required: + - history + - updatedAt + type: object + internalRoutes: + items: + oneOf: + - properties: + src: + type: string + status: + type: number + expiry: + type: number + required: + - src + - status + type: object + - properties: + has: + items: + oneOf: + - properties: + type: + type: string + enum: + - header + key: + type: string + enum: + - x-vercel-ip-country + value: + properties: + eq: + type: string + required: + - eq + type: object + required: + - key + - type + - value + type: object + - properties: + type: + type: string + enum: + - host + value: + properties: + eq: + type: string + required: + - eq + type: object + required: + - type + - value + type: object + type: array + mitigate: + properties: + action: + type: string + enum: + - block_legal_cwc + required: + - action + type: object + src: + type: string + required: + - has + - mitigate + type: object + type: array + required: + - accountId + - alias + - deploymentExpiration + - directoryListing + - id + - name + - nodeVersion + - resourceConfig + - serverlessFunctionRegion + type: object + type: array + pagination: + oneOf: + - properties: + count: + type: number + description: Amount of items in the current page. + example: 20 + next: + nullable: true + type: string + description: Continuation token that must be used to request the next page. Base32 encoded for safe URL transmission. + example: JBSWY3DPEHPK3PXP + required: + - count + - next + type: object + description: This object contains information related to the pagination of the current request using continuation tokens. Since CosmosDB doesn't support going to previous pages, only count and next are provided. + - $ref: '#/components/schemas/Pagination' + required: + - pagination + - projects + type: object + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '410': + description: '' + x-vercel-cli: + supportedSubcommands: true + supportedProduction: false + aliases: + - ls + - list + parameters: + - name: from + description: Query only projects updated after the given timestamp or continuation token. + in: query + schema: + description: Query only projects updated after the given timestamp or continuation token. + type: string + - name: gitForkProtection + description: Specifies whether PRs from Git forks should require a team member's authorization before it can be deployed + in: query + schema: + description: Specifies whether PRs from Git forks should require a team member's authorization before it can be deployed + type: string + enum: + - '1' + - '0' + example: '1' + - name: limit + description: Limit the number of projects returned + in: query + schema: + description: Limit the number of projects returned + type: string + - name: search + description: Search projects by the name field + in: query + schema: + description: Search projects by the name field + type: string + maxLength: 100 + - name: repo + description: Filter results by repo. Also used for project count + in: query + schema: + description: Filter results by repo. Also used for project count + type: string + - name: repoId + description: Filter results by Repository ID. + in: query + schema: + description: Filter results by Repository ID. + type: string + - name: repoUrl + description: Filter results by Repository URL. + in: query + schema: + description: Filter results by Repository URL. + type: string + example: https://github.com/vercel/next.js + - name: excludeRepos + description: Filter results by excluding those projects that belong to a repo + in: query + schema: + description: Filter results by excluding those projects that belong to a repo + type: string + - name: edgeConfigId + description: Filter results by connected Global Config ID + in: query + schema: + description: Filter results by connected Global Config ID + type: string + - name: edgeConfigTokenId + description: Filter results by connected Global Config Token ID + in: query + schema: + description: Filter results by connected Global Config Token ID + type: string + - name: deprecated + in: query + schema: + type: boolean + - name: elasticConcurrencyEnabled + description: Filter results by projects with elastic concurrency enabled + in: query + schema: + description: Filter results by projects with elastic concurrency enabled + type: string + enum: + - '1' + - '0' + example: '1' + - name: staticIpsEnabled + description: Filter results by projects with Static IPs enabled + in: query + schema: + description: Filter results by projects with Static IPs enabled + enum: + - '0' + - '1' + example: '1' + type: string + - name: buildMachineTypes + description: Filter results by effective build machine types. Accepts comma-separated values. Use "elastic" for projects with elastic selection and "default" for projects without a build machine type set. + in: query + schema: + description: Filter results by effective build machine types. Accepts comma-separated values. Use "elastic" for projects with elastic selection and "default" for projects without a build machine type set. + type: string + example: default,enhanced + - name: buildQueueConfiguration + description: Filter results by build queue configuration. SKIP_NAMESPACE_QUEUE includes projects without a configuration set. + in: query + schema: + description: Filter results by build queue configuration. SKIP_NAMESPACE_QUEUE includes projects without a configuration set. + type: string + enum: + - SKIP_NAMESPACE_QUEUE + - WAIT_FOR_NAMESPACE_QUEUE + example: SKIP_NAMESPACE_QUEUE + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + /v1/projects/traces: + get: + description: Returns the OTEL trace for a given Vercel CLI request. + operationId: getProjectTrace + security: + - bearerToken: [] + summary: Get a project trace by request ID + tags: + - projects + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + trace: + properties: + traceId: + type: string + resources: items: - $ref: '#/components/schemas/ACLAction' + properties: + name: + type: string + attributes: + additionalProperties: + type: string + type: object + required: + - attributes + - name + type: object type: array - sharedEnvVarConnection: + spans: items: - $ref: '#/components/schemas/ACLAction' - type: array - type: object - lastRollbackTarget: - nullable: true - type: object - lastAliasRequest: - nullable: true - properties: - fromDeploymentId: - type: string - toDeploymentId: - type: string - jobStatus: - type: string - enum: - - succeeded - - failed - - skipped - - pending - - in-progress - requestedAt: - type: number - type: - type: string - enum: - - promote - - rollback - required: - - fromDeploymentId - - toDeploymentId - - jobStatus - - requestedAt - - type - type: object - hasFloatingAliases: - type: boolean - protectionBypass: - additionalProperties: - properties: - createdAt: - type: number - createdBy: - type: string - scope: - type: string - enum: - - automation-bypass - required: - - createdAt - - createdBy - - scope - type: object - type: object - hasActiveBranches: - type: boolean - trustedIps: - nullable: true - oneOf: - - properties: - deploymentType: - type: string - enum: - - all - - preview - - prod_deployment_urls_and_all_previews - - production - addresses: - items: + properties: + name: + type: string + kind: + type: number + resource: + type: string + library: properties: - value: + name: type: string - note: + version: type: string required: - - value + - name type: object - type: array - protectionMode: - type: string - enum: - - additional - - exclusive - required: - - deploymentType - - addresses - - protectionMode - type: object - - properties: - deploymentType: - type: string - enum: - - all - - preview - - prod_deployment_urls_and_all_previews - - production - required: - - deploymentType - type: object - gitComments: - properties: - onPullRequest: - type: boolean - description: Whether the Vercel bot should comment on PRs - onCommit: - type: boolean - description: Whether the Vercel bot should comment on commits + spanId: + type: string + parentSpanId: + type: string + status: + properties: + code: + type: number + message: + type: string + required: + - code + type: object + traceState: + type: string + traceFlags: + type: number + attributes: + additionalProperties: true + type: object + links: + items: + additionalProperties: true + type: object + type: array + events: + items: + properties: + name: + type: string + timestamp: + items: + oneOf: + - type: number + - type: number + maxItems: 2 + minItems: 2 + type: array + attributes: + additionalProperties: true + type: object + required: + - attributes + - name + - timestamp + type: object + type: array + startTime: + items: + oneOf: + - type: number + - type: number + maxItems: 2 + minItems: 2 + type: array + endTime: + items: + oneOf: + - type: number + - type: number + maxItems: 2 + minItems: 2 + type: array + duration: + items: + oneOf: + - type: number + - type: number + maxItems: 2 + minItems: 2 + type: array + required: + - attributes + - duration + - endTime + - events + - kind + - library + - links + - name + - resource + - spanId + - startTime + - status + - traceFlags + type: object + type: array + rootSpanId: + type: string required: - - onPullRequest - - onCommit + - spans + - traceId type: object - paused: - type: boolean required: - - accountId - - directoryListing - - id - - name - - nodeVersion + - trace type: object '400': - description: |- - One of the provided values in the request body is invalid. - One of the provided values in the request query is invalid. + description: One of the provided values in the request query is invalid. '401': - description: '' + description: The request is not authorized. '403': description: You do not have permission to access this resource. '404': description: '' + '410': + description: '' parameters: - name: projectId - description: The unique project identifier - in: path + description: The project ID + in: query required: true schema: - example: prj_12HKQaOmR5t5Uy6vdcQsNIiZgHGB - description: The unique project identifier + description: The project ID type: string - - description: The Team identifier or slug to perform the request on behalf of. + example: prj_123 + maxLength: 150 + - name: requestId + description: The Vercel CLI request ID associated with the trace in: query - name: teamId required: true schema: + description: The Vercel CLI request ID associated with the trace type: string - requestBody: - content: - application/json: - schema: - type: object - properties: - disabled: - type: boolean - example: true - description: 'Enable or disable data cache for the project - default: false' - /v9/projects: - get: - description: Allows to retrieve the list of projects of the authenticated user or team. The list will be paginated and the provided query parameters allow filtering the returned projects. - operationId: getProjects + example: cli-req-abc + maxLength: 256 + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + /v11/projects: + post: + description: Allows to create a new project with the provided configuration. It only requires the project `name` but more configuration can be provided to override the defaults. + operationId: createProject security: - bearerToken: [] - summary: Retrieve a list of projects + summary: Create a new project tags: - projects responses: '200': - description: The paginated list of projects + description: The project was successfuly created content: application/json: schema: properties: - projects: + accountId: + type: string + creator: + properties: + type: + type: string + enum: + - user + via: + nullable: true + oneOf: + - properties: + type: + type: string + enum: + - app + app: + properties: + id: + type: string + description: The internal ID of the Vercel App backing this principal. + clientId: + type: string + description: The protocol-facing OAuth client ID. This may differ from {@link id} when Client ID Metadata Documents (CIMD) are used. + required: + - id + type: object + required: + - app + - type + type: object + description: Set when a Vercel App or Integration acts on behalf of a {@link User}. Captures user-consented OAuth delegation that the ACL layer may inspect to evaluate scope restrictions. This is NOT for impersonation or token-exchange provenance — those live on `auth.token`, not on the principal. + - properties: + type: + type: string + enum: + - integration + integration: + properties: + integrationId: + type: string + configurationId: + type: string + required: + - configurationId + - integrationId + type: object + required: + - integration + - type + type: object + description: Set when a Vercel App or Integration acts on behalf of a {@link User}. Captures user-consented OAuth delegation that the ACL layer may inspect to evaluate scope restrictions. This is NOT for impersonation or token-exchange provenance — those live on `auth.token`, not on the principal. + user: + properties: + id: + type: string + required: + - id + type: object + app: + properties: + id: + type: string + description: The internal ID of the Vercel App backing this principal. + clientId: + type: string + description: The protocol-facing OAuth client ID. This may differ from {@link id} when Client ID Metadata Documents (CIMD) are used. + required: + - id + type: object + integration: + properties: + integrationId: + type: string + configurationId: + type: string + required: + - configurationId + - integrationId + type: object + required: + - type + - user + - via + - app + - integration + type: object + alias: items: properties: - accountId: + configuredBy: + nullable: true type: string - analytics: + enum: + - A + - CNAME + - dns-01 + - http + - null + configuredChangedAt: + nullable: true + type: number + createdAt: + nullable: true + type: number + deployment: + nullable: true properties: id: type: string - canceledAt: + alias: + items: + type: string + type: array + aliasAssigned: nullable: true + oneOf: + - type: number + - type: boolean + enum: + - false + - true + aliasError: + nullable: true + properties: + code: + type: string + message: + type: string + required: + - code + - message + type: object + aliasFinal: + nullable: true + type: string + automaticAliases: + items: + type: string + type: array + branchMatcher: + properties: + type: + type: string + enum: + - endsWith + - equals + - startsWith + description: The type of matching to perform + pattern: + type: string + description: The pattern to match against branch names + required: + - pattern + - type + type: object + buildingAt: type: number - disabledAt: - type: number - enabledAt: - type: number - paidAt: + builds: + items: + properties: + use: + type: string + src: + type: string + dest: + type: string + required: + - use + type: object + type: array + checksConclusion: + type: string + enum: + - canceled + - failed + - skipped + - succeeded + checksState: + type: string + enum: + - completed + - registered + - running + connectBuildsEnabled: + type: boolean + enum: + - false + - true + connectConfigurationId: + type: string + createdAt: type: number - sampleRatePercent: + createdIn: + type: string + creator: nullable: true + properties: + email: + type: string + githubLogin: + type: string + gitlabLogin: + type: string + uid: + type: string + username: + type: string + required: + - email + - uid + - username + type: object + deletedAt: type: number - spendLimitInDollars: + deploymentHostname: + type: string + forced: + type: boolean + enum: + - false + - true + name: + type: string + meta: + additionalProperties: + type: string + type: object + monorepoManager: nullable: true + type: string + oidcTokenClaims: + properties: + iss: + type: string + sub: + type: string + scope: + type: string + aud: + type: string + owner: + type: string + owner_id: + type: string + project: + type: string + project_id: + type: string + environment: + type: string + custom_environment_id: + type: string + mfe_group_ids: + items: + type: string + type: array + plan: + type: string + required: + - aud + - environment + - iss + - owner + - owner_id + - project + - project_id + - scope + - sub + type: object + plan: + type: string + enum: + - enterprise + - hobby + - pro + previewCommentsEnabled: + type: boolean + enum: + - false + - true + description: Whether or not preview comments are enabled for the deployment + example: false + private: + type: boolean + enum: + - false + - true + readyAt: + type: number + readyState: + type: string + enum: + - BLOCKED + - BUILDING + - CANCELED + - ERROR + - INITIALIZING + - QUEUED + - READY + readySubstate: + type: string + enum: + - PROMOTED + - ROLLING + - STAGED + requestedAt: type: number + target: + nullable: true + type: string + teamId: + nullable: true + type: string + type: + type: string + enum: + - LAMBDAS + url: + type: string + userId: + type: string + description: Present for user creators; omitted for app/integration/system creators. + withCache: + type: boolean + enum: + - false + - true required: + - createdAt + - createdIn + - creator + - deploymentHostname - id - - canceledAt - - disabledAt - - enabledAt + - name + - plan + - private + - readyState + - type + - url type: object - autoExposeSystemEnvs: - type: boolean - autoAssignCustomDomains: - type: boolean - autoAssignCustomDomainsUpdatedBy: + domain: type: string - buildCommand: + environment: + type: string + enum: + - preview + - production + gitBranch: nullable: true type: string - commandForIgnoringBuildStep: + redirect: nullable: true type: string - connectConfigurationId: + redirectStatusCode: nullable: true + type: number + enum: + - 301 + - 302 + - 307 + - 308 + - null + target: type: string - connectBuildsEnabled: + enum: + - PREVIEW + - PRODUCTION + - STAGING + required: + - deployment + - domain + - environment + - target + type: object + type: array + analytics: + properties: + id: + type: string + canceledAt: + nullable: true + type: number + disabledAt: + type: number + enabledAt: + type: number + paidAt: + type: number + sampleRatePercent: + nullable: true + type: number + spendLimitInDollars: + nullable: true + type: number + required: + - disabledAt + - enabledAt + - id + type: object + appliedCve55182Migration: + type: boolean + enum: + - false + - true + speedInsights: + properties: + id: + type: string + enabledAt: + type: number + disabledAt: + type: number + canceledAt: + type: number + hasData: + type: boolean + enum: + - false + - true + dataReceivedAt: + type: number + description: When the first free (not Speed Insights Plus) production data point was observed, in ms. Set once by subscriber-analytics-events; projects that already had data before this field shipped get it backfilled on their next batch, so it reads "first free data point observed", not necessarily "first ever". + paidAt: + type: number + required: + - id + type: object + autoExposeSystemEnvs: + type: boolean + enum: + - false + - true + autoAssignCustomDomains: + type: boolean + enum: + - false + - true + autoAssignCustomDomainsUpdatedBy: + type: string + buildCommand: + nullable: true + type: string + commandForIgnoringBuildStep: + nullable: true + type: string + connectConfigurations: + nullable: true + items: + properties: + envId: + oneOf: + - type: string + - type: string + enum: + - preview + - production + connectConfigurationId: + type: string + dc: + type: string + passive: type: boolean - createdAt: - type: number - customerSupportCodeVisibility: + enum: + - false + - true + buildsEnabled: type: boolean - crons: - properties: - enabledAt: - type: number - description: 'The time the feature was enabled for this project. Note: It enables automatically with the first Deployment that outputs cronjobs.' - disabledAt: - nullable: true - type: number - description: The time the feature was disabled for this project. - updatedAt: - type: number - deploymentId: - nullable: true - type: string - description: The ID of the Deployment from which the definitions originated. - definitions: + enum: + - false + - true + aws: + properties: + subnetIds: items: - properties: - host: - type: string - description: The hostname that should be used. - example: vercel.com - path: - type: string - description: The path that should be called for the cronjob. - example: /api/crons/sync-something?hello=world - schedule: - type: string - description: The cron expression. - example: 0 0 * * * - required: - - host - - path - - schedule - type: object + type: string type: array + securityGroupId: + type: string required: - - enabledAt - - disabledAt - - updatedAt - - deploymentId - - definitions + - subnetIds type: object - dataCache: + createdAt: + type: number + updatedAt: + type: number + required: + - buildsEnabled + - connectConfigurationId + - createdAt + - envId + - passive + - updatedAt + type: object + type: array + connectConfigurationId: + nullable: true + type: string + connectBuildsEnabled: + type: boolean + enum: + - false + - true + passiveConnectConfigurationId: + nullable: true + type: string + createdAt: + type: number + customerSupportCodeVisibility: + type: boolean + enum: + - false + - true + crons: + properties: + enabledAt: + type: number + description: 'The time the feature was enabled for this project. Note: It enables automatically with the first Deployment that outputs cronjobs.' + disabledAt: + nullable: true + type: number + description: The time the feature was disabled for this project. + updatedAt: + type: number + deploymentId: + nullable: true + type: string + description: The ID of the Deployment from which the definitions originated. + definitions: + items: properties: - userDisabled: - type: boolean - storageSizeBytes: - nullable: true - type: number - unlimited: - type: boolean - required: - - userDisabled - type: object - devCommand: - nullable: true - type: string - directoryListing: - type: boolean - installCommand: - nullable: true - type: string - env: - items: - properties: - target: - oneOf: - - items: - type: string - enum: - - production - - preview - - development - - preview - - development - type: array - - type: string - enum: - - production - - preview - - development - - preview - - development - type: - type: string - enum: - - secret - - system - - encrypted - - plain - - sensitive - id: - type: string - key: - type: string - value: - type: string - configurationId: - nullable: true - type: string - createdAt: - type: number - updatedAt: - type: number - createdBy: - nullable: true - type: string - updatedBy: - nullable: true - type: string - gitBranch: - type: string - edgeConfigId: - nullable: true - type: string - edgeConfigTokenId: - nullable: true - type: string - contentHint: - nullable: true - oneOf: - - properties: - type: - type: string - enum: - - redis-url - storeId: - type: string - required: - - type - - storeId - type: object - - properties: - type: - type: string - enum: - - redis-rest-api-url - storeId: - type: string - required: - - type - - storeId - type: object - - properties: - type: - type: string - enum: - - redis-rest-api-token - storeId: - type: string - required: - - type - - storeId - type: object - - properties: - type: - type: string - enum: - - redis-rest-api-read-only-token - storeId: - type: string - required: - - type - - storeId - type: object - - properties: - type: - type: string - enum: - - blob-read-write-token - storeId: - type: string - required: - - type - - storeId - type: object - - properties: - type: - type: string - enum: - - postgres-url - storeId: - type: string - required: - - type - - storeId - type: object - - properties: - type: - type: string - enum: - - postgres-url-non-pooling - storeId: - type: string - required: - - type - - storeId - type: object - - properties: - type: - type: string - enum: - - postgres-prisma-url - storeId: - type: string - required: - - type - - storeId - type: object - - properties: - type: - type: string - enum: - - postgres-user - storeId: - type: string - required: - - type - - storeId - type: object - - properties: - type: - type: string - enum: - - postgres-host - storeId: - type: string - required: - - type - - storeId - type: object - - properties: - type: - type: string - enum: - - postgres-password - storeId: - type: string - required: - - type - - storeId - type: object - - properties: - type: - type: string - enum: - - postgres-database - storeId: - type: string - required: - - type - - storeId - type: object - decrypted: + host: + type: string + description: The hostname that should be used. + example: vercel.com + path: + type: string + description: The path that should be called for the cronjob. + example: /api/crons/sync-something?hello=world + schedule: + type: string + description: The cron expression. + example: 0 0 * * * + source: + type: string + enum: + - api + description: The origin of this definition. 'api' means created via the API. Undefined means it originated from a deployment (vercel.json). + description: + type: string + description: A human-readable description of what this cron job does. + hostInferred: + type: boolean + enum: + - false + - true + description: Whether the host was inferred from the production deployment URL rather than explicitly provided. + required: + - host + - path + - schedule + type: object + type: array + required: + - definitions + - deploymentId + - disabledAt + - enabledAt + - updatedAt + type: object + dataCache: + properties: + userDisabled: + type: boolean + enum: + - false + - true + storageSizeBytes: + nullable: true + type: number + unlimited: + type: boolean + enum: + - false + - true + required: + - userDisabled + type: object + deploymentExpiration: + properties: + expirationDays: + type: number + description: Number of days to keep non-production deployments (mostly preview deployments) before soft deletion. + expirationDaysProduction: + type: number + description: Number of days to keep production deployments before soft deletion. + expirationDaysCanceled: + type: number + description: Number of days to keep canceled deployments before soft deletion. + expirationDaysErrored: + type: number + description: Number of days to keep errored deployments before soft deletion. + deploymentsToKeep: + type: number + description: Minimum number of production deployments to keep for this project, even if they are over the production expiration limit. + type: object + description: Retention policies for deployments. These are enforced at the project level, but we also maintain an instance of this at the team level as a default policy that gets applied to new projects. + expiration: + properties: + expiresAt: + type: number + description: Unix ms timestamp when the project is scheduled to expire. + lockedAt: + type: number + description: Unix ms timestamp when the project was locked. + lockedBy: + type: string + description: userId of the actor that triggered the lock (system or admin). + required: + - expiresAt + - lockedAt + - lockedBy + type: object + devCommand: + nullable: true + type: string + directoryListing: + type: boolean + enum: + - false + - true + installCommand: + nullable: true + type: string + env: + items: + properties: + target: + oneOf: + - items: + type: string + enum: + - development + - development + - preview + - preview + - production + type: array + - type: string + enum: + - development + - development + - preview + - preview + - production + type: + type: string + enum: + - encrypted + - plain + - secret + - sensitive + - system + sunsetSecretId: + type: string + description: This is used to identify variables that have been migrated from type secret to sensitive. + legacyValue: + type: string + description: Legacy now-encryption ciphertext, present after migration swaps value/vsmValue + decrypted: + type: boolean + enum: + - false + - true + value: + type: string + vsmValue: + type: string + id: + type: string + key: + type: string + configurationId: + nullable: true + type: string + createdAt: + type: number + updatedAt: + type: number + createdBy: + nullable: true + type: string + updatedBy: + nullable: true + type: string + gitBranch: + type: string + visibility: + type: string + enum: + - config + - secret + description: User-facing config/secret model. When set, authoritative for new code paths when the env-var-config-secret-ui flag is enabled. Legacy rows omit this field; legacy rows omit it and callers fall back to existing `type` behavior. + edgeConfigId: + nullable: true + type: string + edgeConfigTokenId: + nullable: true + type: string + contentHint: + nullable: true + oneOf: + - properties: + type: + type: string + enum: + - redis-url + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - redis-rest-api-url + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - redis-rest-api-token + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - redis-rest-api-read-only-token + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - blob-read-write-token + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - blob-store-id + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - blob-webhook-public-key + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - postgres-url + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - postgres-url-non-pooling + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - postgres-prisma-url + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - postgres-user + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - postgres-host + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - postgres-password + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - postgres-database + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - postgres-url-no-ssl + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - integration-store-secret + storeId: + type: string + integrationId: + type: string + integrationProductId: + type: string + integrationConfigurationId: + type: string + required: + - integrationConfigurationId + - integrationId + - integrationProductId + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - flags-connection-string + projectId: + type: string + required: + - projectId + - type + type: object + internalContentHint: + nullable: true + properties: + type: + type: string + enum: + - flags-secret + encryptedValue: + type: string + description: Contains the `value` of the env variable, encrypted with a special key to make decryption possible in the subscriber Lambda. + required: + - encryptedValue + - type + type: object + description: Similar to `contentHints`, but should not be exposed to the user. + comment: + type: string + customEnvironmentIds: + items: + type: string + type: array + required: + - key + - type + - value + type: object + type: array + customEnvironments: + items: + properties: + id: + type: string + description: 'Unique identifier for the custom environment (format: env_*)' + slug: + type: string + description: URL-friendly name of the environment + type: + type: string + enum: + - development + - preview + - production + description: The type of environment (production, preview, or development) + description: + type: string + description: Optional description of the environment's purpose + branchMatcher: + properties: + type: + type: string + enum: + - endsWith + - equals + - startsWith + description: The type of matching to perform + pattern: + type: string + description: The pattern to match against branch names + required: + - pattern + - type + type: object + description: Configuration for matching git branches to this environment + domains: + items: + properties: + name: + type: string + apexName: + type: string + projectId: + type: string + redirect: + nullable: true + type: string + redirectStatusCode: + nullable: true + type: number + enum: + - 301 + - 302 + - 307 + - 308 + - null + gitBranch: + nullable: true + type: string + customEnvironmentId: + nullable: true + type: string + updatedAt: + type: number + createdAt: + type: number + verified: type: boolean - description: Whether `value` is decrypted. + enum: + - false + - true + description: '`true` if the domain is verified for use with the project. If `false` it will not be used as an alias on this project until the challenge in `verification` is completed.' + verification: + items: + properties: + type: + type: string + domain: + type: string + value: + type: string + reason: + type: string + required: + - domain + - reason + - type + - value + type: object + description: 'A list of verification challenges, one of which must be completed to verify the domain for use on the project. After the challenge is complete `POST /projects/:idOrName/domains/:domain/verify` to verify the domain. Possible challenges: - If `verification.type = TXT` the `verification.domain` will be checked for a TXT record matching `verification.value`.' + type: array + description: 'A list of verification challenges, one of which must be completed to verify the domain for use on the project. After the challenge is complete `POST /projects/:idOrName/domains/:domain/verify` to verify the domain. Possible challenges: - If `verification.type = TXT` the `verification.domain` will be checked for a TXT record matching `verification.value`.' required: - - type - - key - - value + - apexName + - name + - projectId + - verified type: object + description: List of domains associated with this environment + type: array + description: List of domains associated with this environment + currentDeploymentAliases: + items: + type: string type: array + description: List of aliases for the current deployment + createdAt: + type: number + description: Timestamp when the environment was created + updatedAt: + type: number + description: Timestamp when the environment was last updated + required: + - createdAt + - id + - slug + - type + - updatedAt + type: object + description: Internal representation of a custom environment with all required properties + type: array + framework: + nullable: true + type: string + enum: + - actix-web + - angular + - ash + - astro + - axum + - blitzjs + - brunch + - bun + - container + - create-react-app + - django + - docusaurus + - docusaurus-2 + - dojo + - eleventy + - elysia + - ember + - eve + - express + - factory-eve + - fastapi + - fasthtml + - fastify + - flask + - gatsby + - go + - gridsome + - h3 + - hexo + - hono + - hugo + - hydrogen + - ionic-angular + - ionic-react + - jekyll + - koa + - mastra + - middleman + - nestjs + - nextjs + - nitro + - node + - nuxtjs + - parcel + - polymer + - preact + - python + - react-router + - redwoodjs + - remix + - ruby + - rust + - saber + - sanity + - sanity-v2 + - sapper + - scully + - services + - solidstart + - solidstart-1 + - stencil + - storybook + - svelte + - sveltekit + - sveltekit-1 + - tanstack-start + - tanstack-start-lovable + - umijs + - vite + - vitepress + - vue + - vuepress + - xmcp + - zola + - null + services: + items: + properties: + serviceName: + type: string + description: Service name from the deployment (Service.name). + serviceType: + type: string + enum: + - cron + - job + - web + - worker + description: Service kind (Service.type). Omitted for schemas that do not define one. framework: - nullable: true type: string enum: - - blitzjs - - nextjs - - gatsby - - remix + - actix-web + - angular + - ash - astro - - hexo - - eleventy - - docusaurus-2 + - axum + - blitzjs + - brunch + - bun + - container + - create-react-app + - django - docusaurus - - preact - - solidstart + - docusaurus-2 - dojo + - eleventy + - elysia - ember - - vue - - scully - - ionic-angular - - angular - - polymer - - svelte - - sveltekit - - sveltekit-1 - - ionic-react - - create-react-app + - eve + - express + - factory-eve + - fastapi + - fasthtml + - fastify + - flask + - gatsby + - go - gridsome - - umijs - - sapper - - saber - - stencil - - nuxtjs - - redwoodjs + - h3 + - hexo + - hono - hugo + - hydrogen + - ionic-angular + - ionic-react - jekyll - - brunch + - koa + - mastra - middleman - - zola - - hydrogen + - nestjs + - nextjs + - nitro + - node + - nuxtjs + - parcel + - polymer + - preact + - python + - react-router + - redwoodjs + - remix + - ruby + - rust + - saber + - sanity + - sanity-v2 + - sapper + - scully + - services + - solidstart + - solidstart-1 + - stencil + - storybook + - svelte + - sveltekit + - sveltekit-1 + - tanstack-start + - tanstack-start-lovable + - umijs - vite - vitepress + - vue - vuepress - - parcel - - sanity - - storybook - gitForkProtection: - type: boolean - gitLFS: + - xmcp + - zola + description: Framework slug, when the service has one (omitted otherwise). + runtime: + type: string + description: Generic runtime, e.g. 'node' | 'python' | 'go' | 'ruby' | 'rust' (Service.runtime). Omitted for static builds. + required: + - serviceName + type: object + type: array + gitForkProtection: + type: boolean + enum: + - false + - true + gitLFS: + type: boolean + enum: + - false + - true + id: + type: string + ipBuckets: + items: + properties: + bucket: + type: string + default: type: boolean + enum: + - false + - true + supportUntil: + type: number + required: + - bucket + type: object + type: array + jobs: + properties: + lint: + properties: + targets: + items: + type: string + type: array + required: + - targets + type: object + typecheck: + properties: + targets: + items: + type: string + type: array + required: + - targets + type: object + mfe-config-present: + properties: + targets: + items: + type: string + type: array + required: + - targets + type: object + type: object + latestDeployments: + items: + properties: id: type: string - latestDeployments: + alias: + items: + type: string + type: array + aliasAssigned: + nullable: true + oneOf: + - type: number + - type: boolean + enum: + - false + - true + aliasError: + nullable: true + properties: + code: + type: string + message: + type: string + required: + - code + - message + type: object + aliasFinal: + nullable: true + type: string + automaticAliases: + items: + type: string + type: array + branchMatcher: + properties: + type: + type: string + enum: + - endsWith + - equals + - startsWith + description: The type of matching to perform + pattern: + type: string + description: The pattern to match against branch names + required: + - pattern + - type + type: object + buildingAt: + type: number + builds: items: properties: - alias: - items: - type: string - type: array - aliasAssigned: - nullable: true - oneOf: - - type: number - - type: boolean - aliasError: - nullable: true - properties: - code: - type: string - message: - type: string - required: - - code - - message - type: object - aliasFinal: - nullable: true - type: string - automaticAliases: - items: - type: string - type: array - builds: - items: - properties: - use: - type: string - src: - type: string - dest: - type: string - required: - - use - type: object - type: array - connectBuildsEnabled: - type: boolean - connectConfigurationId: - type: string - createdAt: - type: number - createdIn: - type: string - creator: - nullable: true - properties: - email: - type: string - githubLogin: - type: string - gitlabLogin: - type: string - uid: - type: string - username: - type: string - required: - - email - - uid - - username - type: object - deploymentHostname: - type: string - name: - type: string - forced: - type: boolean - id: - type: string - meta: - additionalProperties: - type: string - type: object - monorepoManager: - nullable: true - type: string - plan: - type: string - enum: - - pro - - enterprise - - hobby - - oss - private: - type: boolean - readyState: - type: string - enum: - - BUILDING - - ERROR - - INITIALIZING - - QUEUED - - READY - - CANCELED - readySubstate: - type: string - enum: - - STAGED - - PROMOTED - requestedAt: - type: number - target: - nullable: true - type: string - teamId: - nullable: true - type: string - type: - type: string - enum: - - LAMBDAS - url: + use: type: string - userId: + src: type: string - withCache: - type: boolean - checksConclusion: + dest: type: string - enum: - - succeeded - - failed - - skipped - - canceled - checksState: + required: + - use + type: object + type: array + checksConclusion: + type: string + enum: + - canceled + - failed + - skipped + - succeeded + checksState: + type: string + enum: + - completed + - registered + - running + connectBuildsEnabled: + type: boolean + enum: + - false + - true + connectConfigurationId: + type: string + createdAt: + type: number + createdIn: + type: string + creator: + nullable: true + properties: + email: + type: string + githubLogin: + type: string + gitlabLogin: + type: string + uid: + type: string + username: + type: string + required: + - email + - uid + - username + type: object + deletedAt: + type: number + deploymentHostname: + type: string + forced: + type: boolean + enum: + - false + - true + name: + type: string + meta: + additionalProperties: + type: string + type: object + monorepoManager: + nullable: true + type: string + oidcTokenClaims: + properties: + iss: + type: string + sub: + type: string + scope: + type: string + aud: + type: string + owner: + type: string + owner_id: + type: string + project: + type: string + project_id: + type: string + environment: + type: string + custom_environment_id: + type: string + mfe_group_ids: + items: type: string - enum: - - registered - - running - - completed - readyAt: - type: number - buildingAt: - type: number - previewCommentsEnabled: - type: boolean - description: Whether or not preview comments are enabled for the deployment - example: false - required: - - createdAt - - createdIn - - creator - - deploymentHostname - - name - - id - - plan - - private - - readyState - - type - - url - - userId - type: object - type: array - link: - oneOf: - - properties: - org: - type: string - repo: - type: string - repoId: - type: number - type: - type: string - enum: - - github - createdAt: - type: number - deployHooks: - items: - properties: - createdAt: - type: number - id: - type: string - name: - type: string - ref: - type: string - url: - type: string - required: - - id - - name - - ref - - url - type: object - type: array - gitCredentialId: - type: string - updatedAt: - type: number - sourceless: - type: boolean - productionBranch: - type: string - required: - - deployHooks - type: object - - properties: - projectId: - type: string - projectName: - type: string - projectNameWithNamespace: - type: string - projectNamespace: - type: string - projectUrl: - type: string + type: array + plan: + type: string + required: + - aud + - environment + - iss + - owner + - owner_id + - project + - project_id + - scope + - sub + type: object + plan: + type: string + enum: + - enterprise + - hobby + - pro + previewCommentsEnabled: + type: boolean + enum: + - false + - true + description: Whether or not preview comments are enabled for the deployment + example: false + private: + type: boolean + enum: + - false + - true + readyAt: + type: number + readyState: + type: string + enum: + - BLOCKED + - BUILDING + - CANCELED + - ERROR + - INITIALIZING + - QUEUED + - READY + readySubstate: + type: string + enum: + - PROMOTED + - ROLLING + - STAGED + requestedAt: + type: number + target: + nullable: true + type: string + teamId: + nullable: true + type: string + type: + type: string + enum: + - LAMBDAS + url: + type: string + userId: + type: string + description: Present for user creators; omitted for app/integration/system creators. + withCache: + type: boolean + enum: + - false + - true + required: + - createdAt + - createdIn + - creator + - deploymentHostname + - id + - name + - plan + - private + - readyState + - type + - url + type: object + type: array + link: + properties: + org: + type: string + repoOwnerId: + type: number + description: A new field, should be included in all new project links, is being added just in time when a deployment is created. This is needed for Protected Git scopes. + repo: + type: string + repoId: + type: number + type: + type: string + enum: + - github + createdAt: + type: number + deployHooks: + items: + properties: + createdAt: + type: number + id: + type: string + name: + type: string + ref: + type: string + url: + type: string + required: + - id + - name + - ref + - url + type: object + type: array + gitCredentialId: + type: string + updatedAt: + type: number + sourceless: + type: boolean + enum: + - false + - true + productionBranch: + type: string + host: + type: string + projectId: + type: string + projectName: + type: string + projectNameWithNamespace: + type: string + projectNamespace: + type: string + projectOwnerId: + type: number + description: A new field, should be included in all new project links, is being added just in time when a deployment is created. This is needed for Protected Git scopes. This is the id of the top level group that a namespace belongs to. Gitlab supports group nesting (up to 20 levels). + projectUrl: + type: string + name: + type: string + slug: + type: string + owner: + type: string + uuid: + type: string + workspaceUuid: + type: string + ownerId: + type: string + description: Origin namespace id (`ns_…`) of the owner. + required: + - deployHooks + - gitCredentialId + - org + - productionBranch + - type + - host + - projectId + - projectName + - projectNameWithNamespace + - projectNamespace + - projectUrl + - name + - owner + - slug + - uuid + - workspaceUuid + - repo + - repoId + - ownerId + type: object + blobs: + properties: + isDefaultApp: + type: boolean + enum: + - false + - true + description: Marks the team-level, Vercel-managed default blob project (`vercel-blob-default-project`) that orphan blob stores are scoped to when connected without an explicit project. Set only by internal storage flows and immutable after creation — guards rely on it to protect the connected stores from being lost when the project is deleted or transferred. + type: object + microfrontends: + properties: + isDefaultApp: + type: boolean + enum: + - true + updatedAt: + type: number + description: Timestamp when the microfrontends settings were last updated. + groupIds: + type: array + items: + type: string + minItems: 1 + description: The group IDs of microfrontends that this project belongs to. Each microfrontend project must belong to a microfrontends group that is the set of microfrontends that are used together. + enabled: + type: boolean + enum: + - true + description: Whether microfrontends are enabled for this project. + defaultRoute: + type: string + description: A path that is used to take screenshots and as the default path in preview links when a domain for this microfrontend is shown in the UI. Includes the leading slash, e.g. `/docs` + freeProjectForLegacyLimits: + type: boolean + enum: + - false + - true + description: Whether the project was part of the legacy limits for hobby and pro-trial before billing was added. This field is only set when the team is upgraded to a paid plan and we are backfilling the subscription status. We cap the subscription to 2 projects and set this field for the 3rd project. When this field is set, the project is not charged for and we do not call any billing APIs for this project. + routeObservabilityToThisProject: + type: boolean + enum: + - false + - true + description: Whether observability data should be routed to this microfrontend project or a root project. + doNotRouteWithMicrofrontendsRouting: + type: boolean + enum: + - false + - true + description: Whether to add microfrontends routing to aliases. This means domains in this project will route as a microfrontend. + required: + - enabled + - groupIds + - isDefaultApp + - updatedAt + type: object + name: + type: string + nodeVersion: + type: string + enum: + - 10.x + - 12.x + - 14.x + - 16.x + - 18.x + - 20.x + - 22.x + - 24.x + - 8.10.x + optionsAllowlist: + nullable: true + properties: + paths: + items: + properties: + value: + type: string + required: + - value + type: object + type: array + required: + - paths + type: object + outputDirectory: + nullable: true + type: string + passwordProtection: + nullable: true + type: string + description: (opaque JSON object) + passport: + nullable: true + properties: + deploymentType: + type: string + enum: + - all + - all_except_custom_domains + - preview + - prod_deployment_urls_and_all_previews + connectorId: + type: string + required: + - connectorId + - deploymentType + type: object + protectionConfig: + properties: + sandboxUrls: + properties: + inheritDeploymentProtection: + type: boolean + enum: + - false + - true + type: object + type: object + sandbox: + properties: + region: + type: string + enum: + - arn1 + - bom1 + - cdg1 + - cle1 + - cpt1 + - dub1 + - fra1 + - gru1 + - hkg1 + - hnd1 + - iad1 + - icn1 + - kix1 + - lhr1 + - pdx1 + - sfo1 + - sin1 + - syd1 + - yul1 + failoverRegions: + items: + type: string + enum: + - arn1 + - bom1 + - cdg1 + - cle1 + - cpt1 + - dub1 + - fra1 + - gru1 + - hkg1 + - hnd1 + - iad1 + - icn1 + - kix1 + - lhr1 + - pdx1 + - sfo1 + - sin1 + - syd1 + - yul1 + type: array + type: object + productionDeploymentsFastLane: + type: boolean + enum: + - false + - true + resourceConfig: + properties: + elasticConcurrencyEnabled: + type: boolean + enum: + - false + - true + fluid: + type: boolean + enum: + - false + - true + functionDefaultRegions: + items: + type: string + type: array + functionDefaultTimeout: + type: number + functionDefaultMemoryType: + type: string + enum: + - performance + - performance_xl + - standard + - standard_legacy + functionZeroConfigFailover: + type: boolean + enum: + - false + - true + buildMachineType: + type: string + enum: + - basic + - enhanced + - standard + - turbo + buildMachineSelection: + type: string + enum: + - elastic + - fixed + buildMachineElasticLastUpdated: + type: number + buildMachineElasticReason: + type: string + enum: + - basic-floor + - build-timeout-failure + - enospc-failure + - enterprise-floor + - high-peak-disk + - high-peak-memory + - long-build-duration + - oom-failure + - short-build-duration + - sustained-high-cpu + isNSNBDisabled: + type: boolean + enum: + - false + - true + buildQueue: + properties: + configuration: + type: string + enum: + - SKIP_NAMESPACE_QUEUE + - WAIT_FOR_NAMESPACE_QUEUE + type: object + enableFunctionsBeta: + type: boolean + enum: + - false + - true + type: object + required: + - functionDefaultRegions + rollbackDescription: + properties: + userId: + type: string + description: The user who rolled back the project. + username: + type: string + description: The username of the user who rolled back the project. + description: + type: string + description: User-supplied explanation of why they rolled back the project. Limited to 250 characters. + createdAt: + type: number + description: Timestamp of when the rollback was requested. + required: + - createdAt + - description + - userId + - username + type: object + description: Description of why a project was rolled back, and by whom. Note that lastAliasRequest contains the from/to details of the rollback. + rollingRelease: + nullable: true + properties: + target: + type: string + description: The environment that the release targets, currently only supports production. Adding in case we want to configure with alias groups or custom environments. + example: production + stages: + nullable: true + items: + properties: + targetPercentage: + type: number + description: The percentage of traffic to serve to the canary deployment (0-100) + example: 25 + requireApproval: + type: boolean + enum: + - false + - true + description: Whether or not this stage requires manual approval to proceed + example: false + duration: + type: number + description: Duration in minutes for automatic advancement to the next stage + example: 600 + linearShift: + type: boolean + enum: + - false + - true + description: Whether to linearly shift traffic over the duration of this stage + example: false + required: + - targetPercentage + type: object + description: 'An array of all the stages required during a deployment release. Each stage defines a target percentage and advancement rules. The final stage must always have targetPercentage: 100.' + type: array + description: 'An array of all the stages required during a deployment release. Each stage defines a target percentage and advancement rules. The final stage must always have targetPercentage: 100.' + canaryResponseHeader: + type: boolean + enum: + - false + - true + description: Whether the request served by a canary deployment should return a header indicating a canary was served. Defaults to `false` when omitted. + example: false + gate: + properties: + enabled: + type: boolean + enum: + - false + - true + description: Whether automated gating is enabled for this project's rollouts. + checks: + items: + properties: type: type: string enum: - - gitlab - createdAt: + - error-rate-5xx + description: The metric this check evaluates. + minSampleSize: type: number - deployHooks: + description: Minimum number of requests required in the window before the check can fail. Below this, the check is inconclusive rather than failing, so low-traffic stages don't gate on noise. Defaults to `100` when omitted. + example: 100 + excludeStatusCodes: items: - properties: - createdAt: - type: number - id: - type: string - name: - type: string - ref: - type: string - url: - type: string - required: - - id - - name - - ref - - url - type: object + type: number type: array - gitCredentialId: - type: string - updatedAt: - type: number - sourceless: - type: boolean - productionBranch: - type: string - required: - - deployHooks - type: object - - properties: - name: - type: string - slug: - type: string - owner: - type: string - type: - type: string - enum: - - bitbucket - uuid: - type: string - workspaceUuid: - type: string - createdAt: - type: number - deployHooks: + description: Response status codes to ignore entirely — dropped from both the numerator (errors) and the denominator (total requests). Defaults to `[]` when omitted. + example: + - 503 + excludePaths: items: - properties: - createdAt: - type: number - id: - type: string - name: - type: string - ref: - type: string - url: - type: string - required: - - id - - name - - ref - - url - type: object + type: string type: array - gitCredentialId: - type: string - updatedAt: + description: Request paths to ignore entirely — dropped from both the numerator (errors) and the denominator (total requests). Matched exactly against the request path with any query string removed; no prefix or glob matching. Defaults to `[]` when omitted. + example: + - /api/health + ingestWatermarkSeconds: type: number - sourceless: - type: boolean - productionBranch: - type: string + description: 'Seconds of ingest lag to allow for: the query''s upper bound is `now() - this value`, so the check never reads a window that is still filling. Defaults to `30` when omitted.' + example: 30 required: - - deployHooks + - type type: object - name: - type: string - nodeVersion: + description: The checks to evaluate. An empty array means nothing is evaluated. + type: array + description: The checks to evaluate. An empty array means nothing is evaluated. + failureThreshold: + type: number + description: How many failing evaluations within {@link windowSize} trip the gate. Defaults to `3` when omitted. + example: 3 + windowSize: + type: number + description: How many of the most recent evaluations {@link failureThreshold} is counted against. Defaults to `5` when omitted. + example: 5 + action: + type: string + enum: + - pause + - rollback + description: 'What to do when the gate trips: pause the rollout, or roll it back.' + dryRun: + type: boolean + enum: + - false + - true + description: When true, a tripped gate is only reported — {@link action} is not taken. + required: + - action + - checks + - dryRun + - enabled + type: object + description: 'Automated gating configuration. Omitted (the default) means no gating is configured, which is equivalent to `enabled: false`.' + required: + - target + type: object + description: Project-level rolling release configuration that defines how deployments should be gradually rolled out + defaultResourceConfig: + properties: + elasticConcurrencyEnabled: + type: boolean + enum: + - false + - true + fluid: + type: boolean + enum: + - false + - true + functionDefaultRegions: + items: type: string - enum: - - 18.x - - 16.x - - 14.x - - 12.x - - 10.x - outputDirectory: - nullable: true + type: array + functionDefaultTimeout: + type: number + functionDefaultMemoryType: + type: string + enum: + - performance + - performance_xl + - standard + - standard_legacy + functionZeroConfigFailover: + type: boolean + enum: + - false + - true + buildMachineType: + type: string + enum: + - basic + - enhanced + - standard + - turbo + buildMachineSelection: + type: string + enum: + - elastic + - fixed + buildMachineElasticLastUpdated: + type: number + buildMachineElasticReason: + type: string + enum: + - basic-floor + - build-timeout-failure + - enospc-failure + - enterprise-floor + - high-peak-disk + - high-peak-memory + - long-build-duration + - oom-failure + - short-build-duration + - sustained-high-cpu + isNSNBDisabled: + type: boolean + enum: + - false + - true + buildQueue: + properties: + configuration: + type: string + enum: + - SKIP_NAMESPACE_QUEUE + - WAIT_FOR_NAMESPACE_QUEUE + type: object + enableFunctionsBeta: + type: boolean + enum: + - false + - true + type: object + required: + - functionDefaultRegions + rootDirectory: + nullable: true + type: string + serverlessFunctionZeroConfigFailover: + type: boolean + enum: + - false + - true + skewProtectionBoundaryAt: + type: number + skewProtectionMaxAge: + type: number + skewProtectionAllowedDomains: + items: + type: string + type: array + skipGitConnectDuringLink: + type: boolean + enum: + - false + - true + staticIps: + properties: + builds: + type: boolean + enum: + - false + - true + enabled: + type: boolean + enum: + - false + - true + regions: + items: type: string - passwordProtection: - nullable: true - type: object - productionDeploymentsFastLane: - type: boolean - publicSource: - nullable: true - type: boolean - rootDirectory: - nullable: true + type: array + required: + - builds + - enabled + - regions + type: object + sourceFilesOutsideRootDirectory: + type: boolean + enum: + - false + - true + enableAffectedProjectsDeployments: + type: boolean + enum: + - false + - true + enableExternalRewriteCaching: + type: boolean + enum: + - false + - true + ssoProtection: + nullable: true + properties: + deploymentType: + type: string + enum: + - all + - all_except_custom_domains + - preview + - prod_deployment_urls_and_all_previews + cve55182MigrationAppliedFrom: + nullable: true + type: string + enum: + - all + - all_except_custom_domains + - preview + - prod_deployment_urls_and_all_previews + - null + april2026SecurityIncidentMigrationAppliedFrom: + nullable: true + type: string + enum: + - all + - all_except_custom_domains + - preview + - prod_deployment_urls_and_all_previews + - null + required: + - deploymentType + type: object + targets: + additionalProperties: + nullable: true + properties: + id: type: string - serverlessFunctionRegion: + alias: + items: + type: string + type: array + aliasAssigned: nullable: true - type: string - skipGitConnectDuringLink: - type: boolean - sourceFilesOutsideRootDirectory: - type: boolean - ssoProtection: + oneOf: + - type: number + - type: boolean + enum: + - false + - true + aliasError: nullable: true properties: - deploymentType: - type: string - enum: - - all - - preview - - prod_deployment_urls_and_all_previews - required: - - deploymentType - type: object - targets: - additionalProperties: - nullable: true - properties: - alias: - items: - type: string - type: array - aliasAssigned: - nullable: true - oneOf: - - type: number - - type: boolean - aliasError: - nullable: true - properties: - code: - type: string - message: - type: string - required: - - code - - message - type: object - aliasFinal: - nullable: true - type: string - automaticAliases: - items: - type: string - type: array - builds: - items: - properties: - use: - type: string - src: - type: string - dest: - type: string - required: - - use - type: object - type: array - connectBuildsEnabled: - type: boolean - connectConfigurationId: - type: string - createdAt: - type: number - createdIn: - type: string - creator: - nullable: true - properties: - email: - type: string - githubLogin: - type: string - gitlabLogin: - type: string - uid: - type: string - username: - type: string - required: - - email - - uid - - username - type: object - deploymentHostname: - type: string - name: - type: string - forced: - type: boolean - id: - type: string - meta: - additionalProperties: - type: string - type: object - monorepoManager: - nullable: true - type: string - plan: - type: string - enum: - - pro - - enterprise - - hobby - - oss - private: - type: boolean - readyState: - type: string - enum: - - BUILDING - - ERROR - - INITIALIZING - - QUEUED - - READY - - CANCELED - readySubstate: - type: string - enum: - - STAGED - - PROMOTED - requestedAt: - type: number - target: - nullable: true - type: string - teamId: - nullable: true - type: string - type: - type: string - enum: - - LAMBDAS - url: - type: string - userId: - type: string - withCache: - type: boolean - checksConclusion: - type: string - enum: - - succeeded - - failed - - skipped - - canceled - checksState: - type: string - enum: - - registered - - running - - completed - readyAt: - type: number - buildingAt: - type: number - previewCommentsEnabled: - type: boolean - description: Whether or not preview comments are enabled for the deployment - example: false - required: - - createdAt - - createdIn - - creator - - deploymentHostname - - name - - id - - plan - - private - - readyState - - type - - url - - userId - type: object - type: object - transferCompletedAt: - type: number - transferStartedAt: - type: number - transferToAccountId: - type: string - transferredFromAccountId: - type: string - updatedAt: - type: number - live: - type: boolean - enablePreviewFeedback: + code: + type: string + message: + type: string + required: + - code + - message + type: object + aliasFinal: nullable: true - type: boolean - permissions: + type: string + automaticAliases: + items: + type: string + type: array + branchMatcher: properties: - aliasProject: - items: - $ref: '#/components/schemas/ACLAction' - type: array - aliasProtectionBypass: - items: - $ref: '#/components/schemas/ACLAction' - type: array - connectConfigurationLink: - items: - $ref: '#/components/schemas/ACLAction' - type: array - dataCacheNamespace: - items: - $ref: '#/components/schemas/ACLAction' - type: array - deployment: - items: - $ref: '#/components/schemas/ACLAction' - type: array - deploymentCheck: - items: - $ref: '#/components/schemas/ACLAction' - type: array - deploymentCheckPreview: - items: - $ref: '#/components/schemas/ACLAction' - type: array - deploymentCheckReRunFromProductionBranch: - items: - $ref: '#/components/schemas/ACLAction' - type: array - deploymentProductionGit: - items: - $ref: '#/components/schemas/ACLAction' - type: array - deploymentPreview: - items: - $ref: '#/components/schemas/ACLAction' - type: array - deploymentPrivate: - items: - $ref: '#/components/schemas/ACLAction' - type: array - deploymentPromote: - items: - $ref: '#/components/schemas/ACLAction' - type: array - deploymentRollback: - items: - $ref: '#/components/schemas/ACLAction' - type: array - logs: - items: - $ref: '#/components/schemas/ACLAction' - type: array - logsPreset: - items: - $ref: '#/components/schemas/ACLAction' - type: array - passwordProtection: - items: - $ref: '#/components/schemas/ACLAction' - type: array - job: - items: - $ref: '#/components/schemas/ACLAction' - type: array - project: - items: - $ref: '#/components/schemas/ACLAction' - type: array - projectAnalyticsSampling: - items: - $ref: '#/components/schemas/ACLAction' - type: array - projectDeploymentHook: - items: - $ref: '#/components/schemas/ACLAction' - type: array - projectDomain: - items: - $ref: '#/components/schemas/ACLAction' - type: array - projectDomainMove: - items: - $ref: '#/components/schemas/ACLAction' - type: array - projectDomainCheckConfig: - items: - $ref: '#/components/schemas/ACLAction' - type: array - projectEnvVars: - items: - $ref: '#/components/schemas/ACLAction' - type: array - projectEnvVarsProduction: - items: - $ref: '#/components/schemas/ACLAction' - type: array - projectEnvVarsUnownedByIntegration: - items: - $ref: '#/components/schemas/ACLAction' - type: array - projectId: - items: - $ref: '#/components/schemas/ACLAction' - type: array - projectIntegrationConfiguration: - items: - $ref: '#/components/schemas/ACLAction' - type: array - projectLink: - items: - $ref: '#/components/schemas/ACLAction' - type: array - projectMember: - items: - $ref: '#/components/schemas/ACLAction' - type: array - projectMonitoring: - items: - $ref: '#/components/schemas/ACLAction' - type: array - projectPermissions: - items: - $ref: '#/components/schemas/ACLAction' - type: array - projectProductionBranch: - items: - $ref: '#/components/schemas/ACLAction' - type: array - projectTransfer: - items: - $ref: '#/components/schemas/ACLAction' - type: array - projectTransferOut: - items: - $ref: '#/components/schemas/ACLAction' - type: array - projectProtectionBypass: - items: - $ref: '#/components/schemas/ACLAction' - type: array - projectUsage: - items: - $ref: '#/components/schemas/ACLAction' - type: array - projectAnalyticsUsage: - items: - $ref: '#/components/schemas/ACLAction' - type: array - analytics: - items: - $ref: '#/components/schemas/ACLAction' - type: array - trustedIps: - items: - $ref: '#/components/schemas/ACLAction' - type: array - webAnalytics: - items: - $ref: '#/components/schemas/ACLAction' - type: array - sharedEnvVarConnection: - items: - $ref: '#/components/schemas/ACLAction' - type: array - aliasGlobal: - items: - $ref: '#/components/schemas/ACLAction' - type: array - analyticsSampling: - items: - $ref: '#/components/schemas/ACLAction' - type: array - analyticsUsage: - items: - $ref: '#/components/schemas/ACLAction' - type: array - auditLog: - items: - $ref: '#/components/schemas/ACLAction' - type: array - billingAddress: - items: - $ref: '#/components/schemas/ACLAction' - type: array - billingInformation: - items: - $ref: '#/components/schemas/ACLAction' - type: array - billingInvoice: - items: - $ref: '#/components/schemas/ACLAction' - type: array - billingInvoiceEmailRecipient: - items: - $ref: '#/components/schemas/ACLAction' - type: array - billingInvoiceLanguage: - items: - $ref: '#/components/schemas/ACLAction' - type: array - billingPlan: - items: - $ref: '#/components/schemas/ACLAction' - type: array - billingPurchaseOrder: - items: - $ref: '#/components/schemas/ACLAction' - type: array - billingTaxId: - items: - $ref: '#/components/schemas/ACLAction' - type: array - blob: - items: - $ref: '#/components/schemas/ACLAction' - type: array - budget: - items: - $ref: '#/components/schemas/ACLAction' - type: array - cacheArtifact: - items: - $ref: '#/components/schemas/ACLAction' - type: array - cacheArtifactUsageEvent: - items: - $ref: '#/components/schemas/ACLAction' - type: array - concurrentBuilds: - items: - $ref: '#/components/schemas/ACLAction' - type: array - connect: - items: - $ref: '#/components/schemas/ACLAction' - type: array - connectConfiguration: - items: - $ref: '#/components/schemas/ACLAction' - type: array - domain: - items: - $ref: '#/components/schemas/ACLAction' - type: array - domainAcceptDelegation: - items: - $ref: '#/components/schemas/ACLAction' - type: array - domainAuthCodes: - items: - $ref: '#/components/schemas/ACLAction' - type: array - domainCertificate: - items: - $ref: '#/components/schemas/ACLAction' - type: array - domainCheckConfig: - items: - $ref: '#/components/schemas/ACLAction' - type: array - domainMove: - items: - $ref: '#/components/schemas/ACLAction' - type: array - domainPurchase: - items: - $ref: '#/components/schemas/ACLAction' - type: array - domainRecord: - items: - $ref: '#/components/schemas/ACLAction' - type: array - domainTransferIn: - items: - $ref: '#/components/schemas/ACLAction' - type: array - event: - items: - $ref: '#/components/schemas/ACLAction' - type: array - ownEvent: - items: - $ref: '#/components/schemas/ACLAction' - type: array - sensitiveEnvironmentVariablePolicy: - items: - $ref: '#/components/schemas/ACLAction' - type: array - fileUpload: - items: - $ref: '#/components/schemas/ACLAction' - type: array - gitRepository: - items: - $ref: '#/components/schemas/ACLAction' - type: array - ipBlocking: - items: - $ref: '#/components/schemas/ACLAction' - type: array - integration: - items: - $ref: '#/components/schemas/ACLAction' - type: array - integrationConfiguration: - items: - $ref: '#/components/schemas/ACLAction' - type: array - integrationConfigurationTransfer: - items: - $ref: '#/components/schemas/ACLAction' - type: array - integrationConfigurationProjects: - items: - $ref: '#/components/schemas/ACLAction' - type: array - integrationVercelConfigurationOverride: - items: - $ref: '#/components/schemas/ACLAction' - type: array - jobGlobal: - items: - $ref: '#/components/schemas/ACLAction' - type: array - logDrain: - items: - $ref: '#/components/schemas/ACLAction' - type: array - Monitoring: - items: - $ref: '#/components/schemas/ACLAction' - type: array - monitoringQuery: - items: - $ref: '#/components/schemas/ACLAction' - type: array - monitoringChart: - items: - $ref: '#/components/schemas/ACLAction' - type: array - monitoringAlert: - items: - $ref: '#/components/schemas/ACLAction' - type: array - notificationDeploymentFailed: - items: - $ref: '#/components/schemas/ACLAction' - type: array - notificationDomainConfiguration: - items: - $ref: '#/components/schemas/ACLAction' - type: array - notificationDomainExpire: - items: - $ref: '#/components/schemas/ACLAction' - type: array - notificationDomainMoved: - items: - $ref: '#/components/schemas/ACLAction' - type: array - notificationDomainPurchase: - items: - $ref: '#/components/schemas/ACLAction' - type: array - notificationDomainRenewal: - items: - $ref: '#/components/schemas/ACLAction' - type: array - notificationDomainTransfer: - items: - $ref: '#/components/schemas/ACLAction' - type: array - notificationDomainUnverified: - items: - $ref: '#/components/schemas/ACLAction' - type: array - NotificationMonitoringAlert: - items: - $ref: '#/components/schemas/ACLAction' - type: array - notificationPaymentFailed: - items: - $ref: '#/components/schemas/ACLAction' - type: array - notificationUsageAlert: - items: - $ref: '#/components/schemas/ACLAction' - type: array - notificationCustomerBudget: - items: - $ref: '#/components/schemas/ACLAction' - type: array - openTelemetryEndpoint: - items: - $ref: '#/components/schemas/ACLAction' - type: array - paymentMethod: - items: - $ref: '#/components/schemas/ACLAction' - type: array - permissions: - items: - $ref: '#/components/schemas/ACLAction' - type: array - postgres: - items: - $ref: '#/components/schemas/ACLAction' - type: array - previewDeploymentSuffix: - items: - $ref: '#/components/schemas/ACLAction' - type: array - proTrialOnboarding: - items: - $ref: '#/components/schemas/ACLAction' - type: array - seawallConfig: - items: - $ref: '#/components/schemas/ACLAction' - type: array - sharedEnvVars: - items: - $ref: '#/components/schemas/ACLAction' - type: array - sharedEnvVarsProduction: - items: - $ref: '#/components/schemas/ACLAction' - type: array - space: - items: - $ref: '#/components/schemas/ACLAction' - type: array - spaceRun: + type: + type: string + enum: + - endsWith + - equals + - startsWith + description: The type of matching to perform + pattern: + type: string + description: The pattern to match against branch names + required: + - pattern + - type + type: object + buildingAt: + type: number + builds: + items: + properties: + use: + type: string + src: + type: string + dest: + type: string + required: + - use + type: object + type: array + checksConclusion: + type: string + enum: + - canceled + - failed + - skipped + - succeeded + checksState: + type: string + enum: + - completed + - registered + - running + connectBuildsEnabled: + type: boolean + enum: + - false + - true + connectConfigurationId: + type: string + createdAt: + type: number + createdIn: + type: string + creator: + nullable: true + properties: + email: + type: string + githubLogin: + type: string + gitlabLogin: + type: string + uid: + type: string + username: + type: string + required: + - email + - uid + - username + type: object + deletedAt: + type: number + deploymentHostname: + type: string + forced: + type: boolean + enum: + - false + - true + name: + type: string + meta: + additionalProperties: + type: string + type: object + monorepoManager: + nullable: true + type: string + oidcTokenClaims: + properties: + iss: + type: string + sub: + type: string + scope: + type: string + aud: + type: string + owner: + type: string + owner_id: + type: string + project: + type: string + project_id: + type: string + environment: + type: string + custom_environment_id: + type: string + mfe_group_ids: items: - $ref: '#/components/schemas/ACLAction' + type: string type: array - passwordProtectionInvoiceItem: + plan: + type: string + required: + - aud + - environment + - iss + - owner + - owner_id + - project + - project_id + - scope + - sub + type: object + plan: + type: string + enum: + - enterprise + - hobby + - pro + previewCommentsEnabled: + type: boolean + enum: + - false + - true + description: Whether or not preview comments are enabled for the deployment + example: false + private: + type: boolean + enum: + - false + - true + readyAt: + type: number + readyState: + type: string + enum: + - BLOCKED + - BUILDING + - CANCELED + - ERROR + - INITIALIZING + - QUEUED + - READY + readySubstate: + type: string + enum: + - PROMOTED + - ROLLING + - STAGED + requestedAt: + type: number + target: + nullable: true + type: string + teamId: + nullable: true + type: string + type: + type: string + enum: + - LAMBDAS + url: + type: string + userId: + type: string + description: Present for user creators; omitted for app/integration/system creators. + withCache: + type: boolean + enum: + - false + - true + required: + - createdAt + - createdIn + - creator + - deploymentHostname + - id + - name + - plan + - private + - readyState + - type + - url + type: object + type: object + transferCompletedAt: + type: number + transferStartedAt: + type: number + transferToAccountId: + type: string + transferredFromAccountId: + type: string + updatedAt: + type: number + live: + type: boolean + enum: + - false + - true + enablePreviewFeedback: + nullable: true + type: boolean + enum: + - false + - true + - null + enableProductionFeedback: + nullable: true + type: boolean + enum: + - false + - true + - null + permissions: + properties: + oauth2Connection: + items: + $ref: '#/components/schemas/ACLAction' + type: array + user: + items: + $ref: '#/components/schemas/ACLAction' + type: array + userConnection: + items: + $ref: '#/components/schemas/ACLAction' + type: array + userMfaConfiguration: + items: + $ref: '#/components/schemas/ACLAction' + type: array + userPreference: + items: + $ref: '#/components/schemas/ACLAction' + type: array + userSudo: + items: + $ref: '#/components/schemas/ACLAction' + type: array + webAuthn: + items: + $ref: '#/components/schemas/ACLAction' + type: array + accessGroup: + items: + $ref: '#/components/schemas/ACLAction' + type: array + agent: + items: + $ref: '#/components/schemas/ACLAction' + type: array + aiGatewayApiKey: + items: + $ref: '#/components/schemas/ACLAction' + type: array + aiGatewayApiKeyBypassAll: + items: + $ref: '#/components/schemas/ACLAction' + type: array + aiGatewayApiKeyOwnedBySelf: + items: + $ref: '#/components/schemas/ACLAction' + type: array + aiGatewayApiKeySpendAttribution: + items: + $ref: '#/components/schemas/ACLAction' + type: array + aiGatewayApiKeyZdrExemption: + items: + $ref: '#/components/schemas/ACLAction' + type: array + aiGatewayBudget: + items: + $ref: '#/components/schemas/ACLAction' + type: array + aiGatewayCredits: + items: + $ref: '#/components/schemas/ACLAction' + type: array + aiGatewayPrivateModels: + items: + $ref: '#/components/schemas/ACLAction' + type: array + aiGatewayGuardrails: + items: + $ref: '#/components/schemas/ACLAction' + type: array + aiGatewayRules: + items: + $ref: '#/components/schemas/ACLAction' + type: array + aiGatewaySettings: + items: + $ref: '#/components/schemas/ACLAction' + type: array + aiGatewayTranscripts: + items: + $ref: '#/components/schemas/ACLAction' + type: array + aiGatewayTranscriptsSettings: + items: + $ref: '#/components/schemas/ACLAction' + type: array + aiGatewayUsage: + items: + $ref: '#/components/schemas/ACLAction' + type: array + aiGatewayVirtualModelConfigs: + items: + $ref: '#/components/schemas/ACLAction' + type: array + alerts: + items: + $ref: '#/components/schemas/ACLAction' + type: array + alertRules: + items: + $ref: '#/components/schemas/ACLAction' + type: array + aliasGlobal: + items: + $ref: '#/components/schemas/ACLAction' + type: array + analyticsSampling: + items: + $ref: '#/components/schemas/ACLAction' + type: array + analyticsUsage: + items: + $ref: '#/components/schemas/ACLAction' + type: array + apiKey: + items: + $ref: '#/components/schemas/ACLAction' + type: array + apiKeyAiGateway: + items: + $ref: '#/components/schemas/ACLAction' + type: array + apiKeyOwnedBySelf: + items: + $ref: '#/components/schemas/ACLAction' + type: array + oauth2Application: + items: + $ref: '#/components/schemas/ACLAction' + type: array + vercelAppInstallation: + items: + $ref: '#/components/schemas/ACLAction' + type: array + vercelAppInstallationRequest: + items: + $ref: '#/components/schemas/ACLAction' + type: array + auditLog: + items: + $ref: '#/components/schemas/ACLAction' + type: array + automation: + items: + $ref: '#/components/schemas/ACLAction' + type: array + billingAddress: + items: + $ref: '#/components/schemas/ACLAction' + type: array + billingInformation: + items: + $ref: '#/components/schemas/ACLAction' + type: array + billingInvoice: + items: + $ref: '#/components/schemas/ACLAction' + type: array + billingInvoiceEmailRecipient: + items: + $ref: '#/components/schemas/ACLAction' + type: array + billingInvoiceLanguage: + items: + $ref: '#/components/schemas/ACLAction' + type: array + billingPlan: + items: + $ref: '#/components/schemas/ACLAction' + type: array + billingPurchaseOrder: + items: + $ref: '#/components/schemas/ACLAction' + type: array + billingRefund: + items: + $ref: '#/components/schemas/ACLAction' + type: array + billingTaxId: + items: + $ref: '#/components/schemas/ACLAction' + type: array + blob: + items: + $ref: '#/components/schemas/ACLAction' + type: array + blobStoreTokenSet: + items: + $ref: '#/components/schemas/ACLAction' + type: array + budget: + items: + $ref: '#/components/schemas/ACLAction' + type: array + cacheArtifact: + items: + $ref: '#/components/schemas/ACLAction' + type: array + cacheArtifactUsageEvent: + items: + $ref: '#/components/schemas/ACLAction' + type: array + codeChecks: + items: + $ref: '#/components/schemas/ACLAction' + type: array + codeOwners: + items: + $ref: '#/components/schemas/ACLAction' + type: array + ciInvocations: + items: + $ref: '#/components/schemas/ACLAction' + type: array + ciLogs: + items: + $ref: '#/components/schemas/ACLAction' + type: array + concurrentBuilds: + items: + $ref: '#/components/schemas/ACLAction' + type: array + connect: + items: + $ref: '#/components/schemas/ACLAction' + type: array + connectConfiguration: + items: + $ref: '#/components/schemas/ACLAction' + type: array + connectLogs: + items: + $ref: '#/components/schemas/ACLAction' + type: array + connexClient: + items: + $ref: '#/components/schemas/ACLAction' + type: array + connexClientProject: + items: + $ref: '#/components/schemas/ACLAction' + type: array + connexContact: + items: + $ref: '#/components/schemas/ACLAction' + type: array + connexInstallation: + items: + $ref: '#/components/schemas/ACLAction' + type: array + connexToken: + items: + $ref: '#/components/schemas/ACLAction' + type: array + buildMachineDefault: + items: + $ref: '#/components/schemas/ACLAction' + type: array + cursorOriginInstallation: + items: + $ref: '#/components/schemas/ACLAction' + type: array + dataCacheBillingSettings: + items: + $ref: '#/components/schemas/ACLAction' + type: array + defaultDeploymentProtection: + items: + $ref: '#/components/schemas/ACLAction' + type: array + deploymentPolicy: + items: + $ref: '#/components/schemas/ACLAction' + type: array + domain: + items: + $ref: '#/components/schemas/ACLAction' + type: array + domainAcceptDelegation: + items: + $ref: '#/components/schemas/ACLAction' + type: array + domainAuthCodes: + items: + $ref: '#/components/schemas/ACLAction' + type: array + domainCertificate: + items: + $ref: '#/components/schemas/ACLAction' + type: array + domainCheckConfig: + items: + $ref: '#/components/schemas/ACLAction' + type: array + domainMove: + items: + $ref: '#/components/schemas/ACLAction' + type: array + domainPurchase: + items: + $ref: '#/components/schemas/ACLAction' + type: array + domainRecord: + items: + $ref: '#/components/schemas/ACLAction' + type: array + domainTransferIn: + items: + $ref: '#/components/schemas/ACLAction' + type: array + drain: + items: + $ref: '#/components/schemas/ACLAction' + type: array + edgeConfig: + items: + $ref: '#/components/schemas/ACLAction' + type: array + edgeConfigItem: + items: + $ref: '#/components/schemas/ACLAction' + type: array + edgeConfigSchema: + items: + $ref: '#/components/schemas/ACLAction' + type: array + edgeConfigToken: + items: + $ref: '#/components/schemas/ACLAction' + type: array + endpointVerification: + items: + $ref: '#/components/schemas/ACLAction' + type: array + event: + items: + $ref: '#/components/schemas/ACLAction' + type: array + fileUpload: + items: + $ref: '#/components/schemas/ACLAction' + type: array + flagsExplorerSubscription: + items: + $ref: '#/components/schemas/ACLAction' + type: array + gitRepository: + items: + $ref: '#/components/schemas/ACLAction' + type: array + imageOptimizationNewPrice: + items: + $ref: '#/components/schemas/ACLAction' + type: array + integration: + items: + $ref: '#/components/schemas/ACLAction' + type: array + integrationAccount: + items: + $ref: '#/components/schemas/ACLAction' + type: array + integrationConfiguration: + items: + $ref: '#/components/schemas/ACLAction' + type: array + integrationConfigurationProjects: + items: + $ref: '#/components/schemas/ACLAction' + type: array + integrationConfigurationRole: + items: + $ref: '#/components/schemas/ACLAction' + type: array + integrationConfigurationTransfer: + items: + $ref: '#/components/schemas/ACLAction' + type: array + integrationDeploymentAction: + items: + $ref: '#/components/schemas/ACLAction' + type: array + integrationEvent: + items: + $ref: '#/components/schemas/ACLAction' + type: array + integrationLog: + items: + $ref: '#/components/schemas/ACLAction' + type: array + integrationResource: + items: + $ref: '#/components/schemas/ACLAction' + type: array + integrationResourceData: + items: + $ref: '#/components/schemas/ACLAction' + type: array + integrationResourceReplCommand: + items: + $ref: '#/components/schemas/ACLAction' + type: array + integrationResourceSecrets: + items: + $ref: '#/components/schemas/ACLAction' + type: array + integrationSSOSession: + items: + $ref: '#/components/schemas/ACLAction' + type: array + integrationStrict: + items: + $ref: '#/components/schemas/ACLAction' + type: array + integrationStoreTokenSet: + items: + $ref: '#/components/schemas/ACLAction' + type: array + integrationVercelConfigurationOverride: + items: + $ref: '#/components/schemas/ACLAction' + type: array + integrationPullRequest: + items: + $ref: '#/components/schemas/ACLAction' + type: array + ipBlocking: + items: + $ref: '#/components/schemas/ACLAction' + type: array + jobGlobal: + items: + $ref: '#/components/schemas/ACLAction' + type: array + kmsIssuer: + items: + $ref: '#/components/schemas/ACLAction' + type: array + kmsProjectGrant: + items: + $ref: '#/components/schemas/ACLAction' + type: array + logDrain: + items: + $ref: '#/components/schemas/ACLAction' + type: array + marketplaceBillingData: + items: + $ref: '#/components/schemas/ACLAction' + type: array + marketplaceExperimentationEdgeConfigData: + items: + $ref: '#/components/schemas/ACLAction' + type: array + marketplaceExperimentationItem: + items: + $ref: '#/components/schemas/ACLAction' + type: array + marketplaceFlexCommit: + items: + $ref: '#/components/schemas/ACLAction' + type: array + marketplaceInstallationMember: + items: + $ref: '#/components/schemas/ACLAction' + type: array + marketplaceInvoice: + items: + $ref: '#/components/schemas/ACLAction' + type: array + marketplaceSettings: + items: + $ref: '#/components/schemas/ACLAction' + type: array + Monitoring: + items: + $ref: '#/components/schemas/ACLAction' + type: array + monitoringAlert: + items: + $ref: '#/components/schemas/ACLAction' + type: array + monitoringChart: + items: + $ref: '#/components/schemas/ACLAction' + type: array + monitoringQuery: + items: + $ref: '#/components/schemas/ACLAction' + type: array + monitoringSettings: + items: + $ref: '#/components/schemas/ACLAction' + type: array + notificationCustomerBudget: + items: + $ref: '#/components/schemas/ACLAction' + type: array + notificationDeploymentFailed: + items: + $ref: '#/components/schemas/ACLAction' + type: array + notificationDomainConfiguration: + items: + $ref: '#/components/schemas/ACLAction' + type: array + notificationDomainExpire: + items: + $ref: '#/components/schemas/ACLAction' + type: array + notificationDomainMoved: + items: + $ref: '#/components/schemas/ACLAction' + type: array + notificationDomainPurchase: + items: + $ref: '#/components/schemas/ACLAction' + type: array + notificationDomainRenewal: + items: + $ref: '#/components/schemas/ACLAction' + type: array + notificationDomainTransfer: + items: + $ref: '#/components/schemas/ACLAction' + type: array + notificationDomainUnverified: + items: + $ref: '#/components/schemas/ACLAction' + type: array + NotificationMonitoringAlert: + items: + $ref: '#/components/schemas/ACLAction' + type: array + notificationPaymentFailed: + items: + $ref: '#/components/schemas/ACLAction' + type: array + notificationPreferences: + items: + $ref: '#/components/schemas/ACLAction' + type: array + notificationStatementOfReasons: + items: + $ref: '#/components/schemas/ACLAction' + type: array + notificationUsageAlert: + items: + $ref: '#/components/schemas/ACLAction' + type: array + oidcFederationPolicy: + items: + $ref: '#/components/schemas/ACLAction' + type: array + observabilityConfiguration: + items: + $ref: '#/components/schemas/ACLAction' + type: array + observabilityFunnel: + items: + $ref: '#/components/schemas/ACLAction' + type: array + observabilityNotebook: + items: + $ref: '#/components/schemas/ACLAction' + type: array + openTelemetryEndpoint: + items: + $ref: '#/components/schemas/ACLAction' + type: array + ownEvent: + items: + $ref: '#/components/schemas/ACLAction' + type: array + organization: + items: + $ref: '#/components/schemas/ACLAction' + type: array + organizationDomain: + items: + $ref: '#/components/schemas/ACLAction' + type: array + organizationTeam: + items: + $ref: '#/components/schemas/ACLAction' + type: array + passwordProtectionInvoiceItem: + items: + $ref: '#/components/schemas/ACLAction' + type: array + paymentMethod: + items: + $ref: '#/components/schemas/ACLAction' + type: array + permissions: + items: + $ref: '#/components/schemas/ACLAction' + type: array + postgres: + items: + $ref: '#/components/schemas/ACLAction' + type: array + postgresStoreTokenSet: + items: + $ref: '#/components/schemas/ACLAction' + type: array + previewDeploymentSuffix: + items: + $ref: '#/components/schemas/ACLAction' + type: array + privateCloudAccount: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectTransferIn: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectTransferRequest: + items: + $ref: '#/components/schemas/ACLAction' + type: array + proTrialOnboarding: + items: + $ref: '#/components/schemas/ACLAction' + type: array + rateLimit: + items: + $ref: '#/components/schemas/ACLAction' + type: array + redis: + items: + $ref: '#/components/schemas/ACLAction' + type: array + redisStoreTokenSet: + items: + $ref: '#/components/schemas/ACLAction' + type: array + remoteCaching: + items: + $ref: '#/components/schemas/ACLAction' + type: array + repository: + items: + $ref: '#/components/schemas/ACLAction' + type: array + samlConfig: + items: + $ref: '#/components/schemas/ACLAction' + type: array + secret: + items: + $ref: '#/components/schemas/ACLAction' + type: array + securityConfig: + items: + $ref: '#/components/schemas/ACLAction' + type: array + sensitiveEnvironmentVariablePolicy: + items: + $ref: '#/components/schemas/ACLAction' + type: array + sharedEnvVars: + items: + $ref: '#/components/schemas/ACLAction' + type: array + sharedEnvVarsProduction: + items: + $ref: '#/components/schemas/ACLAction' + type: array + space: + items: + $ref: '#/components/schemas/ACLAction' + type: array + spaceRun: + items: + $ref: '#/components/schemas/ACLAction' + type: array + storeIsLocked: + items: + $ref: '#/components/schemas/ACLAction' + type: array + storeTokenSetSensitive: + items: + $ref: '#/components/schemas/ACLAction' + type: array + storeTransfer: + items: + $ref: '#/components/schemas/ACLAction' + type: array + supportCase: + items: + $ref: '#/components/schemas/ACLAction' + type: array + supportCaseComment: + items: + $ref: '#/components/schemas/ACLAction' + type: array + team: + items: + $ref: '#/components/schemas/ACLAction' + type: array + teamAccessRequest: + items: + $ref: '#/components/schemas/ACLAction' + type: array + teamFellowMembership: + items: + $ref: '#/components/schemas/ACLAction' + type: array + teamGitExclusivity: + items: + $ref: '#/components/schemas/ACLAction' + type: array + teamInvite: + items: + $ref: '#/components/schemas/ACLAction' + type: array + teamInviteCode: + items: + $ref: '#/components/schemas/ACLAction' + type: array + teamInviteLink: + items: + $ref: '#/components/schemas/ACLAction' + type: array + teamJoin: + items: + $ref: '#/components/schemas/ACLAction' + type: array + teamMemberMfaStatus: + items: + $ref: '#/components/schemas/ACLAction' + type: array + teamMicrofrontends: + items: + $ref: '#/components/schemas/ACLAction' + type: array + teamOwnMembership: + items: + $ref: '#/components/schemas/ACLAction' + type: array + teamOwnMembershipDisconnectSAML: + items: + $ref: '#/components/schemas/ACLAction' + type: array + teamSudo: + items: + $ref: '#/components/schemas/ACLAction' + type: array + teamTokenInvalidation: + items: + $ref: '#/components/schemas/ACLAction' + type: array + token: + items: + $ref: '#/components/schemas/ACLAction' + type: array + toolbarComment: + items: + $ref: '#/components/schemas/ACLAction' + type: array + usage: + items: + $ref: '#/components/schemas/ACLAction' + type: array + usageCycle: + items: + $ref: '#/components/schemas/ACLAction' + type: array + vcrRepository: + items: + $ref: '#/components/schemas/ACLAction' + type: array + vpcPeeringConnection: + items: + $ref: '#/components/schemas/ACLAction' + type: array + webAnalyticsPlan: + items: + $ref: '#/components/schemas/ACLAction' + type: array + webhook: + items: + $ref: '#/components/schemas/ACLAction' + type: array + webhook-event: + items: + $ref: '#/components/schemas/ACLAction' + type: array + aliasProject: + items: + $ref: '#/components/schemas/ACLAction' + type: array + aliasProtectionBypass: + items: + $ref: '#/components/schemas/ACLAction' + type: array + bulkRedirects: + items: + $ref: '#/components/schemas/ACLAction' + type: array + buildMachine: + items: + $ref: '#/components/schemas/ACLAction' + type: array + connectConfigurationLink: + items: + $ref: '#/components/schemas/ACLAction' + type: array + dataCacheNamespace: + items: + $ref: '#/components/schemas/ACLAction' + type: array + deployment: + items: + $ref: '#/components/schemas/ACLAction' + type: array + deploymentBuildLogs: + items: + $ref: '#/components/schemas/ACLAction' + type: array + deploymentCheck: + items: + $ref: '#/components/schemas/ACLAction' + type: array + deploymentCheckPreview: + items: + $ref: '#/components/schemas/ACLAction' + type: array + deploymentCheckReRunFromProductionBranch: + items: + $ref: '#/components/schemas/ACLAction' + type: array + deploymentProductionGit: + items: + $ref: '#/components/schemas/ACLAction' + type: array + deploymentV0: + items: + $ref: '#/components/schemas/ACLAction' + type: array + deploymentPreview: + items: + $ref: '#/components/schemas/ACLAction' + type: array + deploymentPrivate: + items: + $ref: '#/components/schemas/ACLAction' + type: array + deploymentPromote: + items: + $ref: '#/components/schemas/ACLAction' + type: array + deploymentRollback: + items: + $ref: '#/components/schemas/ACLAction' + type: array + edgeCacheNamespace: + items: + $ref: '#/components/schemas/ACLAction' + type: array + environments: + items: + $ref: '#/components/schemas/ACLAction' + type: array + job: + items: + $ref: '#/components/schemas/ACLAction' + type: array + logs: + items: + $ref: '#/components/schemas/ACLAction' + type: array + logsPreset: + items: + $ref: '#/components/schemas/ACLAction' + type: array + observabilityData: + items: + $ref: '#/components/schemas/ACLAction' + type: array + onDemandBuild: + items: + $ref: '#/components/schemas/ACLAction' + type: array + onDemandConcurrency: + items: + $ref: '#/components/schemas/ACLAction' + type: array + optionsAllowlist: + items: + $ref: '#/components/schemas/ACLAction' + type: array + passwordProtection: + items: + $ref: '#/components/schemas/ACLAction' + type: array + privateLinkEndpoint: + items: + $ref: '#/components/schemas/ACLAction' + type: array + productionAliasProtectionBypass: + items: + $ref: '#/components/schemas/ACLAction' + type: array + productionShareableLink: + items: + $ref: '#/components/schemas/ACLAction' + type: array + project: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectAccessGroup: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectAnalyticsSampling: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectAnalyticsUsage: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectCheck: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectCheckRun: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectDeploymentExpiration: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectDeploymentHook: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectDeploymentProtectionStrict: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectDomain: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectDomainCheckConfig: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectDomainMove: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectDomainVerify: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectEvent: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectEnvVars: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectEnvVarsProduction: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectEnvVarsUnownedByIntegration: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectFlags: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectFlagsProduction: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectFlagsSdkKey: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectFromV0: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectId: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectIntegrationConfiguration: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectLink: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectMember: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectMonitoring: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectOIDCToken: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectPermissions: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectProductionBranch: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectProtectionBypass: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectRollingRelease: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectRoutes: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectSupportCase: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectSupportCaseComment: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectTier: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectTransfer: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectTransferOut: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectUsage: + items: + $ref: '#/components/schemas/ACLAction' + type: array + pageIntegrity: + items: + $ref: '#/components/schemas/ACLAction' + type: array + seawallConfig: + items: + $ref: '#/components/schemas/ACLAction' + type: array + securityPlusConfiguration: + items: + $ref: '#/components/schemas/ACLAction' + type: array + shareableLink: + items: + $ref: '#/components/schemas/ACLAction' + type: array + shareableLinkStrict: + items: + $ref: '#/components/schemas/ACLAction' + type: array + sharedEnvVarConnection: + items: + $ref: '#/components/schemas/ACLAction' + type: array + skewProtection: + items: + $ref: '#/components/schemas/ACLAction' + type: array + analytics: + items: + $ref: '#/components/schemas/ACLAction' + type: array + trustedIps: + items: + $ref: '#/components/schemas/ACLAction' + type: array + trustedSources: + items: + $ref: '#/components/schemas/ACLAction' + type: array + v0Chat: + items: + $ref: '#/components/schemas/ACLAction' + type: array + vercelAuth: + items: + $ref: '#/components/schemas/ACLAction' + type: array + vercelRun: + items: + $ref: '#/components/schemas/ACLAction' + type: array + webAnalytics: + items: + $ref: '#/components/schemas/ACLAction' + type: array + workflowRunData: + items: + $ref: '#/components/schemas/ACLAction' + type: array + type: object + lastRollbackTarget: + nullable: true + type: string + description: (opaque JSON object) + lastAliasRequest: + nullable: true + properties: + fromDeploymentId: + nullable: true + type: string + toDeploymentId: + type: string + fromRollingReleaseId: + type: string + description: If rolling back from a rolling release, fromDeploymentId captures the "base" of that rolling release, and fromRollingReleaseId captures the "target" of that rolling release. + jobStatus: + type: string + enum: + - failed + - in-progress + - pending + - skipped + - succeeded + requestedAt: + type: number + type: + type: string + enum: + - promote + - rollback + required: + - fromDeploymentId + - jobStatus + - requestedAt + - toDeploymentId + - type + type: object + protectionBypass: + additionalProperties: + oneOf: + - properties: + createdAt: + type: number + createdBy: + type: string + scope: + type: string + enum: + - integration-automation-bypass + integrationId: + type: string + configurationId: + type: string + required: + - configurationId + - createdAt + - createdBy + - integrationId + - scope + type: object + - properties: + createdAt: + type: number + createdBy: + type: string + scope: + type: string + enum: + - automation-bypass + isEnvVar: + type: boolean + enum: + - false + - true + description: When there was only one bypass, it was automatically set as an env var on deployments. With multiple bypasses, there is always one bypass that is selected as the default, and gets set as an env var on deployments. As this is a new field, undefined means that the bypass is the env var. If there are any automation bypasses, exactly one must be the env var. + note: + type: string + description: Optional note about the bypass to be displayed in the UI + required: + - createdAt + - createdBy + - scope + type: object + type: object + hasActiveBranches: + type: boolean + enum: + - false + - true + trustedIps: + nullable: true + properties: + deploymentType: + type: string + enum: + - all + - all_except_custom_domains + - preview + - prod_deployment_urls_and_all_previews + - production + addresses: + items: + properties: + value: + type: string + note: + type: string + required: + - value + type: object + type: array + protectionMode: + type: string + enum: + - additional + - exclusive + required: + - addresses + - deploymentType + - protectionMode + type: object + trustedSources: + nullable: true + properties: + enableVercelCiSameRepository: + type: boolean + enum: + - false + - true + description: Allow same-team Vercel CI access to preview deployments built from the CI run's repository, using the deployment source rather than the current project repository link. Defaults to enabled when not stored; omitted or null Trusted Sources updates preserve the stored value. + projects: + additionalProperties: + properties: + label: + type: string + customAllow: items: - $ref: '#/components/schemas/ACLAction' + properties: + from: + oneOf: + - properties: + slugs: + items: + type: string + type: array + description: System environment slugs (`production`, `preview`) and/or custom environment slugs defined on the referenced project. + preset: + type: string + enum: + - all-custom + required: + - slugs + type: object + description: The source envs on the trusted project that are allowed to access `to`. + - properties: + slugs: + items: + type: string + type: array + description: System environment slugs (`production`, `preview`) and/or custom environment slugs defined on the referenced project. + preset: + type: string + enum: + - all-custom + required: + - preset + type: object + description: The source envs on the trusted project that are allowed to access `to`. + to: + oneOf: + - properties: + slugs: + items: + type: string + type: array + description: System environment slugs (`production`, `preview`) and/or custom environment slugs defined on the referenced project. + preset: + type: string + enum: + - all-custom + required: + - slugs + type: object + description: The target envs on the current project that may be accessed. + - properties: + slugs: + items: + type: string + type: array + description: System environment slugs (`production`, `preview`) and/or custom environment slugs defined on the referenced project. + preset: + type: string + enum: + - all-custom + required: + - preset + type: object + description: The target envs on the current project that may be accessed. + required: + - from + - to + type: object + description: Optional overrides for the default same-env-by-slug matching. Provide explicit rules to allow cross-env access or presets. type: array + description: Optional overrides for the default same-env-by-slug matching. Provide explicit rules to allow cross-env access or presets. + type: object + type: object + oidcProviders: + additionalProperties: + items: + properties: + to: + oneOf: + - properties: + slugs: + items: + type: string + type: array + description: System environment slugs (`production`, `preview`) and/or custom environment slugs defined on the referenced project. + preset: + type: string + enum: + - all-custom + required: + - slugs + type: object + description: The target envs on the current project that may be accessed. + - properties: + slugs: + items: + type: string + type: array + description: System environment slugs (`production`, `preview`) and/or custom environment slugs defined on the referenced project. + preset: + type: string + enum: + - all-custom + required: + - preset + type: object + description: The target envs on the current project that may be accessed. + label: + type: string + claims: + additionalProperties: + items: + type: string + type: array + type: object + required: + - claims + - to + type: object + type: array + type: object + type: object + gitComments: + properties: + onPullRequest: + type: boolean + enum: + - false + - true + description: Whether the Vercel bot should comment on PRs + onCommit: + type: boolean + enum: + - false + - true + description: Whether the Vercel bot should comment on commits + required: + - onCommit + - onPullRequest + type: object + gitProviderOptions: + properties: + createDeployments: + type: string + enum: + - disabled + - enabled + description: 'Whether the Vercel bot should automatically create GitHub deployments https://docs.github.com/en/rest/deployments/deployments#about-deployments NOTE: repository-dispatch events should be used instead' + disableRepositoryDispatchEvents: + type: boolean + enum: + - false + - true + description: 'Whether the Vercel bot should not automatically create GitHub repository-dispatch events on deployment events. https://vercel.com/docs/git/vercel-for-github#repository-dispatch-events - `true`: disable repository-dispatch events for this project (explicit override of the team setting). - `false`: enable repository-dispatch events for this project (explicit override of the team setting). - absent: inherit from `team.disableRepositoryDispatchEvents`.' + requireVerifiedCommits: + type: boolean + enum: + - false + - true + description: 'Whether the project requires commits to be signed & verified before deployments will be created. - `true`: require verified commits for this project (explicit override of the team setting). - `false`: do not require verified commits (explicit override of the team setting). - absent: inherit from `team.requireVerifiedCommits`.' + gitCommitStatus: + type: boolean + enum: + - false + - true + description: Whether Vercel should post commit statuses for this project. When omitted, commit statuses remain enabled. + consolidatedGitCommitStatus: + properties: + enabled: + type: boolean + enum: + - false + - true + description: Whether consolidated commit status is enabled. + propagateFailures: + type: boolean + enum: + - false + - true + description: Whether to propagate individual deployment failures to the consolidated status. + required: + - enabled + - propagateFailures + type: object + description: Configuration for consolidated git commit status reporting. When enabled, Vercel will post a single consolidated commit status instead of individual statuses for each deployment. + required: + - createDeployments + type: object + paused: + type: boolean + enum: + - false + - true + concurrencyBucketName: + type: string + webAnalytics: + properties: + id: + type: string + disabledAt: + type: number + canceledAt: + type: number + enabledAt: + type: number + hasData: + type: boolean + enum: + - true + required: + - id + type: object + security: + properties: + attackModeEnabled: + type: boolean + enum: + - false + - true + attackModeUpdatedAt: + type: number + firewallEnabled: + type: boolean + enum: + - false + - true + firewallUpdatedAt: + type: number + attackModeActiveUntil: + nullable: true + type: number + firewallConfigVersion: + type: number + rulesets: + additionalProperties: + properties: + action: + type: string + enum: + - allow + - bypass + - challenge + - deny + - log + - rate_limit + - redirect rateLimit: + nullable: true + properties: + algo: + type: string + enum: + - fixed_window + - token_bucket + window: + type: number + limit: + type: number + keys: + items: + type: string + type: array + required: + - algo + - keys + - limit + - window + type: object + redirect: + nullable: true + properties: + location: + type: string + permanent: + type: boolean + enum: + - false + - true + required: + - location + - permanent + type: object + actionDuration: + nullable: true + type: string + bypassSystem: + nullable: true + type: boolean + enum: + - false + - true + - null + logHeaders: + oneOf: + - items: + type: string + type: array + - type: string + enum: + - '*' + required: + - action + type: object + type: object + firewallSeawallEnabled: + type: boolean + enum: + - false + - true + ja3Enabled: + type: boolean + enum: + - false + - true + ja4Enabled: + type: boolean + enum: + - false + - true + firewallBypassIps: + items: + type: string + type: array + managedRules: + nullable: true + properties: + vercel_ruleset: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - challenge + - deny + - log + required: + - active + type: object + traffic_sources: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - challenge + - deny + - log + required: + - active + type: object + bot_filter: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - challenge + - deny + - log + required: + - active + type: object + ai_bots: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - challenge + - deny + - log + required: + - active + type: object + owasp: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - challenge + - deny + - log + required: + - active + type: object + required: + - ai_bots + - bot_filter + - owasp + - traffic_sources + - vercel_ruleset + type: object + botIdEnabled: + type: boolean + enum: + - false + - true + log_headers: + oneOf: + - items: + type: string + type: array + - type: string + enum: + - '*' + securityPlus: + type: boolean + enum: + - false + - true + securityPlusMetadata: + properties: + updatedAt: + type: number + firstEnabledAt: + type: number + description: Timestamp when the feature was first enabled. Never changes after initial enablement. + required: + - updatedAt + type: object + pageIntegrityEnabled: + type: boolean + enum: + - false + - true + description: Whether Page Integrity is enabled for this project. Used by the metadata service to gate DynamoDB lookups against the page-integrity-inventory table. + type: object + oidcTokenConfig: + properties: + enabled: + type: boolean + enum: + - false + - true + description: Whether or not to generate OpenID Connect JSON Web Tokens. + issuerMode: + type: string + enum: + - global + - team + description: '- team: `https://oidc.vercel.com/[team_slug]` - global: `https://oidc.vercel.com`' + type: object + deploymentPolicy: + nullable: true + properties: + gitSources: + nullable: true + items: + properties: + sources: items: - $ref: '#/components/schemas/ACLAction' - type: array - redis: - items: - $ref: '#/components/schemas/ACLAction' - type: array - remoteCaching: - items: - $ref: '#/components/schemas/ACLAction' - type: array - samlConfig: - items: - $ref: '#/components/schemas/ACLAction' - type: array - secret: - items: - $ref: '#/components/schemas/ACLAction' - type: array - supportCase: - items: - $ref: '#/components/schemas/ACLAction' - type: array - supportCaseComment: - items: - $ref: '#/components/schemas/ACLAction' - type: array - dataCacheBillingSettings: - items: - $ref: '#/components/schemas/ACLAction' - type: array - team: - items: - $ref: '#/components/schemas/ACLAction' - type: array - teamAccessRequest: - items: - $ref: '#/components/schemas/ACLAction' - type: array - teamFellowMembership: - items: - $ref: '#/components/schemas/ACLAction' - type: array - teamInvite: - items: - $ref: '#/components/schemas/ACLAction' - type: array - teamInviteCode: - items: - $ref: '#/components/schemas/ACLAction' - type: array - teamJoin: - items: - $ref: '#/components/schemas/ACLAction' - type: array - teamOwnMembership: - items: - $ref: '#/components/schemas/ACLAction' - type: array - teamOwnMembershipDisconnectSAML: - items: - $ref: '#/components/schemas/ACLAction' - type: array - token: - items: - $ref: '#/components/schemas/ACLAction' - type: array - usage: - items: - $ref: '#/components/schemas/ACLAction' - type: array - usageCycle: - items: - $ref: '#/components/schemas/ACLAction' - type: array - user: - items: - $ref: '#/components/schemas/ACLAction' - type: array - userConnection: - items: - $ref: '#/components/schemas/ACLAction' - type: array - webAnalyticsPlan: - items: - $ref: '#/components/schemas/ACLAction' + oneOf: + - properties: + provider: + type: string + enum: + - bitbucket + - github + org: + type: string + repo: + type: string + required: + - org + - provider + type: object + description: Allowlist entry for GitHub and Bitbucket, whose repos are identified by a flat `org`/`repo` (Bitbucket's workspace/owner maps to `org`, its repo slug to `repo`). Omit `repo` to match any repo in the org. Org is matched case-insensitively. + - properties: + provider: + type: string + enum: + - gitlab + namespace: + type: string + project: + type: string + required: + - namespace + - provider + type: object + description: Allowlist entry for GitLab, which uses nested groups rather than a flat org/repo. `namespace` is the full group path (e.g. `group` or `group/subgroup`); `project` is the leaf project name. Omit `project` to match any project under the namespace. Namespace is matched case-insensitively. type: array - edgeConfig: + enabled: + type: boolean + enum: + - false + - true + environments: items: - $ref: '#/components/schemas/ACLAction' + oneOf: + - properties: + type: + type: string + enum: + - system + target: + type: string + enum: + - preview + - production + required: + - target + - type + type: object + - properties: + type: + type: string + enum: + - custom + environmentId: + type: string + required: + - environmentId + - type + type: object type: array - edgeConfigItem: + required: + - enabled + - environments + - sources + type: object + description: '`enabled: true` with empty `sources` is deny-all.' + type: array + deploymentSources: + nullable: true + items: + properties: + sources: items: - $ref: '#/components/schemas/ACLAction' + type: string + enum: + - cli + - deploy-hook + - git + - integration + - rest-api + - v0 + description: 'Customer-configurable deployment sources. Every deploy classifies to exactly one. JSON schema in `packages/deployment-policy/schemas/body.ts` enumerates exactly these values. - `''git''` — git provider webhook. - `''cli''` — Vercel CLI (legacy classic-token CLI and SIWV CLI both). - `''rest-api''` — direct user/team-token REST upload. Does NOT cover deploy hooks, Marketplace integrations, or first-party app tokens. - `''deploy-hook''` — project deploy-hook URL. The URL is the credential. - `''integration''` — third-party Marketplace actor: Marketplace integration token, user-delegated OAuth from a Marketplace app, or an unrecognized third-party Vercel App. First-party Vercel Apps are never `''integration''`. - `''v0''` — the v0 product surface (entitlement-gated). v0 deploys through the CLI under the hood, but classifies as its own source so a team can allow or deny v0 independently of `''cli''`. First-party Vercel apps (Toolbar, etc.) classify as `''first-party''` — see `ClassifiedSource` in `./checks`. They''re not in this union because they aren''t customer-configurable; they bypass `checkDeploymentSources` entirely. v0 is intentionally NOT among them: like the CLI, it''s a real product surface and is policy-controllable.' type: array - edgeConfigToken: + enabled: + type: boolean + enum: + - false + - true + environments: items: - $ref: '#/components/schemas/ACLAction' + oneOf: + - properties: + type: + type: string + enum: + - system + target: + type: string + enum: + - preview + - production + required: + - target + - type + type: object + - properties: + type: + type: string + enum: + - custom + environmentId: + type: string + required: + - environmentId + - type + type: object type: array - webhook: + required: + - enabled + - environments + - sources + type: object + description: '`enabled: true` with empty `sources` is deny-all.' + type: array + type: object + description: Project shape. `null` on a rule list clears the project's override for that rule type (fall back to team for every env); omitting is equivalent. Setting `deploymentPolicy` itself to `null` clears every override at once. Kept structurally distinct from {@link TeamDeploymentPolicy} so the two storage locations don't share a type by accident. + tier: + type: string + enum: + - advanced + - critical + - priority + usageStatus: + properties: + kind: + type: string + enum: + - flat + description: Billing mode. Always 'flat' for flat-rate projects. + exceededAllowanceUntil: + type: number + description: Timestamp until which the project has exceeded its CDN allowance. + bypassThrottleUntil: + type: number + description: Timestamp until which throttling is bypassed (project pays list rates for overage). + throttled: + type: boolean + enum: + - false + - true + description: Per-project throttle, set explicitly for this project (e.g. via the per-project Flat Rate CDN endpoint). + teamThrottled: + type: boolean + enum: + - false + - true + description: Synced from `team.billing.usageStatus.throttled`. When `true`, the team has throttled all of its projects regardless of `throttled`. The effective throttle the CDN enforces is `throttled || teamThrottled`. + required: + - kind + type: object + features: + properties: + webAnalytics: + type: boolean + enum: + - false + - true + type: object + v0: + type: boolean + enum: + - false + - true + v0Created: + type: boolean + enum: + - false + - true + abuse: + properties: + scanner: + type: string + history: + items: + properties: + scanner: + type: string + reason: + type: string + by: + type: string + byId: + type: string + at: + type: number + required: + - at + - by + - byId + - reason + - scanner + type: object + type: array + updatedAt: + type: number + block: + properties: + action: + type: string + enum: + - blocked + reason: + type: string + statusCode: + type: number + createdAt: + type: number + caseId: + type: string + actor: + type: string + comment: + type: string + ineligibleForAppeal: + type: boolean + enum: + - false + - true + isCascading: + type: boolean + enum: + - false + - true + required: + - action + - createdAt + - reason + - statusCode + type: object + blockHistory: + items: + oneOf: + - properties: + action: + type: string + enum: + - blocked + reason: + type: string + statusCode: + type: number + createdAt: + type: number + caseId: + type: string + actor: + type: string + comment: + type: string + ineligibleForAppeal: + type: boolean + enum: + - false + - true + isCascading: + type: boolean + enum: + - false + - true + required: + - action + - createdAt + - reason + - statusCode + type: object + - properties: + action: + type: string + enum: + - unblocked + createdAt: + type: number + caseId: + type: string + actor: + type: string + comment: + type: string + ineligibleForAppeal: + type: boolean + enum: + - false + - true + isCascading: + type: boolean + enum: + - false + - true + required: + - action + - createdAt + type: object + - properties: + action: + type: string + enum: + - route-blocked + route: + oneOf: + - properties: + src: + type: string + status: + type: number + expiry: + type: number + required: + - src + - status + type: object + - properties: + has: + items: + oneOf: + - properties: + type: + type: string + enum: + - header + key: + type: string + enum: + - x-vercel-ip-country + value: + properties: + eq: + type: string + required: + - eq + type: object + required: + - key + - type + - value + type: object + - properties: + type: + type: string + enum: + - host + value: + properties: + eq: + type: string + required: + - eq + type: object + required: + - type + - value + type: object + type: array + mitigate: + properties: + action: + type: string + enum: + - block_legal_cwc + required: + - action + type: object + src: + type: string + required: + - has + - mitigate + type: object + reason: + type: string + createdAt: + type: number + caseId: + type: string + actor: + type: string + comment: + type: string + ineligibleForAppeal: + type: boolean + enum: + - false + - true + isCascading: + type: boolean + enum: + - false + - true + required: + - action + - createdAt + - reason + - route + type: object + - properties: + action: + type: string + enum: + - route-unblocked + route: + oneOf: + - properties: + src: + type: string + status: + type: number + expiry: + type: number + required: + - src + - status + type: object + - properties: + has: + items: + oneOf: + - properties: + type: + type: string + enum: + - header + key: + type: string + enum: + - x-vercel-ip-country + value: + properties: + eq: + type: string + required: + - eq + type: object + required: + - key + - type + - value + type: object + - properties: + type: + type: string + enum: + - host + value: + properties: + eq: + type: string + required: + - eq + type: object + required: + - type + - value + type: object + type: array + mitigate: + properties: + action: + type: string + enum: + - block_legal_cwc + required: + - action + type: object + src: + type: string + required: + - has + - mitigate + type: object + statusCode: + type: number + createdAt: + type: number + caseId: + type: string + actor: + type: string + comment: + type: string + ineligibleForAppeal: + type: boolean + enum: + - false + - true + isCascading: + type: boolean + enum: + - false + - true + required: + - action + - createdAt + - route + type: object + type: array + interstitial: + type: boolean + enum: + - false + - true + interstitialHistory: + items: + properties: + action: + type: string + enum: + - add-deployment-interstitial + - add-project-interstitial + - remove-deployment-interstitial + - remove-project-interstitial + createdAt: + type: number + caseId: + type: string + reason: + type: string + actor: + type: string + comment: + type: string + required: + - action + - createdAt + type: object + type: array + required: + - history + - updatedAt + type: object + internalRoutes: + items: + oneOf: + - properties: + src: + type: string + status: + type: number + expiry: + type: number + required: + - src + - status + type: object + - properties: + has: items: - $ref: '#/components/schemas/ACLAction' + oneOf: + - properties: + type: + type: string + enum: + - header + key: + type: string + enum: + - x-vercel-ip-country + value: + properties: + eq: + type: string + required: + - eq + type: object + required: + - key + - type + - value + type: object + - properties: + type: + type: string + enum: + - host + value: + properties: + eq: + type: string + required: + - eq + type: object + required: + - type + - value + type: object type: array - webhook-event: + mitigate: + properties: + action: + type: string + enum: + - block_legal_cwc + required: + - action + type: object + src: + type: string + required: + - has + - mitigate + type: object + type: array + hasDeployments: + type: boolean + enum: + - false + - true + dismissedToasts: + items: + properties: + key: + type: string + dismissedAt: + type: number + action: + type: string + enum: + - accept + - cancel + - delete + value: + nullable: true + oneOf: + - type: string + - type: number + - properties: + previousValue: + oneOf: + - type: string + - type: number + - type: boolean + enum: + - false + - true + currentValue: + oneOf: + - type: string + - type: number + - type: boolean + enum: + - false + - true + required: + - currentValue + - previousValue + type: object + - type: boolean + enum: + - false + - true + required: + - action + - dismissedAt + - key + - value + type: object + type: array + protectedSourcemaps: + type: boolean + enum: + - false + - true + tracing: + properties: + domains: + type: string + ignorePaths: + items: + type: string + type: array + samplingRules: + items: + properties: + rate: + type: number + env: + type: string + enum: + - preview + - production + requestPath: + type: string + destination: + type: string + enum: + - external + - internal + description: Which tracing destination this rule applies to. `internal` is the hidden Vercel production-tracing drain (internal delivery); `external` is any customer-configured drain. Derived from the owning drain's delivery type when project tracing is computed; absent on configs persisted before this field existed. + required: + - rate + type: object + type: array + type: object + avatar: + nullable: true + type: string + required: + - accountId + - alias + - defaultResourceConfig + - deploymentExpiration + - directoryListing + - id + - name + - nodeVersion + - resourceConfig + type: object + '400': + description: |- + One of the provided values in the request body is invalid. + One of the provided values in the request query is invalid. + At least one environment variable failed validation + The Bitbucket Webhook for the project link could not be created + The Gitlab Webhook for the project link could not be created + '401': + description: The request is not authorized. + '402': + description: |- + The account is missing a payment so payment method must be updated + Pro customers are allowed to deploy Serverless Functions to up to `proMaxRegions` regions, or if the project was created before the limit was introduced. + Deploying to Serverless Functions to multiple regions requires a plan update + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '409': + description: A project with the provided name already exists. + '410': + description: '' + '428': + description: Owner does not have protection add-on + '429': + description: '' + '500': + description: '' + x-vercel-cli: + supportedSubcommands: true + supportedProduction: false + bodyArguments: + - name + parameters: + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + requestBody: + content: + application/json: + schema: + additionalProperties: false + properties: + enablePreviewFeedback: + description: Opt-in to preview toolbar on the project level + type: boolean + nullable: true + enableProductionFeedback: + description: Opt-in to production toolbar on the project level + type: boolean + nullable: true + previewDeploymentsDisabled: + description: Specifies whether preview deployments are disabled for this project. + type: boolean + nullable: true + previewDeploymentSuffix: + description: Custom domain suffix for preview deployments. Takes precedence over team-level suffix. Must be a domain owned by the team. + type: string + maxLength: 253 + nullable: true + buildCommand: + description: The build command for this project. When `null` is used this value will be automatically detected + maxLength: 256 + type: string + nullable: true + commandForIgnoringBuildStep: + maxLength: 256 + type: string + nullable: true + devCommand: + description: The dev command for this project. When `null` is used this value will be automatically detected + maxLength: 256 + type: string + nullable: true + environmentVariables: + description: Collection of ENV Variables the Project will use + items: + properties: + key: + description: Name of the ENV variable + type: string + target: + description: Deployment Target or Targets in which the ENV variable will be used + oneOf: + - enum: + - production + - preview + - development + - items: + enum: + - production + - preview + - development + type: array + gitBranch: + description: If defined, the git branch of the environment variable (must have target=preview) + type: string + maxLength: 250 + type: + description: Type of the ENV variable + enum: + - system + - encrypted + - plain + - sensitive + type: string + value: + description: Value for the ENV variable + type: string + required: + - key + - value + - target + type: object + type: array + framework: + description: The framework that is being used for this project. When `null` is used no framework is selected + enum: + - null + - container + - blitzjs + - nextjs + - gatsby + - remix + - react-router + - astro + - hexo + - eleventy + - docusaurus-2 + - docusaurus + - preact + - solidstart-1 + - solidstart + - dojo + - ember + - vue + - scully + - ionic-angular + - angular + - polymer + - svelte + - sveltekit + - sveltekit-1 + - ionic-react + - create-react-app + - gridsome + - umijs + - sapper + - saber + - stencil + - nuxtjs + - redwoodjs + - hugo + - jekyll + - brunch + - middleman + - zola + - hydrogen + - vite + - tanstack-start + - tanstack-start-lovable + - vitepress + - vuepress + - parcel + - fastapi + - flask + - fasthtml + - django + - ash + - factory-eve + - eve + - sanity + - sanity-v2 + - storybook + - nitro + - hono + - express + - h3 + - koa + - nestjs + - elysia + - fastify + - xmcp + - python + - ruby + - rust + - axum + - actix-web + - bun + - node + - go + - services + - mastra + gitRepository: + description: The Git Repository that will be connected to the project. When this is defined, any pushes to the specified connected Git Repository will be automatically deployed + properties: + repo: + description: 'The name of the git repository. For example: \"vercel/next.js\"' + type: string + type: + description: The Git Provider of the repository + enum: + - github + - github-limited + - gitlab + - bitbucket + - vercel + - cursor-origin + required: + - type + - repo + type: object + installCommand: + description: The install command for this project. When `null` is used this value will be automatically detected + maxLength: 256 + type: string + nullable: true + name: + description: The desired name for the project + example: a-project-name + type: string + maxLength: 100 + skipGitConnectDuringLink: + description: Opts-out of the message prompting a CLI user to connect a Git repository in `vercel link`. + type: boolean + deprecated: true + ssoProtection: + description: The Vercel Auth setting for the project (historically named \"SSO Protection\") + type: object + properties: + deploymentType: + type: string + enum: + - all + - preview + - prod_deployment_urls_and_all_previews + - all_except_custom_domains + required: + - deploymentType + nullable: true + sandbox: + type: object + description: Specifies the default region and failover regions for sandboxes created in the project + properties: + region: + description: The Vercel region sandboxes in this project are created in by default. + enum: + - iad1 + - sfo1 + - cle1 + - cdg1 + - fra1 + - arn1 + - sin1 + - pdx1 + - lhr1 + - icn1 + - bom1 + - cpt1 + - dub1 + - gru1 + - hkg1 + - syd1 + - yul1 + - hnd1 + - kix1 + example: iad1 + failoverRegions: + description: The regions sandboxes in this project fall back to when they cannot be created in `region`. + type: array + uniqueItems: true + maxItems: 19 + items: + enum: + - iad1 + - sfo1 + - cle1 + - cdg1 + - fra1 + - arn1 + - sin1 + - pdx1 + - lhr1 + - icn1 + - bom1 + - cpt1 + - dub1 + - gru1 + - hkg1 + - syd1 + - yul1 + - hnd1 + - kix1 + example: + - sfo1 + - cle1 + additionalProperties: false + outputDirectory: + description: The output directory of the project. When `null` is used this value will be automatically detected + maxLength: 256 + type: string + nullable: true + publicSource: + deprecated: true + description: Deprecated. Accepted for backwards compatibility but ignored. + type: boolean + nullable: true + rootDirectory: + description: The name of a directory or relative path to the source code of your project. When `null` is used it will default to the project root + maxLength: 256 + type: string + nullable: true + serverlessFunctionRegion: + description: The region to deploy Serverless Functions in this project + maxLength: 4 + type: string + nullable: true + serverlessFunctionZeroConfigFailover: + description: Specifies whether Zero Config Failover is enabled for this project. + type: boolean + oidcTokenConfig: + description: OpenID Connect JSON Web Token generation configuration. + type: object + additionalProperties: false + properties: + enabled: + description: Whether or not to generate OpenID Connect JSON Web Tokens. + deprecated: true + type: boolean + default: true + issuerMode: + description: 'team: `https://oidc.vercel.com/[team_slug]` global: `https://oidc.vercel.com`' + type: string + enum: + - team + - global + default: team + enableAffectedProjectsDeployments: + description: Opt-in to skip deployments when there are no changes to the root directory and its dependencies + type: boolean + resourceConfig: + properties: + buildMachineType: + enum: + - basic + - enhanced + - turbo + - standard + - elastic + fluid: + type: boolean + functionDefaultRegions: + description: The regions to deploy Vercel Functions to for this project + type: array + minItems: 1 + uniqueItems: true + items: + type: string + maxLength: 4 + functionDefaultTimeout: + type: number + maximum: 900 + minimum: 1 + functionDefaultMemoryType: + enum: + - standard_legacy + - standard + - performance + - performance_xl + functionZeroConfigFailover: + description: Specifies whether Zero Config Failover is enabled for this project. + oneOf: + - type: boolean + elasticConcurrencyEnabled: + type: boolean + buildMachineSelection: + enum: + - elastic + - fixed + buildMachineElasticLastUpdated: + type: number + buildMachineElasticReason: + enum: + - oom-failure + - enospc-failure + - build-timeout-failure + - basic-floor + - high-peak-memory + - sustained-high-cpu + - high-peak-disk + - long-build-duration + - short-build-duration + - enterprise-floor + isNSNBDisabled: + type: boolean + buildQueue: + type: object + properties: + configuration: + type: string + enum: + - SKIP_NAMESPACE_QUEUE + - WAIT_FOR_NAMESPACE_QUEUE + enableFunctionsBeta: + type: boolean + type: object + description: Specifies resource override configuration for the project + additionalProperties: false + required: + - name + type: object + /v1/projects/{id_or_name}/token: + post: + description: Generates an OIDC token for the project and returns it. + operationId: getProjectToken + security: + - bearerToken: [] + summary: Generate a project OIDC token + tags: + - projects + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + token: + type: string + required: + - token + type: object + '400': + description: |- + One of the provided values in the request body is invalid. + One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + parameters: + - name: id_or_name + description: The project ID or name + in: path + required: true + schema: + description: The project ID or name + type: string + example: my-project, + maxLength: 150 + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + requestBody: + content: + application/json: + schema: + type: object + properties: + source: + description: The source that is calling the endpoint. + type: string + example: vercel-cli:pull + maxLength: 150 + /v1/projects/traces/session: + post: + description: Mints a short-lived HS256 JWT scoped to a deployment hostname. The Vercel CLI presents this JWT to the Vercel proxy on requests it wants traced. + operationId: createTraceSession + security: + - bearerToken: [] + summary: Create a trace session token for a deployment + tags: + - projects + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + token: + type: string + required: + - token + type: object + '400': + description: One of the provided values in the request body is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '410': + description: '' + '422': + description: '' + parameters: + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + requestBody: + content: + application/json: + schema: + type: object + required: + - projectId + - hostname + additionalProperties: false + properties: + projectId: + type: string + description: The project ID the deployment belongs to. + hostname: + type: string + description: The deployment hostname to scope the trace session to. + /v9/projects/{id_or_name}: + get: + description: Get the information for a specific project by passing either the project `id` or `name` in the URL. + operationId: getProject + security: + - bearerToken: [] + summary: Find a project by id or name + tags: + - projects + responses: + '200': + description: The project information + content: + application/json: + schema: + properties: + integrations: + items: + properties: + installationId: + type: string + description: The integration installation ID. + example: icfg_3bwCLgxL8qt5kjRLcv2Dit7F + resources: + items: + properties: + externalResourceId: + type: string + required: + - externalResourceId + type: object + description: The list of the installation resources connected to the project. + type: array + description: The list of the installation resources connected to the project. + required: + - installationId + type: object + description: Integration installation enabled on the project. + type: array + accountId: + type: string + creator: + properties: + type: + type: string + enum: + - user + via: + nullable: true + oneOf: + - properties: + type: + type: string + enum: + - app + app: + properties: + id: + type: string + description: The internal ID of the Vercel App backing this principal. + clientId: + type: string + description: The protocol-facing OAuth client ID. This may differ from {@link id} when Client ID Metadata Documents (CIMD) are used. + required: + - id + type: object + required: + - app + - type + type: object + description: Set when a Vercel App or Integration acts on behalf of a {@link User}. Captures user-consented OAuth delegation that the ACL layer may inspect to evaluate scope restrictions. This is NOT for impersonation or token-exchange provenance — those live on `auth.token`, not on the principal. + - properties: + type: + type: string + enum: + - integration + integration: + properties: + integrationId: + type: string + configurationId: + type: string + required: + - configurationId + - integrationId + type: object + required: + - integration + - type + type: object + description: Set when a Vercel App or Integration acts on behalf of a {@link User}. Captures user-consented OAuth delegation that the ACL layer may inspect to evaluate scope restrictions. This is NOT for impersonation or token-exchange provenance — those live on `auth.token`, not on the principal. + user: + properties: + id: + type: string + required: + - id + type: object + app: + properties: + id: + type: string + description: The internal ID of the Vercel App backing this principal. + clientId: + type: string + description: The protocol-facing OAuth client ID. This may differ from {@link id} when Client ID Metadata Documents (CIMD) are used. + required: + - id + type: object + integration: + properties: + integrationId: + type: string + configurationId: + type: string + required: + - configurationId + - integrationId + type: object + required: + - type + - user + - via + - app + - integration + type: object + alias: + items: + properties: + configuredBy: + nullable: true + type: string + enum: + - A + - CNAME + - dns-01 + - http + - null + configuredChangedAt: + nullable: true + type: number + createdAt: + nullable: true + type: number + deployment: + nullable: true + properties: + id: + type: string + alias: items: - $ref: '#/components/schemas/ACLAction' + type: string type: array - endpointVerification: + aliasAssigned: + nullable: true + oneOf: + - type: number + - type: boolean + enum: + - false + - true + aliasError: + nullable: true + properties: + code: + type: string + message: + type: string + required: + - code + - message + type: object + aliasFinal: + nullable: true + type: string + automaticAliases: items: - $ref: '#/components/schemas/ACLAction' + type: string type: array - projectTransferIn: + branchMatcher: + properties: + type: + type: string + enum: + - endsWith + - equals + - startsWith + description: The type of matching to perform + pattern: + type: string + description: The pattern to match against branch names + required: + - pattern + - type + type: object + buildingAt: + type: number + builds: items: - $ref: '#/components/schemas/ACLAction' + properties: + use: + type: string + src: + type: string + dest: + type: string + required: + - use + type: object type: array - type: object - lastRollbackTarget: - nullable: true - type: object - lastAliasRequest: - nullable: true - properties: - fromDeploymentId: - type: string - toDeploymentId: - type: string - jobStatus: + checksConclusion: type: string enum: - - succeeded + - canceled - failed - skipped - - pending - - in-progress - requestedAt: + - succeeded + checksState: + type: string + enum: + - completed + - registered + - running + connectBuildsEnabled: + type: boolean + enum: + - false + - true + connectConfigurationId: + type: string + createdAt: type: number - type: + createdIn: + type: string + creator: + nullable: true + properties: + email: + type: string + githubLogin: + type: string + gitlabLogin: + type: string + uid: + type: string + username: + type: string + required: + - email + - uid + - username + type: object + deletedAt: + type: number + deploymentHostname: type: string + forced: + type: boolean enum: - - promote - - rollback - required: - - fromDeploymentId - - toDeploymentId - - jobStatus - - requestedAt - - type - type: object - hasFloatingAliases: - type: boolean - protectionBypass: - additionalProperties: - properties: - createdAt: - type: number - createdBy: - type: string - scope: + - false + - true + name: + type: string + meta: + additionalProperties: type: string - enum: - - automation-bypass - required: - - createdAt - - createdBy - - scope - type: object - type: object - hasActiveBranches: - type: boolean - trustedIps: - nullable: true - oneOf: - - properties: - deploymentType: + type: object + monorepoManager: + nullable: true + type: string + oidcTokenClaims: + properties: + iss: type: string - enum: - - all - - preview - - prod_deployment_urls_and_all_previews - - production - addresses: + sub: + type: string + scope: + type: string + aud: + type: string + owner: + type: string + owner_id: + type: string + project: + type: string + project_id: + type: string + environment: + type: string + custom_environment_id: + type: string + mfe_group_ids: items: - properties: - value: - type: string - note: - type: string - required: - - value - type: object + type: string type: array - protectionMode: - type: string - enum: - - additional - - exclusive - required: - - deploymentType - - addresses - - protectionMode - type: object - - properties: - deploymentType: + plan: type: string - enum: - - all - - preview - - prod_deployment_urls_and_all_previews - - production required: - - deploymentType + - aud + - environment + - iss + - owner + - owner_id + - project + - project_id + - scope + - sub type: object - gitComments: - properties: - onPullRequest: + plan: + type: string + enum: + - enterprise + - hobby + - pro + previewCommentsEnabled: type: boolean - description: Whether the Vercel bot should comment on PRs - onCommit: + enum: + - false + - true + description: Whether or not preview comments are enabled for the deployment + example: false + private: + type: boolean + enum: + - false + - true + readyAt: + type: number + readyState: + type: string + enum: + - BLOCKED + - BUILDING + - CANCELED + - ERROR + - INITIALIZING + - QUEUED + - READY + readySubstate: + type: string + enum: + - PROMOTED + - ROLLING + - STAGED + requestedAt: + type: number + target: + nullable: true + type: string + teamId: + nullable: true + type: string + type: + type: string + enum: + - LAMBDAS + url: + type: string + userId: + type: string + description: Present for user creators; omitted for app/integration/system creators. + withCache: type: boolean - description: Whether the Vercel bot should comment on commits + enum: + - false + - true required: - - onPullRequest - - onCommit + - createdAt + - createdIn + - creator + - deploymentHostname + - id + - name + - plan + - private + - readyState + - type + - url type: object - paused: - type: boolean + domain: + type: string + environment: + type: string + enum: + - preview + - production + gitBranch: + nullable: true + type: string + redirect: + nullable: true + type: string + redirectStatusCode: + nullable: true + type: number + enum: + - 301 + - 302 + - 307 + - 308 + - null + target: + type: string + enum: + - PREVIEW + - PRODUCTION + - STAGING required: - - accountId - - directoryListing - - id - - name - - nodeVersion + - deployment + - domain + - environment + - target type: object type: array - pagination: - $ref: '#/components/schemas/Pagination' - required: - - projects - - pagination - type: object - '400': - description: One of the provided values in the request query is invalid. - '401': - description: '' - '403': - description: You do not have permission to access this resource. - parameters: - - name: from - description: Query only projects updated after the given timestamp - in: query - schema: - description: Query only projects updated after the given timestamp - type: string - - name: gitForkProtection - description: Specifies whether PRs from Git forks should require a team member's authorization before it can be deployed - in: query - schema: - description: Specifies whether PRs from Git forks should require a team member's authorization before it can be deployed - type: string - enum: - - '1' - - '0' - example: '1' - - name: limit - description: Limit the number of projects returned - in: query - schema: - description: Limit the number of projects returned - type: string - - name: search - description: Search projects by the name field - in: query - schema: - description: Search projects by the name field - type: string - - name: repo - description: Filter results by repo. Also used for project count - in: query - schema: - description: Filter results by repo. Also used for project count - type: string - - name: repoId - description: Filter results by Repository ID. - in: query - schema: - description: Filter results by Repository ID. - type: string - - name: repoUrl - description: Filter results by Repository URL. - in: query - schema: - description: Filter results by Repository URL. - type: string - example: 'https://github.com/vercel/next.js' - - name: excludeRepos - description: Filter results by excluding those projects that belong to a repo - in: query - schema: - description: Filter results by excluding those projects that belong to a repo - type: string - - name: edgeConfigId - description: Filter results by connected Edge Config ID - in: query - schema: - description: Filter results by connected Edge Config ID - type: string - - name: edgeConfigTokenId - description: Filter results by connected Edge Config Token ID - in: query - schema: - description: Filter results by connected Edge Config Token ID - type: string - - description: The Team identifier or slug to perform the request on behalf of. - in: query - name: teamId - required: true - schema: - type: string - post: - description: Allows to create a new project with the provided configuration. It only requires the project `name` but more configuration can be provided to override the defaults. - operationId: createProject - security: - - bearerToken: [] - summary: Create a new project - tags: - - projects - responses: - '200': - description: The project was successfuly created - content: - application/json: - schema: - properties: - accountId: - type: string analytics: properties: id: @@ -3538,15 +9594,48 @@ paths: nullable: true type: number required: - - id - - canceledAt - disabledAt - enabledAt + - id + type: object + appliedCve55182Migration: + type: boolean + enum: + - false + - true + speedInsights: + properties: + id: + type: string + enabledAt: + type: number + disabledAt: + type: number + canceledAt: + type: number + hasData: + type: boolean + enum: + - false + - true + dataReceivedAt: + type: number + description: When the first free (not Speed Insights Plus) production data point was observed, in ms. Set once by subscriber-analytics-events; projects that already had data before this field shipped get it backfilled on their next batch, so it reads "first free data point observed", not necessarily "first ever". + paidAt: + type: number + required: + - id type: object autoExposeSystemEnvs: type: boolean + enum: + - false + - true autoAssignCustomDomains: type: boolean + enum: + - false + - true autoAssignCustomDomainsUpdatedBy: type: string buildCommand: @@ -3555,15 +9644,73 @@ paths: commandForIgnoringBuildStep: nullable: true type: string + connectConfigurations: + nullable: true + items: + properties: + envId: + oneOf: + - type: string + - type: string + enum: + - preview + - production + connectConfigurationId: + type: string + dc: + type: string + passive: + type: boolean + enum: + - false + - true + buildsEnabled: + type: boolean + enum: + - false + - true + aws: + properties: + subnetIds: + items: + type: string + type: array + securityGroupId: + type: string + required: + - subnetIds + type: object + createdAt: + type: number + updatedAt: + type: number + required: + - buildsEnabled + - connectConfigurationId + - createdAt + - envId + - passive + - updatedAt + type: object + type: array connectConfigurationId: nullable: true type: string connectBuildsEnabled: type: boolean + enum: + - false + - true + passiveConnectConfigurationId: + nullable: true + type: string createdAt: type: number customerSupportCodeVisibility: type: boolean + enum: + - false + - true crons: properties: enabledAt: @@ -3594,6 +9741,20 @@ paths: type: string description: The cron expression. example: 0 0 * * * + source: + type: string + enum: + - api + description: The origin of this definition. 'api' means created via the API. Undefined means it originated from a deployment (vercel.json). + description: + type: string + description: A human-readable description of what this cron job does. + hostInferred: + type: boolean + enum: + - false + - true + description: Whether the host was inferred from the production deployment URL rather than explicitly provided. required: - host - path @@ -3601,29 +9762,73 @@ paths: type: object type: array required: - - enabledAt + - definitions + - deploymentId - disabledAt + - enabledAt - updatedAt - - deploymentId - - definitions type: object dataCache: properties: userDisabled: type: boolean + enum: + - false + - true storageSizeBytes: nullable: true type: number unlimited: type: boolean + enum: + - false + - true required: - userDisabled type: object + deploymentExpiration: + properties: + expirationDays: + type: number + description: Number of days to keep non-production deployments (mostly preview deployments) before soft deletion. + expirationDaysProduction: + type: number + description: Number of days to keep production deployments before soft deletion. + expirationDaysCanceled: + type: number + description: Number of days to keep canceled deployments before soft deletion. + expirationDaysErrored: + type: number + description: Number of days to keep errored deployments before soft deletion. + deploymentsToKeep: + type: number + description: Minimum number of production deployments to keep for this project, even if they are over the production expiration limit. + type: object + description: Retention policies for deployments. These are enforced at the project level, but we also maintain an instance of this at the team level as a default policy that gets applied to new projects. + expiration: + properties: + expiresAt: + type: number + description: Unix ms timestamp when the project is scheduled to expire. + lockedAt: + type: number + description: Unix ms timestamp when the project was locked. + lockedBy: + type: string + description: userId of the actor that triggered the lock (system or admin). + required: + - expiresAt + - lockedAt + - lockedBy + type: object devCommand: nullable: true type: string directoryListing: type: boolean + enum: + - false + - true installCommand: nullable: true type: string @@ -3635,33 +9840,44 @@ paths: - items: type: string enum: - - production - - preview - development - - preview - development + - preview + - preview + - production type: array - type: string enum: - production - preview - development - - preview - - development type: type: string enum: - - system - - secret - encrypted - plain + - secret - sensitive - id: + - system + sunsetSecretId: type: string - key: + description: This is used to identify variables that have been migrated from type secret to sensitive. + legacyValue: type: string + description: Legacy now-encryption ciphertext, present after migration swaps value/vsmValue + decrypted: + type: boolean + enum: + - false + - true value: type: string + vsmValue: + type: string + id: + type: string + key: + type: string configurationId: nullable: true type: string @@ -3677,6 +9893,12 @@ paths: type: string gitBranch: type: string + visibility: + type: string + enum: + - config + - secret + description: User-facing config/secret model. When set, authoritative for new code paths when the env-var-config-secret-ui flag is enabled. Legacy rows omit this field; legacy rows omit it and callers fall back to existing `type` behavior. edgeConfigId: nullable: true type: string @@ -3694,8 +9916,8 @@ paths: storeId: type: string required: - - type - storeId + - type type: object - properties: type: @@ -3705,8 +9927,8 @@ paths: storeId: type: string required: - - type - storeId + - type type: object - properties: type: @@ -3716,8 +9938,8 @@ paths: storeId: type: string required: - - type - storeId + - type type: object - properties: type: @@ -3727,8 +9949,8 @@ paths: storeId: type: string required: - - type - storeId + - type type: object - properties: type: @@ -3738,8 +9960,30 @@ paths: storeId: type: string required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - blob-store-id + storeId: + type: string + required: + - storeId - type + type: object + - properties: + type: + type: string + enum: + - blob-webhook-public-key + storeId: + type: string + required: - storeId + - type type: object - properties: type: @@ -3749,8 +9993,8 @@ paths: storeId: type: string required: - - type - storeId + - type type: object - properties: type: @@ -3760,8 +10004,8 @@ paths: storeId: type: string required: - - type - storeId + - type type: object - properties: type: @@ -3771,8 +10015,8 @@ paths: storeId: type: string required: - - type - storeId + - type type: object - properties: type: @@ -3782,8 +10026,8 @@ paths: storeId: type: string required: - - type - storeId + - type type: object - properties: type: @@ -3793,8 +10037,8 @@ paths: storeId: type: string required: - - type - storeId + - type type: object - properties: type: @@ -3804,8 +10048,8 @@ paths: storeId: type: string required: - - type - storeId + - type type: object - properties: type: @@ -3815,73 +10059,441 @@ paths: storeId: type: string required: + - storeId - type + type: object + - properties: + type: + type: string + enum: + - postgres-url-no-ssl + storeId: + type: string + required: - storeId + - type type: object - decrypted: - type: boolean - description: Whether `value` is decrypted. + - properties: + type: + type: string + enum: + - integration-store-secret + storeId: + type: string + integrationId: + type: string + integrationProductId: + type: string + integrationConfigurationId: + type: string + required: + - integrationConfigurationId + - integrationId + - integrationProductId + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - flags-connection-string + projectId: + type: string + required: + - projectId + - type + type: object + internalContentHint: + nullable: true + properties: + type: + type: string + enum: + - flags-secret + encryptedValue: + type: string + description: Contains the `value` of the env variable, encrypted with a special key to make decryption possible in the subscriber Lambda. + required: + - encryptedValue + - type + type: object + description: Similar to `contentHints`, but should not be exposed to the user. + comment: + type: string + customEnvironmentIds: + items: + type: string + type: array required: - - type - key + - type - value type: object type: array + customEnvironments: + items: + properties: + id: + type: string + description: 'Unique identifier for the custom environment (format: env_*)' + slug: + type: string + description: URL-friendly name of the environment + type: + type: string + enum: + - development + - preview + - production + description: The type of environment (production, preview, or development) + description: + type: string + description: Optional description of the environment's purpose + branchMatcher: + properties: + type: + type: string + enum: + - endsWith + - equals + - startsWith + description: The type of matching to perform + pattern: + type: string + description: The pattern to match against branch names + required: + - pattern + - type + type: object + description: Configuration for matching git branches to this environment + domains: + items: + properties: + name: + type: string + apexName: + type: string + projectId: + type: string + redirect: + nullable: true + type: string + redirectStatusCode: + nullable: true + type: number + enum: + - 301 + - 302 + - 307 + - 308 + - null + gitBranch: + nullable: true + type: string + customEnvironmentId: + nullable: true + type: string + updatedAt: + type: number + createdAt: + type: number + verified: + type: boolean + enum: + - false + - true + description: '`true` if the domain is verified for use with the project. If `false` it will not be used as an alias on this project until the challenge in `verification` is completed.' + verification: + items: + properties: + type: + type: string + domain: + type: string + value: + type: string + reason: + type: string + required: + - domain + - reason + - type + - value + type: object + description: 'A list of verification challenges, one of which must be completed to verify the domain for use on the project. After the challenge is complete `POST /projects/:idOrName/domains/:domain/verify` to verify the domain. Possible challenges: - If `verification.type = TXT` the `verification.domain` will be checked for a TXT record matching `verification.value`.' + type: array + description: 'A list of verification challenges, one of which must be completed to verify the domain for use on the project. After the challenge is complete `POST /projects/:idOrName/domains/:domain/verify` to verify the domain. Possible challenges: - If `verification.type = TXT` the `verification.domain` will be checked for a TXT record matching `verification.value`.' + required: + - apexName + - name + - projectId + - verified + type: object + description: List of domains associated with this environment + type: array + description: List of domains associated with this environment + currentDeploymentAliases: + items: + type: string + type: array + description: List of aliases for the current deployment + createdAt: + type: number + description: Timestamp when the environment was created + updatedAt: + type: number + description: Timestamp when the environment was last updated + required: + - createdAt + - id + - slug + - type + - updatedAt + type: object + description: Internal representation of a custom environment with all required properties + type: array framework: nullable: true type: string enum: - - blitzjs - - nextjs - - gatsby - - remix + - actix-web + - angular + - ash - astro - - hexo - - eleventy - - docusaurus-2 + - axum + - blitzjs + - brunch + - bun + - container + - create-react-app + - django - docusaurus - - preact - - solidstart + - docusaurus-2 - dojo + - eleventy + - elysia - ember - - vue - - scully + - eve + - express + - factory-eve + - fastapi + - fasthtml + - fastify + - flask + - gatsby + - go + - gridsome + - h3 + - hexo + - hono + - hugo + - hydrogen - ionic-angular - - angular + - ionic-react + - jekyll + - koa + - mastra + - middleman + - nestjs + - nextjs + - nitro + - node + - nuxtjs + - parcel - polymer + - preact + - python + - react-router + - redwoodjs + - remix + - ruby + - rust + - saber + - sanity + - sanity-v2 + - sapper + - scully + - services + - solidstart + - solidstart-1 + - stencil + - storybook - svelte - sveltekit - sveltekit-1 - - ionic-react - - create-react-app - - gridsome + - tanstack-start + - tanstack-start-lovable - umijs - - sapper - - saber - - stencil - - nuxtjs - - redwoodjs - - hugo - - jekyll - - brunch - - middleman - - zola - - hydrogen - vite - vitepress + - vue - vuepress - - parcel - - sanity - - storybook + - xmcp + - zola + - null + services: + items: + properties: + serviceName: + type: string + description: Service name from the deployment (Service.name). + serviceType: + type: string + enum: + - cron + - job + - web + - worker + description: Service kind (Service.type). Omitted for schemas that do not define one. + framework: + type: string + enum: + - actix-web + - angular + - ash + - astro + - axum + - blitzjs + - brunch + - bun + - container + - create-react-app + - django + - docusaurus + - docusaurus-2 + - dojo + - eleventy + - elysia + - ember + - eve + - express + - factory-eve + - fastapi + - fasthtml + - fastify + - flask + - gatsby + - go + - gridsome + - h3 + - hexo + - hono + - hugo + - hydrogen + - ionic-angular + - ionic-react + - jekyll + - koa + - mastra + - middleman + - nestjs + - nextjs + - nitro + - node + - nuxtjs + - parcel + - polymer + - preact + - python + - react-router + - redwoodjs + - remix + - ruby + - rust + - saber + - sanity + - sanity-v2 + - sapper + - scully + - services + - solidstart + - solidstart-1 + - stencil + - storybook + - svelte + - sveltekit + - sveltekit-1 + - tanstack-start + - tanstack-start-lovable + - umijs + - vite + - vitepress + - vue + - vuepress + - xmcp + - zola + description: Framework slug, when the service has one (omitted otherwise). + runtime: + type: string + description: Generic runtime, e.g. 'node' | 'python' | 'go' | 'ruby' | 'rust' (Service.runtime). Omitted for static builds. + required: + - serviceName + type: object + type: array gitForkProtection: type: boolean + enum: + - false + - true gitLFS: type: boolean + enum: + - false + - true id: type: string + ipBuckets: + items: + properties: + bucket: + type: string + default: + type: boolean + enum: + - false + - true + supportUntil: + type: number + required: + - bucket + type: object + type: array + jobs: + properties: + lint: + properties: + targets: + items: + type: string + type: array + required: + - targets + type: object + typecheck: + properties: + targets: + items: + type: string + type: array + required: + - targets + type: object + mfe-config-present: + properties: + targets: + items: + type: string + type: array + required: + - targets + type: object + type: object latestDeployments: items: properties: + id: + type: string alias: items: type: string @@ -3891,6 +10503,9 @@ paths: oneOf: - type: number - type: boolean + enum: + - false + - true aliasError: nullable: true properties: @@ -3909,6 +10524,24 @@ paths: items: type: string type: array + branchMatcher: + properties: + type: + type: string + enum: + - endsWith + - equals + - startsWith + description: The type of matching to perform + pattern: + type: string + description: The pattern to match against branch names + required: + - pattern + - type + type: object + buildingAt: + type: number builds: items: properties: @@ -3922,8 +10555,24 @@ paths: - use type: object type: array + checksConclusion: + type: string + enum: + - canceled + - failed + - skipped + - succeeded + checksState: + type: string + enum: + - completed + - registered + - running connectBuildsEnabled: type: boolean + enum: + - false + - true connectConfigurationId: type: string createdAt: @@ -3948,13 +10597,16 @@ paths: - uid - username type: object + deletedAt: + type: number deploymentHostname: type: string - name: - type: string forced: type: boolean - id: + enum: + - false + - true + name: type: string meta: additionalProperties: @@ -3963,29 +10615,81 @@ paths: monorepoManager: nullable: true type: string + oidcTokenClaims: + properties: + iss: + type: string + sub: + type: string + scope: + type: string + aud: + type: string + owner: + type: string + owner_id: + type: string + project: + type: string + project_id: + type: string + environment: + type: string + custom_environment_id: + type: string + mfe_group_ids: + items: + type: string + type: array + plan: + type: string + required: + - aud + - environment + - iss + - owner + - owner_id + - project + - project_id + - scope + - sub + type: object plan: type: string enum: - - pro - enterprise - hobby - - oss + - pro + previewCommentsEnabled: + type: boolean + enum: + - false + - true + description: Whether or not preview comments are enabled for the deployment + example: false private: type: boolean + enum: + - false + - true + readyAt: + type: number readyState: type: string enum: + - BLOCKED - BUILDING + - CANCELED - ERROR - INITIALIZING - QUEUED - READY - - CANCELED readySubstate: type: string enum: - - STAGED - PROMOTED + - ROLLING + - STAGED requestedAt: type: number target: @@ -4002,217 +10706,651 @@ paths: type: string userId: type: string + description: Present for user creators; omitted for app/integration/system creators. withCache: type: boolean - checksConclusion: + enum: + - false + - true + required: + - createdAt + - createdIn + - creator + - deploymentHostname + - id + - name + - plan + - private + - readyState + - type + - url + type: object + type: array + link: + properties: + org: + type: string + repoOwnerId: + type: number + description: A new field, should be included in all new project links, is being added just in time when a deployment is created. This is needed for Protected Git scopes. + repo: + type: string + repoId: + type: number + type: + type: string + enum: + - github + createdAt: + type: number + deployHooks: + items: + properties: + createdAt: + type: number + id: + type: string + name: + type: string + ref: + type: string + url: + type: string + required: + - id + - name + - ref + - url + type: object + type: array + gitCredentialId: + type: string + updatedAt: + type: number + sourceless: + type: boolean + enum: + - false + - true + productionBranch: + type: string + host: + type: string + projectId: + type: string + projectName: + type: string + projectNameWithNamespace: + type: string + projectNamespace: + type: string + projectOwnerId: + type: number + description: A new field, should be included in all new project links, is being added just in time when a deployment is created. This is needed for Protected Git scopes. This is the id of the top level group that a namespace belongs to. Gitlab supports group nesting (up to 20 levels). + projectUrl: + type: string + name: + type: string + slug: + type: string + owner: + type: string + uuid: + type: string + workspaceUuid: + type: string + ownerId: + type: string + description: Origin namespace id (`ns_…`) of the owner. + required: + - deployHooks + - gitCredentialId + - org + - productionBranch + - type + - host + - projectId + - projectName + - projectNameWithNamespace + - projectNamespace + - projectUrl + - name + - owner + - slug + - uuid + - workspaceUuid + - repo + - repoId + - ownerId + type: object + blobs: + properties: + isDefaultApp: + type: boolean + enum: + - false + - true + description: Marks the team-level, Vercel-managed default blob project (`vercel-blob-default-project`) that orphan blob stores are scoped to when connected without an explicit project. Set only by internal storage flows and immutable after creation — guards rely on it to protect the connected stores from being lost when the project is deleted or transferred. + type: object + microfrontends: + properties: + isDefaultApp: + type: boolean + enum: + - true + updatedAt: + type: number + description: Timestamp when the microfrontends settings were last updated. + groupIds: + type: array + items: + type: string + minItems: 1 + description: The group IDs of microfrontends that this project belongs to. Each microfrontend project must belong to a microfrontends group that is the set of microfrontends that are used together. + enabled: + type: boolean + enum: + - true + description: Whether microfrontends are enabled for this project. + defaultRoute: + type: string + description: A path that is used to take screenshots and as the default path in preview links when a domain for this microfrontend is shown in the UI. Includes the leading slash, e.g. `/docs` + freeProjectForLegacyLimits: + type: boolean + enum: + - false + - true + description: Whether the project was part of the legacy limits for hobby and pro-trial before billing was added. This field is only set when the team is upgraded to a paid plan and we are backfilling the subscription status. We cap the subscription to 2 projects and set this field for the 3rd project. When this field is set, the project is not charged for and we do not call any billing APIs for this project. + routeObservabilityToThisProject: + type: boolean + enum: + - false + - true + description: Whether observability data should be routed to this microfrontend project or a root project. + doNotRouteWithMicrofrontendsRouting: + type: boolean + enum: + - false + - true + description: Whether to add microfrontends routing to aliases. This means domains in this project will route as a microfrontend. + required: + - enabled + - groupIds + - isDefaultApp + - updatedAt + type: object + name: + type: string + nodeVersion: + type: string + enum: + - 10.x + - 12.x + - 14.x + - 16.x + - 18.x + - 20.x + - 22.x + - 24.x + - 8.10.x + optionsAllowlist: + nullable: true + properties: + paths: + items: + properties: + value: + type: string + required: + - value + type: object + type: array + required: + - paths + type: object + outputDirectory: + nullable: true + type: string + passwordProtection: + nullable: true + type: string + description: (opaque JSON object) + passport: + nullable: true + properties: + deploymentType: + type: string + enum: + - all + - all_except_custom_domains + - preview + - prod_deployment_urls_and_all_previews + connectorId: + type: string + required: + - connectorId + - deploymentType + type: object + protectionConfig: + properties: + sandboxUrls: + properties: + inheritDeploymentProtection: + type: boolean + enum: + - false + - true + type: object + type: object + sandbox: + properties: + region: + type: string + enum: + - arn1 + - bom1 + - cdg1 + - cle1 + - cpt1 + - dub1 + - fra1 + - gru1 + - hkg1 + - hnd1 + - iad1 + - icn1 + - kix1 + - lhr1 + - pdx1 + - sfo1 + - sin1 + - syd1 + - yul1 + failoverRegions: + items: type: string enum: - - succeeded - - failed - - skipped - - canceled - checksState: + - arn1 + - bom1 + - cdg1 + - cle1 + - cpt1 + - dub1 + - fra1 + - gru1 + - hkg1 + - hnd1 + - iad1 + - icn1 + - kix1 + - lhr1 + - pdx1 + - sfo1 + - sin1 + - syd1 + - yul1 + type: array + type: object + productionDeploymentsFastLane: + type: boolean + enum: + - false + - true + resourceConfig: + properties: + elasticConcurrencyEnabled: + type: boolean + enum: + - false + - true + fluid: + type: boolean + enum: + - false + - true + functionDefaultRegions: + items: type: string - enum: - - registered - - running - - completed - readyAt: - type: number - buildingAt: - type: number - previewCommentsEnabled: - type: boolean - description: Whether or not preview comments are enabled for the deployment - example: false - required: - - createdAt - - createdIn - - creator - - deploymentHostname - - name - - id - - plan - - private - - readyState - - type - - url - - userId - type: object - type: array - link: - oneOf: - - properties: - org: - type: string - repo: - type: string - repoId: - type: number - type: + type: array + functionDefaultTimeout: + type: number + functionDefaultMemoryType: + type: string + enum: + - performance + - performance_xl + - standard + - standard_legacy + functionZeroConfigFailover: + type: boolean + enum: + - false + - true + buildMachineType: + type: string + enum: + - basic + - enhanced + - standard + - turbo + buildMachineSelection: + type: string + enum: + - elastic + - fixed + buildMachineElasticLastUpdated: + type: number + buildMachineElasticReason: + type: string + enum: + - basic-floor + - build-timeout-failure + - enospc-failure + - enterprise-floor + - high-peak-disk + - high-peak-memory + - long-build-duration + - oom-failure + - short-build-duration + - sustained-high-cpu + isNSNBDisabled: + type: boolean + enum: + - false + - true + buildQueue: + properties: + configuration: type: string enum: - - github - createdAt: - type: number - deployHooks: - items: - properties: - createdAt: - type: number - id: - type: string - name: - type: string - ref: - type: string - url: - type: string - required: - - id - - name - - ref - - url - type: object - type: array - gitCredentialId: - type: string - updatedAt: - type: number - sourceless: - type: boolean - productionBranch: - type: string - required: - - deployHooks + - SKIP_NAMESPACE_QUEUE + - WAIT_FOR_NAMESPACE_QUEUE type: object - - properties: - projectId: - type: string - projectName: - type: string - projectNameWithNamespace: - type: string - projectNamespace: - type: string - projectUrl: - type: string - type: - type: string + enableFunctionsBeta: + type: boolean + enum: + - false + - true + type: object + required: + - functionDefaultRegions + rollbackDescription: + properties: + userId: + type: string + description: The user who rolled back the project. + username: + type: string + description: The username of the user who rolled back the project. + description: + type: string + description: User-supplied explanation of why they rolled back the project. Limited to 250 characters. + createdAt: + type: number + description: Timestamp of when the rollback was requested. + required: + - createdAt + - description + - userId + - username + type: object + description: Description of why a project was rolled back, and by whom. Note that lastAliasRequest contains the from/to details of the rollback. + rollingRelease: + nullable: true + properties: + target: + type: string + description: The environment that the release targets, currently only supports production. Adding in case we want to configure with alias groups or custom environments. + example: production + stages: + nullable: true + items: + properties: + targetPercentage: + type: number + description: The percentage of traffic to serve to the canary deployment (0-100) + example: 25 + requireApproval: + type: boolean + enum: + - false + - true + description: Whether or not this stage requires manual approval to proceed + example: false + duration: + type: number + description: Duration in minutes for automatic advancement to the next stage + example: 600 + linearShift: + type: boolean + enum: + - false + - true + description: Whether to linearly shift traffic over the duration of this stage + example: false + required: + - targetPercentage + type: object + description: 'An array of all the stages required during a deployment release. Each stage defines a target percentage and advancement rules. The final stage must always have targetPercentage: 100.' + type: array + description: 'An array of all the stages required during a deployment release. Each stage defines a target percentage and advancement rules. The final stage must always have targetPercentage: 100.' + canaryResponseHeader: + type: boolean + enum: + - false + - true + description: Whether the request served by a canary deployment should return a header indicating a canary was served. Defaults to `false` when omitted. + example: false + gate: + properties: + enabled: + type: boolean enum: - - gitlab - createdAt: - type: number - deployHooks: + - false + - true + description: Whether automated gating is enabled for this project's rollouts. + checks: items: properties: - createdAt: - type: number - id: - type: string - name: - type: string - ref: - type: string - url: + type: type: string + enum: + - error-rate-5xx + description: The metric this check evaluates. + minSampleSize: + type: number + description: Minimum number of requests required in the window before the check can fail. Below this, the check is inconclusive rather than failing, so low-traffic stages don't gate on noise. Defaults to `100` when omitted. + example: 100 + excludeStatusCodes: + items: + type: number + type: array + description: Response status codes to ignore entirely — dropped from both the numerator (errors) and the denominator (total requests). Defaults to `[]` when omitted. + example: + - 503 + excludePaths: + items: + type: string + type: array + description: Request paths to ignore entirely — dropped from both the numerator (errors) and the denominator (total requests). Matched exactly against the request path with any query string removed; no prefix or glob matching. Defaults to `[]` when omitted. + example: + - /api/health + ingestWatermarkSeconds: + type: number + description: 'Seconds of ingest lag to allow for: the query''s upper bound is `now() - this value`, so the check never reads a window that is still filling. Defaults to `30` when omitted.' + example: 30 required: - - id - - name - - ref - - url + - type type: object + description: The checks to evaluate. An empty array means nothing is evaluated. type: array - gitCredentialId: - type: string - updatedAt: + description: The checks to evaluate. An empty array means nothing is evaluated. + failureThreshold: type: number - sourceless: - type: boolean - productionBranch: + description: How many failing evaluations within {@link windowSize} trip the gate. Defaults to `3` when omitted. + example: 3 + windowSize: + type: number + description: How many of the most recent evaluations {@link failureThreshold} is counted against. Defaults to `5` when omitted. + example: 5 + action: type: string + enum: + - pause + - rollback + description: 'What to do when the gate trips: pause the rollout, or roll it back.' + dryRun: + type: boolean + enum: + - false + - true + description: When true, a tripped gate is only reported — {@link action} is not taken. required: - - deployHooks + - action + - checks + - dryRun + - enabled type: object - - properties: - name: - type: string - slug: - type: string - owner: - type: string - type: + description: 'Automated gating configuration. Omitted (the default) means no gating is configured, which is equivalent to `enabled: false`.' + required: + - target + type: object + description: Project-level rolling release configuration that defines how deployments should be gradually rolled out + defaultResourceConfig: + properties: + elasticConcurrencyEnabled: + type: boolean + enum: + - false + - true + fluid: + type: boolean + enum: + - false + - true + functionDefaultRegions: + items: + type: string + type: array + functionDefaultTimeout: + type: number + functionDefaultMemoryType: + type: string + enum: + - performance + - performance_xl + - standard + - standard_legacy + functionZeroConfigFailover: + type: boolean + enum: + - false + - true + buildMachineType: + type: string + enum: + - basic + - enhanced + - standard + - turbo + buildMachineSelection: + type: string + enum: + - elastic + - fixed + buildMachineElasticLastUpdated: + type: number + buildMachineElasticReason: + type: string + enum: + - basic-floor + - build-timeout-failure + - enospc-failure + - enterprise-floor + - high-peak-disk + - high-peak-memory + - long-build-duration + - oom-failure + - short-build-duration + - sustained-high-cpu + isNSNBDisabled: + type: boolean + enum: + - false + - true + buildQueue: + properties: + configuration: type: string enum: - - bitbucket - uuid: - type: string - workspaceUuid: - type: string - createdAt: - type: number - deployHooks: - items: - properties: - createdAt: - type: number - id: - type: string - name: - type: string - ref: - type: string - url: - type: string - required: - - id - - name - - ref - - url - type: object - type: array - gitCredentialId: - type: string - updatedAt: - type: number - sourceless: - type: boolean - productionBranch: - type: string - required: - - deployHooks + - SKIP_NAMESPACE_QUEUE + - WAIT_FOR_NAMESPACE_QUEUE type: object - name: - type: string - nodeVersion: - type: string - enum: - - 18.x - - 16.x - - 14.x - - 12.x - - 10.x - outputDirectory: - nullable: true - type: string - passwordProtection: - nullable: true + enableFunctionsBeta: + type: boolean + enum: + - false + - true type: object - productionDeploymentsFastLane: - type: boolean - publicSource: - nullable: true - type: boolean + required: + - functionDefaultRegions rootDirectory: nullable: true type: string - serverlessFunctionRegion: - nullable: true - type: string + serverlessFunctionZeroConfigFailover: + type: boolean + enum: + - false + - true + skewProtectionBoundaryAt: + type: number + skewProtectionMaxAge: + type: number + skewProtectionAllowedDomains: + items: + type: string + type: array skipGitConnectDuringLink: type: boolean + enum: + - false + - true + staticIps: + properties: + builds: + type: boolean + enum: + - false + - true + enabled: + type: boolean + enum: + - false + - true + regions: + items: + type: string + type: array + required: + - builds + - enabled + - regions + type: object sourceFilesOutsideRootDirectory: type: boolean + enum: + - false + - true + enableAffectedProjectsDeployments: + type: boolean + enum: + - false + - true + enableExternalRewriteCaching: + type: boolean + enum: + - false + - true ssoProtection: nullable: true properties: @@ -4220,8 +11358,27 @@ paths: type: string enum: - all + - all_except_custom_domains + - preview + - prod_deployment_urls_and_all_previews + cve55182MigrationAppliedFrom: + nullable: true + type: string + enum: + - all + - all_except_custom_domains + - preview + - prod_deployment_urls_and_all_previews + - null + april2026SecurityIncidentMigrationAppliedFrom: + nullable: true + type: string + enum: + - all + - all_except_custom_domains - preview - prod_deployment_urls_and_all_previews + - null required: - deploymentType type: object @@ -4229,6 +11386,8 @@ paths: additionalProperties: nullable: true properties: + id: + type: string alias: items: type: string @@ -4238,6 +11397,9 @@ paths: oneOf: - type: number - type: boolean + enum: + - false + - true aliasError: nullable: true properties: @@ -4256,6 +11418,24 @@ paths: items: type: string type: array + branchMatcher: + properties: + type: + type: string + enum: + - endsWith + - equals + - startsWith + description: The type of matching to perform + pattern: + type: string + description: The pattern to match against branch names + required: + - pattern + - type + type: object + buildingAt: + type: number builds: items: properties: @@ -4269,8 +11449,24 @@ paths: - use type: object type: array + checksConclusion: + type: string + enum: + - canceled + - failed + - skipped + - succeeded + checksState: + type: string + enum: + - completed + - registered + - running connectBuildsEnabled: type: boolean + enum: + - false + - true connectConfigurationId: type: string createdAt: @@ -4295,13 +11491,16 @@ paths: - uid - username type: object + deletedAt: + type: number deploymentHostname: type: string - name: - type: string forced: type: boolean - id: + enum: + - false + - true + name: type: string meta: additionalProperties: @@ -4310,29 +11509,81 @@ paths: monorepoManager: nullable: true type: string + oidcTokenClaims: + properties: + iss: + type: string + sub: + type: string + scope: + type: string + aud: + type: string + owner: + type: string + owner_id: + type: string + project: + type: string + project_id: + type: string + environment: + type: string + custom_environment_id: + type: string + mfe_group_ids: + items: + type: string + type: array + plan: + type: string + required: + - aud + - environment + - iss + - owner + - owner_id + - project + - project_id + - scope + - sub + type: object plan: type: string enum: - - pro - enterprise - hobby - - oss + - pro + previewCommentsEnabled: + type: boolean + enum: + - false + - true + description: Whether or not preview comments are enabled for the deployment + example: false private: type: boolean + enum: + - false + - true + readyAt: + type: number readyState: type: string enum: + - BLOCKED - BUILDING + - CANCELED - ERROR - INITIALIZING - QUEUED - READY - - CANCELED readySubstate: type: string enum: - - STAGED - PROMOTED + - ROLLING + - STAGED requestedAt: type: number target: @@ -4349,42 +11600,24 @@ paths: type: string userId: type: string + description: Present for user creators; omitted for app/integration/system creators. withCache: type: boolean - checksConclusion: - type: string - enum: - - succeeded - - failed - - skipped - - canceled - checksState: - type: string enum: - - registered - - running - - completed - readyAt: - type: number - buildingAt: - type: number - previewCommentsEnabled: - type: boolean - description: Whether or not preview comments are enabled for the deployment - example: false + - false + - true required: - createdAt - createdIn - creator - deploymentHostname - - name - id + - name - plan - private - readyState - type - url - - userId type: object type: object transferCompletedAt: @@ -4399,128 +11632,682 @@ paths: type: number live: type: boolean + enum: + - false + - true enablePreviewFeedback: nullable: true type: boolean + enum: + - false + - true + - null + enableProductionFeedback: + nullable: true + type: boolean + enum: + - false + - true + - null permissions: properties: + oauth2Connection: + items: + $ref: '#/components/schemas/ACLAction' + type: array + user: + items: + $ref: '#/components/schemas/ACLAction' + type: array + userConnection: + items: + $ref: '#/components/schemas/ACLAction' + type: array + userMfaConfiguration: + items: + $ref: '#/components/schemas/ACLAction' + type: array + userPreference: + items: + $ref: '#/components/schemas/ACLAction' + type: array + userSudo: + items: + $ref: '#/components/schemas/ACLAction' + type: array + webAuthn: + items: + $ref: '#/components/schemas/ACLAction' + type: array + accessGroup: + items: + $ref: '#/components/schemas/ACLAction' + type: array + agent: + items: + $ref: '#/components/schemas/ACLAction' + type: array + aiGatewayApiKey: + items: + $ref: '#/components/schemas/ACLAction' + type: array + aiGatewayApiKeyBypassAll: + items: + $ref: '#/components/schemas/ACLAction' + type: array + aiGatewayApiKeyOwnedBySelf: + items: + $ref: '#/components/schemas/ACLAction' + type: array + aiGatewayApiKeySpendAttribution: + items: + $ref: '#/components/schemas/ACLAction' + type: array + aiGatewayApiKeyZdrExemption: + items: + $ref: '#/components/schemas/ACLAction' + type: array + aiGatewayBudget: + items: + $ref: '#/components/schemas/ACLAction' + type: array + aiGatewayCredits: + items: + $ref: '#/components/schemas/ACLAction' + type: array + aiGatewayPrivateModels: + items: + $ref: '#/components/schemas/ACLAction' + type: array + aiGatewayGuardrails: + items: + $ref: '#/components/schemas/ACLAction' + type: array + aiGatewayRules: + items: + $ref: '#/components/schemas/ACLAction' + type: array + aiGatewaySettings: + items: + $ref: '#/components/schemas/ACLAction' + type: array + aiGatewayTranscripts: + items: + $ref: '#/components/schemas/ACLAction' + type: array + aiGatewayTranscriptsSettings: + items: + $ref: '#/components/schemas/ACLAction' + type: array + aiGatewayUsage: + items: + $ref: '#/components/schemas/ACLAction' + type: array + aiGatewayVirtualModelConfigs: + items: + $ref: '#/components/schemas/ACLAction' + type: array + alerts: + items: + $ref: '#/components/schemas/ACLAction' + type: array + alertRules: + items: + $ref: '#/components/schemas/ACLAction' + type: array aliasGlobal: items: $ref: '#/components/schemas/ACLAction' type: array - analyticsSampling: + analyticsSampling: + items: + $ref: '#/components/schemas/ACLAction' + type: array + analyticsUsage: + items: + $ref: '#/components/schemas/ACLAction' + type: array + apiKey: + items: + $ref: '#/components/schemas/ACLAction' + type: array + apiKeyAiGateway: + items: + $ref: '#/components/schemas/ACLAction' + type: array + apiKeyOwnedBySelf: + items: + $ref: '#/components/schemas/ACLAction' + type: array + oauth2Application: + items: + $ref: '#/components/schemas/ACLAction' + type: array + vercelAppInstallation: + items: + $ref: '#/components/schemas/ACLAction' + type: array + vercelAppInstallationRequest: + items: + $ref: '#/components/schemas/ACLAction' + type: array + auditLog: + items: + $ref: '#/components/schemas/ACLAction' + type: array + automation: + items: + $ref: '#/components/schemas/ACLAction' + type: array + billingAddress: + items: + $ref: '#/components/schemas/ACLAction' + type: array + billingInformation: + items: + $ref: '#/components/schemas/ACLAction' + type: array + billingInvoice: + items: + $ref: '#/components/schemas/ACLAction' + type: array + billingInvoiceEmailRecipient: + items: + $ref: '#/components/schemas/ACLAction' + type: array + billingInvoiceLanguage: + items: + $ref: '#/components/schemas/ACLAction' + type: array + billingPlan: + items: + $ref: '#/components/schemas/ACLAction' + type: array + billingPurchaseOrder: + items: + $ref: '#/components/schemas/ACLAction' + type: array + billingRefund: + items: + $ref: '#/components/schemas/ACLAction' + type: array + billingTaxId: + items: + $ref: '#/components/schemas/ACLAction' + type: array + blob: + items: + $ref: '#/components/schemas/ACLAction' + type: array + blobStoreTokenSet: + items: + $ref: '#/components/schemas/ACLAction' + type: array + budget: + items: + $ref: '#/components/schemas/ACLAction' + type: array + cacheArtifact: + items: + $ref: '#/components/schemas/ACLAction' + type: array + cacheArtifactUsageEvent: + items: + $ref: '#/components/schemas/ACLAction' + type: array + codeChecks: + items: + $ref: '#/components/schemas/ACLAction' + type: array + codeOwners: + items: + $ref: '#/components/schemas/ACLAction' + type: array + ciInvocations: + items: + $ref: '#/components/schemas/ACLAction' + type: array + ciLogs: + items: + $ref: '#/components/schemas/ACLAction' + type: array + concurrentBuilds: + items: + $ref: '#/components/schemas/ACLAction' + type: array + connect: + items: + $ref: '#/components/schemas/ACLAction' + type: array + connectConfiguration: + items: + $ref: '#/components/schemas/ACLAction' + type: array + connectLogs: + items: + $ref: '#/components/schemas/ACLAction' + type: array + connexClient: + items: + $ref: '#/components/schemas/ACLAction' + type: array + connexClientProject: + items: + $ref: '#/components/schemas/ACLAction' + type: array + connexContact: + items: + $ref: '#/components/schemas/ACLAction' + type: array + connexInstallation: + items: + $ref: '#/components/schemas/ACLAction' + type: array + connexToken: + items: + $ref: '#/components/schemas/ACLAction' + type: array + buildMachineDefault: + items: + $ref: '#/components/schemas/ACLAction' + type: array + cursorOriginInstallation: + items: + $ref: '#/components/schemas/ACLAction' + type: array + dataCacheBillingSettings: + items: + $ref: '#/components/schemas/ACLAction' + type: array + defaultDeploymentProtection: + items: + $ref: '#/components/schemas/ACLAction' + type: array + deploymentPolicy: + items: + $ref: '#/components/schemas/ACLAction' + type: array + domain: + items: + $ref: '#/components/schemas/ACLAction' + type: array + domainAcceptDelegation: + items: + $ref: '#/components/schemas/ACLAction' + type: array + domainAuthCodes: + items: + $ref: '#/components/schemas/ACLAction' + type: array + domainCertificate: + items: + $ref: '#/components/schemas/ACLAction' + type: array + domainCheckConfig: + items: + $ref: '#/components/schemas/ACLAction' + type: array + domainMove: + items: + $ref: '#/components/schemas/ACLAction' + type: array + domainPurchase: + items: + $ref: '#/components/schemas/ACLAction' + type: array + domainRecord: + items: + $ref: '#/components/schemas/ACLAction' + type: array + domainTransferIn: + items: + $ref: '#/components/schemas/ACLAction' + type: array + drain: + items: + $ref: '#/components/schemas/ACLAction' + type: array + edgeConfig: + items: + $ref: '#/components/schemas/ACLAction' + type: array + edgeConfigItem: + items: + $ref: '#/components/schemas/ACLAction' + type: array + edgeConfigSchema: + items: + $ref: '#/components/schemas/ACLAction' + type: array + edgeConfigToken: + items: + $ref: '#/components/schemas/ACLAction' + type: array + endpointVerification: + items: + $ref: '#/components/schemas/ACLAction' + type: array + event: + items: + $ref: '#/components/schemas/ACLAction' + type: array + fileUpload: + items: + $ref: '#/components/schemas/ACLAction' + type: array + flagsExplorerSubscription: + items: + $ref: '#/components/schemas/ACLAction' + type: array + gitRepository: + items: + $ref: '#/components/schemas/ACLAction' + type: array + imageOptimizationNewPrice: + items: + $ref: '#/components/schemas/ACLAction' + type: array + integration: + items: + $ref: '#/components/schemas/ACLAction' + type: array + integrationAccount: + items: + $ref: '#/components/schemas/ACLAction' + type: array + integrationConfiguration: + items: + $ref: '#/components/schemas/ACLAction' + type: array + integrationConfigurationProjects: + items: + $ref: '#/components/schemas/ACLAction' + type: array + integrationConfigurationRole: + items: + $ref: '#/components/schemas/ACLAction' + type: array + integrationConfigurationTransfer: + items: + $ref: '#/components/schemas/ACLAction' + type: array + integrationDeploymentAction: + items: + $ref: '#/components/schemas/ACLAction' + type: array + integrationEvent: + items: + $ref: '#/components/schemas/ACLAction' + type: array + integrationLog: + items: + $ref: '#/components/schemas/ACLAction' + type: array + integrationResource: + items: + $ref: '#/components/schemas/ACLAction' + type: array + integrationResourceData: + items: + $ref: '#/components/schemas/ACLAction' + type: array + integrationResourceReplCommand: + items: + $ref: '#/components/schemas/ACLAction' + type: array + integrationResourceSecrets: + items: + $ref: '#/components/schemas/ACLAction' + type: array + integrationSSOSession: + items: + $ref: '#/components/schemas/ACLAction' + type: array + integrationStrict: + items: + $ref: '#/components/schemas/ACLAction' + type: array + integrationStoreTokenSet: + items: + $ref: '#/components/schemas/ACLAction' + type: array + integrationVercelConfigurationOverride: + items: + $ref: '#/components/schemas/ACLAction' + type: array + integrationPullRequest: + items: + $ref: '#/components/schemas/ACLAction' + type: array + ipBlocking: + items: + $ref: '#/components/schemas/ACLAction' + type: array + jobGlobal: + items: + $ref: '#/components/schemas/ACLAction' + type: array + kmsIssuer: + items: + $ref: '#/components/schemas/ACLAction' + type: array + kmsProjectGrant: + items: + $ref: '#/components/schemas/ACLAction' + type: array + logDrain: + items: + $ref: '#/components/schemas/ACLAction' + type: array + marketplaceBillingData: + items: + $ref: '#/components/schemas/ACLAction' + type: array + marketplaceExperimentationEdgeConfigData: + items: + $ref: '#/components/schemas/ACLAction' + type: array + marketplaceExperimentationItem: + items: + $ref: '#/components/schemas/ACLAction' + type: array + marketplaceFlexCommit: + items: + $ref: '#/components/schemas/ACLAction' + type: array + marketplaceInstallationMember: + items: + $ref: '#/components/schemas/ACLAction' + type: array + marketplaceInvoice: + items: + $ref: '#/components/schemas/ACLAction' + type: array + marketplaceSettings: + items: + $ref: '#/components/schemas/ACLAction' + type: array + Monitoring: + items: + $ref: '#/components/schemas/ACLAction' + type: array + monitoringAlert: + items: + $ref: '#/components/schemas/ACLAction' + type: array + monitoringChart: + items: + $ref: '#/components/schemas/ACLAction' + type: array + monitoringQuery: + items: + $ref: '#/components/schemas/ACLAction' + type: array + monitoringSettings: + items: + $ref: '#/components/schemas/ACLAction' + type: array + notificationCustomerBudget: items: $ref: '#/components/schemas/ACLAction' type: array - analyticsUsage: + notificationDeploymentFailed: items: $ref: '#/components/schemas/ACLAction' type: array - auditLog: + notificationDomainConfiguration: items: $ref: '#/components/schemas/ACLAction' type: array - billingAddress: + notificationDomainExpire: items: $ref: '#/components/schemas/ACLAction' type: array - billingInformation: + notificationDomainMoved: items: $ref: '#/components/schemas/ACLAction' type: array - billingInvoice: + notificationDomainPurchase: items: $ref: '#/components/schemas/ACLAction' type: array - billingInvoiceEmailRecipient: + notificationDomainRenewal: items: $ref: '#/components/schemas/ACLAction' type: array - billingInvoiceLanguage: + notificationDomainTransfer: items: $ref: '#/components/schemas/ACLAction' type: array - billingPlan: + notificationDomainUnverified: items: $ref: '#/components/schemas/ACLAction' type: array - billingPurchaseOrder: + NotificationMonitoringAlert: items: $ref: '#/components/schemas/ACLAction' type: array - billingTaxId: + notificationPaymentFailed: items: $ref: '#/components/schemas/ACLAction' type: array - blob: + notificationPreferences: items: $ref: '#/components/schemas/ACLAction' type: array - budget: + notificationStatementOfReasons: items: $ref: '#/components/schemas/ACLAction' type: array - cacheArtifact: + notificationUsageAlert: items: $ref: '#/components/schemas/ACLAction' type: array - cacheArtifactUsageEvent: + oidcFederationPolicy: items: $ref: '#/components/schemas/ACLAction' type: array - concurrentBuilds: + observabilityConfiguration: items: $ref: '#/components/schemas/ACLAction' type: array - connect: + observabilityFunnel: items: $ref: '#/components/schemas/ACLAction' type: array - connectConfiguration: + observabilityNotebook: items: $ref: '#/components/schemas/ACLAction' type: array - domain: + openTelemetryEndpoint: items: $ref: '#/components/schemas/ACLAction' type: array - domainAcceptDelegation: + ownEvent: items: $ref: '#/components/schemas/ACLAction' type: array - domainAuthCodes: + organization: items: $ref: '#/components/schemas/ACLAction' type: array - domainCertificate: + organizationDomain: items: $ref: '#/components/schemas/ACLAction' type: array - domainCheckConfig: + organizationTeam: items: $ref: '#/components/schemas/ACLAction' type: array - domainMove: + passwordProtectionInvoiceItem: items: $ref: '#/components/schemas/ACLAction' type: array - domainPurchase: + paymentMethod: items: $ref: '#/components/schemas/ACLAction' type: array - domainRecord: + permissions: items: $ref: '#/components/schemas/ACLAction' type: array - domainTransferIn: + postgres: items: $ref: '#/components/schemas/ACLAction' type: array - event: + postgresStoreTokenSet: items: $ref: '#/components/schemas/ACLAction' type: array - ownEvent: + previewDeploymentSuffix: + items: + $ref: '#/components/schemas/ACLAction' + type: array + privateCloudAccount: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectTransferIn: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectTransferRequest: + items: + $ref: '#/components/schemas/ACLAction' + type: array + proTrialOnboarding: + items: + $ref: '#/components/schemas/ACLAction' + type: array + rateLimit: + items: + $ref: '#/components/schemas/ACLAction' + type: array + redis: + items: + $ref: '#/components/schemas/ACLAction' + type: array + redisStoreTokenSet: + items: + $ref: '#/components/schemas/ACLAction' + type: array + remoteCaching: + items: + $ref: '#/components/schemas/ACLAction' + type: array + repository: + items: + $ref: '#/components/schemas/ACLAction' + type: array + samlConfig: + items: + $ref: '#/components/schemas/ACLAction' + type: array + secret: + items: + $ref: '#/components/schemas/ACLAction' + type: array + securityConfig: items: $ref: '#/components/schemas/ACLAction' type: array @@ -4528,762 +12315,2221 @@ paths: items: $ref: '#/components/schemas/ACLAction' type: array - fileUpload: + sharedEnvVars: items: $ref: '#/components/schemas/ACLAction' type: array - gitRepository: + sharedEnvVarsProduction: items: $ref: '#/components/schemas/ACLAction' type: array - ipBlocking: + space: items: $ref: '#/components/schemas/ACLAction' type: array - integration: + spaceRun: items: $ref: '#/components/schemas/ACLAction' type: array - integrationConfiguration: + storeIsLocked: items: $ref: '#/components/schemas/ACLAction' type: array - integrationConfigurationTransfer: + storeTokenSetSensitive: items: $ref: '#/components/schemas/ACLAction' type: array - integrationConfigurationProjects: + storeTransfer: items: $ref: '#/components/schemas/ACLAction' type: array - integrationVercelConfigurationOverride: + supportCase: items: $ref: '#/components/schemas/ACLAction' type: array - jobGlobal: + supportCaseComment: items: $ref: '#/components/schemas/ACLAction' type: array - logDrain: + team: items: $ref: '#/components/schemas/ACLAction' type: array - Monitoring: + teamAccessRequest: items: $ref: '#/components/schemas/ACLAction' type: array - monitoringQuery: + teamFellowMembership: items: $ref: '#/components/schemas/ACLAction' type: array - monitoringChart: + teamGitExclusivity: items: $ref: '#/components/schemas/ACLAction' type: array - monitoringAlert: + teamInvite: items: $ref: '#/components/schemas/ACLAction' type: array - notificationDeploymentFailed: + teamInviteCode: items: $ref: '#/components/schemas/ACLAction' type: array - notificationDomainConfiguration: + teamInviteLink: items: $ref: '#/components/schemas/ACLAction' type: array - notificationDomainExpire: + teamJoin: items: $ref: '#/components/schemas/ACLAction' type: array - notificationDomainMoved: + teamMemberMfaStatus: items: $ref: '#/components/schemas/ACLAction' type: array - notificationDomainPurchase: + teamMicrofrontends: items: $ref: '#/components/schemas/ACLAction' type: array - notificationDomainRenewal: + teamOwnMembership: items: $ref: '#/components/schemas/ACLAction' type: array - notificationDomainTransfer: + teamOwnMembershipDisconnectSAML: items: $ref: '#/components/schemas/ACLAction' type: array - notificationDomainUnverified: + teamSudo: items: $ref: '#/components/schemas/ACLAction' type: array - NotificationMonitoringAlert: + teamTokenInvalidation: items: $ref: '#/components/schemas/ACLAction' type: array - notificationPaymentFailed: + token: items: $ref: '#/components/schemas/ACLAction' type: array - notificationUsageAlert: + toolbarComment: items: $ref: '#/components/schemas/ACLAction' type: array - notificationCustomerBudget: + usage: items: $ref: '#/components/schemas/ACLAction' type: array - openTelemetryEndpoint: + usageCycle: items: $ref: '#/components/schemas/ACLAction' type: array - paymentMethod: + vcrRepository: items: $ref: '#/components/schemas/ACLAction' type: array - permissions: + vpcPeeringConnection: items: $ref: '#/components/schemas/ACLAction' type: array - postgres: + webAnalyticsPlan: items: $ref: '#/components/schemas/ACLAction' type: array - previewDeploymentSuffix: + webhook: items: $ref: '#/components/schemas/ACLAction' type: array - proTrialOnboarding: + webhook-event: items: $ref: '#/components/schemas/ACLAction' type: array - seawallConfig: + aliasProject: items: $ref: '#/components/schemas/ACLAction' type: array - sharedEnvVars: + aliasProtectionBypass: items: $ref: '#/components/schemas/ACLAction' type: array - sharedEnvVarsProduction: + bulkRedirects: items: $ref: '#/components/schemas/ACLAction' type: array - space: + buildMachine: items: $ref: '#/components/schemas/ACLAction' type: array - spaceRun: + connectConfigurationLink: items: $ref: '#/components/schemas/ACLAction' type: array - passwordProtectionInvoiceItem: + dataCacheNamespace: items: $ref: '#/components/schemas/ACLAction' type: array - rateLimit: + deployment: items: $ref: '#/components/schemas/ACLAction' type: array - redis: + deploymentBuildLogs: items: $ref: '#/components/schemas/ACLAction' type: array - remoteCaching: + deploymentCheck: items: $ref: '#/components/schemas/ACLAction' type: array - samlConfig: + deploymentCheckPreview: items: $ref: '#/components/schemas/ACLAction' type: array - secret: + deploymentCheckReRunFromProductionBranch: items: $ref: '#/components/schemas/ACLAction' type: array - supportCase: + deploymentProductionGit: items: $ref: '#/components/schemas/ACLAction' type: array - supportCaseComment: + deploymentV0: items: $ref: '#/components/schemas/ACLAction' type: array - dataCacheBillingSettings: + deploymentPreview: items: $ref: '#/components/schemas/ACLAction' type: array - team: + deploymentPrivate: items: $ref: '#/components/schemas/ACLAction' type: array - teamAccessRequest: + deploymentPromote: items: $ref: '#/components/schemas/ACLAction' type: array - teamFellowMembership: + deploymentRollback: items: $ref: '#/components/schemas/ACLAction' type: array - teamInvite: + edgeCacheNamespace: items: $ref: '#/components/schemas/ACLAction' type: array - teamInviteCode: + environments: items: $ref: '#/components/schemas/ACLAction' type: array - teamJoin: + job: items: $ref: '#/components/schemas/ACLAction' type: array - teamOwnMembership: + logs: items: $ref: '#/components/schemas/ACLAction' type: array - teamOwnMembershipDisconnectSAML: + logsPreset: items: $ref: '#/components/schemas/ACLAction' type: array - token: + observabilityData: items: $ref: '#/components/schemas/ACLAction' type: array - usage: + onDemandBuild: items: $ref: '#/components/schemas/ACLAction' type: array - usageCycle: + onDemandConcurrency: items: $ref: '#/components/schemas/ACLAction' type: array - user: + optionsAllowlist: items: $ref: '#/components/schemas/ACLAction' type: array - userConnection: + passwordProtection: items: $ref: '#/components/schemas/ACLAction' type: array - webAnalyticsPlan: + privateLinkEndpoint: items: $ref: '#/components/schemas/ACLAction' type: array - edgeConfig: + productionAliasProtectionBypass: items: $ref: '#/components/schemas/ACLAction' type: array - edgeConfigItem: + productionShareableLink: items: $ref: '#/components/schemas/ACLAction' type: array - edgeConfigToken: + project: items: $ref: '#/components/schemas/ACLAction' type: array - webhook: + projectAccessGroup: items: $ref: '#/components/schemas/ACLAction' type: array - webhook-event: + projectAnalyticsSampling: items: $ref: '#/components/schemas/ACLAction' type: array - endpointVerification: + projectAnalyticsUsage: items: $ref: '#/components/schemas/ACLAction' type: array - projectTransferIn: + projectCheck: items: $ref: '#/components/schemas/ACLAction' type: array - aliasProject: + projectCheckRun: items: $ref: '#/components/schemas/ACLAction' type: array - aliasProtectionBypass: + projectDeploymentExpiration: items: $ref: '#/components/schemas/ACLAction' type: array - connectConfigurationLink: + projectDeploymentHook: items: $ref: '#/components/schemas/ACLAction' type: array - dataCacheNamespace: + projectDeploymentProtectionStrict: items: $ref: '#/components/schemas/ACLAction' type: array - deployment: + projectDomain: items: $ref: '#/components/schemas/ACLAction' type: array - deploymentCheck: + projectDomainCheckConfig: items: $ref: '#/components/schemas/ACLAction' type: array - deploymentCheckPreview: + projectDomainMove: items: $ref: '#/components/schemas/ACLAction' type: array - deploymentCheckReRunFromProductionBranch: + projectDomainVerify: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectEvent: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectEnvVars: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectEnvVarsProduction: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectEnvVarsUnownedByIntegration: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectFlags: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectFlagsProduction: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectFlagsSdkKey: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectFromV0: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectId: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectIntegrationConfiguration: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectLink: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectMember: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectMonitoring: items: $ref: '#/components/schemas/ACLAction' type: array - deploymentProductionGit: + projectOIDCToken: items: $ref: '#/components/schemas/ACLAction' type: array - deploymentPreview: + projectPermissions: items: $ref: '#/components/schemas/ACLAction' type: array - deploymentPrivate: + projectProductionBranch: items: $ref: '#/components/schemas/ACLAction' type: array - deploymentPromote: + projectProtectionBypass: items: $ref: '#/components/schemas/ACLAction' type: array - deploymentRollback: + projectRollingRelease: items: $ref: '#/components/schemas/ACLAction' type: array - logs: + projectRoutes: items: $ref: '#/components/schemas/ACLAction' type: array - logsPreset: + projectSupportCase: items: $ref: '#/components/schemas/ACLAction' type: array - passwordProtection: + projectSupportCaseComment: items: $ref: '#/components/schemas/ACLAction' type: array - job: + projectTier: items: $ref: '#/components/schemas/ACLAction' type: array - project: + projectTransfer: items: $ref: '#/components/schemas/ACLAction' type: array - projectAnalyticsSampling: + projectTransferOut: items: $ref: '#/components/schemas/ACLAction' type: array - projectDeploymentHook: + projectUsage: items: $ref: '#/components/schemas/ACLAction' type: array - projectDomain: + pageIntegrity: items: $ref: '#/components/schemas/ACLAction' type: array - projectDomainMove: + seawallConfig: items: $ref: '#/components/schemas/ACLAction' type: array - projectDomainCheckConfig: + securityPlusConfiguration: items: $ref: '#/components/schemas/ACLAction' type: array - projectEnvVars: + shareableLink: items: $ref: '#/components/schemas/ACLAction' type: array - projectEnvVarsProduction: + shareableLinkStrict: items: $ref: '#/components/schemas/ACLAction' type: array - projectEnvVarsUnownedByIntegration: + sharedEnvVarConnection: items: $ref: '#/components/schemas/ACLAction' type: array - projectId: + skewProtection: items: $ref: '#/components/schemas/ACLAction' type: array - projectIntegrationConfiguration: + analytics: items: $ref: '#/components/schemas/ACLAction' type: array - projectLink: + trustedIps: items: $ref: '#/components/schemas/ACLAction' type: array - projectMember: + trustedSources: items: $ref: '#/components/schemas/ACLAction' type: array - projectMonitoring: + v0Chat: items: $ref: '#/components/schemas/ACLAction' type: array - projectPermissions: + vercelAuth: items: $ref: '#/components/schemas/ACLAction' type: array - projectProductionBranch: + vercelRun: items: $ref: '#/components/schemas/ACLAction' type: array - projectTransfer: + webAnalytics: items: $ref: '#/components/schemas/ACLAction' type: array - projectTransferOut: + workflowRunData: items: $ref: '#/components/schemas/ACLAction' type: array - projectProtectionBypass: + type: object + lastRollbackTarget: + nullable: true + type: string + description: (opaque JSON object) + lastAliasRequest: + nullable: true + properties: + fromDeploymentId: + nullable: true + type: string + toDeploymentId: + type: string + fromRollingReleaseId: + type: string + description: If rolling back from a rolling release, fromDeploymentId captures the "base" of that rolling release, and fromRollingReleaseId captures the "target" of that rolling release. + jobStatus: + type: string + enum: + - failed + - in-progress + - pending + - skipped + - succeeded + requestedAt: + type: number + type: + type: string + enum: + - promote + - rollback + required: + - fromDeploymentId + - jobStatus + - requestedAt + - toDeploymentId + - type + type: object + protectionBypass: + additionalProperties: + oneOf: + - properties: + createdAt: + type: number + createdBy: + type: string + scope: + type: string + enum: + - integration-automation-bypass + integrationId: + type: string + configurationId: + type: string + required: + - configurationId + - createdAt + - createdBy + - integrationId + - scope + type: object + - properties: + createdAt: + type: number + createdBy: + type: string + scope: + type: string + enum: + - automation-bypass + isEnvVar: + type: boolean + enum: + - false + - true + description: When there was only one bypass, it was automatically set as an env var on deployments. With multiple bypasses, there is always one bypass that is selected as the default, and gets set as an env var on deployments. As this is a new field, undefined means that the bypass is the env var. If there are any automation bypasses, exactly one must be the env var. + note: + type: string + description: Optional note about the bypass to be displayed in the UI + required: + - createdAt + - createdBy + - scope + type: object + type: object + hasActiveBranches: + type: boolean + enum: + - false + - true + trustedIps: + nullable: true + properties: + deploymentType: + type: string + enum: + - all + - all_except_custom_domains + - preview + - prod_deployment_urls_and_all_previews + - production + addresses: items: - $ref: '#/components/schemas/ACLAction' + properties: + value: + type: string + note: + type: string + required: + - value + type: object type: array - projectUsage: + protectionMode: + type: string + enum: + - additional + - exclusive + required: + - addresses + - deploymentType + - protectionMode + type: object + trustedSources: + nullable: true + properties: + enableVercelCiSameRepository: + type: boolean + enum: + - false + - true + description: Allow same-team Vercel CI access to preview deployments built from the CI run's repository, using the deployment source rather than the current project repository link. Defaults to enabled when not stored; omitted or null Trusted Sources updates preserve the stored value. + projects: + additionalProperties: + properties: + label: + type: string + customAllow: + items: + properties: + from: + oneOf: + - properties: + slugs: + items: + type: string + type: array + description: System environment slugs (`production`, `preview`) and/or custom environment slugs defined on the referenced project. + preset: + type: string + enum: + - all-custom + required: + - slugs + type: object + description: The source envs on the trusted project that are allowed to access `to`. + - properties: + slugs: + items: + type: string + type: array + description: System environment slugs (`production`, `preview`) and/or custom environment slugs defined on the referenced project. + preset: + type: string + enum: + - all-custom + required: + - preset + type: object + description: The source envs on the trusted project that are allowed to access `to`. + to: + oneOf: + - properties: + slugs: + items: + type: string + type: array + description: System environment slugs (`production`, `preview`) and/or custom environment slugs defined on the referenced project. + preset: + type: string + enum: + - all-custom + required: + - slugs + type: object + description: The target envs on the current project that may be accessed. + - properties: + slugs: + items: + type: string + type: array + description: System environment slugs (`production`, `preview`) and/or custom environment slugs defined on the referenced project. + preset: + type: string + enum: + - all-custom + required: + - preset + type: object + description: The target envs on the current project that may be accessed. + required: + - from + - to + type: object + description: Optional overrides for the default same-env-by-slug matching. Provide explicit rules to allow cross-env access or presets. + type: array + description: Optional overrides for the default same-env-by-slug matching. Provide explicit rules to allow cross-env access or presets. + type: object + type: object + oidcProviders: + additionalProperties: + items: + properties: + to: + oneOf: + - properties: + slugs: + items: + type: string + type: array + description: System environment slugs (`production`, `preview`) and/or custom environment slugs defined on the referenced project. + preset: + type: string + enum: + - all-custom + required: + - slugs + type: object + description: The target envs on the current project that may be accessed. + - properties: + slugs: + items: + type: string + type: array + description: System environment slugs (`production`, `preview`) and/or custom environment slugs defined on the referenced project. + preset: + type: string + enum: + - all-custom + required: + - preset + type: object + description: The target envs on the current project that may be accessed. + label: + type: string + claims: + additionalProperties: + items: + type: string + type: array + type: object + required: + - claims + - to + type: object + type: array + type: object + type: object + gitComments: + properties: + onPullRequest: + type: boolean + enum: + - false + - true + description: Whether the Vercel bot should comment on PRs + onCommit: + type: boolean + enum: + - false + - true + description: Whether the Vercel bot should comment on commits + required: + - onCommit + - onPullRequest + type: object + gitProviderOptions: + properties: + createDeployments: + type: string + enum: + - disabled + - enabled + description: 'Whether the Vercel bot should automatically create GitHub deployments https://docs.github.com/en/rest/deployments/deployments#about-deployments NOTE: repository-dispatch events should be used instead' + disableRepositoryDispatchEvents: + type: boolean + enum: + - false + - true + description: 'Whether the Vercel bot should not automatically create GitHub repository-dispatch events on deployment events. https://vercel.com/docs/git/vercel-for-github#repository-dispatch-events - `true`: disable repository-dispatch events for this project (explicit override of the team setting). - `false`: enable repository-dispatch events for this project (explicit override of the team setting). - absent: inherit from `team.disableRepositoryDispatchEvents`.' + requireVerifiedCommits: + type: boolean + enum: + - false + - true + description: 'Whether the project requires commits to be signed & verified before deployments will be created. - `true`: require verified commits for this project (explicit override of the team setting). - `false`: do not require verified commits (explicit override of the team setting). - absent: inherit from `team.requireVerifiedCommits`.' + gitCommitStatus: + type: boolean + enum: + - false + - true + description: Whether Vercel should post commit statuses for this project. When omitted, commit statuses remain enabled. + consolidatedGitCommitStatus: + properties: + enabled: + type: boolean + enum: + - false + - true + description: Whether consolidated commit status is enabled. + propagateFailures: + type: boolean + enum: + - false + - true + description: Whether to propagate individual deployment failures to the consolidated status. + required: + - enabled + - propagateFailures + type: object + description: Configuration for consolidated git commit status reporting. When enabled, Vercel will post a single consolidated commit status instead of individual statuses for each deployment. + required: + - createDeployments + type: object + paused: + type: boolean + enum: + - false + - true + concurrencyBucketName: + type: string + webAnalytics: + properties: + id: + type: string + disabledAt: + type: number + canceledAt: + type: number + enabledAt: + type: number + hasData: + type: boolean + enum: + - true + required: + - id + type: object + security: + properties: + attackModeEnabled: + type: boolean + enum: + - false + - true + attackModeUpdatedAt: + type: number + firewallEnabled: + type: boolean + enum: + - false + - true + firewallUpdatedAt: + type: number + attackModeActiveUntil: + nullable: true + type: number + firewallConfigVersion: + type: number + rulesets: + additionalProperties: + properties: + action: + type: string + enum: + - allow + - bypass + - challenge + - deny + - log + - rate_limit + - redirect + rateLimit: + nullable: true + properties: + algo: + type: string + enum: + - fixed_window + - token_bucket + window: + type: number + limit: + type: number + keys: + items: + type: string + type: array + required: + - algo + - keys + - limit + - window + type: object + redirect: + nullable: true + properties: + location: + type: string + permanent: + type: boolean + enum: + - false + - true + required: + - location + - permanent + type: object + actionDuration: + nullable: true + type: string + bypassSystem: + nullable: true + type: boolean + enum: + - false + - true + - null + logHeaders: + oneOf: + - items: + type: string + type: array + - type: string + enum: + - '*' + required: + - action + type: object + type: object + firewallSeawallEnabled: + type: boolean + enum: + - false + - true + ja3Enabled: + type: boolean + enum: + - false + - true + ja4Enabled: + type: boolean + enum: + - false + - true + firewallBypassIps: items: - $ref: '#/components/schemas/ACLAction' + type: string type: array - projectAnalyticsUsage: + managedRules: + nullable: true + properties: + vercel_ruleset: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - challenge + - deny + - log + required: + - active + type: object + traffic_sources: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - challenge + - deny + - log + required: + - active + type: object + bot_filter: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - challenge + - deny + - log + required: + - active + type: object + ai_bots: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - challenge + - deny + - log + required: + - active + type: object + owasp: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - challenge + - deny + - log + required: + - active + type: object + required: + - ai_bots + - bot_filter + - owasp + - traffic_sources + - vercel_ruleset + type: object + botIdEnabled: + type: boolean + enum: + - false + - true + log_headers: + oneOf: + - items: + type: string + type: array + - type: string + enum: + - '*' + securityPlus: + type: boolean + enum: + - false + - true + securityPlusMetadata: + properties: + updatedAt: + type: number + firstEnabledAt: + type: number + description: Timestamp when the feature was first enabled. Never changes after initial enablement. + required: + - updatedAt + type: object + pageIntegrityEnabled: + type: boolean + enum: + - false + - true + description: Whether Page Integrity is enabled for this project. Used by the metadata service to gate DynamoDB lookups against the page-integrity-inventory table. + type: object + oidcTokenConfig: + properties: + enabled: + type: boolean + enum: + - false + - true + description: Whether or not to generate OpenID Connect JSON Web Tokens. + issuerMode: + type: string + enum: + - global + - team + description: '- team: `https://oidc.vercel.com/[team_slug]` - global: `https://oidc.vercel.com`' + type: object + deploymentPolicy: + nullable: true + properties: + gitSources: + nullable: true items: - $ref: '#/components/schemas/ACLAction' + properties: + sources: + items: + oneOf: + - properties: + provider: + type: string + enum: + - bitbucket + - github + org: + type: string + repo: + type: string + required: + - org + - provider + type: object + description: Allowlist entry for GitHub and Bitbucket, whose repos are identified by a flat `org`/`repo` (Bitbucket's workspace/owner maps to `org`, its repo slug to `repo`). Omit `repo` to match any repo in the org. Org is matched case-insensitively. + - properties: + provider: + type: string + enum: + - gitlab + namespace: + type: string + project: + type: string + required: + - namespace + - provider + type: object + description: Allowlist entry for GitLab, which uses nested groups rather than a flat org/repo. `namespace` is the full group path (e.g. `group` or `group/subgroup`); `project` is the leaf project name. Omit `project` to match any project under the namespace. Namespace is matched case-insensitively. + type: array + enabled: + type: boolean + enum: + - false + - true + environments: + items: + oneOf: + - properties: + type: + type: string + enum: + - system + target: + type: string + enum: + - preview + - production + required: + - target + - type + type: object + - properties: + type: + type: string + enum: + - custom + environmentId: + type: string + required: + - environmentId + - type + type: object + type: array + required: + - enabled + - environments + - sources + type: object + description: '`enabled: true` with empty `sources` is deny-all.' type: array - analytics: + deploymentSources: + nullable: true items: - $ref: '#/components/schemas/ACLAction' + properties: + sources: + items: + type: string + enum: + - cli + - deploy-hook + - git + - integration + - rest-api + - v0 + description: 'Customer-configurable deployment sources. Every deploy classifies to exactly one. JSON schema in `packages/deployment-policy/schemas/body.ts` enumerates exactly these values. - `''git''` — git provider webhook. - `''cli''` — Vercel CLI (legacy classic-token CLI and SIWV CLI both). - `''rest-api''` — direct user/team-token REST upload. Does NOT cover deploy hooks, Marketplace integrations, or first-party app tokens. - `''deploy-hook''` — project deploy-hook URL. The URL is the credential. - `''integration''` — third-party Marketplace actor: Marketplace integration token, user-delegated OAuth from a Marketplace app, or an unrecognized third-party Vercel App. First-party Vercel Apps are never `''integration''`. - `''v0''` — the v0 product surface (entitlement-gated). v0 deploys through the CLI under the hood, but classifies as its own source so a team can allow or deny v0 independently of `''cli''`. First-party Vercel apps (Toolbar, etc.) classify as `''first-party''` — see `ClassifiedSource` in `./checks`. They''re not in this union because they aren''t customer-configurable; they bypass `checkDeploymentSources` entirely. v0 is intentionally NOT among them: like the CLI, it''s a real product surface and is policy-controllable.' + type: array + enabled: + type: boolean + enum: + - false + - true + environments: + items: + oneOf: + - properties: + type: + type: string + enum: + - system + target: + type: string + enum: + - preview + - production + required: + - target + - type + type: object + - properties: + type: + type: string + enum: + - custom + environmentId: + type: string + required: + - environmentId + - type + type: object + type: array + required: + - enabled + - environments + - sources + type: object + description: '`enabled: true` with empty `sources` is deny-all.' type: array - trustedIps: + type: object + description: Project shape. `null` on a rule list clears the project's override for that rule type (fall back to team for every env); omitting is equivalent. Setting `deploymentPolicy` itself to `null` clears every override at once. Kept structurally distinct from {@link TeamDeploymentPolicy} so the two storage locations don't share a type by accident. + tier: + type: string + enum: + - advanced + - critical + - priority + usageStatus: + properties: + kind: + type: string + enum: + - flat + description: Billing mode. Always 'flat' for flat-rate projects. + exceededAllowanceUntil: + type: number + description: Timestamp until which the project has exceeded its CDN allowance. + bypassThrottleUntil: + type: number + description: Timestamp until which throttling is bypassed (project pays list rates for overage). + throttled: + type: boolean + enum: + - false + - true + description: Per-project throttle, set explicitly for this project (e.g. via the per-project Flat Rate CDN endpoint). + teamThrottled: + type: boolean + enum: + - false + - true + description: Synced from `team.billing.usageStatus.throttled`. When `true`, the team has throttled all of its projects regardless of `throttled`. The effective throttle the CDN enforces is `throttled || teamThrottled`. + required: + - kind + type: object + features: + properties: + webAnalytics: + type: boolean + enum: + - false + - true + type: object + v0: + type: boolean + enum: + - false + - true + v0Created: + type: boolean + enum: + - false + - true + abuse: + properties: + scanner: + type: string + history: items: - $ref: '#/components/schemas/ACLAction' + properties: + scanner: + type: string + reason: + type: string + by: + type: string + byId: + type: string + at: + type: number + required: + - at + - by + - byId + - reason + - scanner + type: object type: array - webAnalytics: + updatedAt: + type: number + block: + properties: + action: + type: string + enum: + - blocked + reason: + type: string + statusCode: + type: number + createdAt: + type: number + caseId: + type: string + actor: + type: string + comment: + type: string + ineligibleForAppeal: + type: boolean + enum: + - false + - true + isCascading: + type: boolean + enum: + - false + - true + required: + - action + - createdAt + - reason + - statusCode + type: object + blockHistory: items: - $ref: '#/components/schemas/ACLAction' + oneOf: + - properties: + action: + type: string + enum: + - blocked + reason: + type: string + statusCode: + type: number + createdAt: + type: number + caseId: + type: string + actor: + type: string + comment: + type: string + ineligibleForAppeal: + type: boolean + enum: + - false + - true + isCascading: + type: boolean + enum: + - false + - true + required: + - action + - createdAt + - reason + - statusCode + type: object + - properties: + action: + type: string + enum: + - unblocked + createdAt: + type: number + caseId: + type: string + actor: + type: string + comment: + type: string + ineligibleForAppeal: + type: boolean + enum: + - false + - true + isCascading: + type: boolean + enum: + - false + - true + required: + - action + - createdAt + type: object + - properties: + action: + type: string + enum: + - route-blocked + route: + oneOf: + - properties: + src: + type: string + status: + type: number + expiry: + type: number + required: + - src + - status + type: object + - properties: + has: + items: + oneOf: + - properties: + type: + type: string + enum: + - header + key: + type: string + enum: + - x-vercel-ip-country + value: + properties: + eq: + type: string + required: + - eq + type: object + required: + - key + - type + - value + type: object + - properties: + type: + type: string + enum: + - host + value: + properties: + eq: + type: string + required: + - eq + type: object + required: + - type + - value + type: object + type: array + mitigate: + properties: + action: + type: string + enum: + - block_legal_cwc + required: + - action + type: object + src: + type: string + required: + - has + - mitigate + type: object + reason: + type: string + createdAt: + type: number + caseId: + type: string + actor: + type: string + comment: + type: string + ineligibleForAppeal: + type: boolean + enum: + - false + - true + isCascading: + type: boolean + enum: + - false + - true + required: + - action + - createdAt + - reason + - route + type: object + - properties: + action: + type: string + enum: + - route-unblocked + route: + oneOf: + - properties: + src: + type: string + status: + type: number + expiry: + type: number + required: + - src + - status + type: object + - properties: + has: + items: + oneOf: + - properties: + type: + type: string + enum: + - header + key: + type: string + enum: + - x-vercel-ip-country + value: + properties: + eq: + type: string + required: + - eq + type: object + required: + - key + - type + - value + type: object + - properties: + type: + type: string + enum: + - host + value: + properties: + eq: + type: string + required: + - eq + type: object + required: + - type + - value + type: object + type: array + mitigate: + properties: + action: + type: string + enum: + - block_legal_cwc + required: + - action + type: object + src: + type: string + required: + - has + - mitigate + type: object + statusCode: + type: number + createdAt: + type: number + caseId: + type: string + actor: + type: string + comment: + type: string + ineligibleForAppeal: + type: boolean + enum: + - false + - true + isCascading: + type: boolean + enum: + - false + - true + required: + - action + - createdAt + - route + type: object type: array - sharedEnvVarConnection: + interstitial: + type: boolean + enum: + - false + - true + interstitialHistory: items: - $ref: '#/components/schemas/ACLAction' + properties: + action: + type: string + enum: + - add-deployment-interstitial + - add-project-interstitial + - remove-deployment-interstitial + - remove-project-interstitial + createdAt: + type: number + caseId: + type: string + reason: + type: string + actor: + type: string + comment: + type: string + required: + - action + - createdAt + type: object type: array - type: object - lastRollbackTarget: - nullable: true - type: object - lastAliasRequest: - nullable: true - properties: - fromDeploymentId: - type: string - toDeploymentId: - type: string - jobStatus: - type: string - enum: - - succeeded - - failed - - skipped - - pending - - in-progress - requestedAt: - type: number - type: - type: string - enum: - - promote - - rollback required: - - fromDeploymentId - - toDeploymentId - - jobStatus - - requestedAt - - type + - history + - updatedAt type: object - hasFloatingAliases: + internalRoutes: + items: + oneOf: + - properties: + src: + type: string + status: + type: number + expiry: + type: number + required: + - src + - status + type: object + - properties: + has: + items: + oneOf: + - properties: + type: + type: string + enum: + - header + key: + type: string + enum: + - x-vercel-ip-country + value: + properties: + eq: + type: string + required: + - eq + type: object + required: + - key + - type + - value + type: object + - properties: + type: + type: string + enum: + - host + value: + properties: + eq: + type: string + required: + - eq + type: object + required: + - type + - value + type: object + type: array + mitigate: + properties: + action: + type: string + enum: + - block_legal_cwc + required: + - action + type: object + src: + type: string + required: + - has + - mitigate + type: object + type: array + hasDeployments: type: boolean - protectionBypass: - additionalProperties: + enum: + - false + - true + dismissedToasts: + items: properties: - createdAt: - type: number - createdBy: + key: type: string - scope: + dismissedAt: + type: number + action: type: string enum: - - automation-bypass - required: - - createdAt - - createdBy - - scope - type: object - type: object - hasActiveBranches: - type: boolean - trustedIps: - nullable: true - oneOf: - - properties: - deploymentType: - type: string - enum: - - all - - preview - - prod_deployment_urls_and_all_previews - - production - addresses: - items: - properties: - value: - type: string - note: - type: string + - accept + - cancel + - delete + value: + nullable: true + oneOf: + - type: string + - type: number + - properties: + previousValue: + oneOf: + - type: string + - type: number + - type: boolean + enum: + - false + - true + currentValue: + oneOf: + - type: string + - type: number + - type: boolean + enum: + - false + - true required: - - value + - currentValue + - previousValue type: object - type: array - protectionMode: - type: string - enum: - - additional - - exclusive - required: - - deploymentType - - addresses - - protectionMode - type: object - - properties: - deploymentType: - type: string - enum: - - all - - preview - - prod_deployment_urls_and_all_previews - - production - required: - - deploymentType - type: object - gitComments: - properties: - onPullRequest: - type: boolean - description: Whether the Vercel bot should comment on PRs - onCommit: - type: boolean - description: Whether the Vercel bot should comment on commits - required: - - onPullRequest - - onCommit - type: object - paused: + - type: boolean + enum: + - false + - true + required: + - action + - dismissedAt + - key + - value + type: object + type: array + protectedSourcemaps: type: boolean - required: - - accountId - - directoryListing - - id - - name - - nodeVersion - type: object - '400': - description: |- - One of the provided values in the request body is invalid. - One of the provided values in the request query is invalid. - The Bitbucket Webhook for the project link could not be created - The Gitlab Webhook for the project link could not be created - '401': - description: '' - '402': - description: |- - The account was soft-blocked for an unhandled reason. - The account is missing a payment so payment method must be updated - '403': - description: You do not have permission to access this resource. - '409': - description: A project with the provided name already exists. - parameters: - - description: The Team identifier or slug to perform the request on behalf of. - in: query - name: teamId - required: true - schema: - type: string - requestBody: - content: - application/json: - schema: - additionalProperties: false - properties: - buildCommand: - description: The build command for this project. When `null` is used this value will be automatically detected - maxLength: 256 - type: string - nullable: true - commandForIgnoringBuildStep: - maxLength: 256 - type: string - nullable: true - devCommand: - description: The dev command for this project. When `null` is used this value will be automatically detected - maxLength: 256 - type: string - nullable: true - environmentVariables: - description: Collection of ENV Variables the Project will use - items: + enum: + - false + - true + tracing: properties: - key: - description: Name of the ENV variable - type: string - target: - description: Deployment Target or Targets in which the ENV variable will be used - oneOf: - - enum: - - production - - preview - - development - - items: - enum: - - production - - preview - - development - type: array - gitBranch: - description: The git branch of the environment variable - type: string - maxLength: 250 - example: feature-1 - type: - description: Type of the ENV variable - enum: - - system - - secret - - encrypted - - plain - type: string - value: - description: Value for the ENV variable + domains: type: string - required: - - key - - value - - target + ignorePaths: + items: + type: string + type: array + samplingRules: + items: + properties: + rate: + type: number + env: + type: string + enum: + - preview + - production + requestPath: + type: string + destination: + type: string + enum: + - external + - internal + description: Which tracing destination this rule applies to. `internal` is the hidden Vercel production-tracing drain (internal delivery); `external` is any customer-configured drain. Derived from the owning drain's delivery type when project tracing is computed; absent on configs persisted before this field existed. + required: + - rate + type: object + type: array type: object - type: array - framework: - description: The framework that is being used for this project. When `null` is used no framework is selected - enum: - - null - - blitzjs - - nextjs - - gatsby - - remix - - astro - - hexo - - eleventy - - docusaurus-2 - - docusaurus - - preact - - solidstart - - dojo - - ember - - vue - - scully - - ionic-angular - - angular - - polymer - - svelte - - sveltekit - - sveltekit-1 - - ionic-react - - create-react-app - - gridsome - - umijs - - sapper - - saber - - stencil - - nuxtjs - - redwoodjs - - hugo - - jekyll - - brunch - - middleman - - zola - - hydrogen - - vite - - vitepress - - vuepress - - parcel - - sanity - - storybook - gitRepository: - description: 'The Git Repository that will be connected to the project. When this is defined, any pushes to the specified connected Git Repository will be automatically deployed' - properties: - repo: - description: 'The name of the git repository. For example: \"vercel/next.js\"' - type: string - type: - description: The Git Provider of the repository - enum: - - github - - gitlab - - bitbucket - required: - - type - - repo - type: object - installCommand: - description: The install command for this project. When `null` is used this value will be automatically detected - maxLength: 256 - type: string - nullable: true - name: - description: The desired name for the project - example: a-project-name - type: string - maxLength: 100 - pattern: '^[a-z0-9]([a-z0-9]|-[a-z0-9])*$' - skipGitConnectDuringLink: - description: Opts-out of the message prompting a CLI user to connect a Git repository in `vercel link`. - type: boolean - deprecated: true - outputDirectory: - description: The output directory of the project. When `null` is used this value will be automatically detected - maxLength: 256 - type: string - nullable: true - publicSource: - description: Specifies whether the source code and logs of the deployments for this project should be public or not - type: boolean - nullable: true - rootDirectory: - description: The name of a directory or relative path to the source code of your project. When `null` is used it will default to the project root - maxLength: 256 - type: string - nullable: true - serverlessFunctionRegion: - description: The region to deploy Serverless Functions in this project - maxLength: 4 - type: string - nullable: true - required: - - name - type: object - '/v9/projects/{idOrName}': - get: - description: Get the information for a specific project by passing either the project `id` or `name` in the URL. - operationId: getProject + avatar: + nullable: true + type: string + required: + - accountId + - alias + - defaultResourceConfig + - deploymentExpiration + - directoryListing + - id + - name + - nodeVersion + - resourceConfig + type: object + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '410': + description: '' + x-vercel-cli: + supportedSubcommands: true + supportedProduction: false + aliases: + - inspect + - get + parameters: + - name: id_or_name + description: The unique project identifier or the project name + in: path + required: true + schema: + example: prj_12HKQaOmR5t5Uy6vdcQsNIiZgHGB + description: The unique project identifier or the project name + type: string + x-vercel-cli: + kind: argument + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + patch: + description: Update the fields of a project using either its `name` or `id`. + operationId: updateProject security: - bearerToken: [] - summary: Find a project by id or name + summary: Update an existing project tags: - projects responses: '200': - description: The project information + description: The project was successfully updated content: application/json: schema: properties: accountId: type: string + creator: + properties: + type: + type: string + enum: + - user + via: + nullable: true + oneOf: + - properties: + type: + type: string + enum: + - app + app: + properties: + id: + type: string + description: The internal ID of the Vercel App backing this principal. + clientId: + type: string + description: The protocol-facing OAuth client ID. This may differ from {@link id} when Client ID Metadata Documents (CIMD) are used. + required: + - id + type: object + required: + - app + - type + type: object + description: Set when a Vercel App or Integration acts on behalf of a {@link User}. Captures user-consented OAuth delegation that the ACL layer may inspect to evaluate scope restrictions. This is NOT for impersonation or token-exchange provenance — those live on `auth.token`, not on the principal. + - properties: + type: + type: string + enum: + - integration + integration: + properties: + integrationId: + type: string + configurationId: + type: string + required: + - configurationId + - integrationId + type: object + required: + - integration + - type + type: object + description: Set when a Vercel App or Integration acts on behalf of a {@link User}. Captures user-consented OAuth delegation that the ACL layer may inspect to evaluate scope restrictions. This is NOT for impersonation or token-exchange provenance — those live on `auth.token`, not on the principal. + user: + properties: + id: + type: string + required: + - id + type: object + app: + properties: + id: + type: string + description: The internal ID of the Vercel App backing this principal. + clientId: + type: string + description: The protocol-facing OAuth client ID. This may differ from {@link id} when Client ID Metadata Documents (CIMD) are used. + required: + - id + type: object + integration: + properties: + integrationId: + type: string + configurationId: + type: string + required: + - configurationId + - integrationId + type: object + required: + - type + - user + - via + - app + - integration + type: object + alias: + items: + properties: + configuredBy: + nullable: true + type: string + enum: + - A + - CNAME + - dns-01 + - http + - null + configuredChangedAt: + nullable: true + type: number + createdAt: + nullable: true + type: number + deployment: + nullable: true + properties: + id: + type: string + alias: + items: + type: string + type: array + aliasAssigned: + nullable: true + oneOf: + - type: number + - type: boolean + enum: + - false + - true + aliasError: + nullable: true + properties: + code: + type: string + message: + type: string + required: + - code + - message + type: object + aliasFinal: + nullable: true + type: string + automaticAliases: + items: + type: string + type: array + branchMatcher: + properties: + type: + type: string + enum: + - endsWith + - equals + - startsWith + description: The type of matching to perform + pattern: + type: string + description: The pattern to match against branch names + required: + - pattern + - type + type: object + buildingAt: + type: number + builds: + items: + properties: + use: + type: string + src: + type: string + dest: + type: string + required: + - use + type: object + type: array + checksConclusion: + type: string + enum: + - canceled + - failed + - skipped + - succeeded + checksState: + type: string + enum: + - completed + - registered + - running + connectBuildsEnabled: + type: boolean + enum: + - false + - true + connectConfigurationId: + type: string + createdAt: + type: number + createdIn: + type: string + creator: + nullable: true + properties: + email: + type: string + githubLogin: + type: string + gitlabLogin: + type: string + uid: + type: string + username: + type: string + required: + - email + - uid + - username + type: object + deletedAt: + type: number + deploymentHostname: + type: string + forced: + type: boolean + enum: + - false + - true + name: + type: string + meta: + additionalProperties: + type: string + type: object + monorepoManager: + nullable: true + type: string + oidcTokenClaims: + properties: + iss: + type: string + sub: + type: string + scope: + type: string + aud: + type: string + owner: + type: string + owner_id: + type: string + project: + type: string + project_id: + type: string + environment: + type: string + custom_environment_id: + type: string + mfe_group_ids: + items: + type: string + type: array + plan: + type: string + required: + - aud + - environment + - iss + - owner + - owner_id + - project + - project_id + - scope + - sub + type: object + plan: + type: string + enum: + - enterprise + - hobby + - pro + previewCommentsEnabled: + type: boolean + enum: + - false + - true + description: Whether or not preview comments are enabled for the deployment + example: false + private: + type: boolean + enum: + - false + - true + readyAt: + type: number + readyState: + type: string + enum: + - BLOCKED + - BUILDING + - CANCELED + - ERROR + - INITIALIZING + - QUEUED + - READY + readySubstate: + type: string + enum: + - PROMOTED + - ROLLING + - STAGED + requestedAt: + type: number + target: + nullable: true + type: string + teamId: + nullable: true + type: string + type: + type: string + enum: + - LAMBDAS + url: + type: string + userId: + type: string + description: Present for user creators; omitted for app/integration/system creators. + withCache: + type: boolean + enum: + - false + - true + required: + - createdAt + - createdIn + - creator + - deploymentHostname + - id + - name + - plan + - private + - readyState + - type + - url + type: object + domain: + type: string + environment: + type: string + enum: + - preview + - production + gitBranch: + nullable: true + type: string + redirect: + nullable: true + type: string + redirectStatusCode: + nullable: true + type: number + enum: + - 301 + - 302 + - 307 + - 308 + - null + target: + type: string + enum: + - PREVIEW + - PRODUCTION + - STAGING + required: + - deployment + - domain + - environment + - target + type: object + type: array analytics: properties: id: @@ -5304,15 +14550,48 @@ paths: nullable: true type: number required: - - id - - canceledAt - disabledAt - enabledAt + - id + type: object + appliedCve55182Migration: + type: boolean + enum: + - false + - true + speedInsights: + properties: + id: + type: string + enabledAt: + type: number + disabledAt: + type: number + canceledAt: + type: number + hasData: + type: boolean + enum: + - false + - true + dataReceivedAt: + type: number + description: When the first free (not Speed Insights Plus) production data point was observed, in ms. Set once by subscriber-analytics-events; projects that already had data before this field shipped get it backfilled on their next batch, so it reads "first free data point observed", not necessarily "first ever". + paidAt: + type: number + required: + - id type: object autoExposeSystemEnvs: type: boolean + enum: + - false + - true autoAssignCustomDomains: type: boolean + enum: + - false + - true autoAssignCustomDomainsUpdatedBy: type: string buildCommand: @@ -5321,15 +14600,73 @@ paths: commandForIgnoringBuildStep: nullable: true type: string + connectConfigurations: + nullable: true + items: + properties: + envId: + oneOf: + - type: string + - type: string + enum: + - preview + - production + connectConfigurationId: + type: string + dc: + type: string + passive: + type: boolean + enum: + - false + - true + buildsEnabled: + type: boolean + enum: + - false + - true + aws: + properties: + subnetIds: + items: + type: string + type: array + securityGroupId: + type: string + required: + - subnetIds + type: object + createdAt: + type: number + updatedAt: + type: number + required: + - buildsEnabled + - connectConfigurationId + - createdAt + - envId + - passive + - updatedAt + type: object + type: array connectConfigurationId: nullable: true type: string connectBuildsEnabled: type: boolean + enum: + - false + - true + passiveConnectConfigurationId: + nullable: true + type: string createdAt: type: number customerSupportCodeVisibility: type: boolean + enum: + - false + - true crons: properties: enabledAt: @@ -5360,6 +14697,20 @@ paths: type: string description: The cron expression. example: 0 0 * * * + source: + type: string + enum: + - api + description: The origin of this definition. 'api' means created via the API. Undefined means it originated from a deployment (vercel.json). + description: + type: string + description: A human-readable description of what this cron job does. + hostInferred: + type: boolean + enum: + - false + - true + description: Whether the host was inferred from the production deployment URL rather than explicitly provided. required: - host - path @@ -5367,29 +14718,73 @@ paths: type: object type: array required: - - enabledAt + - definitions + - deploymentId - disabledAt + - enabledAt - updatedAt - - deploymentId - - definitions type: object dataCache: properties: userDisabled: type: boolean + enum: + - false + - true storageSizeBytes: nullable: true type: number unlimited: type: boolean + enum: + - false + - true required: - userDisabled type: object + deploymentExpiration: + properties: + expirationDays: + type: number + description: Number of days to keep non-production deployments (mostly preview deployments) before soft deletion. + expirationDaysProduction: + type: number + description: Number of days to keep production deployments before soft deletion. + expirationDaysCanceled: + type: number + description: Number of days to keep canceled deployments before soft deletion. + expirationDaysErrored: + type: number + description: Number of days to keep errored deployments before soft deletion. + deploymentsToKeep: + type: number + description: Minimum number of production deployments to keep for this project, even if they are over the production expiration limit. + type: object + description: Retention policies for deployments. These are enforced at the project level, but we also maintain an instance of this at the team level as a default policy that gets applied to new projects. + expiration: + properties: + expiresAt: + type: number + description: Unix ms timestamp when the project is scheduled to expire. + lockedAt: + type: number + description: Unix ms timestamp when the project was locked. + lockedBy: + type: string + description: userId of the actor that triggered the lock (system or admin). + required: + - expiresAt + - lockedAt + - lockedBy + type: object devCommand: nullable: true type: string directoryListing: type: boolean + enum: + - false + - true installCommand: nullable: true type: string @@ -5400,34 +14795,39 @@ paths: oneOf: - items: type: string - enum: - - production - - preview - - development - - preview - - development type: array - type: string enum: - production - preview - development - - preview - - development type: type: string enum: - - secret - - system - encrypted - plain + - secret - sensitive - id: + - system + sunsetSecretId: type: string - key: + description: This is used to identify variables that have been migrated from type secret to sensitive. + legacyValue: type: string + description: Legacy now-encryption ciphertext, present after migration swaps value/vsmValue + decrypted: + type: boolean + enum: + - false + - true value: type: string + vsmValue: + type: string + id: + type: string + key: + type: string configurationId: nullable: true type: string @@ -5443,6 +14843,12 @@ paths: type: string gitBranch: type: string + visibility: + type: string + enum: + - config + - secret + description: User-facing config/secret model. When set, authoritative for new code paths when the env-var-config-secret-ui flag is enabled. Legacy rows omit this field; legacy rows omit it and callers fall back to existing `type` behavior. edgeConfigId: nullable: true type: string @@ -5456,198 +14862,588 @@ paths: type: type: string enum: - - redis-url + - redis-url + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - redis-rest-api-url + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - redis-rest-api-token + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - redis-rest-api-read-only-token + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - blob-read-write-token + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - blob-store-id storeId: type: string required: - - type - storeId + - type type: object - properties: type: type: string enum: - - redis-rest-api-url + - blob-webhook-public-key storeId: type: string required: - - type - storeId + - type type: object - properties: type: type: string enum: - - redis-rest-api-token + - postgres-url storeId: type: string required: - - type - storeId + - type type: object - properties: type: type: string enum: - - redis-rest-api-read-only-token + - postgres-url-non-pooling storeId: type: string required: - - type - storeId + - type type: object - properties: type: type: string enum: - - blob-read-write-token + - postgres-prisma-url storeId: type: string required: - - type - storeId + - type type: object - properties: type: type: string enum: - - postgres-url + - postgres-user storeId: type: string required: - - type - storeId + - type type: object - properties: type: type: string enum: - - postgres-url-non-pooling + - postgres-host storeId: type: string required: - - type - storeId + - type type: object - properties: type: type: string enum: - - postgres-prisma-url + - postgres-password storeId: type: string required: - - type - storeId + - type type: object - properties: type: type: string enum: - - postgres-user + - postgres-database storeId: type: string required: - - type - storeId + - type type: object - properties: type: type: string enum: - - postgres-host + - postgres-url-no-ssl storeId: type: string required: - - type - storeId + - type type: object - properties: type: type: string enum: - - postgres-password + - integration-store-secret storeId: type: string + integrationId: + type: string + integrationProductId: + type: string + integrationConfigurationId: + type: string required: - - type + - integrationConfigurationId + - integrationId + - integrationProductId - storeId + - type type: object - properties: type: type: string enum: - - postgres-database - storeId: + - flags-connection-string + projectId: type: string required: + - projectId - type - - storeId type: object - decrypted: - type: boolean - description: Whether `value` is decrypted. + internalContentHint: + nullable: true + properties: + type: + type: string + enum: + - flags-secret + encryptedValue: + type: string + description: Contains the `value` of the env variable, encrypted with a special key to make decryption possible in the subscriber Lambda. + required: + - encryptedValue + - type + type: object + description: Similar to `contentHints`, but should not be exposed to the user. + comment: + type: string + customEnvironmentIds: + items: + type: string + type: array required: - - type - key + - type - value type: object type: array + customEnvironments: + items: + properties: + id: + type: string + description: 'Unique identifier for the custom environment (format: env_*)' + slug: + type: string + description: URL-friendly name of the environment + type: + type: string + enum: + - development + - preview + - production + description: The type of environment (production, preview, or development) + description: + type: string + description: Optional description of the environment's purpose + branchMatcher: + properties: + type: + type: string + enum: + - endsWith + - equals + - startsWith + description: The type of matching to perform + pattern: + type: string + description: The pattern to match against branch names + required: + - pattern + - type + type: object + description: Configuration for matching git branches to this environment + domains: + items: + properties: + name: + type: string + apexName: + type: string + projectId: + type: string + redirect: + nullable: true + type: string + redirectStatusCode: + nullable: true + type: number + enum: + - 301 + - 302 + - 307 + - 308 + - null + gitBranch: + nullable: true + type: string + customEnvironmentId: + nullable: true + type: string + updatedAt: + type: number + createdAt: + type: number + verified: + type: boolean + enum: + - false + - true + description: '`true` if the domain is verified for use with the project. If `false` it will not be used as an alias on this project until the challenge in `verification` is completed.' + verification: + items: + properties: + type: + type: string + domain: + type: string + value: + type: string + reason: + type: string + required: + - domain + - reason + - type + - value + type: object + description: 'A list of verification challenges, one of which must be completed to verify the domain for use on the project. After the challenge is complete `POST /projects/:idOrName/domains/:domain/verify` to verify the domain. Possible challenges: - If `verification.type = TXT` the `verification.domain` will be checked for a TXT record matching `verification.value`.' + type: array + description: 'A list of verification challenges, one of which must be completed to verify the domain for use on the project. After the challenge is complete `POST /projects/:idOrName/domains/:domain/verify` to verify the domain. Possible challenges: - If `verification.type = TXT` the `verification.domain` will be checked for a TXT record matching `verification.value`.' + required: + - apexName + - name + - projectId + - verified + type: object + description: List of domains associated with this environment + type: array + description: List of domains associated with this environment + currentDeploymentAliases: + items: + type: string + type: array + description: List of aliases for the current deployment + createdAt: + type: number + description: Timestamp when the environment was created + updatedAt: + type: number + description: Timestamp when the environment was last updated + required: + - createdAt + - id + - slug + - type + - updatedAt + type: object + description: Internal representation of a custom environment with all required properties + type: array framework: nullable: true type: string enum: - - blitzjs - - nextjs - - gatsby - - remix + - actix-web + - angular + - ash - astro - - hexo - - eleventy - - docusaurus-2 + - axum + - blitzjs + - brunch + - bun + - container + - create-react-app + - django - docusaurus - - preact - - solidstart + - docusaurus-2 - dojo + - eleventy + - elysia - ember - - vue - - scully + - eve + - express + - factory-eve + - fastapi + - fasthtml + - fastify + - flask + - gatsby + - go + - gridsome + - h3 + - hexo + - hono + - hugo + - hydrogen - ionic-angular - - angular + - ionic-react + - jekyll + - koa + - mastra + - middleman + - nestjs + - nextjs + - nitro + - node + - nuxtjs + - parcel - polymer + - preact + - python + - react-router + - redwoodjs + - remix + - ruby + - rust + - saber + - sanity + - sanity-v2 + - sapper + - scully + - services + - solidstart + - solidstart-1 + - stencil + - storybook - svelte - sveltekit - sveltekit-1 - - ionic-react - - create-react-app - - gridsome + - tanstack-start + - tanstack-start-lovable - umijs - - sapper - - saber - - stencil - - nuxtjs - - redwoodjs - - hugo - - jekyll - - brunch - - middleman - - zola - - hydrogen - vite - vitepress + - vue - vuepress - - parcel - - sanity - - storybook + - xmcp + - zola + - null + services: + items: + properties: + serviceName: + type: string + description: Service name from the deployment (Service.name). + serviceType: + type: string + enum: + - cron + - job + - web + - worker + description: Service kind (Service.type). Omitted for schemas that do not define one. + framework: + type: string + enum: + - actix-web + - angular + - ash + - astro + - axum + - blitzjs + - brunch + - bun + - container + - create-react-app + - django + - docusaurus + - docusaurus-2 + - dojo + - eleventy + - elysia + - ember + - eve + - express + - factory-eve + - fastapi + - fasthtml + - fastify + - flask + - gatsby + - go + - gridsome + - h3 + - hexo + - hono + - hugo + - hydrogen + - ionic-angular + - ionic-react + - jekyll + - koa + - mastra + - middleman + - nestjs + - nextjs + - nitro + - node + - nuxtjs + - parcel + - polymer + - preact + - python + - react-router + - redwoodjs + - remix + - ruby + - rust + - saber + - sanity + - sanity-v2 + - sapper + - scully + - services + - solidstart + - solidstart-1 + - stencil + - storybook + - svelte + - sveltekit + - sveltekit-1 + - tanstack-start + - tanstack-start-lovable + - umijs + - vite + - vitepress + - vue + - vuepress + - xmcp + - zola + description: Framework slug, when the service has one (omitted otherwise). + runtime: + type: string + description: Generic runtime, e.g. 'node' | 'python' | 'go' | 'ruby' | 'rust' (Service.runtime). Omitted for static builds. + required: + - serviceName + type: object + type: array gitForkProtection: type: boolean + enum: + - false + - true gitLFS: type: boolean + enum: + - false + - true id: type: string + ipBuckets: + items: + properties: + bucket: + type: string + default: + type: boolean + enum: + - false + - true + supportUntil: + type: number + required: + - bucket + type: object + type: array + jobs: + properties: + lint: + properties: + targets: + items: + type: string + type: array + required: + - targets + type: object + typecheck: + properties: + targets: + items: + type: string + type: array + required: + - targets + type: object + mfe-config-present: + properties: + targets: + items: + type: string + type: array + required: + - targets + type: object + type: object latestDeployments: items: properties: + id: + type: string alias: items: type: string @@ -5657,6 +15453,9 @@ paths: oneOf: - type: number - type: boolean + enum: + - false + - true aliasError: nullable: true properties: @@ -5675,6 +15474,24 @@ paths: items: type: string type: array + branchMatcher: + properties: + type: + type: string + enum: + - endsWith + - equals + - startsWith + description: The type of matching to perform + pattern: + type: string + description: The pattern to match against branch names + required: + - pattern + - type + type: object + buildingAt: + type: number builds: items: properties: @@ -5688,8 +15505,24 @@ paths: - use type: object type: array + checksConclusion: + type: string + enum: + - canceled + - failed + - skipped + - succeeded + checksState: + type: string + enum: + - completed + - registered + - running connectBuildsEnabled: type: boolean + enum: + - false + - true connectConfigurationId: type: string createdAt: @@ -5714,13 +15547,16 @@ paths: - uid - username type: object + deletedAt: + type: number deploymentHostname: type: string - name: - type: string forced: type: boolean - id: + enum: + - false + - true + name: type: string meta: additionalProperties: @@ -5729,29 +15565,81 @@ paths: monorepoManager: nullable: true type: string + oidcTokenClaims: + properties: + iss: + type: string + sub: + type: string + scope: + type: string + aud: + type: string + owner: + type: string + owner_id: + type: string + project: + type: string + project_id: + type: string + environment: + type: string + custom_environment_id: + type: string + mfe_group_ids: + items: + type: string + type: array + plan: + type: string + required: + - aud + - environment + - iss + - owner + - owner_id + - project + - project_id + - scope + - sub + type: object plan: type: string enum: - - pro - enterprise - hobby - - oss + - pro + previewCommentsEnabled: + type: boolean + enum: + - false + - true + description: Whether or not preview comments are enabled for the deployment + example: false private: type: boolean + enum: + - false + - true + readyAt: + type: number readyState: type: string enum: + - BLOCKED - BUILDING + - CANCELED - ERROR - INITIALIZING - QUEUED - READY - - CANCELED readySubstate: type: string enum: - - STAGED - PROMOTED + - ROLLING + - STAGED requestedAt: type: number target: @@ -5768,217 +15656,651 @@ paths: type: string userId: type: string + description: Present for user creators; omitted for app/integration/system creators. withCache: type: boolean - checksConclusion: - type: string enum: - - succeeded - - failed - - skipped - - canceled - checksState: - type: string - enum: - - registered - - running - - completed - readyAt: - type: number - buildingAt: - type: number - previewCommentsEnabled: - type: boolean - description: Whether or not preview comments are enabled for the deployment - example: false + - false + - true required: - createdAt - createdIn - creator - deploymentHostname - - name - id + - name - plan - private - readyState - type - url - - userId type: object type: array link: - oneOf: - - properties: - org: - type: string - repo: - type: string - repoId: - type: number - type: + properties: + org: + type: string + repoOwnerId: + type: number + description: A new field, should be included in all new project links, is being added just in time when a deployment is created. This is needed for Protected Git scopes. + repo: + type: string + repoId: + type: number + type: + type: string + enum: + - github + createdAt: + type: number + deployHooks: + items: + properties: + createdAt: + type: number + id: + type: string + name: + type: string + ref: + type: string + url: + type: string + required: + - id + - name + - ref + - url + type: object + type: array + gitCredentialId: + type: string + updatedAt: + type: number + sourceless: + type: boolean + enum: + - false + - true + productionBranch: + type: string + host: + type: string + projectId: + type: string + projectName: + type: string + projectNameWithNamespace: + type: string + projectNamespace: + type: string + projectOwnerId: + type: number + description: A new field, should be included in all new project links, is being added just in time when a deployment is created. This is needed for Protected Git scopes. This is the id of the top level group that a namespace belongs to. Gitlab supports group nesting (up to 20 levels). + projectUrl: + type: string + name: + type: string + slug: + type: string + owner: + type: string + uuid: + type: string + workspaceUuid: + type: string + ownerId: + type: string + description: Origin namespace id (`ns_…`) of the owner. + required: + - deployHooks + - gitCredentialId + - org + - productionBranch + - type + - host + - projectId + - projectName + - projectNameWithNamespace + - projectNamespace + - projectUrl + - name + - owner + - slug + - uuid + - workspaceUuid + - repo + - repoId + - ownerId + type: object + blobs: + properties: + isDefaultApp: + type: boolean + enum: + - false + - true + description: Marks the team-level, Vercel-managed default blob project (`vercel-blob-default-project`) that orphan blob stores are scoped to when connected without an explicit project. Set only by internal storage flows and immutable after creation — guards rely on it to protect the connected stores from being lost when the project is deleted or transferred. + type: object + microfrontends: + properties: + isDefaultApp: + type: boolean + enum: + - true + updatedAt: + type: number + description: Timestamp when the microfrontends settings were last updated. + groupIds: + type: array + items: + type: string + minItems: 1 + description: The group IDs of microfrontends that this project belongs to. Each microfrontend project must belong to a microfrontends group that is the set of microfrontends that are used together. + enabled: + type: boolean + enum: + - true + description: Whether microfrontends are enabled for this project. + defaultRoute: + type: string + description: A path that is used to take screenshots and as the default path in preview links when a domain for this microfrontend is shown in the UI. Includes the leading slash, e.g. `/docs` + freeProjectForLegacyLimits: + type: boolean + enum: + - false + - true + description: Whether the project was part of the legacy limits for hobby and pro-trial before billing was added. This field is only set when the team is upgraded to a paid plan and we are backfilling the subscription status. We cap the subscription to 2 projects and set this field for the 3rd project. When this field is set, the project is not charged for and we do not call any billing APIs for this project. + routeObservabilityToThisProject: + type: boolean + enum: + - false + - true + description: Whether observability data should be routed to this microfrontend project or a root project. + doNotRouteWithMicrofrontendsRouting: + type: boolean + enum: + - false + - true + description: Whether to add microfrontends routing to aliases. This means domains in this project will route as a microfrontend. + required: + - enabled + - groupIds + - isDefaultApp + - updatedAt + type: object + name: + type: string + nodeVersion: + type: string + enum: + - 10.x + - 12.x + - 14.x + - 16.x + - 18.x + - 20.x + - 22.x + - 24.x + - 8.10.x + optionsAllowlist: + nullable: true + properties: + paths: + items: + properties: + value: + type: string + required: + - value + type: object + type: array + required: + - paths + type: object + outputDirectory: + nullable: true + type: string + passwordProtection: + nullable: true + type: string + description: (opaque JSON object) + passport: + nullable: true + properties: + deploymentType: + type: string + enum: + - all + - all_except_custom_domains + - preview + - prod_deployment_urls_and_all_previews + connectorId: + type: string + required: + - connectorId + - deploymentType + type: object + protectionConfig: + properties: + sandboxUrls: + properties: + inheritDeploymentProtection: + type: boolean + enum: + - false + - true + type: object + type: object + sandbox: + properties: + region: + type: string + enum: + - arn1 + - bom1 + - cdg1 + - cle1 + - cpt1 + - dub1 + - fra1 + - gru1 + - hkg1 + - hnd1 + - iad1 + - icn1 + - kix1 + - lhr1 + - pdx1 + - sfo1 + - sin1 + - syd1 + - yul1 + failoverRegions: + items: + type: string + enum: + - arn1 + - bom1 + - cdg1 + - cle1 + - cpt1 + - dub1 + - fra1 + - gru1 + - hkg1 + - hnd1 + - iad1 + - icn1 + - kix1 + - lhr1 + - pdx1 + - sfo1 + - sin1 + - syd1 + - yul1 + type: array + type: object + productionDeploymentsFastLane: + type: boolean + enum: + - false + - true + resourceConfig: + properties: + elasticConcurrencyEnabled: + type: boolean + enum: + - false + - true + fluid: + type: boolean + enum: + - false + - true + functionDefaultRegions: + items: + type: string + type: array + functionDefaultTimeout: + type: number + functionDefaultMemoryType: + type: string + enum: + - performance + - performance_xl + - standard + - standard_legacy + functionZeroConfigFailover: + type: boolean + enum: + - false + - true + buildMachineType: + type: string + enum: + - basic + - enhanced + - standard + - turbo + buildMachineSelection: + type: string + enum: + - elastic + - fixed + buildMachineElasticLastUpdated: + type: number + buildMachineElasticReason: + type: string + enum: + - basic-floor + - build-timeout-failure + - enospc-failure + - enterprise-floor + - high-peak-disk + - high-peak-memory + - long-build-duration + - oom-failure + - short-build-duration + - sustained-high-cpu + isNSNBDisabled: + type: boolean + enum: + - false + - true + buildQueue: + properties: + configuration: type: string enum: - - github - createdAt: - type: number - deployHooks: - items: - properties: - createdAt: - type: number - id: - type: string - name: - type: string - ref: - type: string - url: - type: string - required: - - id - - name - - ref - - url - type: object - type: array - gitCredentialId: - type: string - updatedAt: - type: number - sourceless: - type: boolean - productionBranch: - type: string - required: - - deployHooks + - SKIP_NAMESPACE_QUEUE + - WAIT_FOR_NAMESPACE_QUEUE type: object - - properties: - projectId: - type: string - projectName: - type: string - projectNameWithNamespace: - type: string - projectNamespace: - type: string - projectUrl: - type: string - type: - type: string + enableFunctionsBeta: + type: boolean + enum: + - false + - true + type: object + required: + - functionDefaultRegions + rollbackDescription: + properties: + userId: + type: string + description: The user who rolled back the project. + username: + type: string + description: The username of the user who rolled back the project. + description: + type: string + description: User-supplied explanation of why they rolled back the project. Limited to 250 characters. + createdAt: + type: number + description: Timestamp of when the rollback was requested. + required: + - createdAt + - description + - userId + - username + type: object + description: Description of why a project was rolled back, and by whom. Note that lastAliasRequest contains the from/to details of the rollback. + rollingRelease: + nullable: true + properties: + target: + type: string + description: The environment that the release targets, currently only supports production. Adding in case we want to configure with alias groups or custom environments. + example: production + stages: + nullable: true + items: + properties: + targetPercentage: + type: number + description: The percentage of traffic to serve to the canary deployment (0-100) + example: 25 + requireApproval: + type: boolean + enum: + - false + - true + description: Whether or not this stage requires manual approval to proceed + example: false + duration: + type: number + description: Duration in minutes for automatic advancement to the next stage + example: 600 + linearShift: + type: boolean + enum: + - false + - true + description: Whether to linearly shift traffic over the duration of this stage + example: false + required: + - targetPercentage + type: object + description: 'An array of all the stages required during a deployment release. Each stage defines a target percentage and advancement rules. The final stage must always have targetPercentage: 100.' + type: array + description: 'An array of all the stages required during a deployment release. Each stage defines a target percentage and advancement rules. The final stage must always have targetPercentage: 100.' + canaryResponseHeader: + type: boolean + enum: + - false + - true + description: Whether the request served by a canary deployment should return a header indicating a canary was served. Defaults to `false` when omitted. + example: false + gate: + properties: + enabled: + type: boolean enum: - - gitlab - createdAt: - type: number - deployHooks: + - false + - true + description: Whether automated gating is enabled for this project's rollouts. + checks: items: properties: - createdAt: - type: number - id: - type: string - name: - type: string - ref: - type: string - url: + type: type: string + enum: + - error-rate-5xx + description: The metric this check evaluates. + minSampleSize: + type: number + description: Minimum number of requests required in the window before the check can fail. Below this, the check is inconclusive rather than failing, so low-traffic stages don't gate on noise. Defaults to `100` when omitted. + example: 100 + excludeStatusCodes: + items: + type: number + type: array + description: Response status codes to ignore entirely — dropped from both the numerator (errors) and the denominator (total requests). Defaults to `[]` when omitted. + example: + - 503 + excludePaths: + items: + type: string + type: array + description: Request paths to ignore entirely — dropped from both the numerator (errors) and the denominator (total requests). Matched exactly against the request path with any query string removed; no prefix or glob matching. Defaults to `[]` when omitted. + example: + - /api/health + ingestWatermarkSeconds: + type: number + description: 'Seconds of ingest lag to allow for: the query''s upper bound is `now() - this value`, so the check never reads a window that is still filling. Defaults to `30` when omitted.' + example: 30 required: - - id - - name - - ref - - url + - type type: object + description: The checks to evaluate. An empty array means nothing is evaluated. type: array - gitCredentialId: - type: string - updatedAt: + description: The checks to evaluate. An empty array means nothing is evaluated. + failureThreshold: type: number - sourceless: - type: boolean - productionBranch: + description: How many failing evaluations within {@link windowSize} trip the gate. Defaults to `3` when omitted. + example: 3 + windowSize: + type: number + description: How many of the most recent evaluations {@link failureThreshold} is counted against. Defaults to `5` when omitted. + example: 5 + action: type: string + enum: + - pause + - rollback + description: 'What to do when the gate trips: pause the rollout, or roll it back.' + dryRun: + type: boolean + enum: + - false + - true + description: When true, a tripped gate is only reported — {@link action} is not taken. required: - - deployHooks + - action + - checks + - dryRun + - enabled type: object - - properties: - name: - type: string - slug: - type: string - owner: - type: string - type: + description: 'Automated gating configuration. Omitted (the default) means no gating is configured, which is equivalent to `enabled: false`.' + required: + - target + type: object + description: Project-level rolling release configuration that defines how deployments should be gradually rolled out + defaultResourceConfig: + properties: + elasticConcurrencyEnabled: + type: boolean + enum: + - false + - true + fluid: + type: boolean + enum: + - false + - true + functionDefaultRegions: + items: + type: string + type: array + functionDefaultTimeout: + type: number + functionDefaultMemoryType: + type: string + enum: + - performance + - performance_xl + - standard + - standard_legacy + functionZeroConfigFailover: + type: boolean + enum: + - false + - true + buildMachineType: + type: string + enum: + - basic + - enhanced + - standard + - turbo + buildMachineSelection: + type: string + enum: + - elastic + - fixed + buildMachineElasticLastUpdated: + type: number + buildMachineElasticReason: + type: string + enum: + - basic-floor + - build-timeout-failure + - enospc-failure + - enterprise-floor + - high-peak-disk + - high-peak-memory + - long-build-duration + - oom-failure + - short-build-duration + - sustained-high-cpu + isNSNBDisabled: + type: boolean + enum: + - false + - true + buildQueue: + properties: + configuration: type: string enum: - - bitbucket - uuid: - type: string - workspaceUuid: - type: string - createdAt: - type: number - deployHooks: - items: - properties: - createdAt: - type: number - id: - type: string - name: - type: string - ref: - type: string - url: - type: string - required: - - id - - name - - ref - - url - type: object - type: array - gitCredentialId: - type: string - updatedAt: - type: number - sourceless: - type: boolean - productionBranch: - type: string - required: - - deployHooks + - SKIP_NAMESPACE_QUEUE + - WAIT_FOR_NAMESPACE_QUEUE type: object - name: - type: string - nodeVersion: - type: string - enum: - - 18.x - - 16.x - - 14.x - - 12.x - - 10.x - outputDirectory: - nullable: true - type: string - passwordProtection: - nullable: true + enableFunctionsBeta: + type: boolean + enum: + - false + - true type: object - productionDeploymentsFastLane: - type: boolean - publicSource: - nullable: true - type: boolean + required: + - functionDefaultRegions rootDirectory: nullable: true type: string - serverlessFunctionRegion: - nullable: true - type: string + serverlessFunctionZeroConfigFailover: + type: boolean + enum: + - false + - true + skewProtectionBoundaryAt: + type: number + skewProtectionMaxAge: + type: number + skewProtectionAllowedDomains: + items: + type: string + type: array skipGitConnectDuringLink: type: boolean + enum: + - false + - true + staticIps: + properties: + builds: + type: boolean + enum: + - false + - true + enabled: + type: boolean + enum: + - false + - true + regions: + items: + type: string + type: array + required: + - builds + - enabled + - regions + type: object sourceFilesOutsideRootDirectory: type: boolean + enum: + - false + - true + enableAffectedProjectsDeployments: + type: boolean + enum: + - false + - true + enableExternalRewriteCaching: + type: boolean + enum: + - false + - true ssoProtection: nullable: true properties: @@ -5986,8 +16308,27 @@ paths: type: string enum: - all + - all_except_custom_domains + - preview + - prod_deployment_urls_and_all_previews + cve55182MigrationAppliedFrom: + nullable: true + type: string + enum: + - all + - all_except_custom_domains + - preview + - prod_deployment_urls_and_all_previews + - null + april2026SecurityIncidentMigrationAppliedFrom: + nullable: true + type: string + enum: + - all + - all_except_custom_domains - preview - prod_deployment_urls_and_all_previews + - null required: - deploymentType type: object @@ -5995,6 +16336,8 @@ paths: additionalProperties: nullable: true properties: + id: + type: string alias: items: type: string @@ -6004,6 +16347,9 @@ paths: oneOf: - type: number - type: boolean + enum: + - false + - true aliasError: nullable: true properties: @@ -6022,6 +16368,24 @@ paths: items: type: string type: array + branchMatcher: + properties: + type: + type: string + enum: + - endsWith + - equals + - startsWith + description: The type of matching to perform + pattern: + type: string + description: The pattern to match against branch names + required: + - pattern + - type + type: object + buildingAt: + type: number builds: items: properties: @@ -6035,8 +16399,24 @@ paths: - use type: object type: array + checksConclusion: + type: string + enum: + - canceled + - failed + - skipped + - succeeded + checksState: + type: string + enum: + - completed + - registered + - running connectBuildsEnabled: type: boolean + enum: + - false + - true connectConfigurationId: type: string createdAt: @@ -6061,44 +16441,99 @@ paths: - uid - username type: object + deletedAt: + type: number deploymentHostname: type: string - name: - type: string forced: type: boolean - id: + enum: + - false + - true + name: type: string meta: additionalProperties: type: string type: object - monorepoManager: - nullable: true - type: string + monorepoManager: + nullable: true + type: string + oidcTokenClaims: + properties: + iss: + type: string + sub: + type: string + scope: + type: string + aud: + type: string + owner: + type: string + owner_id: + type: string + project: + type: string + project_id: + type: string + environment: + type: string + custom_environment_id: + type: string + mfe_group_ids: + items: + type: string + type: array + plan: + type: string + required: + - aud + - environment + - iss + - owner + - owner_id + - project + - project_id + - scope + - sub + type: object plan: type: string enum: - - pro - enterprise - hobby - - oss + - pro + previewCommentsEnabled: + type: boolean + enum: + - false + - true + description: Whether or not preview comments are enabled for the deployment + example: false private: type: boolean + enum: + - false + - true + readyAt: + type: number readyState: type: string enum: + - BLOCKED - BUILDING + - CANCELED - ERROR - INITIALIZING - QUEUED - READY - - CANCELED readySubstate: type: string enum: - - STAGED - PROMOTED + - ROLLING + - STAGED requestedAt: type: number target: @@ -6115,42 +16550,24 @@ paths: type: string userId: type: string + description: Present for user creators; omitted for app/integration/system creators. withCache: type: boolean - checksConclusion: - type: string - enum: - - succeeded - - failed - - skipped - - canceled - checksState: - type: string enum: - - registered - - running - - completed - readyAt: - type: number - buildingAt: - type: number - previewCommentsEnabled: - type: boolean - description: Whether or not preview comments are enabled for the deployment - example: false + - false + - true required: - createdAt - createdIn - creator - deploymentHostname - - name - id + - name - plan - private - readyState - type - url - - userId type: object type: object transferCompletedAt: @@ -6165,128 +16582,682 @@ paths: type: number live: type: boolean + enum: + - false + - true enablePreviewFeedback: nullable: true type: boolean + enum: + - false + - true + - null + enableProductionFeedback: + nullable: true + type: boolean + enum: + - false + - true + - null permissions: properties: + oauth2Connection: + items: + $ref: '#/components/schemas/ACLAction' + type: array + user: + items: + $ref: '#/components/schemas/ACLAction' + type: array + userConnection: + items: + $ref: '#/components/schemas/ACLAction' + type: array + userMfaConfiguration: + items: + $ref: '#/components/schemas/ACLAction' + type: array + userPreference: + items: + $ref: '#/components/schemas/ACLAction' + type: array + userSudo: + items: + $ref: '#/components/schemas/ACLAction' + type: array + webAuthn: + items: + $ref: '#/components/schemas/ACLAction' + type: array + accessGroup: + items: + $ref: '#/components/schemas/ACLAction' + type: array + agent: + items: + $ref: '#/components/schemas/ACLAction' + type: array + aiGatewayApiKey: + items: + $ref: '#/components/schemas/ACLAction' + type: array + aiGatewayApiKeyBypassAll: + items: + $ref: '#/components/schemas/ACLAction' + type: array + aiGatewayApiKeyOwnedBySelf: + items: + $ref: '#/components/schemas/ACLAction' + type: array + aiGatewayApiKeySpendAttribution: + items: + $ref: '#/components/schemas/ACLAction' + type: array + aiGatewayApiKeyZdrExemption: + items: + $ref: '#/components/schemas/ACLAction' + type: array + aiGatewayBudget: + items: + $ref: '#/components/schemas/ACLAction' + type: array + aiGatewayCredits: + items: + $ref: '#/components/schemas/ACLAction' + type: array + aiGatewayPrivateModels: + items: + $ref: '#/components/schemas/ACLAction' + type: array + aiGatewayGuardrails: + items: + $ref: '#/components/schemas/ACLAction' + type: array + aiGatewayRules: + items: + $ref: '#/components/schemas/ACLAction' + type: array + aiGatewaySettings: + items: + $ref: '#/components/schemas/ACLAction' + type: array + aiGatewayTranscripts: + items: + $ref: '#/components/schemas/ACLAction' + type: array + aiGatewayTranscriptsSettings: + items: + $ref: '#/components/schemas/ACLAction' + type: array + aiGatewayUsage: + items: + $ref: '#/components/schemas/ACLAction' + type: array + aiGatewayVirtualModelConfigs: + items: + $ref: '#/components/schemas/ACLAction' + type: array + alerts: + items: + $ref: '#/components/schemas/ACLAction' + type: array + alertRules: + items: + $ref: '#/components/schemas/ACLAction' + type: array aliasGlobal: items: $ref: '#/components/schemas/ACLAction' type: array - analyticsSampling: + analyticsSampling: + items: + $ref: '#/components/schemas/ACLAction' + type: array + analyticsUsage: + items: + $ref: '#/components/schemas/ACLAction' + type: array + apiKey: + items: + $ref: '#/components/schemas/ACLAction' + type: array + apiKeyAiGateway: + items: + $ref: '#/components/schemas/ACLAction' + type: array + apiKeyOwnedBySelf: + items: + $ref: '#/components/schemas/ACLAction' + type: array + oauth2Application: + items: + $ref: '#/components/schemas/ACLAction' + type: array + vercelAppInstallation: + items: + $ref: '#/components/schemas/ACLAction' + type: array + vercelAppInstallationRequest: + items: + $ref: '#/components/schemas/ACLAction' + type: array + auditLog: + items: + $ref: '#/components/schemas/ACLAction' + type: array + automation: + items: + $ref: '#/components/schemas/ACLAction' + type: array + billingAddress: + items: + $ref: '#/components/schemas/ACLAction' + type: array + billingInformation: + items: + $ref: '#/components/schemas/ACLAction' + type: array + billingInvoice: + items: + $ref: '#/components/schemas/ACLAction' + type: array + billingInvoiceEmailRecipient: + items: + $ref: '#/components/schemas/ACLAction' + type: array + billingInvoiceLanguage: + items: + $ref: '#/components/schemas/ACLAction' + type: array + billingPlan: + items: + $ref: '#/components/schemas/ACLAction' + type: array + billingPurchaseOrder: + items: + $ref: '#/components/schemas/ACLAction' + type: array + billingRefund: + items: + $ref: '#/components/schemas/ACLAction' + type: array + billingTaxId: + items: + $ref: '#/components/schemas/ACLAction' + type: array + blob: + items: + $ref: '#/components/schemas/ACLAction' + type: array + blobStoreTokenSet: + items: + $ref: '#/components/schemas/ACLAction' + type: array + budget: + items: + $ref: '#/components/schemas/ACLAction' + type: array + cacheArtifact: + items: + $ref: '#/components/schemas/ACLAction' + type: array + cacheArtifactUsageEvent: + items: + $ref: '#/components/schemas/ACLAction' + type: array + codeChecks: + items: + $ref: '#/components/schemas/ACLAction' + type: array + codeOwners: + items: + $ref: '#/components/schemas/ACLAction' + type: array + ciInvocations: + items: + $ref: '#/components/schemas/ACLAction' + type: array + ciLogs: + items: + $ref: '#/components/schemas/ACLAction' + type: array + concurrentBuilds: + items: + $ref: '#/components/schemas/ACLAction' + type: array + connect: + items: + $ref: '#/components/schemas/ACLAction' + type: array + connectConfiguration: + items: + $ref: '#/components/schemas/ACLAction' + type: array + connectLogs: + items: + $ref: '#/components/schemas/ACLAction' + type: array + connexClient: + items: + $ref: '#/components/schemas/ACLAction' + type: array + connexClientProject: + items: + $ref: '#/components/schemas/ACLAction' + type: array + connexContact: + items: + $ref: '#/components/schemas/ACLAction' + type: array + connexInstallation: + items: + $ref: '#/components/schemas/ACLAction' + type: array + connexToken: + items: + $ref: '#/components/schemas/ACLAction' + type: array + buildMachineDefault: + items: + $ref: '#/components/schemas/ACLAction' + type: array + cursorOriginInstallation: + items: + $ref: '#/components/schemas/ACLAction' + type: array + dataCacheBillingSettings: + items: + $ref: '#/components/schemas/ACLAction' + type: array + defaultDeploymentProtection: + items: + $ref: '#/components/schemas/ACLAction' + type: array + deploymentPolicy: + items: + $ref: '#/components/schemas/ACLAction' + type: array + domain: + items: + $ref: '#/components/schemas/ACLAction' + type: array + domainAcceptDelegation: + items: + $ref: '#/components/schemas/ACLAction' + type: array + domainAuthCodes: + items: + $ref: '#/components/schemas/ACLAction' + type: array + domainCertificate: + items: + $ref: '#/components/schemas/ACLAction' + type: array + domainCheckConfig: + items: + $ref: '#/components/schemas/ACLAction' + type: array + domainMove: + items: + $ref: '#/components/schemas/ACLAction' + type: array + domainPurchase: + items: + $ref: '#/components/schemas/ACLAction' + type: array + domainRecord: + items: + $ref: '#/components/schemas/ACLAction' + type: array + domainTransferIn: + items: + $ref: '#/components/schemas/ACLAction' + type: array + drain: + items: + $ref: '#/components/schemas/ACLAction' + type: array + edgeConfig: + items: + $ref: '#/components/schemas/ACLAction' + type: array + edgeConfigItem: + items: + $ref: '#/components/schemas/ACLAction' + type: array + edgeConfigSchema: + items: + $ref: '#/components/schemas/ACLAction' + type: array + edgeConfigToken: + items: + $ref: '#/components/schemas/ACLAction' + type: array + endpointVerification: + items: + $ref: '#/components/schemas/ACLAction' + type: array + event: + items: + $ref: '#/components/schemas/ACLAction' + type: array + fileUpload: + items: + $ref: '#/components/schemas/ACLAction' + type: array + flagsExplorerSubscription: + items: + $ref: '#/components/schemas/ACLAction' + type: array + gitRepository: + items: + $ref: '#/components/schemas/ACLAction' + type: array + imageOptimizationNewPrice: + items: + $ref: '#/components/schemas/ACLAction' + type: array + integration: + items: + $ref: '#/components/schemas/ACLAction' + type: array + integrationAccount: + items: + $ref: '#/components/schemas/ACLAction' + type: array + integrationConfiguration: + items: + $ref: '#/components/schemas/ACLAction' + type: array + integrationConfigurationProjects: + items: + $ref: '#/components/schemas/ACLAction' + type: array + integrationConfigurationRole: + items: + $ref: '#/components/schemas/ACLAction' + type: array + integrationConfigurationTransfer: + items: + $ref: '#/components/schemas/ACLAction' + type: array + integrationDeploymentAction: + items: + $ref: '#/components/schemas/ACLAction' + type: array + integrationEvent: + items: + $ref: '#/components/schemas/ACLAction' + type: array + integrationLog: + items: + $ref: '#/components/schemas/ACLAction' + type: array + integrationResource: + items: + $ref: '#/components/schemas/ACLAction' + type: array + integrationResourceData: + items: + $ref: '#/components/schemas/ACLAction' + type: array + integrationResourceReplCommand: + items: + $ref: '#/components/schemas/ACLAction' + type: array + integrationResourceSecrets: + items: + $ref: '#/components/schemas/ACLAction' + type: array + integrationSSOSession: + items: + $ref: '#/components/schemas/ACLAction' + type: array + integrationStrict: + items: + $ref: '#/components/schemas/ACLAction' + type: array + integrationStoreTokenSet: + items: + $ref: '#/components/schemas/ACLAction' + type: array + integrationVercelConfigurationOverride: + items: + $ref: '#/components/schemas/ACLAction' + type: array + integrationPullRequest: + items: + $ref: '#/components/schemas/ACLAction' + type: array + ipBlocking: + items: + $ref: '#/components/schemas/ACLAction' + type: array + jobGlobal: + items: + $ref: '#/components/schemas/ACLAction' + type: array + kmsIssuer: + items: + $ref: '#/components/schemas/ACLAction' + type: array + kmsProjectGrant: + items: + $ref: '#/components/schemas/ACLAction' + type: array + logDrain: + items: + $ref: '#/components/schemas/ACLAction' + type: array + marketplaceBillingData: + items: + $ref: '#/components/schemas/ACLAction' + type: array + marketplaceExperimentationEdgeConfigData: + items: + $ref: '#/components/schemas/ACLAction' + type: array + marketplaceExperimentationItem: + items: + $ref: '#/components/schemas/ACLAction' + type: array + marketplaceFlexCommit: + items: + $ref: '#/components/schemas/ACLAction' + type: array + marketplaceInstallationMember: + items: + $ref: '#/components/schemas/ACLAction' + type: array + marketplaceInvoice: + items: + $ref: '#/components/schemas/ACLAction' + type: array + marketplaceSettings: + items: + $ref: '#/components/schemas/ACLAction' + type: array + Monitoring: + items: + $ref: '#/components/schemas/ACLAction' + type: array + monitoringAlert: + items: + $ref: '#/components/schemas/ACLAction' + type: array + monitoringChart: + items: + $ref: '#/components/schemas/ACLAction' + type: array + monitoringQuery: + items: + $ref: '#/components/schemas/ACLAction' + type: array + monitoringSettings: + items: + $ref: '#/components/schemas/ACLAction' + type: array + notificationCustomerBudget: + items: + $ref: '#/components/schemas/ACLAction' + type: array + notificationDeploymentFailed: + items: + $ref: '#/components/schemas/ACLAction' + type: array + notificationDomainConfiguration: + items: + $ref: '#/components/schemas/ACLAction' + type: array + notificationDomainExpire: + items: + $ref: '#/components/schemas/ACLAction' + type: array + notificationDomainMoved: + items: + $ref: '#/components/schemas/ACLAction' + type: array + notificationDomainPurchase: + items: + $ref: '#/components/schemas/ACLAction' + type: array + notificationDomainRenewal: + items: + $ref: '#/components/schemas/ACLAction' + type: array + notificationDomainTransfer: + items: + $ref: '#/components/schemas/ACLAction' + type: array + notificationDomainUnverified: + items: + $ref: '#/components/schemas/ACLAction' + type: array + NotificationMonitoringAlert: items: $ref: '#/components/schemas/ACLAction' type: array - analyticsUsage: + notificationPaymentFailed: items: $ref: '#/components/schemas/ACLAction' type: array - auditLog: + notificationPreferences: items: $ref: '#/components/schemas/ACLAction' type: array - billingAddress: + notificationStatementOfReasons: items: $ref: '#/components/schemas/ACLAction' type: array - billingInformation: + notificationUsageAlert: items: $ref: '#/components/schemas/ACLAction' type: array - billingInvoice: + oidcFederationPolicy: items: $ref: '#/components/schemas/ACLAction' type: array - billingInvoiceEmailRecipient: + observabilityConfiguration: items: $ref: '#/components/schemas/ACLAction' type: array - billingInvoiceLanguage: + observabilityFunnel: items: $ref: '#/components/schemas/ACLAction' type: array - billingPlan: + observabilityNotebook: items: $ref: '#/components/schemas/ACLAction' type: array - billingPurchaseOrder: + openTelemetryEndpoint: items: $ref: '#/components/schemas/ACLAction' type: array - billingTaxId: + ownEvent: items: $ref: '#/components/schemas/ACLAction' type: array - blob: + organization: items: $ref: '#/components/schemas/ACLAction' type: array - budget: + organizationDomain: items: $ref: '#/components/schemas/ACLAction' type: array - cacheArtifact: + organizationTeam: items: $ref: '#/components/schemas/ACLAction' type: array - cacheArtifactUsageEvent: + passwordProtectionInvoiceItem: items: $ref: '#/components/schemas/ACLAction' type: array - concurrentBuilds: + paymentMethod: items: $ref: '#/components/schemas/ACLAction' type: array - connect: + permissions: items: $ref: '#/components/schemas/ACLAction' type: array - connectConfiguration: + postgres: items: $ref: '#/components/schemas/ACLAction' type: array - domain: + postgresStoreTokenSet: items: $ref: '#/components/schemas/ACLAction' type: array - domainAcceptDelegation: + previewDeploymentSuffix: items: $ref: '#/components/schemas/ACLAction' type: array - domainAuthCodes: + privateCloudAccount: items: $ref: '#/components/schemas/ACLAction' type: array - domainCertificate: + projectTransferIn: items: $ref: '#/components/schemas/ACLAction' type: array - domainCheckConfig: + projectTransferRequest: items: $ref: '#/components/schemas/ACLAction' type: array - domainMove: + proTrialOnboarding: items: $ref: '#/components/schemas/ACLAction' type: array - domainPurchase: + rateLimit: items: $ref: '#/components/schemas/ACLAction' type: array - domainRecord: + redis: items: $ref: '#/components/schemas/ACLAction' type: array - domainTransferIn: + redisStoreTokenSet: items: $ref: '#/components/schemas/ACLAction' type: array - event: + remoteCaching: items: $ref: '#/components/schemas/ACLAction' type: array - ownEvent: + repository: + items: + $ref: '#/components/schemas/ACLAction' + type: array + samlConfig: + items: + $ref: '#/components/schemas/ACLAction' + type: array + secret: + items: + $ref: '#/components/schemas/ACLAction' + type: array + securityConfig: items: $ref: '#/components/schemas/ACLAction' type: array @@ -6294,599 +17265,3166 @@ paths: items: $ref: '#/components/schemas/ACLAction' type: array - fileUpload: + sharedEnvVars: items: $ref: '#/components/schemas/ACLAction' type: array - gitRepository: + sharedEnvVarsProduction: items: $ref: '#/components/schemas/ACLAction' type: array - ipBlocking: + space: items: $ref: '#/components/schemas/ACLAction' type: array - integration: + spaceRun: items: $ref: '#/components/schemas/ACLAction' type: array - integrationConfiguration: + storeIsLocked: items: $ref: '#/components/schemas/ACLAction' type: array - integrationConfigurationTransfer: + storeTokenSetSensitive: items: $ref: '#/components/schemas/ACLAction' type: array - integrationConfigurationProjects: + storeTransfer: items: $ref: '#/components/schemas/ACLAction' type: array - integrationVercelConfigurationOverride: + supportCase: items: $ref: '#/components/schemas/ACLAction' type: array - jobGlobal: + supportCaseComment: items: $ref: '#/components/schemas/ACLAction' type: array - logDrain: + team: items: $ref: '#/components/schemas/ACLAction' type: array - Monitoring: + teamAccessRequest: items: $ref: '#/components/schemas/ACLAction' type: array - monitoringQuery: + teamFellowMembership: items: $ref: '#/components/schemas/ACLAction' type: array - monitoringChart: + teamGitExclusivity: items: $ref: '#/components/schemas/ACLAction' type: array - monitoringAlert: + teamInvite: items: $ref: '#/components/schemas/ACLAction' type: array - notificationDeploymentFailed: + teamInviteCode: items: $ref: '#/components/schemas/ACLAction' type: array - notificationDomainConfiguration: + teamInviteLink: items: $ref: '#/components/schemas/ACLAction' type: array - notificationDomainExpire: + teamJoin: items: $ref: '#/components/schemas/ACLAction' type: array - notificationDomainMoved: + teamMemberMfaStatus: items: $ref: '#/components/schemas/ACLAction' type: array - notificationDomainPurchase: + teamMicrofrontends: items: $ref: '#/components/schemas/ACLAction' type: array - notificationDomainRenewal: + teamOwnMembership: items: $ref: '#/components/schemas/ACLAction' type: array - notificationDomainTransfer: + teamOwnMembershipDisconnectSAML: items: $ref: '#/components/schemas/ACLAction' type: array - notificationDomainUnverified: + teamSudo: items: $ref: '#/components/schemas/ACLAction' type: array - NotificationMonitoringAlert: + teamTokenInvalidation: items: $ref: '#/components/schemas/ACLAction' type: array - notificationPaymentFailed: + token: items: $ref: '#/components/schemas/ACLAction' type: array - notificationUsageAlert: + toolbarComment: items: $ref: '#/components/schemas/ACLAction' type: array - notificationCustomerBudget: + usage: items: $ref: '#/components/schemas/ACLAction' type: array - openTelemetryEndpoint: + usageCycle: items: $ref: '#/components/schemas/ACLAction' type: array - paymentMethod: + vcrRepository: items: $ref: '#/components/schemas/ACLAction' type: array - permissions: + vpcPeeringConnection: items: $ref: '#/components/schemas/ACLAction' type: array - postgres: + webAnalyticsPlan: items: $ref: '#/components/schemas/ACLAction' type: array - previewDeploymentSuffix: + webhook: items: $ref: '#/components/schemas/ACLAction' type: array - proTrialOnboarding: + webhook-event: items: $ref: '#/components/schemas/ACLAction' type: array - seawallConfig: + aliasProject: items: $ref: '#/components/schemas/ACLAction' type: array - sharedEnvVars: + aliasProtectionBypass: items: $ref: '#/components/schemas/ACLAction' type: array - sharedEnvVarsProduction: + bulkRedirects: items: $ref: '#/components/schemas/ACLAction' type: array - space: + buildMachine: items: $ref: '#/components/schemas/ACLAction' type: array - spaceRun: + connectConfigurationLink: items: $ref: '#/components/schemas/ACLAction' type: array - passwordProtectionInvoiceItem: + dataCacheNamespace: items: $ref: '#/components/schemas/ACLAction' type: array - rateLimit: + deployment: items: $ref: '#/components/schemas/ACLAction' type: array - redis: + deploymentBuildLogs: items: $ref: '#/components/schemas/ACLAction' type: array - remoteCaching: + deploymentCheck: items: $ref: '#/components/schemas/ACLAction' type: array - samlConfig: + deploymentCheckPreview: items: $ref: '#/components/schemas/ACLAction' type: array - secret: + deploymentCheckReRunFromProductionBranch: items: $ref: '#/components/schemas/ACLAction' type: array - supportCase: + deploymentProductionGit: items: $ref: '#/components/schemas/ACLAction' type: array - supportCaseComment: + deploymentV0: items: $ref: '#/components/schemas/ACLAction' type: array - dataCacheBillingSettings: + deploymentPreview: items: $ref: '#/components/schemas/ACLAction' type: array - team: + deploymentPrivate: items: $ref: '#/components/schemas/ACLAction' type: array - teamAccessRequest: + deploymentPromote: items: $ref: '#/components/schemas/ACLAction' type: array - teamFellowMembership: + deploymentRollback: items: $ref: '#/components/schemas/ACLAction' type: array - teamInvite: + edgeCacheNamespace: items: $ref: '#/components/schemas/ACLAction' type: array - teamInviteCode: + environments: items: $ref: '#/components/schemas/ACLAction' type: array - teamJoin: + job: items: $ref: '#/components/schemas/ACLAction' type: array - teamOwnMembership: + logs: items: $ref: '#/components/schemas/ACLAction' type: array - teamOwnMembershipDisconnectSAML: + logsPreset: items: $ref: '#/components/schemas/ACLAction' type: array - token: + observabilityData: items: $ref: '#/components/schemas/ACLAction' type: array - usage: + onDemandBuild: items: $ref: '#/components/schemas/ACLAction' type: array - usageCycle: + onDemandConcurrency: items: $ref: '#/components/schemas/ACLAction' type: array - user: + optionsAllowlist: items: $ref: '#/components/schemas/ACLAction' type: array - userConnection: + passwordProtection: items: $ref: '#/components/schemas/ACLAction' type: array - webAnalyticsPlan: + privateLinkEndpoint: items: $ref: '#/components/schemas/ACLAction' type: array - edgeConfig: + productionAliasProtectionBypass: items: $ref: '#/components/schemas/ACLAction' type: array - edgeConfigItem: + productionShareableLink: items: $ref: '#/components/schemas/ACLAction' type: array - edgeConfigToken: + project: items: $ref: '#/components/schemas/ACLAction' type: array - webhook: + projectAccessGroup: items: $ref: '#/components/schemas/ACLAction' type: array - webhook-event: + projectAnalyticsSampling: items: $ref: '#/components/schemas/ACLAction' type: array - endpointVerification: + projectAnalyticsUsage: items: $ref: '#/components/schemas/ACLAction' type: array - projectTransferIn: + projectCheck: items: $ref: '#/components/schemas/ACLAction' type: array - aliasProject: + projectCheckRun: items: $ref: '#/components/schemas/ACLAction' type: array - aliasProtectionBypass: + projectDeploymentExpiration: items: $ref: '#/components/schemas/ACLAction' type: array - connectConfigurationLink: + projectDeploymentHook: items: $ref: '#/components/schemas/ACLAction' type: array - dataCacheNamespace: + projectDeploymentProtectionStrict: items: $ref: '#/components/schemas/ACLAction' type: array - deployment: + projectDomain: items: $ref: '#/components/schemas/ACLAction' type: array - deploymentCheck: + projectDomainCheckConfig: items: $ref: '#/components/schemas/ACLAction' type: array - deploymentCheckPreview: + projectDomainMove: items: $ref: '#/components/schemas/ACLAction' type: array - deploymentCheckReRunFromProductionBranch: + projectDomainVerify: items: $ref: '#/components/schemas/ACLAction' type: array - deploymentProductionGit: + projectEvent: items: $ref: '#/components/schemas/ACLAction' type: array - deploymentPreview: + projectEnvVars: items: $ref: '#/components/schemas/ACLAction' type: array - deploymentPrivate: + projectEnvVarsProduction: items: $ref: '#/components/schemas/ACLAction' type: array - deploymentPromote: + projectEnvVarsUnownedByIntegration: items: $ref: '#/components/schemas/ACLAction' type: array - deploymentRollback: + projectFlags: items: $ref: '#/components/schemas/ACLAction' type: array - logs: + projectFlagsProduction: items: $ref: '#/components/schemas/ACLAction' type: array - logsPreset: + projectFlagsSdkKey: items: $ref: '#/components/schemas/ACLAction' type: array - passwordProtection: + projectFromV0: items: $ref: '#/components/schemas/ACLAction' type: array - job: + projectId: items: $ref: '#/components/schemas/ACLAction' type: array - project: + projectIntegrationConfiguration: items: $ref: '#/components/schemas/ACLAction' type: array - projectAnalyticsSampling: + projectLink: items: $ref: '#/components/schemas/ACLAction' type: array - projectDeploymentHook: + projectMember: items: $ref: '#/components/schemas/ACLAction' type: array - projectDomain: + projectMonitoring: items: $ref: '#/components/schemas/ACLAction' type: array - projectDomainMove: + projectOIDCToken: items: $ref: '#/components/schemas/ACLAction' type: array - projectDomainCheckConfig: + projectPermissions: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectProductionBranch: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectProtectionBypass: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectRollingRelease: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectRoutes: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectSupportCase: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectSupportCaseComment: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectTier: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectTransfer: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectTransferOut: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectUsage: + items: + $ref: '#/components/schemas/ACLAction' + type: array + pageIntegrity: + items: + $ref: '#/components/schemas/ACLAction' + type: array + seawallConfig: + items: + $ref: '#/components/schemas/ACLAction' + type: array + securityPlusConfiguration: + items: + $ref: '#/components/schemas/ACLAction' + type: array + shareableLink: + items: + $ref: '#/components/schemas/ACLAction' + type: array + shareableLinkStrict: + items: + $ref: '#/components/schemas/ACLAction' + type: array + sharedEnvVarConnection: + items: + $ref: '#/components/schemas/ACLAction' + type: array + skewProtection: items: $ref: '#/components/schemas/ACLAction' type: array - projectEnvVars: + analytics: items: $ref: '#/components/schemas/ACLAction' type: array - projectEnvVarsProduction: + trustedIps: items: $ref: '#/components/schemas/ACLAction' type: array - projectEnvVarsUnownedByIntegration: + trustedSources: items: $ref: '#/components/schemas/ACLAction' type: array - projectId: + v0Chat: items: $ref: '#/components/schemas/ACLAction' type: array - projectIntegrationConfiguration: + vercelAuth: items: $ref: '#/components/schemas/ACLAction' type: array - projectLink: + vercelRun: items: $ref: '#/components/schemas/ACLAction' type: array - projectMember: + webAnalytics: items: $ref: '#/components/schemas/ACLAction' type: array - projectMonitoring: + workflowRunData: items: $ref: '#/components/schemas/ACLAction' type: array - projectPermissions: + type: object + lastRollbackTarget: + nullable: true + type: string + description: (opaque JSON object) + lastAliasRequest: + nullable: true + properties: + fromDeploymentId: + nullable: true + type: string + toDeploymentId: + type: string + fromRollingReleaseId: + type: string + description: If rolling back from a rolling release, fromDeploymentId captures the "base" of that rolling release, and fromRollingReleaseId captures the "target" of that rolling release. + jobStatus: + type: string + enum: + - failed + - in-progress + - pending + - skipped + - succeeded + requestedAt: + type: number + type: + type: string + enum: + - promote + - rollback + required: + - fromDeploymentId + - jobStatus + - requestedAt + - toDeploymentId + - type + type: object + protectionBypass: + additionalProperties: + oneOf: + - properties: + createdAt: + type: number + createdBy: + type: string + scope: + type: string + enum: + - integration-automation-bypass + integrationId: + type: string + configurationId: + type: string + required: + - configurationId + - createdAt + - createdBy + - integrationId + - scope + type: object + - properties: + createdAt: + type: number + createdBy: + type: string + scope: + type: string + enum: + - automation-bypass + isEnvVar: + type: boolean + enum: + - false + - true + description: When there was only one bypass, it was automatically set as an env var on deployments. With multiple bypasses, there is always one bypass that is selected as the default, and gets set as an env var on deployments. As this is a new field, undefined means that the bypass is the env var. If there are any automation bypasses, exactly one must be the env var. + note: + type: string + description: Optional note about the bypass to be displayed in the UI + required: + - createdAt + - createdBy + - scope + type: object + type: object + hasActiveBranches: + type: boolean + enum: + - false + - true + trustedIps: + nullable: true + properties: + deploymentType: + type: string + enum: + - all + - all_except_custom_domains + - preview + - prod_deployment_urls_and_all_previews + - production + addresses: items: - $ref: '#/components/schemas/ACLAction' + properties: + value: + type: string + note: + type: string + required: + - value + type: object type: array - projectProductionBranch: + protectionMode: + type: string + enum: + - additional + - exclusive + required: + - addresses + - deploymentType + - protectionMode + type: object + trustedSources: + nullable: true + properties: + enableVercelCiSameRepository: + type: boolean + enum: + - false + - true + description: Allow same-team Vercel CI access to preview deployments built from the CI run's repository, using the deployment source rather than the current project repository link. Defaults to enabled when not stored; omitted or null Trusted Sources updates preserve the stored value. + projects: + additionalProperties: + properties: + label: + type: string + customAllow: + items: + properties: + from: + oneOf: + - properties: + slugs: + items: + type: string + type: array + description: System environment slugs (`production`, `preview`) and/or custom environment slugs defined on the referenced project. + preset: + type: string + enum: + - all-custom + required: + - slugs + type: object + description: The source envs on the trusted project that are allowed to access `to`. + - properties: + slugs: + items: + type: string + type: array + description: System environment slugs (`production`, `preview`) and/or custom environment slugs defined on the referenced project. + preset: + type: string + enum: + - all-custom + required: + - preset + type: object + description: The source envs on the trusted project that are allowed to access `to`. + to: + oneOf: + - properties: + slugs: + items: + type: string + type: array + description: System environment slugs (`production`, `preview`) and/or custom environment slugs defined on the referenced project. + preset: + type: string + enum: + - all-custom + required: + - slugs + type: object + description: The target envs on the current project that may be accessed. + - properties: + slugs: + items: + type: string + type: array + description: System environment slugs (`production`, `preview`) and/or custom environment slugs defined on the referenced project. + preset: + type: string + enum: + - all-custom + required: + - preset + type: object + description: The target envs on the current project that may be accessed. + required: + - from + - to + type: object + description: Optional overrides for the default same-env-by-slug matching. Provide explicit rules to allow cross-env access or presets. + type: array + description: Optional overrides for the default same-env-by-slug matching. Provide explicit rules to allow cross-env access or presets. + type: object + type: object + oidcProviders: + additionalProperties: + items: + properties: + to: + oneOf: + - properties: + slugs: + items: + type: string + type: array + description: System environment slugs (`production`, `preview`) and/or custom environment slugs defined on the referenced project. + preset: + type: string + enum: + - all-custom + required: + - slugs + type: object + description: The target envs on the current project that may be accessed. + - properties: + slugs: + items: + type: string + type: array + description: System environment slugs (`production`, `preview`) and/or custom environment slugs defined on the referenced project. + preset: + type: string + enum: + - all-custom + required: + - preset + type: object + description: The target envs on the current project that may be accessed. + label: + type: string + claims: + additionalProperties: + items: + type: string + type: array + type: object + required: + - claims + - to + type: object + type: array + type: object + type: object + gitComments: + properties: + onPullRequest: + type: boolean + enum: + - false + - true + description: Whether the Vercel bot should comment on PRs + onCommit: + type: boolean + enum: + - false + - true + description: Whether the Vercel bot should comment on commits + required: + - onCommit + - onPullRequest + type: object + gitProviderOptions: + properties: + createDeployments: + type: string + enum: + - disabled + - enabled + description: 'Whether the Vercel bot should automatically create GitHub deployments https://docs.github.com/en/rest/deployments/deployments#about-deployments NOTE: repository-dispatch events should be used instead' + disableRepositoryDispatchEvents: + type: boolean + enum: + - false + - true + description: 'Whether the Vercel bot should not automatically create GitHub repository-dispatch events on deployment events. https://vercel.com/docs/git/vercel-for-github#repository-dispatch-events - `true`: disable repository-dispatch events for this project (explicit override of the team setting). - `false`: enable repository-dispatch events for this project (explicit override of the team setting). - absent: inherit from `team.disableRepositoryDispatchEvents`.' + requireVerifiedCommits: + type: boolean + enum: + - false + - true + description: 'Whether the project requires commits to be signed & verified before deployments will be created. - `true`: require verified commits for this project (explicit override of the team setting). - `false`: do not require verified commits (explicit override of the team setting). - absent: inherit from `team.requireVerifiedCommits`.' + gitCommitStatus: + type: boolean + enum: + - false + - true + description: Whether Vercel should post commit statuses for this project. When omitted, commit statuses remain enabled. + consolidatedGitCommitStatus: + properties: + enabled: + type: boolean + enum: + - false + - true + description: Whether consolidated commit status is enabled. + propagateFailures: + type: boolean + enum: + - false + - true + description: Whether to propagate individual deployment failures to the consolidated status. + required: + - enabled + - propagateFailures + type: object + description: Configuration for consolidated git commit status reporting. When enabled, Vercel will post a single consolidated commit status instead of individual statuses for each deployment. + required: + - createDeployments + type: object + paused: + type: boolean + enum: + - false + - true + concurrencyBucketName: + type: string + webAnalytics: + properties: + id: + type: string + disabledAt: + type: number + canceledAt: + type: number + enabledAt: + type: number + hasData: + type: boolean + enum: + - true + required: + - id + type: object + security: + properties: + attackModeEnabled: + type: boolean + enum: + - false + - true + attackModeUpdatedAt: + type: number + firewallEnabled: + type: boolean + enum: + - false + - true + firewallUpdatedAt: + type: number + attackModeActiveUntil: + nullable: true + type: number + firewallConfigVersion: + type: number + rulesets: + additionalProperties: + properties: + action: + type: string + enum: + - allow + - bypass + - challenge + - deny + - log + - rate_limit + - redirect + rateLimit: + nullable: true + properties: + algo: + type: string + enum: + - fixed_window + - token_bucket + window: + type: number + limit: + type: number + keys: + items: + type: string + type: array + required: + - algo + - keys + - limit + - window + type: object + redirect: + nullable: true + properties: + location: + type: string + permanent: + type: boolean + enum: + - false + - true + required: + - location + - permanent + type: object + actionDuration: + nullable: true + type: string + bypassSystem: + nullable: true + type: boolean + enum: + - false + - true + - null + logHeaders: + oneOf: + - items: + type: string + type: array + - type: string + enum: + - '*' + required: + - action + type: object + type: object + firewallSeawallEnabled: + type: boolean + enum: + - false + - true + ja3Enabled: + type: boolean + enum: + - false + - true + ja4Enabled: + type: boolean + enum: + - false + - true + firewallBypassIps: items: - $ref: '#/components/schemas/ACLAction' + type: string type: array - projectTransfer: + managedRules: + nullable: true + properties: + vercel_ruleset: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - challenge + - deny + - log + required: + - active + type: object + traffic_sources: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - challenge + - deny + - log + required: + - active + type: object + bot_filter: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - challenge + - deny + - log + required: + - active + type: object + ai_bots: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - challenge + - deny + - log + required: + - active + type: object + owasp: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - challenge + - deny + - log + required: + - active + type: object + required: + - ai_bots + - bot_filter + - owasp + - traffic_sources + - vercel_ruleset + type: object + botIdEnabled: + type: boolean + enum: + - false + - true + log_headers: + oneOf: + - items: + type: string + type: array + - type: string + enum: + - '*' + securityPlus: + type: boolean + enum: + - false + - true + securityPlusMetadata: + properties: + updatedAt: + type: number + firstEnabledAt: + type: number + description: Timestamp when the feature was first enabled. Never changes after initial enablement. + required: + - updatedAt + type: object + pageIntegrityEnabled: + type: boolean + enum: + - false + - true + description: Whether Page Integrity is enabled for this project. Used by the metadata service to gate DynamoDB lookups against the page-integrity-inventory table. + type: object + oidcTokenConfig: + properties: + enabled: + type: boolean + enum: + - false + - true + description: Whether or not to generate OpenID Connect JSON Web Tokens. + issuerMode: + type: string + enum: + - global + - team + description: '- team: `https://oidc.vercel.com/[team_slug]` - global: `https://oidc.vercel.com`' + type: object + deploymentPolicy: + nullable: true + properties: + gitSources: + nullable: true items: - $ref: '#/components/schemas/ACLAction' + properties: + sources: + items: + oneOf: + - properties: + provider: + type: string + enum: + - bitbucket + - github + org: + type: string + repo: + type: string + required: + - org + - provider + type: object + description: Allowlist entry for GitHub and Bitbucket, whose repos are identified by a flat `org`/`repo` (Bitbucket's workspace/owner maps to `org`, its repo slug to `repo`). Omit `repo` to match any repo in the org. Org is matched case-insensitively. + - properties: + provider: + type: string + enum: + - gitlab + namespace: + type: string + project: + type: string + required: + - namespace + - provider + type: object + description: Allowlist entry for GitLab, which uses nested groups rather than a flat org/repo. `namespace` is the full group path (e.g. `group` or `group/subgroup`); `project` is the leaf project name. Omit `project` to match any project under the namespace. Namespace is matched case-insensitively. + type: array + enabled: + type: boolean + enum: + - false + - true + environments: + items: + oneOf: + - properties: + type: + type: string + enum: + - system + target: + type: string + enum: + - preview + - production + required: + - target + - type + type: object + - properties: + type: + type: string + enum: + - custom + environmentId: + type: string + required: + - environmentId + - type + type: object + type: array + required: + - enabled + - environments + - sources + type: object + description: '`enabled: true` with empty `sources` is deny-all.' type: array - projectTransferOut: + deploymentSources: + nullable: true items: - $ref: '#/components/schemas/ACLAction' + properties: + sources: + items: + type: string + enum: + - cli + - deploy-hook + - git + - integration + - rest-api + - v0 + description: 'Customer-configurable deployment sources. Every deploy classifies to exactly one. JSON schema in `packages/deployment-policy/schemas/body.ts` enumerates exactly these values. - `''git''` — git provider webhook. - `''cli''` — Vercel CLI (legacy classic-token CLI and SIWV CLI both). - `''rest-api''` — direct user/team-token REST upload. Does NOT cover deploy hooks, Marketplace integrations, or first-party app tokens. - `''deploy-hook''` — project deploy-hook URL. The URL is the credential. - `''integration''` — third-party Marketplace actor: Marketplace integration token, user-delegated OAuth from a Marketplace app, or an unrecognized third-party Vercel App. First-party Vercel Apps are never `''integration''`. - `''v0''` — the v0 product surface (entitlement-gated). v0 deploys through the CLI under the hood, but classifies as its own source so a team can allow or deny v0 independently of `''cli''`. First-party Vercel apps (Toolbar, etc.) classify as `''first-party''` — see `ClassifiedSource` in `./checks`. They''re not in this union because they aren''t customer-configurable; they bypass `checkDeploymentSources` entirely. v0 is intentionally NOT among them: like the CLI, it''s a real product surface and is policy-controllable.' + type: array + enabled: + type: boolean + enum: + - false + - true + environments: + items: + oneOf: + - properties: + type: + type: string + enum: + - system + target: + type: string + enum: + - preview + - production + required: + - target + - type + type: object + - properties: + type: + type: string + enum: + - custom + environmentId: + type: string + required: + - environmentId + - type + type: object + type: array + required: + - enabled + - environments + - sources + type: object + description: '`enabled: true` with empty `sources` is deny-all.' type: array - projectProtectionBypass: + type: object + description: Project shape. `null` on a rule list clears the project's override for that rule type (fall back to team for every env); omitting is equivalent. Setting `deploymentPolicy` itself to `null` clears every override at once. Kept structurally distinct from {@link TeamDeploymentPolicy} so the two storage locations don't share a type by accident. + tier: + type: string + enum: + - advanced + - critical + - priority + usageStatus: + properties: + kind: + type: string + enum: + - flat + description: Billing mode. Always 'flat' for flat-rate projects. + exceededAllowanceUntil: + type: number + description: Timestamp until which the project has exceeded its CDN allowance. + bypassThrottleUntil: + type: number + description: Timestamp until which throttling is bypassed (project pays list rates for overage). + throttled: + type: boolean + enum: + - false + - true + description: Per-project throttle, set explicitly for this project (e.g. via the per-project Flat Rate CDN endpoint). + teamThrottled: + type: boolean + enum: + - false + - true + description: Synced from `team.billing.usageStatus.throttled`. When `true`, the team has throttled all of its projects regardless of `throttled`. The effective throttle the CDN enforces is `throttled || teamThrottled`. + required: + - kind + type: object + features: + properties: + webAnalytics: + type: boolean + enum: + - false + - true + type: object + v0: + type: boolean + enum: + - false + - true + v0Created: + type: boolean + enum: + - false + - true + abuse: + properties: + scanner: + type: string + history: items: - $ref: '#/components/schemas/ACLAction' + properties: + scanner: + type: string + reason: + type: string + by: + type: string + byId: + type: string + at: + type: number + required: + - at + - by + - byId + - reason + - scanner + type: object type: array - projectUsage: + updatedAt: + type: number + block: + properties: + action: + type: string + enum: + - blocked + reason: + type: string + statusCode: + type: number + createdAt: + type: number + caseId: + type: string + actor: + type: string + comment: + type: string + ineligibleForAppeal: + type: boolean + enum: + - false + - true + isCascading: + type: boolean + enum: + - false + - true + required: + - action + - createdAt + - reason + - statusCode + type: object + blockHistory: items: - $ref: '#/components/schemas/ACLAction' + oneOf: + - properties: + action: + type: string + enum: + - blocked + reason: + type: string + statusCode: + type: number + createdAt: + type: number + caseId: + type: string + actor: + type: string + comment: + type: string + ineligibleForAppeal: + type: boolean + enum: + - false + - true + isCascading: + type: boolean + enum: + - false + - true + required: + - action + - createdAt + - reason + - statusCode + type: object + - properties: + action: + type: string + enum: + - unblocked + createdAt: + type: number + caseId: + type: string + actor: + type: string + comment: + type: string + ineligibleForAppeal: + type: boolean + enum: + - false + - true + isCascading: + type: boolean + enum: + - false + - true + required: + - action + - createdAt + type: object + - properties: + action: + type: string + enum: + - route-blocked + route: + oneOf: + - properties: + src: + type: string + status: + type: number + expiry: + type: number + required: + - src + - status + type: object + - properties: + has: + items: + oneOf: + - properties: + type: + type: string + enum: + - header + key: + type: string + enum: + - x-vercel-ip-country + value: + properties: + eq: + type: string + required: + - eq + type: object + required: + - key + - type + - value + type: object + - properties: + type: + type: string + enum: + - host + value: + properties: + eq: + type: string + required: + - eq + type: object + required: + - type + - value + type: object + type: array + mitigate: + properties: + action: + type: string + enum: + - block_legal_cwc + required: + - action + type: object + src: + type: string + required: + - has + - mitigate + type: object + reason: + type: string + createdAt: + type: number + caseId: + type: string + actor: + type: string + comment: + type: string + ineligibleForAppeal: + type: boolean + enum: + - false + - true + isCascading: + type: boolean + enum: + - false + - true + required: + - action + - createdAt + - reason + - route + type: object + - properties: + action: + type: string + enum: + - route-unblocked + route: + oneOf: + - properties: + src: + type: string + status: + type: number + expiry: + type: number + required: + - src + - status + type: object + - properties: + has: + items: + oneOf: + - properties: + type: + type: string + enum: + - header + key: + type: string + enum: + - x-vercel-ip-country + value: + properties: + eq: + type: string + required: + - eq + type: object + required: + - key + - type + - value + type: object + - properties: + type: + type: string + enum: + - host + value: + properties: + eq: + type: string + required: + - eq + type: object + required: + - type + - value + type: object + type: array + mitigate: + properties: + action: + type: string + enum: + - block_legal_cwc + required: + - action + type: object + src: + type: string + required: + - has + - mitigate + type: object + statusCode: + type: number + createdAt: + type: number + caseId: + type: string + actor: + type: string + comment: + type: string + ineligibleForAppeal: + type: boolean + enum: + - false + - true + isCascading: + type: boolean + enum: + - false + - true + required: + - action + - createdAt + - route + type: object type: array - projectAnalyticsUsage: + interstitial: + type: boolean + enum: + - false + - true + interstitialHistory: items: - $ref: '#/components/schemas/ACLAction' + properties: + action: + type: string + enum: + - add-deployment-interstitial + - add-project-interstitial + - remove-deployment-interstitial + - remove-project-interstitial + createdAt: + type: number + caseId: + type: string + reason: + type: string + actor: + type: string + comment: + type: string + required: + - action + - createdAt + type: object type: array - analytics: + required: + - history + - updatedAt + type: object + internalRoutes: + items: + oneOf: + - properties: + src: + type: string + status: + type: number + expiry: + type: number + required: + - src + - status + type: object + - properties: + has: + items: + oneOf: + - properties: + type: + type: string + enum: + - header + key: + type: string + enum: + - x-vercel-ip-country + value: + properties: + eq: + type: string + required: + - eq + type: object + required: + - key + - type + - value + type: object + - properties: + type: + type: string + enum: + - host + value: + properties: + eq: + type: string + required: + - eq + type: object + required: + - type + - value + type: object + type: array + mitigate: + properties: + action: + type: string + enum: + - block_legal_cwc + required: + - action + type: object + src: + type: string + required: + - has + - mitigate + type: object + type: array + hasDeployments: + type: boolean + enum: + - false + - true + dismissedToasts: + items: + properties: + key: + type: string + dismissedAt: + type: number + action: + type: string + enum: + - accept + - cancel + - delete + value: + nullable: true + oneOf: + - type: string + - type: number + - properties: + previousValue: + oneOf: + - type: string + - type: number + - type: boolean + enum: + - false + - true + currentValue: + oneOf: + - type: string + - type: number + - type: boolean + enum: + - false + - true + required: + - currentValue + - previousValue + type: object + - type: boolean + enum: + - false + - true + required: + - action + - dismissedAt + - key + - value + type: object + type: array + protectedSourcemaps: + type: boolean + enum: + - false + - true + tracing: + properties: + domains: + type: string + ignorePaths: items: - $ref: '#/components/schemas/ACLAction' + type: string type: array - trustedIps: + samplingRules: items: - $ref: '#/components/schemas/ACLAction' + properties: + rate: + type: number + env: + type: string + enum: + - preview + - production + requestPath: + type: string + destination: + type: string + enum: + - external + - internal + description: Which tracing destination this rule applies to. `internal` is the hidden Vercel production-tracing drain (internal delivery); `external` is any customer-configured drain. Derived from the owning drain's delivery type when project tracing is computed; absent on configs persisted before this field existed. + required: + - rate + type: object type: array - webAnalytics: - items: - $ref: '#/components/schemas/ACLAction' + type: object + avatar: + nullable: true + type: string + required: + - accountId + - alias + - defaultResourceConfig + - deploymentExpiration + - directoryListing + - id + - name + - nodeVersion + - resourceConfig + type: object + '400': + description: |- + One of the provided values in the request body is invalid. + One of the provided values in the request query is invalid. + Trusted IPs is only accessible for enterprise customers. This plan gate runs before the ACL check below on purpose: it depends only on the team's billing plan, so it can reject unsupported plans deterministically. `auth.can` resolves team membership (a DynamoDB lookup) and rejecting here first avoids depending on that external read for a request that is invalid regardless of authorization. + '401': + description: The request is not authorized. + '402': + description: |- + The account is missing a payment so payment method must be updated + Pro customers are allowed to deploy Serverless Functions to up to `proMaxRegions` regions, or if the project was created before the limit was introduced. + Deploying to Serverless Functions to multiple regions requires a plan update + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '409': + description: |- + The provided name for the project is already being used + The project is currently being transferred. + '410': + description: '' + '428': + description: Owner does not have protection add-on + '429': + description: '' + x-vercel-cli: + supportedSubcommands: true + supportedProduction: false + aliases: + - rename + bodyArguments: + - name + parameters: + - name: id_or_name + description: The unique project identifier or the project name + in: path + required: true + schema: + example: prj_12HKQaOmR5t5Uy6vdcQsNIiZgHGB + description: The unique project identifier or the project name + type: string + x-vercel-cli: + kind: argument + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + requestBody: + content: + application/json: + schema: + additionalProperties: false + properties: + autoExposeSystemEnvs: + type: boolean + autoAssignCustomDomains: + type: boolean + autoAssignCustomDomainsUpdatedBy: + type: string + buildCommand: + description: The build command for this project. When `null` is used this value will be automatically detected + maxLength: 256 + type: string + nullable: true + commandForIgnoringBuildStep: + maxLength: 256 + type: string + nullable: true + customerSupportCodeVisibility: + description: Specifies whether customer support can see git source for a deployment + type: boolean + devCommand: + description: The dev command for this project. When `null` is used this value will be automatically detected + maxLength: 256 + type: string + nullable: true + directoryListing: + type: boolean + framework: + description: The framework that is being used for this project. When `null` is used no framework is selected + enum: + - null + - container + - blitzjs + - nextjs + - gatsby + - remix + - react-router + - astro + - hexo + - eleventy + - docusaurus-2 + - docusaurus + - preact + - solidstart-1 + - solidstart + - dojo + - ember + - vue + - scully + - ionic-angular + - angular + - polymer + - svelte + - sveltekit + - sveltekit-1 + - ionic-react + - create-react-app + - gridsome + - umijs + - sapper + - saber + - stencil + - nuxtjs + - redwoodjs + - hugo + - jekyll + - brunch + - middleman + - zola + - hydrogen + - vite + - tanstack-start + - tanstack-start-lovable + - vitepress + - vuepress + - parcel + - fastapi + - flask + - fasthtml + - django + - ash + - factory-eve + - eve + - sanity + - sanity-v2 + - storybook + - nitro + - hono + - express + - h3 + - koa + - nestjs + - elysia + - fastify + - xmcp + - python + - ruby + - rust + - axum + - actix-web + - bun + - node + - go + - services + - mastra + type: string + nullable: true + gitForkProtection: + description: Specifies whether PRs from Git forks should require a team member's authorization before it can be deployed + type: boolean + gitLFS: + description: Specifies whether Git LFS is enabled for this project. + type: boolean + protectedSourcemaps: + description: Specifies whether sourcemaps are protected and require authentication to access. + type: boolean + installCommand: + description: The install command for this project. When `null` is used this value will be automatically detected + maxLength: 256 + type: string + nullable: true + name: + description: The desired name for the project + example: a-project-name + type: string + maxLength: 100 + nodeVersion: + enum: + - 24.x + - 22.x + - 20.x + - 18.x + - 16.x + - 14.x + - 12.x + - 10.x + type: string + outputDirectory: + description: The output directory of the project. When `null` is used this value will be automatically detected + maxLength: 256 + type: string + nullable: true + previewDeploymentsDisabled: + description: Specifies whether preview deployments are disabled for this project. + type: boolean + nullable: true + previewDeploymentSuffix: + description: Custom domain suffix for preview deployments. Takes precedence over team-level suffix. Must be a domain owned by the team. + type: string + maxLength: 253 + nullable: true + resourceConfig: + properties: + buildMachineType: + enum: + - null + - basic + - enhanced + - turbo + - standard + - elastic + buildMachineSelection: + type: string + enum: + - elastic + - fixed + buildQueue: + type: object + properties: + configuration: + type: string + enum: + - SKIP_NAMESPACE_QUEUE + - WAIT_FOR_NAMESPACE_QUEUE + fluid: + type: boolean + functionDefaultRegions: + description: The regions to deploy Vercel Functions to for this project + type: array + minItems: 1 + uniqueItems: true + items: + type: string + maxLength: 4 + functionDefaultTimeout: + type: number + maximum: 900 + minimum: 1 + functionDefaultMemoryType: + enum: + - standard_legacy + - standard + - performance + - performance_xl + functionZeroConfigFailover: + description: Specifies whether Zero Config Failover is enabled for this project. + oneOf: + - type: boolean + elasticConcurrencyEnabled: + type: boolean + buildMachineElasticLastUpdated: + type: number + buildMachineElasticReason: + enum: + - oom-failure + - enospc-failure + - build-timeout-failure + - basic-floor + - high-peak-memory + - sustained-high-cpu + - high-peak-disk + - long-build-duration + - short-build-duration + - enterprise-floor + isNSNBDisabled: + type: boolean + enableFunctionsBeta: + type: boolean + type: object + description: Specifies resource override configuration for the project + additionalProperties: false + publicSource: + deprecated: true + description: Deprecated. Accepted for backwards compatibility but ignored. + type: boolean + nullable: true + rootDirectory: + description: The name of a directory or relative path to the source code of your project. When `null` is used it will default to the project root + maxLength: 256 + type: string + nullable: true + serverlessFunctionRegion: + description: The region to deploy Serverless Functions in this project + maxLength: 4 + type: string + nullable: true + serverlessFunctionZeroConfigFailover: + description: Specifies whether Zero Config Failover is enabled for this project. + type: boolean + skewProtectionBoundaryAt: + description: Deployments created before this absolute datetime have Skew Protection disabled. Value is in milliseconds since epoch to match \"createdAt\" fields. + minimum: 0 + type: integer + skewProtectionMaxAge: + description: Deployments created before this rolling window have Skew Protection disabled. Value is in seconds to match \"revalidate\" fields. + minimum: 0 + type: integer + skewProtectionAllowedDomains: + description: Cross-site domains allowed to fetch skew-protected assets (hostnames, optionally with leading wildcard like *.example.com). + type: array + items: + type: string + maxLength: 254 + maxItems: 12 + skipGitConnectDuringLink: + description: Opts-out of the message prompting a CLI user to connect a Git repository in `vercel link`. + type: boolean + deprecated: true + sourceFilesOutsideRootDirectory: + description: Indicates if there are source files outside of the root directory + type: boolean + enablePreviewFeedback: + description: Opt-in to preview toolbar on the project level + type: boolean + nullable: true + enableProductionFeedback: + description: Opt-in to production toolbar on the project level + type: boolean + nullable: true + enableAffectedProjectsDeployments: + description: Opt-in to skip deployments when there are no changes to the root directory and its dependencies + type: boolean + enableExternalRewriteCaching: + description: Specifies whether external rewrite caching is enabled for this project. + type: boolean + staticIps: + additionalProperties: false + description: Manage Static IPs for this project + properties: + enabled: + description: Opt-in to Static IPs for this project + type: boolean + required: + - enabled + type: object + tracing: + description: Tracing configuration for this project + type: object + additionalProperties: false + properties: + domains: + description: Comma-separated list of drain endpoint domains + type: string + ignorePaths: + description: Paths to ignore for tracing + type: array + items: + type: string + samplingRules: + description: Sampling rules for trace collection + type: array + maxItems: 10 + items: + type: object + additionalProperties: false + required: + - rate + properties: + rate: + type: number + minimum: 0 + maximum: 1 + description: Sampling rate from 0 to 1 + env: + type: string + enum: + - production + - preview + description: Environment to apply sampling to + requestPath: + type: string + description: Request path prefix to apply the sampling rule to + destination: + type: string + enum: + - internal + - external + description: Tracing destination this rule applies to. Derived server-side when project tracing is computed; accepted here so a computed config can round-trip through this endpoint. + nullable: true + oidcTokenConfig: + description: OpenID Connect JSON Web Token generation configuration. + type: object + additionalProperties: false + properties: + enabled: + description: Whether or not to generate OpenID Connect JSON Web Tokens. + deprecated: true + type: boolean + default: true + issuerMode: + description: 'team: `https://oidc.vercel.com/[team_slug]` global: `https://oidc.vercel.com`' + type: string + enum: + - team + - global + default: team + passwordProtection: + additionalProperties: false + description: Allows to protect project deployments with a password + properties: + deploymentType: + description: Specify if the password will apply to every Deployment Target or just Preview + enum: + - all + - preview + - prod_deployment_urls_and_all_previews + - all_except_custom_domains + type: string + password: + description: The password that will be used to protect Project Deployments + maxLength: 72 + type: string + nullable: true + required: + - deploymentType + type: object + nullable: true + passport: + description: Passport configuration for the project. + type: object + additionalProperties: false + properties: + connectorId: + type: string + deploymentType: + type: string + default: all + enum: + - all + - preview + - prod_deployment_urls_and_all_previews + - all_except_custom_domains + required: + - connectorId + nullable: true + sandbox: + type: object + description: Specifies the default region and failover regions for sandboxes created in the project + properties: + region: + description: The Vercel region sandboxes in this project are created in by default. + enum: + - iad1 + - sfo1 + - cle1 + - cdg1 + - fra1 + - arn1 + - sin1 + - pdx1 + - lhr1 + - icn1 + - bom1 + - cpt1 + - dub1 + - gru1 + - hkg1 + - syd1 + - yul1 + - hnd1 + - kix1 + example: iad1 + failoverRegions: + description: The regions sandboxes in this project fall back to when they cannot be created in `region`. + type: array + uniqueItems: true + maxItems: 19 + items: + enum: + - iad1 + - sfo1 + - cle1 + - cdg1 + - fra1 + - arn1 + - sin1 + - pdx1 + - lhr1 + - icn1 + - bom1 + - cpt1 + - dub1 + - gru1 + - hkg1 + - syd1 + - yul1 + - hnd1 + - kix1 + example: + - sfo1 + - cle1 + additionalProperties: false + ssoProtection: + additionalProperties: false + description: Ensures visitors to your Preview Deployments are logged into Vercel and have a minimum of Viewer access on your team + properties: + deploymentType: + default: preview + description: Specify if the Vercel Authentication (SSO Protection) will apply to every Deployment Target or just Preview + enum: + - all + - preview + - prod_deployment_urls_and_all_previews + - all_except_custom_domains + type: string + required: + - deploymentType + type: object + nullable: true + trustedIps: + additionalProperties: false + description: Restricts access to deployments based on the incoming request IP address + properties: + deploymentType: + description: Specify if the Trusted IPs will apply to every Deployment Target or just Preview + enum: + - all + - preview + - production + - prod_deployment_urls_and_all_previews + - all_except_custom_domains + type: string + addresses: + type: array + items: + type: object + properties: + value: + type: string + description: The IP addresses that are allowlisted. Supports IPv4 addresses and CIDR notations. IPv6 is not supported + note: + type: string + description: An optional note explaining what the IP address or subnet is used for + maxLength: 20 + required: + - value + additionalProperties: false + minItems: 1 + protectionMode: + description: 'exclusive: ip match is enough to bypass deployment protection (regardless of other settings). additional: ip must match + any other protection should be also provided (password, vercel auth, shareable link, automation bypass header, automation bypass query param)' + enum: + - exclusive + - additional + type: string + required: + - deploymentType + - addresses + - protectionMode + type: object + nullable: true + trustedSources: + type: object + additionalProperties: false + description: Deployment Protection Trusted Sources + properties: + enableVercelCiSameRepository: + type: boolean + description: Allow same-team Vercel CI access to preview deployments built from the same repository as the CI run. The deployment source repository, not the current project repository link, is authoritative. Defaults to enabled when not stored. Omitting this field preserves its stored value, including when trustedSources is cleared. Set true explicitly to re-enable. + projects: + type: object + maxProperties: 100 + additionalProperties: + type: object + additionalProperties: false + properties: + label: + type: string + maxLength: 100 + description: The label or description of the trusted source + customAllow: + type: array + minItems: 1 + maxItems: 20 + items: + type: object + additionalProperties: false + required: + - from + - to + properties: + to: + type: object + additionalProperties: false + description: A set of environments, expressed as explicit slugs, a named preset, or both. At least one of `slugs` or `preset` must be set. + anyOf: + - required: + - slugs + - required: + - preset + properties: + slugs: + type: array + minItems: 1 + maxItems: 10 + uniqueItems: true + items: + type: string + maxLength: 64 + description: A system environment (\"production\", \"preview\", or \"development\") or a custom environment slug + preset: + type: string + enum: + - all-custom + from: + type: object + additionalProperties: false + description: A set of environments, expressed as explicit slugs, a named preset, or both. At least one of `slugs` or `preset` must be set. + anyOf: + - required: + - slugs + - required: + - preset + properties: + slugs: + type: array + minItems: 1 + maxItems: 10 + uniqueItems: true + items: + type: string + maxLength: 64 + description: A system environment (\"production\", \"preview\", or \"development\") or a custom environment slug + preset: + type: string + enum: + - all-custom + description: Optional overrides for the default same-env-by-slug matching. + oidcProviders: + type: object + maxProperties: 50 + additionalProperties: type: array - sharedEnvVarConnection: + minItems: 1 + maxItems: 10 items: - $ref: '#/components/schemas/ACLAction' - type: array - type: object - lastRollbackTarget: - nullable: true - type: object - lastAliasRequest: - nullable: true + type: object + additionalProperties: false + required: + - claims + - to + properties: + label: + type: string + maxLength: 100 + description: The label or description of the trusted source + to: + type: object + additionalProperties: false + description: A set of environments, expressed as explicit slugs, a named preset, or both. At least one of `slugs` or `preset` must be set. + anyOf: + - required: + - slugs + - required: + - preset + properties: + slugs: + type: array + minItems: 1 + maxItems: 10 + uniqueItems: true + items: + type: string + maxLength: 64 + description: A system environment (\"production\", \"preview\", or \"development\") or a custom environment slug + preset: + type: string + enum: + - all-custom + claims: + type: object + minProperties: 1 + maxProperties: 20 + additionalProperties: + type: array + minItems: 1 + maxItems: 20 + items: + type: string + maxLength: 256 + nullable: true + deploymentPolicy: + type: object + description: Composable deployment-time policy. Each rule type holds a list of rules, one per environment scope. + additionalProperties: false + properties: + gitSources: + anyOf: + - type: array + items: + type: object + additionalProperties: false + required: + - enabled + - environments + - sources + properties: + enabled: + type: boolean + environments: + type: array + items: + anyOf: + - type: object + additionalProperties: false + required: + - type + - target + properties: + type: + type: string + enum: + - system + target: + type: string + enum: + - production + - preview + - type: object + additionalProperties: false + required: + - type + - environmentId + properties: + type: + type: string + enum: + - custom + environmentId: + type: string + sources: + type: array + items: + anyOf: + - type: object + additionalProperties: false + required: + - provider + - org + properties: + provider: + type: string + enum: + - github + - bitbucket + org: + type: string + repo: + type: string + - type: object + additionalProperties: false + required: + - provider + - namespace + properties: + provider: + type: string + enum: + - gitlab + namespace: + type: string + project: + type: string + - type: string + deploymentSources: + anyOf: + - type: array + items: + type: object + additionalProperties: false + required: + - enabled + - environments + - sources + properties: + enabled: + type: boolean + environments: + type: array + items: + anyOf: + - type: object + additionalProperties: false + required: + - type + - target + properties: + type: + type: string + enum: + - system + target: + type: string + enum: + - production + - preview + - type: object + additionalProperties: false + required: + - type + - environmentId + properties: + type: + type: string + enum: + - custom + environmentId: + type: string + sources: + type: array + items: + type: string + enum: + - git + - cli + - rest-api + - deploy-hook + - integration + - v0 + - type: string + optionsAllowlist: + additionalProperties: false + description: Specify a list of paths that should not be protected by Deployment Protection to enable Cors preflight requests + properties: + paths: + type: array + items: + type: object + properties: + value: + type: string + description: The regex path that should not be protected by Deployment Protection + pattern: ^/.* + required: + - value + additionalProperties: false + minItems: 1 + maxItems: 5 + required: + - paths + type: object + nullable: true + connectConfigurations: + type: array + description: The list of connections from project environment to Secure Compute network + items: + additionalProperties: false properties: - fromDeploymentId: + envId: type: string - toDeploymentId: + description: The ID of the environment + connectConfigurationId: type: string - jobStatus: + description: The ID of the Secure Compute network + passive: + type: boolean + description: Whether the configuration should be passive, meaning builds will not run there and only passive Serverless Functions will be deployed + buildsEnabled: + type: boolean + description: Flag saying if project builds should use Secure Compute + required: + - envId + - connectConfigurationId + - passive + - buildsEnabled + oneOf: + - type: string + description: (opaque JSON object) + type: object + minItems: 1 + nullable: true + dismissedToasts: + description: An array of objects representing a Dismissed Toast in regards to a Project. Objects are either merged with existing toasts (on key match), or added to the `dimissedToasts` array.` + type: array + minItems: 0 + maxItems: 50 + items: + type: object + additionalProperties: false + required: + - key + - dismissedAt + - action + - value + properties: + key: type: string - enum: - - succeeded - - failed - - skipped - - pending - - in-progress - requestedAt: + description: unique identifier for the dismissed toast + dismissedAt: type: number + description: unix timestamp representing the time the toast was dimissed + action: + enum: + - cancel + - accept + - delete + description: Whether the toast was dismissed, the action was accepted, or the dismissal with this key should be removed + value: + oneOf: + - type: string + - type: string + - type: boolean + - type: number + - type: object + additionalProperties: false + required: + - previousValue + - currentValue + properties: + previousValue: + oneOf: + - type: number + - type: boolean + - type: string + currentValue: + oneOf: + - type: number + - type: boolean + - type: string + type: object + required: true + x-speakeasy-usage-example: + title: Update an existing project + description: Update the fields of a project using either its name or id. + position: 2 + delete: + description: Delete a specific project by passing either the project `id` or `name` in the URL. + operationId: deleteProject + security: + - bearerToken: [] + summary: Delete a Project + tags: + - projects + responses: + '204': + description: The project was successfuly removed + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '409': + description: '' + '410': + description: '' + x-vercel-cli: + supportedSubcommands: true + supportedProduction: false + parameters: + - name: id_or_name + description: The unique project identifier or the project name + in: path + required: true + schema: + example: prj_12HKQaOmR5t5Uy6vdcQsNIiZgHGB + description: The unique project identifier or the project name + type: string + x-vercel-cli: + kind: argument + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + /v1/projects/{id_or_name}/avatar: + post: + description: Upload an image as the avatar of the project identified by `idOrName`. The request body is the raw bytes of a JPG, PNG, or SVG image; the `Content-Type` header must declare which. SVG payloads are sanitized and optimized server-side before storage. The final SHA-1 of the stored bytes becomes the project's `avatar` value. The actual upload pipeline (validation, sanitization, S3 write, conditional `updateProject`, and event emission) lives in the shared `@api/project-avatar-upload` helper so it can be reused by background workers. + operationId: uploadProjectAvatar + security: + - bearerToken: [] + summary: Upload a project avatar + tags: + - projects + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + accountId: + type: string + creator: + properties: type: type: string enum: - - promote - - rollback + - user + via: + nullable: true + oneOf: + - properties: + type: + type: string + enum: + - app + app: + properties: + id: + type: string + description: The internal ID of the Vercel App backing this principal. + clientId: + type: string + description: The protocol-facing OAuth client ID. This may differ from {@link id} when Client ID Metadata Documents (CIMD) are used. + required: + - id + type: object + required: + - app + - type + type: object + description: Set when a Vercel App or Integration acts on behalf of a {@link User}. Captures user-consented OAuth delegation that the ACL layer may inspect to evaluate scope restrictions. This is NOT for impersonation or token-exchange provenance — those live on `auth.token`, not on the principal. + - properties: + type: + type: string + enum: + - integration + integration: + properties: + integrationId: + type: string + configurationId: + type: string + required: + - configurationId + - integrationId + type: object + required: + - integration + - type + type: object + description: Set when a Vercel App or Integration acts on behalf of a {@link User}. Captures user-consented OAuth delegation that the ACL layer may inspect to evaluate scope restrictions. This is NOT for impersonation or token-exchange provenance — those live on `auth.token`, not on the principal. + user: + properties: + id: + type: string + required: + - id + type: object + app: + properties: + id: + type: string + description: The internal ID of the Vercel App backing this principal. + clientId: + type: string + description: The protocol-facing OAuth client ID. This may differ from {@link id} when Client ID Metadata Documents (CIMD) are used. + required: + - id + type: object + integration: + properties: + integrationId: + type: string + configurationId: + type: string + required: + - configurationId + - integrationId + type: object required: - - fromDeploymentId - - toDeploymentId - - jobStatus - - requestedAt - type + - user + - via + - app + - integration type: object - hasFloatingAliases: - type: boolean - protectionBypass: - additionalProperties: + alias: + items: properties: + configuredBy: + nullable: true + type: string + enum: + - A + - CNAME + - dns-01 + - http + - null + configuredChangedAt: + nullable: true + type: number createdAt: + nullable: true type: number - createdBy: + deployment: + nullable: true + properties: + id: + type: string + alias: + items: + type: string + type: array + aliasAssigned: + nullable: true + oneOf: + - type: number + - type: boolean + enum: + - false + - true + aliasError: + nullable: true + properties: + code: + type: string + message: + type: string + required: + - code + - message + type: object + aliasFinal: + nullable: true + type: string + automaticAliases: + items: + type: string + type: array + branchMatcher: + properties: + type: + type: string + enum: + - endsWith + - equals + - startsWith + description: The type of matching to perform + pattern: + type: string + description: The pattern to match against branch names + required: + - pattern + - type + type: object + buildingAt: + type: number + builds: + items: + properties: + use: + type: string + src: + type: string + dest: + type: string + required: + - use + type: object + type: array + checksConclusion: + type: string + enum: + - canceled + - failed + - skipped + - succeeded + checksState: + type: string + enum: + - completed + - registered + - running + connectBuildsEnabled: + type: boolean + enum: + - false + - true + connectConfigurationId: + type: string + createdAt: + type: number + createdIn: + type: string + creator: + nullable: true + properties: + email: + type: string + githubLogin: + type: string + gitlabLogin: + type: string + uid: + type: string + username: + type: string + required: + - email + - uid + - username + type: object + deletedAt: + type: number + deploymentHostname: + type: string + forced: + type: boolean + enum: + - false + - true + name: + type: string + meta: + additionalProperties: + type: string + type: object + monorepoManager: + nullable: true + type: string + oidcTokenClaims: + properties: + iss: + type: string + sub: + type: string + scope: + type: string + aud: + type: string + owner: + type: string + owner_id: + type: string + project: + type: string + project_id: + type: string + environment: + type: string + custom_environment_id: + type: string + mfe_group_ids: + items: + type: string + type: array + plan: + type: string + required: + - aud + - environment + - iss + - owner + - owner_id + - project + - project_id + - scope + - sub + type: object + plan: + type: string + enum: + - enterprise + - hobby + - pro + previewCommentsEnabled: + type: boolean + enum: + - false + - true + description: Whether or not preview comments are enabled for the deployment + example: false + private: + type: boolean + enum: + - false + - true + readyAt: + type: number + readyState: + type: string + enum: + - BLOCKED + - BUILDING + - CANCELED + - ERROR + - INITIALIZING + - QUEUED + - READY + readySubstate: + type: string + enum: + - PROMOTED + - ROLLING + - STAGED + requestedAt: + type: number + target: + nullable: true + type: string + teamId: + nullable: true + type: string + type: + type: string + enum: + - LAMBDAS + url: + type: string + userId: + type: string + description: Present for user creators; omitted for app/integration/system creators. + withCache: + type: boolean + enum: + - false + - true + required: + - createdAt + - createdIn + - creator + - deploymentHostname + - id + - name + - plan + - private + - readyState + - type + - url + type: object + domain: + type: string + environment: + type: string + enum: + - preview + - production + gitBranch: + nullable: true + type: string + redirect: + nullable: true type: string - scope: + redirectStatusCode: + nullable: true + type: number + enum: + - 301 + - 302 + - 307 + - 308 + - null + target: type: string enum: - - automation-bypass + - PREVIEW + - PRODUCTION + - STAGING required: - - createdAt - - createdBy - - scope + - deployment + - domain + - environment + - target type: object - type: object - hasActiveBranches: - type: boolean - trustedIps: - nullable: true - oneOf: - - properties: - deploymentType: - type: string - enum: - - all - - preview - - prod_deployment_urls_and_all_previews - - production - addresses: - items: - properties: - value: - type: string - note: - type: string - required: - - value - type: object - type: array - protectionMode: - type: string - enum: - - additional - - exclusive - required: - - deploymentType - - addresses - - protectionMode - type: object - - properties: - deploymentType: - type: string - enum: - - all - - preview - - prod_deployment_urls_and_all_previews - - production - required: - - deploymentType - type: object - gitComments: - properties: - onPullRequest: - type: boolean - description: Whether the Vercel bot should comment on PRs - onCommit: - type: boolean - description: Whether the Vercel bot should comment on commits - required: - - onPullRequest - - onCommit - type: object - paused: - type: boolean - required: - - accountId - - directoryListing - - id - - name - - nodeVersion - type: object - '400': - description: One of the provided values in the request query is invalid. - '401': - description: '' - '403': - description: You do not have permission to access this resource. - parameters: - - name: idOrName - description: The unique project identifier or the project name - in: path - required: true - schema: - description: The unique project identifier or the project name - oneOf: - - type: string - - type: boolean - - description: The Team identifier or slug to perform the request on behalf of. - in: query - name: teamId - required: true - schema: - type: string - patch: - description: Update the fields of a project using either its `name` or `id`. - operationId: updateProject - security: - - bearerToken: [] - summary: Update an existing project - tags: - - projects - responses: - '200': - description: The project was successfully updated - content: - application/json: - schema: - properties: - accountId: - type: string + type: array analytics: properties: id: @@ -6907,15 +20445,48 @@ paths: nullable: true type: number required: - - id - - canceledAt - disabledAt - enabledAt + - id + type: object + appliedCve55182Migration: + type: boolean + enum: + - false + - true + speedInsights: + properties: + id: + type: string + enabledAt: + type: number + disabledAt: + type: number + canceledAt: + type: number + hasData: + type: boolean + enum: + - false + - true + dataReceivedAt: + type: number + description: When the first free (not Speed Insights Plus) production data point was observed, in ms. Set once by subscriber-analytics-events; projects that already had data before this field shipped get it backfilled on their next batch, so it reads "first free data point observed", not necessarily "first ever". + paidAt: + type: number + required: + - id type: object autoExposeSystemEnvs: type: boolean + enum: + - false + - true autoAssignCustomDomains: type: boolean + enum: + - false + - true autoAssignCustomDomainsUpdatedBy: type: string buildCommand: @@ -6924,15 +20495,73 @@ paths: commandForIgnoringBuildStep: nullable: true type: string + connectConfigurations: + nullable: true + items: + properties: + envId: + oneOf: + - type: string + - type: string + enum: + - preview + - production + connectConfigurationId: + type: string + dc: + type: string + passive: + type: boolean + enum: + - false + - true + buildsEnabled: + type: boolean + enum: + - false + - true + aws: + properties: + subnetIds: + items: + type: string + type: array + securityGroupId: + type: string + required: + - subnetIds + type: object + createdAt: + type: number + updatedAt: + type: number + required: + - buildsEnabled + - connectConfigurationId + - createdAt + - envId + - passive + - updatedAt + type: object + type: array connectConfigurationId: nullable: true type: string connectBuildsEnabled: type: boolean + enum: + - false + - true + passiveConnectConfigurationId: + nullable: true + type: string createdAt: type: number customerSupportCodeVisibility: type: boolean + enum: + - false + - true crons: properties: enabledAt: @@ -6963,6 +20592,20 @@ paths: type: string description: The cron expression. example: 0 0 * * * + source: + type: string + enum: + - api + description: The origin of this definition. 'api' means created via the API. Undefined means it originated from a deployment (vercel.json). + description: + type: string + description: A human-readable description of what this cron job does. + hostInferred: + type: boolean + enum: + - false + - true + description: Whether the host was inferred from the production deployment URL rather than explicitly provided. required: - host - path @@ -6970,29 +20613,73 @@ paths: type: object type: array required: - - enabledAt + - definitions + - deploymentId - disabledAt + - enabledAt - updatedAt - - deploymentId - - definitions type: object dataCache: properties: userDisabled: type: boolean + enum: + - false + - true storageSizeBytes: nullable: true type: number unlimited: type: boolean + enum: + - false + - true required: - userDisabled type: object + deploymentExpiration: + properties: + expirationDays: + type: number + description: Number of days to keep non-production deployments (mostly preview deployments) before soft deletion. + expirationDaysProduction: + type: number + description: Number of days to keep production deployments before soft deletion. + expirationDaysCanceled: + type: number + description: Number of days to keep canceled deployments before soft deletion. + expirationDaysErrored: + type: number + description: Number of days to keep errored deployments before soft deletion. + deploymentsToKeep: + type: number + description: Minimum number of production deployments to keep for this project, even if they are over the production expiration limit. + type: object + description: Retention policies for deployments. These are enforced at the project level, but we also maintain an instance of this at the team level as a default policy that gets applied to new projects. + expiration: + properties: + expiresAt: + type: number + description: Unix ms timestamp when the project is scheduled to expire. + lockedAt: + type: number + description: Unix ms timestamp when the project was locked. + lockedBy: + type: string + description: userId of the actor that triggered the lock (system or admin). + required: + - expiresAt + - lockedAt + - lockedBy + type: object devCommand: nullable: true type: string directoryListing: type: boolean + enum: + - false + - true installCommand: nullable: true type: string @@ -7004,33 +20691,46 @@ paths: - items: type: string enum: - - production - - preview - development - - preview - development + - preview + - preview + - production type: array - type: string enum: - - production - - preview - development - - preview - development + - preview + - preview + - production type: type: string enum: - - secret - - system - encrypted - plain + - secret - sensitive - id: + - system + sunsetSecretId: type: string - key: + description: This is used to identify variables that have been migrated from type secret to sensitive. + legacyValue: type: string + description: Legacy now-encryption ciphertext, present after migration swaps value/vsmValue + decrypted: + type: boolean + enum: + - false + - true value: type: string + vsmValue: + type: string + id: + type: string + key: + type: string configurationId: nullable: true type: string @@ -7046,6 +20746,12 @@ paths: type: string gitBranch: type: string + visibility: + type: string + enum: + - config + - secret + description: User-facing config/secret model. When set, authoritative for new code paths when the env-var-config-secret-ui flag is enabled. Legacy rows omit this field; legacy rows omit it and callers fall back to existing `type` behavior. edgeConfigId: nullable: true type: string @@ -7059,56 +20765,78 @@ paths: type: type: string enum: - - redis-url + - redis-url + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - redis-rest-api-url + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - redis-rest-api-token storeId: type: string required: - - type - storeId + - type type: object - properties: type: type: string enum: - - redis-rest-api-url + - redis-rest-api-read-only-token storeId: type: string required: - - type - storeId + - type type: object - properties: type: type: string enum: - - redis-rest-api-token + - blob-read-write-token storeId: type: string required: - - type - storeId + - type type: object - properties: type: type: string enum: - - redis-rest-api-read-only-token + - blob-store-id storeId: type: string required: - - type - storeId + - type type: object - properties: type: type: string enum: - - blob-read-write-token + - blob-webhook-public-key storeId: type: string required: - - type - storeId + - type type: object - properties: type: @@ -7118,8 +20846,8 @@ paths: storeId: type: string required: - - type - storeId + - type type: object - properties: type: @@ -7129,8 +20857,8 @@ paths: storeId: type: string required: - - type - storeId + - type type: object - properties: type: @@ -7140,8 +20868,8 @@ paths: storeId: type: string required: - - type - storeId + - type type: object - properties: type: @@ -7151,8 +20879,8 @@ paths: storeId: type: string required: - - type - storeId + - type type: object - properties: type: @@ -7162,8 +20890,8 @@ paths: storeId: type: string required: - - type - storeId + - type type: object - properties: type: @@ -7173,8 +20901,8 @@ paths: storeId: type: string required: - - type - storeId + - type type: object - properties: type: @@ -7184,73 +20912,441 @@ paths: storeId: type: string required: + - storeId - type + type: object + - properties: + type: + type: string + enum: + - postgres-url-no-ssl + storeId: + type: string + required: - storeId + - type type: object - decrypted: - type: boolean - description: Whether `value` is decrypted. + - properties: + type: + type: string + enum: + - integration-store-secret + storeId: + type: string + integrationId: + type: string + integrationProductId: + type: string + integrationConfigurationId: + type: string + required: + - integrationConfigurationId + - integrationId + - integrationProductId + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - flags-connection-string + projectId: + type: string + required: + - projectId + - type + type: object + internalContentHint: + nullable: true + properties: + type: + type: string + enum: + - flags-secret + encryptedValue: + type: string + description: Contains the `value` of the env variable, encrypted with a special key to make decryption possible in the subscriber Lambda. + required: + - encryptedValue + - type + type: object + description: Similar to `contentHints`, but should not be exposed to the user. + comment: + type: string + customEnvironmentIds: + items: + type: string + type: array required: - - type - key + - type - value type: object type: array + customEnvironments: + items: + properties: + id: + type: string + description: 'Unique identifier for the custom environment (format: env_*)' + slug: + type: string + description: URL-friendly name of the environment + type: + type: string + enum: + - development + - preview + - production + description: The type of environment (production, preview, or development) + description: + type: string + description: Optional description of the environment's purpose + branchMatcher: + properties: + type: + type: string + enum: + - endsWith + - equals + - startsWith + description: The type of matching to perform + pattern: + type: string + description: The pattern to match against branch names + required: + - pattern + - type + type: object + description: Configuration for matching git branches to this environment + domains: + items: + properties: + name: + type: string + apexName: + type: string + projectId: + type: string + redirect: + nullable: true + type: string + redirectStatusCode: + nullable: true + type: number + enum: + - 301 + - 302 + - 307 + - 308 + - null + gitBranch: + nullable: true + type: string + customEnvironmentId: + nullable: true + type: string + updatedAt: + type: number + createdAt: + type: number + verified: + type: boolean + enum: + - false + - true + description: '`true` if the domain is verified for use with the project. If `false` it will not be used as an alias on this project until the challenge in `verification` is completed.' + verification: + items: + properties: + type: + type: string + domain: + type: string + value: + type: string + reason: + type: string + required: + - domain + - reason + - type + - value + type: object + description: 'A list of verification challenges, one of which must be completed to verify the domain for use on the project. After the challenge is complete `POST /projects/:idOrName/domains/:domain/verify` to verify the domain. Possible challenges: - If `verification.type = TXT` the `verification.domain` will be checked for a TXT record matching `verification.value`.' + type: array + description: 'A list of verification challenges, one of which must be completed to verify the domain for use on the project. After the challenge is complete `POST /projects/:idOrName/domains/:domain/verify` to verify the domain. Possible challenges: - If `verification.type = TXT` the `verification.domain` will be checked for a TXT record matching `verification.value`.' + required: + - apexName + - name + - projectId + - verified + type: object + description: List of domains associated with this environment + type: array + description: List of domains associated with this environment + currentDeploymentAliases: + items: + type: string + type: array + description: List of aliases for the current deployment + createdAt: + type: number + description: Timestamp when the environment was created + updatedAt: + type: number + description: Timestamp when the environment was last updated + required: + - createdAt + - id + - slug + - type + - updatedAt + type: object + description: Internal representation of a custom environment with all required properties + type: array framework: nullable: true type: string enum: - - blitzjs - - nextjs - - gatsby - - remix + - actix-web + - angular + - ash - astro - - hexo - - eleventy - - docusaurus-2 + - axum + - blitzjs + - brunch + - bun + - container + - create-react-app + - django - docusaurus - - preact - - solidstart + - docusaurus-2 - dojo + - eleventy + - elysia - ember - - vue - - scully + - eve + - express + - factory-eve + - fastapi + - fasthtml + - fastify + - flask + - gatsby + - go + - gridsome + - h3 + - hexo + - hono + - hugo + - hydrogen - ionic-angular - - angular + - ionic-react + - jekyll + - koa + - mastra + - middleman + - nestjs + - nextjs + - nitro + - node + - nuxtjs + - parcel - polymer + - preact + - python + - react-router + - redwoodjs + - remix + - ruby + - rust + - saber + - sanity + - sanity-v2 + - sapper + - scully + - services + - solidstart + - solidstart-1 + - stencil + - storybook - svelte - sveltekit - sveltekit-1 - - ionic-react - - create-react-app - - gridsome + - tanstack-start + - tanstack-start-lovable - umijs - - sapper - - saber - - stencil - - nuxtjs - - redwoodjs - - hugo - - jekyll - - brunch - - middleman - - zola - - hydrogen - vite - vitepress + - vue - vuepress - - parcel - - sanity - - storybook + - xmcp + - zola + - null + services: + items: + properties: + serviceName: + type: string + description: Service name from the deployment (Service.name). + serviceType: + type: string + enum: + - cron + - job + - web + - worker + description: Service kind (Service.type). Omitted for schemas that do not define one. + framework: + type: string + enum: + - actix-web + - angular + - ash + - astro + - axum + - blitzjs + - brunch + - bun + - container + - create-react-app + - django + - docusaurus + - docusaurus-2 + - dojo + - eleventy + - elysia + - ember + - eve + - express + - factory-eve + - fastapi + - fasthtml + - fastify + - flask + - gatsby + - go + - gridsome + - h3 + - hexo + - hono + - hugo + - hydrogen + - ionic-angular + - ionic-react + - jekyll + - koa + - mastra + - middleman + - nestjs + - nextjs + - nitro + - node + - nuxtjs + - parcel + - polymer + - preact + - python + - react-router + - redwoodjs + - remix + - ruby + - rust + - saber + - sanity + - sanity-v2 + - sapper + - scully + - services + - solidstart + - solidstart-1 + - stencil + - storybook + - svelte + - sveltekit + - sveltekit-1 + - tanstack-start + - tanstack-start-lovable + - umijs + - vite + - vitepress + - vue + - vuepress + - xmcp + - zola + description: Framework slug, when the service has one (omitted otherwise). + runtime: + type: string + description: Generic runtime, e.g. 'node' | 'python' | 'go' | 'ruby' | 'rust' (Service.runtime). Omitted for static builds. + required: + - serviceName + type: object + type: array gitForkProtection: type: boolean + enum: + - false + - true gitLFS: type: boolean + enum: + - false + - true id: type: string + ipBuckets: + items: + properties: + bucket: + type: string + default: + type: boolean + enum: + - false + - true + supportUntil: + type: number + required: + - bucket + type: object + type: array + jobs: + properties: + lint: + properties: + targets: + items: + type: string + type: array + required: + - targets + type: object + typecheck: + properties: + targets: + items: + type: string + type: array + required: + - targets + type: object + mfe-config-present: + properties: + targets: + items: + type: string + type: array + required: + - targets + type: object + type: object latestDeployments: items: properties: + id: + type: string alias: items: type: string @@ -7260,6 +21356,9 @@ paths: oneOf: - type: number - type: boolean + enum: + - false + - true aliasError: nullable: true properties: @@ -7278,6 +21377,24 @@ paths: items: type: string type: array + branchMatcher: + properties: + type: + type: string + enum: + - endsWith + - equals + - startsWith + description: The type of matching to perform + pattern: + type: string + description: The pattern to match against branch names + required: + - pattern + - type + type: object + buildingAt: + type: number builds: items: properties: @@ -7291,8 +21408,24 @@ paths: - use type: object type: array + checksConclusion: + type: string + enum: + - canceled + - failed + - skipped + - succeeded + checksState: + type: string + enum: + - completed + - registered + - running connectBuildsEnabled: type: boolean + enum: + - false + - true connectConfigurationId: type: string createdAt: @@ -7317,13 +21450,16 @@ paths: - uid - username type: object + deletedAt: + type: number deploymentHostname: type: string - name: - type: string forced: type: boolean - id: + enum: + - false + - true + name: type: string meta: additionalProperties: @@ -7332,29 +21468,81 @@ paths: monorepoManager: nullable: true type: string + oidcTokenClaims: + properties: + iss: + type: string + sub: + type: string + scope: + type: string + aud: + type: string + owner: + type: string + owner_id: + type: string + project: + type: string + project_id: + type: string + environment: + type: string + custom_environment_id: + type: string + mfe_group_ids: + items: + type: string + type: array + plan: + type: string + required: + - aud + - environment + - iss + - owner + - owner_id + - project + - project_id + - scope + - sub + type: object plan: type: string enum: - - pro - enterprise - hobby - - oss + - pro + previewCommentsEnabled: + type: boolean + enum: + - false + - true + description: Whether or not preview comments are enabled for the deployment + example: false private: type: boolean + enum: + - false + - true + readyAt: + type: number readyState: type: string enum: + - BLOCKED - BUILDING + - CANCELED - ERROR - INITIALIZING - QUEUED - READY - - CANCELED readySubstate: type: string enum: - - STAGED - PROMOTED + - ROLLING + - STAGED requestedAt: type: number target: @@ -7371,217 +21559,651 @@ paths: type: string userId: type: string + description: Present for user creators; omitted for app/integration/system creators. withCache: type: boolean - checksConclusion: - type: string - enum: - - succeeded - - failed - - skipped - - canceled - checksState: - type: string enum: - - registered - - running - - completed - readyAt: - type: number - buildingAt: - type: number - previewCommentsEnabled: - type: boolean - description: Whether or not preview comments are enabled for the deployment - example: false + - false + - true required: - createdAt - createdIn - creator - deploymentHostname - - name - id + - name - plan - private - readyState - type - url - - userId type: object type: array link: - oneOf: - - properties: - org: - type: string - repo: - type: string - repoId: - type: number - type: - type: string - enum: - - github - createdAt: - type: number - deployHooks: - items: - properties: - createdAt: - type: number - id: - type: string - name: - type: string - ref: - type: string - url: - type: string - required: - - id - - name - - ref - - url - type: object - type: array - gitCredentialId: - type: string - updatedAt: - type: number - sourceless: + properties: + org: + type: string + repoOwnerId: + type: number + description: A new field, should be included in all new project links, is being added just in time when a deployment is created. This is needed for Protected Git scopes. + repo: + type: string + repoId: + type: number + type: + type: string + enum: + - github + createdAt: + type: number + deployHooks: + items: + properties: + createdAt: + type: number + id: + type: string + name: + type: string + ref: + type: string + url: + type: string + required: + - id + - name + - ref + - url + type: object + type: array + gitCredentialId: + type: string + updatedAt: + type: number + sourceless: + type: boolean + enum: + - false + - true + productionBranch: + type: string + host: + type: string + projectId: + type: string + projectName: + type: string + projectNameWithNamespace: + type: string + projectNamespace: + type: string + projectOwnerId: + type: number + description: A new field, should be included in all new project links, is being added just in time when a deployment is created. This is needed for Protected Git scopes. This is the id of the top level group that a namespace belongs to. Gitlab supports group nesting (up to 20 levels). + projectUrl: + type: string + name: + type: string + slug: + type: string + owner: + type: string + uuid: + type: string + workspaceUuid: + type: string + ownerId: + type: string + description: Origin namespace id (`ns_…`) of the owner. + required: + - deployHooks + - gitCredentialId + - org + - productionBranch + - type + - host + - projectId + - projectName + - projectNameWithNamespace + - projectNamespace + - projectUrl + - name + - owner + - slug + - uuid + - workspaceUuid + - repo + - repoId + - ownerId + type: object + blobs: + properties: + isDefaultApp: + type: boolean + enum: + - false + - true + description: Marks the team-level, Vercel-managed default blob project (`vercel-blob-default-project`) that orphan blob stores are scoped to when connected without an explicit project. Set only by internal storage flows and immutable after creation — guards rely on it to protect the connected stores from being lost when the project is deleted or transferred. + type: object + microfrontends: + properties: + isDefaultApp: + type: boolean + enum: + - true + updatedAt: + type: number + description: Timestamp when the microfrontends settings were last updated. + groupIds: + type: array + items: + type: string + minItems: 1 + description: The group IDs of microfrontends that this project belongs to. Each microfrontend project must belong to a microfrontends group that is the set of microfrontends that are used together. + enabled: + type: boolean + enum: + - true + description: Whether microfrontends are enabled for this project. + defaultRoute: + type: string + description: A path that is used to take screenshots and as the default path in preview links when a domain for this microfrontend is shown in the UI. Includes the leading slash, e.g. `/docs` + freeProjectForLegacyLimits: + type: boolean + enum: + - false + - true + description: Whether the project was part of the legacy limits for hobby and pro-trial before billing was added. This field is only set when the team is upgraded to a paid plan and we are backfilling the subscription status. We cap the subscription to 2 projects and set this field for the 3rd project. When this field is set, the project is not charged for and we do not call any billing APIs for this project. + routeObservabilityToThisProject: + type: boolean + enum: + - false + - true + description: Whether observability data should be routed to this microfrontend project or a root project. + doNotRouteWithMicrofrontendsRouting: + type: boolean + enum: + - false + - true + description: Whether to add microfrontends routing to aliases. This means domains in this project will route as a microfrontend. + required: + - enabled + - groupIds + - isDefaultApp + - updatedAt + type: object + name: + type: string + nodeVersion: + type: string + enum: + - 10.x + - 12.x + - 14.x + - 16.x + - 18.x + - 20.x + - 22.x + - 24.x + - 8.10.x + optionsAllowlist: + nullable: true + properties: + paths: + items: + properties: + value: + type: string + required: + - value + type: object + type: array + required: + - paths + type: object + outputDirectory: + nullable: true + type: string + passwordProtection: + nullable: true + type: string + description: (opaque JSON object) + passport: + nullable: true + properties: + deploymentType: + type: string + enum: + - all + - all_except_custom_domains + - preview + - prod_deployment_urls_and_all_previews + connectorId: + type: string + required: + - connectorId + - deploymentType + type: object + protectionConfig: + properties: + sandboxUrls: + properties: + inheritDeploymentProtection: type: boolean - productionBranch: - type: string - required: - - deployHooks + enum: + - false + - true type: object - - properties: - projectId: - type: string - projectName: - type: string - projectNameWithNamespace: - type: string - projectNamespace: - type: string - projectUrl: - type: string - type: + type: object + sandbox: + properties: + region: + type: string + enum: + - arn1 + - bom1 + - cdg1 + - cle1 + - cpt1 + - dub1 + - fra1 + - gru1 + - hkg1 + - hnd1 + - iad1 + - icn1 + - kix1 + - lhr1 + - pdx1 + - sfo1 + - sin1 + - syd1 + - yul1 + failoverRegions: + items: + type: string + enum: + - arn1 + - bom1 + - cdg1 + - cle1 + - cpt1 + - dub1 + - fra1 + - gru1 + - hkg1 + - hnd1 + - iad1 + - icn1 + - kix1 + - lhr1 + - pdx1 + - sfo1 + - sin1 + - syd1 + - yul1 + type: array + type: object + productionDeploymentsFastLane: + type: boolean + enum: + - false + - true + resourceConfig: + properties: + elasticConcurrencyEnabled: + type: boolean + enum: + - false + - true + fluid: + type: boolean + enum: + - false + - true + functionDefaultRegions: + items: + type: string + type: array + functionDefaultTimeout: + type: number + functionDefaultMemoryType: + type: string + enum: + - performance + - performance_xl + - standard + - standard_legacy + functionZeroConfigFailover: + type: boolean + enum: + - false + - true + buildMachineType: + type: string + enum: + - basic + - enhanced + - standard + - turbo + buildMachineSelection: + type: string + enum: + - elastic + - fixed + buildMachineElasticLastUpdated: + type: number + buildMachineElasticReason: + type: string + enum: + - basic-floor + - build-timeout-failure + - enospc-failure + - enterprise-floor + - high-peak-disk + - high-peak-memory + - long-build-duration + - oom-failure + - short-build-duration + - sustained-high-cpu + isNSNBDisabled: + type: boolean + enum: + - false + - true + buildQueue: + properties: + configuration: type: string enum: - - gitlab - createdAt: - type: number - deployHooks: + - SKIP_NAMESPACE_QUEUE + - WAIT_FOR_NAMESPACE_QUEUE + type: object + enableFunctionsBeta: + type: boolean + enum: + - false + - true + type: object + required: + - functionDefaultRegions + rollbackDescription: + properties: + userId: + type: string + description: The user who rolled back the project. + username: + type: string + description: The username of the user who rolled back the project. + description: + type: string + description: User-supplied explanation of why they rolled back the project. Limited to 250 characters. + createdAt: + type: number + description: Timestamp of when the rollback was requested. + required: + - createdAt + - description + - userId + - username + type: object + description: Description of why a project was rolled back, and by whom. Note that lastAliasRequest contains the from/to details of the rollback. + rollingRelease: + nullable: true + properties: + target: + type: string + description: The environment that the release targets, currently only supports production. Adding in case we want to configure with alias groups or custom environments. + example: production + stages: + nullable: true + items: + properties: + targetPercentage: + type: number + description: The percentage of traffic to serve to the canary deployment (0-100) + example: 25 + requireApproval: + type: boolean + enum: + - false + - true + description: Whether or not this stage requires manual approval to proceed + example: false + duration: + type: number + description: Duration in minutes for automatic advancement to the next stage + example: 600 + linearShift: + type: boolean + enum: + - false + - true + description: Whether to linearly shift traffic over the duration of this stage + example: false + required: + - targetPercentage + type: object + description: 'An array of all the stages required during a deployment release. Each stage defines a target percentage and advancement rules. The final stage must always have targetPercentage: 100.' + type: array + description: 'An array of all the stages required during a deployment release. Each stage defines a target percentage and advancement rules. The final stage must always have targetPercentage: 100.' + canaryResponseHeader: + type: boolean + enum: + - false + - true + description: Whether the request served by a canary deployment should return a header indicating a canary was served. Defaults to `false` when omitted. + example: false + gate: + properties: + enabled: + type: boolean + enum: + - false + - true + description: Whether automated gating is enabled for this project's rollouts. + checks: items: properties: - createdAt: - type: number - id: - type: string - name: - type: string - ref: - type: string - url: + type: type: string + enum: + - error-rate-5xx + description: The metric this check evaluates. + minSampleSize: + type: number + description: Minimum number of requests required in the window before the check can fail. Below this, the check is inconclusive rather than failing, so low-traffic stages don't gate on noise. Defaults to `100` when omitted. + example: 100 + excludeStatusCodes: + items: + type: number + type: array + description: Response status codes to ignore entirely — dropped from both the numerator (errors) and the denominator (total requests). Defaults to `[]` when omitted. + example: + - 503 + excludePaths: + items: + type: string + type: array + description: Request paths to ignore entirely — dropped from both the numerator (errors) and the denominator (total requests). Matched exactly against the request path with any query string removed; no prefix or glob matching. Defaults to `[]` when omitted. + example: + - /api/health + ingestWatermarkSeconds: + type: number + description: 'Seconds of ingest lag to allow for: the query''s upper bound is `now() - this value`, so the check never reads a window that is still filling. Defaults to `30` when omitted.' + example: 30 required: - - id - - name - - ref - - url + - type type: object + description: The checks to evaluate. An empty array means nothing is evaluated. type: array - gitCredentialId: - type: string - updatedAt: + description: The checks to evaluate. An empty array means nothing is evaluated. + failureThreshold: type: number - sourceless: - type: boolean - productionBranch: + description: How many failing evaluations within {@link windowSize} trip the gate. Defaults to `3` when omitted. + example: 3 + windowSize: + type: number + description: How many of the most recent evaluations {@link failureThreshold} is counted against. Defaults to `5` when omitted. + example: 5 + action: type: string + enum: + - pause + - rollback + description: 'What to do when the gate trips: pause the rollout, or roll it back.' + dryRun: + type: boolean + enum: + - false + - true + description: When true, a tripped gate is only reported — {@link action} is not taken. required: - - deployHooks + - action + - checks + - dryRun + - enabled type: object - - properties: - name: - type: string - slug: - type: string - owner: - type: string - type: + description: 'Automated gating configuration. Omitted (the default) means no gating is configured, which is equivalent to `enabled: false`.' + required: + - target + type: object + description: Project-level rolling release configuration that defines how deployments should be gradually rolled out + defaultResourceConfig: + properties: + elasticConcurrencyEnabled: + type: boolean + enum: + - false + - true + fluid: + type: boolean + enum: + - false + - true + functionDefaultRegions: + items: + type: string + type: array + functionDefaultTimeout: + type: number + functionDefaultMemoryType: + type: string + enum: + - performance + - performance_xl + - standard + - standard_legacy + functionZeroConfigFailover: + type: boolean + enum: + - false + - true + buildMachineType: + type: string + enum: + - basic + - enhanced + - standard + - turbo + buildMachineSelection: + type: string + enum: + - elastic + - fixed + buildMachineElasticLastUpdated: + type: number + buildMachineElasticReason: + type: string + enum: + - basic-floor + - build-timeout-failure + - enospc-failure + - enterprise-floor + - high-peak-disk + - high-peak-memory + - long-build-duration + - oom-failure + - short-build-duration + - sustained-high-cpu + isNSNBDisabled: + type: boolean + enum: + - false + - true + buildQueue: + properties: + configuration: type: string enum: - - bitbucket - uuid: - type: string - workspaceUuid: - type: string - createdAt: - type: number - deployHooks: - items: - properties: - createdAt: - type: number - id: - type: string - name: - type: string - ref: - type: string - url: - type: string - required: - - id - - name - - ref - - url - type: object - type: array - gitCredentialId: - type: string - updatedAt: - type: number - sourceless: - type: boolean - productionBranch: - type: string - required: - - deployHooks + - SKIP_NAMESPACE_QUEUE + - WAIT_FOR_NAMESPACE_QUEUE type: object - name: - type: string - nodeVersion: - type: string - enum: - - 18.x - - 16.x - - 14.x - - 12.x - - 10.x - outputDirectory: - nullable: true - type: string - passwordProtection: - nullable: true + enableFunctionsBeta: + type: boolean + enum: + - false + - true type: object - productionDeploymentsFastLane: - type: boolean - publicSource: - nullable: true - type: boolean + required: + - functionDefaultRegions rootDirectory: nullable: true type: string - serverlessFunctionRegion: - nullable: true - type: string + serverlessFunctionZeroConfigFailover: + type: boolean + enum: + - false + - true + skewProtectionBoundaryAt: + type: number + skewProtectionMaxAge: + type: number + skewProtectionAllowedDomains: + items: + type: string + type: array skipGitConnectDuringLink: type: boolean + enum: + - false + - true + staticIps: + properties: + builds: + type: boolean + enum: + - false + - true + enabled: + type: boolean + enum: + - false + - true + regions: + items: + type: string + type: array + required: + - builds + - enabled + - regions + type: object sourceFilesOutsideRootDirectory: type: boolean + enum: + - false + - true + enableAffectedProjectsDeployments: + type: boolean + enum: + - false + - true + enableExternalRewriteCaching: + type: boolean + enum: + - false + - true ssoProtection: nullable: true properties: @@ -7589,8 +22211,27 @@ paths: type: string enum: - all + - all_except_custom_domains + - preview + - prod_deployment_urls_and_all_previews + cve55182MigrationAppliedFrom: + nullable: true + type: string + enum: + - all + - all_except_custom_domains + - preview + - prod_deployment_urls_and_all_previews + - null + april2026SecurityIncidentMigrationAppliedFrom: + nullable: true + type: string + enum: + - all + - all_except_custom_domains - preview - prod_deployment_urls_and_all_previews + - null required: - deploymentType type: object @@ -7598,6 +22239,8 @@ paths: additionalProperties: nullable: true properties: + id: + type: string alias: items: type: string @@ -7607,6 +22250,9 @@ paths: oneOf: - type: number - type: boolean + enum: + - false + - true aliasError: nullable: true properties: @@ -7625,6 +22271,24 @@ paths: items: type: string type: array + branchMatcher: + properties: + type: + type: string + enum: + - endsWith + - equals + - startsWith + description: The type of matching to perform + pattern: + type: string + description: The pattern to match against branch names + required: + - pattern + - type + type: object + buildingAt: + type: number builds: items: properties: @@ -7638,8 +22302,24 @@ paths: - use type: object type: array + checksConclusion: + type: string + enum: + - canceled + - failed + - skipped + - succeeded + checksState: + type: string + enum: + - completed + - registered + - running connectBuildsEnabled: type: boolean + enum: + - false + - true connectConfigurationId: type: string createdAt: @@ -7664,13 +22344,16 @@ paths: - uid - username type: object - deploymentHostname: - type: string - name: + deletedAt: + type: number + deploymentHostname: type: string forced: type: boolean - id: + enum: + - false + - true + name: type: string meta: additionalProperties: @@ -7679,29 +22362,81 @@ paths: monorepoManager: nullable: true type: string + oidcTokenClaims: + properties: + iss: + type: string + sub: + type: string + scope: + type: string + aud: + type: string + owner: + type: string + owner_id: + type: string + project: + type: string + project_id: + type: string + environment: + type: string + custom_environment_id: + type: string + mfe_group_ids: + items: + type: string + type: array + plan: + type: string + required: + - aud + - environment + - iss + - owner + - owner_id + - project + - project_id + - scope + - sub + type: object plan: type: string enum: - - pro - enterprise - hobby - - oss + - pro + previewCommentsEnabled: + type: boolean + enum: + - false + - true + description: Whether or not preview comments are enabled for the deployment + example: false private: type: boolean + enum: + - false + - true + readyAt: + type: number readyState: type: string enum: + - BLOCKED - BUILDING + - CANCELED - ERROR - INITIALIZING - QUEUED - READY - - CANCELED readySubstate: type: string enum: - - STAGED - PROMOTED + - ROLLING + - STAGED requestedAt: type: number target: @@ -7718,42 +22453,24 @@ paths: type: string userId: type: string + description: Present for user creators; omitted for app/integration/system creators. withCache: type: boolean - checksConclusion: - type: string - enum: - - succeeded - - failed - - skipped - - canceled - checksState: - type: string enum: - - registered - - running - - completed - readyAt: - type: number - buildingAt: - type: number - previewCommentsEnabled: - type: boolean - description: Whether or not preview comments are enabled for the deployment - example: false + - false + - true required: - createdAt - createdIn - creator - deploymentHostname - - name - id + - name - plan - private - readyState - type - url - - userId type: object type: object transferCompletedAt: @@ -7768,128 +22485,682 @@ paths: type: number live: type: boolean + enum: + - false + - true enablePreviewFeedback: nullable: true type: boolean + enum: + - false + - true + - null + enableProductionFeedback: + nullable: true + type: boolean + enum: + - false + - true + - null permissions: properties: + oauth2Connection: + items: + $ref: '#/components/schemas/ACLAction' + type: array + user: + items: + $ref: '#/components/schemas/ACLAction' + type: array + userConnection: + items: + $ref: '#/components/schemas/ACLAction' + type: array + userMfaConfiguration: + items: + $ref: '#/components/schemas/ACLAction' + type: array + userPreference: + items: + $ref: '#/components/schemas/ACLAction' + type: array + userSudo: + items: + $ref: '#/components/schemas/ACLAction' + type: array + webAuthn: + items: + $ref: '#/components/schemas/ACLAction' + type: array + accessGroup: + items: + $ref: '#/components/schemas/ACLAction' + type: array + agent: + items: + $ref: '#/components/schemas/ACLAction' + type: array + aiGatewayApiKey: + items: + $ref: '#/components/schemas/ACLAction' + type: array + aiGatewayApiKeyBypassAll: + items: + $ref: '#/components/schemas/ACLAction' + type: array + aiGatewayApiKeyOwnedBySelf: + items: + $ref: '#/components/schemas/ACLAction' + type: array + aiGatewayApiKeySpendAttribution: + items: + $ref: '#/components/schemas/ACLAction' + type: array + aiGatewayApiKeyZdrExemption: + items: + $ref: '#/components/schemas/ACLAction' + type: array + aiGatewayBudget: + items: + $ref: '#/components/schemas/ACLAction' + type: array + aiGatewayCredits: + items: + $ref: '#/components/schemas/ACLAction' + type: array + aiGatewayPrivateModels: + items: + $ref: '#/components/schemas/ACLAction' + type: array + aiGatewayGuardrails: + items: + $ref: '#/components/schemas/ACLAction' + type: array + aiGatewayRules: + items: + $ref: '#/components/schemas/ACLAction' + type: array + aiGatewaySettings: + items: + $ref: '#/components/schemas/ACLAction' + type: array + aiGatewayTranscripts: + items: + $ref: '#/components/schemas/ACLAction' + type: array + aiGatewayTranscriptsSettings: + items: + $ref: '#/components/schemas/ACLAction' + type: array + aiGatewayUsage: + items: + $ref: '#/components/schemas/ACLAction' + type: array + aiGatewayVirtualModelConfigs: + items: + $ref: '#/components/schemas/ACLAction' + type: array + alerts: + items: + $ref: '#/components/schemas/ACLAction' + type: array + alertRules: + items: + $ref: '#/components/schemas/ACLAction' + type: array aliasGlobal: items: $ref: '#/components/schemas/ACLAction' type: array - analyticsSampling: + analyticsSampling: + items: + $ref: '#/components/schemas/ACLAction' + type: array + analyticsUsage: + items: + $ref: '#/components/schemas/ACLAction' + type: array + apiKey: + items: + $ref: '#/components/schemas/ACLAction' + type: array + apiKeyAiGateway: + items: + $ref: '#/components/schemas/ACLAction' + type: array + apiKeyOwnedBySelf: + items: + $ref: '#/components/schemas/ACLAction' + type: array + oauth2Application: + items: + $ref: '#/components/schemas/ACLAction' + type: array + vercelAppInstallation: + items: + $ref: '#/components/schemas/ACLAction' + type: array + vercelAppInstallationRequest: + items: + $ref: '#/components/schemas/ACLAction' + type: array + auditLog: + items: + $ref: '#/components/schemas/ACLAction' + type: array + automation: + items: + $ref: '#/components/schemas/ACLAction' + type: array + billingAddress: + items: + $ref: '#/components/schemas/ACLAction' + type: array + billingInformation: + items: + $ref: '#/components/schemas/ACLAction' + type: array + billingInvoice: + items: + $ref: '#/components/schemas/ACLAction' + type: array + billingInvoiceEmailRecipient: + items: + $ref: '#/components/schemas/ACLAction' + type: array + billingInvoiceLanguage: + items: + $ref: '#/components/schemas/ACLAction' + type: array + billingPlan: + items: + $ref: '#/components/schemas/ACLAction' + type: array + billingPurchaseOrder: + items: + $ref: '#/components/schemas/ACLAction' + type: array + billingRefund: + items: + $ref: '#/components/schemas/ACLAction' + type: array + billingTaxId: + items: + $ref: '#/components/schemas/ACLAction' + type: array + blob: + items: + $ref: '#/components/schemas/ACLAction' + type: array + blobStoreTokenSet: + items: + $ref: '#/components/schemas/ACLAction' + type: array + budget: + items: + $ref: '#/components/schemas/ACLAction' + type: array + cacheArtifact: + items: + $ref: '#/components/schemas/ACLAction' + type: array + cacheArtifactUsageEvent: + items: + $ref: '#/components/schemas/ACLAction' + type: array + codeChecks: + items: + $ref: '#/components/schemas/ACLAction' + type: array + codeOwners: + items: + $ref: '#/components/schemas/ACLAction' + type: array + ciInvocations: + items: + $ref: '#/components/schemas/ACLAction' + type: array + ciLogs: + items: + $ref: '#/components/schemas/ACLAction' + type: array + concurrentBuilds: + items: + $ref: '#/components/schemas/ACLAction' + type: array + connect: + items: + $ref: '#/components/schemas/ACLAction' + type: array + connectConfiguration: + items: + $ref: '#/components/schemas/ACLAction' + type: array + connectLogs: + items: + $ref: '#/components/schemas/ACLAction' + type: array + connexClient: + items: + $ref: '#/components/schemas/ACLAction' + type: array + connexClientProject: + items: + $ref: '#/components/schemas/ACLAction' + type: array + connexContact: + items: + $ref: '#/components/schemas/ACLAction' + type: array + connexInstallation: + items: + $ref: '#/components/schemas/ACLAction' + type: array + connexToken: + items: + $ref: '#/components/schemas/ACLAction' + type: array + buildMachineDefault: + items: + $ref: '#/components/schemas/ACLAction' + type: array + cursorOriginInstallation: + items: + $ref: '#/components/schemas/ACLAction' + type: array + dataCacheBillingSettings: + items: + $ref: '#/components/schemas/ACLAction' + type: array + defaultDeploymentProtection: + items: + $ref: '#/components/schemas/ACLAction' + type: array + deploymentPolicy: + items: + $ref: '#/components/schemas/ACLAction' + type: array + domain: + items: + $ref: '#/components/schemas/ACLAction' + type: array + domainAcceptDelegation: + items: + $ref: '#/components/schemas/ACLAction' + type: array + domainAuthCodes: + items: + $ref: '#/components/schemas/ACLAction' + type: array + domainCertificate: + items: + $ref: '#/components/schemas/ACLAction' + type: array + domainCheckConfig: + items: + $ref: '#/components/schemas/ACLAction' + type: array + domainMove: + items: + $ref: '#/components/schemas/ACLAction' + type: array + domainPurchase: + items: + $ref: '#/components/schemas/ACLAction' + type: array + domainRecord: + items: + $ref: '#/components/schemas/ACLAction' + type: array + domainTransferIn: + items: + $ref: '#/components/schemas/ACLAction' + type: array + drain: + items: + $ref: '#/components/schemas/ACLAction' + type: array + edgeConfig: + items: + $ref: '#/components/schemas/ACLAction' + type: array + edgeConfigItem: + items: + $ref: '#/components/schemas/ACLAction' + type: array + edgeConfigSchema: + items: + $ref: '#/components/schemas/ACLAction' + type: array + edgeConfigToken: + items: + $ref: '#/components/schemas/ACLAction' + type: array + endpointVerification: + items: + $ref: '#/components/schemas/ACLAction' + type: array + event: + items: + $ref: '#/components/schemas/ACLAction' + type: array + fileUpload: + items: + $ref: '#/components/schemas/ACLAction' + type: array + flagsExplorerSubscription: + items: + $ref: '#/components/schemas/ACLAction' + type: array + gitRepository: + items: + $ref: '#/components/schemas/ACLAction' + type: array + imageOptimizationNewPrice: + items: + $ref: '#/components/schemas/ACLAction' + type: array + integration: + items: + $ref: '#/components/schemas/ACLAction' + type: array + integrationAccount: + items: + $ref: '#/components/schemas/ACLAction' + type: array + integrationConfiguration: + items: + $ref: '#/components/schemas/ACLAction' + type: array + integrationConfigurationProjects: + items: + $ref: '#/components/schemas/ACLAction' + type: array + integrationConfigurationRole: + items: + $ref: '#/components/schemas/ACLAction' + type: array + integrationConfigurationTransfer: + items: + $ref: '#/components/schemas/ACLAction' + type: array + integrationDeploymentAction: + items: + $ref: '#/components/schemas/ACLAction' + type: array + integrationEvent: + items: + $ref: '#/components/schemas/ACLAction' + type: array + integrationLog: + items: + $ref: '#/components/schemas/ACLAction' + type: array + integrationResource: + items: + $ref: '#/components/schemas/ACLAction' + type: array + integrationResourceData: + items: + $ref: '#/components/schemas/ACLAction' + type: array + integrationResourceReplCommand: + items: + $ref: '#/components/schemas/ACLAction' + type: array + integrationResourceSecrets: + items: + $ref: '#/components/schemas/ACLAction' + type: array + integrationSSOSession: + items: + $ref: '#/components/schemas/ACLAction' + type: array + integrationStrict: + items: + $ref: '#/components/schemas/ACLAction' + type: array + integrationStoreTokenSet: + items: + $ref: '#/components/schemas/ACLAction' + type: array + integrationVercelConfigurationOverride: + items: + $ref: '#/components/schemas/ACLAction' + type: array + integrationPullRequest: + items: + $ref: '#/components/schemas/ACLAction' + type: array + ipBlocking: + items: + $ref: '#/components/schemas/ACLAction' + type: array + jobGlobal: + items: + $ref: '#/components/schemas/ACLAction' + type: array + kmsIssuer: + items: + $ref: '#/components/schemas/ACLAction' + type: array + kmsProjectGrant: + items: + $ref: '#/components/schemas/ACLAction' + type: array + logDrain: + items: + $ref: '#/components/schemas/ACLAction' + type: array + marketplaceBillingData: + items: + $ref: '#/components/schemas/ACLAction' + type: array + marketplaceExperimentationEdgeConfigData: + items: + $ref: '#/components/schemas/ACLAction' + type: array + marketplaceExperimentationItem: + items: + $ref: '#/components/schemas/ACLAction' + type: array + marketplaceFlexCommit: + items: + $ref: '#/components/schemas/ACLAction' + type: array + marketplaceInstallationMember: + items: + $ref: '#/components/schemas/ACLAction' + type: array + marketplaceInvoice: + items: + $ref: '#/components/schemas/ACLAction' + type: array + marketplaceSettings: + items: + $ref: '#/components/schemas/ACLAction' + type: array + Monitoring: + items: + $ref: '#/components/schemas/ACLAction' + type: array + monitoringAlert: + items: + $ref: '#/components/schemas/ACLAction' + type: array + monitoringChart: + items: + $ref: '#/components/schemas/ACLAction' + type: array + monitoringQuery: + items: + $ref: '#/components/schemas/ACLAction' + type: array + monitoringSettings: + items: + $ref: '#/components/schemas/ACLAction' + type: array + notificationCustomerBudget: + items: + $ref: '#/components/schemas/ACLAction' + type: array + notificationDeploymentFailed: + items: + $ref: '#/components/schemas/ACLAction' + type: array + notificationDomainConfiguration: + items: + $ref: '#/components/schemas/ACLAction' + type: array + notificationDomainExpire: + items: + $ref: '#/components/schemas/ACLAction' + type: array + notificationDomainMoved: + items: + $ref: '#/components/schemas/ACLAction' + type: array + notificationDomainPurchase: + items: + $ref: '#/components/schemas/ACLAction' + type: array + notificationDomainRenewal: + items: + $ref: '#/components/schemas/ACLAction' + type: array + notificationDomainTransfer: + items: + $ref: '#/components/schemas/ACLAction' + type: array + notificationDomainUnverified: items: $ref: '#/components/schemas/ACLAction' type: array - analyticsUsage: + NotificationMonitoringAlert: items: $ref: '#/components/schemas/ACLAction' type: array - auditLog: + notificationPaymentFailed: items: $ref: '#/components/schemas/ACLAction' type: array - billingAddress: + notificationPreferences: items: $ref: '#/components/schemas/ACLAction' type: array - billingInformation: + notificationStatementOfReasons: items: $ref: '#/components/schemas/ACLAction' type: array - billingInvoice: + notificationUsageAlert: items: $ref: '#/components/schemas/ACLAction' type: array - billingInvoiceEmailRecipient: + oidcFederationPolicy: items: $ref: '#/components/schemas/ACLAction' type: array - billingInvoiceLanguage: + observabilityConfiguration: items: $ref: '#/components/schemas/ACLAction' type: array - billingPlan: + observabilityFunnel: items: $ref: '#/components/schemas/ACLAction' type: array - billingPurchaseOrder: + observabilityNotebook: items: $ref: '#/components/schemas/ACLAction' type: array - billingTaxId: + openTelemetryEndpoint: items: $ref: '#/components/schemas/ACLAction' type: array - blob: + ownEvent: items: $ref: '#/components/schemas/ACLAction' type: array - budget: + organization: items: $ref: '#/components/schemas/ACLAction' type: array - cacheArtifact: + organizationDomain: items: $ref: '#/components/schemas/ACLAction' type: array - cacheArtifactUsageEvent: + organizationTeam: items: $ref: '#/components/schemas/ACLAction' type: array - concurrentBuilds: + passwordProtectionInvoiceItem: items: $ref: '#/components/schemas/ACLAction' type: array - connect: + paymentMethod: items: $ref: '#/components/schemas/ACLAction' type: array - connectConfiguration: + permissions: items: $ref: '#/components/schemas/ACLAction' type: array - domain: + postgres: items: $ref: '#/components/schemas/ACLAction' type: array - domainAcceptDelegation: + postgresStoreTokenSet: items: $ref: '#/components/schemas/ACLAction' type: array - domainAuthCodes: + previewDeploymentSuffix: items: $ref: '#/components/schemas/ACLAction' type: array - domainCertificate: + privateCloudAccount: items: $ref: '#/components/schemas/ACLAction' type: array - domainCheckConfig: + projectTransferIn: items: $ref: '#/components/schemas/ACLAction' type: array - domainMove: + projectTransferRequest: items: $ref: '#/components/schemas/ACLAction' type: array - domainPurchase: + proTrialOnboarding: items: $ref: '#/components/schemas/ACLAction' type: array - domainRecord: + rateLimit: items: $ref: '#/components/schemas/ACLAction' type: array - domainTransferIn: + redis: items: $ref: '#/components/schemas/ACLAction' type: array - event: + redisStoreTokenSet: items: $ref: '#/components/schemas/ACLAction' type: array - ownEvent: + remoteCaching: + items: + $ref: '#/components/schemas/ACLAction' + type: array + repository: + items: + $ref: '#/components/schemas/ACLAction' + type: array + samlConfig: + items: + $ref: '#/components/schemas/ACLAction' + type: array + secret: + items: + $ref: '#/components/schemas/ACLAction' + type: array + securityConfig: items: $ref: '#/components/schemas/ACLAction' type: array @@ -7897,1020 +23168,5632 @@ paths: items: $ref: '#/components/schemas/ACLAction' type: array - fileUpload: + sharedEnvVars: items: $ref: '#/components/schemas/ACLAction' type: array - gitRepository: + sharedEnvVarsProduction: items: $ref: '#/components/schemas/ACLAction' type: array - ipBlocking: + space: items: $ref: '#/components/schemas/ACLAction' type: array - integration: + spaceRun: items: $ref: '#/components/schemas/ACLAction' type: array - integrationConfiguration: + storeIsLocked: items: $ref: '#/components/schemas/ACLAction' type: array - integrationConfigurationTransfer: + storeTokenSetSensitive: items: $ref: '#/components/schemas/ACLAction' type: array - integrationConfigurationProjects: + storeTransfer: items: $ref: '#/components/schemas/ACLAction' type: array - integrationVercelConfigurationOverride: + supportCase: items: $ref: '#/components/schemas/ACLAction' type: array - jobGlobal: + supportCaseComment: items: $ref: '#/components/schemas/ACLAction' type: array - logDrain: + team: items: $ref: '#/components/schemas/ACLAction' type: array - Monitoring: + teamAccessRequest: items: $ref: '#/components/schemas/ACLAction' type: array - monitoringQuery: + teamFellowMembership: items: $ref: '#/components/schemas/ACLAction' type: array - monitoringChart: + teamGitExclusivity: items: $ref: '#/components/schemas/ACLAction' type: array - monitoringAlert: + teamInvite: items: $ref: '#/components/schemas/ACLAction' type: array - notificationDeploymentFailed: + teamInviteCode: items: $ref: '#/components/schemas/ACLAction' type: array - notificationDomainConfiguration: + teamInviteLink: items: $ref: '#/components/schemas/ACLAction' type: array - notificationDomainExpire: + teamJoin: items: $ref: '#/components/schemas/ACLAction' type: array - notificationDomainMoved: + teamMemberMfaStatus: items: $ref: '#/components/schemas/ACLAction' type: array - notificationDomainPurchase: + teamMicrofrontends: items: $ref: '#/components/schemas/ACLAction' type: array - notificationDomainRenewal: + teamOwnMembership: items: $ref: '#/components/schemas/ACLAction' type: array - notificationDomainTransfer: + teamOwnMembershipDisconnectSAML: items: $ref: '#/components/schemas/ACLAction' type: array - notificationDomainUnverified: + teamSudo: items: $ref: '#/components/schemas/ACLAction' type: array - NotificationMonitoringAlert: + teamTokenInvalidation: items: $ref: '#/components/schemas/ACLAction' type: array - notificationPaymentFailed: + token: items: $ref: '#/components/schemas/ACLAction' type: array - notificationUsageAlert: + toolbarComment: items: $ref: '#/components/schemas/ACLAction' type: array - notificationCustomerBudget: + usage: items: $ref: '#/components/schemas/ACLAction' type: array - openTelemetryEndpoint: + usageCycle: items: $ref: '#/components/schemas/ACLAction' type: array - paymentMethod: + vcrRepository: items: $ref: '#/components/schemas/ACLAction' type: array - permissions: + vpcPeeringConnection: items: $ref: '#/components/schemas/ACLAction' type: array - postgres: + webAnalyticsPlan: items: $ref: '#/components/schemas/ACLAction' type: array - previewDeploymentSuffix: + webhook: items: $ref: '#/components/schemas/ACLAction' type: array - proTrialOnboarding: + webhook-event: items: $ref: '#/components/schemas/ACLAction' type: array - seawallConfig: + aliasProject: items: $ref: '#/components/schemas/ACLAction' type: array - sharedEnvVars: + aliasProtectionBypass: items: $ref: '#/components/schemas/ACLAction' type: array - sharedEnvVarsProduction: + bulkRedirects: items: $ref: '#/components/schemas/ACLAction' type: array - space: + buildMachine: items: $ref: '#/components/schemas/ACLAction' type: array - spaceRun: + connectConfigurationLink: items: $ref: '#/components/schemas/ACLAction' type: array - passwordProtectionInvoiceItem: + dataCacheNamespace: items: $ref: '#/components/schemas/ACLAction' type: array - rateLimit: + deployment: items: $ref: '#/components/schemas/ACLAction' type: array - redis: + deploymentBuildLogs: items: $ref: '#/components/schemas/ACLAction' type: array - remoteCaching: + deploymentCheck: items: $ref: '#/components/schemas/ACLAction' type: array - samlConfig: + deploymentCheckPreview: items: $ref: '#/components/schemas/ACLAction' type: array - secret: + deploymentCheckReRunFromProductionBranch: items: $ref: '#/components/schemas/ACLAction' type: array - supportCase: + deploymentProductionGit: items: $ref: '#/components/schemas/ACLAction' type: array - supportCaseComment: + deploymentV0: items: $ref: '#/components/schemas/ACLAction' type: array - dataCacheBillingSettings: + deploymentPreview: items: $ref: '#/components/schemas/ACLAction' type: array - team: + deploymentPrivate: items: $ref: '#/components/schemas/ACLAction' type: array - teamAccessRequest: + deploymentPromote: items: $ref: '#/components/schemas/ACLAction' type: array - teamFellowMembership: + deploymentRollback: items: $ref: '#/components/schemas/ACLAction' type: array - teamInvite: + edgeCacheNamespace: items: $ref: '#/components/schemas/ACLAction' type: array - teamInviteCode: + environments: items: $ref: '#/components/schemas/ACLAction' type: array - teamJoin: + job: items: $ref: '#/components/schemas/ACLAction' type: array - teamOwnMembership: + logs: items: $ref: '#/components/schemas/ACLAction' type: array - teamOwnMembershipDisconnectSAML: + logsPreset: items: $ref: '#/components/schemas/ACLAction' type: array - token: + observabilityData: items: $ref: '#/components/schemas/ACLAction' type: array - usage: + onDemandBuild: items: $ref: '#/components/schemas/ACLAction' type: array - usageCycle: + onDemandConcurrency: items: $ref: '#/components/schemas/ACLAction' type: array - user: + optionsAllowlist: items: $ref: '#/components/schemas/ACLAction' type: array - userConnection: + passwordProtection: items: $ref: '#/components/schemas/ACLAction' type: array - webAnalyticsPlan: + privateLinkEndpoint: items: $ref: '#/components/schemas/ACLAction' type: array - edgeConfig: + productionAliasProtectionBypass: items: $ref: '#/components/schemas/ACLAction' type: array - edgeConfigItem: + productionShareableLink: items: $ref: '#/components/schemas/ACLAction' type: array - edgeConfigToken: + project: items: $ref: '#/components/schemas/ACLAction' type: array - webhook: + projectAccessGroup: items: $ref: '#/components/schemas/ACLAction' type: array - webhook-event: + projectAnalyticsSampling: items: $ref: '#/components/schemas/ACLAction' type: array - endpointVerification: + projectAnalyticsUsage: items: $ref: '#/components/schemas/ACLAction' type: array - projectTransferIn: + projectCheck: items: $ref: '#/components/schemas/ACLAction' type: array - aliasProject: + projectCheckRun: items: $ref: '#/components/schemas/ACLAction' type: array - aliasProtectionBypass: + projectDeploymentExpiration: items: $ref: '#/components/schemas/ACLAction' type: array - connectConfigurationLink: + projectDeploymentHook: items: $ref: '#/components/schemas/ACLAction' type: array - dataCacheNamespace: + projectDeploymentProtectionStrict: items: $ref: '#/components/schemas/ACLAction' type: array - deployment: + projectDomain: items: $ref: '#/components/schemas/ACLAction' type: array - deploymentCheck: + projectDomainCheckConfig: items: $ref: '#/components/schemas/ACLAction' type: array - deploymentCheckPreview: + projectDomainMove: items: $ref: '#/components/schemas/ACLAction' type: array - deploymentCheckReRunFromProductionBranch: + projectDomainVerify: items: $ref: '#/components/schemas/ACLAction' type: array - deploymentProductionGit: + projectEvent: items: $ref: '#/components/schemas/ACLAction' type: array - deploymentPreview: + projectEnvVars: items: $ref: '#/components/schemas/ACLAction' type: array - deploymentPrivate: + projectEnvVarsProduction: items: $ref: '#/components/schemas/ACLAction' type: array - deploymentPromote: + projectEnvVarsUnownedByIntegration: items: $ref: '#/components/schemas/ACLAction' type: array - deploymentRollback: + projectFlags: items: $ref: '#/components/schemas/ACLAction' type: array - logs: + projectFlagsProduction: items: $ref: '#/components/schemas/ACLAction' type: array - logsPreset: + projectFlagsSdkKey: items: $ref: '#/components/schemas/ACLAction' type: array - passwordProtection: + projectFromV0: items: $ref: '#/components/schemas/ACLAction' type: array - job: + projectId: items: $ref: '#/components/schemas/ACLAction' type: array - project: + projectIntegrationConfiguration: items: $ref: '#/components/schemas/ACLAction' type: array - projectAnalyticsSampling: + projectLink: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectMember: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectMonitoring: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectOIDCToken: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectPermissions: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectProductionBranch: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectProtectionBypass: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectRollingRelease: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectRoutes: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectSupportCase: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectSupportCaseComment: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectTier: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectTransfer: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectTransferOut: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectUsage: + items: + $ref: '#/components/schemas/ACLAction' + type: array + pageIntegrity: + items: + $ref: '#/components/schemas/ACLAction' + type: array + seawallConfig: + items: + $ref: '#/components/schemas/ACLAction' + type: array + securityPlusConfiguration: items: $ref: '#/components/schemas/ACLAction' type: array - projectDeploymentHook: + shareableLink: items: $ref: '#/components/schemas/ACLAction' type: array - projectDomain: + shareableLinkStrict: items: $ref: '#/components/schemas/ACLAction' type: array - projectDomainMove: + sharedEnvVarConnection: items: $ref: '#/components/schemas/ACLAction' type: array - projectDomainCheckConfig: + skewProtection: items: $ref: '#/components/schemas/ACLAction' type: array - projectEnvVars: + analytics: items: $ref: '#/components/schemas/ACLAction' type: array - projectEnvVarsProduction: + trustedIps: items: $ref: '#/components/schemas/ACLAction' type: array - projectEnvVarsUnownedByIntegration: + trustedSources: items: $ref: '#/components/schemas/ACLAction' type: array - projectId: + v0Chat: items: $ref: '#/components/schemas/ACLAction' type: array - projectIntegrationConfiguration: + vercelAuth: items: $ref: '#/components/schemas/ACLAction' type: array - projectLink: + vercelRun: items: $ref: '#/components/schemas/ACLAction' type: array - projectMember: + webAnalytics: items: $ref: '#/components/schemas/ACLAction' type: array - projectMonitoring: + workflowRunData: items: $ref: '#/components/schemas/ACLAction' type: array - projectPermissions: + type: object + lastRollbackTarget: + nullable: true + type: string + description: (opaque JSON object) + lastAliasRequest: + nullable: true + properties: + fromDeploymentId: + nullable: true + type: string + toDeploymentId: + type: string + fromRollingReleaseId: + type: string + description: If rolling back from a rolling release, fromDeploymentId captures the "base" of that rolling release, and fromRollingReleaseId captures the "target" of that rolling release. + jobStatus: + type: string + enum: + - failed + - in-progress + - pending + - skipped + - succeeded + requestedAt: + type: number + type: + type: string + enum: + - promote + - rollback + required: + - fromDeploymentId + - jobStatus + - requestedAt + - toDeploymentId + - type + type: object + protectionBypass: + additionalProperties: + oneOf: + - properties: + createdAt: + type: number + createdBy: + type: string + scope: + type: string + enum: + - integration-automation-bypass + integrationId: + type: string + configurationId: + type: string + required: + - configurationId + - createdAt + - createdBy + - integrationId + - scope + type: object + - properties: + createdAt: + type: number + createdBy: + type: string + scope: + type: string + enum: + - automation-bypass + isEnvVar: + type: boolean + enum: + - false + - true + description: When there was only one bypass, it was automatically set as an env var on deployments. With multiple bypasses, there is always one bypass that is selected as the default, and gets set as an env var on deployments. As this is a new field, undefined means that the bypass is the env var. If there are any automation bypasses, exactly one must be the env var. + note: + type: string + description: Optional note about the bypass to be displayed in the UI + required: + - createdAt + - createdBy + - scope + type: object + type: object + hasActiveBranches: + type: boolean + enum: + - false + - true + trustedIps: + nullable: true + properties: + deploymentType: + type: string + enum: + - all + - all_except_custom_domains + - preview + - prod_deployment_urls_and_all_previews + - production + addresses: items: - $ref: '#/components/schemas/ACLAction' + properties: + value: + type: string + note: + type: string + required: + - value + type: object type: array - projectProductionBranch: + protectionMode: + type: string + enum: + - additional + - exclusive + required: + - addresses + - deploymentType + - protectionMode + type: object + trustedSources: + nullable: true + properties: + enableVercelCiSameRepository: + type: boolean + enum: + - false + - true + description: Allow same-team Vercel CI access to preview deployments built from the CI run's repository, using the deployment source rather than the current project repository link. Defaults to enabled when not stored; omitted or null Trusted Sources updates preserve the stored value. + projects: + additionalProperties: + properties: + label: + type: string + customAllow: + items: + properties: + from: + oneOf: + - properties: + slugs: + items: + type: string + type: array + description: System environment slugs (`production`, `preview`) and/or custom environment slugs defined on the referenced project. + preset: + type: string + enum: + - all-custom + required: + - slugs + type: object + description: The source envs on the trusted project that are allowed to access `to`. + - properties: + slugs: + items: + type: string + type: array + description: System environment slugs (`production`, `preview`) and/or custom environment slugs defined on the referenced project. + preset: + type: string + enum: + - all-custom + required: + - preset + type: object + description: The source envs on the trusted project that are allowed to access `to`. + to: + oneOf: + - properties: + slugs: + items: + type: string + type: array + description: System environment slugs (`production`, `preview`) and/or custom environment slugs defined on the referenced project. + preset: + type: string + enum: + - all-custom + required: + - slugs + type: object + description: The target envs on the current project that may be accessed. + - properties: + slugs: + items: + type: string + type: array + description: System environment slugs (`production`, `preview`) and/or custom environment slugs defined on the referenced project. + preset: + type: string + enum: + - all-custom + required: + - preset + type: object + description: The target envs on the current project that may be accessed. + required: + - from + - to + type: object + description: Optional overrides for the default same-env-by-slug matching. Provide explicit rules to allow cross-env access or presets. + type: array + description: Optional overrides for the default same-env-by-slug matching. Provide explicit rules to allow cross-env access or presets. + type: object + type: object + oidcProviders: + additionalProperties: + items: + properties: + to: + oneOf: + - properties: + slugs: + items: + type: string + type: array + description: System environment slugs (`production`, `preview`) and/or custom environment slugs defined on the referenced project. + preset: + type: string + enum: + - all-custom + required: + - slugs + type: object + description: The target envs on the current project that may be accessed. + - properties: + slugs: + items: + type: string + type: array + description: System environment slugs (`production`, `preview`) and/or custom environment slugs defined on the referenced project. + preset: + type: string + enum: + - all-custom + required: + - preset + type: object + description: The target envs on the current project that may be accessed. + label: + type: string + claims: + additionalProperties: + items: + type: string + type: array + type: object + required: + - claims + - to + type: object + type: array + type: object + type: object + gitComments: + properties: + onPullRequest: + type: boolean + enum: + - false + - true + description: Whether the Vercel bot should comment on PRs + onCommit: + type: boolean + enum: + - false + - true + description: Whether the Vercel bot should comment on commits + required: + - onCommit + - onPullRequest + type: object + gitProviderOptions: + properties: + createDeployments: + type: string + enum: + - disabled + - enabled + description: 'Whether the Vercel bot should automatically create GitHub deployments https://docs.github.com/en/rest/deployments/deployments#about-deployments NOTE: repository-dispatch events should be used instead' + disableRepositoryDispatchEvents: + type: boolean + enum: + - false + - true + description: 'Whether the Vercel bot should not automatically create GitHub repository-dispatch events on deployment events. https://vercel.com/docs/git/vercel-for-github#repository-dispatch-events - `true`: disable repository-dispatch events for this project (explicit override of the team setting). - `false`: enable repository-dispatch events for this project (explicit override of the team setting). - absent: inherit from `team.disableRepositoryDispatchEvents`.' + requireVerifiedCommits: + type: boolean + enum: + - false + - true + description: 'Whether the project requires commits to be signed & verified before deployments will be created. - `true`: require verified commits for this project (explicit override of the team setting). - `false`: do not require verified commits (explicit override of the team setting). - absent: inherit from `team.requireVerifiedCommits`.' + gitCommitStatus: + type: boolean + enum: + - false + - true + description: Whether Vercel should post commit statuses for this project. When omitted, commit statuses remain enabled. + consolidatedGitCommitStatus: + properties: + enabled: + type: boolean + enum: + - false + - true + description: Whether consolidated commit status is enabled. + propagateFailures: + type: boolean + enum: + - false + - true + description: Whether to propagate individual deployment failures to the consolidated status. + required: + - enabled + - propagateFailures + type: object + description: Configuration for consolidated git commit status reporting. When enabled, Vercel will post a single consolidated commit status instead of individual statuses for each deployment. + required: + - createDeployments + type: object + paused: + type: boolean + enum: + - false + - true + concurrencyBucketName: + type: string + webAnalytics: + properties: + id: + type: string + disabledAt: + type: number + canceledAt: + type: number + enabledAt: + type: number + hasData: + type: boolean + enum: + - true + required: + - id + type: object + security: + properties: + attackModeEnabled: + type: boolean + enum: + - false + - true + attackModeUpdatedAt: + type: number + firewallEnabled: + type: boolean + enum: + - false + - true + firewallUpdatedAt: + type: number + attackModeActiveUntil: + nullable: true + type: number + firewallConfigVersion: + type: number + rulesets: + additionalProperties: + properties: + action: + type: string + enum: + - allow + - bypass + - challenge + - deny + - log + - rate_limit + - redirect + rateLimit: + nullable: true + properties: + algo: + type: string + enum: + - fixed_window + - token_bucket + window: + type: number + limit: + type: number + keys: + items: + type: string + type: array + required: + - algo + - keys + - limit + - window + type: object + redirect: + nullable: true + properties: + location: + type: string + permanent: + type: boolean + enum: + - false + - true + required: + - location + - permanent + type: object + actionDuration: + nullable: true + type: string + bypassSystem: + nullable: true + type: boolean + enum: + - false + - true + - null + logHeaders: + oneOf: + - items: + type: string + type: array + - type: string + enum: + - '*' + required: + - action + type: object + type: object + firewallSeawallEnabled: + type: boolean + enum: + - false + - true + ja3Enabled: + type: boolean + enum: + - false + - true + ja4Enabled: + type: boolean + enum: + - false + - true + firewallBypassIps: items: - $ref: '#/components/schemas/ACLAction' + type: string type: array - projectTransfer: + managedRules: + nullable: true + properties: + vercel_ruleset: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - challenge + - deny + - log + required: + - active + type: object + traffic_sources: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - challenge + - deny + - log + required: + - active + type: object + bot_filter: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - challenge + - deny + - log + required: + - active + type: object + ai_bots: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - challenge + - deny + - log + required: + - active + type: object + owasp: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - challenge + - deny + - log + required: + - active + type: object + required: + - ai_bots + - bot_filter + - owasp + - traffic_sources + - vercel_ruleset + type: object + botIdEnabled: + type: boolean + enum: + - false + - true + log_headers: + oneOf: + - items: + type: string + type: array + - type: string + enum: + - '*' + securityPlus: + type: boolean + enum: + - false + - true + securityPlusMetadata: + properties: + updatedAt: + type: number + firstEnabledAt: + type: number + description: Timestamp when the feature was first enabled. Never changes after initial enablement. + required: + - updatedAt + type: object + pageIntegrityEnabled: + type: boolean + enum: + - false + - true + description: Whether Page Integrity is enabled for this project. Used by the metadata service to gate DynamoDB lookups against the page-integrity-inventory table. + type: object + oidcTokenConfig: + properties: + enabled: + type: boolean + enum: + - false + - true + description: Whether or not to generate OpenID Connect JSON Web Tokens. + issuerMode: + type: string + enum: + - global + - team + description: '- team: `https://oidc.vercel.com/[team_slug]` - global: `https://oidc.vercel.com`' + type: object + deploymentPolicy: + nullable: true + properties: + gitSources: + nullable: true items: - $ref: '#/components/schemas/ACLAction' + properties: + sources: + items: + oneOf: + - properties: + provider: + type: string + enum: + - bitbucket + - github + org: + type: string + repo: + type: string + required: + - org + - provider + type: object + description: Allowlist entry for GitHub and Bitbucket, whose repos are identified by a flat `org`/`repo` (Bitbucket's workspace/owner maps to `org`, its repo slug to `repo`). Omit `repo` to match any repo in the org. Org is matched case-insensitively. + - properties: + provider: + type: string + enum: + - gitlab + namespace: + type: string + project: + type: string + required: + - namespace + - provider + type: object + description: Allowlist entry for GitLab, which uses nested groups rather than a flat org/repo. `namespace` is the full group path (e.g. `group` or `group/subgroup`); `project` is the leaf project name. Omit `project` to match any project under the namespace. Namespace is matched case-insensitively. + type: array + enabled: + type: boolean + enum: + - false + - true + environments: + items: + oneOf: + - properties: + type: + type: string + enum: + - system + target: + type: string + enum: + - preview + - production + required: + - target + - type + type: object + - properties: + type: + type: string + enum: + - custom + environmentId: + type: string + required: + - environmentId + - type + type: object + type: array + required: + - enabled + - environments + - sources + type: object + description: '`enabled: true` with empty `sources` is deny-all.' type: array - projectTransferOut: + deploymentSources: + nullable: true items: - $ref: '#/components/schemas/ACLAction' + properties: + sources: + items: + type: string + enum: + - cli + - deploy-hook + - git + - integration + - rest-api + - v0 + description: 'Customer-configurable deployment sources. Every deploy classifies to exactly one. JSON schema in `packages/deployment-policy/schemas/body.ts` enumerates exactly these values. - `''git''` — git provider webhook. - `''cli''` — Vercel CLI (legacy classic-token CLI and SIWV CLI both). - `''rest-api''` — direct user/team-token REST upload. Does NOT cover deploy hooks, Marketplace integrations, or first-party app tokens. - `''deploy-hook''` — project deploy-hook URL. The URL is the credential. - `''integration''` — third-party Marketplace actor: Marketplace integration token, user-delegated OAuth from a Marketplace app, or an unrecognized third-party Vercel App. First-party Vercel Apps are never `''integration''`. - `''v0''` — the v0 product surface (entitlement-gated). v0 deploys through the CLI under the hood, but classifies as its own source so a team can allow or deny v0 independently of `''cli''`. First-party Vercel apps (Toolbar, etc.) classify as `''first-party''` — see `ClassifiedSource` in `./checks`. They''re not in this union because they aren''t customer-configurable; they bypass `checkDeploymentSources` entirely. v0 is intentionally NOT among them: like the CLI, it''s a real product surface and is policy-controllable.' + type: array + enabled: + type: boolean + enum: + - false + - true + environments: + items: + oneOf: + - properties: + type: + type: string + enum: + - system + target: + type: string + enum: + - preview + - production + required: + - target + - type + type: object + - properties: + type: + type: string + enum: + - custom + environmentId: + type: string + required: + - environmentId + - type + type: object + type: array + required: + - enabled + - environments + - sources + type: object + description: '`enabled: true` with empty `sources` is deny-all.' type: array - projectProtectionBypass: + type: object + description: Project shape. `null` on a rule list clears the project's override for that rule type (fall back to team for every env); omitting is equivalent. Setting `deploymentPolicy` itself to `null` clears every override at once. Kept structurally distinct from {@link TeamDeploymentPolicy} so the two storage locations don't share a type by accident. + tier: + type: string + enum: + - advanced + - critical + - priority + usageStatus: + properties: + kind: + type: string + enum: + - flat + description: Billing mode. Always 'flat' for flat-rate projects. + exceededAllowanceUntil: + type: number + description: Timestamp until which the project has exceeded its CDN allowance. + bypassThrottleUntil: + type: number + description: Timestamp until which throttling is bypassed (project pays list rates for overage). + throttled: + type: boolean + enum: + - false + - true + description: Per-project throttle, set explicitly for this project (e.g. via the per-project Flat Rate CDN endpoint). + teamThrottled: + type: boolean + enum: + - false + - true + description: Synced from `team.billing.usageStatus.throttled`. When `true`, the team has throttled all of its projects regardless of `throttled`. The effective throttle the CDN enforces is `throttled || teamThrottled`. + required: + - kind + type: object + features: + properties: + webAnalytics: + type: boolean + enum: + - false + - true + type: object + v0: + type: boolean + enum: + - false + - true + v0Created: + type: boolean + enum: + - false + - true + abuse: + properties: + scanner: + type: string + history: items: - $ref: '#/components/schemas/ACLAction' + properties: + scanner: + type: string + reason: + type: string + by: + type: string + byId: + type: string + at: + type: number + required: + - at + - by + - byId + - reason + - scanner + type: object type: array - projectUsage: + updatedAt: + type: number + block: + properties: + action: + type: string + enum: + - blocked + reason: + type: string + statusCode: + type: number + createdAt: + type: number + caseId: + type: string + actor: + type: string + comment: + type: string + ineligibleForAppeal: + type: boolean + enum: + - false + - true + isCascading: + type: boolean + enum: + - false + - true + required: + - action + - createdAt + - reason + - statusCode + type: object + blockHistory: items: - $ref: '#/components/schemas/ACLAction' + oneOf: + - properties: + action: + type: string + enum: + - blocked + reason: + type: string + statusCode: + type: number + createdAt: + type: number + caseId: + type: string + actor: + type: string + comment: + type: string + ineligibleForAppeal: + type: boolean + enum: + - false + - true + isCascading: + type: boolean + enum: + - false + - true + required: + - action + - createdAt + - reason + - statusCode + type: object + - properties: + action: + type: string + enum: + - unblocked + createdAt: + type: number + caseId: + type: string + actor: + type: string + comment: + type: string + ineligibleForAppeal: + type: boolean + enum: + - false + - true + isCascading: + type: boolean + enum: + - false + - true + required: + - action + - createdAt + type: object + - properties: + action: + type: string + enum: + - route-blocked + route: + oneOf: + - properties: + src: + type: string + status: + type: number + expiry: + type: number + required: + - src + - status + type: object + - properties: + has: + items: + oneOf: + - properties: + type: + type: string + enum: + - header + key: + type: string + enum: + - x-vercel-ip-country + value: + properties: + eq: + type: string + required: + - eq + type: object + required: + - key + - type + - value + type: object + - properties: + type: + type: string + enum: + - host + value: + properties: + eq: + type: string + required: + - eq + type: object + required: + - type + - value + type: object + type: array + mitigate: + properties: + action: + type: string + enum: + - block_legal_cwc + required: + - action + type: object + src: + type: string + required: + - has + - mitigate + type: object + reason: + type: string + createdAt: + type: number + caseId: + type: string + actor: + type: string + comment: + type: string + ineligibleForAppeal: + type: boolean + enum: + - false + - true + isCascading: + type: boolean + enum: + - false + - true + required: + - action + - createdAt + - reason + - route + type: object + - properties: + action: + type: string + enum: + - route-unblocked + route: + oneOf: + - properties: + src: + type: string + status: + type: number + expiry: + type: number + required: + - src + - status + type: object + - properties: + has: + items: + oneOf: + - properties: + type: + type: string + enum: + - header + key: + type: string + enum: + - x-vercel-ip-country + value: + properties: + eq: + type: string + required: + - eq + type: object + required: + - key + - type + - value + type: object + - properties: + type: + type: string + enum: + - host + value: + properties: + eq: + type: string + required: + - eq + type: object + required: + - type + - value + type: object + type: array + mitigate: + properties: + action: + type: string + enum: + - block_legal_cwc + required: + - action + type: object + src: + type: string + required: + - has + - mitigate + type: object + statusCode: + type: number + createdAt: + type: number + caseId: + type: string + actor: + type: string + comment: + type: string + ineligibleForAppeal: + type: boolean + enum: + - false + - true + isCascading: + type: boolean + enum: + - false + - true + required: + - action + - createdAt + - route + type: object type: array - projectAnalyticsUsage: + interstitial: + type: boolean + enum: + - false + - true + interstitialHistory: items: - $ref: '#/components/schemas/ACLAction' + properties: + action: + type: string + enum: + - add-deployment-interstitial + - add-project-interstitial + - remove-deployment-interstitial + - remove-project-interstitial + createdAt: + type: number + caseId: + type: string + reason: + type: string + actor: + type: string + comment: + type: string + required: + - action + - createdAt + type: object type: array - analytics: + required: + - history + - updatedAt + type: object + internalRoutes: + items: + oneOf: + - properties: + src: + type: string + status: + type: number + expiry: + type: number + required: + - src + - status + type: object + - properties: + has: + items: + oneOf: + - properties: + type: + type: string + enum: + - header + key: + type: string + enum: + - x-vercel-ip-country + value: + properties: + eq: + type: string + required: + - eq + type: object + required: + - key + - type + - value + type: object + - properties: + type: + type: string + enum: + - host + value: + properties: + eq: + type: string + required: + - eq + type: object + required: + - type + - value + type: object + type: array + mitigate: + properties: + action: + type: string + enum: + - block_legal_cwc + required: + - action + type: object + src: + type: string + required: + - has + - mitigate + type: object + type: array + hasDeployments: + type: boolean + enum: + - false + - true + dismissedToasts: + items: + properties: + key: + type: string + dismissedAt: + type: number + action: + type: string + enum: + - accept + - cancel + - delete + value: + nullable: true + oneOf: + - type: string + - type: number + - properties: + previousValue: + oneOf: + - type: string + - type: number + - type: boolean + enum: + - false + - true + currentValue: + oneOf: + - type: string + - type: number + - type: boolean + enum: + - false + - true + required: + - currentValue + - previousValue + type: object + - type: boolean + enum: + - false + - true + required: + - action + - dismissedAt + - key + - value + type: object + type: array + protectedSourcemaps: + type: boolean + enum: + - false + - true + tracing: + properties: + domains: + type: string + ignorePaths: items: - $ref: '#/components/schemas/ACLAction' + type: string type: array - trustedIps: + samplingRules: items: - $ref: '#/components/schemas/ACLAction' + properties: + rate: + type: number + env: + type: string + enum: + - preview + - production + requestPath: + type: string + destination: + type: string + enum: + - external + - internal + description: Which tracing destination this rule applies to. `internal` is the hidden Vercel production-tracing drain (internal delivery); `external` is any customer-configured drain. Derived from the owning drain's delivery type when project tracing is computed; absent on configs persisted before this field existed. + required: + - rate + type: object type: array - webAnalytics: - items: - $ref: '#/components/schemas/ACLAction' + type: object + avatar: + nullable: true + type: string + required: + - accountId + - alias + - defaultResourceConfig + - deploymentExpiration + - directoryListing + - id + - name + - nodeVersion + - resourceConfig + type: object + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '410': + description: '' + '413': + description: '' + '415': + description: '' + parameters: + - name: id_or_name + description: The unique project identifier or the project name. + in: path + required: true + schema: + description: The unique project identifier or the project name. + type: string + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + requestBody: + content: + application/octet-stream: + schema: + $ref: '#/components/schemas/StackqlOctetStreamBody' + /v9/projects/{id_or_name}/domains: + get: + description: Retrieve the domains associated with a given project by passing either the project `id` or `name` in the URL. + operationId: getProjectDomains + security: + - bearerToken: [] + summary: Retrieve project domains by project by id or name + tags: + - projects + responses: + '200': + description: Successful response retrieving a list of domains + content: + application/json: + schema: + properties: + domains: + items: + properties: + name: + type: string + apexName: + type: string + projectId: + type: string + redirect: + nullable: true + type: string + redirectStatusCode: + nullable: true + type: number + enum: + - 301 + - 302 + - 307 + - 308 + - null + gitBranch: + nullable: true + type: string + customEnvironmentId: + nullable: true + type: string + updatedAt: + type: number + createdAt: + type: number + verified: + type: boolean + enum: + - false + - true + description: '`true` if the domain is verified for use with the project. If `false` it will not be used as an alias on this project until the challenge in `verification` is completed.' + verification: + items: + properties: + type: + type: string + domain: + type: string + value: + type: string + reason: + type: string + required: + - domain + - reason + - type + - value + type: object + description: 'A list of verification challenges, one of which must be completed to verify the domain for use on the project. After the challenge is complete `POST /projects/:idOrName/domains/:domain/verify` to verify the domain. Possible challenges: - If `verification.type = TXT` the `verification.domain` will be checked for a TXT record matching `verification.value`.' + type: array + description: 'A list of verification challenges, one of which must be completed to verify the domain for use on the project. After the challenge is complete `POST /projects/:idOrName/domains/:domain/verify` to verify the domain. Possible challenges: - If `verification.type = TXT` the `verification.domain` will be checked for a TXT record matching `verification.value`.' + required: + - apexName + - name + - projectId + - verified + type: object + type: array + pagination: + properties: + count: + type: number + next: + nullable: true + type: number + prev: + nullable: true + type: number + required: + - count + - next + - prev + type: object + required: + - domains + - pagination + type: object + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '410': + description: '' + parameters: + - name: id_or_name + description: The unique project identifier or the project name + in: path + required: true + schema: + description: The unique project identifier or the project name + oneOf: + - type: string + - name: production + description: Filters only production domains when set to `true`. + in: query + required: false + schema: + default: 'false' + description: Filters only production domains when set to `true`. + enum: + - 'true' + - 'false' + - name: target + description: Filters on the target of the domain. Can be either "production", "preview" + in: query + required: false + schema: + description: Filters on the target of the domain. Can be either "production", "preview" + enum: + - production + - preview + type: string + - name: customEnvironmentId + description: The unique custom environment identifier within the project + in: query + required: false + schema: + description: The unique custom environment identifier within the project + type: string + example: env_123abc4567 + - name: gitBranch + description: Filters domains based on specific branch. + in: query + required: false + schema: + description: Filters domains based on specific branch. + type: string + - name: redirects + description: Excludes redirect project domains when "false". Includes redirect project domains when "true" (default). + in: query + required: false + schema: + default: 'true' + description: Excludes redirect project domains when "false". Includes redirect project domains when "true" (default). + enum: + - 'true' + - 'false' + - name: redirect + description: Filters domains based on their redirect target. + in: query + required: false + schema: + description: Filters domains based on their redirect target. + type: string + example: example.com + - name: verified + description: Filters domains based on their verification status. + in: query + required: false + schema: + description: Filters domains based on their verification status. + enum: + - 'true' + - 'false' + - name: limit + description: Maximum number of domains to list from a request (max 100). + in: query + required: false + schema: + description: Maximum number of domains to list from a request (max 100). + type: number + example: 20 + - name: since + description: Get domains created after this JavaScript timestamp. + in: query + required: false + schema: + description: Get domains created after this JavaScript timestamp. + type: number + example: 1609499532000 + - name: until + description: Get domains created before this JavaScript timestamp. + in: query + required: false + schema: + description: Get domains created before this JavaScript timestamp. + type: number + example: 1612264332000 + - name: order + description: Domains sort order by createdAt + in: query + required: false + schema: + default: DESC + description: Domains sort order by createdAt + enum: + - ASC + - DESC + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + /v9/projects/{id_or_name}/domains/{domain}: + get: + description: Get project domain by project id/name and domain name. + operationId: getProjectDomain + security: + - bearerToken: [] + summary: Get a project domain + tags: + - projects + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + name: + type: string + apexName: + type: string + projectId: + type: string + redirect: + nullable: true + type: string + redirectStatusCode: + nullable: true + type: number + enum: + - 301 + - 302 + - 307 + - 308 + - null + gitBranch: + nullable: true + type: string + customEnvironmentId: + nullable: true + type: string + updatedAt: + type: number + createdAt: + type: number + verified: + type: boolean + enum: + - false + - true + description: '`true` if the domain is verified for use with the project. If `false` it will not be used as an alias on this project until the challenge in `verification` is completed.' + verification: + items: + properties: + type: + type: string + domain: + type: string + value: + type: string + reason: + type: string + required: + - domain + - reason + - type + - value + type: object + description: 'A list of verification challenges, one of which must be completed to verify the domain for use on the project. After the challenge is complete `POST /projects/:idOrName/domains/:domain/verify` to verify the domain. Possible challenges: - If `verification.type = TXT` the `verification.domain` will be checked for a TXT record matching `verification.value`.' + type: array + description: 'A list of verification challenges, one of which must be completed to verify the domain for use on the project. After the challenge is complete `POST /projects/:idOrName/domains/:domain/verify` to verify the domain. Possible challenges: - If `verification.type = TXT` the `verification.domain` will be checked for a TXT record matching `verification.value`.' + required: + - apexName + - name + - projectId + - verified + type: object + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '410': + description: '' + parameters: + - name: id_or_name + description: The unique project identifier or the project name + in: path + required: true + schema: + description: The unique project identifier or the project name + type: string + - name: domain + description: The project domain name + in: path + required: true + schema: + description: The project domain name + type: string + example: www.example.com + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + patch: + description: Update a project domain's configuration, including the name, git branch and redirect of the domain. + operationId: updateProjectDomain + security: + - bearerToken: [] + summary: Update a project domain + tags: + - projects + responses: + '200': + description: The domain was updated successfuly + content: + application/json: + schema: + properties: + name: + type: string + apexName: + type: string + projectId: + type: string + redirect: + nullable: true + type: string + redirectStatusCode: + nullable: true + type: number + enum: + - 301 + - 302 + - 307 + - 308 + - null + gitBranch: + nullable: true + type: string + customEnvironmentId: + nullable: true + type: string + updatedAt: + type: number + createdAt: + type: number + verified: + type: boolean + enum: + - false + - true + description: '`true` if the domain is verified for use with the project. If `false` it will not be used as an alias on this project until the challenge in `verification` is completed.' + verification: + items: + properties: + type: + type: string + domain: + type: string + value: + type: string + reason: + type: string + required: + - domain + - reason + - type + - value + type: object + description: 'A list of verification challenges, one of which must be completed to verify the domain for use on the project. After the challenge is complete `POST /projects/:idOrName/domains/:domain/verify` to verify the domain. Possible challenges: - If `verification.type = TXT` the `verification.domain` will be checked for a TXT record matching `verification.value`.' + type: array + description: 'A list of verification challenges, one of which must be completed to verify the domain for use on the project. After the challenge is complete `POST /projects/:idOrName/domains/:domain/verify` to verify the domain. Possible challenges: - If `verification.type = TXT` the `verification.domain` will be checked for a TXT record matching `verification.value`.' + required: + - apexName + - name + - projectId + - verified + type: object + '400': + description: |- + One of the provided values in the request body is invalid. + One of the provided values in the request query is invalid. + The domain redirect is not valid + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '409': + description: The project is currently being transferred + '410': + description: '' + parameters: + - name: id_or_name + description: The unique project identifier or the project name + in: path + required: true + schema: + description: The unique project identifier or the project name + type: string + - name: domain + description: The project domain name + in: path + required: true + schema: + description: The project domain name + type: string + example: www.example.com + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + requestBody: + content: + application/json: + schema: + properties: + gitBranch: + description: Git branch to link the project domain + example: null + type: string + maxLength: 250 + nullable: true + redirect: + description: Target destination domain for redirect + example: foobar.com + type: string + nullable: true + redirectStatusCode: + description: Status code for domain redirect + example: 307 + type: integer + enum: + - null + - 301 + - 302 + - 307 + - 308 + nullable: true + type: object + required: true + delete: + description: Remove a domain from a project by passing the domain name and by specifying the project by either passing the project `id` or `name` in the URL. + operationId: removeProjectDomain + security: + - bearerToken: [] + summary: Remove a domain from a project + tags: + - projects + responses: + '200': + description: The domain was succesfully removed from the project + content: + application/json: + schema: + type: string + description: (opaque JSON object) + '400': + description: |- + One of the provided values in the request body is invalid. + One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '409': + description: The project is currently being transferred + '410': + description: '' + parameters: + - name: id_or_name + description: The unique project identifier or the project name + in: path + required: true + schema: + description: The unique project identifier or the project name + type: string + - name: domain + description: The project domain name + in: path + required: true + schema: + description: The project domain name + type: string + example: www.example.com + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + requestBody: + content: + application/json: + schema: + type: object + properties: + removeRedirects: + type: boolean + description: Whether to remove all domains from this project that redirect to the domain being removed. + /v10/projects/{id_or_name}/domains: + post: + description: Add a domain to the project by passing its domain name and by specifying the project by either passing the project `id` or `name` in the URL. If the domain is not yet verified to be used on this project, the request will return `verified = false`, and the domain will need to be verified according to the `verification` challenge via `POST /projects/:idOrName/domains/:domain/verify`. If the domain already exists on the project, the request will fail with a `400` status code. + operationId: addProjectDomain + security: + - bearerToken: [] + summary: Add a domain to a project + tags: + - projects + responses: + '200': + description: The domain was successfully added to the project + content: + application/json: + schema: + properties: + name: + type: string + apexName: + type: string + projectId: + type: string + redirect: + nullable: true + type: string + redirectStatusCode: + nullable: true + type: number + enum: + - 301 + - 302 + - 307 + - 308 + - null + gitBranch: + nullable: true + type: string + customEnvironmentId: + nullable: true + type: string + updatedAt: + type: number + createdAt: + type: number + verified: + type: boolean + enum: + - false + - true + description: '`true` if the domain is verified for use with the project. If `false` it will not be used as an alias on this project until the challenge in `verification` is completed.' + verification: + items: + properties: + type: + type: string + domain: + type: string + value: + type: string + reason: + type: string + required: + - domain + - reason + - type + - value + type: object + description: 'A list of verification challenges, one of which must be completed to verify the domain for use on the project. After the challenge is complete `POST /projects/:idOrName/domains/:domain/verify` to verify the domain. Possible challenges: - If `verification.type = TXT` the `verification.domain` will be checked for a TXT record matching `verification.value`.' + type: array + description: 'A list of verification challenges, one of which must be completed to verify the domain for use on the project. After the challenge is complete `POST /projects/:idOrName/domains/:domain/verify` to verify the domain. Possible challenges: - If `verification.type = TXT` the `verification.domain` will be checked for a TXT record matching `verification.value`.' + required: + - apexName + - name + - projectId + - verified + type: object + '400': + description: |- + One of the provided values in the request body is invalid. + One of the provided values in the request query is invalid. + The domain is not valid + You can't set both a git branch and a redirect for the domain + The domain can not be added because the latest production deployment for the project was not successful + The domain redirect is not valid + A domain cannot redirect to itself + You can not set the production branch as a branch for your domain + '401': + description: The request is not authorized. + '402': + description: The account is missing a payment so payment method must be updated + '403': + description: |- + You do not have permission to access this resource. + You don't have access to the domain you are adding + '409': + description: |- + The domain is already assigned to another Vercel project + Cannot create project domain since owner already has `domain` on their account, but it's not verified yet. + Cannot create project domain since owner already has `domain` on their account, and it's verified. + The domain is not allowed to be used + The project is currently being transferred + '410': + description: '' + parameters: + - name: id_or_name + description: The unique project identifier or the project name + in: path + required: true + schema: + description: The unique project identifier or the project name + type: string + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + requestBody: + content: + application/json: + schema: + properties: + name: + description: The project domain name + example: www.example.com + type: string + gitBranch: + description: Git branch to link the project domain + example: null + maxLength: 250 + type: string + nullable: true + customEnvironmentId: + description: The unique custom environment identifier within the project + type: string + redirect: + description: Target destination domain for redirect + example: foobar.com + type: string + nullable: true + redirectStatusCode: + description: Status code for domain redirect + example: 307 + type: integer + enum: + - null + - 301 + - 302 + - 307 + - 308 + nullable: true + required: + - name + type: object + required: true + /v1/projects/{id_or_name}/domains/{domain}/move: + post: + description: Move one project's domain to another project. Also allows the move of all redirects pointed to that domain in the same project. + operationId: moveProjectDomain + security: + - bearerToken: [] + summary: Move a project domain + tags: + - projects + responses: + '200': + description: The domain was updated successfuly + content: + application/json: + schema: + properties: + name: + type: string + apexName: + type: string + projectId: + type: string + redirect: + nullable: true + type: string + redirectStatusCode: + nullable: true + type: number + enum: + - 301 + - 302 + - 307 + - 308 + - null + gitBranch: + nullable: true + type: string + customEnvironmentId: + nullable: true + type: string + updatedAt: + type: number + createdAt: + type: number + verified: + type: boolean + enum: + - false + - true + description: '`true` if the domain is verified for use with the project. If `false` it will not be used as an alias on this project until the challenge in `verification` is completed.' + verification: + items: + properties: + type: + type: string + domain: + type: string + value: + type: string + reason: + type: string + required: + - domain + - reason + - type + - value + type: object + description: 'A list of verification challenges, one of which must be completed to verify the domain for use on the project. After the challenge is complete `POST /projects/:idOrName/domains/:domain/verify` to verify the domain. Possible challenges: - If `verification.type = TXT` the `verification.domain` will be checked for a TXT record matching `verification.value`.' + type: array + description: 'A list of verification challenges, one of which must be completed to verify the domain for use on the project. After the challenge is complete `POST /projects/:idOrName/domains/:domain/verify` to verify the domain. Possible challenges: - If `verification.type = TXT` the `verification.domain` will be checked for a TXT record matching `verification.value`.' + required: + - apexName + - name + - projectId + - verified + type: object + '400': + description: |- + One of the provided values in the request body is invalid. + One of the provided values in the request query is invalid. + The domain redirect is not valid + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '409': + description: The project is currently being transferred + '410': + description: '' + parameters: + - name: id_or_name + description: The unique project identifier or the project name + in: path + required: true + schema: + description: The unique project identifier or the project name + type: string + - name: domain + description: The project domain name + in: path + required: true + schema: + description: The project domain name + type: string + example: www.example.com + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + requestBody: + content: + application/json: + schema: + required: + - projectId + properties: + projectId: + description: The unique target project identifier + example: prj_XLKmu1DyR1eY7zq8UgeRKbA7yVLA + type: string + gitBranch: + description: Git branch to link the project domain + example: null + type: string + maxLength: 250 + nullable: true + redirect: + description: Target destination domain for redirect + example: foobar.com + type: string + nullable: true + redirectStatusCode: + description: Status code for domain redirect + example: 307 + type: integer + enum: + - null + - 301 + - 302 + - 307 + - 308 + nullable: true + type: object + /v9/projects/{id_or_name}/domains/{domain}/verify: + post: + description: Attempts to verify a project domain with `verified = false` by checking the correctness of the project domain's `verification` challenge. + operationId: verifyProjectDomain + security: + - bearerToken: [] + summary: Verify project domain + tags: + - projects + responses: + '200': + description: |- + The project domain was verified successfully + Domain is already verified + content: + application/json: + schema: + properties: + name: + type: string + apexName: + type: string + projectId: + type: string + redirect: + nullable: true + type: string + redirectStatusCode: + nullable: true + type: number + enum: + - 301 + - 302 + - 307 + - 308 + - null + gitBranch: + nullable: true + type: string + customEnvironmentId: + nullable: true + type: string + updatedAt: + type: number + createdAt: + type: number + verified: + type: boolean + enum: + - false + - true + description: '`true` if the domain is verified for use with the project. If `false` it will not be used as an alias on this project until the challenge in `verification` is completed.' + required: + - apexName + - name + - projectId + - verified + type: object + '400': + description: |- + One of the provided values in the request query is invalid. + There is an existing TXT record on the domain verifying it for another project + The domain does not have a TXT record that attempts to verify the project domain + The TXT record on the domain does not match the expected challenge for the project domain + Project domain is not assigned to project + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '410': + description: '' + parameters: + - name: id_or_name + description: The unique project identifier or the project name + in: path + required: true + schema: + example: prj_12HKQaOmR5t5Uy6vdcQsNIiZgHGB + description: The unique project identifier or the project name + type: string + - name: domain + description: The domain name you want to verify + in: path + required: true + schema: + description: The domain name you want to verify + type: string + example: example.com + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + /v10/projects/{id_or_name}/env: + get: + description: Retrieve the environment variables for a given project by passing either the project `id` or `name` in the URL. + operationId: filterProjectEnvs + security: + - bearerToken: [] + summary: Retrieve the environment variables of a project by id or name + tags: + - projects + responses: + '200': + description: The list of environment variables for the given project + content: + application/json: + schema: + properties: + securityIssues: + items: + type: string + enum: + - flags-secret-needs-split + - readable-secret + type: array + type: + type: string + enum: + - encrypted + - plain + - secret + - sensitive + - system + value: + type: string + edgeConfigId: + nullable: true + type: string + edgeConfigTokenId: + nullable: true + type: string + createdAt: + type: number + updatedAt: + type: number + system: + type: boolean + enum: + - false + - true + id: + type: string + key: + type: string + target: + oneOf: + - items: + type: string + enum: + - development + - development + - preview + - preview + - production type: array - sharedEnvVarConnection: + - type: string + enum: + - development + - development + - preview + - preview + - production + gitBranch: + type: string + createdBy: + nullable: true + type: string + updatedBy: + nullable: true + type: string + sunsetSecretId: + type: string + description: This is used to identify variables that have been migrated from type secret to sensitive. + legacyValue: + type: string + description: Legacy now-encryption ciphertext, present after migration swaps value/vsmValue + decrypted: + type: boolean + enum: + - false + - true + configurationId: + nullable: true + type: string + visibility: + type: string + enum: + - config + - secret + description: User-facing config/secret model. When set, authoritative for new code paths when the env-var-config-secret-ui flag is enabled. Legacy rows omit this field; legacy rows omit it and callers fall back to existing `type` behavior. + contentHint: + nullable: true + oneOf: + - properties: + type: + type: string + enum: + - redis-url + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - redis-rest-api-url + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - redis-rest-api-token + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - redis-rest-api-read-only-token + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - blob-read-write-token + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - blob-store-id + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - blob-webhook-public-key + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - postgres-url + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - postgres-url-non-pooling + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - postgres-prisma-url + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - postgres-user + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - postgres-host + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - postgres-password + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - postgres-database + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - postgres-url-no-ssl + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - integration-store-secret + storeId: + type: string + integrationId: + type: string + integrationProductId: + type: string + integrationConfigurationId: + type: string + required: + - integrationConfigurationId + - integrationId + - integrationProductId + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - flags-connection-string + projectId: + type: string + required: + - projectId + - type + type: object + internalContentHint: + nullable: true + properties: + type: + type: string + enum: + - flags-secret + encryptedValue: + type: string + description: Contains the `value` of the env variable, encrypted with a special key to make decryption possible in the subscriber Lambda. + required: + - encryptedValue + - type + type: object + description: Similar to `contentHints`, but should not be exposed to the user. + comment: + type: string + customEnvironmentIds: + items: + type: string + type: array + envs: + items: + properties: + securityIssues: + items: + type: string + enum: + - flags-secret-needs-split + - readable-secret + type: array + type: + type: string + enum: + - encrypted + - plain + - secret + - sensitive + - system + value: + type: string + edgeConfigId: + nullable: true + type: string + edgeConfigTokenId: + nullable: true + type: string + createdAt: + type: number + updatedAt: + type: number + system: + type: boolean + enum: + - false + - true + id: + type: string + key: + type: string + target: + oneOf: + - items: + type: string + enum: + - development + - development + - preview + - preview + - production + type: array + - type: string + enum: + - development + - development + - preview + - preview + - production + gitBranch: + type: string + createdBy: + nullable: true + type: string + updatedBy: + nullable: true + type: string + sunsetSecretId: + type: string + description: This is used to identify variables that have been migrated from type secret to sensitive. + legacyValue: + type: string + description: Legacy now-encryption ciphertext, present after migration swaps value/vsmValue + decrypted: + type: boolean + enum: + - false + - true + configurationId: + nullable: true + type: string + visibility: + type: string + enum: + - config + - secret + description: User-facing config/secret model. When set, authoritative for new code paths when the env-var-config-secret-ui flag is enabled. Legacy rows omit this field; legacy rows omit it and callers fall back to existing `type` behavior. + contentHint: + nullable: true + oneOf: + - properties: + type: + type: string + enum: + - redis-url + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - redis-rest-api-url + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - redis-rest-api-token + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - redis-rest-api-read-only-token + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - blob-read-write-token + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - blob-store-id + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - blob-webhook-public-key + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - postgres-url + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - postgres-url-non-pooling + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - postgres-prisma-url + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - postgres-user + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - postgres-host + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - postgres-password + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - postgres-database + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - postgres-url-no-ssl + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - integration-store-secret + storeId: + type: string + integrationId: + type: string + integrationProductId: + type: string + integrationConfigurationId: + type: string + required: + - integrationConfigurationId + - integrationId + - integrationProductId + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - flags-connection-string + projectId: + type: string + required: + - projectId + - type + type: object + internalContentHint: + nullable: true + properties: + type: + type: string + enum: + - flags-secret + encryptedValue: + type: string + description: Contains the `value` of the env variable, encrypted with a special key to make decryption possible in the subscriber Lambda. + required: + - encryptedValue + - type + type: object + description: Similar to `contentHints`, but should not be exposed to the user. + comment: + type: string + customEnvironmentIds: + items: + type: string + type: array + required: + - key + - securityIssues + - type + - value + type: object + type: array + pagination: + $ref: '#/components/schemas/Pagination' + hiddenProductionEnvCount: + type: number + required: + - key + - securityIssues + - type + - value + - envs + - pagination + - hiddenProductionEnvCount + type: object + description: The list of environment variables for the given project + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '410': + description: '' + x-vercel-cli: + supportedSubcommands: true + supportedProduction: false + aliases: + - ls + - list + parameters: + - name: id_or_name + description: The unique project identifier or the project name + in: path + required: true + schema: + description: The unique project identifier or the project name + type: string + example: prj_XLKmu1DyR1eY7zq8UgeRKbA7yVLA + x-vercel-cli: + kind: argument + - name: gitBranch + description: If defined, the git branch of the environment variable to filter the results (must have target=preview) + in: query + required: false + schema: + description: If defined, the git branch of the environment variable to filter the results (must have target=preview) + type: string + maxLength: 250 + example: feature-1 + - name: decrypt + description: If true, the environment variable value will be decrypted + in: query + required: false + schema: + description: If true, the environment variable value will be decrypted + type: string + enum: + - 'true' + - 'false' + example: 'true' + deprecated: true + - name: source + description: The source that is calling the endpoint. + in: query + required: false + schema: + description: The source that is calling the endpoint. + type: string + example: vercel-cli:pull + - name: customEnvironmentId + description: The unique custom environment identifier within the project + in: query + required: false + schema: + type: string + description: The unique custom environment identifier within the project + example: env_123abc4567 + - name: customEnvironmentSlug + description: The custom environment slug (name) within the project + in: query + required: false + schema: + type: string + description: The custom environment slug (name) within the project + example: my-custom-env + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + x-speakeasy-test: false + post: + description: Create one or more environment variables for a project by passing its `key`, `value`, `type` and `target` and by specifying the project by either passing the project `id` or `name` in the URL. If you include `upsert=true` as a query parameter, a new environment variable will not be created if it already exists but, the existing variable's value will be updated. + operationId: createProjectEnv + security: + - bearerToken: [] + summary: Create one or more environment variables + tags: + - projects + responses: + '201': + description: The environment variable was created successfully + content: + application/json: + schema: + properties: + created: + properties: + target: + oneOf: + - items: + type: string + enum: + - production + - preview + - development + type: array + - type: string + enum: + - production + - preview + - development + type: + type: string + enum: + - encrypted + - plain + - secret + - sensitive + - system + sunsetSecretId: + type: string + description: This is used to identify variables that have been migrated from type secret to sensitive. + legacyValue: + type: string + description: Legacy now-encryption ciphertext, present after migration swaps value/vsmValue + decrypted: + type: boolean + enum: + - false + - true + value: + type: string + vsmValue: + type: string + id: + type: string + key: + type: string + configurationId: + nullable: true + type: string + createdAt: + type: number + updatedAt: + type: number + createdBy: + nullable: true + type: string + updatedBy: + nullable: true + type: string + gitBranch: + type: string + visibility: + type: string + enum: + - config + - secret + description: User-facing config/secret model. When set, authoritative for new code paths when the env-var-config-secret-ui flag is enabled. Legacy rows omit this field; legacy rows omit it and callers fall back to existing `type` behavior. + edgeConfigId: + nullable: true + type: string + edgeConfigTokenId: + nullable: true + type: string + contentHint: + nullable: true + oneOf: + - properties: + type: + type: string + enum: + - redis-url + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - redis-rest-api-url + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - redis-rest-api-token + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - redis-rest-api-read-only-token + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - blob-read-write-token + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - blob-store-id + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - blob-webhook-public-key + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - postgres-url + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - postgres-url-non-pooling + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - postgres-prisma-url + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - postgres-user + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - postgres-host + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - postgres-password + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - postgres-database + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - postgres-url-no-ssl + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - integration-store-secret + storeId: + type: string + integrationId: + type: string + integrationProductId: + type: string + integrationConfigurationId: + type: string + required: + - integrationConfigurationId + - integrationId + - integrationProductId + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - flags-connection-string + projectId: + type: string + required: + - projectId + - type + type: object + internalContentHint: + nullable: true + properties: + type: + type: string + enum: + - flags-secret + encryptedValue: + type: string + description: Contains the `value` of the env variable, encrypted with a special key to make decryption possible in the subscriber Lambda. + required: + - encryptedValue + - type + type: object + description: Similar to `contentHints`, but should not be exposed to the user. + comment: + type: string + customEnvironmentIds: items: - $ref: '#/components/schemas/ACLAction' + type: string type: array + system: + type: boolean + enum: + - false + - true + required: + - key + - type + - value type: object - lastRollbackTarget: + items: + properties: + target: + oneOf: + - items: + type: string + type: array + - type: string + enum: + - production + - preview + - development + type: + type: string + enum: + - encrypted + - plain + - secret + - sensitive + - system + sunsetSecretId: + type: string + description: This is used to identify variables that have been migrated from type secret to sensitive. + legacyValue: + type: string + description: Legacy now-encryption ciphertext, present after migration swaps value/vsmValue + decrypted: + type: boolean + enum: + - false + - true + value: + type: string + vsmValue: + type: string + id: + type: string + key: + type: string + configurationId: + nullable: true + type: string + createdAt: + type: number + updatedAt: + type: number + createdBy: + nullable: true + type: string + updatedBy: + nullable: true + type: string + gitBranch: + type: string + visibility: + type: string + enum: + - config + - secret + description: User-facing config/secret model. When set, authoritative for new code paths when the env-var-config-secret-ui flag is enabled. Legacy rows omit this field; legacy rows omit it and callers fall back to existing `type` behavior. + edgeConfigId: + nullable: true + type: string + edgeConfigTokenId: + nullable: true + type: string + contentHint: + nullable: true + oneOf: + - properties: + type: + type: string + enum: + - redis-url + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - redis-rest-api-url + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - redis-rest-api-token + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - redis-rest-api-read-only-token + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - blob-read-write-token + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - blob-store-id + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - blob-webhook-public-key + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - postgres-url + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - postgres-url-non-pooling + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - postgres-prisma-url + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - postgres-user + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - postgres-host + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - postgres-password + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - postgres-database + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - postgres-url-no-ssl + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - integration-store-secret + storeId: + type: string + integrationId: + type: string + integrationProductId: + type: string + integrationConfigurationId: + type: string + required: + - integrationConfigurationId + - integrationId + - integrationProductId + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - flags-connection-string + projectId: + type: string + required: + - projectId + - type + type: object + internalContentHint: + nullable: true + properties: + type: + type: string + enum: + - flags-secret + encryptedValue: + type: string + description: Contains the `value` of the env variable, encrypted with a special key to make decryption possible in the subscriber Lambda. + required: + - encryptedValue + - type + type: object + description: Similar to `contentHints`, but should not be exposed to the user. + comment: + type: string + customEnvironmentIds: + items: + type: string + type: array + system: + type: boolean + enum: + - false + - true + required: + - key + - type + - value + type: object + failed: + items: + properties: + error: + properties: + code: + type: string + message: + type: string + key: + type: string + envVarId: + type: string + envVarKey: + type: string + action: + type: string + link: + type: string + value: + oneOf: + - type: string + - items: + type: string + enum: + - production + - preview + - development + type: array + gitBranch: + type: string + target: + oneOf: + - items: + type: string + enum: + - development + - development + - preview + - preview + - production + type: array + - type: string + enum: + - production + - preview + - development + project: + type: string + required: + - code + - message + type: object + required: + - error + type: object + type: array + required: + - failed + type: object + '400': + description: |- + One of the provided values in the request body is invalid. + One of the provided values in the request query is invalid. + The environment variable coudn't be created because an ongoing update env update is already happening + The environment variable coudn't be created because project document is too large + '401': + description: The request is not authorized. + '402': + description: The account is missing a payment so payment method must be updated + '403': + description: |- + You do not have permission to access this resource. + The environment variable cannot be created because it already exists + '404': + description: '' + '409': + description: '' + '410': + description: '' + '429': + description: '' + '500': + description: '' + x-vercel-cli: + supportedSubcommands: true + supportedProduction: false + parameters: + - name: id_or_name + description: The unique project identifier or the project name + in: path + required: true + schema: + description: The unique project identifier or the project name + type: string + example: prj_XLKmu1DyR1eY7zq8UgeRKbA7yVLA + x-vercel-cli: + kind: argument + - name: upsert + description: Allow override of environment variable if it already exists + in: query + required: false + schema: + description: Allow override of environment variable if it already exists + type: string + example: 'true' + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + requestBody: + content: + application/json: + schema: + type: object + required: + - key + - value + - type + anyOf: + - required: + - target + - required: + - customEnvironmentIds + properties: + key: + description: The name of the environment variable + type: string + example: API_URL + value: + description: The value of the environment variable + type: string + example: https://api.vercel.com + type: + description: The type of environment variable + type: string + enum: + - system + - encrypted + - plain + - sensitive + example: plain + target: + description: The target environment of the environment variable + type: array + items: + enum: + - production + - preview + - development + example: + - preview + gitBranch: + description: If defined, the git branch of the environment variable (must have target=preview) + type: string + maxLength: 250 + example: feature-1 + nullable: true + comment: + type: string + description: A comment to add context on what this environment variable is for + example: database connection string for production + maxLength: 500 + customEnvironmentIds: + type: array + description: The custom environment IDs associated with the environment variable + items: + type: string + example: env_1234567890 + items: + type: object + required: + - key + - value + - type + anyOf: + - required: + - target + - required: + - customEnvironmentIds + properties: + key: + description: The name of the environment variable + type: string + example: API_URL + value: + description: The value of the environment variable + type: string + example: https://api.vercel.com + type: + description: The type of environment variable + type: string + enum: + - system + - encrypted + - plain + - sensitive + example: plain + target: + description: The target environment of the environment variable + type: array + items: + enum: + - production + - preview + - development + example: + - preview + gitBranch: + description: If defined, the git branch of the environment variable (must have target=preview) + type: string + maxLength: 250 + example: feature-1 + nullable: true + comment: + type: string + description: A comment to add context on what this environment variable is for + example: database connection string for production + maxLength: 500 + customEnvironmentIds: + type: array + description: The custom environment IDs associated with the environment variable + items: + type: string + example: env_1234567890 + required: true + /v1/projects/{id_or_name}/env/{id}: + get: + description: Retrieve the environment variable for a given project. + operationId: getProjectEnv + security: + - bearerToken: [] + summary: Retrieve the decrypted value of an environment variable of a project by id + tags: + - projects + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + decrypted: + type: boolean + enum: + - false + - true + type: + type: string + enum: + - encrypted + - plain + - secret + - sensitive + - system + edgeConfigId: nullable: true - type: object - lastAliasRequest: + type: string + edgeConfigTokenId: nullable: true - properties: - fromDeploymentId: - type: string - toDeploymentId: - type: string - jobStatus: - type: string - enum: - - succeeded - - failed - - skipped - - pending - - in-progress - requestedAt: - type: number - type: - type: string - enum: - - promote - - rollback - required: - - fromDeploymentId - - toDeploymentId - - jobStatus - - requestedAt - - type - type: object - hasFloatingAliases: - type: boolean - protectionBypass: - additionalProperties: - properties: - createdAt: - type: number - createdBy: - type: string - scope: + type: string + createdAt: + type: number + updatedAt: + type: number + id: + type: string + key: + type: string + target: + oneOf: + - items: type: string enum: - - automation-bypass - required: - - createdAt - - createdBy - - scope - type: object - type: object - hasActiveBranches: - type: boolean - trustedIps: + - development + - development + - preview + - preview + - production + type: array + - type: string + enum: + - production + - preview + - development + gitBranch: + type: string + createdBy: + nullable: true + type: string + updatedBy: + nullable: true + type: string + sunsetSecretId: + type: string + description: This is used to identify variables that have been migrated from type secret to sensitive. + legacyValue: + type: string + description: Legacy now-encryption ciphertext, present after migration swaps value/vsmValue + configurationId: + nullable: true + type: string + visibility: + type: string + enum: + - config + - secret + description: User-facing config/secret model. When set, authoritative for new code paths when the env-var-config-secret-ui flag is enabled. Legacy rows omit this field; legacy rows omit it and callers fall back to existing `type` behavior. + contentHint: nullable: true oneOf: - properties: - deploymentType: + type: + type: string + enum: + - redis-url + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - redis-rest-api-url + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - redis-rest-api-token + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - redis-rest-api-read-only-token + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - blob-read-write-token + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - blob-store-id + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - blob-webhook-public-key + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - postgres-url + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - postgres-url-non-pooling + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - postgres-prisma-url + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - postgres-user + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - postgres-host + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - postgres-password + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - postgres-database + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: type: string enum: - - all - - preview - - prod_deployment_urls_and_all_previews - - production - addresses: - items: - properties: - value: - type: string - note: - type: string - required: - - value - type: object - type: array - protectionMode: + - postgres-url-no-ssl + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: type: string enum: - - exclusive - - additional + - integration-store-secret + storeId: + type: string + integrationId: + type: string + integrationProductId: + type: string + integrationConfigurationId: + type: string required: - - deploymentType - - addresses - - protectionMode + - integrationConfigurationId + - integrationId + - integrationProductId + - storeId + - type type: object - properties: - deploymentType: + type: type: string enum: - - all - - preview - - prod_deployment_urls_and_all_previews - - production + - flags-connection-string + projectId: + type: string required: - - deploymentType + - projectId + - type type: object - gitComments: + internalContentHint: + nullable: true properties: - onPullRequest: - type: boolean - description: Whether the Vercel bot should comment on PRs - onCommit: - type: boolean - description: Whether the Vercel bot should comment on commits + type: + type: string + enum: + - flags-secret + encryptedValue: + type: string + description: Contains the `value` of the env variable, encrypted with a special key to make decryption possible in the subscriber Lambda. required: - - onPullRequest - - onCommit + - encryptedValue + - type type: object - paused: - type: boolean + description: Similar to `contentHints`, but should not be exposed to the user. + comment: + type: string + customEnvironmentIds: + items: + type: string + type: array + value: + type: string required: - - accountId - - directoryListing - - id - - name - - nodeVersion + - decrypted + - key + - type + - value type: object '400': - description: |- - One of the provided values in the request body is invalid. - One of the provided values in the request query is invalid. - Owner does not have protection add-on - Trusted IPs is only accessible for enterprise customers - Advanced Deployment Protection is not available for the user plan + description: One of the provided values in the request query is invalid. '401': - description: '' + description: The request is not authorized. '403': description: You do not have permission to access this resource. - '409': - description: |- - The provided name for the project is already being used - The project is currently being transferred. + '410': + description: '' + x-vercel-cli: + supportedSubcommands: true + supportedProduction: false parameters: - - name: idOrName + - name: id_or_name description: The unique project identifier or the project name in: path required: true schema: - example: prj_12HKQaOmR5t5Uy6vdcQsNIiZgHGB description: The unique project identifier or the project name type: string - - description: The Team identifier or slug to perform the request on behalf of. + example: prj_XLKmu1DyR1eY7zq8UgeRKbA7yVLA + x-vercel-cli: + kind: argument + - name: id + description: The unique ID for the environment variable to get the decrypted value. + in: path + required: true + schema: + description: The unique ID for the environment variable to get the decrypted value. + type: string + x-vercel-cli: + kind: argument + - description: The Team identifier to perform the request on behalf of. in: query name: teamId - required: true schema: type: string - requestBody: - content: - application/json: - schema: - additionalProperties: false - properties: - autoExposeSystemEnvs: - type: boolean - autoAssignCustomDomains: - type: boolean - autoAssignCustomDomainsUpdatedBy: - type: string - buildCommand: - description: The build command for this project. When `null` is used this value will be automatically detected - maxLength: 256 - type: string - nullable: true - commandForIgnoringBuildStep: - maxLength: 256 - type: string - nullable: true - customerSupportCodeVisibility: - description: Specifies whether customer support can see git source for a deployment - type: boolean - devCommand: - description: The dev command for this project. When `null` is used this value will be automatically detected - maxLength: 256 - type: string - nullable: true - directoryListing: - type: boolean - framework: - description: The framework that is being used for this project. When `null` is used no framework is selected - enum: - - null - - blitzjs - - nextjs - - gatsby - - remix - - astro - - hexo - - eleventy - - docusaurus-2 - - docusaurus - - preact - - solidstart - - dojo - - ember - - vue - - scully - - ionic-angular - - angular - - polymer - - svelte - - sveltekit - - sveltekit-1 - - ionic-react - - create-react-app - - gridsome - - umijs - - sapper - - saber - - stencil - - nuxtjs - - redwoodjs - - hugo - - jekyll - - brunch - - middleman - - zola - - hydrogen - - vite - - vitepress - - vuepress - - parcel - - sanity - - storybook - type: string - nullable: true - gitForkProtection: - description: Specifies whether PRs from Git forks should require a team member's authorization before it can be deployed - type: boolean - gitLFS: - description: Specifies whether Git LFS is enabled for this project. - type: boolean - installCommand: - description: The install command for this project. When `null` is used this value will be automatically detected - maxLength: 256 - type: string - nullable: true - name: - description: The desired name for the project - example: a-project-name - type: string - maxLength: 100 - pattern: '^[a-z0-9]([a-z0-9]|-[a-z0-9])*$' - nodeVersion: - enum: - - 18.x - - 16.x - - 14.x - - 12.x - - 10.x - type: string - outputDirectory: - description: The output directory of the project. When `null` is used this value will be automatically detected - maxLength: 256 - type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + /v9/projects/{id_or_name}/env/{id}: + delete: + description: Delete a specific environment variable for a given project by passing the environment variable identifier and either passing the project `id` or `name` in the URL. + operationId: removeProjectEnv + security: + - bearerToken: [] + summary: Remove an environment variable + tags: + - projects + responses: + '200': + description: The environment variable was successfully removed + content: + application/json: + schema: + items: nullable: true - passwordProtection: - additionalProperties: false - description: Allows to protect project deployments with a password properties: - deploymentType: - description: Specify if the password will apply to every Deployment Target or just Preview + type: + type: string enum: - - all - - preview - - prod_deployment_urls_and_all_previews + - encrypted + - plain + - secret + - sensitive + - system + value: type: string - password: - description: The password that will be used to protect Project Deployments - maxLength: 72 + edgeConfigId: + nullable: true + type: string + edgeConfigTokenId: + nullable: true + type: string + createdAt: + type: number + updatedAt: + type: number + id: + type: string + key: + type: string + target: + oneOf: + - items: + type: string + enum: + - development + - development + - preview + - preview + - production + type: array + - type: string + enum: + - production + - preview + - development + gitBranch: + type: string + createdBy: + nullable: true type: string + updatedBy: nullable: true - required: - - deploymentType - type: object - nullable: true - publicSource: - description: Specifies whether the source code and logs of the deployments for this project should be public or not - type: boolean - nullable: true - rootDirectory: - description: The name of a directory or relative path to the source code of your project. When `null` is used it will default to the project root - maxLength: 256 - type: string - nullable: true - serverlessFunctionRegion: - description: The region to deploy Serverless Functions in this project - maxLength: 4 - type: string - nullable: true - skipGitConnectDuringLink: - description: Opts-out of the message prompting a CLI user to connect a Git repository in `vercel link`. - type: boolean - deprecated: true - sourceFilesOutsideRootDirectory: - description: Indicates if there are source files outside of the root directory - type: boolean - ssoProtection: - additionalProperties: false - description: Ensures visitors to your Preview Deployments are logged into Vercel and have a minimum of Viewer access on your team - properties: - deploymentType: - default: preview - description: Specify if the Vercel Authentication (SSO Protection) will apply to every Deployment Target or just Preview + type: string + sunsetSecretId: + type: string + description: This is used to identify variables that have been migrated from type secret to sensitive. + legacyValue: + type: string + description: Legacy now-encryption ciphertext, present after migration swaps value/vsmValue + decrypted: + type: boolean enum: - - all - - preview - - prod_deployment_urls_and_all_previews + - false + - true + configurationId: + nullable: true + type: string + visibility: type: string - required: - - deploymentType - type: object - nullable: true - trustedIps: - additionalProperties: false - description: Restricts access to deployments based on the incoming request IP address - properties: - deploymentType: - description: Specify if the Trusted IPs will apply to every Deployment Target or just Preview enum: - - all - - preview - - production - - prod_deployment_urls_and_all_previews + - config + - secret + description: User-facing config/secret model. When set, authoritative for new code paths when the env-var-config-secret-ui flag is enabled. Legacy rows omit this field; legacy rows omit it and callers fall back to existing `type` behavior. + contentHint: + nullable: true + oneOf: + - properties: + type: + type: string + enum: + - redis-url + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - redis-rest-api-url + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - redis-rest-api-token + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - redis-rest-api-read-only-token + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - blob-read-write-token + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - blob-store-id + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - blob-webhook-public-key + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - postgres-url + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - postgres-url-non-pooling + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - postgres-prisma-url + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - postgres-user + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - postgres-host + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - postgres-password + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - postgres-database + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - postgres-url-no-ssl + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - integration-store-secret + storeId: + type: string + integrationId: + type: string + integrationProductId: + type: string + integrationConfigurationId: + type: string + required: + - integrationConfigurationId + - integrationId + - integrationProductId + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - flags-connection-string + projectId: + type: string + required: + - projectId + - type + type: object + internalContentHint: + nullable: true + properties: + type: + type: string + enum: + - flags-secret + encryptedValue: + type: string + description: Contains the `value` of the env variable, encrypted with a special key to make decryption possible in the subscriber Lambda. + required: + - encryptedValue + - type + type: object + description: Similar to `contentHints`, but should not be exposed to the user. + comment: type: string - addresses: - type: array + customEnvironmentIds: items: + type: string + type: array + required: + - key + - type + - value + type: object + type: array + properties: + system: + type: boolean + enum: + - false + - true + type: + type: string + enum: + - encrypted + - plain + - secret + - sensitive + - system + value: + type: string + edgeConfigId: + nullable: true + type: string + edgeConfigTokenId: + nullable: true + type: string + createdAt: + type: number + updatedAt: + type: number + id: + type: string + key: + type: string + target: + oneOf: + - items: + type: string + enum: + - development + - development + - preview + - preview + - production + type: array + - type: string + enum: + - production + - preview + - development + gitBranch: + type: string + createdBy: + nullable: true + type: string + updatedBy: + nullable: true + type: string + sunsetSecretId: + type: string + description: This is used to identify variables that have been migrated from type secret to sensitive. + legacyValue: + type: string + description: Legacy now-encryption ciphertext, present after migration swaps value/vsmValue + decrypted: + type: boolean + enum: + - false + - true + configurationId: + nullable: true + type: string + visibility: + type: string + enum: + - config + - secret + description: User-facing config/secret model. When set, authoritative for new code paths when the env-var-config-secret-ui flag is enabled. Legacy rows omit this field; legacy rows omit it and callers fall back to existing `type` behavior. + contentHint: + nullable: true + oneOf: + - properties: + type: + type: string + enum: + - redis-url + storeId: + type: string + required: + - storeId + - type type: object - properties: - value: + - properties: + type: type: string - description: The IP addresses that are allowlisted. Supported formats are IPv4 and CIDR. - note: + enum: + - redis-rest-api-url + storeId: type: string - description: An optional note explaining what the IP address or subnet is used for required: - - value - additionalProperties: false - minItems: 1 - protectionMode: - description: 'exclusive: ip match is enough to bypass deployment protection (regardless of other settings). additional: ip must match + any other protection should be also provided (password, vercel auth, shareable link, automation bypass header, automation bypass query param)' - enum: - - exclusive - - additional + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - redis-rest-api-token + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - redis-rest-api-read-only-token + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - blob-read-write-token + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - blob-store-id + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - blob-webhook-public-key + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - postgres-url + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - postgres-url-non-pooling + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - postgres-prisma-url + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - postgres-user + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - postgres-host + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - postgres-password + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - postgres-database + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - postgres-url-no-ssl + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - integration-store-secret + storeId: + type: string + integrationId: + type: string + integrationProductId: + type: string + integrationConfigurationId: + type: string + required: + - integrationConfigurationId + - integrationId + - integrationProductId + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - flags-connection-string + projectId: + type: string + required: + - projectId + - type + type: object + internalContentHint: + nullable: true + properties: + type: + type: string + enum: + - flags-secret + encryptedValue: + type: string + description: Contains the `value` of the env variable, encrypted with a special key to make decryption possible in the subscriber Lambda. + required: + - encryptedValue + - type + type: object + description: Similar to `contentHints`, but should not be exposed to the user. + comment: + type: string + customEnvironmentIds: + items: type: string - required: - - deploymentType - - addresses - - protectionMode - type: object - nullable: true - enablePreviewFeedback: - description: Opt-in to Preview comments on the project level - type: boolean - nullable: true - type: object - delete: - description: Delete a specific project by passing either the project `id` or `name` in the URL. - operationId: deleteProject - security: - - bearerToken: [] - summary: Delete a Project - tags: - - projects - responses: - '204': - description: The project was successfuly removed + type: array + required: + - key + - type + - value + nullable: true '400': description: One of the provided values in the request query is invalid. '401': - description: '' + description: The request is not authorized. '403': description: You do not have permission to access this resource. + '404': + description: '' '409': + description: The project is being transfered and removing an environment variable is not possible + '410': description: '' + x-vercel-cli: + supportedSubcommands: true + supportedProduction: false parameters: - - name: idOrName + - name: id_or_name description: The unique project identifier or the project name in: path required: true schema: - example: prj_12HKQaOmR5t5Uy6vdcQsNIiZgHGB description: The unique project identifier or the project name type: string - - description: The Team identifier or slug to perform the request on behalf of. + example: prj_XLKmu1DyR1eY7zq8UgeRKbA7yVLA + x-vercel-cli: + kind: argument + - name: id + description: The unique environment variable identifier + in: path + required: true + schema: + description: The unique environment variable identifier + type: string + example: XMbOEya1gUUO1ir4 + x-vercel-cli: + kind: argument + - name: customEnvironmentId + description: The unique custom environment identifier within the project + in: query + required: false + schema: + type: string + description: The unique custom environment identifier within the project + example: env_123abc4567 + - description: The Team identifier to perform the request on behalf of. in: query name: teamId - required: true schema: type: string - '/v9/projects/{idOrName}/domains': - get: - description: Retrieve the domains associated with a given project by passing either the project `id` or `name` in the URL. - operationId: getProjectDomains + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + patch: + description: Edit a specific environment variable for a given project by passing the environment variable identifier and either passing the project `id` or `name` in the URL. + operationId: editProjectEnv security: - bearerToken: [] - summary: Retrieve project domains by project by id or name + summary: Edit an environment variable tags: - projects responses: '200': - description: Successful response retrieving a list of domains + description: '' content: application/json: schema: + nullable: true properties: - domains: + type: + type: string + enum: + - encrypted + - plain + - secret + - sensitive + - system + value: + type: string + edgeConfigId: + nullable: true + type: string + edgeConfigTokenId: + nullable: true + type: string + createdAt: + type: number + updatedAt: + type: number + id: + type: string + key: + type: string + target: items: - properties: - name: - type: string - apexName: - type: string - projectId: - type: string - redirect: - nullable: true - type: string - redirectStatusCode: - nullable: true - type: number - enum: - - 307 - - 301 - - 302 - - 308 - gitBranch: - nullable: true - type: string - updatedAt: - type: number - createdAt: - type: number - verified: - type: boolean - description: '`true` if the domain is verified for use with the project. If `false` it will not be used as an alias on this project until the challenge in `verification` is completed.' - verification: - items: - properties: - type: - type: string - domain: - type: string - value: - type: string - reason: - type: string - required: - - type - - domain - - value - - reason - type: object - description: 'A list of verification challenges, one of which must be completed to verify the domain for use on the project. After the challenge is complete `POST /projects/:idOrName/domains/:domain/verify` to verify the domain. Possible challenges: - If `verification.type = TXT` the `verification.domain` will be checked for a TXT record matching `verification.value`.' - type: array - description: 'A list of verification challenges, one of which must be completed to verify the domain for use on the project. After the challenge is complete `POST /projects/:idOrName/domains/:domain/verify` to verify the domain. Possible challenges: - If `verification.type = TXT` the `verification.domain` will be checked for a TXT record matching `verification.value`.' - required: - - name - - apexName - - projectId - - verified - type: object + type: string + enum: + - development + - development + - preview + - preview + - production + type: array + enum: + - development + - development + - preview + - preview + - production + gitBranch: + type: string + createdBy: + nullable: true + type: string + updatedBy: + nullable: true + type: string + sunsetSecretId: + type: string + description: This is used to identify variables that have been migrated from type secret to sensitive. + legacyValue: + type: string + description: Legacy now-encryption ciphertext, present after migration swaps value/vsmValue + decrypted: + type: boolean + enum: + - false + - true + configurationId: + nullable: true + type: string + visibility: + type: string + enum: + - config + - secret + description: User-facing config/secret model. When set, authoritative for new code paths when the env-var-config-secret-ui flag is enabled. Legacy rows omit this field; legacy rows omit it and callers fall back to existing `type` behavior. + contentHint: + nullable: true + properties: + type: + type: string + enum: + - redis-url + storeId: + type: string + integrationId: + type: string + integrationProductId: + type: string + integrationConfigurationId: + type: string + projectId: + type: string + required: + - storeId + - type + - integrationConfigurationId + - integrationId + - integrationProductId + - projectId + type: object + internalContentHint: + nullable: true + properties: + type: + type: string + enum: + - flags-secret + encryptedValue: + type: string + description: Contains the `value` of the env variable, encrypted with a special key to make decryption possible in the subscriber Lambda. + required: + - encryptedValue + - type + type: object + description: Similar to `contentHints`, but should not be exposed to the user. + comment: + type: string + customEnvironmentIds: + items: + type: string type: array - pagination: - $ref: '#/components/schemas/Pagination' required: - - domains - - pagination + - key + - type + - value type: object '400': - description: One of the provided values in the request query is invalid. + description: |- + One of the provided values in the request body is invalid. + One of the provided values in the request query is invalid. + At least one environment variable failed validation '401': - description: '' + description: The request is not authorized. '403': description: You do not have permission to access this resource. + '404': + description: '' + '409': + description: The project is being transfered and removing an environment variable is not possible + '410': + description: '' + '429': + description: '' + '500': + description: '' + x-vercel-cli: + supportedSubcommands: true + supportedProduction: false parameters: - - name: idOrName + - name: id_or_name description: The unique project identifier or the project name in: path required: true schema: description: The unique project identifier or the project name - oneOf: - - type: string - - type: integer - - name: production - description: Filters only production domains when set to `true`. - in: query - required: false - schema: - default: 'false' - description: Filters only production domains when set to `true`. - enum: - - 'true' - - 'false' - - name: gitBranch - description: Filters domains based on specific branch. - in: query - required: false - schema: - description: Filters domains based on specific branch. type: string - - name: redirects - description: Excludes redirect project domains when \"false\". Includes redirect project domains when \"true\" (default). - in: query - required: false - schema: - default: 'true' - description: Excludes redirect project domains when \"false\". Includes redirect project domains when \"true\" (default). - enum: - - 'true' - - 'false' - - name: redirect - description: Filters domains based on their redirect target. - in: query - required: false + example: prj_XLKmu1DyR1eY7zq8UgeRKbA7yVLA + x-vercel-cli: + kind: argument + - name: id + description: The unique environment variable identifier + in: path + required: true schema: - description: Filters domains based on their redirect target. + description: The unique environment variable identifier type: string - example: example.com - - name: verified - description: Filters domains based on their verification status. - in: query - required: false - schema: - description: Filters domains based on their verification status. - enum: - - 'true' - - 'false' - - name: limit - description: Maximum number of domains to list from a request (max 100). - in: query - required: false - schema: - description: Maximum number of domains to list from a request (max 100). - type: number - example: 20 - - name: since - description: Get domains created after this JavaScript timestamp. - in: query - required: false - schema: - description: Get domains created after this JavaScript timestamp. - type: number - example: 1609499532000 - - name: until - description: Get domains created before this JavaScript timestamp. - in: query - required: false - schema: - description: Get domains created before this JavaScript timestamp. - type: number - example: 1612264332000 - - name: order - description: Domains sort order by createdAt - in: query - required: false - schema: - default: DESC - description: Domains sort order by createdAt - enum: - - ASC - - DESC - - description: The Team identifier or slug to perform the request on behalf of. + example: XMbOEya1gUUO1ir4 + x-vercel-cli: + kind: argument + - description: The Team identifier to perform the request on behalf of. in: query name: teamId - required: true schema: type: string - '/v9/projects/{idOrName}/domains/{domain}': - get: - description: Get project domain by project id/name and domain name. - operationId: getProjectDomain + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + requestBody: + content: + application/json: + schema: + type: object + additionalProperties: false + properties: + key: + description: The name of the environment variable + type: string + example: GITHUB_APP_ID + target: + description: The target environment of the environment variable + type: array + items: + enum: + - production + - preview + - development + example: + - preview + gitBranch: + description: If defined, the git branch of the environment variable (must have target=preview) + type: string + maxLength: 250 + example: feature-1 + nullable: true + type: + description: The type of environment variable + type: string + enum: + - system + - encrypted + - plain + - sensitive + example: plain + value: + description: The value of the environment variable + type: string + example: bkWIjbnxcvo78 + customEnvironmentIds: + type: array + description: The custom environments that the environment variable should be synced to + items: + type: string + example: env_1234567890 + comment: + type: string + description: A comment to add context on what this env var is for + example: database connection string for production + maxLength: 500 + required: true + x-speakeasy-test: false + /v1/projects/{id_or_name}/env: + delete: + description: Delete multiple environment variables for a given project in a single batch operation. + operationId: batchRemoveProjectEnv security: - bearerToken: [] - summary: Get a project domain + summary: Batch remove environment variables tags: - projects responses: @@ -8920,2978 +28803,6210 @@ paths: application/json: schema: properties: - name: - type: string - apexName: - type: string - projectId: - type: string - redirect: - nullable: true - type: string - redirectStatusCode: - nullable: true - type: number - enum: - - 307 - - 301 - - 302 - - 308 - gitBranch: - nullable: true - type: string - updatedAt: - type: number - createdAt: + deleted: type: number - verified: - type: boolean - description: '`true` if the domain is verified for use with the project. If `false` it will not be used as an alias on this project until the challenge in `verification` is completed.' - verification: + ids: items: - properties: - type: - type: string - domain: - type: string - value: - type: string - reason: - type: string - required: - - type - - domain - - value - - reason - type: object - description: 'A list of verification challenges, one of which must be completed to verify the domain for use on the project. After the challenge is complete `POST /projects/:idOrName/domains/:domain/verify` to verify the domain. Possible challenges: - If `verification.type = TXT` the `verification.domain` will be checked for a TXT record matching `verification.value`.' + type: string type: array - description: 'A list of verification challenges, one of which must be completed to verify the domain for use on the project. After the challenge is complete `POST /projects/:idOrName/domains/:domain/verify` to verify the domain. Possible challenges: - If `verification.type = TXT` the `verification.domain` will be checked for a TXT record matching `verification.value`.' required: - - name - - apexName - - projectId - - verified + - deleted + - ids type: object '400': - description: One of the provided values in the request query is invalid. + description: |- + One of the provided values in the request body is invalid. + One of the provided values in the request query is invalid. '401': - description: '' + description: The request is not authorized. '403': description: You do not have permission to access this resource. + '404': + description: '' + '409': + description: '' + '410': + description: '' parameters: - - name: idOrName + - name: id_or_name description: The unique project identifier or the project name in: path required: true schema: description: The unique project identifier or the project name type: string - - name: domain - description: The project domain name - in: path - required: true + example: prj_XLKmu1DyR1eY7zq8UgeRKbA7yVLA + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId schema: - description: The project domain name type: string - example: www.example.com - - description: The Team identifier or slug to perform the request on behalf of. + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. in: query - name: teamId - required: true + name: slug schema: type: string - patch: - description: 'Update a project domain''s configuration, including the name, git branch and redirect of the domain.' - operationId: updateProjectDomain + example: my-team-url-slug + requestBody: + content: + application/json: + schema: + type: object + required: + - ids + properties: + ids: + description: Array of environment variable IDs to delete + type: array + items: + type: string + minItems: 1 + maxItems: 1000 + additionalProperties: false + /projects/{id_or_name}/transfer-request: + post: + description: 'Initiates a project transfer request from one team to another.
Returns a `code` that remains valid for 24 hours and can be used to accept the transfer request by another team using the `PUT /projects/transfer-request/:code` endpoint.
Users can also accept the project transfer request using the claim URL: `https://vercel.com/claim-deployment?code=&returnUrl=`.
The `code` parameter specifies the project transfer request code generated using this endpoint.
The `returnUrl` parameter redirects users to a specific page of the application if the claim URL is invalid or expired.' + operationId: createProjectTransferRequest security: - bearerToken: [] - summary: Update a project domain + summary: Create project transfer request tags: - projects responses: '200': - description: The domain was updated successfuly + description: The project transfer request has been initiated successfully. content: application/json: schema: properties: - name: - type: string - apexName: - type: string - projectId: - type: string - redirect: - nullable: true - type: string - redirectStatusCode: - nullable: true - type: number - enum: - - 307 - - 301 - - 302 - - 308 - gitBranch: - nullable: true + code: type: string - updatedAt: - type: number - createdAt: - type: number - verified: - type: boolean - description: '`true` if the domain is verified for use with the project. If `false` it will not be used as an alias on this project until the challenge in `verification` is completed.' - verification: - items: - properties: - type: - type: string - domain: - type: string - value: - type: string - reason: - type: string - required: - - type - - domain - - value - - reason - type: object - description: 'A list of verification challenges, one of which must be completed to verify the domain for use on the project. After the challenge is complete `POST /projects/:idOrName/domains/:domain/verify` to verify the domain. Possible challenges: - If `verification.type = TXT` the `verification.domain` will be checked for a TXT record matching `verification.value`.' - type: array - description: 'A list of verification challenges, one of which must be completed to verify the domain for use on the project. After the challenge is complete `POST /projects/:idOrName/domains/:domain/verify` to verify the domain. Possible challenges: - If `verification.type = TXT` the `verification.domain` will be checked for a TXT record matching `verification.value`.' required: - - name - - apexName - - projectId - - verified + - code type: object '400': description: |- One of the provided values in the request body is invalid. One of the provided values in the request query is invalid. - The domain redirect is not valid '401': - description: '' + description: The request is not authorized. '403': description: You do not have permission to access this resource. '409': - description: The project is currently being transferred + description: '' + '410': + description: '' parameters: - - name: idOrName - description: The unique project identifier or the project name + - name: id_or_name + description: The ID or name of the project to transfer. in: path required: true schema: - description: The unique project identifier or the project name type: string - - name: domain - description: The project domain name - in: path - required: true + description: The ID or name of the project to transfer. + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId schema: - description: The project domain name type: string - example: www.example.com - - description: The Team identifier or slug to perform the request on behalf of. + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. in: query - name: teamId - required: true + name: slug schema: type: string + example: my-team-url-slug requestBody: content: application/json: schema: + type: object properties: - gitBranch: - description: Git branch to link the project domain - example: null + callbackUrl: type: string - maxLength: 250 - nullable: true - redirect: - description: Target destination domain for redirect - example: foobar.com + description: The URL to send a webhook to when the transfer is accepted. + callbackSecret: type: string - nullable: true - redirectStatusCode: - description: Status code for domain redirect - example: 307 - type: integer - enum: - - null - - 301 - - 302 - - 307 - - 308 - nullable: true - type: object - delete: - description: Remove a domain from a project by passing the domain name and by specifying the project by either passing the project `id` or `name` in the URL. - operationId: removeProjectDomain + description: The secret to use to sign the webhook payload with HMAC-SHA256. + /projects/transfer-request/{code}: + put: + description: Accept a project transfer request initated by another team.
The `code` is generated using the `POST /projects/:idOrName/transfer-request` endpoint. + operationId: acceptProjectTransferRequest security: - bearerToken: [] - summary: Remove a domain from a project + summary: Accept project transfer request tags: - projects responses: - '200': - description: The domain was succesfully removed from the project + '202': + description: The project has been transferred successfully. content: application/json: schema: + properties: + partnerCalls: + items: + properties: + installationId: + type: string + resourceIds: + items: + type: string + type: array + result: + properties: + status: + type: string + enum: + - errored + - fulfilled + error: + type: string + description: (opaque JSON object) + code: + type: string + required: + - status + type: object + required: + - installationId + - resourceIds + - result + type: object + type: array + resourceTransferErrors: + items: + type: string + description: (opaque JSON object) + type: array + transferredStoreIds: + items: + type: string + type: array + required: + - partnerCalls + - resourceTransferErrors + - transferredStoreIds type: object '400': - description: One of the provided values in the request query is invalid. + description: |- + One of the provided values in the request body is invalid. + One of the provided values in the request query is invalid. '401': - description: '' + description: The request is not authorized. '403': description: You do not have permission to access this resource. '404': description: '' - '409': - description: The project is currently being transferred + '410': + description: '' + '422': + description: '' parameters: - - name: idOrName - description: The unique project identifier or the project name + - name: code + description: The code of the project transfer request. in: path required: true schema: - description: The unique project identifier or the project name type: string - - name: domain - description: The project domain name - in: path - required: true + description: The code of the project transfer request. + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId schema: - description: The project domain name type: string - example: www.example.com - - description: The Team identifier or slug to perform the request on behalf of. + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. in: query - name: teamId - required: true + name: slug schema: type: string - '/v10/projects/{idOrName}/domains': - post: - description: 'Add a domain to the project by passing its domain name and by specifying the project by either passing the project `id` or `name` in the URL. If the domain is not yet verified to be used on this project, the request will return `verified = false`, and the domain will need to be verified according to the `verification` challenge via `POST /projects/:idOrName/domains/:domain/verify`. If the domain already exists on the project, the request will fail with a `400` status code.' - operationId: addProjectDomain + example: my-team-url-slug + requestBody: + content: + application/json: + schema: + type: object + additionalProperties: false + properties: + newProjectName: + description: The desired name for the project + example: a-project-name + type: string + maxLength: 100 + paidFeatures: + type: object + additionalProperties: false + properties: + concurrentBuilds: + type: integer + nullable: true + passwordProtection: + type: boolean + nullable: true + previewDeploymentSuffix: + type: boolean + nullable: true + acceptedPolicies: + type: object + additionalProperties: + type: object + additionalProperties: + type: string + format: date-time + required: + - eula + - privacy + properties: + eula: + type: string + format: date-time + privacy: + type: string + format: date-time + /v1/projects/{id_or_name}/protection-bypass: + patch: + description: Update the deployment protection automation bypass for a project + operationId: updateProjectProtectionBypass security: - bearerToken: [] - summary: Add a domain to a project + summary: Update Protection Bypass for Automation tags: - projects responses: '200': - description: The domain was successfully added to the project + description: '' content: application/json: schema: properties: - name: - type: string - apexName: - type: string - projectId: - type: string - redirect: - nullable: true - type: string - redirectStatusCode: - nullable: true - type: number - enum: - - 307 - - 301 - - 302 - - 308 - gitBranch: - nullable: true - type: string - updatedAt: - type: number - createdAt: - type: number - verified: - type: boolean - description: '`true` if the domain is verified for use with the project. If `false` it will not be used as an alias on this project until the challenge in `verification` is completed.' - verification: - items: - properties: - type: - type: string - domain: - type: string - value: - type: string - reason: - type: string - required: - - type - - domain - - value - - reason - type: object - description: 'A list of verification challenges, one of which must be completed to verify the domain for use on the project. After the challenge is complete `POST /projects/:idOrName/domains/:domain/verify` to verify the domain. Possible challenges: - If `verification.type = TXT` the `verification.domain` will be checked for a TXT record matching `verification.value`.' - type: array - description: 'A list of verification challenges, one of which must be completed to verify the domain for use on the project. After the challenge is complete `POST /projects/:idOrName/domains/:domain/verify` to verify the domain. Possible challenges: - If `verification.type = TXT` the `verification.domain` will be checked for a TXT record matching `verification.value`.' - required: - - name - - apexName - - projectId - - verified + protectionBypass: + additionalProperties: + oneOf: + - properties: + createdAt: + type: number + createdBy: + type: string + scope: + type: string + enum: + - integration-automation-bypass + integrationId: + type: string + configurationId: + type: string + required: + - configurationId + - createdAt + - createdBy + - integrationId + - scope + type: object + - properties: + createdAt: + type: number + createdBy: + type: string + scope: + type: string + enum: + - automation-bypass + isEnvVar: + type: boolean + enum: + - false + - true + description: When there was only one bypass, it was automatically set as an env var on deployments. With multiple bypasses, there is always one bypass that is selected as the default, and gets set as an env var on deployments. As this is a new field, undefined means that the bypass is the env var. If there are any automation bypasses, exactly one must be the env var. + note: + type: string + description: Optional note about the bypass to be displayed in the UI + required: + - createdAt + - createdBy + - scope + type: object + type: object type: object '400': description: |- One of the provided values in the request body is invalid. One of the provided values in the request query is invalid. - The domain is not valid - You can't set both a git branch and a redirect for the domain - The domain can not be added because the latest production deployment for the project was not successful - The domain redirect is not valid - A domain cannot redirect to itself - You can not set the production branch as a branch for your domain '401': - description: '' - '402': - description: |- - The account was soft-blocked for an unhandled reason. - The account is missing a payment so payment method must be updated + description: The request is not authorized. '403': - description: |- - You do not have permission to access this resource. - You don't have access to the domain you are adding + description: You do not have permission to access this resource. + '404': + description: '' '409': - description: |- - The domain is already assigned to another Vercel project - Cannot create project domain since owner already has `domain` on their account - Cannot create project domain if the current verified domain - The project is currently being transferred + description: '' + '410': + description: '' parameters: - - name: idOrName + - name: id_or_name description: The unique project identifier or the project name in: path required: true schema: description: The unique project identifier or the project name type: string - - description: The Team identifier or slug to perform the request on behalf of. + - description: The Team identifier to perform the request on behalf of. in: query name: teamId - required: true schema: type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug requestBody: content: application/json: schema: - properties: - name: - description: The project domain name - example: www.example.com - type: string - gitBranch: - description: Git branch to link the project domain - example: null - maxLength: 250 - type: string - nullable: true - redirect: - description: Target destination domain for redirect - example: foobar.com - type: string - nullable: true - redirectStatusCode: - description: Status code for domain redirect - example: 307 - type: integer - enum: - - null - - 301 - - 302 - - 307 - - 308 - nullable: true - required: - - name type: object - '/v9/projects/{idOrName}/domains/{domain}/verify': - post: - description: Attempts to verify a project domain with `verified = false` by checking the correctness of the project domain's `verification` challenge. - operationId: verifyProjectDomain - security: - - bearerToken: [] - summary: Verify project domain - tags: - - projects - responses: - '200': - description: |- - The project domain was verified successfully - Domain is already verified - content: - application/json: - schema: - properties: - name: - type: string - apexName: - type: string - projectId: - type: string - redirect: - nullable: true - type: string - redirectStatusCode: - nullable: true - type: number - enum: - - 307 - - 301 - - 302 - - 308 - gitBranch: - nullable: true - type: string - updatedAt: - type: number - createdAt: - type: number - verified: - type: boolean - description: '`true` if the domain is verified for use with the project. If `false` it will not be used as an alias on this project until the challenge in `verification` is completed.' - verification: - items: - properties: - type: - type: string - domain: - type: string - value: - type: string - reason: - type: string - required: - - type - - domain - - value - - reason - type: object - description: 'A list of verification challenges, one of which must be completed to verify the domain for use on the project. After the challenge is complete `POST /projects/:idOrName/domains/:domain/verify` to verify the domain. Possible challenges: - If `verification.type = TXT` the `verification.domain` will be checked for a TXT record matching `verification.value`.' - type: array - description: 'A list of verification challenges, one of which must be completed to verify the domain for use on the project. After the challenge is complete `POST /projects/:idOrName/domains/:domain/verify` to verify the domain. Possible challenges: - If `verification.type = TXT` the `verification.domain` will be checked for a TXT record matching `verification.value`.' - required: - - name - - apexName - - projectId - - verified - type: object + properties: + revoke: + description: Optional instructions for revoking and regenerating a automation bypass + type: object + properties: + secret: + description: Automation bypass to revoked + type: string + regenerate: + description: Whether or not a new automation bypass should be created after the provided secret is revoked + type: boolean + required: + - secret + - regenerate + generate: + description: Generate a new secret. If neither generate or revoke are provided, a new random secret will be generated. + type: object + properties: + secret: + description: Optional value of the secret to generate, don't send it for oauth2 tokens + type: string + pattern: ^[a-zA-Z0-9]{32}$ + note: + type: string + description: Note to be displayed in the UI for this bypass + maxLength: 100 + update: + description: Update an existing bypass + type: object + required: + - secret + properties: + secret: + description: Automation bypass to updated + type: string + isEnvVar: + type: boolean + description: Whether or not this bypass is set as the VERCEL_AUTOMATION_BYPASS_SECRET environment variable on deployments + note: + type: string + description: Note to be displayed in the UI for this bypass + maxLength: 100 + additionalProperties: false + required: true + /v1/projects/{project_id}/rollback/{deployment_id}: + post: + description: Allows users to rollback to a deployment. + operationId: requestRollback + security: + - bearerToken: [] + summary: Point production traffic to a previous production deployment by ID + tags: + - projects + responses: + '201': + description: '' '400': - description: |- - One of the provided values in the request query is invalid. - There is an existing TXT record on the domain verifying it for another project - The domain does not have a TXT record that attempts to verify the project domain - The TXT record on the domain does not match the expected challenge for the project domain - Project domain is not assigned to project + description: One of the provided values in the request query is invalid. '401': + description: The request is not authorized. + '402': description: '' '403': description: You do not have permission to access this resource. + '409': + description: '' + '410': + description: '' + '422': + description: '' parameters: - - name: idOrName - description: The unique project identifier or the project name + - name: project_id in: path required: true schema: - example: prj_12HKQaOmR5t5Uy6vdcQsNIiZgHGB - description: The unique project identifier or the project name type: string - - name: domain - description: The domain name you want to verify + - name: deployment_id + description: The ID of the deployment to rollback *to* in: path required: true schema: - description: The domain name you want to verify type: string - example: example.com - - description: The Team identifier or slug to perform the request on behalf of. + description: The ID of the deployment to rollback *to* + - name: description + description: The reason for the rollback + in: query + required: false + schema: + type: string + description: The reason for the rollback + - description: The Team identifier to perform the request on behalf of. in: query name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + /v1/projects/{project_id}/rollback/{deployment_id}/update-description: + patch: + description: Updates the reason for a rollback, without changing the rollback status itself. + operationId: updateProjectsByProjectIdRollbackByDeploymentIdUpdateDescription + security: [] + summary: Updates the description for a rollback + tags: + - projects + responses: + '200': + description: '' + '400': + description: |- + One of the provided values in the request body is invalid. + One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '409': + description: '' + '410': + description: '' + '422': + description: '' + parameters: + - name: project_id + in: path required: true schema: type: string - '/v9/projects/{idOrName}/env': - get: - description: Retrieve the environment variables for a given project by passing either the project `id` or `name` in the URL. - operationId: filterProjectEnvs + - name: deployment_id + in: path + required: true + schema: + type: string + requestBody: + content: + application/json: + schema: + type: object + properties: + description: + type: string + description: The reason for the rollback + /v1/projects/{project_id}/microfrontends: + patch: + description: Update the microfrontends settings for a project. + operationId: updateMicrofrontends security: - bearerToken: [] - summary: Retrieve the environment variables of a project by id or name + summary: Update the microfrontends settings tags: - projects responses: '200': - description: The list of environment variables for the given project + description: '' content: application/json: schema: - oneOf: - - properties: - target: - oneOf: - - items: - type: string - enum: - - production - - preview - - development - - preview - - development - type: array - - type: string - enum: - - production - - preview - - development - - preview - - development + properties: + accountId: + type: string + creator: + properties: type: type: string enum: - - secret - - system - - encrypted - - plain - - sensitive - id: - type: string - key: - type: string - value: - type: string - configurationId: - nullable: true - type: string - createdAt: - type: number - updatedAt: - type: number - createdBy: - nullable: true - type: string - updatedBy: - nullable: true - type: string - gitBranch: - type: string - edgeConfigId: - nullable: true - type: string - edgeConfigTokenId: - nullable: true - type: string - contentHint: + - user + via: nullable: true oneOf: - properties: type: type: string enum: - - redis-url - storeId: - type: string - required: - - type - - storeId - type: object - - properties: - type: - type: string - enum: - - redis-rest-api-url - storeId: - type: string - required: - - type - - storeId - type: object - - properties: - type: - type: string - enum: - - redis-rest-api-token - storeId: - type: string - required: - - type - - storeId - type: object - - properties: - type: - type: string - enum: - - redis-rest-api-read-only-token - storeId: - type: string - required: - - type - - storeId - type: object - - properties: - type: - type: string - enum: - - blob-read-write-token - storeId: - type: string - required: - - type - - storeId - type: object - - properties: - type: - type: string - enum: - - postgres-url - storeId: - type: string - required: - - type - - storeId - type: object - - properties: - type: - type: string - enum: - - postgres-url-non-pooling - storeId: - type: string - required: - - type - - storeId - type: object - - properties: - type: - type: string - enum: - - postgres-prisma-url - storeId: - type: string - required: - - type - - storeId - type: object - - properties: - type: - type: string - enum: - - postgres-user - storeId: - type: string - required: - - type - - storeId - type: object - - properties: - type: - type: string - enum: - - postgres-host - storeId: - type: string - required: - - type - - storeId - type: object - - properties: - type: - type: string - enum: - - postgres-password - storeId: - type: string + - app + app: + properties: + id: + type: string + description: The internal ID of the Vercel App backing this principal. + clientId: + type: string + description: The protocol-facing OAuth client ID. This may differ from {@link id} when Client ID Metadata Documents (CIMD) are used. + required: + - id + type: object required: + - app - type - - storeId type: object + description: Set when a Vercel App or Integration acts on behalf of a {@link User}. Captures user-consented OAuth delegation that the ACL layer may inspect to evaluate scope restrictions. This is NOT for impersonation or token-exchange provenance — those live on `auth.token`, not on the principal. - properties: type: type: string enum: - - postgres-database - storeId: - type: string + - integration + integration: + properties: + integrationId: + type: string + configurationId: + type: string + required: + - configurationId + - integrationId + type: object required: + - integration - type - - storeId type: object - decrypted: - type: boolean - description: Whether `value` is decrypted. - system: - type: boolean + description: Set when a Vercel App or Integration acts on behalf of a {@link User}. Captures user-consented OAuth delegation that the ACL layer may inspect to evaluate scope restrictions. This is NOT for impersonation or token-exchange provenance — those live on `auth.token`, not on the principal. + user: + properties: + id: + type: string + required: + - id + type: object + app: + properties: + id: + type: string + description: The internal ID of the Vercel App backing this principal. + clientId: + type: string + description: The protocol-facing OAuth client ID. This may differ from {@link id} when Client ID Metadata Documents (CIMD) are used. + required: + - id + type: object + integration: + properties: + integrationId: + type: string + configurationId: + type: string + required: + - configurationId + - integrationId + type: object + required: + - type + - user + - via + - app + - integration type: object - - properties: - envs: - items: + alias: + items: + properties: + configuredBy: + nullable: true + type: string + enum: + - A + - CNAME + - dns-01 + - http + - null + configuredChangedAt: + nullable: true + type: number + createdAt: + nullable: true + type: number + deployment: + nullable: true properties: - target: + id: + type: string + alias: + items: + type: string + type: array + aliasAssigned: + nullable: true oneOf: - - items: - type: string - enum: - - production - - preview - - development - - preview - - development - type: array - - type: string + - type: number + - type: boolean enum: - - production - - preview - - development - - preview - - development - type: - type: string - enum: - - secret - - system - - encrypted - - plain - - sensitive - id: + - false + - true + aliasError: + nullable: true + properties: + code: + type: string + message: + type: string + required: + - code + - message + type: object + aliasFinal: + nullable: true type: string - key: + automaticAliases: + items: + type: string + type: array + branchMatcher: + properties: + type: + type: string + enum: + - endsWith + - equals + - startsWith + description: The type of matching to perform + pattern: + type: string + description: The pattern to match against branch names + required: + - pattern + - type + type: object + buildingAt: + type: number + builds: + items: + properties: + use: + type: string + src: + type: string + dest: + type: string + required: + - use + type: object + type: array + checksConclusion: type: string - value: + enum: + - canceled + - failed + - skipped + - succeeded + checksState: type: string - configurationId: - nullable: true + enum: + - completed + - registered + - running + connectBuildsEnabled: + type: boolean + enum: + - false + - true + connectConfigurationId: type: string createdAt: type: number - updatedAt: - type: number - createdBy: - nullable: true + createdIn: type: string - updatedBy: + creator: nullable: true + properties: + email: + type: string + githubLogin: + type: string + gitlabLogin: + type: string + uid: + type: string + username: + type: string + required: + - email + - uid + - username + type: object + deletedAt: + type: number + deploymentHostname: type: string - gitBranch: - type: string - edgeConfigId: - nullable: true + forced: + type: boolean + enum: + - false + - true + name: type: string - edgeConfigTokenId: + meta: + additionalProperties: + type: string + type: object + monorepoManager: nullable: true type: string - contentHint: - nullable: true - oneOf: - - properties: - type: - type: string - enum: - - redis-url - storeId: - type: string - required: - - type - - storeId - type: object - - properties: - type: - type: string - enum: - - redis-rest-api-url - storeId: - type: string - required: - - type - - storeId - type: object - - properties: - type: - type: string - enum: - - redis-rest-api-token - storeId: - type: string - required: - - type - - storeId - type: object - - properties: - type: - type: string - enum: - - redis-rest-api-read-only-token - storeId: - type: string - required: - - type - - storeId - type: object - - properties: - type: - type: string - enum: - - blob-read-write-token - storeId: - type: string - required: - - type - - storeId - type: object - - properties: - type: - type: string - enum: - - postgres-url - storeId: - type: string - required: - - type - - storeId - type: object - - properties: - type: - type: string - enum: - - postgres-url-non-pooling - storeId: - type: string - required: - - type - - storeId - type: object - - properties: - type: - type: string - enum: - - postgres-prisma-url - storeId: - type: string - required: - - type - - storeId - type: object - - properties: - type: - type: string - enum: - - postgres-user - storeId: - type: string - required: - - type - - storeId - type: object - - properties: - type: - type: string - enum: - - postgres-host - storeId: - type: string - required: - - type - - storeId - type: object - - properties: - type: - type: string - enum: - - postgres-password - storeId: - type: string - required: - - type - - storeId - type: object - - properties: - type: - type: string - enum: - - postgres-database - storeId: - type: string - required: - - type - - storeId - type: object - decrypted: - type: boolean - description: Whether `value` is decrypted. - system: - type: boolean - type: object - type: array - pagination: - $ref: '#/components/schemas/Pagination' - required: - - envs - - pagination - type: object - - properties: - envs: - items: - properties: - target: - oneOf: - - items: + oidcTokenClaims: + properties: + iss: + type: string + sub: + type: string + scope: + type: string + aud: + type: string + owner: + type: string + owner_id: + type: string + project: + type: string + project_id: + type: string + environment: + type: string + custom_environment_id: + type: string + mfe_group_ids: + items: type: string - enum: - - production - - preview - - development - - preview - - development - type: array - - type: string - enum: - - production - - preview - - development - - preview - - development - type: + type: array + plan: + type: string + required: + - aud + - environment + - iss + - owner + - owner_id + - project + - project_id + - scope + - sub + type: object + plan: type: string enum: - - secret - - system - - encrypted - - plain - - sensitive - id: - type: string - key: - type: string - value: + - enterprise + - hobby + - pro + previewCommentsEnabled: + type: boolean + enum: + - false + - true + description: Whether or not preview comments are enabled for the deployment + example: false + private: + type: boolean + enum: + - false + - true + readyAt: + type: number + readyState: type: string - configurationId: - nullable: true + enum: + - BLOCKED + - BUILDING + - CANCELED + - ERROR + - INITIALIZING + - QUEUED + - READY + readySubstate: type: string - createdAt: - type: number - updatedAt: + enum: + - PROMOTED + - ROLLING + - STAGED + requestedAt: type: number - createdBy: + target: nullable: true type: string - updatedBy: + teamId: nullable: true type: string - gitBranch: + type: type: string - edgeConfigId: - nullable: true + enum: + - LAMBDAS + url: type: string - edgeConfigTokenId: - nullable: true + userId: type: string - contentHint: - nullable: true - oneOf: - - properties: - type: - type: string - enum: - - redis-url - storeId: - type: string - required: - - type - - storeId - type: object - - properties: - type: - type: string - enum: - - redis-rest-api-url - storeId: - type: string - required: - - type - - storeId - type: object - - properties: - type: - type: string - enum: - - redis-rest-api-token - storeId: - type: string - required: - - type - - storeId - type: object - - properties: - type: - type: string - enum: - - redis-rest-api-read-only-token - storeId: - type: string - required: - - type - - storeId - type: object - - properties: - type: - type: string - enum: - - blob-read-write-token - storeId: - type: string - required: - - type - - storeId - type: object - - properties: - type: - type: string - enum: - - postgres-url - storeId: - type: string - required: - - type - - storeId - type: object - - properties: - type: - type: string - enum: - - postgres-url-non-pooling - storeId: - type: string - required: - - type - - storeId - type: object - - properties: - type: - type: string - enum: - - postgres-prisma-url - storeId: - type: string - required: - - type - - storeId - type: object - - properties: - type: - type: string - enum: - - postgres-user - storeId: - type: string - required: - - type - - storeId - type: object - - properties: - type: - type: string - enum: - - postgres-host - storeId: - type: string - required: - - type - - storeId - type: object - - properties: - type: - type: string - enum: - - postgres-password - storeId: - type: string - required: - - type - - storeId - type: object - - properties: - type: - type: string - enum: - - postgres-database - storeId: - type: string - required: - - type - - storeId - type: object - decrypted: - type: boolean - description: Whether `value` is decrypted. - system: + description: Present for user creators; omitted for app/integration/system creators. + withCache: type: boolean + enum: + - false + - true + required: + - createdAt + - createdIn + - creator + - deploymentHostname + - id + - name + - plan + - private + - readyState + - type + - url type: object - type: array - required: - - envs - type: object - description: The list of environment variables for the given project - '400': - description: One of the provided values in the request query is invalid. - '401': - description: '' - '403': - description: You do not have permission to access this resource. - parameters: - - name: idOrName - description: The unique project identifier or the project name - in: path - required: true - schema: - description: The unique project identifier or the project name - type: string - example: prj_XLKmu1DyR1eY7zq8UgeRKbA7yVLA - - name: gitBranch - description: 'If defined, the git branch of the environment variable to filter the results' - in: query - required: false - schema: - description: 'If defined, the git branch of the environment variable to filter the results' - type: string - maxLength: 250 - example: feature-1 - - name: decrypt - description: 'If true, the environment variable value will be decrypted' - in: query - required: false - schema: - description: 'If true, the environment variable value will be decrypted' - type: string - enum: - - 'true' - - 'false' - example: 'true' - deprecated: true - - name: source - description: The source that is calling the endpoint. - in: query - required: false - schema: - description: The source that is calling the endpoint. - type: string - example: 'vercel-cli:pull' - - description: The Team identifier or slug to perform the request on behalf of. - in: query - name: teamId - required: true - schema: - type: string - '/v1/projects/{idOrName}/env/{id}': - get: - description: Retrieve the environment variable for a given project. - operationId: getProjectEnv - security: - - bearerToken: [] - summary: Retrieve the decrypted value of an environment variable of a project by id - tags: - - projects - responses: - '200': - description: '' - content: - application/json: - schema: - properties: - target: - oneOf: - - items: + domain: + type: string + environment: type: string enum: - - production - - preview - - development - preview - - development - type: array - - type: string - enum: - - production - - preview - - development - - preview - - development - type: - type: string + - production + gitBranch: + nullable: true + type: string + redirect: + nullable: true + type: string + redirectStatusCode: + nullable: true + type: number + enum: + - 301 + - 302 + - 307 + - 308 + - null + target: + type: string + enum: + - PREVIEW + - PRODUCTION + - STAGING + required: + - deployment + - domain + - environment + - target + type: object + type: array + analytics: + properties: + id: + type: string + canceledAt: + nullable: true + type: number + disabledAt: + type: number + enabledAt: + type: number + paidAt: + type: number + sampleRatePercent: + nullable: true + type: number + spendLimitInDollars: + nullable: true + type: number + required: + - disabledAt + - enabledAt + - id + type: object + appliedCve55182Migration: + type: boolean + enum: + - false + - true + speedInsights: + properties: + id: + type: string + enabledAt: + type: number + disabledAt: + type: number + canceledAt: + type: number + hasData: + type: boolean + enum: + - false + - true + dataReceivedAt: + type: number + description: When the first free (not Speed Insights Plus) production data point was observed, in ms. Set once by subscriber-analytics-events; projects that already had data before this field shipped get it backfilled on their next batch, so it reads "first free data point observed", not necessarily "first ever". + paidAt: + type: number + required: + - id + type: object + autoExposeSystemEnvs: + type: boolean enum: - - secret - - system - - encrypted - - plain - - sensitive - id: - type: string - key: - type: string - value: + - false + - true + autoAssignCustomDomains: + type: boolean + enum: + - false + - true + autoAssignCustomDomainsUpdatedBy: type: string - configurationId: + buildCommand: nullable: true type: string - createdAt: - type: number - updatedAt: - type: number - createdBy: + commandForIgnoringBuildStep: nullable: true type: string - updatedBy: + connectConfigurations: nullable: true - type: string - gitBranch: - type: string - edgeConfigId: + items: + properties: + envId: + oneOf: + - type: string + - type: string + enum: + - preview + - production + connectConfigurationId: + type: string + dc: + type: string + passive: + type: boolean + enum: + - false + - true + buildsEnabled: + type: boolean + enum: + - false + - true + aws: + properties: + subnetIds: + items: + type: string + type: array + securityGroupId: + type: string + required: + - subnetIds + type: object + createdAt: + type: number + updatedAt: + type: number + required: + - buildsEnabled + - connectConfigurationId + - createdAt + - envId + - passive + - updatedAt + type: object + type: array + connectConfigurationId: nullable: true type: string - edgeConfigTokenId: + connectBuildsEnabled: + type: boolean + enum: + - false + - true + passiveConnectConfigurationId: nullable: true type: string - contentHint: - nullable: true - oneOf: - - properties: - type: - type: string - enum: - - redis-url - storeId: - type: string - required: - - type - - storeId - type: object - - properties: - type: - type: string - enum: - - redis-rest-api-url - storeId: - type: string - required: - - type - - storeId - type: object - - properties: - type: - type: string - enum: - - redis-rest-api-token - storeId: - type: string - required: - - type - - storeId - type: object - - properties: - type: - type: string - enum: - - redis-rest-api-read-only-token - storeId: - type: string - required: - - type - - storeId - type: object - - properties: - type: - type: string - enum: - - blob-read-write-token - storeId: - type: string - required: - - type - - storeId - type: object - - properties: - type: - type: string - enum: - - postgres-url - storeId: - type: string - required: - - type - - storeId - type: object - - properties: - type: - type: string - enum: - - postgres-url-non-pooling - storeId: - type: string - required: - - type - - storeId - type: object - - properties: - type: - type: string - enum: - - postgres-prisma-url - storeId: - type: string - required: - - type - - storeId - type: object - - properties: - type: - type: string - enum: - - postgres-user - storeId: - type: string - required: - - type - - storeId - type: object - - properties: - type: - type: string - enum: - - postgres-host - storeId: - type: string - required: - - type - - storeId - type: object - - properties: - type: - type: string - enum: - - postgres-password - storeId: - type: string - required: - - type - - storeId - type: object - - properties: - type: - type: string - enum: - - postgres-database - storeId: - type: string - required: - - type - - storeId - type: object - decrypted: + createdAt: + type: number + customerSupportCodeVisibility: + type: boolean + enum: + - false + - true + crons: + properties: + enabledAt: + type: number + description: 'The time the feature was enabled for this project. Note: It enables automatically with the first Deployment that outputs cronjobs.' + disabledAt: + nullable: true + type: number + description: The time the feature was disabled for this project. + updatedAt: + type: number + deploymentId: + nullable: true + type: string + description: The ID of the Deployment from which the definitions originated. + definitions: + items: + properties: + host: + type: string + description: The hostname that should be used. + example: vercel.com + path: + type: string + description: The path that should be called for the cronjob. + example: /api/crons/sync-something?hello=world + schedule: + type: string + description: The cron expression. + example: 0 0 * * * + source: + type: string + enum: + - api + description: The origin of this definition. 'api' means created via the API. Undefined means it originated from a deployment (vercel.json). + description: + type: string + description: A human-readable description of what this cron job does. + hostInferred: + type: boolean + enum: + - false + - true + description: Whether the host was inferred from the production deployment URL rather than explicitly provided. + required: + - host + - path + - schedule + type: object + type: array + required: + - definitions + - deploymentId + - disabledAt + - enabledAt + - updatedAt + type: object + dataCache: + properties: + userDisabled: + type: boolean + enum: + - false + - true + storageSizeBytes: + nullable: true + type: number + unlimited: + type: boolean + enum: + - false + - true + required: + - userDisabled + type: object + deploymentExpiration: + properties: + expirationDays: + type: number + description: Number of days to keep non-production deployments (mostly preview deployments) before soft deletion. + expirationDaysProduction: + type: number + description: Number of days to keep production deployments before soft deletion. + expirationDaysCanceled: + type: number + description: Number of days to keep canceled deployments before soft deletion. + expirationDaysErrored: + type: number + description: Number of days to keep errored deployments before soft deletion. + deploymentsToKeep: + type: number + description: Minimum number of production deployments to keep for this project, even if they are over the production expiration limit. + type: object + description: Retention policies for deployments. These are enforced at the project level, but we also maintain an instance of this at the team level as a default policy that gets applied to new projects. + expiration: + properties: + expiresAt: + type: number + description: Unix ms timestamp when the project is scheduled to expire. + lockedAt: + type: number + description: Unix ms timestamp when the project was locked. + lockedBy: + type: string + description: userId of the actor that triggered the lock (system or admin). + required: + - expiresAt + - lockedAt + - lockedBy + type: object + devCommand: + nullable: true + type: string + directoryListing: type: boolean - description: Whether `value` is decrypted. - required: - - type - - key - - value - type: object - '400': - description: One of the provided values in the request query is invalid. - '401': - description: '' - '403': - description: You do not have permission to access this resource. - parameters: - - name: idOrName - description: The unique project identifier or the project name - in: path - required: true - schema: - description: The unique project identifier or the project name - type: string - example: prj_XLKmu1DyR1eY7zq8UgeRKbA7yVLA - - name: id - description: The unique ID for the environment variable to get the decrypted value. - in: path - required: true - schema: - description: The unique ID for the environment variable to get the decrypted value. - type: string - - description: The Team identifier or slug to perform the request on behalf of. - in: query - name: teamId - required: true - schema: - type: string - '/v10/projects/{idOrName}/env': - post: - description: 'Create one ore more environment variables for a project by passing its `key`, `value`, `type` and `target` and by specifying the project by either passing the project `id` or `name` in the URL.' - operationId: createProjectEnv - security: - - bearerToken: [] - summary: Create one or more environment variables - tags: - - projects - responses: - '201': - description: The environment variable was created successfully - content: - application/json: - schema: - properties: - created: - oneOf: - - properties: - target: - oneOf: - - items: + enum: + - false + - true + installCommand: + nullable: true + type: string + env: + items: + properties: + target: + oneOf: + - items: + type: string + enum: + - development + - development + - preview + - preview + - production + type: array + - type: string + enum: + - development + - development + - preview + - preview + - production + type: + type: string + enum: + - encrypted + - plain + - secret + - sensitive + - system + sunsetSecretId: + type: string + description: This is used to identify variables that have been migrated from type secret to sensitive. + legacyValue: + type: string + description: Legacy now-encryption ciphertext, present after migration swaps value/vsmValue + decrypted: + type: boolean + enum: + - false + - true + value: + type: string + vsmValue: + type: string + id: + type: string + key: + type: string + configurationId: + nullable: true + type: string + createdAt: + type: number + updatedAt: + type: number + createdBy: + nullable: true + type: string + updatedBy: + nullable: true + type: string + gitBranch: + type: string + visibility: + type: string + enum: + - config + - secret + description: User-facing config/secret model. When set, authoritative for new code paths when the env-var-config-secret-ui flag is enabled. Legacy rows omit this field; legacy rows omit it and callers fall back to existing `type` behavior. + edgeConfigId: + nullable: true + type: string + edgeConfigTokenId: + nullable: true + type: string + contentHint: + nullable: true + oneOf: + - properties: + type: + type: string + enum: + - redis-url + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - redis-rest-api-url + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - redis-rest-api-token + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - redis-rest-api-read-only-token + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - blob-read-write-token + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - blob-store-id + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - blob-webhook-public-key + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - postgres-url + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - postgres-url-non-pooling + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: type: string enum: - - production - - preview - - development - - preview - - development - - preview - - development - type: array - - type: string - enum: - - production - - preview - - development - - preview - - development - - preview - - development - type: - type: string - enum: - - system - - secret - - encrypted - - plain - - sensitive - id: - type: string - key: - type: string - value: - type: string - configurationId: - nullable: true - type: string - createdAt: - type: number - updatedAt: - type: number - createdBy: - nullable: true - type: string - updatedBy: - nullable: true + - postgres-prisma-url + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - postgres-user + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - postgres-host + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - postgres-password + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - postgres-database + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - postgres-url-no-ssl + storeId: + type: string + required: + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - integration-store-secret + storeId: + type: string + integrationId: + type: string + integrationProductId: + type: string + integrationConfigurationId: + type: string + required: + - integrationConfigurationId + - integrationId + - integrationProductId + - storeId + - type + type: object + - properties: + type: + type: string + enum: + - flags-connection-string + projectId: + type: string + required: + - projectId + - type + type: object + internalContentHint: + nullable: true + properties: + type: + type: string + enum: + - flags-secret + encryptedValue: + type: string + description: Contains the `value` of the env variable, encrypted with a special key to make decryption possible in the subscriber Lambda. + required: + - encryptedValue + - type + type: object + description: Similar to `contentHints`, but should not be exposed to the user. + comment: + type: string + customEnvironmentIds: + items: type: string - gitBranch: + type: array + required: + - key + - type + - value + type: object + type: array + customEnvironments: + items: + properties: + id: + type: string + description: 'Unique identifier for the custom environment (format: env_*)' + slug: + type: string + description: URL-friendly name of the environment + type: + type: string + enum: + - development + - preview + - production + description: The type of environment (production, preview, or development) + description: + type: string + description: Optional description of the environment's purpose + branchMatcher: + properties: + type: + type: string + enum: + - endsWith + - equals + - startsWith + description: The type of matching to perform + pattern: + type: string + description: The pattern to match against branch names + required: + - pattern + - type + type: object + description: Configuration for matching git branches to this environment + domains: + items: + properties: + name: + type: string + apexName: + type: string + projectId: + type: string + redirect: + nullable: true + type: string + redirectStatusCode: + nullable: true + type: number + enum: + - 301 + - 302 + - 307 + - 308 + - null + gitBranch: + nullable: true + type: string + customEnvironmentId: + nullable: true + type: string + updatedAt: + type: number + createdAt: + type: number + verified: + type: boolean + enum: + - false + - true + description: '`true` if the domain is verified for use with the project. If `false` it will not be used as an alias on this project until the challenge in `verification` is completed.' + verification: + items: + properties: + type: + type: string + domain: + type: string + value: + type: string + reason: + type: string + required: + - domain + - reason + - type + - value + type: object + description: 'A list of verification challenges, one of which must be completed to verify the domain for use on the project. After the challenge is complete `POST /projects/:idOrName/domains/:domain/verify` to verify the domain. Possible challenges: - If `verification.type = TXT` the `verification.domain` will be checked for a TXT record matching `verification.value`.' + type: array + description: 'A list of verification challenges, one of which must be completed to verify the domain for use on the project. After the challenge is complete `POST /projects/:idOrName/domains/:domain/verify` to verify the domain. Possible challenges: - If `verification.type = TXT` the `verification.domain` will be checked for a TXT record matching `verification.value`.' + required: + - apexName + - name + - projectId + - verified + type: object + description: List of domains associated with this environment + type: array + description: List of domains associated with this environment + currentDeploymentAliases: + items: type: string - edgeConfigId: - nullable: true + type: array + description: List of aliases for the current deployment + createdAt: + type: number + description: Timestamp when the environment was created + updatedAt: + type: number + description: Timestamp when the environment was last updated + required: + - createdAt + - id + - slug + - type + - updatedAt + type: object + description: Internal representation of a custom environment with all required properties + type: array + framework: + nullable: true + type: string + enum: + - actix-web + - angular + - ash + - astro + - axum + - blitzjs + - brunch + - bun + - container + - create-react-app + - django + - docusaurus + - docusaurus-2 + - dojo + - eleventy + - elysia + - ember + - eve + - express + - factory-eve + - fastapi + - fasthtml + - fastify + - flask + - gatsby + - go + - gridsome + - h3 + - hexo + - hono + - hugo + - hydrogen + - ionic-angular + - ionic-react + - jekyll + - koa + - mastra + - middleman + - nestjs + - nextjs + - nitro + - node + - nuxtjs + - parcel + - polymer + - preact + - python + - react-router + - redwoodjs + - remix + - ruby + - rust + - saber + - sanity + - sanity-v2 + - sapper + - scully + - services + - solidstart + - solidstart-1 + - stencil + - storybook + - svelte + - sveltekit + - sveltekit-1 + - tanstack-start + - tanstack-start-lovable + - umijs + - vite + - vitepress + - vue + - vuepress + - xmcp + - zola + - null + services: + items: + properties: + serviceName: + type: string + description: Service name from the deployment (Service.name). + serviceType: + type: string + enum: + - cron + - job + - web + - worker + description: Service kind (Service.type). Omitted for schemas that do not define one. + framework: + type: string + enum: + - actix-web + - angular + - ash + - astro + - axum + - blitzjs + - brunch + - bun + - container + - create-react-app + - django + - docusaurus + - docusaurus-2 + - dojo + - eleventy + - elysia + - ember + - eve + - express + - factory-eve + - fastapi + - fasthtml + - fastify + - flask + - gatsby + - go + - gridsome + - h3 + - hexo + - hono + - hugo + - hydrogen + - ionic-angular + - ionic-react + - jekyll + - koa + - mastra + - middleman + - nestjs + - nextjs + - nitro + - node + - nuxtjs + - parcel + - polymer + - preact + - python + - react-router + - redwoodjs + - remix + - ruby + - rust + - saber + - sanity + - sanity-v2 + - sapper + - scully + - services + - solidstart + - solidstart-1 + - stencil + - storybook + - svelte + - sveltekit + - sveltekit-1 + - tanstack-start + - tanstack-start-lovable + - umijs + - vite + - vitepress + - vue + - vuepress + - xmcp + - zola + description: Framework slug, when the service has one (omitted otherwise). + runtime: + type: string + description: Generic runtime, e.g. 'node' | 'python' | 'go' | 'ruby' | 'rust' (Service.runtime). Omitted for static builds. + required: + - serviceName + type: object + type: array + gitForkProtection: + type: boolean + enum: + - false + - true + gitLFS: + type: boolean + enum: + - false + - true + id: + type: string + ipBuckets: + items: + properties: + bucket: + type: string + default: + type: boolean + enum: + - false + - true + supportUntil: + type: number + required: + - bucket + type: object + type: array + jobs: + properties: + lint: + properties: + targets: + items: + type: string + type: array + required: + - targets + type: object + typecheck: + properties: + targets: + items: + type: string + type: array + required: + - targets + type: object + mfe-config-present: + properties: + targets: + items: + type: string + type: array + required: + - targets + type: object + type: object + latestDeployments: + items: + properties: + id: + type: string + alias: + items: type: string - edgeConfigTokenId: - nullable: true + type: array + aliasAssigned: + nullable: true + oneOf: + - type: number + - type: boolean + enum: + - false + - true + aliasError: + nullable: true + properties: + code: + type: string + message: + type: string + required: + - code + - message + type: object + aliasFinal: + nullable: true + type: string + automaticAliases: + items: type: string - contentHint: - nullable: true - oneOf: - - properties: - type: - type: string - enum: - - redis-url - storeId: - type: string - required: - - type - - storeId - type: object - - properties: - type: - type: string - enum: - - redis-rest-api-url - storeId: - type: string - required: - - type - - storeId - type: object - - properties: - type: - type: string - enum: - - redis-rest-api-token - storeId: - type: string - required: - - type - - storeId - type: object - - properties: - type: - type: string - enum: - - redis-rest-api-read-only-token - storeId: - type: string - required: - - type - - storeId - type: object - - properties: - type: - type: string - enum: - - blob-read-write-token - storeId: - type: string - required: - - type - - storeId - type: object - - properties: - type: - type: string - enum: - - postgres-url - storeId: - type: string - required: - - type - - storeId - type: object - - properties: - type: - type: string - enum: - - postgres-url-non-pooling - storeId: - type: string - required: - - type - - storeId - type: object - - properties: - type: - type: string - enum: - - postgres-prisma-url - storeId: - type: string - required: - - type - - storeId - type: object - - properties: - type: - type: string - enum: - - postgres-user - storeId: - type: string - required: - - type - - storeId - type: object - - properties: - type: - type: string - enum: - - postgres-host - storeId: - type: string - required: - - type - - storeId - type: object - - properties: - type: - type: string - enum: - - postgres-password - storeId: - type: string - required: - - type - - storeId - type: object - - properties: - type: - type: string - enum: - - postgres-database - storeId: - type: string - required: - - type - - storeId - type: object - decrypted: - type: boolean - description: Whether `value` is decrypted. - system: - type: boolean - type: object - - items: + type: array + branchMatcher: + properties: + type: + type: string + enum: + - endsWith + - equals + - startsWith + description: The type of matching to perform + pattern: + type: string + description: The pattern to match against branch names + required: + - pattern + - type + type: object + buildingAt: + type: number + builds: + items: + properties: + use: + type: string + src: + type: string + dest: + type: string + required: + - use + type: object + type: array + checksConclusion: + type: string + enum: + - canceled + - failed + - skipped + - succeeded + checksState: + type: string + enum: + - completed + - registered + - running + connectBuildsEnabled: + type: boolean + enum: + - false + - true + connectConfigurationId: + type: string + createdAt: + type: number + createdIn: + type: string + creator: + nullable: true properties: - target: - oneOf: - - items: - type: string - enum: - - production - - preview - - development - - preview - - development - - preview - - development - type: array - - type: string - enum: - - production - - preview - - development - - preview - - development - - preview - - development - type: + email: type: string - enum: - - system - - secret - - encrypted - - plain - - sensitive - id: + githubLogin: type: string - key: + gitlabLogin: type: string - value: + uid: type: string - configurationId: - nullable: true + username: type: string - createdAt: - type: number - updatedAt: - type: number - createdBy: - nullable: true + required: + - email + - uid + - username + type: object + deletedAt: + type: number + deploymentHostname: + type: string + forced: + type: boolean + enum: + - false + - true + name: + type: string + meta: + additionalProperties: + type: string + type: object + monorepoManager: + nullable: true + type: string + oidcTokenClaims: + properties: + iss: type: string - updatedBy: - nullable: true + sub: type: string - gitBranch: + scope: type: string - edgeConfigId: - nullable: true + aud: type: string - edgeConfigTokenId: - nullable: true + owner: type: string - contentHint: - nullable: true - oneOf: - - properties: - type: - type: string - enum: - - redis-url - storeId: - type: string - required: - - type - - storeId - type: object - - properties: - type: - type: string - enum: - - redis-rest-api-url - storeId: - type: string - required: - - type - - storeId - type: object - - properties: - type: - type: string - enum: - - redis-rest-api-token - storeId: - type: string - required: - - type - - storeId - type: object - - properties: - type: - type: string - enum: - - redis-rest-api-read-only-token - storeId: - type: string - required: - - type - - storeId - type: object - - properties: - type: - type: string - enum: - - blob-read-write-token - storeId: - type: string - required: - - type - - storeId - type: object - - properties: - type: - type: string - enum: - - postgres-url - storeId: - type: string - required: - - type - - storeId - type: object - - properties: - type: - type: string - enum: - - postgres-url-non-pooling - storeId: - type: string - required: - - type - - storeId - type: object - - properties: - type: - type: string - enum: - - postgres-prisma-url - storeId: - type: string - required: - - type - - storeId - type: object - - properties: - type: - type: string - enum: - - postgres-user - storeId: - type: string - required: - - type - - storeId - type: object - - properties: - type: - type: string - enum: - - postgres-host - storeId: - type: string - required: - - type - - storeId - type: object - - properties: - type: - type: string - enum: - - postgres-password - storeId: - type: string - required: - - type - - storeId - type: object - - properties: - type: - type: string - enum: - - postgres-database - storeId: - type: string - required: - - type - - storeId - type: object - decrypted: - type: boolean - description: Whether `value` is decrypted. - system: - type: boolean - type: object - type: array - failed: - items: - properties: - error: - properties: - code: + owner_id: type: string - message: + project: type: string - key: + project_id: type: string - envVarId: + environment: + type: string + custom_environment_id: + type: string + mfe_group_ids: + items: + type: string + type: array + plan: + type: string + required: + - aud + - environment + - iss + - owner + - owner_id + - project + - project_id + - scope + - sub + type: object + plan: + type: string + enum: + - enterprise + - hobby + - pro + previewCommentsEnabled: + type: boolean + enum: + - false + - true + description: Whether or not preview comments are enabled for the deployment + example: false + private: + type: boolean + enum: + - false + - true + readyAt: + type: number + readyState: + type: string + enum: + - BLOCKED + - BUILDING + - CANCELED + - ERROR + - INITIALIZING + - QUEUED + - READY + readySubstate: + type: string + enum: + - PROMOTED + - ROLLING + - STAGED + requestedAt: + type: number + target: + nullable: true + type: string + teamId: + nullable: true + type: string + type: + type: string + enum: + - LAMBDAS + url: + type: string + userId: + type: string + description: Present for user creators; omitted for app/integration/system creators. + withCache: + type: boolean + enum: + - false + - true + required: + - createdAt + - createdIn + - creator + - deploymentHostname + - id + - name + - plan + - private + - readyState + - type + - url + type: object + type: array + link: + properties: + org: + type: string + repoOwnerId: + type: number + description: A new field, should be included in all new project links, is being added just in time when a deployment is created. This is needed for Protected Git scopes. + repo: + type: string + repoId: + type: number + type: + type: string + enum: + - github + createdAt: + type: number + deployHooks: + items: + properties: + createdAt: + type: number + id: type: string - envVarKey: + name: type: string - action: + ref: type: string - link: + url: type: string + required: + - id + - name + - ref + - url + type: object + type: array + gitCredentialId: + type: string + updatedAt: + type: number + sourceless: + type: boolean + enum: + - false + - true + productionBranch: + type: string + host: + type: string + projectId: + type: string + projectName: + type: string + projectNameWithNamespace: + type: string + projectNamespace: + type: string + projectOwnerId: + type: number + description: A new field, should be included in all new project links, is being added just in time when a deployment is created. This is needed for Protected Git scopes. This is the id of the top level group that a namespace belongs to. Gitlab supports group nesting (up to 20 levels). + projectUrl: + type: string + name: + type: string + slug: + type: string + owner: + type: string + uuid: + type: string + workspaceUuid: + type: string + ownerId: + type: string + description: Origin namespace id (`ns_…`) of the owner. + required: + - deployHooks + - gitCredentialId + - org + - productionBranch + - type + - host + - projectId + - projectName + - projectNameWithNamespace + - projectNamespace + - projectUrl + - name + - owner + - slug + - uuid + - workspaceUuid + - repo + - repoId + - ownerId + type: object + blobs: + properties: + isDefaultApp: + type: boolean + enum: + - false + - true + description: Marks the team-level, Vercel-managed default blob project (`vercel-blob-default-project`) that orphan blob stores are scoped to when connected without an explicit project. Set only by internal storage flows and immutable after creation — guards rely on it to protect the connected stores from being lost when the project is deleted or transferred. + type: object + microfrontends: + properties: + isDefaultApp: + type: boolean + enum: + - true + updatedAt: + type: number + description: Timestamp when the microfrontends settings were last updated. + groupIds: + type: array + items: + type: string + minItems: 1 + description: The group IDs of microfrontends that this project belongs to. Each microfrontend project must belong to a microfrontends group that is the set of microfrontends that are used together. + enabled: + type: boolean + enum: + - true + description: Whether microfrontends are enabled for this project. + defaultRoute: + type: string + description: A path that is used to take screenshots and as the default path in preview links when a domain for this microfrontend is shown in the UI. Includes the leading slash, e.g. `/docs` + freeProjectForLegacyLimits: + type: boolean + enum: + - false + - true + description: Whether the project was part of the legacy limits for hobby and pro-trial before billing was added. This field is only set when the team is upgraded to a paid plan and we are backfilling the subscription status. We cap the subscription to 2 projects and set this field for the 3rd project. When this field is set, the project is not charged for and we do not call any billing APIs for this project. + routeObservabilityToThisProject: + type: boolean + enum: + - false + - true + description: Whether observability data should be routed to this microfrontend project or a root project. + doNotRouteWithMicrofrontendsRouting: + type: boolean + enum: + - false + - true + description: Whether to add microfrontends routing to aliases. This means domains in this project will route as a microfrontend. + required: + - enabled + - groupIds + - isDefaultApp + - updatedAt + type: object + name: + type: string + nodeVersion: + type: string + enum: + - 10.x + - 12.x + - 14.x + - 16.x + - 18.x + - 20.x + - 22.x + - 24.x + - 8.10.x + optionsAllowlist: + nullable: true + properties: + paths: + items: + properties: value: - oneOf: - - type: string - - items: - type: string - enum: - - production - - preview - - development - - preview - - development - - preview - - development - type: array - gitBranch: - type: string - target: - oneOf: - - items: - type: string - enum: - - production - - preview - - development - - preview - - development - - preview - - development - type: array - - type: string - enum: - - production - - preview - - development - - preview - - development - - preview - - development - project: type: string required: - - code - - message + - value type: object - required: - - error - type: object - type: array - required: - - created - - failed - type: object - '400': - description: |- - One of the provided values in the request body is invalid. - One of the provided values in the request query is invalid. - '401': - description: '' - '402': - description: |- - The account was soft-blocked for an unhandled reason. - The account is missing a payment so payment method must be updated - '403': - description: |- - You do not have permission to access this resource. - The environment variable cannot be created because it already exists - Additional permissions are required to create production environment variables - '409': - description: The project is being transfered and creating an environment variable is not possible - parameters: - - name: idOrName - description: The unique project identifier or the project name - in: path - required: true - schema: - description: The unique project identifier or the project name - type: string - example: prj_XLKmu1DyR1eY7zq8UgeRKbA7yVLA - - name: upsert - description: Allow override of environment variable if it already exists - in: query - required: false - schema: - description: Allow override of environment variable if it already exists - type: string - example: 'true' - - description: The Team identifier or slug to perform the request on behalf of. - in: query - name: teamId - required: true - schema: - type: string - requestBody: - content: - application/json: - schema: - oneOf: - - type: object - required: - - key - - value - - type - - target - properties: - key: - description: The name of the environment variable - type: string - example: API_URL - value: - description: The value of the environment variable - type: string - example: 'https://api.vercel.com' - type: - description: The type of environment variable - type: string - enum: - - system - - secret - - encrypted - - plain - - sensitive - example: plain - target: - description: The target environment of the environment variable - type: array - items: + type: array + required: + - paths + type: object + outputDirectory: + nullable: true + type: string + passwordProtection: + nullable: true + type: string + description: (opaque JSON object) + passport: + nullable: true + properties: + deploymentType: + type: string enum: - - production + - all + - all_except_custom_domains - preview - - development - example: - - production - - preview - gitBranch: - description: The git branch of the environment variable - type: string - maxLength: 250 - example: feature-1 - nullable: true - - type: array - items: + - prod_deployment_urls_and_all_previews + connectorId: + type: string + required: + - connectorId + - deploymentType + type: object + protectionConfig: + properties: + sandboxUrls: + properties: + inheritDeploymentProtection: + type: boolean + enum: + - false + - true + type: object + type: object + sandbox: + properties: + region: + type: string + enum: + - arn1 + - bom1 + - cdg1 + - cle1 + - cpt1 + - dub1 + - fra1 + - gru1 + - hkg1 + - hnd1 + - iad1 + - icn1 + - kix1 + - lhr1 + - pdx1 + - sfo1 + - sin1 + - syd1 + - yul1 + failoverRegions: + items: + type: string + enum: + - arn1 + - bom1 + - cdg1 + - cle1 + - cpt1 + - dub1 + - fra1 + - gru1 + - hkg1 + - hnd1 + - iad1 + - icn1 + - kix1 + - lhr1 + - pdx1 + - sfo1 + - sin1 + - syd1 + - yul1 + type: array + type: object + productionDeploymentsFastLane: + type: boolean + enum: + - false + - true + resourceConfig: + properties: + elasticConcurrencyEnabled: + type: boolean + enum: + - false + - true + fluid: + type: boolean + enum: + - false + - true + functionDefaultRegions: + items: + type: string + type: array + functionDefaultTimeout: + type: number + functionDefaultMemoryType: + type: string + enum: + - performance + - performance_xl + - standard + - standard_legacy + functionZeroConfigFailover: + type: boolean + enum: + - false + - true + buildMachineType: + type: string + enum: + - basic + - enhanced + - standard + - turbo + buildMachineSelection: + type: string + enum: + - elastic + - fixed + buildMachineElasticLastUpdated: + type: number + buildMachineElasticReason: + type: string + enum: + - basic-floor + - build-timeout-failure + - enospc-failure + - enterprise-floor + - high-peak-disk + - high-peak-memory + - long-build-duration + - oom-failure + - short-build-duration + - sustained-high-cpu + isNSNBDisabled: + type: boolean + enum: + - false + - true + buildQueue: + properties: + configuration: + type: string + enum: + - SKIP_NAMESPACE_QUEUE + - WAIT_FOR_NAMESPACE_QUEUE + type: object + enableFunctionsBeta: + type: boolean + enum: + - false + - true type: object required: - - key - - value - - type - - target + - functionDefaultRegions + rollbackDescription: properties: - key: - description: The name of the environment variable + userId: type: string - example: API_URL - value: - description: The value of the environment variable + description: The user who rolled back the project. + username: type: string - example: 'https://api.vercel.com' - type: - description: The type of environment variable + description: The username of the user who rolled back the project. + description: type: string - enum: - - system - - secret - - encrypted - - plain - - sensitive - example: plain + description: User-supplied explanation of why they rolled back the project. Limited to 250 characters. + createdAt: + type: number + description: Timestamp of when the rollback was requested. + required: + - createdAt + - description + - userId + - username + type: object + description: Description of why a project was rolled back, and by whom. Note that lastAliasRequest contains the from/to details of the rollback. + rollingRelease: + nullable: true + properties: target: - description: The target environment of the environment variable + type: string + description: The environment that the release targets, currently only supports production. Adding in case we want to configure with alias groups or custom environments. + example: production + stages: + nullable: true + items: + properties: + targetPercentage: + type: number + description: The percentage of traffic to serve to the canary deployment (0-100) + example: 25 + requireApproval: + type: boolean + enum: + - false + - true + description: Whether or not this stage requires manual approval to proceed + example: false + duration: + type: number + description: Duration in minutes for automatic advancement to the next stage + example: 600 + linearShift: + type: boolean + enum: + - false + - true + description: Whether to linearly shift traffic over the duration of this stage + example: false + required: + - targetPercentage + type: object + description: 'An array of all the stages required during a deployment release. Each stage defines a target percentage and advancement rules. The final stage must always have targetPercentage: 100.' + type: array + description: 'An array of all the stages required during a deployment release. Each stage defines a target percentage and advancement rules. The final stage must always have targetPercentage: 100.' + canaryResponseHeader: + type: boolean + enum: + - false + - true + description: Whether the request served by a canary deployment should return a header indicating a canary was served. Defaults to `false` when omitted. + example: false + gate: + properties: + enabled: + type: boolean + enum: + - false + - true + description: Whether automated gating is enabled for this project's rollouts. + checks: + items: + properties: + type: + type: string + enum: + - error-rate-5xx + description: The metric this check evaluates. + minSampleSize: + type: number + description: Minimum number of requests required in the window before the check can fail. Below this, the check is inconclusive rather than failing, so low-traffic stages don't gate on noise. Defaults to `100` when omitted. + example: 100 + excludeStatusCodes: + items: + type: number + type: array + description: Response status codes to ignore entirely — dropped from both the numerator (errors) and the denominator (total requests). Defaults to `[]` when omitted. + example: + - 503 + excludePaths: + items: + type: string + type: array + description: Request paths to ignore entirely — dropped from both the numerator (errors) and the denominator (total requests). Matched exactly against the request path with any query string removed; no prefix or glob matching. Defaults to `[]` when omitted. + example: + - /api/health + ingestWatermarkSeconds: + type: number + description: 'Seconds of ingest lag to allow for: the query''s upper bound is `now() - this value`, so the check never reads a window that is still filling. Defaults to `30` when omitted.' + example: 30 + required: + - type + type: object + description: The checks to evaluate. An empty array means nothing is evaluated. + type: array + description: The checks to evaluate. An empty array means nothing is evaluated. + failureThreshold: + type: number + description: How many failing evaluations within {@link windowSize} trip the gate. Defaults to `3` when omitted. + example: 3 + windowSize: + type: number + description: How many of the most recent evaluations {@link failureThreshold} is counted against. Defaults to `5` when omitted. + example: 5 + action: + type: string + enum: + - pause + - rollback + description: 'What to do when the gate trips: pause the rollout, or roll it back.' + dryRun: + type: boolean + enum: + - false + - true + description: When true, a tripped gate is only reported — {@link action} is not taken. + required: + - action + - checks + - dryRun + - enabled + type: object + description: 'Automated gating configuration. Omitted (the default) means no gating is configured, which is equivalent to `enabled: false`.' + required: + - target + type: object + description: Project-level rolling release configuration that defines how deployments should be gradually rolled out + defaultResourceConfig: + properties: + elasticConcurrencyEnabled: + type: boolean + enum: + - false + - true + fluid: + type: boolean + enum: + - false + - true + functionDefaultRegions: + items: + type: string type: array + functionDefaultTimeout: + type: number + functionDefaultMemoryType: + type: string + enum: + - performance + - performance_xl + - standard + - standard_legacy + functionZeroConfigFailover: + type: boolean + enum: + - false + - true + buildMachineType: + type: string + enum: + - basic + - enhanced + - standard + - turbo + buildMachineSelection: + type: string + enum: + - elastic + - fixed + buildMachineElasticLastUpdated: + type: number + buildMachineElasticReason: + type: string + enum: + - basic-floor + - build-timeout-failure + - enospc-failure + - enterprise-floor + - high-peak-disk + - high-peak-memory + - long-build-duration + - oom-failure + - short-build-duration + - sustained-high-cpu + isNSNBDisabled: + type: boolean + enum: + - false + - true + buildQueue: + properties: + configuration: + type: string + enum: + - SKIP_NAMESPACE_QUEUE + - WAIT_FOR_NAMESPACE_QUEUE + type: object + enableFunctionsBeta: + type: boolean + enum: + - false + - true + type: object + required: + - functionDefaultRegions + rootDirectory: + nullable: true + type: string + serverlessFunctionZeroConfigFailover: + type: boolean + enum: + - false + - true + skewProtectionBoundaryAt: + type: number + skewProtectionMaxAge: + type: number + skewProtectionAllowedDomains: + items: + type: string + type: array + skipGitConnectDuringLink: + type: boolean + enum: + - false + - true + staticIps: + properties: + builds: + type: boolean + enum: + - false + - true + enabled: + type: boolean + enum: + - false + - true + regions: items: - enum: - - production - - preview - - development - example: - - production + type: string + type: array + required: + - builds + - enabled + - regions + type: object + sourceFilesOutsideRootDirectory: + type: boolean + enum: + - false + - true + enableAffectedProjectsDeployments: + type: boolean + enum: + - false + - true + enableExternalRewriteCaching: + type: boolean + enum: + - false + - true + ssoProtection: + nullable: true + properties: + deploymentType: + type: string + enum: + - all + - all_except_custom_domains - preview - gitBranch: - description: The git branch of the environment variable + - prod_deployment_urls_and_all_previews + cve55182MigrationAppliedFrom: + nullable: true type: string - maxLength: 250 - example: feature-1 + enum: + - all + - all_except_custom_domains + - preview + - prod_deployment_urls_and_all_previews + - null + april2026SecurityIncidentMigrationAppliedFrom: nullable: true - '/v9/projects/{idOrName}/env/{id}': - delete: - description: Delete a specific environment variable for a given project by passing the environment variable identifier and either passing the project `id` or `name` in the URL. - operationId: removeProjectEnv - security: - - bearerToken: [] - summary: Remove an environment variable - tags: - - projects - responses: - '200': - description: The environment variable was successfully removed - content: - application/json: - schema: - oneOf: - - items: + type: string + enum: + - all + - all_except_custom_domains + - preview + - prod_deployment_urls_and_all_previews + - null + required: + - deploymentType + type: object + targets: + additionalProperties: + nullable: true properties: - target: + id: + type: string + alias: + items: + type: string + type: array + aliasAssigned: + nullable: true oneOf: - - items: - type: string - enum: - - production - - preview - - development - - preview - - development - - preview - - development - type: array - - type: string + - type: number + - type: boolean enum: - - production - - preview - - development - - preview - - development - - preview - - development - type: + - false + - true + aliasError: + nullable: true + properties: + code: + type: string + message: + type: string + required: + - code + - message + type: object + aliasFinal: + nullable: true + type: string + automaticAliases: + items: + type: string + type: array + branchMatcher: + properties: + type: + type: string + enum: + - endsWith + - equals + - startsWith + description: The type of matching to perform + pattern: + type: string + description: The pattern to match against branch names + required: + - pattern + - type + type: object + buildingAt: + type: number + builds: + items: + properties: + use: + type: string + src: + type: string + dest: + type: string + required: + - use + type: object + type: array + checksConclusion: + type: string + enum: + - canceled + - failed + - skipped + - succeeded + checksState: + type: string + enum: + - completed + - registered + - running + connectBuildsEnabled: + type: boolean + enum: + - false + - true + connectConfigurationId: type: string - enum: - - system - - encrypted - - plain - - sensitive - - secret - id: + createdAt: + type: number + createdIn: type: string - key: + creator: + nullable: true + properties: + email: + type: string + githubLogin: + type: string + gitlabLogin: + type: string + uid: + type: string + username: + type: string + required: + - email + - uid + - username + type: object + deletedAt: + type: number + deploymentHostname: type: string - value: + forced: + type: boolean + enum: + - false + - true + name: type: string - configurationId: + meta: + additionalProperties: + type: string + type: object + monorepoManager: nullable: true type: string - createdAt: + oidcTokenClaims: + properties: + iss: + type: string + sub: + type: string + scope: + type: string + aud: + type: string + owner: + type: string + owner_id: + type: string + project: + type: string + project_id: + type: string + environment: + type: string + custom_environment_id: + type: string + mfe_group_ids: + items: + type: string + type: array + plan: + type: string + required: + - aud + - environment + - iss + - owner + - owner_id + - project + - project_id + - scope + - sub + type: object + plan: + type: string + enum: + - enterprise + - hobby + - pro + previewCommentsEnabled: + type: boolean + enum: + - false + - true + description: Whether or not preview comments are enabled for the deployment + example: false + private: + type: boolean + enum: + - false + - true + readyAt: type: number - updatedAt: + readyState: + type: string + enum: + - BLOCKED + - BUILDING + - CANCELED + - ERROR + - INITIALIZING + - QUEUED + - READY + readySubstate: + type: string + enum: + - PROMOTED + - ROLLING + - STAGED + requestedAt: type: number - createdBy: + target: nullable: true type: string - updatedBy: + teamId: nullable: true type: string - gitBranch: + type: type: string - edgeConfigId: - nullable: true + enum: + - LAMBDAS + url: type: string - edgeConfigTokenId: - nullable: true + userId: type: string - contentHint: - nullable: true - oneOf: - - properties: - type: - type: string - enum: - - redis-url - storeId: - type: string - required: - - type - - storeId - type: object - - properties: - type: - type: string - enum: - - redis-rest-api-url - storeId: - type: string - required: - - type - - storeId - type: object - - properties: - type: - type: string - enum: - - redis-rest-api-token - storeId: - type: string - required: - - type - - storeId - type: object - - properties: - type: - type: string - enum: - - redis-rest-api-read-only-token - storeId: - type: string - required: - - type - - storeId - type: object - - properties: - type: - type: string - enum: - - blob-read-write-token - storeId: - type: string - required: - - type - - storeId - type: object - - properties: - type: - type: string - enum: - - postgres-url - storeId: - type: string - required: - - type - - storeId - type: object - - properties: - type: - type: string - enum: - - postgres-url-non-pooling - storeId: - type: string - required: - - type - - storeId - type: object - - properties: - type: - type: string - enum: - - postgres-prisma-url - storeId: - type: string - required: - - type - - storeId - type: object - - properties: - type: - type: string - enum: - - postgres-user - storeId: - type: string - required: - - type - - storeId - type: object - - properties: - type: - type: string - enum: - - postgres-host - storeId: - type: string - required: - - type - - storeId - type: object - - properties: - type: - type: string - enum: - - postgres-password - storeId: - type: string - required: - - type - - storeId - type: object - - properties: - type: - type: string - enum: - - postgres-database - storeId: - type: string - required: - - type - - storeId - type: object - decrypted: + description: Present for user creators; omitted for app/integration/system creators. + withCache: type: boolean - description: Whether `value` is decrypted. + enum: + - false + - true required: + - createdAt + - createdIn + - creator + - deploymentHostname + - id + - name + - plan + - private + - readyState - type - - key - - value + - url type: object - type: array - - properties: - system: - type: boolean - target: - oneOf: - - items: - type: string - enum: - - production - - preview - - development - - preview - - development - - preview - - development - type: array - - type: string - enum: - - production - - preview - - development - - preview - - development - - preview - - development - type: - type: string - enum: - - system - - encrypted - - plain - - sensitive - - secret - id: + type: object + transferCompletedAt: + type: number + transferStartedAt: + type: number + transferToAccountId: + type: string + transferredFromAccountId: + type: string + updatedAt: + type: number + live: + type: boolean + enum: + - false + - true + enablePreviewFeedback: + nullable: true + type: boolean + enum: + - false + - true + - null + enableProductionFeedback: + nullable: true + type: boolean + enum: + - false + - true + - null + permissions: + properties: + oauth2Connection: + items: + $ref: '#/components/schemas/ACLAction' + type: array + user: + items: + $ref: '#/components/schemas/ACLAction' + type: array + userConnection: + items: + $ref: '#/components/schemas/ACLAction' + type: array + userMfaConfiguration: + items: + $ref: '#/components/schemas/ACLAction' + type: array + userPreference: + items: + $ref: '#/components/schemas/ACLAction' + type: array + userSudo: + items: + $ref: '#/components/schemas/ACLAction' + type: array + webAuthn: + items: + $ref: '#/components/schemas/ACLAction' + type: array + accessGroup: + items: + $ref: '#/components/schemas/ACLAction' + type: array + agent: + items: + $ref: '#/components/schemas/ACLAction' + type: array + aiGatewayApiKey: + items: + $ref: '#/components/schemas/ACLAction' + type: array + aiGatewayApiKeyBypassAll: + items: + $ref: '#/components/schemas/ACLAction' + type: array + aiGatewayApiKeyOwnedBySelf: + items: + $ref: '#/components/schemas/ACLAction' + type: array + aiGatewayApiKeySpendAttribution: + items: + $ref: '#/components/schemas/ACLAction' + type: array + aiGatewayApiKeyZdrExemption: + items: + $ref: '#/components/schemas/ACLAction' + type: array + aiGatewayBudget: + items: + $ref: '#/components/schemas/ACLAction' + type: array + aiGatewayCredits: + items: + $ref: '#/components/schemas/ACLAction' + type: array + aiGatewayPrivateModels: + items: + $ref: '#/components/schemas/ACLAction' + type: array + aiGatewayGuardrails: + items: + $ref: '#/components/schemas/ACLAction' + type: array + aiGatewayRules: + items: + $ref: '#/components/schemas/ACLAction' + type: array + aiGatewaySettings: + items: + $ref: '#/components/schemas/ACLAction' + type: array + aiGatewayTranscripts: + items: + $ref: '#/components/schemas/ACLAction' + type: array + aiGatewayTranscriptsSettings: + items: + $ref: '#/components/schemas/ACLAction' + type: array + aiGatewayUsage: + items: + $ref: '#/components/schemas/ACLAction' + type: array + aiGatewayVirtualModelConfigs: + items: + $ref: '#/components/schemas/ACLAction' + type: array + alerts: + items: + $ref: '#/components/schemas/ACLAction' + type: array + alertRules: + items: + $ref: '#/components/schemas/ACLAction' + type: array + aliasGlobal: + items: + $ref: '#/components/schemas/ACLAction' + type: array + analyticsSampling: + items: + $ref: '#/components/schemas/ACLAction' + type: array + analyticsUsage: + items: + $ref: '#/components/schemas/ACLAction' + type: array + apiKey: + items: + $ref: '#/components/schemas/ACLAction' + type: array + apiKeyAiGateway: + items: + $ref: '#/components/schemas/ACLAction' + type: array + apiKeyOwnedBySelf: + items: + $ref: '#/components/schemas/ACLAction' + type: array + oauth2Application: + items: + $ref: '#/components/schemas/ACLAction' + type: array + vercelAppInstallation: + items: + $ref: '#/components/schemas/ACLAction' + type: array + vercelAppInstallationRequest: + items: + $ref: '#/components/schemas/ACLAction' + type: array + auditLog: + items: + $ref: '#/components/schemas/ACLAction' + type: array + automation: + items: + $ref: '#/components/schemas/ACLAction' + type: array + billingAddress: + items: + $ref: '#/components/schemas/ACLAction' + type: array + billingInformation: + items: + $ref: '#/components/schemas/ACLAction' + type: array + billingInvoice: + items: + $ref: '#/components/schemas/ACLAction' + type: array + billingInvoiceEmailRecipient: + items: + $ref: '#/components/schemas/ACLAction' + type: array + billingInvoiceLanguage: + items: + $ref: '#/components/schemas/ACLAction' + type: array + billingPlan: + items: + $ref: '#/components/schemas/ACLAction' + type: array + billingPurchaseOrder: + items: + $ref: '#/components/schemas/ACLAction' + type: array + billingRefund: + items: + $ref: '#/components/schemas/ACLAction' + type: array + billingTaxId: + items: + $ref: '#/components/schemas/ACLAction' + type: array + blob: + items: + $ref: '#/components/schemas/ACLAction' + type: array + blobStoreTokenSet: + items: + $ref: '#/components/schemas/ACLAction' + type: array + budget: + items: + $ref: '#/components/schemas/ACLAction' + type: array + cacheArtifact: + items: + $ref: '#/components/schemas/ACLAction' + type: array + cacheArtifactUsageEvent: + items: + $ref: '#/components/schemas/ACLAction' + type: array + codeChecks: + items: + $ref: '#/components/schemas/ACLAction' + type: array + codeOwners: + items: + $ref: '#/components/schemas/ACLAction' + type: array + ciInvocations: + items: + $ref: '#/components/schemas/ACLAction' + type: array + ciLogs: + items: + $ref: '#/components/schemas/ACLAction' + type: array + concurrentBuilds: + items: + $ref: '#/components/schemas/ACLAction' + type: array + connect: + items: + $ref: '#/components/schemas/ACLAction' + type: array + connectConfiguration: + items: + $ref: '#/components/schemas/ACLAction' + type: array + connectLogs: + items: + $ref: '#/components/schemas/ACLAction' + type: array + connexClient: + items: + $ref: '#/components/schemas/ACLAction' + type: array + connexClientProject: + items: + $ref: '#/components/schemas/ACLAction' + type: array + connexContact: + items: + $ref: '#/components/schemas/ACLAction' + type: array + connexInstallation: + items: + $ref: '#/components/schemas/ACLAction' + type: array + connexToken: + items: + $ref: '#/components/schemas/ACLAction' + type: array + buildMachineDefault: + items: + $ref: '#/components/schemas/ACLAction' + type: array + cursorOriginInstallation: + items: + $ref: '#/components/schemas/ACLAction' + type: array + dataCacheBillingSettings: + items: + $ref: '#/components/schemas/ACLAction' + type: array + defaultDeploymentProtection: + items: + $ref: '#/components/schemas/ACLAction' + type: array + deploymentPolicy: + items: + $ref: '#/components/schemas/ACLAction' + type: array + domain: + items: + $ref: '#/components/schemas/ACLAction' + type: array + domainAcceptDelegation: + items: + $ref: '#/components/schemas/ACLAction' + type: array + domainAuthCodes: + items: + $ref: '#/components/schemas/ACLAction' + type: array + domainCertificate: + items: + $ref: '#/components/schemas/ACLAction' + type: array + domainCheckConfig: + items: + $ref: '#/components/schemas/ACLAction' + type: array + domainMove: + items: + $ref: '#/components/schemas/ACLAction' + type: array + domainPurchase: + items: + $ref: '#/components/schemas/ACLAction' + type: array + domainRecord: + items: + $ref: '#/components/schemas/ACLAction' + type: array + domainTransferIn: + items: + $ref: '#/components/schemas/ACLAction' + type: array + drain: + items: + $ref: '#/components/schemas/ACLAction' + type: array + edgeConfig: + items: + $ref: '#/components/schemas/ACLAction' + type: array + edgeConfigItem: + items: + $ref: '#/components/schemas/ACLAction' + type: array + edgeConfigSchema: + items: + $ref: '#/components/schemas/ACLAction' + type: array + edgeConfigToken: + items: + $ref: '#/components/schemas/ACLAction' + type: array + endpointVerification: + items: + $ref: '#/components/schemas/ACLAction' + type: array + event: + items: + $ref: '#/components/schemas/ACLAction' + type: array + fileUpload: + items: + $ref: '#/components/schemas/ACLAction' + type: array + flagsExplorerSubscription: + items: + $ref: '#/components/schemas/ACLAction' + type: array + gitRepository: + items: + $ref: '#/components/schemas/ACLAction' + type: array + imageOptimizationNewPrice: + items: + $ref: '#/components/schemas/ACLAction' + type: array + integration: + items: + $ref: '#/components/schemas/ACLAction' + type: array + integrationAccount: + items: + $ref: '#/components/schemas/ACLAction' + type: array + integrationConfiguration: + items: + $ref: '#/components/schemas/ACLAction' + type: array + integrationConfigurationProjects: + items: + $ref: '#/components/schemas/ACLAction' + type: array + integrationConfigurationRole: + items: + $ref: '#/components/schemas/ACLAction' + type: array + integrationConfigurationTransfer: + items: + $ref: '#/components/schemas/ACLAction' + type: array + integrationDeploymentAction: + items: + $ref: '#/components/schemas/ACLAction' + type: array + integrationEvent: + items: + $ref: '#/components/schemas/ACLAction' + type: array + integrationLog: + items: + $ref: '#/components/schemas/ACLAction' + type: array + integrationResource: + items: + $ref: '#/components/schemas/ACLAction' + type: array + integrationResourceData: + items: + $ref: '#/components/schemas/ACLAction' + type: array + integrationResourceReplCommand: + items: + $ref: '#/components/schemas/ACLAction' + type: array + integrationResourceSecrets: + items: + $ref: '#/components/schemas/ACLAction' + type: array + integrationSSOSession: + items: + $ref: '#/components/schemas/ACLAction' + type: array + integrationStrict: + items: + $ref: '#/components/schemas/ACLAction' + type: array + integrationStoreTokenSet: + items: + $ref: '#/components/schemas/ACLAction' + type: array + integrationVercelConfigurationOverride: + items: + $ref: '#/components/schemas/ACLAction' + type: array + integrationPullRequest: + items: + $ref: '#/components/schemas/ACLAction' + type: array + ipBlocking: + items: + $ref: '#/components/schemas/ACLAction' + type: array + jobGlobal: + items: + $ref: '#/components/schemas/ACLAction' + type: array + kmsIssuer: + items: + $ref: '#/components/schemas/ACLAction' + type: array + kmsProjectGrant: + items: + $ref: '#/components/schemas/ACLAction' + type: array + logDrain: + items: + $ref: '#/components/schemas/ACLAction' + type: array + marketplaceBillingData: + items: + $ref: '#/components/schemas/ACLAction' + type: array + marketplaceExperimentationEdgeConfigData: + items: + $ref: '#/components/schemas/ACLAction' + type: array + marketplaceExperimentationItem: + items: + $ref: '#/components/schemas/ACLAction' + type: array + marketplaceFlexCommit: + items: + $ref: '#/components/schemas/ACLAction' + type: array + marketplaceInstallationMember: + items: + $ref: '#/components/schemas/ACLAction' + type: array + marketplaceInvoice: + items: + $ref: '#/components/schemas/ACLAction' + type: array + marketplaceSettings: + items: + $ref: '#/components/schemas/ACLAction' + type: array + Monitoring: + items: + $ref: '#/components/schemas/ACLAction' + type: array + monitoringAlert: + items: + $ref: '#/components/schemas/ACLAction' + type: array + monitoringChart: + items: + $ref: '#/components/schemas/ACLAction' + type: array + monitoringQuery: + items: + $ref: '#/components/schemas/ACLAction' + type: array + monitoringSettings: + items: + $ref: '#/components/schemas/ACLAction' + type: array + notificationCustomerBudget: + items: + $ref: '#/components/schemas/ACLAction' + type: array + notificationDeploymentFailed: + items: + $ref: '#/components/schemas/ACLAction' + type: array + notificationDomainConfiguration: + items: + $ref: '#/components/schemas/ACLAction' + type: array + notificationDomainExpire: + items: + $ref: '#/components/schemas/ACLAction' + type: array + notificationDomainMoved: + items: + $ref: '#/components/schemas/ACLAction' + type: array + notificationDomainPurchase: + items: + $ref: '#/components/schemas/ACLAction' + type: array + notificationDomainRenewal: + items: + $ref: '#/components/schemas/ACLAction' + type: array + notificationDomainTransfer: + items: + $ref: '#/components/schemas/ACLAction' + type: array + notificationDomainUnverified: + items: + $ref: '#/components/schemas/ACLAction' + type: array + NotificationMonitoringAlert: + items: + $ref: '#/components/schemas/ACLAction' + type: array + notificationPaymentFailed: + items: + $ref: '#/components/schemas/ACLAction' + type: array + notificationPreferences: + items: + $ref: '#/components/schemas/ACLAction' + type: array + notificationStatementOfReasons: + items: + $ref: '#/components/schemas/ACLAction' + type: array + notificationUsageAlert: + items: + $ref: '#/components/schemas/ACLAction' + type: array + oidcFederationPolicy: + items: + $ref: '#/components/schemas/ACLAction' + type: array + observabilityConfiguration: + items: + $ref: '#/components/schemas/ACLAction' + type: array + observabilityFunnel: + items: + $ref: '#/components/schemas/ACLAction' + type: array + observabilityNotebook: + items: + $ref: '#/components/schemas/ACLAction' + type: array + openTelemetryEndpoint: + items: + $ref: '#/components/schemas/ACLAction' + type: array + ownEvent: + items: + $ref: '#/components/schemas/ACLAction' + type: array + organization: + items: + $ref: '#/components/schemas/ACLAction' + type: array + organizationDomain: + items: + $ref: '#/components/schemas/ACLAction' + type: array + organizationTeam: + items: + $ref: '#/components/schemas/ACLAction' + type: array + passwordProtectionInvoiceItem: + items: + $ref: '#/components/schemas/ACLAction' + type: array + paymentMethod: + items: + $ref: '#/components/schemas/ACLAction' + type: array + permissions: + items: + $ref: '#/components/schemas/ACLAction' + type: array + postgres: + items: + $ref: '#/components/schemas/ACLAction' + type: array + postgresStoreTokenSet: + items: + $ref: '#/components/schemas/ACLAction' + type: array + previewDeploymentSuffix: + items: + $ref: '#/components/schemas/ACLAction' + type: array + privateCloudAccount: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectTransferIn: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectTransferRequest: + items: + $ref: '#/components/schemas/ACLAction' + type: array + proTrialOnboarding: + items: + $ref: '#/components/schemas/ACLAction' + type: array + rateLimit: + items: + $ref: '#/components/schemas/ACLAction' + type: array + redis: + items: + $ref: '#/components/schemas/ACLAction' + type: array + redisStoreTokenSet: + items: + $ref: '#/components/schemas/ACLAction' + type: array + remoteCaching: + items: + $ref: '#/components/schemas/ACLAction' + type: array + repository: + items: + $ref: '#/components/schemas/ACLAction' + type: array + samlConfig: + items: + $ref: '#/components/schemas/ACLAction' + type: array + secret: + items: + $ref: '#/components/schemas/ACLAction' + type: array + securityConfig: + items: + $ref: '#/components/schemas/ACLAction' + type: array + sensitiveEnvironmentVariablePolicy: + items: + $ref: '#/components/schemas/ACLAction' + type: array + sharedEnvVars: + items: + $ref: '#/components/schemas/ACLAction' + type: array + sharedEnvVarsProduction: + items: + $ref: '#/components/schemas/ACLAction' + type: array + space: + items: + $ref: '#/components/schemas/ACLAction' + type: array + spaceRun: + items: + $ref: '#/components/schemas/ACLAction' + type: array + storeIsLocked: + items: + $ref: '#/components/schemas/ACLAction' + type: array + storeTokenSetSensitive: + items: + $ref: '#/components/schemas/ACLAction' + type: array + storeTransfer: + items: + $ref: '#/components/schemas/ACLAction' + type: array + supportCase: + items: + $ref: '#/components/schemas/ACLAction' + type: array + supportCaseComment: + items: + $ref: '#/components/schemas/ACLAction' + type: array + team: + items: + $ref: '#/components/schemas/ACLAction' + type: array + teamAccessRequest: + items: + $ref: '#/components/schemas/ACLAction' + type: array + teamFellowMembership: + items: + $ref: '#/components/schemas/ACLAction' + type: array + teamGitExclusivity: + items: + $ref: '#/components/schemas/ACLAction' + type: array + teamInvite: + items: + $ref: '#/components/schemas/ACLAction' + type: array + teamInviteCode: + items: + $ref: '#/components/schemas/ACLAction' + type: array + teamInviteLink: + items: + $ref: '#/components/schemas/ACLAction' + type: array + teamJoin: + items: + $ref: '#/components/schemas/ACLAction' + type: array + teamMemberMfaStatus: + items: + $ref: '#/components/schemas/ACLAction' + type: array + teamMicrofrontends: + items: + $ref: '#/components/schemas/ACLAction' + type: array + teamOwnMembership: + items: + $ref: '#/components/schemas/ACLAction' + type: array + teamOwnMembershipDisconnectSAML: + items: + $ref: '#/components/schemas/ACLAction' + type: array + teamSudo: + items: + $ref: '#/components/schemas/ACLAction' + type: array + teamTokenInvalidation: + items: + $ref: '#/components/schemas/ACLAction' + type: array + token: + items: + $ref: '#/components/schemas/ACLAction' + type: array + toolbarComment: + items: + $ref: '#/components/schemas/ACLAction' + type: array + usage: + items: + $ref: '#/components/schemas/ACLAction' + type: array + usageCycle: + items: + $ref: '#/components/schemas/ACLAction' + type: array + vcrRepository: + items: + $ref: '#/components/schemas/ACLAction' + type: array + vpcPeeringConnection: + items: + $ref: '#/components/schemas/ACLAction' + type: array + webAnalyticsPlan: + items: + $ref: '#/components/schemas/ACLAction' + type: array + webhook: + items: + $ref: '#/components/schemas/ACLAction' + type: array + webhook-event: + items: + $ref: '#/components/schemas/ACLAction' + type: array + aliasProject: + items: + $ref: '#/components/schemas/ACLAction' + type: array + aliasProtectionBypass: + items: + $ref: '#/components/schemas/ACLAction' + type: array + bulkRedirects: + items: + $ref: '#/components/schemas/ACLAction' + type: array + buildMachine: + items: + $ref: '#/components/schemas/ACLAction' + type: array + connectConfigurationLink: + items: + $ref: '#/components/schemas/ACLAction' + type: array + dataCacheNamespace: + items: + $ref: '#/components/schemas/ACLAction' + type: array + deployment: + items: + $ref: '#/components/schemas/ACLAction' + type: array + deploymentBuildLogs: + items: + $ref: '#/components/schemas/ACLAction' + type: array + deploymentCheck: + items: + $ref: '#/components/schemas/ACLAction' + type: array + deploymentCheckPreview: + items: + $ref: '#/components/schemas/ACLAction' + type: array + deploymentCheckReRunFromProductionBranch: + items: + $ref: '#/components/schemas/ACLAction' + type: array + deploymentProductionGit: + items: + $ref: '#/components/schemas/ACLAction' + type: array + deploymentV0: + items: + $ref: '#/components/schemas/ACLAction' + type: array + deploymentPreview: + items: + $ref: '#/components/schemas/ACLAction' + type: array + deploymentPrivate: + items: + $ref: '#/components/schemas/ACLAction' + type: array + deploymentPromote: + items: + $ref: '#/components/schemas/ACLAction' + type: array + deploymentRollback: + items: + $ref: '#/components/schemas/ACLAction' + type: array + edgeCacheNamespace: + items: + $ref: '#/components/schemas/ACLAction' + type: array + environments: + items: + $ref: '#/components/schemas/ACLAction' + type: array + job: + items: + $ref: '#/components/schemas/ACLAction' + type: array + logs: + items: + $ref: '#/components/schemas/ACLAction' + type: array + logsPreset: + items: + $ref: '#/components/schemas/ACLAction' + type: array + observabilityData: + items: + $ref: '#/components/schemas/ACLAction' + type: array + onDemandBuild: + items: + $ref: '#/components/schemas/ACLAction' + type: array + onDemandConcurrency: + items: + $ref: '#/components/schemas/ACLAction' + type: array + optionsAllowlist: + items: + $ref: '#/components/schemas/ACLAction' + type: array + passwordProtection: + items: + $ref: '#/components/schemas/ACLAction' + type: array + privateLinkEndpoint: + items: + $ref: '#/components/schemas/ACLAction' + type: array + productionAliasProtectionBypass: + items: + $ref: '#/components/schemas/ACLAction' + type: array + productionShareableLink: + items: + $ref: '#/components/schemas/ACLAction' + type: array + project: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectAccessGroup: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectAnalyticsSampling: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectAnalyticsUsage: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectCheck: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectCheckRun: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectDeploymentExpiration: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectDeploymentHook: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectDeploymentProtectionStrict: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectDomain: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectDomainCheckConfig: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectDomainMove: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectDomainVerify: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectEvent: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectEnvVars: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectEnvVarsProduction: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectEnvVarsUnownedByIntegration: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectFlags: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectFlagsProduction: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectFlagsSdkKey: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectFromV0: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectId: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectIntegrationConfiguration: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectLink: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectMember: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectMonitoring: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectOIDCToken: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectPermissions: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectProductionBranch: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectProtectionBypass: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectRollingRelease: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectRoutes: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectSupportCase: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectSupportCaseComment: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectTier: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectTransfer: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectTransferOut: + items: + $ref: '#/components/schemas/ACLAction' + type: array + projectUsage: + items: + $ref: '#/components/schemas/ACLAction' + type: array + pageIntegrity: + items: + $ref: '#/components/schemas/ACLAction' + type: array + seawallConfig: + items: + $ref: '#/components/schemas/ACLAction' + type: array + securityPlusConfiguration: + items: + $ref: '#/components/schemas/ACLAction' + type: array + shareableLink: + items: + $ref: '#/components/schemas/ACLAction' + type: array + shareableLinkStrict: + items: + $ref: '#/components/schemas/ACLAction' + type: array + sharedEnvVarConnection: + items: + $ref: '#/components/schemas/ACLAction' + type: array + skewProtection: + items: + $ref: '#/components/schemas/ACLAction' + type: array + analytics: + items: + $ref: '#/components/schemas/ACLAction' + type: array + trustedIps: + items: + $ref: '#/components/schemas/ACLAction' + type: array + trustedSources: + items: + $ref: '#/components/schemas/ACLAction' + type: array + v0Chat: + items: + $ref: '#/components/schemas/ACLAction' + type: array + vercelAuth: + items: + $ref: '#/components/schemas/ACLAction' + type: array + vercelRun: + items: + $ref: '#/components/schemas/ACLAction' + type: array + webAnalytics: + items: + $ref: '#/components/schemas/ACLAction' + type: array + workflowRunData: + items: + $ref: '#/components/schemas/ACLAction' + type: array + type: object + lastRollbackTarget: + nullable: true + type: string + description: (opaque JSON object) + lastAliasRequest: + nullable: true + properties: + fromDeploymentId: + nullable: true type: string - key: + toDeploymentId: type: string - value: + fromRollingReleaseId: type: string - configurationId: - nullable: true + description: If rolling back from a rolling release, fromDeploymentId captures the "base" of that rolling release, and fromRollingReleaseId captures the "target" of that rolling release. + jobStatus: type: string - createdAt: - type: number - updatedAt: + enum: + - failed + - in-progress + - pending + - skipped + - succeeded + requestedAt: type: number - createdBy: - nullable: true - type: string - updatedBy: - nullable: true - type: string - gitBranch: + type: type: string - edgeConfigId: - nullable: true + enum: + - promote + - rollback + required: + - fromDeploymentId + - jobStatus + - requestedAt + - toDeploymentId + - type + type: object + protectionBypass: + additionalProperties: + oneOf: + - properties: + createdAt: + type: number + createdBy: + type: string + scope: + type: string + enum: + - integration-automation-bypass + integrationId: + type: string + configurationId: + type: string + required: + - configurationId + - createdAt + - createdBy + - integrationId + - scope + type: object + - properties: + createdAt: + type: number + createdBy: + type: string + scope: + type: string + enum: + - automation-bypass + isEnvVar: + type: boolean + enum: + - false + - true + description: When there was only one bypass, it was automatically set as an env var on deployments. With multiple bypasses, there is always one bypass that is selected as the default, and gets set as an env var on deployments. As this is a new field, undefined means that the bypass is the env var. If there are any automation bypasses, exactly one must be the env var. + note: + type: string + description: Optional note about the bypass to be displayed in the UI + required: + - createdAt + - createdBy + - scope + type: object + type: object + hasActiveBranches: + type: boolean + enum: + - false + - true + trustedIps: + nullable: true + properties: + deploymentType: type: string - edgeConfigTokenId: - nullable: true + enum: + - all + - all_except_custom_domains + - preview + - prod_deployment_urls_and_all_previews + - production + addresses: + items: + properties: + value: + type: string + note: + type: string + required: + - value + type: object + type: array + protectionMode: type: string - contentHint: - nullable: true - oneOf: - - properties: - type: - type: string - enum: - - redis-url - storeId: - type: string - required: - - type - - storeId - type: object - - properties: - type: - type: string - enum: - - redis-rest-api-url - storeId: - type: string - required: - - type - - storeId - type: object - - properties: - type: - type: string - enum: - - redis-rest-api-token - storeId: - type: string - required: - - type - - storeId - type: object - - properties: - type: - type: string - enum: - - redis-rest-api-read-only-token - storeId: - type: string - required: - - type - - storeId - type: object - - properties: - type: - type: string - enum: - - blob-read-write-token - storeId: - type: string - required: - - type - - storeId - type: object - - properties: - type: - type: string - enum: - - postgres-url - storeId: - type: string - required: - - type - - storeId - type: object - - properties: - type: - type: string - enum: - - postgres-url-non-pooling - storeId: - type: string - required: - - type - - storeId - type: object - - properties: - type: - type: string - enum: - - postgres-prisma-url - storeId: - type: string - required: - - type - - storeId - type: object - - properties: - type: - type: string - enum: - - postgres-user - storeId: - type: string - required: - - type - - storeId - type: object - - properties: - type: - type: string - enum: - - postgres-host - storeId: - type: string - required: - - type - - storeId - type: object - - properties: - type: - type: string - enum: - - postgres-password - storeId: - type: string - required: - - type - - storeId - type: object - - properties: - type: - type: string - enum: - - postgres-database - storeId: + enum: + - additional + - exclusive + required: + - addresses + - deploymentType + - protectionMode + type: object + trustedSources: + nullable: true + properties: + enableVercelCiSameRepository: + type: boolean + enum: + - false + - true + description: Allow same-team Vercel CI access to preview deployments built from the CI run's repository, using the deployment source rather than the current project repository link. Defaults to enabled when not stored; omitted or null Trusted Sources updates preserve the stored value. + projects: + additionalProperties: + properties: + label: + type: string + customAllow: + items: + properties: + from: + oneOf: + - properties: + slugs: + items: + type: string + type: array + description: System environment slugs (`production`, `preview`) and/or custom environment slugs defined on the referenced project. + preset: + type: string + enum: + - all-custom + required: + - slugs + type: object + description: The source envs on the trusted project that are allowed to access `to`. + - properties: + slugs: + items: + type: string + type: array + description: System environment slugs (`production`, `preview`) and/or custom environment slugs defined on the referenced project. + preset: + type: string + enum: + - all-custom + required: + - preset + type: object + description: The source envs on the trusted project that are allowed to access `to`. + to: + oneOf: + - properties: + slugs: + items: + type: string + type: array + description: System environment slugs (`production`, `preview`) and/or custom environment slugs defined on the referenced project. + preset: + type: string + enum: + - all-custom + required: + - slugs + type: object + description: The target envs on the current project that may be accessed. + - properties: + slugs: + items: + type: string + type: array + description: System environment slugs (`production`, `preview`) and/or custom environment slugs defined on the referenced project. + preset: + type: string + enum: + - all-custom + required: + - preset + type: object + description: The target envs on the current project that may be accessed. + required: + - from + - to + type: object + description: Optional overrides for the default same-env-by-slug matching. Provide explicit rules to allow cross-env access or presets. + type: array + description: Optional overrides for the default same-env-by-slug matching. Provide explicit rules to allow cross-env access or presets. + type: object + type: object + oidcProviders: + additionalProperties: + items: + properties: + to: + oneOf: + - properties: + slugs: + items: + type: string + type: array + description: System environment slugs (`production`, `preview`) and/or custom environment slugs defined on the referenced project. + preset: + type: string + enum: + - all-custom + required: + - slugs + type: object + description: The target envs on the current project that may be accessed. + - properties: + slugs: + items: + type: string + type: array + description: System environment slugs (`production`, `preview`) and/or custom environment slugs defined on the referenced project. + preset: + type: string + enum: + - all-custom + required: + - preset + type: object + description: The target envs on the current project that may be accessed. + label: type: string + claims: + additionalProperties: + items: + type: string + type: array + type: object required: - - type - - storeId + - claims + - to type: object - decrypted: + type: array + type: object + type: object + gitComments: + properties: + onPullRequest: + type: boolean + enum: + - false + - true + description: Whether the Vercel bot should comment on PRs + onCommit: type: boolean - description: Whether `value` is decrypted. + enum: + - false + - true + description: Whether the Vercel bot should comment on commits required: - - type - - key - - value + - onCommit + - onPullRequest type: object - - properties: - target: - oneOf: - - items: - type: string - enum: - - production - - preview - - development - - preview - - development - - preview - - development - type: array - - type: string - enum: - - production - - preview - - development - - preview - - development - - preview - - development - type: + gitProviderOptions: + properties: + createDeployments: type: string enum: - - system - - encrypted - - plain - - sensitive - - secret + - disabled + - enabled + description: 'Whether the Vercel bot should automatically create GitHub deployments https://docs.github.com/en/rest/deployments/deployments#about-deployments NOTE: repository-dispatch events should be used instead' + disableRepositoryDispatchEvents: + type: boolean + enum: + - false + - true + description: 'Whether the Vercel bot should not automatically create GitHub repository-dispatch events on deployment events. https://vercel.com/docs/git/vercel-for-github#repository-dispatch-events - `true`: disable repository-dispatch events for this project (explicit override of the team setting). - `false`: enable repository-dispatch events for this project (explicit override of the team setting). - absent: inherit from `team.disableRepositoryDispatchEvents`.' + requireVerifiedCommits: + type: boolean + enum: + - false + - true + description: 'Whether the project requires commits to be signed & verified before deployments will be created. - `true`: require verified commits for this project (explicit override of the team setting). - `false`: do not require verified commits (explicit override of the team setting). - absent: inherit from `team.requireVerifiedCommits`.' + gitCommitStatus: + type: boolean + enum: + - false + - true + description: Whether Vercel should post commit statuses for this project. When omitted, commit statuses remain enabled. + consolidatedGitCommitStatus: + properties: + enabled: + type: boolean + enum: + - false + - true + description: Whether consolidated commit status is enabled. + propagateFailures: + type: boolean + enum: + - false + - true + description: Whether to propagate individual deployment failures to the consolidated status. + required: + - enabled + - propagateFailures + type: object + description: Configuration for consolidated git commit status reporting. When enabled, Vercel will post a single consolidated commit status instead of individual statuses for each deployment. + required: + - createDeployments + type: object + paused: + type: boolean + enum: + - false + - true + concurrencyBucketName: + type: string + webAnalytics: + properties: id: type: string - key: - type: string - value: - type: string - configurationId: - nullable: true - type: string - createdAt: + disabledAt: type: number - updatedAt: + canceledAt: type: number - createdBy: - nullable: true - type: string - updatedBy: - nullable: true - type: string - gitBranch: - type: string - edgeConfigId: - nullable: true - type: string - edgeConfigTokenId: + enabledAt: + type: number + hasData: + type: boolean + enum: + - true + required: + - id + type: object + security: + properties: + attackModeEnabled: + type: boolean + enum: + - false + - true + attackModeUpdatedAt: + type: number + firewallEnabled: + type: boolean + enum: + - false + - true + firewallUpdatedAt: + type: number + attackModeActiveUntil: nullable: true - type: string - contentHint: + type: number + firewallConfigVersion: + type: number + rulesets: + additionalProperties: + properties: + action: + type: string + enum: + - allow + - bypass + - challenge + - deny + - log + - rate_limit + - redirect + rateLimit: + nullable: true + properties: + algo: + type: string + enum: + - fixed_window + - token_bucket + window: + type: number + limit: + type: number + keys: + items: + type: string + type: array + required: + - algo + - keys + - limit + - window + type: object + redirect: + nullable: true + properties: + location: + type: string + permanent: + type: boolean + enum: + - false + - true + required: + - location + - permanent + type: object + actionDuration: + nullable: true + type: string + bypassSystem: + nullable: true + type: boolean + enum: + - false + - true + - null + logHeaders: + oneOf: + - items: + type: string + type: array + - type: string + enum: + - '*' + required: + - action + type: object + type: object + firewallSeawallEnabled: + type: boolean + enum: + - false + - true + ja3Enabled: + type: boolean + enum: + - false + - true + ja4Enabled: + type: boolean + enum: + - false + - true + firewallBypassIps: + items: + type: string + type: array + managedRules: nullable: true - oneOf: - - properties: - type: - type: string - enum: - - redis-url - storeId: - type: string - required: - - type - - storeId - type: object - - properties: - type: - type: string - enum: - - redis-rest-api-url - storeId: - type: string - required: - - type - - storeId - type: object - - properties: - type: - type: string - enum: - - redis-rest-api-token - storeId: - type: string - required: - - type - - storeId - type: object - - properties: - type: - type: string - enum: - - redis-rest-api-read-only-token - storeId: - type: string - required: - - type - - storeId - type: object - - properties: - type: - type: string - enum: - - blob-read-write-token - storeId: - type: string - required: - - type - - storeId - type: object - - properties: - type: - type: string - enum: - - postgres-url - storeId: - type: string - required: - - type - - storeId - type: object - - properties: - type: - type: string - enum: - - postgres-url-non-pooling - storeId: - type: string - required: - - type - - storeId - type: object - - properties: - type: - type: string + properties: + vercel_ruleset: + properties: + active: + type: boolean enum: - - postgres-prisma-url - storeId: + - false + - true + action: type: string + enum: + - challenge + - deny + - log required: - - type - - storeId + - active type: object - - properties: - type: - type: string + traffic_sources: + properties: + active: + type: boolean enum: - - postgres-user - storeId: + - false + - true + action: type: string + enum: + - challenge + - deny + - log required: - - type - - storeId + - active type: object - - properties: - type: - type: string + bot_filter: + properties: + active: + type: boolean enum: - - postgres-host - storeId: + - false + - true + action: type: string + enum: + - challenge + - deny + - log required: - - type - - storeId + - active type: object - - properties: - type: - type: string + ai_bots: + properties: + active: + type: boolean enum: - - postgres-password - storeId: + - false + - true + action: type: string + enum: + - challenge + - deny + - log required: - - type - - storeId + - active type: object - - properties: - type: - type: string + owasp: + properties: + active: + type: boolean enum: - - postgres-database - storeId: + - false + - true + action: type: string + enum: + - challenge + - deny + - log required: - - type - - storeId + - active type: object - decrypted: + required: + - ai_bots + - bot_filter + - owasp + - traffic_sources + - vercel_ruleset + type: object + botIdEnabled: + type: boolean + enum: + - false + - true + log_headers: + oneOf: + - items: + type: string + type: array + - type: string + enum: + - '*' + securityPlus: + type: boolean + enum: + - false + - true + securityPlusMetadata: + properties: + updatedAt: + type: number + firstEnabledAt: + type: number + description: Timestamp when the feature was first enabled. Never changes after initial enablement. + required: + - updatedAt + type: object + pageIntegrityEnabled: + type: boolean + enum: + - false + - true + description: Whether Page Integrity is enabled for this project. Used by the metadata service to gate DynamoDB lookups against the page-integrity-inventory table. + type: object + oidcTokenConfig: + properties: + enabled: + type: boolean + enum: + - false + - true + description: Whether or not to generate OpenID Connect JSON Web Tokens. + issuerMode: + type: string + enum: + - global + - team + description: '- team: `https://oidc.vercel.com/[team_slug]` - global: `https://oidc.vercel.com`' + type: object + deploymentPolicy: + nullable: true + properties: + gitSources: + nullable: true + items: + properties: + sources: + items: + oneOf: + - properties: + provider: + type: string + enum: + - bitbucket + - github + org: + type: string + repo: + type: string + required: + - org + - provider + type: object + description: Allowlist entry for GitHub and Bitbucket, whose repos are identified by a flat `org`/`repo` (Bitbucket's workspace/owner maps to `org`, its repo slug to `repo`). Omit `repo` to match any repo in the org. Org is matched case-insensitively. + - properties: + provider: + type: string + enum: + - gitlab + namespace: + type: string + project: + type: string + required: + - namespace + - provider + type: object + description: Allowlist entry for GitLab, which uses nested groups rather than a flat org/repo. `namespace` is the full group path (e.g. `group` or `group/subgroup`); `project` is the leaf project name. Omit `project` to match any project under the namespace. Namespace is matched case-insensitively. + type: array + enabled: + type: boolean + enum: + - false + - true + environments: + items: + oneOf: + - properties: + type: + type: string + enum: + - system + target: + type: string + enum: + - preview + - production + required: + - target + - type + type: object + - properties: + type: + type: string + enum: + - custom + environmentId: + type: string + required: + - environmentId + - type + type: object + type: array + required: + - enabled + - environments + - sources + type: object + description: '`enabled: true` with empty `sources` is deny-all.' + type: array + deploymentSources: + nullable: true + items: + properties: + sources: + items: + type: string + enum: + - cli + - deploy-hook + - git + - integration + - rest-api + - v0 + description: 'Customer-configurable deployment sources. Every deploy classifies to exactly one. JSON schema in `packages/deployment-policy/schemas/body.ts` enumerates exactly these values. - `''git''` — git provider webhook. - `''cli''` — Vercel CLI (legacy classic-token CLI and SIWV CLI both). - `''rest-api''` — direct user/team-token REST upload. Does NOT cover deploy hooks, Marketplace integrations, or first-party app tokens. - `''deploy-hook''` — project deploy-hook URL. The URL is the credential. - `''integration''` — third-party Marketplace actor: Marketplace integration token, user-delegated OAuth from a Marketplace app, or an unrecognized third-party Vercel App. First-party Vercel Apps are never `''integration''`. - `''v0''` — the v0 product surface (entitlement-gated). v0 deploys through the CLI under the hood, but classifies as its own source so a team can allow or deny v0 independently of `''cli''`. First-party Vercel apps (Toolbar, etc.) classify as `''first-party''` — see `ClassifiedSource` in `./checks`. They''re not in this union because they aren''t customer-configurable; they bypass `checkDeploymentSources` entirely. v0 is intentionally NOT among them: like the CLI, it''s a real product surface and is policy-controllable.' + type: array + enabled: + type: boolean + enum: + - false + - true + environments: + items: + oneOf: + - properties: + type: + type: string + enum: + - system + target: + type: string + enum: + - preview + - production + required: + - target + - type + type: object + - properties: + type: + type: string + enum: + - custom + environmentId: + type: string + required: + - environmentId + - type + type: object + type: array + required: + - enabled + - environments + - sources + type: object + description: '`enabled: true` with empty `sources` is deny-all.' + type: array + type: object + description: Project shape. `null` on a rule list clears the project's override for that rule type (fall back to team for every env); omitting is equivalent. Setting `deploymentPolicy` itself to `null` clears every override at once. Kept structurally distinct from {@link TeamDeploymentPolicy} so the two storage locations don't share a type by accident. + tier: + type: string + enum: + - advanced + - critical + - priority + usageStatus: + properties: + kind: + type: string + enum: + - flat + description: Billing mode. Always 'flat' for flat-rate projects. + exceededAllowanceUntil: + type: number + description: Timestamp until which the project has exceeded its CDN allowance. + bypassThrottleUntil: + type: number + description: Timestamp until which throttling is bypassed (project pays list rates for overage). + throttled: + type: boolean + enum: + - false + - true + description: Per-project throttle, set explicitly for this project (e.g. via the per-project Flat Rate CDN endpoint). + teamThrottled: + type: boolean + enum: + - false + - true + description: Synced from `team.billing.usageStatus.throttled`. When `true`, the team has throttled all of its projects regardless of `throttled`. The effective throttle the CDN enforces is `throttled || teamThrottled`. + required: + - kind + type: object + features: + properties: + webAnalytics: + type: boolean + enum: + - false + - true + type: object + v0: + type: boolean + enum: + - false + - true + v0Created: + type: boolean + enum: + - false + - true + abuse: + properties: + scanner: + type: string + history: + items: + properties: + scanner: + type: string + reason: + type: string + by: + type: string + byId: + type: string + at: + type: number + required: + - at + - by + - byId + - reason + - scanner + type: object + type: array + updatedAt: + type: number + block: + properties: + action: + type: string + enum: + - blocked + reason: + type: string + statusCode: + type: number + createdAt: + type: number + caseId: + type: string + actor: + type: string + comment: + type: string + ineligibleForAppeal: + type: boolean + enum: + - false + - true + isCascading: + type: boolean + enum: + - false + - true + required: + - action + - createdAt + - reason + - statusCode + type: object + blockHistory: + items: + oneOf: + - properties: + action: + type: string + enum: + - blocked + reason: + type: string + statusCode: + type: number + createdAt: + type: number + caseId: + type: string + actor: + type: string + comment: + type: string + ineligibleForAppeal: + type: boolean + enum: + - false + - true + isCascading: + type: boolean + enum: + - false + - true + required: + - action + - createdAt + - reason + - statusCode + type: object + - properties: + action: + type: string + enum: + - unblocked + createdAt: + type: number + caseId: + type: string + actor: + type: string + comment: + type: string + ineligibleForAppeal: + type: boolean + enum: + - false + - true + isCascading: + type: boolean + enum: + - false + - true + required: + - action + - createdAt + type: object + - properties: + action: + type: string + enum: + - route-blocked + route: + oneOf: + - properties: + src: + type: string + status: + type: number + expiry: + type: number + required: + - src + - status + type: object + - properties: + has: + items: + oneOf: + - properties: + type: + type: string + enum: + - header + key: + type: string + enum: + - x-vercel-ip-country + value: + properties: + eq: + type: string + required: + - eq + type: object + required: + - key + - type + - value + type: object + - properties: + type: + type: string + enum: + - host + value: + properties: + eq: + type: string + required: + - eq + type: object + required: + - type + - value + type: object + type: array + mitigate: + properties: + action: + type: string + enum: + - block_legal_cwc + required: + - action + type: object + src: + type: string + required: + - has + - mitigate + type: object + reason: + type: string + createdAt: + type: number + caseId: + type: string + actor: + type: string + comment: + type: string + ineligibleForAppeal: + type: boolean + enum: + - false + - true + isCascading: + type: boolean + enum: + - false + - true + required: + - action + - createdAt + - reason + - route + type: object + - properties: + action: + type: string + enum: + - route-unblocked + route: + oneOf: + - properties: + src: + type: string + status: + type: number + expiry: + type: number + required: + - src + - status + type: object + - properties: + has: + items: + oneOf: + - properties: + type: + type: string + enum: + - header + key: + type: string + enum: + - x-vercel-ip-country + value: + properties: + eq: + type: string + required: + - eq + type: object + required: + - key + - type + - value + type: object + - properties: + type: + type: string + enum: + - host + value: + properties: + eq: + type: string + required: + - eq + type: object + required: + - type + - value + type: object + type: array + mitigate: + properties: + action: + type: string + enum: + - block_legal_cwc + required: + - action + type: object + src: + type: string + required: + - has + - mitigate + type: object + statusCode: + type: number + createdAt: + type: number + caseId: + type: string + actor: + type: string + comment: + type: string + ineligibleForAppeal: + type: boolean + enum: + - false + - true + isCascading: + type: boolean + enum: + - false + - true + required: + - action + - createdAt + - route + type: object + type: array + interstitial: type: boolean - description: Whether `value` is decrypted. + enum: + - false + - true + interstitialHistory: + items: + properties: + action: + type: string + enum: + - add-deployment-interstitial + - add-project-interstitial + - remove-deployment-interstitial + - remove-project-interstitial + createdAt: + type: number + caseId: + type: string + reason: + type: string + actor: + type: string + comment: + type: string + required: + - action + - createdAt + type: object + type: array required: - - type - - key - - value + - history + - updatedAt + type: object + internalRoutes: + items: + oneOf: + - properties: + src: + type: string + status: + type: number + expiry: + type: number + required: + - src + - status + type: object + - properties: + has: + items: + oneOf: + - properties: + type: + type: string + enum: + - header + key: + type: string + enum: + - x-vercel-ip-country + value: + properties: + eq: + type: string + required: + - eq + type: object + required: + - key + - type + - value + type: object + - properties: + type: + type: string + enum: + - host + value: + properties: + eq: + type: string + required: + - eq + type: object + required: + - type + - value + type: object + type: array + mitigate: + properties: + action: + type: string + enum: + - block_legal_cwc + required: + - action + type: object + src: + type: string + required: + - has + - mitigate + type: object + type: array + hasDeployments: + type: boolean + enum: + - false + - true + dismissedToasts: + items: + properties: + key: + type: string + dismissedAt: + type: number + action: + type: string + enum: + - accept + - cancel + - delete + value: + nullable: true + oneOf: + - type: string + - type: number + - properties: + previousValue: + oneOf: + - type: string + - type: number + - type: boolean + enum: + - false + - true + currentValue: + oneOf: + - type: string + - type: number + - type: boolean + enum: + - false + - true + required: + - currentValue + - previousValue + type: object + - type: boolean + enum: + - false + - true + required: + - action + - dismissedAt + - key + - value + type: object + type: array + protectedSourcemaps: + type: boolean + enum: + - false + - true + tracing: + properties: + domains: + type: string + ignorePaths: + items: + type: string + type: array + samplingRules: + items: + properties: + rate: + type: number + env: + type: string + enum: + - preview + - production + requestPath: + type: string + destination: + type: string + enum: + - external + - internal + description: Which tracing destination this rule applies to. `internal` is the hidden Vercel production-tracing drain (internal delivery); `external` is any customer-configured drain. Derived from the owning drain's delivery type when project tracing is computed; absent on configs persisted before this field existed. + required: + - rate + type: object + type: array type: object + avatar: + nullable: true + type: string + required: + - accountId + - alias + - defaultResourceConfig + - deploymentExpiration + - directoryListing + - id + - name + - nodeVersion + - resourceConfig + type: object + '400': + description: |- + One of the provided values in the request body is invalid. + One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '409': + description: '' + '410': + description: '' + '500': + description: '' + parameters: + - name: project_id + description: The unique project identifier + in: path + required: true + schema: + example: prj_12HKQaOmR5t5Uy6vdcQsNIiZgHGB + description: The unique project identifier + type: string + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + requestBody: + content: + application/json: + schema: + type: object + properties: + microfrontendsGroupId: + type: string + example: mfe_12HKQaOmR5t5Uy6vdcQsNIiZgHGB + description: The unique group identifier to add this microfrontend to + enabled: + type: boolean + example: true + description: Enable or disable microfrontends for the project + isDefaultApp: + type: boolean + example: true + description: Whether the application is the default application for the microfrontends group + defaultRoute: + type: string + example: /home + description: The default route used for screenshots and preview links for the project + routeObservabilityToThisProject: + type: boolean + description: Whether observability data should be routed to this project or a root project. Can only be set for child applications. + doNotRouteWithMicrofrontendsRouting: + type: boolean + description: Whether domains in this project should route as a microfrontend. Can only be set for child applications. + /v10/projects/{project_id}/promote/{deployment_id}: + post: + description: 'Allows users to promote a deployment to production. Note: This does NOT rebuild the deployment. If you need that, then call create-deployments endpoint.' + operationId: requestPromote + security: + - bearerToken: [] + summary: Point production traffic to a given deployment + tags: + - projects + responses: + '201': + description: '' + '202': + description: '' + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '409': + description: '' + '410': + description: '' + '422': + description: '' + parameters: + - name: project_id + in: path + required: true + schema: + type: string + - name: deployment_id + in: path + required: true + schema: + type: string + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + /v1/projects/{project_id}/promote/aliases: + get: + description: Get a list of aliases related to the last promote request with their mapping status + operationId: listPromoteAliases + security: + - bearerToken: [] + summary: Gets a list of aliases with status for the current promote + tags: + - projects + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + aliases: + items: + properties: + status: + type: string + alias: + type: string + id: + type: string + required: + - alias + - id + - status + type: object + type: array + pagination: + $ref: '#/components/schemas/Pagination' + required: + - aliases + - pagination + type: object + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + parameters: + - name: project_id + in: path + required: true + schema: + type: string + - name: limit + description: Maximum number of aliases to list from a request (max 100). + in: query + required: false + schema: + description: Maximum number of aliases to list from a request (max 100). + type: number + example: 20 + maximum: 100 + - name: since + description: Get aliases created after this epoch timestamp. + in: query + required: false + schema: + description: Get aliases created after this epoch timestamp. + type: number + example: 1609499532000 + - name: until + description: Get aliases created before this epoch timestamp. + in: query + required: false + schema: + description: Get aliases created before this epoch timestamp. + type: number + example: 1612264332000 + - name: failedOnly + description: Filter results down to aliases that failed to map to the requested deployment + in: query + required: false + schema: + description: Filter results down to aliases that failed to map to the requested deployment + type: boolean + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + /v1/projects/{project_id}/pause: + post: + description: Pause a project by passing its project `id` in the URL. If the project does not exist given the id then the request will fail with 400 status code. If the project disables auto assigning custom production domains and blocks the active Production Deployment then the request will return with 200 status code. + operationId: pauseProject + security: + - bearerToken: [] + summary: Pause a project + tags: + - projects + responses: + '200': + description: '' '400': description: One of the provided values in the request query is invalid. '401': - description: '' + description: The request is not authorized. '403': description: You do not have permission to access this resource. - '404': + '410': + description: '' + '500': description: '' - '409': - description: The project is being transfered and removing an environment variable is not possible parameters: - - name: idOrName - description: The unique project identifier or the project name + - name: project_id + description: The unique project identifier in: path required: true schema: - description: The unique project identifier or the project name type: string - example: prj_XLKmu1DyR1eY7zq8UgeRKbA7yVLA - - name: id - description: The unique environment variable identifier - in: path - required: true + description: The unique project identifier + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId schema: - description: The unique environment variable identifier type: string - example: XMbOEya1gUUO1ir4 - - description: The Team identifier or slug to perform the request on behalf of. + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. in: query - name: teamId - required: true + name: slug schema: type: string - patch: - description: Edit a specific environment variable for a given project by passing the environment variable identifier and either passing the project `id` or `name` in the URL. - operationId: editProjectEnv + example: my-team-url-slug + /v1/projects/{project_id}/unpause: + post: + description: Unpause a project by passing its project `id` in the URL. If the project does not exist given the id then the request will fail with 400 status code. If the project enables auto assigning custom production domains and unblocks the active Production Deployment then the request will return with 200 status code. + operationId: unpauseProject security: - bearerToken: [] - summary: Edit an environment variable + summary: Unpause a project tags: - projects responses: '200': - description: The environment variable was successfully edited - content: - application/json: - schema: - properties: - target: - oneOf: - - items: - type: string - enum: - - production - - preview - - development - - preview - - development - type: array - - type: string - enum: - - production - - preview - - development - - preview - - development - type: - type: string - enum: - - system - - encrypted - - plain - - sensitive - - secret - id: - type: string - key: - type: string - value: - type: string - configurationId: - nullable: true - type: string - createdAt: - type: number - updatedAt: - type: number - createdBy: - nullable: true - type: string - updatedBy: - nullable: true - type: string - gitBranch: - type: string - edgeConfigId: - nullable: true - type: string - edgeConfigTokenId: - nullable: true - type: string - contentHint: - nullable: true - oneOf: - - properties: - type: - type: string - enum: - - redis-url - storeId: - type: string - required: - - type - - storeId - type: object - - properties: - type: - type: string - enum: - - redis-rest-api-url - storeId: - type: string - required: - - type - - storeId - type: object - - properties: - type: - type: string - enum: - - redis-rest-api-token - storeId: - type: string - required: - - type - - storeId - type: object - - properties: - type: - type: string - enum: - - redis-rest-api-read-only-token - storeId: - type: string - required: - - type - - storeId - type: object - - properties: - type: - type: string - enum: - - blob-read-write-token - storeId: - type: string - required: - - type - - storeId - type: object - - properties: - type: - type: string - enum: - - postgres-url - storeId: - type: string - required: - - type - - storeId - type: object - - properties: - type: - type: string - enum: - - postgres-url-non-pooling - storeId: - type: string - required: - - type - - storeId - type: object - - properties: - type: - type: string - enum: - - postgres-prisma-url - storeId: - type: string - required: - - type - - storeId - type: object - - properties: - type: - type: string - enum: - - postgres-user - storeId: - type: string - required: - - type - - storeId - type: object - - properties: - type: - type: string - enum: - - postgres-host - storeId: - type: string - required: - - type - - storeId - type: object - - properties: - type: - type: string - enum: - - postgres-password - storeId: - type: string - required: - - type - - storeId - type: object - - properties: - type: - type: string - enum: - - postgres-database - storeId: - type: string - required: - - type - - storeId - type: object - decrypted: - type: boolean - description: Whether `value` is decrypted. - required: - - type - - key - - value - type: object + description: '' '400': - description: |- - One of the provided values in the request body is invalid. - One of the provided values in the request query is invalid. + description: One of the provided values in the request query is invalid. '401': - description: '' + description: The request is not authorized. '403': description: You do not have permission to access this resource. - '409': - description: The project is being transfered and removing an environment variable is not possible + '410': + description: '' + '500': + description: '' parameters: - - name: idOrName - description: The unique project identifier or the project name + - name: project_id + description: The unique project identifier in: path required: true schema: - description: The unique project identifier or the project name type: string - example: prj_XLKmu1DyR1eY7zq8UgeRKbA7yVLA - - name: id - description: The unique environment variable identifier - in: path - required: true + description: The unique project identifier + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId schema: - description: The unique environment variable identifier type: string - example: XMbOEya1gUUO1ir4 - - description: The Team identifier or slug to perform the request on behalf of. + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. in: query - name: teamId - required: true + name: slug schema: type: string - requestBody: - content: - application/json: - schema: - type: object - additionalProperties: false - properties: - key: - description: The name of the environment variable - type: string - example: GITHUB_APP_ID - target: - description: The target environment of the environment variable - type: array - items: - enum: - - production - - preview - - development - example: - - preview - gitBranch: - description: The git branch of the environment variable - type: string - maxLength: 250 - example: feature-1 - nullable: true - type: - description: The type of environment variable - type: string - enum: - - system - - secret - - encrypted - - plain - - sensitive - example: plain - value: - description: The value of the environment variable - type: string - example: bkWIjbnxcvo78 + example: my-team-url-slug +components: + schemas: + Pagination: + properties: + count: + type: number + description: Amount of items in the current page. + example: 20 + next: + nullable: true + type: number + description: Timestamp that must be used to request the next page. + example: 1540095775951 + prev: + nullable: true + type: number + description: Timestamp that must be used to request the previous page. + example: 1540095775951 + required: + - count + - next + - prev + type: object + description: This object contains information related to the pagination of the current request, including the necessary parameters to get the next or previous page of data. + ACLAction: + type: string + enum: + - create + - delete + - list + - read + - update + description: Enum containing the actions that can be performed against a resource. Group operations are included. + StackqlOctetStreamBody: + type: object + description: 'Raw request body for octet-stream uploads: the text in `value` is sent verbatim as the request body.' + properties: + value: + type: string + description: Raw body content (sent as-is). + required: + - value + x-stackQL-resources: + projects: + id: vercel.projects.projects + name: projects + title: Projects + methods: + list: + operation: + $ref: '#/paths/~1v10~1projects/get' + response: + mediaType: application/json + openAPIDocKey: '200' + objectKey: $.projects + request: + nativeCasing: camel + config: + pagination: + requestToken: + key: from + location: query + responseToken: + key: $.pagination.next + location: body + queryParamPushdown: + top: + paramName: limit + maxValue: 100 + create: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v11~1projects/post' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + get_token: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v1~1projects~1{id_or_name}~1token/post' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + get: + operation: + $ref: '#/paths/~1v9~1projects~1{id_or_name}/get' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + update: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v9~1projects~1{id_or_name}/patch' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + delete: + operation: + $ref: '#/paths/~1v9~1projects~1{id_or_name}/delete' + response: + mediaType: application/json + openAPIDocKey: '204' + request: + nativeCasing: camel + upload_avatar: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v1~1projects~1{id_or_name}~1avatar/post' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + mediaType: application/octet-stream + required: + - value + schema_override: + $ref: '#/components/schemas/StackqlOctetStreamBody' + transform: + type: golang_template_json_v0.1.0 + body: '{{ .value }}' + nativeCasing: camel + update_protection_bypass: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v1~1projects~1{id_or_name}~1protection-bypass/patch' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + rollback: + operation: + $ref: '#/paths/~1v1~1projects~1{project_id}~1rollback~1{deployment_id}/post' + response: + mediaType: application/json + openAPIDocKey: '201' + request: + nativeCasing: camel + update_rollback_description: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v1~1projects~1{project_id}~1rollback~1{deployment_id}~1update-description/patch' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + update_microfrontends: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v1~1projects~1{project_id}~1microfrontends/patch' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + promote: + operation: + $ref: '#/paths/~1v10~1projects~1{project_id}~1promote~1{deployment_id}/post' + response: + mediaType: application/json + openAPIDocKey: '201' + request: + nativeCasing: camel + pause: + operation: + $ref: '#/paths/~1v1~1projects~1{project_id}~1pause/post' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + unpause: + operation: + $ref: '#/paths/~1v1~1projects~1{project_id}~1unpause/post' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/projects/methods/get' + - $ref: '#/components/x-stackQL-resources/projects/methods/list' + insert: + - $ref: '#/components/x-stackQL-resources/projects/methods/create' + update: + - $ref: '#/components/x-stackQL-resources/projects/methods/update' + delete: + - $ref: '#/components/x-stackQL-resources/projects/methods/delete' + replace: [] + traces: + id: vercel.projects.traces + name: traces + title: Traces + methods: + get: + operation: + $ref: '#/paths/~1v1~1projects~1traces/get' + response: + mediaType: application/json + openAPIDocKey: '200' + objectKey: $.trace + request: + nativeCasing: camel + create_session: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v1~1projects~1traces~1session/post' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/traces/methods/get' + insert: [] + update: [] + delete: [] + replace: [] + domains: + id: vercel.projects.domains + name: domains + title: Domains + methods: + list: + operation: + $ref: '#/paths/~1v9~1projects~1{id_or_name}~1domains/get' + response: + mediaType: application/json + openAPIDocKey: '200' + objectKey: $.domains + request: + nativeCasing: camel + config: + pagination: + requestToken: + key: until + location: query + responseToken: + key: $.pagination.next + location: body + queryParamPushdown: + top: + paramName: limit + maxValue: 100 + get: + operation: + $ref: '#/paths/~1v9~1projects~1{id_or_name}~1domains~1{domain}/get' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + update: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v9~1projects~1{id_or_name}~1domains~1{domain}/patch' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + delete: + operation: + $ref: '#/paths/~1v9~1projects~1{id_or_name}~1domains~1{domain}/delete' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + add: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v10~1projects~1{id_or_name}~1domains/post' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + move: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v1~1projects~1{id_or_name}~1domains~1{domain}~1move/post' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + verify: + operation: + $ref: '#/paths/~1v9~1projects~1{id_or_name}~1domains~1{domain}~1verify/post' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/domains/methods/get' + - $ref: '#/components/x-stackQL-resources/domains/methods/list' + insert: + - $ref: '#/components/x-stackQL-resources/domains/methods/add' + update: + - $ref: '#/components/x-stackQL-resources/domains/methods/update' + delete: + - $ref: '#/components/x-stackQL-resources/domains/methods/delete' + replace: [] + env_vars: + id: vercel.projects.env_vars + name: env_vars + title: Env Vars + methods: + list: + operation: + $ref: '#/paths/~1v10~1projects~1{id_or_name}~1env/get' + response: + mediaType: application/json + openAPIDocKey: '200' + objectKey: $.envs + request: + nativeCasing: camel + create: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v10~1projects~1{id_or_name}~1env/post' + response: + mediaType: application/json + openAPIDocKey: '201' + request: + nativeCasing: camel + get: + operation: + $ref: '#/paths/~1v1~1projects~1{id_or_name}~1env~1{id}/get' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + delete: + operation: + $ref: '#/paths/~1v9~1projects~1{id_or_name}~1env~1{id}/delete' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + update: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v9~1projects~1{id_or_name}~1env~1{id}/patch' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + batch_delete: + operation: + $ref: '#/paths/~1v1~1projects~1{id_or_name}~1env/delete' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/env_vars/methods/get' + - $ref: '#/components/x-stackQL-resources/env_vars/methods/list' + insert: + - $ref: '#/components/x-stackQL-resources/env_vars/methods/create' + update: + - $ref: '#/components/x-stackQL-resources/env_vars/methods/update' + delete: + - $ref: '#/components/x-stackQL-resources/env_vars/methods/delete' + - $ref: '#/components/x-stackQL-resources/env_vars/methods/batch_delete' + replace: [] + transfer_requests: + id: vercel.projects.transfer_requests + name: transfer_requests + title: Transfer Requests + methods: + create: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1projects~1{id_or_name}~1transfer-request/post' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + accept: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1projects~1transfer-request~1{code}/put' + response: + mediaType: application/json + openAPIDocKey: '202' + request: + nativeCasing: camel + sqlVerbs: + select: [] + insert: + - $ref: '#/components/x-stackQL-resources/transfer_requests/methods/create' + update: [] + delete: [] + replace: [] + promote_aliases: + id: vercel.projects.promote_aliases + name: promote_aliases + title: Promote Aliases + methods: + list: + operation: + $ref: '#/paths/~1v1~1projects~1{project_id}~1promote~1aliases/get' + response: + mediaType: application/json + openAPIDocKey: '200' + objectKey: $.aliases + request: + nativeCasing: camel + config: + pagination: + requestToken: + key: until + location: query + responseToken: + key: $.pagination.next + location: body + queryParamPushdown: + top: + paramName: limit + maxValue: 100 + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/promote_aliases/methods/list' + insert: [] + update: [] + delete: [] + replace: [] +servers: + - url: https://api.vercel.com diff --git a/provider-dev/openapi/src/vercel/v00.00.00000/services/rolling_release.yaml b/provider-dev/openapi/src/vercel/v00.00.00000/services/rolling_release.yaml new file mode 100644 index 0000000..e99927a --- /dev/null +++ b/provider-dev/openapi/src/vercel/v00.00.00000/services/rolling_release.yaml @@ -0,0 +1,2283 @@ +openapi: 3.0.3 +info: + title: rolling_release API + description: vercel rolling_release API + version: 0.0.1 +paths: + /v1/projects/{id_or_name}/rolling-release/billing: + get: + description: Get the Rolling Releases billing status for a project. The team level billing status is used to determine if the project can be configured for rolling releases. + operationId: getRollingReleaseBillingStatus + security: + - bearerToken: [] + summary: Get rolling release billing status + tags: + - rolling-release + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + availableSlots: + type: number + enum: + - 0 + reason: + type: string + enum: + - plan_not_supported + message: + type: string + enabledProjects: + items: + type: string + type: array + required: + - availableSlots + - message + - reason + - enabledProjects + type: object + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + parameters: + - name: id_or_name + description: Project ID or project name (URL-encoded) + in: path + required: true + schema: + description: Project ID or project name (URL-encoded) + type: string + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + /v1/projects/{id_or_name}/rolling-release/config: + get: + description: Get the Rolling Releases configuration for a project. The project-level config is simply a template that will be used for any future rolling release, and not the configuration for any active rolling release. + operationId: getRollingReleaseConfig + security: + - bearerToken: [] + summary: Get rolling release configuration + tags: + - rolling-release + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + rollingRelease: + nullable: true + properties: + target: + type: string + description: The environment that the release targets, currently only supports production. Adding in case we want to configure with alias groups or custom environments. + example: production + stages: + nullable: true + items: + properties: + targetPercentage: + type: number + description: The percentage of traffic to serve to the canary deployment (0-100) + example: 25 + requireApproval: + type: boolean + enum: + - false + - true + description: Whether or not this stage requires manual approval to proceed + example: false + duration: + type: number + description: Duration in minutes for automatic advancement to the next stage + example: 600 + linearShift: + type: boolean + enum: + - false + - true + description: Whether to linearly shift traffic over the duration of this stage + example: false + required: + - targetPercentage + type: object + description: 'An array of all the stages required during a deployment release. Each stage defines a target percentage and advancement rules. The final stage must always have targetPercentage: 100.' + type: array + description: 'An array of all the stages required during a deployment release. Each stage defines a target percentage and advancement rules. The final stage must always have targetPercentage: 100.' + canaryResponseHeader: + type: boolean + enum: + - false + - true + description: Whether the request served by a canary deployment should return a header indicating a canary was served. Defaults to `false` when omitted. + example: false + gate: + properties: + enabled: + type: boolean + enum: + - false + - true + description: Whether automated gating is enabled for this project's rollouts. + checks: + items: + properties: + type: + type: string + enum: + - error-rate-5xx + description: The metric this check evaluates. + minSampleSize: + type: number + description: Minimum number of requests required in the window before the check can fail. Below this, the check is inconclusive rather than failing, so low-traffic stages don't gate on noise. Defaults to `100` when omitted. + example: 100 + excludeStatusCodes: + items: + type: number + type: array + description: Response status codes to ignore entirely — dropped from both the numerator (errors) and the denominator (total requests). Defaults to `[]` when omitted. + example: + - 503 + excludePaths: + items: + type: string + type: array + description: Request paths to ignore entirely — dropped from both the numerator (errors) and the denominator (total requests). Matched exactly against the request path with any query string removed; no prefix or glob matching. Defaults to `[]` when omitted. + example: + - /api/health + ingestWatermarkSeconds: + type: number + description: 'Seconds of ingest lag to allow for: the query''s upper bound is `now() - this value`, so the check never reads a window that is still filling. Defaults to `30` when omitted.' + example: 30 + required: + - type + type: object + description: The checks to evaluate. An empty array means nothing is evaluated. + type: array + description: The checks to evaluate. An empty array means nothing is evaluated. + failureThreshold: + type: number + description: How many failing evaluations within {@link windowSize} trip the gate. Defaults to `3` when omitted. + example: 3 + windowSize: + type: number + description: How many of the most recent evaluations {@link failureThreshold} is counted against. Defaults to `5` when omitted. + example: 5 + action: + type: string + enum: + - pause + - rollback + description: 'What to do when the gate trips: pause the rollout, or roll it back.' + dryRun: + type: boolean + enum: + - false + - true + description: When true, a tripped gate is only reported — {@link action} is not taken. + required: + - action + - checks + - dryRun + - enabled + type: object + description: 'Automated gating configuration. Omitted (the default) means no gating is configured, which is equivalent to `enabled: false`.' + required: + - target + type: object + description: Project-level rolling release configuration that defines how deployments should be gradually rolled out + required: + - rollingRelease + type: object + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + parameters: + - name: id_or_name + description: Project ID or project name (URL-encoded) + in: path + required: true + schema: + description: Project ID or project name (URL-encoded) + type: string + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + delete: + description: Disable Rolling Releases for a project means that future deployments will not undergo a rolling release. Changing the config never alters a rollout that's already in-flight—it only affects the next production deployment. If you want to also stop the current rollout, call this endpoint to disable the feature, and then call either the /complete or /abort endpoint. + operationId: deleteRollingReleaseConfig + security: + - bearerToken: [] + summary: Delete rolling release configuration + tags: + - rolling-release + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + rollingRelease: + nullable: true + required: + - rollingRelease + type: object + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + parameters: + - name: id_or_name + description: Project ID or project name (URL-encoded) + in: path + required: true + schema: + description: Project ID or project name (URL-encoded) + type: string + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + patch: + description: 'Update (or disable) Rolling Releases for a project. When disabling with the resolve-on-disable feature flag enabled, any active rolling release document is resolved using the disableRolloutAction parameter: "abort" to roll back (default), or "complete" to promote the canary to production. When enabling or updating config, changes only affect the next production deployment and do not alter a rollout that''s already in-flight. Note: Enabling Rolling Releases automatically enables skew protection on the project with the default value if it wasn''t configured already.' + operationId: updateRollingReleaseConfig + security: + - bearerToken: [] + summary: Update the rolling release settings for the project + tags: + - rolling-release + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + rollingRelease: + nullable: true + required: + - rollingRelease + type: object + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + parameters: + - name: id_or_name + description: Project ID or project name (URL-encoded) + in: path + required: true + schema: + description: Project ID or project name (URL-encoded) + type: string + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + /v1/projects/{id_or_name}/rolling-release: + get: + description: Return the Rolling Release for a project, regardless of whether the rollout is active, aborted, or completed. If the feature is enabled but no deployment has occurred yet, null will be returned. + operationId: getRollingRelease + security: + - bearerToken: [] + summary: Get the active rolling release information for a project + tags: + - rolling-release + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + rollingRelease: + nullable: true + properties: + state: + type: string + enum: + - ABORTED + - ACTIVE + - COMPLETE + description: The current state of the rolling release + example: ACTIVE + substate: + nullable: true + type: string + enum: + - PAUSED + - null + description: When set to `PAUSED`, the rollout is frozen at the current percentage until continued. + currentDeployment: + nullable: true + properties: + name: + type: string + description: The name of the project associated with the deployment at the time that the deployment was created + example: my-project + createdAt: + type: number + description: A number containing the date when the deployment was created in milliseconds + example: 1540257589405 + readyState: + type: string + enum: + - BLOCKED + - BUILDING + - CANCELED + - ERROR + - INITIALIZING + - QUEUED + - READY + description: The state of the deployment depending on the process of deploying, or if it is ready or in an error state + example: READY + id: + type: string + description: A string holding the unique ID of the deployment + example: dpl_89qyp1cskzkLrVicDaZoDbjyHuDJ + target: + nullable: true + type: string + enum: + - production + - staging + - null + description: If defined, either `staging` if a staging alias in the format `..now.sh` was assigned upon creation, or `production` if the aliases from `alias` were assigned. `null` value indicates the "preview" deployment. + example: null + readyStateAt: + type: number + source: + type: string + enum: + - api-trigger-git-deploy + - cli + - clone/repo + - drop + - git + - git-deploy-hook + - import + - import/repo + - redeploy + - v0-web + description: Where was the deployment created from. Best-effort guess for metrics only — not authoritative; do not gate behavior on it. + example: cli + url: + type: string + description: A string with the unique URL of the deployment + example: my-instant-deployment-3ij3cxz9qr.now.sh + required: + - createdAt + - id + - name + - readyState + - url + type: object + description: The current deployment receiving production traffic + example: + id: dpl_abc123 + name: my-shop@main + url: my-shop.vercel.app + target: production + source: git + createdAt: 1716206500000 + readyState: READY + readyStateAt: 1716206800000 + canaryDeployment: + nullable: true + properties: + name: + type: string + description: The name of the project associated with the deployment at the time that the deployment was created + example: my-project + createdAt: + type: number + description: A number containing the date when the deployment was created in milliseconds + example: 1540257589405 + readyState: + type: string + enum: + - BLOCKED + - BUILDING + - CANCELED + - ERROR + - INITIALIZING + - QUEUED + - READY + description: The state of the deployment depending on the process of deploying, or if it is ready or in an error state + example: READY + id: + type: string + description: A string holding the unique ID of the deployment + example: dpl_89qyp1cskzkLrVicDaZoDbjyHuDJ + target: + nullable: true + type: string + enum: + - production + - staging + - null + description: If defined, either `staging` if a staging alias in the format `..now.sh` was assigned upon creation, or `production` if the aliases from `alias` were assigned. `null` value indicates the "preview" deployment. + example: null + readyStateAt: + type: number + source: + type: string + enum: + - api-trigger-git-deploy + - cli + - clone/repo + - drop + - git + - git-deploy-hook + - import + - import/repo + - redeploy + - v0-web + description: Where was the deployment created from. Best-effort guess for metrics only — not authoritative; do not gate behavior on it. + example: cli + url: + type: string + description: A string with the unique URL of the deployment + example: my-instant-deployment-3ij3cxz9qr.now.sh + required: + - createdAt + - id + - name + - readyState + - url + type: object + description: The canary deployment being rolled out + example: + id: dpl_def456 + name: my-shop@9c7e2f4 + url: 9c7e2f4-my-shop.vercel.app + target: production + source: git + createdAt: 1716210100000 + readyState: READY + readyStateAt: 1716210400000 + queuedDeploymentId: + nullable: true + type: string + description: The ID of a deployment queued for the next rolling release + example: dpl_ghi789 + advancementType: + type: string + enum: + - automatic + - manual-approval + description: The advancement type of the rolling release + example: manual-approval + stages: + items: + properties: + index: + type: number + description: The zero-based index of the stage + example: 0 + isFinalStage: + type: boolean + enum: + - false + - true + description: Whether or not this stage is the final stage (targetPercentage === 100) + example: false + targetPercentage: + type: number + description: The percentage of traffic to serve to the canary deployment (0-100) + example: 25 + requireApproval: + type: boolean + enum: + - false + - true + description: Whether or not this stage requires manual approval to proceed + duration: + nullable: true + type: number + description: Duration in seconds for automatic advancement, null for manual stages or the final stage + example: null + linearShift: + type: boolean + enum: + - false + - true + description: Whether to linearly shift traffic over the duration of this stage + example: false + required: + - duration + - index + - isFinalStage + - requireApproval + - targetPercentage + type: object + description: All stages configured for this rolling release + example: + - index: 0 + isFinalStage: false + targetPercentage: 5 + requireApproval: true + duration: null + - index: 1 + isFinalStage: false + targetPercentage: 25 + requireApproval: true + duration: null + - index: 2 + isFinalStage: false + targetPercentage: 60 + requireApproval: true + duration: null + - index: 3 + isFinalStage: true + targetPercentage: 100 + requireApproval: false + duration: null + type: array + description: All stages configured for this rolling release + example: + - index: 0 + isFinalStage: false + targetPercentage: 5 + requireApproval: true + duration: null + - index: 1 + isFinalStage: false + targetPercentage: 25 + requireApproval: true + duration: null + - index: 2 + isFinalStage: false + targetPercentage: 60 + requireApproval: true + duration: null + - index: 3 + isFinalStage: true + targetPercentage: 100 + requireApproval: false + duration: null + activeStage: + nullable: true + properties: + index: + type: number + description: The zero-based index of the stage + example: 0 + isFinalStage: + type: boolean + enum: + - false + - true + description: Whether or not this stage is the final stage (targetPercentage === 100) + example: false + targetPercentage: + type: number + description: The percentage of traffic to serve to the canary deployment (0-100) + example: 25 + requireApproval: + type: boolean + enum: + - false + - true + description: Whether or not this stage requires manual approval to proceed + duration: + nullable: true + type: number + description: Duration in seconds for automatic advancement, null for manual stages or the final stage + example: null + linearShift: + type: boolean + enum: + - false + - true + description: Whether to linearly shift traffic over the duration of this stage + example: false + required: + - duration + - index + - isFinalStage + - requireApproval + - targetPercentage + type: object + description: The currently active stage, null if the rollout is aborted + example: + index: 1 + isFinalStage: false + targetPercentage: 25 + requireApproval: true + duration: null + nextStage: + nullable: true + properties: + index: + type: number + description: The zero-based index of the stage + example: 0 + isFinalStage: + type: boolean + enum: + - false + - true + description: Whether or not this stage is the final stage (targetPercentage === 100) + example: false + targetPercentage: + type: number + description: The percentage of traffic to serve to the canary deployment (0-100) + example: 25 + requireApproval: + type: boolean + enum: + - false + - true + description: Whether or not this stage requires manual approval to proceed + duration: + nullable: true + type: number + description: Duration in seconds for automatic advancement, null for manual stages or the final stage + example: null + linearShift: + type: boolean + enum: + - false + - true + description: Whether to linearly shift traffic over the duration of this stage + example: false + required: + - duration + - index + - isFinalStage + - requireApproval + - targetPercentage + type: object + description: The next stage to be activated, null if not in ACTIVE state + example: + index: 2 + isFinalStage: false + targetPercentage: 60 + requireApproval: true + duration: null + startedAt: + type: number + description: Unix timestamp in milliseconds when the rolling release started + example: 1716210500000 + updatedAt: + type: number + description: Unix timestamp in milliseconds when the rolling release was last updated + example: 1716210600000 + currentCanaryPercentage: + type: number + description: When set (for example while {@link substate} is `PAUSED`), the canary traffic percentage persisted on the rollout document — use for dashboard display when linear shift is active. + required: + - activeStage + - advancementType + - canaryDeployment + - currentDeployment + - nextStage + - queuedDeploymentId + - stages + - startedAt + - state + - substate + - updatedAt + type: object + description: Rolling release information including configuration and document details, or null if no rolling release exists + required: + - rollingRelease + type: object + description: The response format for rolling release endpoints that return rolling release information + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + parameters: + - name: id_or_name + description: Project ID or project name (URL-encoded) + in: path + required: true + schema: + description: Project ID or project name (URL-encoded) + type: string + - name: state + description: Filter by rolling release state + in: query + required: false + schema: + description: Filter by rolling release state + type: string + enum: + - ACTIVE + - COMPLETE + - ABORTED + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + /v1/projects/{id_or_name}/rolling-release/approve-stage: + post: + description: Advance a rollout to the next stage. This is only needed when rolling releases is configured to require manual approval. + operationId: approveRollingReleaseStage + security: + - bearerToken: [] + summary: Update the active rolling release to the next stage for a project + tags: + - rolling-release + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + rollingRelease: + nullable: true + properties: + state: + type: string + enum: + - ABORTED + - ACTIVE + - COMPLETE + description: The current state of the rolling release + example: ACTIVE + substate: + nullable: true + type: string + enum: + - PAUSED + - null + description: When set to `PAUSED`, the rollout is frozen at the current percentage until continued. + currentDeployment: + nullable: true + properties: + name: + type: string + description: The name of the project associated with the deployment at the time that the deployment was created + example: my-project + createdAt: + type: number + description: A number containing the date when the deployment was created in milliseconds + example: 1540257589405 + readyState: + type: string + enum: + - BLOCKED + - BUILDING + - CANCELED + - ERROR + - INITIALIZING + - QUEUED + - READY + description: The state of the deployment depending on the process of deploying, or if it is ready or in an error state + example: READY + id: + type: string + description: A string holding the unique ID of the deployment + example: dpl_89qyp1cskzkLrVicDaZoDbjyHuDJ + target: + nullable: true + type: string + enum: + - production + - staging + - null + description: If defined, either `staging` if a staging alias in the format `..now.sh` was assigned upon creation, or `production` if the aliases from `alias` were assigned. `null` value indicates the "preview" deployment. + example: null + readyStateAt: + type: number + source: + type: string + enum: + - api-trigger-git-deploy + - cli + - clone/repo + - drop + - git + - git-deploy-hook + - import + - import/repo + - redeploy + - v0-web + description: Where was the deployment created from. Best-effort guess for metrics only — not authoritative; do not gate behavior on it. + example: cli + url: + type: string + description: A string with the unique URL of the deployment + example: my-instant-deployment-3ij3cxz9qr.now.sh + required: + - createdAt + - id + - name + - readyState + - url + type: object + description: The current deployment receiving production traffic + example: + id: dpl_abc123 + name: my-shop@main + url: my-shop.vercel.app + target: production + source: git + createdAt: 1716206500000 + readyState: READY + readyStateAt: 1716206800000 + canaryDeployment: + nullable: true + properties: + name: + type: string + description: The name of the project associated with the deployment at the time that the deployment was created + example: my-project + createdAt: + type: number + description: A number containing the date when the deployment was created in milliseconds + example: 1540257589405 + readyState: + type: string + enum: + - BLOCKED + - BUILDING + - CANCELED + - ERROR + - INITIALIZING + - QUEUED + - READY + description: The state of the deployment depending on the process of deploying, or if it is ready or in an error state + example: READY + id: + type: string + description: A string holding the unique ID of the deployment + example: dpl_89qyp1cskzkLrVicDaZoDbjyHuDJ + target: + nullable: true + type: string + enum: + - production + - staging + - null + description: If defined, either `staging` if a staging alias in the format `..now.sh` was assigned upon creation, or `production` if the aliases from `alias` were assigned. `null` value indicates the "preview" deployment. + example: null + readyStateAt: + type: number + source: + type: string + enum: + - api-trigger-git-deploy + - cli + - clone/repo + - drop + - git + - git-deploy-hook + - import + - import/repo + - redeploy + - v0-web + description: Where was the deployment created from. Best-effort guess for metrics only — not authoritative; do not gate behavior on it. + example: cli + url: + type: string + description: A string with the unique URL of the deployment + example: my-instant-deployment-3ij3cxz9qr.now.sh + required: + - createdAt + - id + - name + - readyState + - url + type: object + description: The canary deployment being rolled out + example: + id: dpl_def456 + name: my-shop@9c7e2f4 + url: 9c7e2f4-my-shop.vercel.app + target: production + source: git + createdAt: 1716210100000 + readyState: READY + readyStateAt: 1716210400000 + queuedDeploymentId: + nullable: true + type: string + description: The ID of a deployment queued for the next rolling release + example: dpl_ghi789 + advancementType: + type: string + enum: + - automatic + - manual-approval + description: The advancement type of the rolling release + example: manual-approval + stages: + items: + properties: + index: + type: number + description: The zero-based index of the stage + example: 0 + isFinalStage: + type: boolean + enum: + - false + - true + description: Whether or not this stage is the final stage (targetPercentage === 100) + example: false + targetPercentage: + type: number + description: The percentage of traffic to serve to the canary deployment (0-100) + example: 25 + requireApproval: + type: boolean + enum: + - false + - true + description: Whether or not this stage requires manual approval to proceed + duration: + nullable: true + type: number + description: Duration in seconds for automatic advancement, null for manual stages or the final stage + example: null + linearShift: + type: boolean + enum: + - false + - true + description: Whether to linearly shift traffic over the duration of this stage + example: false + required: + - duration + - index + - isFinalStage + - requireApproval + - targetPercentage + type: object + description: All stages configured for this rolling release + example: + - index: 0 + isFinalStage: false + targetPercentage: 5 + requireApproval: true + duration: null + - index: 1 + isFinalStage: false + targetPercentage: 25 + requireApproval: true + duration: null + - index: 2 + isFinalStage: false + targetPercentage: 60 + requireApproval: true + duration: null + - index: 3 + isFinalStage: true + targetPercentage: 100 + requireApproval: false + duration: null + type: array + description: All stages configured for this rolling release + example: + - index: 0 + isFinalStage: false + targetPercentage: 5 + requireApproval: true + duration: null + - index: 1 + isFinalStage: false + targetPercentage: 25 + requireApproval: true + duration: null + - index: 2 + isFinalStage: false + targetPercentage: 60 + requireApproval: true + duration: null + - index: 3 + isFinalStage: true + targetPercentage: 100 + requireApproval: false + duration: null + activeStage: + nullable: true + properties: + index: + type: number + description: The zero-based index of the stage + example: 0 + isFinalStage: + type: boolean + enum: + - false + - true + description: Whether or not this stage is the final stage (targetPercentage === 100) + example: false + targetPercentage: + type: number + description: The percentage of traffic to serve to the canary deployment (0-100) + example: 25 + requireApproval: + type: boolean + enum: + - false + - true + description: Whether or not this stage requires manual approval to proceed + duration: + nullable: true + type: number + description: Duration in seconds for automatic advancement, null for manual stages or the final stage + example: null + linearShift: + type: boolean + enum: + - false + - true + description: Whether to linearly shift traffic over the duration of this stage + example: false + required: + - duration + - index + - isFinalStage + - requireApproval + - targetPercentage + type: object + description: The currently active stage, null if the rollout is aborted + example: + index: 1 + isFinalStage: false + targetPercentage: 25 + requireApproval: true + duration: null + nextStage: + nullable: true + properties: + index: + type: number + description: The zero-based index of the stage + example: 0 + isFinalStage: + type: boolean + enum: + - false + - true + description: Whether or not this stage is the final stage (targetPercentage === 100) + example: false + targetPercentage: + type: number + description: The percentage of traffic to serve to the canary deployment (0-100) + example: 25 + requireApproval: + type: boolean + enum: + - false + - true + description: Whether or not this stage requires manual approval to proceed + duration: + nullable: true + type: number + description: Duration in seconds for automatic advancement, null for manual stages or the final stage + example: null + linearShift: + type: boolean + enum: + - false + - true + description: Whether to linearly shift traffic over the duration of this stage + example: false + required: + - duration + - index + - isFinalStage + - requireApproval + - targetPercentage + type: object + description: The next stage to be activated, null if not in ACTIVE state + example: + index: 2 + isFinalStage: false + targetPercentage: 60 + requireApproval: true + duration: null + startedAt: + type: number + description: Unix timestamp in milliseconds when the rolling release started + example: 1716210500000 + updatedAt: + type: number + description: Unix timestamp in milliseconds when the rolling release was last updated + example: 1716210600000 + currentCanaryPercentage: + type: number + description: When set (for example while {@link substate} is `PAUSED`), the canary traffic percentage persisted on the rollout document — use for dashboard display when linear shift is active. + required: + - activeStage + - advancementType + - canaryDeployment + - currentDeployment + - nextStage + - queuedDeploymentId + - stages + - startedAt + - state + - substate + - updatedAt + type: object + description: Rolling release information including configuration and document details, or null if no rolling release exists + required: + - rollingRelease + type: object + description: The response format for rolling release endpoints that return rolling release information + '400': + description: |- + One of the provided values in the request body is invalid. + One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + '500': + description: '' + parameters: + - name: id_or_name + description: Project ID or project name (URL-encoded) + in: path + required: true + schema: + description: Project ID or project name (URL-encoded) + type: string + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + requestBody: + content: + application/json: + schema: + type: object + required: + - nextStageIndex + - canaryDeploymentId + properties: + nextStageIndex: + description: The index of the stage to transition to + type: number + canaryDeploymentId: + description: The id of the canary deployment to approve for the next stage + type: string + /v1/projects/{id_or_name}/rolling-release/start: + post: + description: Start a rolling release for a deployment. If a rolling release is already active for the same canary deployment, returns the current state without side effects. + operationId: startRollingRelease + security: + - bearerToken: [] + summary: Start a rolling release for the project + tags: + - rolling-release + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + rollingRelease: + nullable: true + properties: + state: + type: string + enum: + - ABORTED + - ACTIVE + - COMPLETE + description: The current state of the rolling release + example: ACTIVE + substate: + nullable: true + type: string + enum: + - PAUSED + - null + description: When set to `PAUSED`, the rollout is frozen at the current percentage until continued. + currentDeployment: + nullable: true + properties: + name: + type: string + description: The name of the project associated with the deployment at the time that the deployment was created + example: my-project + createdAt: + type: number + description: A number containing the date when the deployment was created in milliseconds + example: 1540257589405 + readyState: + type: string + enum: + - BLOCKED + - BUILDING + - CANCELED + - ERROR + - INITIALIZING + - QUEUED + - READY + description: The state of the deployment depending on the process of deploying, or if it is ready or in an error state + example: READY + id: + type: string + description: A string holding the unique ID of the deployment + example: dpl_89qyp1cskzkLrVicDaZoDbjyHuDJ + target: + nullable: true + type: string + enum: + - production + - staging + - null + description: If defined, either `staging` if a staging alias in the format `..now.sh` was assigned upon creation, or `production` if the aliases from `alias` were assigned. `null` value indicates the "preview" deployment. + example: null + readyStateAt: + type: number + source: + type: string + enum: + - api-trigger-git-deploy + - cli + - clone/repo + - drop + - git + - git-deploy-hook + - import + - import/repo + - redeploy + - v0-web + description: Where was the deployment created from. Best-effort guess for metrics only — not authoritative; do not gate behavior on it. + example: cli + url: + type: string + description: A string with the unique URL of the deployment + example: my-instant-deployment-3ij3cxz9qr.now.sh + required: + - createdAt + - id + - name + - readyState + - url + type: object + description: The current deployment receiving production traffic + example: + id: dpl_abc123 + name: my-shop@main + url: my-shop.vercel.app + target: production + source: git + createdAt: 1716206500000 + readyState: READY + readyStateAt: 1716206800000 + canaryDeployment: + nullable: true + properties: + name: + type: string + description: The name of the project associated with the deployment at the time that the deployment was created + example: my-project + createdAt: + type: number + description: A number containing the date when the deployment was created in milliseconds + example: 1540257589405 + readyState: + type: string + enum: + - BLOCKED + - BUILDING + - CANCELED + - ERROR + - INITIALIZING + - QUEUED + - READY + description: The state of the deployment depending on the process of deploying, or if it is ready or in an error state + example: READY + id: + type: string + description: A string holding the unique ID of the deployment + example: dpl_89qyp1cskzkLrVicDaZoDbjyHuDJ + target: + nullable: true + type: string + enum: + - production + - staging + - null + description: If defined, either `staging` if a staging alias in the format `..now.sh` was assigned upon creation, or `production` if the aliases from `alias` were assigned. `null` value indicates the "preview" deployment. + example: null + readyStateAt: + type: number + source: + type: string + enum: + - api-trigger-git-deploy + - cli + - clone/repo + - drop + - git + - git-deploy-hook + - import + - import/repo + - redeploy + - v0-web + description: Where was the deployment created from. Best-effort guess for metrics only — not authoritative; do not gate behavior on it. + example: cli + url: + type: string + description: A string with the unique URL of the deployment + example: my-instant-deployment-3ij3cxz9qr.now.sh + required: + - createdAt + - id + - name + - readyState + - url + type: object + description: The canary deployment being rolled out + example: + id: dpl_def456 + name: my-shop@9c7e2f4 + url: 9c7e2f4-my-shop.vercel.app + target: production + source: git + createdAt: 1716210100000 + readyState: READY + readyStateAt: 1716210400000 + queuedDeploymentId: + nullable: true + type: string + description: The ID of a deployment queued for the next rolling release + example: dpl_ghi789 + advancementType: + type: string + enum: + - automatic + - manual-approval + description: The advancement type of the rolling release + example: manual-approval + stages: + items: + properties: + index: + type: number + description: The zero-based index of the stage + example: 0 + isFinalStage: + type: boolean + enum: + - false + - true + description: Whether or not this stage is the final stage (targetPercentage === 100) + example: false + targetPercentage: + type: number + description: The percentage of traffic to serve to the canary deployment (0-100) + example: 25 + requireApproval: + type: boolean + enum: + - false + - true + description: Whether or not this stage requires manual approval to proceed + duration: + nullable: true + type: number + description: Duration in seconds for automatic advancement, null for manual stages or the final stage + example: null + linearShift: + type: boolean + enum: + - false + - true + description: Whether to linearly shift traffic over the duration of this stage + example: false + required: + - duration + - index + - isFinalStage + - requireApproval + - targetPercentage + type: object + description: All stages configured for this rolling release + example: + - index: 0 + isFinalStage: false + targetPercentage: 5 + requireApproval: true + duration: null + - index: 1 + isFinalStage: false + targetPercentage: 25 + requireApproval: true + duration: null + - index: 2 + isFinalStage: false + targetPercentage: 60 + requireApproval: true + duration: null + - index: 3 + isFinalStage: true + targetPercentage: 100 + requireApproval: false + duration: null + type: array + description: All stages configured for this rolling release + example: + - index: 0 + isFinalStage: false + targetPercentage: 5 + requireApproval: true + duration: null + - index: 1 + isFinalStage: false + targetPercentage: 25 + requireApproval: true + duration: null + - index: 2 + isFinalStage: false + targetPercentage: 60 + requireApproval: true + duration: null + - index: 3 + isFinalStage: true + targetPercentage: 100 + requireApproval: false + duration: null + activeStage: + nullable: true + properties: + index: + type: number + description: The zero-based index of the stage + example: 0 + isFinalStage: + type: boolean + enum: + - false + - true + description: Whether or not this stage is the final stage (targetPercentage === 100) + example: false + targetPercentage: + type: number + description: The percentage of traffic to serve to the canary deployment (0-100) + example: 25 + requireApproval: + type: boolean + enum: + - false + - true + description: Whether or not this stage requires manual approval to proceed + duration: + nullable: true + type: number + description: Duration in seconds for automatic advancement, null for manual stages or the final stage + example: null + linearShift: + type: boolean + enum: + - false + - true + description: Whether to linearly shift traffic over the duration of this stage + example: false + required: + - duration + - index + - isFinalStage + - requireApproval + - targetPercentage + type: object + description: The currently active stage, null if the rollout is aborted + example: + index: 1 + isFinalStage: false + targetPercentage: 25 + requireApproval: true + duration: null + nextStage: + nullable: true + properties: + index: + type: number + description: The zero-based index of the stage + example: 0 + isFinalStage: + type: boolean + enum: + - false + - true + description: Whether or not this stage is the final stage (targetPercentage === 100) + example: false + targetPercentage: + type: number + description: The percentage of traffic to serve to the canary deployment (0-100) + example: 25 + requireApproval: + type: boolean + enum: + - false + - true + description: Whether or not this stage requires manual approval to proceed + duration: + nullable: true + type: number + description: Duration in seconds for automatic advancement, null for manual stages or the final stage + example: null + linearShift: + type: boolean + enum: + - false + - true + description: Whether to linearly shift traffic over the duration of this stage + example: false + required: + - duration + - index + - isFinalStage + - requireApproval + - targetPercentage + type: object + description: The next stage to be activated, null if not in ACTIVE state + example: + index: 2 + isFinalStage: false + targetPercentage: 60 + requireApproval: true + duration: null + startedAt: + type: number + description: Unix timestamp in milliseconds when the rolling release started + example: 1716210500000 + updatedAt: + type: number + description: Unix timestamp in milliseconds when the rolling release was last updated + example: 1716210600000 + currentCanaryPercentage: + type: number + description: When set (for example while {@link substate} is `PAUSED`), the canary traffic percentage persisted on the rollout document — use for dashboard display when linear shift is active. + required: + - activeStage + - advancementType + - canaryDeployment + - currentDeployment + - nextStage + - queuedDeploymentId + - stages + - startedAt + - state + - substate + - updatedAt + type: object + description: Rolling release information including configuration and document details, or null if no rolling release exists + required: + - rollingRelease + type: object + description: The response format for rolling release endpoints that return rolling release information + '400': + description: |- + One of the provided values in the request body is invalid. + One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '409': + description: '' + '410': + description: '' + '422': + description: '' + parameters: + - name: id_or_name + description: Project ID or project name (URL-encoded) + in: path + required: true + schema: + description: Project ID or project name (URL-encoded) + type: string + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + requestBody: + content: + application/json: + schema: + type: object + required: + - canaryDeploymentId + properties: + canaryDeploymentId: + description: The ID of the canary deployment to start the rolling release for + type: string + /v1/projects/{id_or_name}/rolling-release/complete: + post: + description: Force-complete a Rolling Release. The canary deployment will begin serving 100% of the traffic. + operationId: completeRollingRelease + security: + - bearerToken: [] + summary: Complete the rolling release for the project + tags: + - rolling-release + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + rollingRelease: + nullable: true + properties: + state: + type: string + enum: + - ABORTED + - ACTIVE + - COMPLETE + description: The current state of the rolling release + example: ACTIVE + substate: + nullable: true + type: string + enum: + - PAUSED + - null + description: When set to `PAUSED`, the rollout is frozen at the current percentage until continued. + currentDeployment: + nullable: true + properties: + name: + type: string + description: The name of the project associated with the deployment at the time that the deployment was created + example: my-project + createdAt: + type: number + description: A number containing the date when the deployment was created in milliseconds + example: 1540257589405 + readyState: + type: string + enum: + - BLOCKED + - BUILDING + - CANCELED + - ERROR + - INITIALIZING + - QUEUED + - READY + description: The state of the deployment depending on the process of deploying, or if it is ready or in an error state + example: READY + id: + type: string + description: A string holding the unique ID of the deployment + example: dpl_89qyp1cskzkLrVicDaZoDbjyHuDJ + target: + nullable: true + type: string + enum: + - production + - staging + - null + description: If defined, either `staging` if a staging alias in the format `..now.sh` was assigned upon creation, or `production` if the aliases from `alias` were assigned. `null` value indicates the "preview" deployment. + example: null + readyStateAt: + type: number + source: + type: string + enum: + - api-trigger-git-deploy + - cli + - clone/repo + - drop + - git + - git-deploy-hook + - import + - import/repo + - redeploy + - v0-web + description: Where was the deployment created from. Best-effort guess for metrics only — not authoritative; do not gate behavior on it. + example: cli + url: + type: string + description: A string with the unique URL of the deployment + example: my-instant-deployment-3ij3cxz9qr.now.sh + required: + - createdAt + - id + - name + - readyState + - url + type: object + description: The current deployment receiving production traffic + example: + id: dpl_abc123 + name: my-shop@main + url: my-shop.vercel.app + target: production + source: git + createdAt: 1716206500000 + readyState: READY + readyStateAt: 1716206800000 + canaryDeployment: + nullable: true + properties: + name: + type: string + description: The name of the project associated with the deployment at the time that the deployment was created + example: my-project + createdAt: + type: number + description: A number containing the date when the deployment was created in milliseconds + example: 1540257589405 + readyState: + type: string + enum: + - BLOCKED + - BUILDING + - CANCELED + - ERROR + - INITIALIZING + - QUEUED + - READY + description: The state of the deployment depending on the process of deploying, or if it is ready or in an error state + example: READY + id: + type: string + description: A string holding the unique ID of the deployment + example: dpl_89qyp1cskzkLrVicDaZoDbjyHuDJ + target: + nullable: true + type: string + enum: + - production + - staging + - null + description: If defined, either `staging` if a staging alias in the format `..now.sh` was assigned upon creation, or `production` if the aliases from `alias` were assigned. `null` value indicates the "preview" deployment. + example: null + readyStateAt: + type: number + source: + type: string + enum: + - api-trigger-git-deploy + - cli + - clone/repo + - drop + - git + - git-deploy-hook + - import + - import/repo + - redeploy + - v0-web + description: Where was the deployment created from. Best-effort guess for metrics only — not authoritative; do not gate behavior on it. + example: cli + url: + type: string + description: A string with the unique URL of the deployment + example: my-instant-deployment-3ij3cxz9qr.now.sh + required: + - createdAt + - id + - name + - readyState + - url + type: object + description: The canary deployment being rolled out + example: + id: dpl_def456 + name: my-shop@9c7e2f4 + url: 9c7e2f4-my-shop.vercel.app + target: production + source: git + createdAt: 1716210100000 + readyState: READY + readyStateAt: 1716210400000 + queuedDeploymentId: + nullable: true + type: string + description: The ID of a deployment queued for the next rolling release + example: dpl_ghi789 + advancementType: + type: string + enum: + - automatic + - manual-approval + description: The advancement type of the rolling release + example: manual-approval + stages: + items: + properties: + index: + type: number + description: The zero-based index of the stage + example: 0 + isFinalStage: + type: boolean + enum: + - false + - true + description: Whether or not this stage is the final stage (targetPercentage === 100) + example: false + targetPercentage: + type: number + description: The percentage of traffic to serve to the canary deployment (0-100) + example: 25 + requireApproval: + type: boolean + enum: + - false + - true + description: Whether or not this stage requires manual approval to proceed + duration: + nullable: true + type: number + description: Duration in seconds for automatic advancement, null for manual stages or the final stage + example: null + linearShift: + type: boolean + enum: + - false + - true + description: Whether to linearly shift traffic over the duration of this stage + example: false + required: + - duration + - index + - isFinalStage + - requireApproval + - targetPercentage + type: object + description: All stages configured for this rolling release + example: + - index: 0 + isFinalStage: false + targetPercentage: 5 + requireApproval: true + duration: null + - index: 1 + isFinalStage: false + targetPercentage: 25 + requireApproval: true + duration: null + - index: 2 + isFinalStage: false + targetPercentage: 60 + requireApproval: true + duration: null + - index: 3 + isFinalStage: true + targetPercentage: 100 + requireApproval: false + duration: null + type: array + description: All stages configured for this rolling release + example: + - index: 0 + isFinalStage: false + targetPercentage: 5 + requireApproval: true + duration: null + - index: 1 + isFinalStage: false + targetPercentage: 25 + requireApproval: true + duration: null + - index: 2 + isFinalStage: false + targetPercentage: 60 + requireApproval: true + duration: null + - index: 3 + isFinalStage: true + targetPercentage: 100 + requireApproval: false + duration: null + activeStage: + nullable: true + properties: + index: + type: number + description: The zero-based index of the stage + example: 0 + isFinalStage: + type: boolean + enum: + - false + - true + description: Whether or not this stage is the final stage (targetPercentage === 100) + example: false + targetPercentage: + type: number + description: The percentage of traffic to serve to the canary deployment (0-100) + example: 25 + requireApproval: + type: boolean + enum: + - false + - true + description: Whether or not this stage requires manual approval to proceed + duration: + nullable: true + type: number + description: Duration in seconds for automatic advancement, null for manual stages or the final stage + example: null + linearShift: + type: boolean + enum: + - false + - true + description: Whether to linearly shift traffic over the duration of this stage + example: false + required: + - duration + - index + - isFinalStage + - requireApproval + - targetPercentage + type: object + description: The currently active stage, null if the rollout is aborted + example: + index: 1 + isFinalStage: false + targetPercentage: 25 + requireApproval: true + duration: null + nextStage: + nullable: true + properties: + index: + type: number + description: The zero-based index of the stage + example: 0 + isFinalStage: + type: boolean + enum: + - false + - true + description: Whether or not this stage is the final stage (targetPercentage === 100) + example: false + targetPercentage: + type: number + description: The percentage of traffic to serve to the canary deployment (0-100) + example: 25 + requireApproval: + type: boolean + enum: + - false + - true + description: Whether or not this stage requires manual approval to proceed + duration: + nullable: true + type: number + description: Duration in seconds for automatic advancement, null for manual stages or the final stage + example: null + linearShift: + type: boolean + enum: + - false + - true + description: Whether to linearly shift traffic over the duration of this stage + example: false + required: + - duration + - index + - isFinalStage + - requireApproval + - targetPercentage + type: object + description: The next stage to be activated, null if not in ACTIVE state + example: + index: 2 + isFinalStage: false + targetPercentage: 60 + requireApproval: true + duration: null + startedAt: + type: number + description: Unix timestamp in milliseconds when the rolling release started + example: 1716210500000 + updatedAt: + type: number + description: Unix timestamp in milliseconds when the rolling release was last updated + example: 1716210600000 + currentCanaryPercentage: + type: number + description: When set (for example while {@link substate} is `PAUSED`), the canary traffic percentage persisted on the rollout document — use for dashboard display when linear shift is active. + required: + - activeStage + - advancementType + - canaryDeployment + - currentDeployment + - nextStage + - queuedDeploymentId + - stages + - startedAt + - state + - substate + - updatedAt + type: object + description: Rolling release information including configuration and document details, or null if no rolling release exists + required: + - rollingRelease + type: object + description: The response format for rolling release endpoints that return rolling release information + '400': + description: |- + One of the provided values in the request body is invalid. + One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + parameters: + - name: id_or_name + description: Project ID or project name (URL-encoded) + in: path + required: true + schema: + description: Project ID or project name (URL-encoded) + type: string + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + requestBody: + content: + application/json: + schema: + type: object + required: + - canaryDeploymentId + properties: + canaryDeploymentId: + description: The ID of the canary deployment to complete + type: string +components: + x-stackQL-resources: + billing_status: + id: vercel.rolling_release.billing_status + name: billing_status + title: Billing Status + methods: + get: + operation: + $ref: '#/paths/~1v1~1projects~1{id_or_name}~1rolling-release~1billing/get' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/billing_status/methods/get' + insert: [] + update: [] + delete: [] + replace: [] + config: + id: vercel.rolling_release.config + name: config + title: Config + methods: + get: + operation: + $ref: '#/paths/~1v1~1projects~1{id_or_name}~1rolling-release~1config/get' + response: + mediaType: application/json + openAPIDocKey: '200' + objectKey: $.rollingRelease + request: + nativeCasing: camel + delete: + operation: + $ref: '#/paths/~1v1~1projects~1{id_or_name}~1rolling-release~1config/delete' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + update: + operation: + $ref: '#/paths/~1v1~1projects~1{id_or_name}~1rolling-release~1config/patch' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/config/methods/get' + insert: [] + update: + - $ref: '#/components/x-stackQL-resources/config/methods/update' + delete: + - $ref: '#/components/x-stackQL-resources/config/methods/delete' + replace: [] + rolling_releases: + id: vercel.rolling_release.rolling_releases + name: rolling_releases + title: Rolling Releases + methods: + get: + operation: + $ref: '#/paths/~1v1~1projects~1{id_or_name}~1rolling-release/get' + response: + mediaType: application/json + openAPIDocKey: '200' + objectKey: $.rollingRelease + request: + nativeCasing: camel + approve_stage: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v1~1projects~1{id_or_name}~1rolling-release~1approve-stage/post' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + start: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v1~1projects~1{id_or_name}~1rolling-release~1start/post' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + complete: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v1~1projects~1{id_or_name}~1rolling-release~1complete/post' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/rolling_releases/methods/get' + insert: [] + update: [] + delete: [] + replace: [] +servers: + - url: https://api.vercel.com diff --git a/provider-dev/openapi/src/vercel/v00.00.00000/services/sandboxes.yaml b/provider-dev/openapi/src/vercel/v00.00.00000/services/sandboxes.yaml new file mode 100644 index 0000000..494e3f3 --- /dev/null +++ b/provider-dev/openapi/src/vercel/v00.00.00000/services/sandboxes.yaml @@ -0,0 +1,6779 @@ +openapi: 3.0.3 +info: + title: sandboxes API + description: vercel sandboxes API + version: 0.0.1 +paths: + /v2/sandboxes: + get: + description: Retrieves a paginated list of named sandboxes belonging to a specific project. Results can be sorted by creation time or name, and optionally filtered by name prefix or status. + operationId: listNamedSandboxes + security: + - bearerToken: [] + summary: List sandboxes + tags: + - sandboxes + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + sandboxes: + items: + $ref: '#/components/schemas/NamedSandbox' + type: array + pagination: + properties: + count: + type: number + next: + nullable: true + type: string + required: + - count + - next + type: object + required: + - pagination + - sandboxes + type: object + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + '429': + description: '' + parameters: + - name: project + description: The unique identifier or name of the project to list named sandboxes for. + in: query + required: false + schema: + description: The unique identifier or name of the project to list named sandboxes for. + type: string + example: prj_abc123 + - name: limit + description: Maximum number of named sandboxes to return in the response. Used for pagination. + in: query + required: false + schema: + description: Maximum number of named sandboxes to return in the response. Used for pagination. + type: number + minimum: 1 + maximum: 50 + default: 20 + example: 20 + - name: sortBy + description: Field to sort by. + in: query + required: false + schema: + description: Field to sort by. + type: string + enum: + - createdAt + - name + - statusUpdatedAt + - currentSnapshotId + default: createdAt + - name: namePrefix + description: Filter named sandboxes whose name starts with this prefix. Only valid when sortBy=name. + in: query + required: false + schema: + description: Filter named sandboxes whose name starts with this prefix. Only valid when sortBy=name. + type: string + - name: cursor + description: Opaque pagination cursor from a previous response. + in: query + required: false + schema: + description: Opaque pagination cursor from a previous response. + type: string + - name: sortOrder + description: Sort direction. Defaults to desc. + in: query + required: false + schema: + description: Sort direction. Defaults to desc. + type: string + enum: + - asc + - desc + default: desc + - name: status + description: Filter named sandboxes by status. Only valid when sortBy is createdAt. + in: query + required: false + schema: + description: Filter named sandboxes by status. Only valid when sortBy is createdAt. + type: string + enum: + - running + - stopping + - stopped + - name: tags + description: 'Filter sandboxes by tag. Format: \"key:value\". Only one tag filter is supported at a time.' + in: query + required: false + schema: + description: 'Filter sandboxes by tag. Format: \"key:value\". Only one tag filter is supported at a time.' + anyOf: + - type: string + - type: array + items: + type: string + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + post: + description: Creates a named sandbox environment. Named sandboxes have a unique name within a project and support automatic snapshotting on shutdown. + operationId: createSandboxesV2 + security: + - bearerToken: [] + summary: Create a named sandbox + tags: + - sandboxes + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + sandbox: + $ref: '#/components/schemas/NamedSandbox' + session: + $ref: '#/components/schemas/Session' + routes: + items: + $ref: '#/components/schemas/SandboxPublicRoute' + type: array + required: + - routes + - sandbox + - session + type: object + '400': + description: One of the provided values in the request body is invalid. + '401': + description: The request is not authorized. + '402': + description: The account is missing a payment so payment method must be updated + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '409': + description: '' + '410': + description: '' + '422': + description: '' + '429': + description: The concurrency limit has been exceeded. + '500': + description: '' + parameters: + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + requestBody: + content: + application/json: + schema: + type: object + additionalProperties: false + properties: + networkPolicy: + description: Network access policy for the sandbox.\n Controls which external hosts the sandbox can communicate with.\n Use \"allow-all\" mode to allow all traffic, \"deny-all\" to block all traffic or \"custom\" to provide specific rules. + type: object + additionalProperties: false + required: + - mode + properties: + mode: + description: The network access policy mode. Use \"allow-all\" to permit all outbound traffic. Use \"deny-all\" to block all outbound traffic. Use \"custom\" to specify explicit allow/deny rules. + type: string + enum: + - allow-all + - deny-all + - custom + - default-allow + - default-deny + example: custom + allowedDomains: + description: List of domain names the sandbox is allowed to connect to. Only applies when mode is \"custom\". Supports wildcard patterns (e.g., \"*.example.com\" matches all subdomains). + type: array + example: + - api.github.com + - '*.npmjs.org' + items: + type: string + description: A domain name pattern. Use \"*\" for wildcard matching of subdomains (e.g., \"*.example.com\"). + allowedCIDRs: + description: List of IP address ranges (in CIDR notation) the sandbox is allowed to connect to. Traffic to these addresses bypasses domain-based restrictions. + type: array + example: + - 35.192.0.0/12 + - 104.16.0.0/12 + items: + type: string + description: An IPv4 address range in CIDR notation (e.g., \"35.192.0.0/12\"). + deniedCIDRs: + description: List of IP address ranges (in CIDR notation) the sandbox is blocked from connecting to. These rules take precedence over all allowed rules. + type: array + example: + - 35.192.0.0/12 + items: + type: string + description: An IP address range in CIDR notation to block. + injectionRules: + description: HTTP header injection rules for outgoing requests matching specific domains. Traffic to matching domains will be intercepted instead of proxied through encrypted connections. + type: array + items: + type: object + additionalProperties: false + required: + - domain + - headers + properties: + domain: + description: The domain (or pattern) of requests to add headers for. Supports wildcards like *.example.com. + type: string + headers: + description: HTTP headers to inject into requests for this domain. Existing headers with the same name will be overridden. + type: object + additionalProperties: + type: string + match: + description: Optional L7 match. When provided, the injection rule only applies to requests that satisfy every specified dimension. When multiple injection rules target the same domain they are evaluated in order and the first match wins; a rule without `match` matches any request and shadows later rules for the same domain. + type: object + additionalProperties: false + properties: + path: + description: Match on the request path. Comparison is case-sensitive. + type: object + additionalProperties: false + properties: + exact: + type: string + description: Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys. + startsWith: + type: string + description: Match values that start with the given prefix. + method: + type: array + description: HTTP methods to match. Any single match succeeds (OR semantics). + items: + type: string + queryString: + type: array + description: Query-string entry matchers. Multiple entries are ANDed. Query parameter names and values are both compared case-sensitively (RFC 3986). When a request has multiple values for the same key, any matching value satisfies the matcher. + items: + type: object + additionalProperties: false + properties: + key: + description: Matcher for the entry key (header name or query key). + type: object + additionalProperties: false + properties: + exact: + type: string + description: Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys. + startsWith: + type: string + description: Match values that start with the given prefix. + value: + description: Matcher for the entry value. + type: object + additionalProperties: false + properties: + exact: + type: string + description: Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys. + startsWith: + type: string + description: Match values that start with the given prefix. + headers: + type: array + description: Header matchers. Multiple entries are ANDed. Header names are compared case-insensitively (RFC 9110); header values are compared case-sensitively. When a request has multiple values for the same header, any matching value satisfies the matcher. + items: + type: object + additionalProperties: false + properties: + key: + description: Matcher for the entry key (header name or query key). + type: object + additionalProperties: false + properties: + exact: + type: string + description: Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys. + startsWith: + type: string + description: Match values that start with the given prefix. + value: + description: Matcher for the entry value. + type: object + additionalProperties: false + properties: + exact: + type: string + description: Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys. + startsWith: + type: string + description: Match values that start with the given prefix. + allow: + oneOf: + - type: array + items: + type: string + - description: A rule applied to requests matching a domain in the network policy. Only one of `transform`, `forwardURL`, or `response` can be specified per rule. + type: object + additionalProperties: + type: array + items: + type: object + additionalProperties: false + properties: + match: + description: Optional L7 match. When provided, the injection rule only applies to requests that satisfy every specified dimension. When multiple injection rules target the same domain they are evaluated in order and the first match wins; a rule without `match` matches any request and shadows later rules for the same domain. + type: object + additionalProperties: false + properties: + path: + description: Match on the request path. Comparison is case-sensitive. + type: object + additionalProperties: false + properties: + exact: + type: string + description: Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys. + startsWith: + type: string + description: Match values that start with the given prefix. + method: + type: array + description: HTTP methods to match. Any single match succeeds (OR semantics). + items: + type: string + queryString: + type: array + description: Query-string entry matchers. Multiple entries are ANDed. Query parameter names and values are both compared case-sensitively (RFC 3986). When a request has multiple values for the same key, any matching value satisfies the matcher. + items: + type: object + additionalProperties: false + properties: + key: + description: Matcher for the entry key (header name or query key). + type: object + additionalProperties: false + properties: + exact: + type: string + description: Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys. + startsWith: + type: string + description: Match values that start with the given prefix. + value: + description: Matcher for the entry value. + type: object + additionalProperties: false + properties: + exact: + type: string + description: Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys. + startsWith: + type: string + description: Match values that start with the given prefix. + headers: + type: array + description: Header matchers. Multiple entries are ANDed. Header names are compared case-insensitively (RFC 9110); header values are compared case-sensitively. When a request has multiple values for the same header, any matching value satisfies the matcher. + items: + type: object + additionalProperties: false + properties: + key: + description: Matcher for the entry key (header name or query key). + type: object + additionalProperties: false + properties: + exact: + type: string + description: Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys. + startsWith: + type: string + description: Match values that start with the given prefix. + value: + description: Matcher for the entry value. + type: object + additionalProperties: false + properties: + exact: + type: string + description: Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys. + startsWith: + type: string + description: Match values that start with the given prefix. + transform: + type: array + items: + type: object + additionalProperties: false + properties: + headers: + type: object + additionalProperties: + type: string + forwardURL: + type: string + description: HTTP/1.1 proxy URL to forward traffic to. Must not include username, password, query string, or fragment. + response: + description: Answer matching requests from the proxy with this response instead of forwarding them to the origin. Combine with a `match` on an earlier rule to allow one sub-path and reject the rest of a domain. + type: object + additionalProperties: false + required: + - statusCode + properties: + statusCode: + type: integer + minimum: 200 + maximum: 599 + description: HTTP status code returned to the sandbox. + headers: + type: object + additionalProperties: + type: string + description: HTTP response headers. Framing and hop-by-hop headers are managed by the proxy and cannot be set. + body: + type: string + description: UTF-8 response body. Requires `contentType`. + contentType: + type: string + description: Value of the `Content-Type` response header. Required when `body` is set. + subnets: + type: object + additionalProperties: false + properties: + allow: + type: array + items: + type: string + deny: + type: array + items: + type: string + runtime: + description: The runtime environment for the sandbox. Determines the pre-installed language runtimes and tools available. + type: string + enum: + - node22 + - node24 + - node26 + - python3.13 + default: node24 + example: node24 + resources: + description: Resources to define the VM + additionalProperties: false + type: object + properties: + vcpus: + description: The number of virtual CPUs to allocate to the sandbox. Must be 1, or an even number. + type: integer + minimum: 1 + default: 2 + example: 2 + memory: + description: The amount of memory in megabytes to allocate to the sandbox. Must equal vcpus * 2048. + type: integer + minimum: 2048 + example: 4096 + source: + description: The source from which to initialize the sandbox filesystem. Can be a Git repository, a tarball URL, or an existing snapshot. + type: object + properties: + type: + description: Indicates the source is a Git repository. + url: + type: string + format: uri + description: The URL of the Git repository to clone. + example: https://github.com/vercel/next.js.git + username: + type: string + description: Username for Git authentication. Required together with password for private repositories. + password: + type: string + description: Password or personal access token for Git authentication. Required together with username for private repositories. + depth: + type: integer + minimum: 1 + description: Create a shallow clone with history truncated to the specified number of commits. Useful for faster cloning of large repositories. + example: 1 + revision: + type: string + description: The specific commit SHA, branch name, or tag to checkout after cloning. + example: main + snapshotId: + type: string + description: The unique identifier of the snapshot to restore. + example: snap_abc123 + required: + - type + - url + - snapshotId + additionalProperties: false + projectId: + description: The target project slug or ID in which the sandbox will be assigned to. + example: prj_abc123 + type: string + ports: + description: List of ports to expose from the sandbox. Each port will be accessible via a unique URL. Maximum of 15 ports can be exposed. + type: array + maxItems: 15 + uniqueItems: true + example: + - 3000 + - 4000 + items: + type: integer + description: A port number to expose from the sandbox. Must be between 1024 and 65535. + not: + enum: + - 23456 + maximum: 65535 + minimum: 1024 + image: + type: string + maxLength: 255 + description: Image to use for the sandbox. + timeout: + type: integer + description: Maximum duration in milliseconds that the sandbox can run before being automatically stopped. + minimum: 1000 + example: 300000 + env: + type: object + additionalProperties: + type: string + description: Default environment variables for the sandbox. These are inherited by all commands unless overridden. + default: {} + example: + NODE_ENV: production + HELLO: world + mounts: + type: object + description: List of drives to mount to the sandbox at the provided path. + maxProperties: 4 + additionalProperties: + type: object + additionalProperties: false + required: + - drive + properties: + drive: + type: string + description: Name of the drive to mount. The drive must already exist. + maxLength: 64 + pattern: ^[a-zA-Z0-9_-]+$ + mode: + type: string + description: Mount the drive as read-write, or as a read-only snapshot. One writer is permitted at a time. + default: read-write + enum: + - snapshot + - read-write + region: + type: string + enum: + - iad1 + - sfo1 + - cle1 + - cdg1 + - fra1 + - arn1 + - sin1 + - pdx1 + - lhr1 + - icn1 + - bom1 + - cpt1 + - dub1 + - gru1 + - hkg1 + - syd1 + - yul1 + - hnd1 + - kix1 + default: + - iad1 + - sfo1 + - cle1 + - cdg1 + - fra1 + - arn1 + - sin1 + - pdx1 + - lhr1 + - icn1 + - bom1 + - cpt1 + - dub1 + - gru1 + - hkg1 + - syd1 + - yul1 + - hnd1 + - kix1 + description: The Vercel region in which to create the sandbox. + example: iad1 + failoverRegions: + type: array + maxItems: 19 + uniqueItems: true + items: + type: string + enum: + - iad1 + - sfo1 + - cle1 + - cdg1 + - fra1 + - arn1 + - sin1 + - pdx1 + - lhr1 + - icn1 + - bom1 + - cpt1 + - dub1 + - gru1 + - hkg1 + - syd1 + - yul1 + - hnd1 + - kix1 + description: The regions the sandbox falls back to when it cannot be created in `region`. + example: + - sfo1 + - cle1 + networkId: + type: string + maxLength: 255 + description: The Connect network id for the target Secure Compute private network. + name: + example: my-sandbox + type: string + pattern: ^[a-zA-Z0-9_-]+$ + maxLength: 128 + description: Name for the sandbox. Must be unique per project and URL-safe (alphanumeric, hyphens, underscores). + persistent: + description: Whether the sandbox persists its state across restarts via automatic snapshots. Defaults to true. + type: boolean + default: true + snapshotExpiration: + description: Default snapshot expiration time in milliseconds. Set to 0 to disable expiration. When set, this value is used as the default expiration for all snapshots created for this sandbox. + example: 604800000 + type: integer + keepLastSnapshots: + description: Protect the N most recent snapshots with different expiration/deletion behavior. + type: object + additionalProperties: false + required: + - count + properties: + count: + type: integer + minimum: 1 + maximum: 10 + description: Number of most recent snapshots to keep. + expiration: + description: Expiration time in milliseconds for kept snapshots. Falls back to snapshotExpiration. + oneOf: + - {} + - type: integer + deleteEvicted: + type: boolean + description: Whether to immediately delete evicted snapshots. Defaults to true. + tags: + description: Key-value tags to associate with the sandbox. Maximum 5 tags. + type: object + maxProperties: 5 + additionalProperties: + type: string + maxLength: 256 + example: + env: staging + team: platform + /v2/sandboxes/drives: + get: + description: 'Retrieves a paginated list of drives belonging to a specific project. Drives are in private beta. Register your interest to get access: https://vercel.com/changelog/drives-for-vercel-sandbox-in-private-beta' + operationId: listDrives + security: + - bearerToken: [] + summary: List drives + tags: + - sandboxes + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + drives: + items: + $ref: '#/components/schemas/Drive' + type: array + pagination: + properties: + count: + type: number + next: + nullable: true + type: string + required: + - count + - next + type: object + required: + - drives + - pagination + type: object + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + '429': + description: '' + parameters: + - name: projectId + description: The project ID or name associated with the drives. Required unless using a Vercel OIDC token scoped to a project. + in: query + required: false + schema: + type: string + description: The project ID or name associated with the drives. Required unless using a Vercel OIDC token scoped to a project. + example: prj_abc123 + - name: limit + description: Maximum number of drives to return in the response. Used for pagination. + in: query + required: false + schema: + description: Maximum number of drives to return in the response. Used for pagination. + type: number + minimum: 1 + maximum: 50 + default: 20 + example: 20 + - name: cursor + description: Opaque pagination cursor from a previous response. + in: query + required: false + schema: + description: Opaque pagination cursor from a previous response. + type: string + - name: sortBy + description: Field to sort drives by. + in: query + required: false + schema: + description: Field to sort drives by. + type: string + enum: + - createdAt + - updatedAt + - name + default: createdAt + - name: namePrefix + description: Filter drives whose name starts with this prefix. Only valid when sortBy=name. + in: query + required: false + schema: + description: Filter drives whose name starts with this prefix. Only valid when sortBy=name. + type: string + - name: sortOrder + description: Sort direction for results. + in: query + required: false + schema: + description: Sort direction for results. + type: string + enum: + - asc + - desc + default: desc + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + /v2/sandboxes/drives/{name}: + post: + description: 'Gets an existing drive by project and name, or creates it when it does not exist. Drives are in private beta. Register your interest to get access: https://vercel.com/changelog/drives-for-vercel-sandbox-in-private-beta' + operationId: getOrCreateDrive + security: + - bearerToken: [] + summary: Get or create a drive + tags: + - sandboxes + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + drive: + $ref: '#/components/schemas/Drive' + required: + - drive + type: object + '201': + description: '' + content: + application/json: + schema: + properties: + drive: + $ref: '#/components/schemas/Drive' + required: + - drive + type: object + '400': + description: |- + One of the provided values in the request body is invalid. + One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '402': + description: The account is missing a payment so payment method must be updated + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '409': + description: '' + '410': + description: '' + '429': + description: '' + parameters: + - name: name + description: Name for the drive. Must be unique per project and URL-safe (alphanumeric, hyphens, underscores). + in: path + required: true + schema: + type: string + description: Name for the drive. Must be unique per project and URL-safe (alphanumeric, hyphens, underscores). + pattern: ^[a-zA-Z0-9_-]+$ + maxLength: 64 + example: workspace + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + requestBody: + content: + application/json: + schema: + type: object + additionalProperties: false + properties: + projectId: + type: string + description: The project ID or name to associate the drive with. Required unless using a Vercel OIDC token scoped to a project. + example: prj_abc123 + maxSizeBytes: + type: integer + description: Maximum drive size in bytes. Defaults to 1 TiB when omitted (1 GiB for Hobby). The maximum quota is 16 TiB. Request a quota above 16 TiB at https://vercel.com/help. + region: + type: string + description: Region where the drive is stored. Defaults to iad1. + enum: + - iad1 + - sfo1 + - cle1 + - cdg1 + - fra1 + - arn1 + - sin1 + - pdx1 + - lhr1 + - icn1 + - bom1 + - cpt1 + - dub1 + - gru1 + - hkg1 + - syd1 + - yul1 + - hnd1 + - kix1 + default: iad1 + example: iad1 + delete: + description: 'Deletes a drive by project and name. Attached drives cannot be deleted. Stop or replace the session currently using the drive before retrying deletion. Drives are in private beta. Register your interest to get access: https://vercel.com/changelog/drives-for-vercel-sandbox-in-private-beta' + operationId: deleteDrive + security: + - bearerToken: [] + summary: Delete a drive + tags: + - sandboxes + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + drive: + $ref: '#/components/schemas/Drive' + required: + - drive + type: object + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '409': + description: '' + '410': + description: '' + '429': + description: '' + parameters: + - name: name + description: Name for the drive. Must be unique per project and URL-safe (alphanumeric, hyphens, underscores). + in: path + required: true + schema: + type: string + description: Name for the drive. Must be unique per project and URL-safe (alphanumeric, hyphens, underscores). + pattern: ^[a-zA-Z0-9_-]+$ + maxLength: 64 + example: workspace + - name: projectId + description: The project ID or name associated with the drive. Required unless using a Vercel OIDC token scoped to a project. + in: query + required: false + schema: + type: string + description: The project ID or name associated with the drive. Required unless using a Vercel OIDC token scoped to a project. + example: prj_abc123 + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + /v2/sandboxes/snapshots: + get: + description: Retrieves a paginated list of snapshots for a specific project. + operationId: listSessionSnapshots + security: + - bearerToken: [] + summary: List snapshots + tags: + - sandboxes + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + snapshots: + items: + $ref: '#/components/schemas/Snapshot' + type: array + pagination: + properties: + count: + type: number + next: + nullable: true + type: string + required: + - count + - next + type: object + required: + - pagination + - snapshots + type: object + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + '429': + description: '' + parameters: + - name: project + description: The unique identifier or name of the project to list snapshots for. + in: query + required: false + schema: + description: The unique identifier or name of the project to list snapshots for. + type: string + example: prj_abc123 + - name: name + description: Name for the sandbox. Must be unique per project and URL-safe (alphanumeric, hyphens, underscores). + in: query + required: false + schema: + description: Name for the sandbox. Must be unique per project and URL-safe (alphanumeric, hyphens, underscores). + type: string + pattern: ^[a-zA-Z0-9_-]+$ + maxLength: 128 + example: my-sandbox + - name: limit + description: Maximum number of snapshots to return in the response. Used for pagination. + in: query + required: false + schema: + description: Maximum number of snapshots to return in the response. Used for pagination. + type: number + minimum: 1 + maximum: 50 + default: 20 + example: 20 + - name: cursor + description: Opaque pagination cursor from a previous response. + in: query + required: false + schema: + description: Opaque pagination cursor from a previous response. + type: string + - name: sortOrder + description: Sort direction for results by creation time. + in: query + required: false + schema: + description: Sort direction for results by creation time. + type: string + enum: + - asc + - desc + default: desc + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + /v2/sandboxes/snapshots/{snapshot_id}: + get: + description: Retrieves detailed information about a specific snapshot, including its creation time, size, expiration date, and the source session it was created from. + operationId: getSessionSnapshot + security: + - bearerToken: [] + summary: Get a snapshot + tags: + - sandboxes + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + snapshot: + $ref: '#/components/schemas/Snapshot' + required: + - snapshot + type: object + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + '429': + description: '' + parameters: + - name: snapshot_id + description: The unique identifier of the snapshot to retrieve. + in: path + required: true + schema: + type: string + description: The unique identifier of the snapshot to retrieve. + pattern: ^(?:snap_[A-Za-z0-9]{28}|vhs_[a-z0-9]{28})$ + maxLength: 33 + example: snap_1234567890123456789012345678 + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + delete: + description: Permanently deletes a snapshot and frees its associated storage. This action cannot be undone. After deletion, the snapshot can no longer be used to create new sessions. + operationId: deleteSessionSnapshot + security: + - bearerToken: [] + summary: Delete a snapshot + tags: + - sandboxes + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + snapshot: + $ref: '#/components/schemas/Snapshot' + required: + - snapshot + type: object + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + '429': + description: '' + parameters: + - name: snapshot_id + description: The unique identifier of the snapshot to delete. + in: path + required: true + schema: + type: string + description: The unique identifier of the snapshot to delete. + pattern: ^(?:snap_[A-Za-z0-9]{28}|vhs_[a-z0-9]{28})$ + maxLength: 33 + example: snap_1234567890123456789012345678 + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + /v2/sandboxes/sessions: + get: + description: Retrieves a paginated list of sessions belonging to a specific sandbox. Results are sorted by creation time and paginated using an opaque cursor. + operationId: listSessions + security: + - bearerToken: [] + summary: List sessions + tags: + - sandboxes + responses: + '200': + description: The list of sessions matching the request filters. + content: + application/json: + schema: + properties: + sessions: + items: + $ref: '#/components/schemas/Session' + type: array + pagination: + properties: + count: + type: number + next: + nullable: true + type: string + required: + - count + - next + type: object + required: + - pagination + - sessions + type: object + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + '429': + description: '' + '500': + description: '' + parameters: + - name: project + description: The unique identifier or name of the project to list sessions for. + in: query + required: false + schema: + description: The unique identifier or name of the project to list sessions for. + type: string + example: prj_abc123 + - name: name + description: Filter sessions by sandbox name. Only sessions belonging to the specified sandbox are returned. + in: query + required: false + schema: + description: Filter sessions by sandbox name. Only sessions belonging to the specified sandbox are returned. + type: string + pattern: ^[a-zA-Z0-9_-]+$ + maxLength: 128 + example: my-sandbox + - name: limit + description: Maximum number of sessions to return in the response. Used for pagination. + in: query + required: false + schema: + description: Maximum number of sessions to return in the response. Used for pagination. + type: number + minimum: 1 + maximum: 50 + default: 20 + example: 20 + - name: cursor + description: Opaque pagination cursor from a previous response. + in: query + required: false + schema: + description: Opaque pagination cursor from a previous response. + type: string + - name: sortOrder + description: Sort direction for results by creation time. + in: query + required: false + schema: + description: Sort direction for results by creation time. + type: string + enum: + - asc + - desc + default: desc + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + /v2/sandboxes/sessions/{session_id}: + get: + description: Retrieves detailed information about a specific session, including its current status, resource configuration, and exposed routes. + operationId: getSession + security: + - bearerToken: [] + summary: Get a session + tags: + - sandboxes + responses: + '200': + description: The session was retrieved successfully. + content: + application/json: + schema: + properties: + session: + $ref: '#/components/schemas/Session' + routes: + items: + $ref: '#/components/schemas/SandboxPublicRoute' + type: array + required: + - routes + - session + type: object + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + '429': + description: '' + '500': + description: '' + parameters: + - name: session_id + description: The unique identifier of the session to retrieve. + in: path + required: true + schema: + type: string + description: The unique identifier of the session to retrieve. + example: sbx_abc123 + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + /v2/sandboxes/{name}: + get: + description: Retrieves a named sandbox by name, including its current sandbox and routes. If the sandbox is stopped and resume is true, a new sandbox will be created from the most recent snapshot. + operationId: getNamedSandbox + security: + - bearerToken: [] + summary: Get a named sandbox + tags: + - sandboxes + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + sandbox: + $ref: '#/components/schemas/NamedSandbox' + session: + $ref: '#/components/schemas/Session' + routes: + items: + $ref: '#/components/schemas/SandboxPublicRoute' + type: array + resumed: + type: boolean + enum: + - false + - true + required: + - resumed + - routes + - sandbox + - session + type: object + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '402': + description: The account is missing a payment so payment method must be updated + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '409': + description: '' + '410': + description: '' + '429': + description: The concurrency limit has been exceeded. + '500': + description: '' + parameters: + - name: name + description: Name for the sandbox. Must be unique per project and URL-safe (alphanumeric, hyphens, underscores). + in: path + required: true + schema: + description: Name for the sandbox. Must be unique per project and URL-safe (alphanumeric, hyphens, underscores). + type: string + pattern: ^[a-zA-Z0-9_-]+$ + maxLength: 128 + example: my-sandbox + - name: projectId + description: The project ID or name (required when not using OIDC token). + in: query + required: false + schema: + type: string + description: The project ID or name (required when not using OIDC token). + example: prj_abc123 + - name: resume + description: Whether to automatically resume a stopped named sandbox by creating a new instance from its snapshot. Defaults to false. + in: query + required: false + schema: + type: boolean + default: false + description: Whether to automatically resume a stopped named sandbox by creating a new instance from its snapshot. Defaults to false. + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + patch: + description: Updates the configuration of a sandbox. Only the provided fields will be modified; omitted fields remain unchanged. + operationId: updateSandbox + security: + - bearerToken: [] + summary: Update a sandbox + tags: + - sandboxes + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + routes: + items: + $ref: '#/components/schemas/SandboxPublicRoute' + type: array + sandbox: + $ref: '#/components/schemas/NamedSandbox' + session: + $ref: '#/components/schemas/Session' + resumed: + type: boolean + enum: + - false + - true + required: + - routes + - sandbox + - resumed + - session + type: object + '400': + description: |- + One of the provided values in the request body is invalid. + One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '402': + description: The account is missing a payment so payment method must be updated + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '409': + description: '' + '410': + description: '' + '422': + description: '' + '429': + description: The concurrency limit has been exceeded. + '500': + description: '' + parameters: + - name: name + description: The sandbox to update. + in: path + required: true + schema: + type: string + description: The sandbox to update. + pattern: ^[a-zA-Z0-9_-]+$ + maxLength: 128 + example: my-sandbox + - name: projectId + description: The project ID that owns the named sandbox. When provided, takes precedence over OIDC project context. + in: query + required: false + schema: + type: string + description: The project ID that owns the named sandbox. When provided, takes precedence over OIDC project context. + maxLength: 128 + - name: resume + description: Whether to automatically resume a stopped named sandbox by creating a new instance from its snapshot. Defaults to false. + in: query + required: false + schema: + type: boolean + default: false + description: Whether to automatically resume a stopped named sandbox by creating a new instance from its snapshot. Defaults to false. + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + requestBody: + content: + application/json: + schema: + type: object + additionalProperties: false + properties: + resources: + description: Resources to define the VM + additionalProperties: false + type: object + properties: + vcpus: + description: The number of virtual CPUs to allocate to the sandbox. Must be 1, or an even number. + type: integer + minimum: 1 + example: 2 + memory: + description: The amount of memory in megabytes to allocate to the sandbox. Must equal vcpus * 2048. + type: integer + minimum: 2048 + example: 4096 + runtime: + description: The runtime environment for the sandbox. Determines the pre-installed language runtimes and tools available. + type: string + enum: + - node22 + - node24 + - node26 + - python3.13 + example: node24 + timeout: + type: integer + description: Maximum duration in milliseconds that the sandbox can run before being automatically stopped. + minimum: 1000 + example: 300000 + persistent: + type: boolean + description: Whether the sandbox persists its state across restarts via automatic snapshots. + snapshotExpiration: + description: Default snapshot expiration time in milliseconds. Set to 0 to disable expiration. When set, this value is used as the default expiration for all snapshots created for this sandbox. + example: 604800000 + type: integer + keepLastSnapshots: + description: Protect the N most recent snapshots with different expiration/deletion behavior. Set to null to clear. + type: string + additionalProperties: false + required: + - count + properties: + count: + type: integer + minimum: 1 + maximum: 10 + description: Number of most recent snapshots to keep. + expiration: + description: Expiration time in milliseconds for kept snapshots. Falls back to snapshotExpiration. + oneOf: + - {} + - type: integer + deleteEvicted: + type: boolean + description: Whether to immediately delete evicted snapshots. Defaults to true. + networkPolicy: + description: Network access policy for the sandbox.\n Controls which external hosts the sandbox can communicate with.\n Use \"allow-all\" mode to allow all traffic, \"deny-all\" to block all traffic or \"custom\" to provide specific rules. + type: object + additionalProperties: false + required: + - mode + properties: + mode: + description: The network access policy mode. Use \"allow-all\" to permit all outbound traffic. Use \"deny-all\" to block all outbound traffic. Use \"custom\" to specify explicit allow/deny rules. + type: string + enum: + - allow-all + - deny-all + - custom + - default-allow + - default-deny + example: custom + allowedDomains: + description: List of domain names the sandbox is allowed to connect to. Only applies when mode is \"custom\". Supports wildcard patterns (e.g., \"*.example.com\" matches all subdomains). + type: array + example: + - api.github.com + - '*.npmjs.org' + items: + type: string + description: A domain name pattern. Use \"*\" for wildcard matching of subdomains (e.g., \"*.example.com\"). + allowedCIDRs: + description: List of IP address ranges (in CIDR notation) the sandbox is allowed to connect to. Traffic to these addresses bypasses domain-based restrictions. + type: array + example: + - 35.192.0.0/12 + - 104.16.0.0/12 + items: + type: string + description: An IPv4 address range in CIDR notation (e.g., \"35.192.0.0/12\"). + deniedCIDRs: + description: List of IP address ranges (in CIDR notation) the sandbox is blocked from connecting to. These rules take precedence over all allowed rules. + type: array + example: + - 35.192.0.0/12 + items: + type: string + description: An IP address range in CIDR notation to block. + injectionRules: + description: HTTP header injection rules for outgoing requests matching specific domains. Traffic to matching domains will be intercepted instead of proxied through encrypted connections. + type: array + items: + type: object + additionalProperties: false + required: + - domain + - headers + properties: + domain: + description: The domain (or pattern) of requests to add headers for. Supports wildcards like *.example.com. + type: string + headers: + description: HTTP headers to inject into requests for this domain. Existing headers with the same name will be overridden. + type: object + additionalProperties: + type: string + match: + description: Optional L7 match. When provided, the injection rule only applies to requests that satisfy every specified dimension. When multiple injection rules target the same domain they are evaluated in order and the first match wins; a rule without `match` matches any request and shadows later rules for the same domain. + type: object + additionalProperties: false + properties: + path: + description: Match on the request path. Comparison is case-sensitive. + type: object + additionalProperties: false + properties: + exact: + type: string + description: Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys. + startsWith: + type: string + description: Match values that start with the given prefix. + method: + type: array + description: HTTP methods to match. Any single match succeeds (OR semantics). + items: + type: string + queryString: + type: array + description: Query-string entry matchers. Multiple entries are ANDed. Query parameter names and values are both compared case-sensitively (RFC 3986). When a request has multiple values for the same key, any matching value satisfies the matcher. + items: + type: object + additionalProperties: false + properties: + key: + description: Matcher for the entry key (header name or query key). + type: object + additionalProperties: false + properties: + exact: + type: string + description: Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys. + startsWith: + type: string + description: Match values that start with the given prefix. + value: + description: Matcher for the entry value. + type: object + additionalProperties: false + properties: + exact: + type: string + description: Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys. + startsWith: + type: string + description: Match values that start with the given prefix. + headers: + type: array + description: Header matchers. Multiple entries are ANDed. Header names are compared case-insensitively (RFC 9110); header values are compared case-sensitively. When a request has multiple values for the same header, any matching value satisfies the matcher. + items: + type: object + additionalProperties: false + properties: + key: + description: Matcher for the entry key (header name or query key). + type: object + additionalProperties: false + properties: + exact: + type: string + description: Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys. + startsWith: + type: string + description: Match values that start with the given prefix. + value: + description: Matcher for the entry value. + type: object + additionalProperties: false + properties: + exact: + type: string + description: Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys. + startsWith: + type: string + description: Match values that start with the given prefix. + allow: + oneOf: + - type: array + items: + type: string + - description: A rule applied to requests matching a domain in the network policy. Only one of `transform`, `forwardURL`, or `response` can be specified per rule. + type: object + additionalProperties: + type: array + items: + type: object + additionalProperties: false + properties: + match: + description: Optional L7 match. When provided, the injection rule only applies to requests that satisfy every specified dimension. When multiple injection rules target the same domain they are evaluated in order and the first match wins; a rule without `match` matches any request and shadows later rules for the same domain. + type: object + additionalProperties: false + properties: + path: + description: Match on the request path. Comparison is case-sensitive. + type: object + additionalProperties: false + properties: + exact: + type: string + description: Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys. + startsWith: + type: string + description: Match values that start with the given prefix. + method: + type: array + description: HTTP methods to match. Any single match succeeds (OR semantics). + items: + type: string + queryString: + type: array + description: Query-string entry matchers. Multiple entries are ANDed. Query parameter names and values are both compared case-sensitively (RFC 3986). When a request has multiple values for the same key, any matching value satisfies the matcher. + items: + type: object + additionalProperties: false + properties: + key: + description: Matcher for the entry key (header name or query key). + type: object + additionalProperties: false + properties: + exact: + type: string + description: Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys. + startsWith: + type: string + description: Match values that start with the given prefix. + value: + description: Matcher for the entry value. + type: object + additionalProperties: false + properties: + exact: + type: string + description: Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys. + startsWith: + type: string + description: Match values that start with the given prefix. + headers: + type: array + description: Header matchers. Multiple entries are ANDed. Header names are compared case-insensitively (RFC 9110); header values are compared case-sensitively. When a request has multiple values for the same header, any matching value satisfies the matcher. + items: + type: object + additionalProperties: false + properties: + key: + description: Matcher for the entry key (header name or query key). + type: object + additionalProperties: false + properties: + exact: + type: string + description: Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys. + startsWith: + type: string + description: Match values that start with the given prefix. + value: + description: Matcher for the entry value. + type: object + additionalProperties: false + properties: + exact: + type: string + description: Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys. + startsWith: + type: string + description: Match values that start with the given prefix. + transform: + type: array + items: + type: object + additionalProperties: false + properties: + headers: + type: object + additionalProperties: + type: string + forwardURL: + type: string + description: HTTP/1.1 proxy URL to forward traffic to. Must not include username, password, query string, or fragment. + response: + description: Answer matching requests from the proxy with this response instead of forwarding them to the origin. Combine with a `match` on an earlier rule to allow one sub-path and reject the rest of a domain. + type: object + additionalProperties: false + required: + - statusCode + properties: + statusCode: + type: integer + minimum: 200 + maximum: 599 + description: HTTP status code returned to the sandbox. + headers: + type: object + additionalProperties: + type: string + description: HTTP response headers. Framing and hop-by-hop headers are managed by the proxy and cannot be set. + body: + type: string + description: UTF-8 response body. Requires `contentType`. + contentType: + type: string + description: Value of the `Content-Type` response header. Required when `body` is set. + subnets: + type: object + additionalProperties: false + properties: + allow: + type: array + items: + type: string + deny: + type: array + items: + type: string + region: + type: string + enum: + - iad1 + - sfo1 + - cle1 + - cdg1 + - fra1 + - arn1 + - sin1 + - pdx1 + - lhr1 + - icn1 + - bom1 + - cpt1 + - dub1 + - gru1 + - hkg1 + - syd1 + - yul1 + - hnd1 + - kix1 + description: The Vercel region in which to create the sandbox. + example: iad1 + failoverRegions: + type: array + maxItems: 19 + uniqueItems: true + items: + type: string + enum: + - iad1 + - sfo1 + - cle1 + - cdg1 + - fra1 + - arn1 + - sin1 + - pdx1 + - lhr1 + - icn1 + - bom1 + - cpt1 + - dub1 + - gru1 + - hkg1 + - syd1 + - yul1 + - hnd1 + - kix1 + description: The regions the sandbox falls back to when it cannot be created in `region`. + example: + - sfo1 + - cle1 + mounts: + description: Drives to mount to the sandbox at the provided path. Replaces the current mounts; an empty object removes them all. Changes take effect when the next session starts. + type: object + maxProperties: 4 + additionalProperties: + type: object + additionalProperties: false + required: + - drive + properties: + drive: + type: string + description: Name of the drive to mount. The drive must already exist. + maxLength: 64 + pattern: ^[a-zA-Z0-9_-]+$ + mode: + type: string + description: Mount the drive as read-write, or as a read-only snapshot. One writer is permitted at a time. + default: read-write + enum: + - snapshot + - read-write + networkId: + description: The Connect network id for the target Secure Compute private network. Set to null to remove the sandbox from Secure Compute. + type: string + maxLength: 255 + env: + type: object + additionalProperties: + type: string + description: Default environment variables for the sandbox. Set to empty object to clear. + example: + NODE_ENV: production + HELLO: world + ports: + description: List of ports to expose from the sandbox. Each port will be accessible via a unique URL. Maximum of 15 ports can be exposed. + type: array + maxItems: 15 + uniqueItems: true + example: + - 3000 + - 4000 + items: + type: integer + description: A port number to expose from the sandbox. Must be between 1024 and 65535. + not: + enum: + - 23456 + maximum: 65535 + minimum: 1024 + currentSnapshotId: + type: string + maxLength: 128 + description: The snapshot ID to set as the current snapshot. Must be active and belong to the same project. + tags: + description: Key-value tags to associate with the sandbox. Replaces existing tags. Set to empty object to clear. Maximum 5 tags. + type: object + maxProperties: 5 + additionalProperties: + type: string + maxLength: 256 + example: + env: staging + team: platform + delete: + description: Deletes a sandbox by name. If sandboxes are currently running, they will be stopped first. This operation deletes all sandbox entities with the given name and the named sandbox metadata. + operationId: deleteSandbox + security: + - bearerToken: [] + summary: Delete a sandbox + tags: + - sandboxes + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + sandbox: + $ref: '#/components/schemas/NamedSandbox' + required: + - sandbox + type: object + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + '429': + description: '' + parameters: + - name: name + description: The sandbox name to delete. + in: path + required: true + schema: + type: string + description: The sandbox name to delete. + pattern: ^[a-zA-Z0-9_-]+$ + maxLength: 128 + example: my-sandbox + - name: projectId + description: The project ID that owns the named sandbox. When provided, takes precedence over OIDC project context. + in: query + required: false + schema: + type: string + description: The project ID that owns the named sandbox. When provided, takes precedence over OIDC project context. + maxLength: 128 + - name: deleteOrphanSnapshots + description: When true, snapshots of the deleted sandbox that are not referenced by any other sandbox are also deleted asynchronously. Defaults to false. + in: query + required: false + schema: + type: boolean + default: false + description: When true, snapshots of the deleted sandbox that are not referenced by any other sandbox are also deleted asynchronously. Defaults to false. + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + /v2/sandboxes/sessions/{session_id}/cmd: + get: + description: Retrieves a list of all commands that have been executed in a session, including their current status, exit codes, and execution times, ordered from the most recent to the oldest. + operationId: listSessionCommands + security: + - bearerToken: [] + summary: List commands + tags: + - sandboxes + responses: + '200': + description: The list of commands executed in the session. + content: + application/json: + schema: + properties: + commands: + items: + $ref: '#/components/schemas/SessionCommand' + type: array + required: + - commands + type: object + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + '429': + description: '' + parameters: + - name: session_id + description: The unique identifier of the session to list commands for. + in: path + required: true + schema: + type: string + description: The unique identifier of the session to list commands for. + example: sbx_abc123 + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + post: + description: Executes a shell command inside a running session. The command runs asynchronously and returns immediately with a command ID that can be used to track its progress and retrieve its output. Optionally, use the `wait` parameter to stream the command status until completion. + operationId: runSessionCommand + security: + - bearerToken: [] + summary: Execute a command + tags: + - sandboxes + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + command: + $ref: '#/components/schemas/SessionCommand' + required: + - command + type: object + application/x-ndjson: + schema: + properties: + stream: + type: string + data: + properties: + code: + type: string + enum: + - sandbox_stream_closed + message: + type: string + enum: + - Sandbox stream was closed and is not accepting commands. + required: + - code + - message + type: object + command: + $ref: '#/components/schemas/SessionCommand' + required: + - data + - stream + - command + type: object + oneOf: + - properties: + stream: + type: string + data: + properties: + code: + type: string + enum: + - sandbox_stream_closed + message: + type: string + enum: + - Sandbox stream was closed and is not accepting commands. + required: + - code + - message + type: object + required: + - data + - stream + type: object + - properties: + data: + type: string + stream: + type: string + required: + - data + - stream + type: object + '400': + description: |- + One of the provided values in the request body is invalid. + One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + '422': + description: '' + '429': + description: '' + '500': + description: '' + parameters: + - name: session_id + description: The unique identifier of the session in which to execute the command. + in: path + required: true + schema: + type: string + description: The unique identifier of the session in which to execute the command. + example: sbx_abc123 + - name: cmdId + description: The unique identifier of the command to stream logs for. + in: query + required: true + schema: + type: string + description: The unique identifier of the command to stream logs for. + example: cmd_abc123 + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + requestBody: + content: + application/json: + schema: + type: object + additionalProperties: false + required: + - command + properties: + command: + type: string + description: The executable or shell command to run. This is the program name without arguments. + example: npm + args: + type: array + items: + type: string + description: Arguments to pass to the command. Each argument should be a separate array element. + example: + - install + - '--save' + - lodash + cwd: + type: string + description: The working directory in which to execute the command. Defaults to the sandbox home directory if not specified. + example: /home/vercel-sandbox + env: + type: object + additionalProperties: + type: string + description: Additional environment variables to set for this command. These are merged with the sandbox environment. + default: {} + example: + NODE_ENV: production + DEBUG: 'true' + sudo: + type: boolean + description: Execute the command with root (superuser) privileges. + default: false + wait: + type: boolean + description: If true, returns an ND-JSON stream that emits the command status when started and again when finished. Useful for synchronously waiting for command completion. + default: false + logs: + type: boolean + description: If true, stream the logs of the command execution in real-time via ND-JSON. This is only applicable if `wait` is also true. + default: false + timeout: + type: integer + description: Maximum duration in milliseconds the command may run before it is killed with SIGKILL, up to 5 hours. Enforced at exec time, independently of `wait`. + minimum: 100 + maximum: 18000000 + example: 30000 + /v2/sandboxes/sessions/{session_id}/cmd/{cmd_id}: + get: + description: Retrieves the current status and details of a command executed in a session. Use the `wait` parameter to block until the command finishes execution. + operationId: getSessionCommand + security: + - bearerToken: [] + summary: Get a command + tags: + - sandboxes + responses: + '200': + description: The command data along with the exit code if the command did finish. + content: + application/json: + schema: + properties: + command: + $ref: '#/components/schemas/SessionCommand' + required: + - command + type: object + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + '422': + description: '' + '429': + description: '' + '500': + description: '' + parameters: + - name: session_id + description: The unique identifier of the session containing the command. + in: path + required: true + schema: + type: string + description: The unique identifier of the session containing the command. + example: sbx_abc123 + - name: cmd_id + description: The unique identifier of the command to retrieve. + in: path + required: true + schema: + type: string + description: The unique identifier of the command to retrieve. + example: cmd_abc123 + - name: wait + description: If set to "true", the request will block until the command finishes execution. Useful for synchronously waiting for command completion. + in: query + required: false + schema: + type: string + description: If set to "true", the request will block until the command finishes execution. Useful for synchronously waiting for command completion. + enum: + - 'true' + - 'false' + default: 'false' + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + /v2/sandboxes/sessions/{session_id}/cmd/{cmd_id}/kill: + post: + description: Sends a signal to terminate a running command in a session. The signal can be used to gracefully stop (SIGTERM) or forcefully kill (SIGKILL) the process. The command must still be running for this operation to succeed. + operationId: killSessionCommand + security: + - bearerToken: [] + summary: Kill a command + tags: + - sandboxes + responses: + '200': + description: The command was terminated successfully. + content: + application/json: + schema: + properties: + command: + $ref: '#/components/schemas/SessionCommand' + required: + - command + type: object + '400': + description: |- + One of the provided values in the request body is invalid. + One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + '422': + description: '' + '429': + description: '' + '500': + description: '' + parameters: + - name: cmd_id + description: The unique identifier of the command to terminate. + in: path + required: true + schema: + type: string + description: The unique identifier of the command to terminate. + example: cmd_abc123 + - name: session_id + description: The unique identifier of the session containing the command. + in: path + required: true + schema: + type: string + description: The unique identifier of the session containing the command. + example: sbx_abc123 + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + requestBody: + content: + application/json: + schema: + type: object + additionalProperties: false + required: + - signal + properties: + signal: + type: number + description: 'The POSIX signal number to send to the process. Common values: 15 (SIGTERM) for graceful termination, 9 (SIGKILL) for forced termination.' + example: 15 + /v2/sandboxes/sessions/{session_id}/cmd/{cmd_id}/logs: + get: + description: Streams the output of a command in real-time using newline-delimited JSON (ND-JSON). Each entry includes the output data and stream type. Stream types include `stdout`, `stderr`, and `error` (for stream failures). + operationId: getSessionCommandLogs + security: + - bearerToken: [] + summary: Stream command logs + tags: + - sandboxes + responses: + '200': + description: '' + content: + application/x-ndjson: + schema: + properties: + stream: + type: string + data: + properties: + code: + type: string + enum: + - sandbox_stream_closed + message: + type: string + enum: + - Sandbox stream was closed and is not accepting commands. + required: + - code + - message + type: object + required: + - data + - stream + type: object + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + '422': + description: '' + '429': + description: '' + '500': + description: '' + parameters: + - name: session_id + description: The unique identifier of the session containing the command. + in: path + required: true + schema: + type: string + description: The unique identifier of the session containing the command. + example: sbx_abc123 + - name: cmd_id + description: The unique identifier of the command to stream logs for. + in: path + required: true + schema: + type: string + description: The unique identifier of the command to stream logs for. + example: cmd_abc123 + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + /v2/sandboxes/sessions/{session_id}/stop: + post: + description: Stops a running session and releases its allocated resources. All running processes within the session will be terminated. This action cannot be undone. A stopped session cannot be restarted. + operationId: stopSession + security: + - bearerToken: [] + summary: Stop a session + tags: + - sandboxes + responses: + '200': + description: The session was stopped successfully. + content: + application/json: + schema: + properties: + session: + $ref: '#/components/schemas/Session' + snapshot: + $ref: '#/components/schemas/Snapshot' + sandbox: + $ref: '#/components/schemas/NamedSandbox' + required: + - session + - sandbox + - snapshot + type: object + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + '422': + description: '' + '429': + description: '' + '500': + description: '' + parameters: + - name: session_id + description: The unique identifier of the session to stop. + in: path + required: true + schema: + type: string + description: The unique identifier of the session to stop. + example: sbx_abc123 + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + /v2/sandboxes/sessions/{session_id}/extend-timeout: + post: + description: Extends the maximum execution time of a running session. The session must be active and able to accept commands. The total timeout cannot exceed the maximum allowed limit for your account. + operationId: extendSessionTimeout + security: + - bearerToken: [] + summary: Extend session timeout + tags: + - sandboxes + responses: + '200': + description: The session timeout was extended successfully. + content: + application/json: + schema: + properties: + session: + $ref: '#/components/schemas/Session' + required: + - session + type: object + '400': + description: |- + One of the provided values in the request body is invalid. + One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + '422': + description: '' + '429': + description: '' + '500': + description: '' + parameters: + - name: session_id + description: The unique identifier of the session to extend the timeout for. + in: path + required: true + schema: + type: string + description: The unique identifier of the session to extend the timeout for. + example: sbx_abc123 + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + requestBody: + content: + application/json: + schema: + type: object + additionalProperties: false + required: + - duration + properties: + duration: + type: number + description: The amount of time in milliseconds to add to the current timeout. Must be at least 1000ms (1 second). + minimum: 1000 + example: 300000 + /v2/sandboxes/sessions/{session_id}/network-policy: + post: + description: Replaces the network access policy of a running session. Use this to control which external hosts the session can communicate with. This is a full replacement. Any previously configured network rules will be overwritten. + operationId: updateSessionNetworkPolicy + security: + - bearerToken: [] + summary: Update network policy + tags: + - sandboxes + responses: + '200': + description: The session network policy was updated successfully. + content: + application/json: + schema: + properties: + session: + $ref: '#/components/schemas/Session' + required: + - session + type: object + '400': + description: |- + One of the provided values in the request body is invalid. + One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + '422': + description: '' + '429': + description: '' + '500': + description: '' + parameters: + - name: session_id + description: The unique identifier of the session to update the network policy for. + in: path + required: true + schema: + type: string + description: The unique identifier of the session to update the network policy for. + example: sbx_abc123 + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + requestBody: + content: + application/json: + schema: + properties: + mode: + description: The network access policy mode. Use \"allow-all\" to permit all outbound traffic. Use \"deny-all\" to block all outbound traffic. Use \"custom\" to specify explicit allow/deny rules. + type: string + enum: + - allow-all + - deny-all + - custom + - default-allow + - default-deny + example: custom + allowedDomains: + description: List of domain names the sandbox is allowed to connect to. Only applies when mode is \"custom\". Supports wildcard patterns (e.g., \"*.example.com\" matches all subdomains). + type: array + example: + - api.github.com + - '*.npmjs.org' + items: + type: string + description: A domain name pattern. Use \"*\" for wildcard matching of subdomains (e.g., \"*.example.com\"). + allowedCIDRs: + description: List of IP address ranges (in CIDR notation) the sandbox is allowed to connect to. Traffic to these addresses bypasses domain-based restrictions. + type: array + example: + - 35.192.0.0/12 + - 104.16.0.0/12 + items: + type: string + description: An IPv4 address range in CIDR notation (e.g., \"35.192.0.0/12\"). + deniedCIDRs: + description: List of IP address ranges (in CIDR notation) the sandbox is blocked from connecting to. These rules take precedence over all allowed rules. + type: array + example: + - 35.192.0.0/12 + items: + type: string + description: An IP address range in CIDR notation to block. + injectionRules: + description: HTTP header injection rules for outgoing requests matching specific domains. Traffic to matching domains will be intercepted instead of proxied through encrypted connections. + type: array + items: + type: object + additionalProperties: false + required: + - domain + - headers + properties: + domain: + description: The domain (or pattern) of requests to add headers for. Supports wildcards like *.example.com. + type: string + headers: + description: HTTP headers to inject into requests for this domain. Existing headers with the same name will be overridden. + type: object + additionalProperties: + type: string + match: + description: Optional L7 match. When provided, the injection rule only applies to requests that satisfy every specified dimension. When multiple injection rules target the same domain they are evaluated in order and the first match wins; a rule without `match` matches any request and shadows later rules for the same domain. + type: object + additionalProperties: false + properties: + path: + description: Match on the request path. Comparison is case-sensitive. + type: object + additionalProperties: false + properties: + exact: + type: string + description: Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys. + startsWith: + type: string + description: Match values that start with the given prefix. + method: + type: array + description: HTTP methods to match. Any single match succeeds (OR semantics). + items: + type: string + queryString: + type: array + description: Query-string entry matchers. Multiple entries are ANDed. Query parameter names and values are both compared case-sensitively (RFC 3986). When a request has multiple values for the same key, any matching value satisfies the matcher. + items: + type: object + additionalProperties: false + properties: + key: + description: Matcher for the entry key (header name or query key). + type: object + additionalProperties: false + properties: + exact: + type: string + description: Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys. + startsWith: + type: string + description: Match values that start with the given prefix. + value: + description: Matcher for the entry value. + type: object + additionalProperties: false + properties: + exact: + type: string + description: Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys. + startsWith: + type: string + description: Match values that start with the given prefix. + headers: + type: array + description: Header matchers. Multiple entries are ANDed. Header names are compared case-insensitively (RFC 9110); header values are compared case-sensitively. When a request has multiple values for the same header, any matching value satisfies the matcher. + items: + type: object + additionalProperties: false + properties: + key: + description: Matcher for the entry key (header name or query key). + type: object + additionalProperties: false + properties: + exact: + type: string + description: Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys. + startsWith: + type: string + description: Match values that start with the given prefix. + value: + description: Matcher for the entry value. + type: object + additionalProperties: false + properties: + exact: + type: string + description: Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys. + startsWith: + type: string + description: Match values that start with the given prefix. + allow: + oneOf: + - type: array + items: + type: string + - description: A rule applied to requests matching a domain in the network policy. Only one of `transform`, `forwardURL`, or `response` can be specified per rule. + type: object + additionalProperties: + type: array + items: + type: object + additionalProperties: false + properties: + match: + description: Optional L7 match. When provided, the injection rule only applies to requests that satisfy every specified dimension. When multiple injection rules target the same domain they are evaluated in order and the first match wins; a rule without `match` matches any request and shadows later rules for the same domain. + type: object + additionalProperties: false + properties: + path: + description: Match on the request path. Comparison is case-sensitive. + type: object + additionalProperties: false + properties: + exact: + type: string + description: Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys. + startsWith: + type: string + description: Match values that start with the given prefix. + method: + type: array + description: HTTP methods to match. Any single match succeeds (OR semantics). + items: + type: string + queryString: + type: array + description: Query-string entry matchers. Multiple entries are ANDed. Query parameter names and values are both compared case-sensitively (RFC 3986). When a request has multiple values for the same key, any matching value satisfies the matcher. + items: + type: object + additionalProperties: false + properties: + key: + description: Matcher for the entry key (header name or query key). + type: object + additionalProperties: false + properties: + exact: + type: string + description: Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys. + startsWith: + type: string + description: Match values that start with the given prefix. + value: + description: Matcher for the entry value. + type: object + additionalProperties: false + properties: + exact: + type: string + description: Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys. + startsWith: + type: string + description: Match values that start with the given prefix. + headers: + type: array + description: Header matchers. Multiple entries are ANDed. Header names are compared case-insensitively (RFC 9110); header values are compared case-sensitively. When a request has multiple values for the same header, any matching value satisfies the matcher. + items: + type: object + additionalProperties: false + properties: + key: + description: Matcher for the entry key (header name or query key). + type: object + additionalProperties: false + properties: + exact: + type: string + description: Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys. + startsWith: + type: string + description: Match values that start with the given prefix. + value: + description: Matcher for the entry value. + type: object + additionalProperties: false + properties: + exact: + type: string + description: Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys. + startsWith: + type: string + description: Match values that start with the given prefix. + transform: + type: array + items: + type: object + additionalProperties: false + properties: + headers: + type: object + additionalProperties: + type: string + forwardURL: + type: string + description: HTTP/1.1 proxy URL to forward traffic to. Must not include username, password, query string, or fragment. + response: + description: Answer matching requests from the proxy with this response instead of forwarding them to the origin. Combine with a `match` on an earlier rule to allow one sub-path and reject the rest of a domain. + type: object + additionalProperties: false + required: + - statusCode + properties: + statusCode: + type: integer + minimum: 200 + maximum: 599 + description: HTTP status code returned to the sandbox. + headers: + type: object + additionalProperties: + type: string + description: HTTP response headers. Framing and hop-by-hop headers are managed by the proxy and cannot be set. + body: + type: string + description: UTF-8 response body. Requires `contentType`. + contentType: + type: string + description: Value of the `Content-Type` response header. Required when `body` is set. + subnets: + type: object + additionalProperties: false + properties: + allow: + type: array + items: + type: string + deny: + type: array + items: + type: string + description: Network access policy for the sandbox.\n Controls which external hosts the sandbox can communicate with.\n Use \"allow-all\" mode to allow all traffic, \"deny-all\" to block all traffic or \"custom\" to provide specific rules. + type: object + additionalProperties: false + required: + - mode + /v2/sandboxes/sessions/{session_id}/fs/read: + post: + description: Downloads the contents of a file from a session's filesystem. The file content is returned as a binary stream with appropriate Content-Disposition headers for file download. + operationId: readSessionFile + security: + - bearerToken: [] + summary: Read a file + tags: + - sandboxes + responses: + '200': + description: '' + content: + application/octet-stream: + schema: + type: string + format: binary + '400': + description: |- + One of the provided values in the request body is invalid. + One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + '422': + description: '' + '429': + description: '' + '500': + description: '' + parameters: + - name: session_id + description: The unique identifier of the session to read the file from. + in: path + required: true + schema: + type: string + description: The unique identifier of the session to read the file from. + example: sbx_abc123 + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + requestBody: + content: + application/json: + schema: + type: object + additionalProperties: false + required: + - path + properties: + cwd: + description: The base directory for resolving relative paths. If not specified, paths are resolved from the sandbox home directory. + type: string + example: /home/vercel-sandbox + path: + description: The path of the file to read. Can be absolute or relative to the working directory. + type: string + example: dist/agent-output.md + /v2/sandboxes/sessions/{session_id}/fs/mkdir: + post: + description: Creates a new directory in a session's filesystem. By default, parent directories are created recursively if they don't exist (similar to `mkdir -p`). + operationId: createSessionDirectory + security: + - bearerToken: [] + summary: Create a directory + tags: + - sandboxes + responses: + '200': + description: The directory was created successfully. + content: + application/json: + schema: + type: string + description: (opaque JSON object) + '400': + description: |- + One of the provided values in the request body is invalid. + One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + '422': + description: '' + '429': + description: '' + '500': + description: '' + parameters: + - name: session_id + description: The unique identifier of the session to create the directory in. + in: path + required: true + schema: + type: string + description: The unique identifier of the session to create the directory in. + example: sbx_abc123 + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + requestBody: + content: + application/json: + schema: + type: object + additionalProperties: false + required: + - path + properties: + cwd: + description: The base directory for resolving relative paths. If not specified, paths are resolved from the sandbox home directory. + type: string + example: /home/vercel-sandbox + path: + description: The path of the directory to create. Can be absolute or relative to the working directory. + type: string + example: src/components + recursive: + description: If true, creates parent directories as needed (like `mkdir -p`). If false, fails if parent directories do not exist. + type: boolean + default: true + /v2/sandboxes/sessions/{session_id}/fs/write: + post: + description: Uploads and extracts files to a session's filesystem. Files must be uploaded as a gzipped tarball (`.tar.gz`) with the `Content-Type` header set to `application/gzip`. The tarball contents are extracted to the session's working directory, or to a custom directory specified via the `x-cwd` header. + operationId: writeSessionFiles + security: + - bearerToken: [] + summary: Write files + tags: + - sandboxes + responses: + '200': + description: The files were successfully written to the session. + content: + application/json: + schema: + type: string + description: (opaque JSON object) + '400': + description: |- + One of the provided values in the request query is invalid. + One of the provided values in the headers is invalid + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + '422': + description: '' + '429': + description: '' + '500': + description: '' + parameters: + - in: header + description: The target directory where the tarball contents will be extracted. If not specified, files are extracted to the sandbox home directory. + schema: + type: string + description: The target directory where the tarball contents will be extracted. If not specified, files are extracted to the sandbox home directory. + example: /home/vercel-sandbox + name: x-cwd + - name: session_id + description: The unique identifier of the session to write files to. + in: path + required: true + schema: + type: string + description: The unique identifier of the session to write files to. + example: sbx_abc123 + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + /v2/sandboxes/sessions/{session_id}/snapshot: + post: + description: Creates a point-in-time snapshot of a running session's filesystem. Snapshots can be used to quickly restore a session to a previous state or to create new sessions with pre-configured environments. The session must be running and able to accept commands for a snapshot to be created. The session will be terminated after the snapshot is created. + operationId: createSandboxesSessionsBySessionIdSnapshotV2 + security: + - bearerToken: [] + summary: Create a snapshot + tags: + - sandboxes + responses: + '201': + description: '' + content: + application/json: + schema: + properties: + snapshot: + $ref: '#/components/schemas/Snapshot' + session: + $ref: '#/components/schemas/Session' + required: + - session + - snapshot + type: object + '400': + description: |- + One of the provided values in the request body is invalid. + One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '402': + description: The account is missing a payment so payment method must be updated + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + '422': + description: '' + '429': + description: '' + '500': + description: '' + parameters: + - name: session_id + description: The unique identifier of the session to snapshot. + in: path + required: true + schema: + type: string + description: The unique identifier of the session to snapshot. + example: sbx_abc123 + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + requestBody: + content: + application/json: + schema: + type: object + additionalProperties: false + properties: + expiration: + description: The number of milliseconds after which the snapshot will expire and be deleted. Use 0 for no expiration. + type: integer + /v2/sandboxes/{name}/fork: + post: + description: Forks a named sandbox, creating a new named sandbox from the source's configuration. Resources, timeout, ports, tags, network policy, mounts, Connect network, image, persistence, snapshot settings and — unlike the SDK-side fork — environment variables are copied from the source automatically (`interactive` is not). When the source has a snapshot the fork starts from it; otherwise it starts from the source's runtime/image. Any field provided in the request body overrides the value copied from the source. + operationId: createSandboxesByNameForkV2 + security: + - bearerToken: [] + summary: Fork a named sandbox + tags: + - sandboxes + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + sandbox: + $ref: '#/components/schemas/NamedSandbox' + session: + $ref: '#/components/schemas/Session' + routes: + items: + $ref: '#/components/schemas/SandboxPublicRoute' + type: array + required: + - routes + - sandbox + - session + type: object + '400': + description: |- + One of the provided values in the request body is invalid. + One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '402': + description: The account is missing a payment so payment method must be updated + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '409': + description: '' + '410': + description: '' + '422': + description: '' + '429': + description: The concurrency limit has been exceeded. + '500': + description: '' + parameters: + - name: name + description: Name of the source sandbox to fork. + in: path + required: true + schema: + description: Name of the source sandbox to fork. + type: string + pattern: ^[a-zA-Z0-9_-]+$ + maxLength: 128 + - name: projectId + description: The ID of the project the source sandbox belongs to. Required unless authenticating with an OIDC token. + in: query + required: false + schema: + description: The ID of the project the source sandbox belongs to. Required unless authenticating with an OIDC token. + type: string + maxLength: 128 + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + requestBody: + content: + application/json: + schema: + type: object + additionalProperties: false + properties: + networkPolicy: + description: Network access policy for the sandbox.\n Controls which external hosts the sandbox can communicate with.\n Use \"allow-all\" mode to allow all traffic, \"deny-all\" to block all traffic or \"custom\" to provide specific rules. + type: object + additionalProperties: false + required: + - mode + properties: + mode: + description: The network access policy mode. Use \"allow-all\" to permit all outbound traffic. Use \"deny-all\" to block all outbound traffic. Use \"custom\" to specify explicit allow/deny rules. + type: string + enum: + - allow-all + - deny-all + - custom + - default-allow + - default-deny + example: custom + allowedDomains: + description: List of domain names the sandbox is allowed to connect to. Only applies when mode is \"custom\". Supports wildcard patterns (e.g., \"*.example.com\" matches all subdomains). + type: array + example: + - api.github.com + - '*.npmjs.org' + items: + type: string + description: A domain name pattern. Use \"*\" for wildcard matching of subdomains (e.g., \"*.example.com\"). + allowedCIDRs: + description: List of IP address ranges (in CIDR notation) the sandbox is allowed to connect to. Traffic to these addresses bypasses domain-based restrictions. + type: array + example: + - 35.192.0.0/12 + - 104.16.0.0/12 + items: + type: string + description: An IPv4 address range in CIDR notation (e.g., \"35.192.0.0/12\"). + deniedCIDRs: + description: List of IP address ranges (in CIDR notation) the sandbox is blocked from connecting to. These rules take precedence over all allowed rules. + type: array + example: + - 35.192.0.0/12 + items: + type: string + description: An IP address range in CIDR notation to block. + injectionRules: + description: HTTP header injection rules for outgoing requests matching specific domains. Traffic to matching domains will be intercepted instead of proxied through encrypted connections. + type: array + items: + type: object + additionalProperties: false + required: + - domain + - headers + properties: + domain: + description: The domain (or pattern) of requests to add headers for. Supports wildcards like *.example.com. + type: string + headers: + description: HTTP headers to inject into requests for this domain. Existing headers with the same name will be overridden. + type: object + additionalProperties: + type: string + match: + description: Optional L7 match. When provided, the injection rule only applies to requests that satisfy every specified dimension. When multiple injection rules target the same domain they are evaluated in order and the first match wins; a rule without `match` matches any request and shadows later rules for the same domain. + type: object + additionalProperties: false + properties: + path: + description: Match on the request path. Comparison is case-sensitive. + type: object + additionalProperties: false + properties: + exact: + type: string + description: Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys. + startsWith: + type: string + description: Match values that start with the given prefix. + method: + type: array + description: HTTP methods to match. Any single match succeeds (OR semantics). + items: + type: string + queryString: + type: array + description: Query-string entry matchers. Multiple entries are ANDed. Query parameter names and values are both compared case-sensitively (RFC 3986). When a request has multiple values for the same key, any matching value satisfies the matcher. + items: + type: object + additionalProperties: false + properties: + key: + description: Matcher for the entry key (header name or query key). + type: object + additionalProperties: false + properties: + exact: + type: string + description: Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys. + startsWith: + type: string + description: Match values that start with the given prefix. + value: + description: Matcher for the entry value. + type: object + additionalProperties: false + properties: + exact: + type: string + description: Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys. + startsWith: + type: string + description: Match values that start with the given prefix. + headers: + type: array + description: Header matchers. Multiple entries are ANDed. Header names are compared case-insensitively (RFC 9110); header values are compared case-sensitively. When a request has multiple values for the same header, any matching value satisfies the matcher. + items: + type: object + additionalProperties: false + properties: + key: + description: Matcher for the entry key (header name or query key). + type: object + additionalProperties: false + properties: + exact: + type: string + description: Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys. + startsWith: + type: string + description: Match values that start with the given prefix. + value: + description: Matcher for the entry value. + type: object + additionalProperties: false + properties: + exact: + type: string + description: Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys. + startsWith: + type: string + description: Match values that start with the given prefix. + allow: + oneOf: + - type: array + items: + type: string + - description: A rule applied to requests matching a domain in the network policy. Only one of `transform`, `forwardURL`, or `response` can be specified per rule. + type: object + additionalProperties: + type: array + items: + type: object + additionalProperties: false + properties: + match: + description: Optional L7 match. When provided, the injection rule only applies to requests that satisfy every specified dimension. When multiple injection rules target the same domain they are evaluated in order and the first match wins; a rule without `match` matches any request and shadows later rules for the same domain. + type: object + additionalProperties: false + properties: + path: + description: Match on the request path. Comparison is case-sensitive. + type: object + additionalProperties: false + properties: + exact: + type: string + description: Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys. + startsWith: + type: string + description: Match values that start with the given prefix. + method: + type: array + description: HTTP methods to match. Any single match succeeds (OR semantics). + items: + type: string + queryString: + type: array + description: Query-string entry matchers. Multiple entries are ANDed. Query parameter names and values are both compared case-sensitively (RFC 3986). When a request has multiple values for the same key, any matching value satisfies the matcher. + items: + type: object + additionalProperties: false + properties: + key: + description: Matcher for the entry key (header name or query key). + type: object + additionalProperties: false + properties: + exact: + type: string + description: Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys. + startsWith: + type: string + description: Match values that start with the given prefix. + value: + description: Matcher for the entry value. + type: object + additionalProperties: false + properties: + exact: + type: string + description: Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys. + startsWith: + type: string + description: Match values that start with the given prefix. + headers: + type: array + description: Header matchers. Multiple entries are ANDed. Header names are compared case-insensitively (RFC 9110); header values are compared case-sensitively. When a request has multiple values for the same header, any matching value satisfies the matcher. + items: + type: object + additionalProperties: false + properties: + key: + description: Matcher for the entry key (header name or query key). + type: object + additionalProperties: false + properties: + exact: + type: string + description: Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys. + startsWith: + type: string + description: Match values that start with the given prefix. + value: + description: Matcher for the entry value. + type: object + additionalProperties: false + properties: + exact: + type: string + description: Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys. + startsWith: + type: string + description: Match values that start with the given prefix. + transform: + type: array + items: + type: object + additionalProperties: false + properties: + headers: + type: object + additionalProperties: + type: string + forwardURL: + type: string + description: HTTP/1.1 proxy URL to forward traffic to. Must not include username, password, query string, or fragment. + response: + description: Answer matching requests from the proxy with this response instead of forwarding them to the origin. Combine with a `match` on an earlier rule to allow one sub-path and reject the rest of a domain. + type: object + additionalProperties: false + required: + - statusCode + properties: + statusCode: + type: integer + minimum: 200 + maximum: 599 + description: HTTP status code returned to the sandbox. + headers: + type: object + additionalProperties: + type: string + description: HTTP response headers. Framing and hop-by-hop headers are managed by the proxy and cannot be set. + body: + type: string + description: UTF-8 response body. Requires `contentType`. + contentType: + type: string + description: Value of the `Content-Type` response header. Required when `body` is set. + subnets: + type: object + additionalProperties: false + properties: + allow: + type: array + items: + type: string + deny: + type: array + items: + type: string + resources: + description: Resources to define the VM + additionalProperties: false + type: object + properties: + vcpus: + description: The number of virtual CPUs to allocate to the sandbox. Must be 1, or an even number. + type: integer + minimum: 1 + default: 2 + example: 2 + memory: + description: The amount of memory in megabytes to allocate to the sandbox. Must equal vcpus * 2048. + type: integer + minimum: 2048 + example: 4096 + ports: + description: List of ports to expose from the sandbox. Each port will be accessible via a unique URL. Maximum of 15 ports can be exposed. + type: array + maxItems: 15 + uniqueItems: true + example: + - 3000 + - 4000 + items: + type: integer + description: A port number to expose from the sandbox. Must be between 1024 and 65535. + not: + enum: + - 23456 + maximum: 65535 + minimum: 1024 + image: + type: string + maxLength: 255 + description: Image to use for the sandbox. + timeout: + type: integer + description: Maximum duration in milliseconds that the sandbox can run before being automatically stopped. + minimum: 1000 + example: 300000 + env: + type: object + additionalProperties: + type: string + description: Default environment variables for the sandbox. These are inherited by all commands unless overridden. + default: {} + example: + NODE_ENV: production + HELLO: world + mounts: + type: object + description: List of drives to mount to the sandbox at the provided path. + maxProperties: 4 + additionalProperties: + type: object + additionalProperties: false + required: + - drive + properties: + drive: + type: string + description: Name of the drive to mount. The drive must already exist. + maxLength: 64 + pattern: ^[a-zA-Z0-9_-]+$ + mode: + type: string + description: Mount the drive as read-write, or as a read-only snapshot. One writer is permitted at a time. + default: read-write + enum: + - snapshot + - read-write + region: + type: string + enum: + - iad1 + - sfo1 + - cle1 + - cdg1 + - fra1 + - arn1 + - sin1 + - pdx1 + - lhr1 + - icn1 + - bom1 + - cpt1 + - dub1 + - gru1 + - hkg1 + - syd1 + - yul1 + - hnd1 + - kix1 + default: + - iad1 + - sfo1 + - cle1 + - cdg1 + - fra1 + - arn1 + - sin1 + - pdx1 + - lhr1 + - icn1 + - bom1 + - cpt1 + - dub1 + - gru1 + - hkg1 + - syd1 + - yul1 + - hnd1 + - kix1 + description: The Vercel region in which to create the sandbox. + example: iad1 + failoverRegions: + type: array + maxItems: 19 + uniqueItems: true + items: + type: string + enum: + - iad1 + - sfo1 + - cle1 + - cdg1 + - fra1 + - arn1 + - sin1 + - pdx1 + - lhr1 + - icn1 + - bom1 + - cpt1 + - dub1 + - gru1 + - hkg1 + - syd1 + - yul1 + - hnd1 + - kix1 + description: The regions the sandbox falls back to when it cannot be created in `region`. + example: + - sfo1 + - cle1 + networkId: + type: string + maxLength: 255 + description: The Connect network id for the target Secure Compute private network. + name: + example: my-sandbox-fork + type: string + pattern: ^[a-zA-Z0-9_-]+$ + maxLength: 128 + description: Name for the forked sandbox. Must be unique per project and URL-safe (alphanumeric, hyphens, underscores). A random name is generated when omitted. + persistent: + description: Whether the sandbox persists its state across restarts via automatic snapshots. Defaults to the source sandbox setting. + type: boolean + snapshotExpiration: + description: Default snapshot expiration time in milliseconds. Set to 0 to disable expiration. When set, this value is used as the default expiration for all snapshots created for this sandbox. + example: 604800000 + type: integer + keepLastSnapshots: + description: Protect the N most recent snapshots with different expiration/deletion behavior. + type: object + additionalProperties: false + required: + - count + properties: + count: + type: integer + minimum: 1 + maximum: 10 + description: Number of most recent snapshots to keep. + expiration: + description: Expiration time in milliseconds for kept snapshots. Falls back to snapshotExpiration. + oneOf: + - {} + - type: integer + deleteEvicted: + type: boolean + description: Whether to immediately delete evicted snapshots. Defaults to true. + tags: + description: Key-value tags to associate with the sandbox. Maximum 5 tags. + type: object + maxProperties: 5 + additionalProperties: + type: string + maxLength: 256 + example: + env: staging + team: platform + /v3/sandboxes: + post: + description: 'Creates a named sandbox environment. Named sandboxes have a unique name within a project and support automatic snapshotting on shutdown. Unlike v2, this version has no `runtime` parameter: when no `image` is provided (and the sandbox is not restored from a snapshot), the sandbox is created from the default universal image.' + operationId: createSandboxesV3 + security: + - bearerToken: [] + summary: Create a named sandbox + tags: + - sandboxes + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + sandbox: + $ref: '#/components/schemas/NamedSandbox' + session: + $ref: '#/components/schemas/Session' + routes: + items: + $ref: '#/components/schemas/SandboxPublicRoute' + type: array + required: + - routes + - sandbox + - session + type: object + '400': + description: One of the provided values in the request body is invalid. + '401': + description: The request is not authorized. + '402': + description: The account is missing a payment so payment method must be updated + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '409': + description: '' + '410': + description: '' + '422': + description: '' + '429': + description: The concurrency limit has been exceeded. + '500': + description: '' + parameters: + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + requestBody: + content: + application/json: + schema: + type: object + additionalProperties: false + properties: + networkPolicy: + description: Network access policy for the sandbox.\n Controls which external hosts the sandbox can communicate with.\n Use \"allow-all\" mode to allow all traffic, \"deny-all\" to block all traffic or \"custom\" to provide specific rules. + type: object + additionalProperties: false + required: + - mode + properties: + mode: + description: The network access policy mode. Use \"allow-all\" to permit all outbound traffic. Use \"deny-all\" to block all outbound traffic. Use \"custom\" to specify explicit allow/deny rules. + type: string + enum: + - allow-all + - deny-all + - custom + - default-allow + - default-deny + example: custom + allowedDomains: + description: List of domain names the sandbox is allowed to connect to. Only applies when mode is \"custom\". Supports wildcard patterns (e.g., \"*.example.com\" matches all subdomains). + type: array + example: + - api.github.com + - '*.npmjs.org' + items: + type: string + description: A domain name pattern. Use \"*\" for wildcard matching of subdomains (e.g., \"*.example.com\"). + allowedCIDRs: + description: List of IP address ranges (in CIDR notation) the sandbox is allowed to connect to. Traffic to these addresses bypasses domain-based restrictions. + type: array + example: + - 35.192.0.0/12 + - 104.16.0.0/12 + items: + type: string + description: An IPv4 address range in CIDR notation (e.g., \"35.192.0.0/12\"). + deniedCIDRs: + description: List of IP address ranges (in CIDR notation) the sandbox is blocked from connecting to. These rules take precedence over all allowed rules. + type: array + example: + - 35.192.0.0/12 + items: + type: string + description: An IP address range in CIDR notation to block. + injectionRules: + description: HTTP header injection rules for outgoing requests matching specific domains. Traffic to matching domains will be intercepted instead of proxied through encrypted connections. + type: array + items: + type: object + additionalProperties: false + required: + - domain + - headers + properties: + domain: + description: The domain (or pattern) of requests to add headers for. Supports wildcards like *.example.com. + type: string + headers: + description: HTTP headers to inject into requests for this domain. Existing headers with the same name will be overridden. + type: object + additionalProperties: + type: string + match: + description: Optional L7 match. When provided, the injection rule only applies to requests that satisfy every specified dimension. When multiple injection rules target the same domain they are evaluated in order and the first match wins; a rule without `match` matches any request and shadows later rules for the same domain. + type: object + additionalProperties: false + properties: + path: + description: Match on the request path. Comparison is case-sensitive. + type: object + additionalProperties: false + properties: + exact: + type: string + description: Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys. + startsWith: + type: string + description: Match values that start with the given prefix. + method: + type: array + description: HTTP methods to match. Any single match succeeds (OR semantics). + items: + type: string + queryString: + type: array + description: Query-string entry matchers. Multiple entries are ANDed. Query parameter names and values are both compared case-sensitively (RFC 3986). When a request has multiple values for the same key, any matching value satisfies the matcher. + items: + type: object + additionalProperties: false + properties: + key: + description: Matcher for the entry key (header name or query key). + type: object + additionalProperties: false + properties: + exact: + type: string + description: Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys. + startsWith: + type: string + description: Match values that start with the given prefix. + value: + description: Matcher for the entry value. + type: object + additionalProperties: false + properties: + exact: + type: string + description: Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys. + startsWith: + type: string + description: Match values that start with the given prefix. + headers: + type: array + description: Header matchers. Multiple entries are ANDed. Header names are compared case-insensitively (RFC 9110); header values are compared case-sensitively. When a request has multiple values for the same header, any matching value satisfies the matcher. + items: + type: object + additionalProperties: false + properties: + key: + description: Matcher for the entry key (header name or query key). + type: object + additionalProperties: false + properties: + exact: + type: string + description: Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys. + startsWith: + type: string + description: Match values that start with the given prefix. + value: + description: Matcher for the entry value. + type: object + additionalProperties: false + properties: + exact: + type: string + description: Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys. + startsWith: + type: string + description: Match values that start with the given prefix. + allow: + oneOf: + - type: array + items: + type: string + - description: A rule applied to requests matching a domain in the network policy. Only one of `transform`, `forwardURL`, or `response` can be specified per rule. + type: object + additionalProperties: + type: array + items: + type: object + additionalProperties: false + properties: + match: + description: Optional L7 match. When provided, the injection rule only applies to requests that satisfy every specified dimension. When multiple injection rules target the same domain they are evaluated in order and the first match wins; a rule without `match` matches any request and shadows later rules for the same domain. + type: object + additionalProperties: false + properties: + path: + description: Match on the request path. Comparison is case-sensitive. + type: object + additionalProperties: false + properties: + exact: + type: string + description: Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys. + startsWith: + type: string + description: Match values that start with the given prefix. + method: + type: array + description: HTTP methods to match. Any single match succeeds (OR semantics). + items: + type: string + queryString: + type: array + description: Query-string entry matchers. Multiple entries are ANDed. Query parameter names and values are both compared case-sensitively (RFC 3986). When a request has multiple values for the same key, any matching value satisfies the matcher. + items: + type: object + additionalProperties: false + properties: + key: + description: Matcher for the entry key (header name or query key). + type: object + additionalProperties: false + properties: + exact: + type: string + description: Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys. + startsWith: + type: string + description: Match values that start with the given prefix. + value: + description: Matcher for the entry value. + type: object + additionalProperties: false + properties: + exact: + type: string + description: Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys. + startsWith: + type: string + description: Match values that start with the given prefix. + headers: + type: array + description: Header matchers. Multiple entries are ANDed. Header names are compared case-insensitively (RFC 9110); header values are compared case-sensitively. When a request has multiple values for the same header, any matching value satisfies the matcher. + items: + type: object + additionalProperties: false + properties: + key: + description: Matcher for the entry key (header name or query key). + type: object + additionalProperties: false + properties: + exact: + type: string + description: Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys. + startsWith: + type: string + description: Match values that start with the given prefix. + value: + description: Matcher for the entry value. + type: object + additionalProperties: false + properties: + exact: + type: string + description: Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys. + startsWith: + type: string + description: Match values that start with the given prefix. + transform: + type: array + items: + type: object + additionalProperties: false + properties: + headers: + type: object + additionalProperties: + type: string + forwardURL: + type: string + description: HTTP/1.1 proxy URL to forward traffic to. Must not include username, password, query string, or fragment. + response: + description: Answer matching requests from the proxy with this response instead of forwarding them to the origin. Combine with a `match` on an earlier rule to allow one sub-path and reject the rest of a domain. + type: object + additionalProperties: false + required: + - statusCode + properties: + statusCode: + type: integer + minimum: 200 + maximum: 599 + description: HTTP status code returned to the sandbox. + headers: + type: object + additionalProperties: + type: string + description: HTTP response headers. Framing and hop-by-hop headers are managed by the proxy and cannot be set. + body: + type: string + description: UTF-8 response body. Requires `contentType`. + contentType: + type: string + description: Value of the `Content-Type` response header. Required when `body` is set. + subnets: + type: object + additionalProperties: false + properties: + allow: + type: array + items: + type: string + deny: + type: array + items: + type: string + resources: + description: Resources to define the VM + additionalProperties: false + type: object + properties: + vcpus: + description: The number of virtual CPUs to allocate to the sandbox. Must be 1, or an even number. + type: integer + minimum: 1 + default: 2 + example: 2 + memory: + description: The amount of memory in megabytes to allocate to the sandbox. Must equal vcpus * 2048. + type: integer + minimum: 2048 + example: 4096 + source: + description: The source from which to initialize the sandbox filesystem. Can be a Git repository, a tarball URL, or an existing snapshot. + type: object + properties: + type: + description: Indicates the source is a Git repository. + url: + type: string + format: uri + description: The URL of the Git repository to clone. + example: https://github.com/vercel/next.js.git + username: + type: string + description: Username for Git authentication. Required together with password for private repositories. + password: + type: string + description: Password or personal access token for Git authentication. Required together with username for private repositories. + depth: + type: integer + minimum: 1 + description: Create a shallow clone with history truncated to the specified number of commits. Useful for faster cloning of large repositories. + example: 1 + revision: + type: string + description: The specific commit SHA, branch name, or tag to checkout after cloning. + example: main + snapshotId: + type: string + description: The unique identifier of the snapshot to restore. + example: snap_abc123 + required: + - type + - url + - snapshotId + additionalProperties: false + projectId: + description: The target project slug or ID in which the sandbox will be assigned to. + example: prj_abc123 + type: string + ports: + description: List of ports to expose from the sandbox. Each port will be accessible via a unique URL. Maximum of 15 ports can be exposed. + type: array + maxItems: 15 + uniqueItems: true + example: + - 3000 + - 4000 + items: + type: integer + description: A port number to expose from the sandbox. Must be between 1024 and 65535. + not: + enum: + - 23456 + maximum: 65535 + minimum: 1024 + image: + type: string + maxLength: 255 + description: Image to use for the sandbox. + timeout: + type: integer + description: Maximum duration in milliseconds that the sandbox can run before being automatically stopped. + minimum: 1000 + example: 300000 + env: + type: object + additionalProperties: + type: string + description: Default environment variables for the sandbox. These are inherited by all commands unless overridden. + default: {} + example: + NODE_ENV: production + HELLO: world + mounts: + type: object + description: List of drives to mount to the sandbox at the provided path. + maxProperties: 4 + additionalProperties: + type: object + additionalProperties: false + required: + - drive + properties: + drive: + type: string + description: Name of the drive to mount. The drive must already exist. + maxLength: 64 + pattern: ^[a-zA-Z0-9_-]+$ + mode: + type: string + description: Mount the drive as read-write, or as a read-only snapshot. One writer is permitted at a time. + default: read-write + enum: + - snapshot + - read-write + region: + type: string + enum: + - iad1 + - sfo1 + - cle1 + - cdg1 + - fra1 + - arn1 + - sin1 + - pdx1 + - lhr1 + - icn1 + - bom1 + - cpt1 + - dub1 + - gru1 + - hkg1 + - syd1 + - yul1 + - hnd1 + - kix1 + default: + - iad1 + - sfo1 + - cle1 + - cdg1 + - fra1 + - arn1 + - sin1 + - pdx1 + - lhr1 + - icn1 + - bom1 + - cpt1 + - dub1 + - gru1 + - hkg1 + - syd1 + - yul1 + - hnd1 + - kix1 + description: The Vercel region in which to create the sandbox. + example: iad1 + failoverRegions: + type: array + maxItems: 19 + uniqueItems: true + items: + type: string + enum: + - iad1 + - sfo1 + - cle1 + - cdg1 + - fra1 + - arn1 + - sin1 + - pdx1 + - lhr1 + - icn1 + - bom1 + - cpt1 + - dub1 + - gru1 + - hkg1 + - syd1 + - yul1 + - hnd1 + - kix1 + description: The regions the sandbox falls back to when it cannot be created in `region`. + example: + - sfo1 + - cle1 + networkId: + type: string + maxLength: 255 + description: The Connect network id for the target Secure Compute private network. + name: + example: my-sandbox + type: string + pattern: ^[a-zA-Z0-9_-]+$ + maxLength: 128 + description: Name for the sandbox. Must be unique per project and URL-safe (alphanumeric, hyphens, underscores). + persistent: + description: Whether the sandbox persists its state across restarts via automatic snapshots. Defaults to true. + type: boolean + default: true + snapshotExpiration: + description: Default snapshot expiration time in milliseconds. Set to 0 to disable expiration. When set, this value is used as the default expiration for all snapshots created for this sandbox. + example: 604800000 + type: integer + keepLastSnapshots: + description: Protect the N most recent snapshots with different expiration/deletion behavior. + type: object + additionalProperties: false + required: + - count + properties: + count: + type: integer + minimum: 1 + maximum: 10 + description: Number of most recent snapshots to keep. + expiration: + description: Expiration time in milliseconds for kept snapshots. Falls back to snapshotExpiration. + oneOf: + - {} + - type: integer + deleteEvicted: + type: boolean + description: Whether to immediately delete evicted snapshots. Defaults to true. + tags: + description: Key-value tags to associate with the sandbox. Maximum 5 tags. + type: object + maxProperties: 5 + additionalProperties: + type: string + maxLength: 256 + example: + env: staging + team: platform + /v3/sandboxes/sessions/{session_id}/snapshot: + post: + description: Creates a point-in-time snapshot of a running session's filesystem. Snapshots can be used to quickly restore a session to a previous state or to create new sessions with pre-configured environments. The session must be running and able to accept commands for a snapshot to be created. The session will be terminated after the snapshot is created. Unlike v2, snapshots expire after 7 days when neither the request nor the sandbox configuration specifies an expiration. + operationId: createSandboxesSessionsBySessionIdSnapshotV3 + security: + - bearerToken: [] + summary: Create a snapshot + tags: + - sandboxes + responses: + '201': + description: '' + content: + application/json: + schema: + properties: + snapshot: + $ref: '#/components/schemas/Snapshot' + session: + $ref: '#/components/schemas/Session' + required: + - session + - snapshot + type: object + '400': + description: |- + One of the provided values in the request body is invalid. + One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '402': + description: The account is missing a payment so payment method must be updated + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + '422': + description: '' + '429': + description: '' + '500': + description: '' + parameters: + - name: session_id + description: The unique identifier of the session to snapshot. + in: path + required: true + schema: + type: string + description: The unique identifier of the session to snapshot. + example: sbx_abc123 + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + requestBody: + content: + application/json: + schema: + type: object + additionalProperties: false + properties: + expiration: + description: The number of milliseconds after which the snapshot will expire and be deleted. Defaults to 7 days when neither this field nor the sandbox configuration specifies an expiration. Use 0 for no expiration. + type: integer + /v3/sandboxes/{name}/fork: + post: + description: 'Forks a named sandbox, creating a new named sandbox from the source''s configuration. Resources, timeout, ports, tags, network policy, mounts, Connect network, image, persistence, snapshot settings and — unlike the SDK-side fork — environment variables are copied from the source automatically (`interactive` is not). When the source has a snapshot the fork starts from it; otherwise it starts from the source''s runtime/image. Any field provided in the request body overrides the value copied from the source. Unlike v2, when neither the body nor the source provides a value, snapshots expire after 7 days by default and persistent sandboxes keep only their most recent snapshot (`keepLastSnapshots: null` disables the limit).' + operationId: createSandboxesByNameForkV3 + security: + - bearerToken: [] + summary: Fork a named sandbox + tags: + - sandboxes + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + sandbox: + $ref: '#/components/schemas/NamedSandbox' + session: + $ref: '#/components/schemas/Session' + routes: + items: + $ref: '#/components/schemas/SandboxPublicRoute' + type: array + required: + - routes + - sandbox + - session + type: object + '400': + description: |- + One of the provided values in the request body is invalid. + One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '402': + description: The account is missing a payment so payment method must be updated + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '409': + description: '' + '410': + description: '' + '422': + description: '' + '429': + description: The concurrency limit has been exceeded. + '500': + description: '' + parameters: + - name: name + description: Name of the source sandbox to fork. + in: path + required: true + schema: + description: Name of the source sandbox to fork. + type: string + pattern: ^[a-zA-Z0-9_-]+$ + maxLength: 128 + - name: projectId + description: The ID of the project the source sandbox belongs to. Required unless authenticating with an OIDC token. + in: query + required: false + schema: + description: The ID of the project the source sandbox belongs to. Required unless authenticating with an OIDC token. + type: string + maxLength: 128 + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + requestBody: + content: + application/json: + schema: + type: object + additionalProperties: false + properties: + networkPolicy: + description: Network access policy for the sandbox.\n Controls which external hosts the sandbox can communicate with.\n Use \"allow-all\" mode to allow all traffic, \"deny-all\" to block all traffic or \"custom\" to provide specific rules. + type: object + additionalProperties: false + required: + - mode + properties: + mode: + description: The network access policy mode. Use \"allow-all\" to permit all outbound traffic. Use \"deny-all\" to block all outbound traffic. Use \"custom\" to specify explicit allow/deny rules. + type: string + enum: + - allow-all + - deny-all + - custom + - default-allow + - default-deny + example: custom + allowedDomains: + description: List of domain names the sandbox is allowed to connect to. Only applies when mode is \"custom\". Supports wildcard patterns (e.g., \"*.example.com\" matches all subdomains). + type: array + example: + - api.github.com + - '*.npmjs.org' + items: + type: string + description: A domain name pattern. Use \"*\" for wildcard matching of subdomains (e.g., \"*.example.com\"). + allowedCIDRs: + description: List of IP address ranges (in CIDR notation) the sandbox is allowed to connect to. Traffic to these addresses bypasses domain-based restrictions. + type: array + example: + - 35.192.0.0/12 + - 104.16.0.0/12 + items: + type: string + description: An IPv4 address range in CIDR notation (e.g., \"35.192.0.0/12\"). + deniedCIDRs: + description: List of IP address ranges (in CIDR notation) the sandbox is blocked from connecting to. These rules take precedence over all allowed rules. + type: array + example: + - 35.192.0.0/12 + items: + type: string + description: An IP address range in CIDR notation to block. + injectionRules: + description: HTTP header injection rules for outgoing requests matching specific domains. Traffic to matching domains will be intercepted instead of proxied through encrypted connections. + type: array + items: + type: object + additionalProperties: false + required: + - domain + - headers + properties: + domain: + description: The domain (or pattern) of requests to add headers for. Supports wildcards like *.example.com. + type: string + headers: + description: HTTP headers to inject into requests for this domain. Existing headers with the same name will be overridden. + type: object + additionalProperties: + type: string + match: + description: Optional L7 match. When provided, the injection rule only applies to requests that satisfy every specified dimension. When multiple injection rules target the same domain they are evaluated in order and the first match wins; a rule without `match` matches any request and shadows later rules for the same domain. + type: object + additionalProperties: false + properties: + path: + description: Match on the request path. Comparison is case-sensitive. + type: object + additionalProperties: false + properties: + exact: + type: string + description: Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys. + startsWith: + type: string + description: Match values that start with the given prefix. + method: + type: array + description: HTTP methods to match. Any single match succeeds (OR semantics). + items: + type: string + queryString: + type: array + description: Query-string entry matchers. Multiple entries are ANDed. Query parameter names and values are both compared case-sensitively (RFC 3986). When a request has multiple values for the same key, any matching value satisfies the matcher. + items: + type: object + additionalProperties: false + properties: + key: + description: Matcher for the entry key (header name or query key). + type: object + additionalProperties: false + properties: + exact: + type: string + description: Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys. + startsWith: + type: string + description: Match values that start with the given prefix. + value: + description: Matcher for the entry value. + type: object + additionalProperties: false + properties: + exact: + type: string + description: Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys. + startsWith: + type: string + description: Match values that start with the given prefix. + headers: + type: array + description: Header matchers. Multiple entries are ANDed. Header names are compared case-insensitively (RFC 9110); header values are compared case-sensitively. When a request has multiple values for the same header, any matching value satisfies the matcher. + items: + type: object + additionalProperties: false + properties: + key: + description: Matcher for the entry key (header name or query key). + type: object + additionalProperties: false + properties: + exact: + type: string + description: Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys. + startsWith: + type: string + description: Match values that start with the given prefix. + value: + description: Matcher for the entry value. + type: object + additionalProperties: false + properties: + exact: + type: string + description: Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys. + startsWith: + type: string + description: Match values that start with the given prefix. + allow: + oneOf: + - type: array + items: + type: string + - description: A rule applied to requests matching a domain in the network policy. Only one of `transform`, `forwardURL`, or `response` can be specified per rule. + type: object + additionalProperties: + type: array + items: + type: object + additionalProperties: false + properties: + match: + description: Optional L7 match. When provided, the injection rule only applies to requests that satisfy every specified dimension. When multiple injection rules target the same domain they are evaluated in order and the first match wins; a rule without `match` matches any request and shadows later rules for the same domain. + type: object + additionalProperties: false + properties: + path: + description: Match on the request path. Comparison is case-sensitive. + type: object + additionalProperties: false + properties: + exact: + type: string + description: Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys. + startsWith: + type: string + description: Match values that start with the given prefix. + method: + type: array + description: HTTP methods to match. Any single match succeeds (OR semantics). + items: + type: string + queryString: + type: array + description: Query-string entry matchers. Multiple entries are ANDed. Query parameter names and values are both compared case-sensitively (RFC 3986). When a request has multiple values for the same key, any matching value satisfies the matcher. + items: + type: object + additionalProperties: false + properties: + key: + description: Matcher for the entry key (header name or query key). + type: object + additionalProperties: false + properties: + exact: + type: string + description: Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys. + startsWith: + type: string + description: Match values that start with the given prefix. + value: + description: Matcher for the entry value. + type: object + additionalProperties: false + properties: + exact: + type: string + description: Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys. + startsWith: + type: string + description: Match values that start with the given prefix. + headers: + type: array + description: Header matchers. Multiple entries are ANDed. Header names are compared case-insensitively (RFC 9110); header values are compared case-sensitively. When a request has multiple values for the same header, any matching value satisfies the matcher. + items: + type: object + additionalProperties: false + properties: + key: + description: Matcher for the entry key (header name or query key). + type: object + additionalProperties: false + properties: + exact: + type: string + description: Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys. + startsWith: + type: string + description: Match values that start with the given prefix. + value: + description: Matcher for the entry value. + type: object + additionalProperties: false + properties: + exact: + type: string + description: Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys. + startsWith: + type: string + description: Match values that start with the given prefix. + transform: + type: array + items: + type: object + additionalProperties: false + properties: + headers: + type: object + additionalProperties: + type: string + forwardURL: + type: string + description: HTTP/1.1 proxy URL to forward traffic to. Must not include username, password, query string, or fragment. + response: + description: Answer matching requests from the proxy with this response instead of forwarding them to the origin. Combine with a `match` on an earlier rule to allow one sub-path and reject the rest of a domain. + type: object + additionalProperties: false + required: + - statusCode + properties: + statusCode: + type: integer + minimum: 200 + maximum: 599 + description: HTTP status code returned to the sandbox. + headers: + type: object + additionalProperties: + type: string + description: HTTP response headers. Framing and hop-by-hop headers are managed by the proxy and cannot be set. + body: + type: string + description: UTF-8 response body. Requires `contentType`. + contentType: + type: string + description: Value of the `Content-Type` response header. Required when `body` is set. + subnets: + type: object + additionalProperties: false + properties: + allow: + type: array + items: + type: string + deny: + type: array + items: + type: string + resources: + description: Resources to define the VM + additionalProperties: false + type: object + properties: + vcpus: + description: The number of virtual CPUs to allocate to the sandbox. Must be 1, or an even number. + type: integer + minimum: 1 + default: 2 + example: 2 + memory: + description: The amount of memory in megabytes to allocate to the sandbox. Must equal vcpus * 2048. + type: integer + minimum: 2048 + example: 4096 + ports: + description: List of ports to expose from the sandbox. Each port will be accessible via a unique URL. Maximum of 15 ports can be exposed. + type: array + maxItems: 15 + uniqueItems: true + example: + - 3000 + - 4000 + items: + type: integer + description: A port number to expose from the sandbox. Must be between 1024 and 65535. + not: + enum: + - 23456 + maximum: 65535 + minimum: 1024 + image: + type: string + maxLength: 255 + description: Image to use for the sandbox. + timeout: + type: integer + description: Maximum duration in milliseconds that the sandbox can run before being automatically stopped. + minimum: 1000 + example: 300000 + env: + type: object + additionalProperties: + type: string + description: Default environment variables for the sandbox. These are inherited by all commands unless overridden. + default: {} + example: + NODE_ENV: production + HELLO: world + mounts: + type: object + description: List of drives to mount to the sandbox at the provided path. + maxProperties: 4 + additionalProperties: + type: object + additionalProperties: false + required: + - drive + properties: + drive: + type: string + description: Name of the drive to mount. The drive must already exist. + maxLength: 64 + pattern: ^[a-zA-Z0-9_-]+$ + mode: + type: string + description: Mount the drive as read-write, or as a read-only snapshot. One writer is permitted at a time. + default: read-write + enum: + - snapshot + - read-write + region: + type: string + enum: + - iad1 + - sfo1 + - cle1 + - cdg1 + - fra1 + - arn1 + - sin1 + - pdx1 + - lhr1 + - icn1 + - bom1 + - cpt1 + - dub1 + - gru1 + - hkg1 + - syd1 + - yul1 + - hnd1 + - kix1 + default: + - iad1 + - sfo1 + - cle1 + - cdg1 + - fra1 + - arn1 + - sin1 + - pdx1 + - lhr1 + - icn1 + - bom1 + - cpt1 + - dub1 + - gru1 + - hkg1 + - syd1 + - yul1 + - hnd1 + - kix1 + description: The Vercel region in which to create the sandbox. + example: iad1 + failoverRegions: + type: array + maxItems: 19 + uniqueItems: true + items: + type: string + enum: + - iad1 + - sfo1 + - cle1 + - cdg1 + - fra1 + - arn1 + - sin1 + - pdx1 + - lhr1 + - icn1 + - bom1 + - cpt1 + - dub1 + - gru1 + - hkg1 + - syd1 + - yul1 + - hnd1 + - kix1 + description: The regions the sandbox falls back to when it cannot be created in `region`. + example: + - sfo1 + - cle1 + networkId: + type: string + maxLength: 255 + description: The Connect network id for the target Secure Compute private network. + name: + example: my-sandbox-fork + type: string + pattern: ^[a-zA-Z0-9_-]+$ + maxLength: 128 + description: Name for the forked sandbox. Must be unique per project and URL-safe (alphanumeric, hyphens, underscores). A random name is generated when omitted. + persistent: + description: Whether the sandbox persists its state across restarts via automatic snapshots. Defaults to the source sandbox setting. + type: boolean + snapshotExpiration: + description: Default snapshot expiration time in milliseconds. Defaults to 7 days. Set to 0 to disable expiration. When set, this value is used as the default expiration for all snapshots created for this sandbox. + example: 604800000 + type: integer + keepLastSnapshots: + description: Protect the N most recent snapshots with different expiration/deletion behavior. Persistent sandboxes default to keeping only the last snapshot (evicted snapshots are deleted). Set to null to disable the limit. + type: string + additionalProperties: false + required: + - count + properties: + count: + type: integer + minimum: 1 + maximum: 10 + description: Number of most recent snapshots to keep. + expiration: + description: Expiration time in milliseconds for kept snapshots. Falls back to snapshotExpiration. + oneOf: + - {} + - type: integer + deleteEvicted: + type: boolean + description: Whether to immediately delete evicted snapshots. Defaults to true. + tags: + description: Key-value tags to associate with the sandbox. Maximum 5 tags. + type: object + maxProperties: 5 + additionalProperties: + type: string + maxLength: 256 + example: + env: staging + team: platform + /v4/sandboxes: + post: + description: Creates a named sandbox environment. Named sandboxes have a unique name within a project and support automatic snapshotting on shutdown. When no `image` is provided (and the sandbox is not restored from a snapshot), the sandbox is created from the default universal image. Unlike v3, snapshots expire after 7 days by default and persistent sandboxes keep only their most recent snapshot unless `keepLastSnapshots` is configured otherwise (or set to `null` to disable the limit). + operationId: createSandboxesV4 + security: + - bearerToken: [] + summary: Create a named sandbox + tags: + - sandboxes + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + sandbox: + $ref: '#/components/schemas/NamedSandbox' + session: + $ref: '#/components/schemas/Session' + routes: + items: + $ref: '#/components/schemas/SandboxPublicRoute' + type: array + required: + - routes + - sandbox + - session + type: object + '400': + description: One of the provided values in the request body is invalid. + '401': + description: The request is not authorized. + '402': + description: The account is missing a payment so payment method must be updated + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '409': + description: '' + '410': + description: '' + '422': + description: '' + '429': + description: The concurrency limit has been exceeded. + '500': + description: '' + parameters: + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + requestBody: + content: + application/json: + schema: + type: object + additionalProperties: false + properties: + networkPolicy: + description: Network access policy for the sandbox.\n Controls which external hosts the sandbox can communicate with.\n Use \"allow-all\" mode to allow all traffic, \"deny-all\" to block all traffic or \"custom\" to provide specific rules. + type: object + additionalProperties: false + required: + - mode + properties: + mode: + description: The network access policy mode. Use \"allow-all\" to permit all outbound traffic. Use \"deny-all\" to block all outbound traffic. Use \"custom\" to specify explicit allow/deny rules. + type: string + enum: + - allow-all + - deny-all + - custom + - default-allow + - default-deny + example: custom + allowedDomains: + description: List of domain names the sandbox is allowed to connect to. Only applies when mode is \"custom\". Supports wildcard patterns (e.g., \"*.example.com\" matches all subdomains). + type: array + example: + - api.github.com + - '*.npmjs.org' + items: + type: string + description: A domain name pattern. Use \"*\" for wildcard matching of subdomains (e.g., \"*.example.com\"). + allowedCIDRs: + description: List of IP address ranges (in CIDR notation) the sandbox is allowed to connect to. Traffic to these addresses bypasses domain-based restrictions. + type: array + example: + - 35.192.0.0/12 + - 104.16.0.0/12 + items: + type: string + description: An IPv4 address range in CIDR notation (e.g., \"35.192.0.0/12\"). + deniedCIDRs: + description: List of IP address ranges (in CIDR notation) the sandbox is blocked from connecting to. These rules take precedence over all allowed rules. + type: array + example: + - 35.192.0.0/12 + items: + type: string + description: An IP address range in CIDR notation to block. + injectionRules: + description: HTTP header injection rules for outgoing requests matching specific domains. Traffic to matching domains will be intercepted instead of proxied through encrypted connections. + type: array + items: + type: object + additionalProperties: false + required: + - domain + - headers + properties: + domain: + description: The domain (or pattern) of requests to add headers for. Supports wildcards like *.example.com. + type: string + headers: + description: HTTP headers to inject into requests for this domain. Existing headers with the same name will be overridden. + type: object + additionalProperties: + type: string + match: + description: Optional L7 match. When provided, the injection rule only applies to requests that satisfy every specified dimension. When multiple injection rules target the same domain they are evaluated in order and the first match wins; a rule without `match` matches any request and shadows later rules for the same domain. + type: object + additionalProperties: false + properties: + path: + description: Match on the request path. Comparison is case-sensitive. + type: object + additionalProperties: false + properties: + exact: + type: string + description: Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys. + startsWith: + type: string + description: Match values that start with the given prefix. + method: + type: array + description: HTTP methods to match. Any single match succeeds (OR semantics). + items: + type: string + queryString: + type: array + description: Query-string entry matchers. Multiple entries are ANDed. Query parameter names and values are both compared case-sensitively (RFC 3986). When a request has multiple values for the same key, any matching value satisfies the matcher. + items: + type: object + additionalProperties: false + properties: + key: + description: Matcher for the entry key (header name or query key). + type: object + additionalProperties: false + properties: + exact: + type: string + description: Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys. + startsWith: + type: string + description: Match values that start with the given prefix. + value: + description: Matcher for the entry value. + type: object + additionalProperties: false + properties: + exact: + type: string + description: Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys. + startsWith: + type: string + description: Match values that start with the given prefix. + headers: + type: array + description: Header matchers. Multiple entries are ANDed. Header names are compared case-insensitively (RFC 9110); header values are compared case-sensitively. When a request has multiple values for the same header, any matching value satisfies the matcher. + items: + type: object + additionalProperties: false + properties: + key: + description: Matcher for the entry key (header name or query key). + type: object + additionalProperties: false + properties: + exact: + type: string + description: Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys. + startsWith: + type: string + description: Match values that start with the given prefix. + value: + description: Matcher for the entry value. + type: object + additionalProperties: false + properties: + exact: + type: string + description: Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys. + startsWith: + type: string + description: Match values that start with the given prefix. + allow: + oneOf: + - type: array + items: + type: string + - description: A rule applied to requests matching a domain in the network policy. Only one of `transform`, `forwardURL`, or `response` can be specified per rule. + type: object + additionalProperties: + type: array + items: + type: object + additionalProperties: false + properties: + match: + description: Optional L7 match. When provided, the injection rule only applies to requests that satisfy every specified dimension. When multiple injection rules target the same domain they are evaluated in order and the first match wins; a rule without `match` matches any request and shadows later rules for the same domain. + type: object + additionalProperties: false + properties: + path: + description: Match on the request path. Comparison is case-sensitive. + type: object + additionalProperties: false + properties: + exact: + type: string + description: Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys. + startsWith: + type: string + description: Match values that start with the given prefix. + method: + type: array + description: HTTP methods to match. Any single match succeeds (OR semantics). + items: + type: string + queryString: + type: array + description: Query-string entry matchers. Multiple entries are ANDed. Query parameter names and values are both compared case-sensitively (RFC 3986). When a request has multiple values for the same key, any matching value satisfies the matcher. + items: + type: object + additionalProperties: false + properties: + key: + description: Matcher for the entry key (header name or query key). + type: object + additionalProperties: false + properties: + exact: + type: string + description: Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys. + startsWith: + type: string + description: Match values that start with the given prefix. + value: + description: Matcher for the entry value. + type: object + additionalProperties: false + properties: + exact: + type: string + description: Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys. + startsWith: + type: string + description: Match values that start with the given prefix. + headers: + type: array + description: Header matchers. Multiple entries are ANDed. Header names are compared case-insensitively (RFC 9110); header values are compared case-sensitively. When a request has multiple values for the same header, any matching value satisfies the matcher. + items: + type: object + additionalProperties: false + properties: + key: + description: Matcher for the entry key (header name or query key). + type: object + additionalProperties: false + properties: + exact: + type: string + description: Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys. + startsWith: + type: string + description: Match values that start with the given prefix. + value: + description: Matcher for the entry value. + type: object + additionalProperties: false + properties: + exact: + type: string + description: Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys. + startsWith: + type: string + description: Match values that start with the given prefix. + transform: + type: array + items: + type: object + additionalProperties: false + properties: + headers: + type: object + additionalProperties: + type: string + forwardURL: + type: string + description: HTTP/1.1 proxy URL to forward traffic to. Must not include username, password, query string, or fragment. + response: + description: Answer matching requests from the proxy with this response instead of forwarding them to the origin. Combine with a `match` on an earlier rule to allow one sub-path and reject the rest of a domain. + type: object + additionalProperties: false + required: + - statusCode + properties: + statusCode: + type: integer + minimum: 200 + maximum: 599 + description: HTTP status code returned to the sandbox. + headers: + type: object + additionalProperties: + type: string + description: HTTP response headers. Framing and hop-by-hop headers are managed by the proxy and cannot be set. + body: + type: string + description: UTF-8 response body. Requires `contentType`. + contentType: + type: string + description: Value of the `Content-Type` response header. Required when `body` is set. + subnets: + type: object + additionalProperties: false + properties: + allow: + type: array + items: + type: string + deny: + type: array + items: + type: string + resources: + description: Resources to define the VM + additionalProperties: false + type: object + properties: + vcpus: + description: The number of virtual CPUs to allocate to the sandbox. Must be 1, or an even number. + type: integer + minimum: 1 + default: 2 + example: 2 + memory: + description: The amount of memory in megabytes to allocate to the sandbox. Must equal vcpus * 2048. + type: integer + minimum: 2048 + example: 4096 + source: + description: The source from which to initialize the sandbox filesystem. Can be a Git repository, a tarball URL, or an existing snapshot. + type: object + properties: + type: + description: Indicates the source is a Git repository. + url: + type: string + format: uri + description: The URL of the Git repository to clone. + example: https://github.com/vercel/next.js.git + username: + type: string + description: Username for Git authentication. Required together with password for private repositories. + password: + type: string + description: Password or personal access token for Git authentication. Required together with username for private repositories. + depth: + type: integer + minimum: 1 + description: Create a shallow clone with history truncated to the specified number of commits. Useful for faster cloning of large repositories. + example: 1 + revision: + type: string + description: The specific commit SHA, branch name, or tag to checkout after cloning. + example: main + snapshotId: + type: string + description: The unique identifier of the snapshot to restore. + example: snap_abc123 + required: + - type + - url + - snapshotId + additionalProperties: false + projectId: + description: The target project slug or ID in which the sandbox will be assigned to. + example: prj_abc123 + type: string + ports: + description: List of ports to expose from the sandbox. Each port will be accessible via a unique URL. Maximum of 15 ports can be exposed. + type: array + maxItems: 15 + uniqueItems: true + example: + - 3000 + - 4000 + items: + type: integer + description: A port number to expose from the sandbox. Must be between 1024 and 65535. + not: + enum: + - 23456 + maximum: 65535 + minimum: 1024 + image: + type: string + maxLength: 255 + description: Image to use for the sandbox. + timeout: + type: integer + description: Maximum duration in milliseconds that the sandbox can run before being automatically stopped. + minimum: 1000 + example: 300000 + env: + type: object + additionalProperties: + type: string + description: Default environment variables for the sandbox. These are inherited by all commands unless overridden. + default: {} + example: + NODE_ENV: production + HELLO: world + mounts: + type: object + description: List of drives to mount to the sandbox at the provided path. + maxProperties: 4 + additionalProperties: + type: object + additionalProperties: false + required: + - drive + properties: + drive: + type: string + description: Name of the drive to mount. The drive must already exist. + maxLength: 64 + pattern: ^[a-zA-Z0-9_-]+$ + mode: + type: string + description: Mount the drive as read-write, or as a read-only snapshot. One writer is permitted at a time. + default: read-write + enum: + - snapshot + - read-write + region: + type: string + enum: + - iad1 + - sfo1 + - cle1 + - cdg1 + - fra1 + - arn1 + - sin1 + - pdx1 + - lhr1 + - icn1 + - bom1 + - cpt1 + - dub1 + - gru1 + - hkg1 + - syd1 + - yul1 + - hnd1 + - kix1 + default: + - iad1 + - sfo1 + - cle1 + - cdg1 + - fra1 + - arn1 + - sin1 + - pdx1 + - lhr1 + - icn1 + - bom1 + - cpt1 + - dub1 + - gru1 + - hkg1 + - syd1 + - yul1 + - hnd1 + - kix1 + description: The Vercel region in which to create the sandbox. + example: iad1 + failoverRegions: + type: array + maxItems: 19 + uniqueItems: true + items: + type: string + enum: + - iad1 + - sfo1 + - cle1 + - cdg1 + - fra1 + - arn1 + - sin1 + - pdx1 + - lhr1 + - icn1 + - bom1 + - cpt1 + - dub1 + - gru1 + - hkg1 + - syd1 + - yul1 + - hnd1 + - kix1 + description: The regions the sandbox falls back to when it cannot be created in `region`. + example: + - sfo1 + - cle1 + networkId: + type: string + maxLength: 255 + description: The Connect network id for the target Secure Compute private network. + name: + example: my-sandbox + type: string + pattern: ^[a-zA-Z0-9_-]+$ + maxLength: 128 + description: Name for the sandbox. Must be unique per project and URL-safe (alphanumeric, hyphens, underscores). + persistent: + description: Whether the sandbox persists its state across restarts via automatic snapshots. Defaults to true. + type: boolean + default: true + snapshotExpiration: + description: Default snapshot expiration time in milliseconds. Defaults to 7 days. Set to 0 to disable expiration. When set, this value is used as the default expiration for all snapshots created for this sandbox. + example: 604800000 + type: integer + keepLastSnapshots: + description: Protect the N most recent snapshots with different expiration/deletion behavior. Persistent sandboxes default to keeping only the last snapshot (evicted snapshots are deleted). Set to null to disable the limit. + type: string + additionalProperties: false + required: + - count + properties: + count: + type: integer + minimum: 1 + maximum: 10 + description: Number of most recent snapshots to keep. + expiration: + description: Expiration time in milliseconds for kept snapshots. Falls back to snapshotExpiration. + oneOf: + - {} + - type: integer + deleteEvicted: + type: boolean + description: Whether to immediately delete evicted snapshots. Defaults to true. + tags: + description: Key-value tags to associate with the sandbox. Maximum 5 tags. + type: object + maxProperties: 5 + additionalProperties: + type: string + maxLength: 256 + example: + env: staging + team: platform +components: + schemas: + NamedSandbox: + properties: + name: + type: string + description: The unique identifier of the sandbox. + example: my-sandbox + currentSnapshotId: + type: string + description: Current snapshot ID that the named sandbox is pointing to. + currentSessionId: + type: string + description: Current session ID the sandbox is pointing to. + status: + type: string + enum: + - running + - stopped + - stopping + description: The status of the current sandbox. + example: running + statusUpdatedAt: + type: number + description: The time when the sandbox status was last updated, in milliseconds since the epoch. + example: 1750344501629 + persistent: + type: boolean + enum: + - false + - true + description: Whether the sandbox persists its state across restarts via automatic snapshots. + example: true + region: + type: string + description: 'The region the sandbox is pinned to: the region stored on the sandbox, otherwise the platform default. Where a running session actually landed is reported by `session.region`.' + example: iad1 + failoverRegions: + items: + type: string + enum: + - arn1 + - bom1 + - cdg1 + - cle1 + - cpt1 + - dub1 + - fra1 + - gru1 + - hkg1 + - hnd1 + - iad1 + - icn1 + - kix1 + - lhr1 + - pdx1 + - sfo1 + - sin1 + - syd1 + - yul1 + description: The regions the sandbox fails over to. Empty when it does not fail over. + example: + - sfo1 + - cle1 + type: array + description: The regions the sandbox fails over to. Empty when it does not fail over. + example: + - sfo1 + - cle1 + vcpus: + type: number + description: Number of virtual CPUs allocated. + example: 2 + memory: + type: number + description: Memory allocated in MB. + example: 1024 + runtime: + type: string + description: Runtime identifier. + example: node22 + image: + type: string + description: Digest-pinned reference of the container image the sandbox was created from, when it was created from an image ("{repository}@{manifestDigest}"). + example: my-repo@sha256:2c4e8f9a1b3d5e7f091a2b3c4d5e6f708192a3b4c5d6e7f8091a2b3c4d5e6f708 + timeout: + type: number + description: Timeout in milliseconds. + example: 300000 + snapshotExpiration: + type: number + description: Default snapshot expiration time in milliseconds. 0 means no expiration. + example: 604800000 + keepLastSnapshots: + properties: + count: + type: number + description: Number of most recent snapshots to keep. + example: 5 + expiration: + type: number + description: Expiration time in milliseconds for kept snapshots. + example: 604800000 + deleteEvicted: + type: boolean + enum: + - false + - true + description: Whether to immediately delete evicted snapshots. + example: true + required: + - count + - deleteEvicted + type: object + description: Keep-last snapshot configuration. + networkPolicy: + properties: + mode: + type: string + enum: + - allow-all + - custom + - default-allow + - default-deny + - deny-all + allowedDomains: + items: + type: string + type: array + allowedCIDRs: + items: + type: string + type: array + deniedCIDRs: + items: + type: string + type: array + s3Key: + type: string + required: + - mode + type: object + description: Network policy configuration. + networkId: + type: string + description: The Connect network id for the target Secure Compute private network. + totalEgressBytes: + type: number + description: Cumulative egress bytes across all sandbox runs. + example: 4096 + totalIngressBytes: + type: number + description: Cumulative ingress bytes across all sandbox runs. + example: 2048 + totalActiveCpuDurationMs: + type: number + description: Cumulative active CPU duration in milliseconds across all sandbox runs. + example: 5000 + totalDurationMs: + type: number + description: Cumulative wall-clock duration in milliseconds across all sandbox runs. + example: 60000 + cwd: + type: string + description: The working directory of the sandbox. + example: /vercel/sandbox + tags: + additionalProperties: + type: string + type: object + description: Key-value tags attached to the named sandbox. + example: + team: hive + user: bob + mounts: + additionalProperties: + properties: + drive: + type: string + mode: + type: string + enum: + - read-only + - read-write + - snapshot + required: + - drive + type: object + description: Key-value pairs of mount path and drive. + type: object + description: Key-value pairs of mount path and drive. + createdAt: + type: number + description: The time when the named sandbox was created, in milliseconds since the epoch. + example: 1750344501629 + updatedAt: + type: number + description: The time when the named sandbox was last updated, in milliseconds since the epoch. + example: 1750344501629 + expiresAt: + type: number + description: The time at which the currently running sandbox will time out, in milliseconds since the epoch. Only present while a session is running. + example: 1750344801629 + required: + - createdAt + - currentSessionId + - name + - persistent + - status + - statusUpdatedAt + - updatedAt + type: object + description: This object contains information related to a Vercel NamedSandbox. + Session: + properties: + sourceSandboxName: + type: string + description: The name of the source sandbox. + example: my-sandbox + projectId: + type: string + description: The unique identifier of the project associated with this session. + example: prj_123a6c5209bc3778245d011443644c8d27dc2c50 + id: + type: string + description: The unique identifier of the sandbox. + example: sbx_123a6c5209bc3778245d011443644c8d27dc2c50 + memory: + type: number + description: Memory allocated to this sandbox in MB. + example: 2048 + vcpus: + type: number + description: Number of vCPUs allocated to this sandbox. + example: 2 + region: + type: string + description: The region where the sandbox is hosted. + example: iad1 + runtime: + type: string + description: The runtime of the sandbox. + example: node22 + timeout: + type: number + description: The maximum amount of time the sandbox will run for in milliseconds. + example: 3600000 + status: + type: string + enum: + - aborted + - failed + - pending + - running + - snapshotting + - stopped + - stopping + description: The status of the sandbox. + example: running + requestedAt: + type: number + description: The time when the sandbox was requested, in milliseconds since the epoch. + example: 1750344501629 + startedAt: + type: number + description: The time when the sandbox was started, in milliseconds since the epoch. + example: 1750344501629 + cwd: + type: string + description: The working directory of the sandbox. + example: /vercel/sandbox + requestedStopAt: + type: number + description: The time when the sandbox was requested to stop, in milliseconds since the epoch. + example: 1750344501629 + stoppedAt: + type: number + description: The time when the sandbox was stopped, in milliseconds since the epoch. + example: 1750344501629 + abortedAt: + type: number + description: The time when the sandbox was aborted, in milliseconds since the epoch. + example: 1750344501629 + duration: + type: number + description: The duration of the sandbox in milliseconds. + example: 3600000 + sourceSnapshotId: + type: string + description: The unique identifier of the snapshot associated with this sandbox, if any. + example: snap_123a6c5209bc3778245d011443644c8d27dc2c50 + snapshottedAt: + type: number + description: The time when a snapshot was requested, in milliseconds since the epoch. + example: 1750344501629 + createdAt: + type: number + description: The time when the sandbox was created, in milliseconds since the epoch. + example: 1750344501629 + updatedAt: + type: number + description: The last time the sandbox was updated, in milliseconds since the epoch. + example: 1750344501629 + networkPolicy: + $ref: '#/components/schemas/SandboxNetworkPolicy' + activeCpuDurationMs: + type: number + description: The amount of CPU time the sandbox consumed, if available, in milliseconds. This value is only available once the sandbox is stopped, and only if it stopped successfully. + example: 42 + networkTransfer: + properties: + ingress: + type: number + egress: + type: number + required: + - egress + - ingress + type: object + description: The quantity of data transfered to and from the sandbox, in bytes. This value is only available once the sandbox is stopped, and only if it stopped successfully. + example: + in: 12543852 + out: 15368 + required: + - createdAt + - cwd + - id + - memory + - projectId + - region + - requestedAt + - runtime + - sourceSandboxName + - status + - timeout + - updatedAt + - vcpus + type: object + description: This object contains information related to a Vercel Sandbox Session. v2 endpoints return "session" instead of "sandbox" as the response wrapper key. + SandboxPublicRoute: + properties: + url: + type: string + description: A public URL to access the corresponding port in the Sandbox. + port: + type: number + description: The user port number that the route is mapped to. + subdomain: + type: string + description: The subdomain assigned to this route. + system: + type: boolean + enum: + - true + description: Whether the route is reserved by the system (e.g. for internal use). + required: + - port + - subdomain + - url + type: object + description: This object represents a public route in a Vercel Sandbox. + Drive: + properties: + id: + type: string + description: The unique drive ID. + example: drive_abc123 + name: + type: string + description: The unique drive name within the project. + example: workspace + projectId: + type: string + description: The project that owns the drive. + example: prj_abc123 + maxSizeBytes: + type: number + description: The maximum drive size in bytes. + example: 1099511627776 + region: + type: string + description: The region where the drive is stored. + example: iad1 + currentSessionId: + type: string + description: Current session ID the drive is attached to, if any. + example: sbx_123 + currentSandboxName: + type: string + description: Current sandbox name the drive is attached to, if any. + example: my-sandbox + createdAt: + type: number + description: The time when the drive was created, in milliseconds since the epoch. + example: 1750344501629 + updatedAt: + type: number + description: The last time the drive was updated, in milliseconds since the epoch. + example: 1750344501629 + required: + - createdAt + - id + - maxSizeBytes + - name + - projectId + - region + - updatedAt + type: object + description: This object contains information related to a Vercel Sandbox Drive. + Snapshot: + properties: + id: + type: string + description: The unique identifier of the snapshot. + example: snap_123a6c5209bc3778245d011443644c8d27dc2c50 + sourceSessionId: + type: string + description: The unique identifier of the session from which the snapshot was created. + example: sbx_123a6c5209bc3778245d011443644c8d27dc2c50 + region: + type: string + description: The region where the snapshot is stored. + example: iad1 + regions: + items: + type: string + type: array + description: The regions where the snapshot is available. + example: + - iad1 + - sfo1 + status: + type: string + enum: + - created + - deleted + - failed + description: The status of the snapshot. + example: created + sizeBytes: + type: number + description: The size of the snapshot in bytes. + example: 104857600 + expiresAt: + type: number + description: The time when the snapshot will expire, in milliseconds since the epoch. If not set, the snapshot does not have any expiration. + example: 1750344501629 + createdAt: + type: number + description: The time when the snapshot was created, in milliseconds since the epoch. + example: 1750344501629 + updatedAt: + type: number + description: The last time the snapshot was updated, in milliseconds since the epoch. + example: 1750344501629 + lastUsedAt: + type: number + description: The last time the snapshot was used (e.g. to resume or create a sandbox), in milliseconds since the epoch. Falls back to `createdAt` for older snapshots that predate this field. + example: 1750344501629 + creationMethod: + type: string + enum: + - automatic + - manual + description: The method used to create the snapshot. + example: manual + parentId: + type: string + description: The unique identifier of the parent snapshot, if this snapshot was created from another snapshot. + example: snap_parent123 + required: + - createdAt + - id + - lastUsedAt + - sizeBytes + - sourceSessionId + - status + - updatedAt + type: object + description: This object contains information related to a Snapshot of a Vercel Sandbox session (v2 API). + SessionCommand: + properties: + id: + type: string + description: The ID of the command. + example: cmd_123a6c5209bc3778245d011443644c8d27dc2c50 + name: + type: string + description: The name of the command. + example: npm + args: + items: + type: string + type: array + description: The arguments of the command. + example: + - run + - build + cwd: + type: string + description: The current working directory of the command. + example: /vercel/sandbox + sessionId: + type: string + description: The ID of the session associated with the command. + example: sbx_123a6c5209bc3778245d011443644c8d27dc2c50 + exitCode: + nullable: true + type: number + description: If the command did finish, the exit code. + example: 0 + startedAt: + type: number + description: When the command was started, in milliseconds since the epoch. + example: 1673123456789 + durationMs: + type: number + description: Duration of the command execution in milliseconds. + example: 1234 + required: + - args + - cwd + - exitCode + - id + - name + - sessionId + - startedAt + type: object + description: This object represents a command run in a Vercel Sandbox session (v2 API). + SandboxNetworkPolicy: + properties: + mode: + type: string + enum: + - allow-all + - custom + - deny-all + description: 'The network policy mode. - ''allow-all'': All traffic is allowed. - ''deny-all'': All traffic is blocked. - ''custom'': Traffic is controlled by explicit allow/deny rules.' + example: custom + allowedDomains: + items: + type: string + type: array + description: List of domain names the sandbox is allowed to connect to. Supports wildcard patterns (e.g., "*.vercel.com" matches all subdomains). + example: + - api.vercel.com + - '*.example.com' + allowedCIDRs: + items: + type: string + type: array + description: List of IP address ranges (in CIDR notation) the sandbox is allowed to connect to. + example: + - 10.0.0.0/8 + deniedCIDRs: + items: + type: string + type: array + description: List of IP address ranges (in CIDR notation) the sandbox is blocked from connecting to. These rules take precedence over all allowed rules. + example: + - 10.0.0.0/8 + injectionRules: + items: + $ref: '#/components/schemas/SandboxInjectionRule' + type: array + description: HTTP header injection rules for outgoing requests matching specific domains. + required: + - mode + type: object + description: The network policy applied to this sandbox, if any. + SandboxInjectionRule: + properties: + domain: + type: string + description: The domain (or pattern) that this injection rule applies to. Supports wildcards like *.vercel.com. + example: api.vercel.com + headerNames: + items: + type: string + type: array + description: The names of HTTP headers that have value that will be injected for requests to this domain. + example: + - Authorization + - X-API-Key + required: + - domain + type: object + description: HTTP header injection rules for outgoing requests matching specific domains. + StackqlTextResponse: + type: object + description: 'Wrapper for non-JSON response bodies (jsonl, ndjson, streamed json, octet-stream): one row carrying the raw body text.' + properties: + items: + type: array + items: + type: object + properties: + contents: + type: string + description: Raw response body. + x-stackQL-resources: + sandboxes: + id: vercel.sandboxes.sandboxes + name: sandboxes + title: Sandboxes + methods: + list: + operation: + $ref: '#/paths/~1v2~1sandboxes/get' + response: + mediaType: application/json + openAPIDocKey: '200' + objectKey: $.sandboxes + request: + nativeCasing: camel + config: + pagination: + requestToken: + key: cursor + location: query + responseToken: + key: $.pagination.next + location: body + queryParamPushdown: + top: + paramName: limit + maxValue: 100 + create_v2: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v2~1sandboxes/post' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + get: + operation: + $ref: '#/paths/~1v2~1sandboxes~1{name}/get' + response: + mediaType: application/json + openAPIDocKey: '200' + objectKey: $.sandbox + request: + nativeCasing: camel + update: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v2~1sandboxes~1{name}/patch' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + delete: + operation: + $ref: '#/paths/~1v2~1sandboxes~1{name}/delete' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + fork_v2: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v2~1sandboxes~1{name}~1fork/post' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + create_v3: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v3~1sandboxes/post' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + fork: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v3~1sandboxes~1{name}~1fork/post' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + create: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v4~1sandboxes/post' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/sandboxes/methods/get' + - $ref: '#/components/x-stackQL-resources/sandboxes/methods/list' + insert: + - $ref: '#/components/x-stackQL-resources/sandboxes/methods/create' + update: + - $ref: '#/components/x-stackQL-resources/sandboxes/methods/update' + delete: + - $ref: '#/components/x-stackQL-resources/sandboxes/methods/delete' + replace: [] + drives: + id: vercel.sandboxes.drives + name: drives + title: Drives + methods: + list: + operation: + $ref: '#/paths/~1v2~1sandboxes~1drives/get' + response: + mediaType: application/json + openAPIDocKey: '200' + objectKey: $.drives + request: + nativeCasing: camel + config: + pagination: + requestToken: + key: cursor + location: query + responseToken: + key: $.pagination.next + location: body + queryParamPushdown: + top: + paramName: limit + maxValue: 100 + get_or_create: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v2~1sandboxes~1drives~1{name}/post' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + delete: + operation: + $ref: '#/paths/~1v2~1sandboxes~1drives~1{name}/delete' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/drives/methods/list' + insert: + - $ref: '#/components/x-stackQL-resources/drives/methods/get_or_create' + update: [] + delete: + - $ref: '#/components/x-stackQL-resources/drives/methods/delete' + replace: [] + snapshots: + id: vercel.sandboxes.snapshots + name: snapshots + title: Snapshots + methods: + list: + operation: + $ref: '#/paths/~1v2~1sandboxes~1snapshots/get' + response: + mediaType: application/json + openAPIDocKey: '200' + objectKey: $.snapshots + request: + nativeCasing: camel + config: + pagination: + requestToken: + key: cursor + location: query + responseToken: + key: $.pagination.next + location: body + queryParamPushdown: + top: + paramName: limit + maxValue: 100 + get: + operation: + $ref: '#/paths/~1v2~1sandboxes~1snapshots~1{snapshot_id}/get' + response: + mediaType: application/json + openAPIDocKey: '200' + objectKey: $.snapshot + request: + nativeCasing: camel + delete: + operation: + $ref: '#/paths/~1v2~1sandboxes~1snapshots~1{snapshot_id}/delete' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + create_v2: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v2~1sandboxes~1sessions~1{session_id}~1snapshot/post' + response: + mediaType: application/json + openAPIDocKey: '201' + request: + nativeCasing: camel + create: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v3~1sandboxes~1sessions~1{session_id}~1snapshot/post' + response: + mediaType: application/json + openAPIDocKey: '201' + request: + nativeCasing: camel + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/snapshots/methods/get' + - $ref: '#/components/x-stackQL-resources/snapshots/methods/list' + insert: + - $ref: '#/components/x-stackQL-resources/snapshots/methods/create' + update: [] + delete: + - $ref: '#/components/x-stackQL-resources/snapshots/methods/delete' + replace: [] + sessions: + id: vercel.sandboxes.sessions + name: sessions + title: Sessions + methods: + list: + operation: + $ref: '#/paths/~1v2~1sandboxes~1sessions/get' + response: + mediaType: application/json + openAPIDocKey: '200' + objectKey: $.sessions + request: + nativeCasing: camel + config: + pagination: + requestToken: + key: cursor + location: query + responseToken: + key: $.pagination.next + location: body + queryParamPushdown: + top: + paramName: limit + maxValue: 100 + get: + operation: + $ref: '#/paths/~1v2~1sandboxes~1sessions~1{session_id}/get' + response: + mediaType: application/json + openAPIDocKey: '200' + objectKey: $.session + request: + nativeCasing: camel + stop: + operation: + $ref: '#/paths/~1v2~1sandboxes~1sessions~1{session_id}~1stop/post' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + extend_timeout: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v2~1sandboxes~1sessions~1{session_id}~1extend-timeout/post' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + update_network_policy: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v2~1sandboxes~1sessions~1{session_id}~1network-policy/post' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/sessions/methods/get' + - $ref: '#/components/x-stackQL-resources/sessions/methods/list' + insert: [] + update: [] + delete: [] + replace: [] + commands: + id: vercel.sandboxes.commands + name: commands + title: Commands + methods: + list: + operation: + $ref: '#/paths/~1v2~1sandboxes~1sessions~1{session_id}~1cmd/get' + response: + mediaType: application/json + openAPIDocKey: '200' + objectKey: $.commands + request: + nativeCasing: camel + run: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v2~1sandboxes~1sessions~1{session_id}~1cmd/post' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + get: + operation: + $ref: '#/paths/~1v2~1sandboxes~1sessions~1{session_id}~1cmd~1{cmd_id}/get' + response: + mediaType: application/json + openAPIDocKey: '200' + objectKey: $.command + request: + nativeCasing: camel + kill: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v2~1sandboxes~1sessions~1{session_id}~1cmd~1{cmd_id}~1kill/post' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + get_logs: + operation: + $ref: '#/paths/~1v2~1sandboxes~1sessions~1{session_id}~1cmd~1{cmd_id}~1logs/get' + response: + mediaType: text/plain + openAPIDocKey: '200' + overrideMediaType: application/json + schema_override: + $ref: '#/components/schemas/StackqlTextResponse' + objectKey: $.items + transform: + type: golang_template_text_v0.3.0 + body: '{"items":[{"contents": {{ toJson . }}}]}' + request: + nativeCasing: camel + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/commands/methods/get' + - $ref: '#/components/x-stackQL-resources/commands/methods/list' + insert: [] + update: [] + delete: [] + replace: [] + session_files: + id: vercel.sandboxes.session_files + name: session_files + title: Session Files + methods: + read: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v2~1sandboxes~1sessions~1{session_id}~1fs~1read/post' + response: + mediaType: text/plain + openAPIDocKey: '200' + overrideMediaType: application/json + schema_override: + $ref: '#/components/schemas/StackqlTextResponse' + objectKey: $.items + transform: + type: golang_template_text_v0.3.0 + body: '{"items":[{"contents": {{ toJson . }}}]}' + request: + nativeCasing: camel + mkdir: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v2~1sandboxes~1sessions~1{session_id}~1fs~1mkdir/post' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + write: + operation: + $ref: '#/paths/~1v2~1sandboxes~1sessions~1{session_id}~1fs~1write/post' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + sqlVerbs: + select: [] + insert: [] + update: [] + delete: [] + replace: [] +servers: + - url: https://api.vercel.com diff --git a/provider-dev/openapi/src/vercel/v00.00.00000/services/secrets.yaml b/provider-dev/openapi/src/vercel/v00.00.00000/services/secrets.yaml deleted file mode 100644 index 7bf0949..0000000 --- a/provider-dev/openapi/src/vercel/v00.00.00000/services/secrets.yaml +++ /dev/null @@ -1,533 +0,0 @@ -openapi: 3.0.3 -servers: - - url: 'https://api.vercel.com' - description: Production API -info: - contact: - email: support@vercel.com - name: Vercel Support - url: 'https://vercel.com/support' - version: 0.0.1 - title: Vercel API - secrets - description: secrets -components: - schemas: - Pagination: - properties: - count: - type: number - description: Amount of items in the current page. - example: 20 - next: - nullable: true - type: number - description: Timestamp that must be used to request the next page. - example: 1540095775951 - prev: - nullable: true - type: number - description: Timestamp that must be used to request the previous page. - example: 1540095775951 - required: - - count - - next - - prev - type: object - description: 'This object contains information related to the pagination of the current request, including the necessary parameters to get the next or previous page of data.' - responses: {} - securitySchemes: - bearerToken: - type: http - description: Default authentication mechanism - scheme: bearer - oauth2: - type: oauth2 - flows: - authorizationCode: - authorizationUrl: 'https://api.vercel.com/oauth/authorize' - tokenUrl: 'https://api.vercel.com/oauth/access_token' - scopes: {} - x-stackQL-resources: - secrets: - id: vercel.secrets.secrets - name: secrets - title: Secrets - methods: - get_secrets: - operation: - $ref: '#/paths/~1v3~1secrets/get' - response: - mediaType: application/json - openAPIDocKey: '200' - objectKey: $.secrets - _get_secrets: - operation: - $ref: '#/paths/~1v3~1secrets/get' - response: - mediaType: application/json - openAPIDocKey: '200' - create_secret: - operation: - $ref: '#/paths/~1v2~1secrets~1{name}/post' - response: - mediaType: application/json - openAPIDocKey: '200' - rename_secret: - operation: - $ref: '#/paths/~1v2~1secrets~1{name}/patch' - response: - mediaType: application/json - openAPIDocKey: '200' - get_secret: - operation: - $ref: '#/paths/~1v3~1secrets~1{idOrName}/get' - response: - mediaType: application/json - openAPIDocKey: '200' - delete_secret: - operation: - $ref: '#/paths/~1v2~1secrets~1{idOrName}/delete' - response: - mediaType: application/json - openAPIDocKey: '200' - sqlVerbs: - select: - - $ref: '#/components/x-stackQL-resources/secrets/methods/get_secret' - - $ref: '#/components/x-stackQL-resources/secrets/methods/get_secrets' - insert: - - $ref: '#/components/x-stackQL-resources/secrets/methods/create_secret' - update: [] - delete: - - $ref: '#/components/x-stackQL-resources/secrets/methods/delete_secret' -paths: - /v3/secrets: - get: - description: Retrieves the active Vercel secrets for the authenticated user or team. By default it returns 20 secrets. The rest can be retrieved using the pagination options. The body will contain an entry for each secret. - operationId: getSecrets - security: - - bearerToken: [] - summary: List secrets - tags: - - secrets - responses: - '200': - description: Successful response retrieving a list of secrets. - content: - application/json: - schema: - properties: - secrets: - items: - properties: - created: - type: string - format: date-time - description: The date when the secret was created. - example: '2021-02-10T13:11:49.180Z' - name: - type: string - description: The name of the secret. - example: my-api-key - teamId: - nullable: true - type: string - description: The unique identifier of the team the secret was created for. - example: team_LLHUOMOoDlqOp8wPE4kFo9pE - uid: - type: string - description: The unique identifier of the secret. - example: sec_XCG7t7AIHuO2SBA8667zNUiM - userId: - type: string - description: The unique identifier of the user who created the secret. - example: 2qDDuGFTWXBLDNnqZfWPDp1A - value: - type: string - description: The value of the secret. - createdAt: - type: number - description: Timestamp for when the secret was created. - example: 1609492210000 - projectId: - type: string - description: The unique identifier of the project which the secret belongs to. - example: prj_2WjyKQmM8ZnGcJsPWMrHRHrE - decryptable: - type: boolean - description: Indicates whether the secret value can be decrypted after it has been created. - example: true - required: - - created - - name - - uid - type: object - description: Data representing a secret. - type: array - pagination: - $ref: '#/components/schemas/Pagination' - required: - - secrets - - pagination - type: object - '400': - description: One of the provided values in the request query is invalid. - '401': - description: '' - '403': - description: You do not have permission to access this resource. - parameters: - - name: id - description: Filter out secrets based on comma separated secret ids. - in: query - schema: - description: Filter out secrets based on comma separated secret ids. - type: string - example: 'sec_RKc5iV0rV3ZSrFrHiruRno7k,sec_fGc5iV0rV3ZSrFrHiruRnouQ' - deprecated: true - - name: projectId - description: Filter out secrets that belong to a project. - in: query - schema: - description: Filter out secrets that belong to a project. - type: string - example: prj_2WjyKQmM8ZnGcJsPWMrHRHrE - deprecated: true - - description: The Team identifier or slug to perform the request on behalf of. - in: query - name: teamId - required: true - schema: - type: string - '/v2/secrets/{name}': - post: - description: Allows to create a new secret. - operationId: createSecret - security: - - bearerToken: [] - summary: Create a new secret - tags: - - secrets - responses: - '200': - description: Successful response showing the created secret. - content: - application/json: - schema: - properties: - value: - type: object - properties: - type: - type: string - enum: - - Buffer - data: - type: array - items: - type: number - created: - type: string - format: date-time - description: The date when the secret was created. - example: '2021-02-10T13:11:49.180Z' - name: - type: string - description: The name of the secret. - example: my-api-key - teamId: - nullable: true - type: string - description: The unique identifier of the team the secret was created for. - example: team_LLHUOMOoDlqOp8wPE4kFo9pE - uid: - type: string - description: The unique identifier of the secret. - example: sec_XCG7t7AIHuO2SBA8667zNUiM - userId: - type: string - description: The unique identifier of the user who created the secret. - example: 2qDDuGFTWXBLDNnqZfWPDp1A - createdAt: - type: number - description: Timestamp for when the secret was created. - example: 1609492210000 - projectId: - type: string - description: The unique identifier of the project which the secret belongs to. - example: prj_2WjyKQmM8ZnGcJsPWMrHRHrE - decryptable: - type: boolean - description: Indicates whether the secret value can be decrypted after it has been created. - example: true - required: - - value - - created - - name - - uid - type: object - '400': - description: One of the provided values in the request body is invalid. - '401': - description: '' - '402': - description: |- - The account was soft-blocked for an unhandled reason. - The account is missing a payment so payment method must be updated - '403': - description: You do not have permission to access this resource. - parameters: - - name: name - description: The name of the secret. - in: path - required: true - schema: - type: string - description: The name of the secret. - - description: The Team identifier or slug to perform the request on behalf of. - in: query - name: teamId - required: true - schema: - type: string - requestBody: - content: - application/json: - schema: - additionalProperties: false - type: object - required: - - name - - value - properties: - name: - description: The name of the secret (max 100 characters). - type: string - example: my-api-key - maximum: 100 - value: - description: The value of the new secret. - type: string - example: some secret value - decryptable: - description: Whether the secret value can be decrypted after it has been created. - type: boolean - example: true - projectId: - description: Associate a secret to a project. - type: string - example: prj_2WjyKQmM8ZnGcJsPWMrHRHrE - deprecated: true - patch: - description: Enables to edit the name of a secret. The name has to be unique to the user or team’s secrets. - operationId: renameSecret - security: - - bearerToken: [] - summary: Change secret name - tags: - - secrets - responses: - '200': - description: '' - content: - application/json: - schema: - properties: - uid: - type: string - name: - type: string - created: - type: string - format: date-time - oldName: - type: string - required: - - uid - - name - - created - - oldName - type: object - '400': - description: |- - One of the provided values in the request body is invalid. - One of the provided values in the request query is invalid. - '401': - description: '' - '403': - description: You do not have permission to access this resource. - parameters: - - name: name - description: The name of the secret. - in: path - required: true - schema: - description: The name of the secret. - type: string - example: my-api-key - - description: The Team identifier or slug to perform the request on behalf of. - in: query - name: teamId - required: true - schema: - type: string - requestBody: - content: - application/json: - schema: - additionalProperties: false - type: object - required: - - name - properties: - name: - description: The name of the new secret. - type: string - example: my-api-key - maximum: 100 - '/v3/secrets/{idOrName}': - get: - description: Retrieves the information for a specific secret by passing either the secret id or name in the URL. - operationId: getSecret - security: - - bearerToken: [] - summary: Get a single secret - tags: - - secrets - responses: - '200': - description: Successful response retrieving a secret. - content: - application/json: - schema: - properties: - created: - type: string - format: date-time - description: The date when the secret was created. - example: '2021-02-10T13:11:49.180Z' - name: - type: string - description: The name of the secret. - example: my-api-key - teamId: - nullable: true - type: string - description: The unique identifier of the team the secret was created for. - example: team_LLHUOMOoDlqOp8wPE4kFo9pE - uid: - type: string - description: The unique identifier of the secret. - example: sec_XCG7t7AIHuO2SBA8667zNUiM - userId: - type: string - description: The unique identifier of the user who created the secret. - example: 2qDDuGFTWXBLDNnqZfWPDp1A - value: - type: string - description: The value of the secret. - createdAt: - type: number - description: Timestamp for when the secret was created. - example: 1609492210000 - projectId: - type: string - description: The unique identifier of the project which the secret belongs to. - example: prj_2WjyKQmM8ZnGcJsPWMrHRHrE - decryptable: - type: boolean - description: Indicates whether the secret value can be decrypted after it has been created. - example: true - required: - - created - - name - - uid - type: object - description: Data representing a secret. - '400': - description: One of the provided values in the request query is invalid. - '401': - description: '' - '403': - description: You do not have permission to access this resource. - '404': - description: '' - parameters: - - name: idOrName - description: The name or the unique identifier to which the secret belongs to. - in: path - required: true - schema: - description: The name or the unique identifier to which the secret belongs to. - type: string - example: sec_RKc5iV0rV3ZSrFrHiruRno7k - - name: decrypt - description: Whether to try to decrypt the value of the secret. Only works if `decryptable` has been set to `true` when the secret was created. - in: query - required: false - schema: - description: Whether to try to decrypt the value of the secret. Only works if `decryptable` has been set to `true` when the secret was created. - type: string - enum: - - 'true' - - 'false' - example: 'true' - - description: The Team identifier or slug to perform the request on behalf of. - in: query - name: teamId - required: true - schema: - type: string - '/v2/secrets/{idOrName}': - delete: - description: This deletes the user or team’s secret defined in the URL. - operationId: deleteSecret - security: - - bearerToken: [] - summary: Delete a secret - tags: - - secrets - responses: - '200': - description: '' - content: - application/json: - schema: - properties: - uid: - type: string - description: The unique identifier of the deleted secret. - example: sec_XCG7t7AIHuO2SBA8667zNUiM - name: - type: string - description: The name of the deleted secret. - example: my-api-key - created: - type: number - description: The date when the secret was created. - example: '2021-02-10T13:11:49.180Z' - required: - - uid - - name - - created - type: object - '400': - description: One of the provided values in the request query is invalid. - '401': - description: '' - '403': - description: You do not have permission to access this resource. - parameters: - - name: idOrName - description: The name or the unique identifier to which the secret belongs to. - in: path - required: true - schema: - description: The name or the unique identifier to which the secret belongs to. - type: string - example: sec_RKc5iV0rV3ZSrFrHiruRno7k - - description: The Team identifier or slug to perform the request on behalf of. - in: query - name: teamId - required: true - schema: - type: string diff --git a/provider-dev/openapi/src/vercel/v00.00.00000/services/security.yaml b/provider-dev/openapi/src/vercel/v00.00.00000/services/security.yaml new file mode 100644 index 0000000..ca9f5d9 --- /dev/null +++ b/provider-dev/openapi/src/vercel/v00.00.00000/services/security.yaml @@ -0,0 +1,8753 @@ +openapi: 3.0.3 +info: + title: security API + description: vercel security API + version: 0.0.1 +paths: + /v1/security/attack-mode: + post: + description: Update the setting for determining if the project has Attack Challenge mode enabled. + operationId: updateAttackChallengeMode + security: + - bearerToken: [] + summary: Update Attack Challenge mode + tags: + - security + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + attackModeEnabled: + type: boolean + enum: + - false + - true + attackModeUpdatedAt: + type: number + required: + - attackModeEnabled + - attackModeUpdatedAt + type: object + '400': + description: One of the provided values in the request body is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + parameters: + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + requestBody: + content: + application/json: + schema: + type: object + required: + - projectId + - attackModeEnabled + - attackModeActiveUntil + properties: + projectId: + type: string + attackModeEnabled: + type: boolean + attackModeActiveUntil: + type: number + required: true + /v1/security/firewall/config: + get: + description: Lists WAF configs for a project + operationId: getSecurityFirewallConfig + security: [] + summary: Returns activated WAF config + tags: + - security + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + active: + nullable: true + properties: + ownerId: + type: string + projectKey: + type: string + id: + type: string + version: + type: number + updatedAt: + type: string + firewallEnabled: + type: boolean + enum: + - false + - true + crs: + properties: + sd: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - deny + - log + required: + - action + - active + type: object + ma: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - deny + - log + required: + - action + - active + type: object + lfi: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - deny + - log + required: + - action + - active + type: object + rfi: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - deny + - log + required: + - action + - active + type: object + rce: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - deny + - log + required: + - action + - active + type: object + php: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - deny + - log + required: + - action + - active + type: object + gen: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - deny + - log + required: + - action + - active + type: object + xss: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - deny + - log + required: + - action + - active + type: object + sqli: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - deny + - log + required: + - action + - active + type: object + sf: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - deny + - log + required: + - action + - active + type: object + java: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - deny + - log + required: + - action + - active + type: object + required: + - gen + - java + - lfi + - ma + - php + - rce + - rfi + - sd + - sf + - sqli + - xss + type: object + rules: + items: + oneOf: + - properties: + id: + type: string + name: + type: string + description: + type: string + active: + type: boolean + enum: + - false + - true + conditionGroup: + items: + properties: + conditions: + items: + properties: + type: + type: string + enum: + - bot_category + - bot_name + - bot_protection + - bot_status + - cookie + - domain_environment + - environment + - geo_as_number + - geo_city + - geo_continent + - geo_country + - geo_country_region + - header + - host + - ip_address + - ja3_digest + - ja4_digest + - method + - path + - protocol + - query + - rate_limit_api_id + - raw_path + - region + - route + - ruleset + - scheme + - server_action + - shared_condition + - target_path + - traffic_source + - trusted_source + - user_agent + op: + type: string + enum: + - eq + - ex + - gt + - gte + - inc + - list + - lt + - lte + - neq + - nex + - ninc + - pre + - re + - sub + - suf + neg: + type: boolean + enum: + - false + - true + key: + type: string + value: + oneOf: + - type: string + - type: number + - items: + type: string + type: array + required: + - op + - type + type: object + type: array + required: + - conditions + type: object + type: array + action: + properties: + mitigate: + properties: + action: + type: string + enum: + - allow + - bypass + - challenge + - deny + - log + - rate_limit + - redirect + rateLimit: + nullable: true + properties: + algo: + type: string + enum: + - fixed_window + - token_bucket + window: + type: number + limit: + type: number + keys: + items: + type: string + type: array + action: + nullable: true + type: string + enum: + - challenge + - deny + - log + - rate_limit + - null + required: + - algo + - keys + - limit + - window + type: object + redirect: + nullable: true + properties: + location: + type: string + permanent: + type: boolean + enum: + - false + - true + required: + - location + - permanent + type: object + actionDuration: + nullable: true + type: string + bypassSystem: + nullable: true + type: boolean + enum: + - false + - true + - null + logHeaders: + oneOf: + - items: + type: string + type: array + - type: string + enum: + - '*' + required: + - action + type: object + type: object + valid: + type: boolean + enum: + - true + validationErrors: + nullable: true + required: + - action + - active + - conditionGroup + - id + - name + - valid + - validationErrors + type: object + - properties: + id: + type: string + name: + type: string + description: + type: string + active: + type: boolean + enum: + - false + - true + conditionGroup: + items: + properties: + conditions: + items: + properties: + type: + type: string + enum: + - bot_category + - bot_name + - bot_protection + - bot_status + - cookie + - domain_environment + - environment + - geo_as_number + - geo_city + - geo_continent + - geo_country + - geo_country_region + - header + - host + - ip_address + - ja3_digest + - ja4_digest + - method + - path + - protocol + - query + - rate_limit_api_id + - raw_path + - region + - route + - ruleset + - scheme + - server_action + - shared_condition + - target_path + - traffic_source + - trusted_source + - user_agent + op: + type: string + enum: + - eq + - ex + - gt + - gte + - inc + - list + - lt + - lte + - neq + - nex + - ninc + - pre + - re + - sub + - suf + neg: + type: boolean + enum: + - false + - true + key: + type: string + value: + oneOf: + - type: string + - type: number + - items: + type: string + type: array + required: + - op + - type + type: object + type: array + required: + - conditions + type: object + type: array + action: + properties: + mitigate: + properties: + action: + type: string + enum: + - allow + - bypass + - challenge + - deny + - log + - rate_limit + - redirect + rateLimit: + nullable: true + properties: + algo: + type: string + enum: + - fixed_window + - token_bucket + window: + type: number + limit: + type: number + keys: + items: + type: string + type: array + action: + nullable: true + type: string + enum: + - challenge + - deny + - log + - rate_limit + - null + required: + - algo + - keys + - limit + - window + type: object + redirect: + nullable: true + properties: + location: + type: string + permanent: + type: boolean + enum: + - false + - true + required: + - location + - permanent + type: object + actionDuration: + nullable: true + type: string + bypassSystem: + nullable: true + type: boolean + enum: + - false + - true + - null + logHeaders: + oneOf: + - items: + type: string + type: array + - type: string + enum: + - '*' + required: + - action + type: object + type: object + valid: + type: boolean + enum: + - false + validationErrors: + items: + type: string + type: array + required: + - action + - active + - conditionGroup + - id + - name + - valid + - validationErrors + type: object + type: array + ips: + items: + properties: + id: + type: string + hostname: + type: string + ip: + type: string + notes: + type: string + action: + type: string + enum: + - bypass + - challenge + - deny + - log + required: + - action + - hostname + - id + - ip + type: object + type: array + rulesets: + oneOf: + - items: + properties: + description: + type: string + id: + type: string + name: + type: string + active: + type: boolean + enum: + - false + - true + conditionGroup: + items: + properties: + conditions: + items: + properties: + type: + type: string + enum: + - bot_category + - bot_name + - bot_protection + - bot_status + - cookie + - domain_environment + - environment + - geo_as_number + - geo_city + - geo_continent + - geo_country + - geo_country_region + - header + - host + - ip_address + - ja3_digest + - ja4_digest + - method + - path + - protocol + - query + - rate_limit_api_id + - raw_path + - region + - route + - ruleset + - scheme + - server_action + - shared_condition + - target_path + - traffic_source + - trusted_source + - user_agent + op: + type: string + enum: + - eq + - ex + - gt + - gte + - inc + - list + - lt + - lte + - neq + - nex + - ninc + - pre + - re + - sub + - suf + neg: + type: boolean + enum: + - false + - true + key: + type: string + value: + oneOf: + - type: string + - type: number + - items: + type: string + type: array + required: + - op + - type + type: object + type: array + required: + - conditions + type: object + type: array + action: + properties: + mitigate: + properties: + action: + type: string + enum: + - allow + - bypass + - challenge + - deny + - log + - rate_limit + - redirect + rateLimit: + nullable: true + properties: + algo: + type: string + enum: + - fixed_window + - token_bucket + window: + type: number + limit: + type: number + keys: + items: + type: string + type: array + action: + nullable: true + type: string + enum: + - challenge + - deny + - log + - rate_limit + - null + required: + - algo + - keys + - limit + - window + type: object + redirect: + nullable: true + properties: + location: + type: string + permanent: + type: boolean + enum: + - false + - true + required: + - location + - permanent + type: object + actionDuration: + nullable: true + type: string + bypassSystem: + nullable: true + type: boolean + enum: + - false + - true + - null + logHeaders: + oneOf: + - items: + type: string + type: array + - type: string + enum: + - '*' + required: + - action + type: object + type: object + required: + - active + - conditionGroup + - id + - name + type: object + type: array + - additionalProperties: + properties: + action: + type: string + enum: + - allow + - bypass + - challenge + - deny + - log + - rate_limit + - redirect + rateLimit: + nullable: true + properties: + algo: + type: string + enum: + - fixed_window + - token_bucket + window: + type: number + limit: + type: number + keys: + items: + type: string + type: array + action: + nullable: true + type: string + enum: + - challenge + - deny + - log + - rate_limit + - null + required: + - algo + - keys + - limit + - window + type: object + redirect: + nullable: true + properties: + location: + type: string + permanent: + type: boolean + enum: + - false + - true + required: + - location + - permanent + type: object + actionDuration: + nullable: true + type: string + bypassSystem: + nullable: true + type: boolean + enum: + - false + - true + - null + logHeaders: + oneOf: + - items: + type: string + type: array + - type: string + enum: + - '*' + required: + - action + type: object + type: object + conditions: + items: + properties: + description: + type: string + id: + type: string + name: + type: string + active: + type: boolean + enum: + - false + - true + conditionGroup: + items: + properties: + conditions: + items: + properties: + type: + type: string + enum: + - bot_category + - bot_name + - bot_protection + - bot_status + - cookie + - domain_environment + - environment + - geo_as_number + - geo_city + - geo_continent + - geo_country + - geo_country_region + - header + - host + - ip_address + - ja3_digest + - ja4_digest + - method + - path + - protocol + - query + - rate_limit_api_id + - raw_path + - region + - route + - ruleset + - scheme + - server_action + - shared_condition + - target_path + - traffic_source + - trusted_source + - user_agent + op: + type: string + enum: + - eq + - ex + - gt + - gte + - inc + - list + - lt + - lte + - neq + - nex + - ninc + - pre + - re + - sub + - suf + neg: + type: boolean + enum: + - false + - true + key: + type: string + value: + oneOf: + - type: string + - type: number + - items: + type: string + type: array + required: + - op + - type + type: object + type: array + required: + - conditions + type: object + type: array + required: + - active + - conditionGroup + - id + - name + type: object + type: array + changes: + items: + type: string + description: (opaque JSON object) + type: array + managedRules: + properties: + bot_protection: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - challenge + - deny + - log + updatedAt: + type: string + userId: + type: string + username: + type: string + required: + - active + type: object + ai_bots: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - challenge + - deny + - log + updatedAt: + type: string + userId: + type: string + username: + type: string + required: + - active + type: object + owasp: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - challenge + - deny + - log + updatedAt: + type: string + userId: + type: string + username: + type: string + required: + - active + type: object + vercel_ruleset: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - challenge + - deny + - log + updatedAt: + type: string + userId: + type: string + username: + type: string + required: + - active + type: object + traffic_sources: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - challenge + - deny + - log + updatedAt: + type: string + userId: + type: string + username: + type: string + required: + - active + type: object + type: object + botIdEnabled: + type: boolean + enum: + - false + - true + logHeaders: + oneOf: + - items: + type: string + type: array + - type: string + enum: + - '*' + required: + - changes + - firewallEnabled + - id + - ips + - ownerId + - projectKey + - rules + - updatedAt + - version + type: object + draft: + nullable: true + properties: + ownerId: + type: string + projectKey: + type: string + id: + type: string + version: + type: number + updatedAt: + type: string + firewallEnabled: + type: boolean + enum: + - false + - true + crs: + properties: + sd: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - deny + - log + required: + - action + - active + type: object + ma: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - deny + - log + required: + - action + - active + type: object + lfi: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - deny + - log + required: + - action + - active + type: object + rfi: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - deny + - log + required: + - action + - active + type: object + rce: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - deny + - log + required: + - action + - active + type: object + php: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - deny + - log + required: + - action + - active + type: object + gen: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - deny + - log + required: + - action + - active + type: object + xss: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - deny + - log + required: + - action + - active + type: object + sqli: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - deny + - log + required: + - action + - active + type: object + sf: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - deny + - log + required: + - action + - active + type: object + java: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - deny + - log + required: + - action + - active + type: object + required: + - gen + - java + - lfi + - ma + - php + - rce + - rfi + - sd + - sf + - sqli + - xss + type: object + rules: + items: + oneOf: + - properties: + id: + type: string + name: + type: string + description: + type: string + active: + type: boolean + enum: + - false + - true + conditionGroup: + items: + properties: + conditions: + items: + properties: + type: + type: string + enum: + - bot_category + - bot_name + - bot_protection + - bot_status + - cookie + - domain_environment + - environment + - geo_as_number + - geo_city + - geo_continent + - geo_country + - geo_country_region + - header + - host + - ip_address + - ja3_digest + - ja4_digest + - method + - path + - protocol + - query + - rate_limit_api_id + - raw_path + - region + - route + - ruleset + - scheme + - server_action + - shared_condition + - target_path + - traffic_source + - trusted_source + - user_agent + op: + type: string + enum: + - eq + - ex + - gt + - gte + - inc + - list + - lt + - lte + - neq + - nex + - ninc + - pre + - re + - sub + - suf + neg: + type: boolean + enum: + - false + - true + key: + type: string + value: + oneOf: + - type: string + - type: number + - items: + type: string + type: array + required: + - op + - type + type: object + type: array + required: + - conditions + type: object + type: array + action: + properties: + mitigate: + properties: + action: + type: string + enum: + - allow + - bypass + - challenge + - deny + - log + - rate_limit + - redirect + rateLimit: + nullable: true + properties: + algo: + type: string + enum: + - fixed_window + - token_bucket + window: + type: number + limit: + type: number + keys: + items: + type: string + type: array + action: + nullable: true + type: string + enum: + - challenge + - deny + - log + - rate_limit + - null + required: + - algo + - keys + - limit + - window + type: object + redirect: + nullable: true + properties: + location: + type: string + permanent: + type: boolean + enum: + - false + - true + required: + - location + - permanent + type: object + actionDuration: + nullable: true + type: string + bypassSystem: + nullable: true + type: boolean + enum: + - false + - true + - null + logHeaders: + oneOf: + - items: + type: string + type: array + - type: string + enum: + - '*' + required: + - action + type: object + type: object + valid: + type: boolean + enum: + - true + validationErrors: + nullable: true + required: + - action + - active + - conditionGroup + - id + - name + - valid + - validationErrors + type: object + - properties: + id: + type: string + name: + type: string + description: + type: string + active: + type: boolean + enum: + - false + - true + conditionGroup: + items: + properties: + conditions: + items: + properties: + type: + type: string + enum: + - bot_category + - bot_name + - bot_protection + - bot_status + - cookie + - domain_environment + - environment + - geo_as_number + - geo_city + - geo_continent + - geo_country + - geo_country_region + - header + - host + - ip_address + - ja3_digest + - ja4_digest + - method + - path + - protocol + - query + - rate_limit_api_id + - raw_path + - region + - route + - ruleset + - scheme + - server_action + - shared_condition + - target_path + - traffic_source + - trusted_source + - user_agent + op: + type: string + enum: + - eq + - ex + - gt + - gte + - inc + - list + - lt + - lte + - neq + - nex + - ninc + - pre + - re + - sub + - suf + neg: + type: boolean + enum: + - false + - true + key: + type: string + value: + oneOf: + - type: string + - type: number + - items: + type: string + type: array + required: + - op + - type + type: object + type: array + required: + - conditions + type: object + type: array + action: + properties: + mitigate: + properties: + action: + type: string + enum: + - allow + - bypass + - challenge + - deny + - log + - rate_limit + - redirect + rateLimit: + nullable: true + properties: + algo: + type: string + enum: + - fixed_window + - token_bucket + window: + type: number + limit: + type: number + keys: + items: + type: string + type: array + action: + nullable: true + type: string + enum: + - challenge + - deny + - log + - rate_limit + - null + required: + - algo + - keys + - limit + - window + type: object + redirect: + nullable: true + properties: + location: + type: string + permanent: + type: boolean + enum: + - false + - true + required: + - location + - permanent + type: object + actionDuration: + nullable: true + type: string + bypassSystem: + nullable: true + type: boolean + enum: + - false + - true + - null + logHeaders: + oneOf: + - items: + type: string + type: array + - type: string + enum: + - '*' + required: + - action + type: object + type: object + valid: + type: boolean + enum: + - false + validationErrors: + items: + type: string + type: array + required: + - action + - active + - conditionGroup + - id + - name + - valid + - validationErrors + type: object + type: array + ips: + items: + properties: + id: + type: string + hostname: + type: string + ip: + type: string + notes: + type: string + action: + type: string + enum: + - bypass + - challenge + - deny + - log + required: + - action + - hostname + - id + - ip + type: object + type: array + rulesets: + oneOf: + - items: + properties: + description: + type: string + id: + type: string + name: + type: string + active: + type: boolean + enum: + - false + - true + conditionGroup: + items: + properties: + conditions: + items: + properties: + type: + type: string + enum: + - bot_category + - bot_name + - bot_protection + - bot_status + - cookie + - domain_environment + - environment + - geo_as_number + - geo_city + - geo_continent + - geo_country + - geo_country_region + - header + - host + - ip_address + - ja3_digest + - ja4_digest + - method + - path + - protocol + - query + - rate_limit_api_id + - raw_path + - region + - route + - ruleset + - scheme + - server_action + - shared_condition + - target_path + - traffic_source + - trusted_source + - user_agent + op: + type: string + enum: + - eq + - ex + - gt + - gte + - inc + - list + - lt + - lte + - neq + - nex + - ninc + - pre + - re + - sub + - suf + neg: + type: boolean + enum: + - false + - true + key: + type: string + value: + oneOf: + - type: string + - type: number + - items: + type: string + type: array + required: + - op + - type + type: object + type: array + required: + - conditions + type: object + type: array + action: + properties: + mitigate: + properties: + action: + type: string + enum: + - allow + - bypass + - challenge + - deny + - log + - rate_limit + - redirect + rateLimit: + nullable: true + properties: + algo: + type: string + enum: + - fixed_window + - token_bucket + window: + type: number + limit: + type: number + keys: + items: + type: string + type: array + action: + nullable: true + type: string + enum: + - challenge + - deny + - log + - rate_limit + - null + required: + - algo + - keys + - limit + - window + type: object + redirect: + nullable: true + properties: + location: + type: string + permanent: + type: boolean + enum: + - false + - true + required: + - location + - permanent + type: object + actionDuration: + nullable: true + type: string + bypassSystem: + nullable: true + type: boolean + enum: + - false + - true + - null + logHeaders: + oneOf: + - items: + type: string + type: array + - type: string + enum: + - '*' + required: + - action + type: object + type: object + required: + - active + - conditionGroup + - id + - name + type: object + type: array + - additionalProperties: + properties: + action: + type: string + enum: + - allow + - bypass + - challenge + - deny + - log + - rate_limit + - redirect + rateLimit: + nullable: true + properties: + algo: + type: string + enum: + - fixed_window + - token_bucket + window: + type: number + limit: + type: number + keys: + items: + type: string + type: array + action: + nullable: true + type: string + enum: + - challenge + - deny + - log + - rate_limit + - null + required: + - algo + - keys + - limit + - window + type: object + redirect: + nullable: true + properties: + location: + type: string + permanent: + type: boolean + enum: + - false + - true + required: + - location + - permanent + type: object + actionDuration: + nullable: true + type: string + bypassSystem: + nullable: true + type: boolean + enum: + - false + - true + - null + logHeaders: + oneOf: + - items: + type: string + type: array + - type: string + enum: + - '*' + required: + - action + type: object + type: object + conditions: + items: + properties: + description: + type: string + id: + type: string + name: + type: string + active: + type: boolean + enum: + - false + - true + conditionGroup: + items: + properties: + conditions: + items: + properties: + type: + type: string + enum: + - bot_category + - bot_name + - bot_protection + - bot_status + - cookie + - domain_environment + - environment + - geo_as_number + - geo_city + - geo_continent + - geo_country + - geo_country_region + - header + - host + - ip_address + - ja3_digest + - ja4_digest + - method + - path + - protocol + - query + - rate_limit_api_id + - raw_path + - region + - route + - ruleset + - scheme + - server_action + - shared_condition + - target_path + - traffic_source + - trusted_source + - user_agent + op: + type: string + enum: + - eq + - ex + - gt + - gte + - inc + - list + - lt + - lte + - neq + - nex + - ninc + - pre + - re + - sub + - suf + neg: + type: boolean + enum: + - false + - true + key: + type: string + value: + oneOf: + - type: string + - type: number + - items: + type: string + type: array + required: + - op + - type + type: object + type: array + required: + - conditions + type: object + type: array + required: + - active + - conditionGroup + - id + - name + type: object + type: array + changes: + items: + type: string + description: (opaque JSON object) + type: array + managedRules: + properties: + bot_protection: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - challenge + - deny + - log + updatedAt: + type: string + userId: + type: string + username: + type: string + required: + - active + type: object + ai_bots: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - challenge + - deny + - log + updatedAt: + type: string + userId: + type: string + username: + type: string + required: + - active + type: object + owasp: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - challenge + - deny + - log + updatedAt: + type: string + userId: + type: string + username: + type: string + required: + - active + type: object + vercel_ruleset: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - challenge + - deny + - log + updatedAt: + type: string + userId: + type: string + username: + type: string + required: + - active + type: object + traffic_sources: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - challenge + - deny + - log + updatedAt: + type: string + userId: + type: string + username: + type: string + required: + - active + type: object + type: object + botIdEnabled: + type: boolean + enum: + - false + - true + logHeaders: + oneOf: + - items: + type: string + type: array + - type: string + enum: + - '*' + required: + - changes + - firewallEnabled + - id + - ips + - ownerId + - projectKey + - rules + - updatedAt + - version + type: object + versions: + items: + properties: + ownerId: + type: string + projectKey: + type: string + id: + type: string + version: + type: number + updatedAt: + type: string + firewallEnabled: + type: boolean + enum: + - false + - true + crs: + properties: + sd: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - deny + - log + required: + - action + - active + type: object + ma: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - deny + - log + required: + - action + - active + type: object + lfi: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - deny + - log + required: + - action + - active + type: object + rfi: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - deny + - log + required: + - action + - active + type: object + rce: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - deny + - log + required: + - action + - active + type: object + php: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - deny + - log + required: + - action + - active + type: object + gen: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - deny + - log + required: + - action + - active + type: object + xss: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - deny + - log + required: + - action + - active + type: object + sqli: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - deny + - log + required: + - action + - active + type: object + sf: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - deny + - log + required: + - action + - active + type: object + java: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - deny + - log + required: + - action + - active + type: object + required: + - gen + - java + - lfi + - ma + - php + - rce + - rfi + - sd + - sf + - sqli + - xss + type: object + rules: + items: + oneOf: + - properties: + id: + type: string + name: + type: string + description: + type: string + active: + type: boolean + enum: + - false + - true + conditionGroup: + items: + properties: + conditions: + items: + properties: + type: + type: string + enum: + - bot_category + - bot_name + - bot_protection + - bot_status + - cookie + - domain_environment + - environment + - geo_as_number + - geo_city + - geo_continent + - geo_country + - geo_country_region + - header + - host + - ip_address + - ja3_digest + - ja4_digest + - method + - path + - protocol + - query + - rate_limit_api_id + - raw_path + - region + - route + - ruleset + - scheme + - server_action + - shared_condition + - target_path + - traffic_source + - trusted_source + - user_agent + op: + type: string + enum: + - eq + - ex + - gt + - gte + - inc + - list + - lt + - lte + - neq + - nex + - ninc + - pre + - re + - sub + - suf + neg: + type: boolean + enum: + - false + - true + key: + type: string + value: + oneOf: + - type: string + - type: number + - items: + type: string + type: array + required: + - op + - type + type: object + type: array + required: + - conditions + type: object + type: array + action: + properties: + mitigate: + properties: + action: + type: string + enum: + - allow + - bypass + - challenge + - deny + - log + - rate_limit + - redirect + rateLimit: + nullable: true + properties: + algo: + type: string + enum: + - fixed_window + - token_bucket + window: + type: number + limit: + type: number + keys: + items: + type: string + type: array + action: + nullable: true + type: string + enum: + - challenge + - deny + - log + - rate_limit + - null + required: + - algo + - keys + - limit + - window + type: object + redirect: + nullable: true + properties: + location: + type: string + permanent: + type: boolean + enum: + - false + - true + required: + - location + - permanent + type: object + actionDuration: + nullable: true + type: string + bypassSystem: + nullable: true + type: boolean + enum: + - false + - true + - null + logHeaders: + oneOf: + - items: + type: string + type: array + - type: string + enum: + - '*' + required: + - action + type: object + type: object + valid: + type: boolean + enum: + - true + validationErrors: + nullable: true + required: + - action + - active + - conditionGroup + - id + - name + - valid + - validationErrors + type: object + - properties: + id: + type: string + name: + type: string + description: + type: string + active: + type: boolean + enum: + - false + - true + conditionGroup: + items: + properties: + conditions: + items: + properties: + type: + type: string + enum: + - bot_category + - bot_name + - bot_protection + - bot_status + - cookie + - domain_environment + - environment + - geo_as_number + - geo_city + - geo_continent + - geo_country + - geo_country_region + - header + - host + - ip_address + - ja3_digest + - ja4_digest + - method + - path + - protocol + - query + - rate_limit_api_id + - raw_path + - region + - route + - ruleset + - scheme + - server_action + - shared_condition + - target_path + - traffic_source + - trusted_source + - user_agent + op: + type: string + enum: + - eq + - ex + - gt + - gte + - inc + - list + - lt + - lte + - neq + - nex + - ninc + - pre + - re + - sub + - suf + neg: + type: boolean + enum: + - false + - true + key: + type: string + value: + oneOf: + - type: string + - type: number + - items: + type: string + type: array + required: + - op + - type + type: object + type: array + required: + - conditions + type: object + type: array + action: + properties: + mitigate: + properties: + action: + type: string + enum: + - allow + - bypass + - challenge + - deny + - log + - rate_limit + - redirect + rateLimit: + nullable: true + properties: + algo: + type: string + enum: + - fixed_window + - token_bucket + window: + type: number + limit: + type: number + keys: + items: + type: string + type: array + action: + nullable: true + type: string + enum: + - challenge + - deny + - log + - rate_limit + - null + required: + - algo + - keys + - limit + - window + type: object + redirect: + nullable: true + properties: + location: + type: string + permanent: + type: boolean + enum: + - false + - true + required: + - location + - permanent + type: object + actionDuration: + nullable: true + type: string + bypassSystem: + nullable: true + type: boolean + enum: + - false + - true + - null + logHeaders: + oneOf: + - items: + type: string + type: array + - type: string + enum: + - '*' + required: + - action + type: object + type: object + valid: + type: boolean + enum: + - false + validationErrors: + items: + type: string + type: array + required: + - action + - active + - conditionGroup + - id + - name + - valid + - validationErrors + type: object + type: array + ips: + items: + properties: + id: + type: string + hostname: + type: string + ip: + type: string + notes: + type: string + action: + type: string + enum: + - bypass + - challenge + - deny + - log + required: + - action + - hostname + - id + - ip + type: object + type: array + rulesets: + oneOf: + - items: + properties: + description: + type: string + id: + type: string + name: + type: string + active: + type: boolean + enum: + - false + - true + conditionGroup: + items: + properties: + conditions: + items: + properties: + type: + type: string + enum: + - bot_category + - bot_name + - bot_protection + - bot_status + - cookie + - domain_environment + - environment + - geo_as_number + - geo_city + - geo_continent + - geo_country + - geo_country_region + - header + - host + - ip_address + - ja3_digest + - ja4_digest + - method + - path + - protocol + - query + - rate_limit_api_id + - raw_path + - region + - route + - ruleset + - scheme + - server_action + - shared_condition + - target_path + - traffic_source + - trusted_source + - user_agent + op: + type: string + enum: + - eq + - ex + - gt + - gte + - inc + - list + - lt + - lte + - neq + - nex + - ninc + - pre + - re + - sub + - suf + neg: + type: boolean + enum: + - false + - true + key: + type: string + value: + oneOf: + - type: string + - type: number + - items: + type: string + type: array + required: + - op + - type + type: object + type: array + required: + - conditions + type: object + type: array + action: + properties: + mitigate: + properties: + action: + type: string + enum: + - allow + - bypass + - challenge + - deny + - log + - rate_limit + - redirect + rateLimit: + nullable: true + properties: + algo: + type: string + enum: + - fixed_window + - token_bucket + window: + type: number + limit: + type: number + keys: + items: + type: string + type: array + action: + nullable: true + type: string + enum: + - challenge + - deny + - log + - rate_limit + - null + required: + - algo + - keys + - limit + - window + type: object + redirect: + nullable: true + properties: + location: + type: string + permanent: + type: boolean + enum: + - false + - true + required: + - location + - permanent + type: object + actionDuration: + nullable: true + type: string + bypassSystem: + nullable: true + type: boolean + enum: + - false + - true + - null + logHeaders: + oneOf: + - items: + type: string + type: array + - type: string + enum: + - '*' + required: + - action + type: object + type: object + required: + - active + - conditionGroup + - id + - name + type: object + type: array + - additionalProperties: + properties: + action: + type: string + enum: + - allow + - bypass + - challenge + - deny + - log + - rate_limit + - redirect + rateLimit: + nullable: true + properties: + algo: + type: string + enum: + - fixed_window + - token_bucket + window: + type: number + limit: + type: number + keys: + items: + type: string + type: array + action: + nullable: true + type: string + enum: + - challenge + - deny + - log + - rate_limit + - null + required: + - algo + - keys + - limit + - window + type: object + redirect: + nullable: true + properties: + location: + type: string + permanent: + type: boolean + enum: + - false + - true + required: + - location + - permanent + type: object + actionDuration: + nullable: true + type: string + bypassSystem: + nullable: true + type: boolean + enum: + - false + - true + - null + logHeaders: + oneOf: + - items: + type: string + type: array + - type: string + enum: + - '*' + required: + - action + type: object + type: object + conditions: + items: + properties: + description: + type: string + id: + type: string + name: + type: string + active: + type: boolean + enum: + - false + - true + conditionGroup: + items: + properties: + conditions: + items: + properties: + type: + type: string + enum: + - bot_category + - bot_name + - bot_protection + - bot_status + - cookie + - domain_environment + - environment + - geo_as_number + - geo_city + - geo_continent + - geo_country + - geo_country_region + - header + - host + - ip_address + - ja3_digest + - ja4_digest + - method + - path + - protocol + - query + - rate_limit_api_id + - raw_path + - region + - route + - ruleset + - scheme + - server_action + - shared_condition + - target_path + - traffic_source + - trusted_source + - user_agent + op: + type: string + enum: + - eq + - ex + - gt + - gte + - inc + - list + - lt + - lte + - neq + - nex + - ninc + - pre + - re + - sub + - suf + neg: + type: boolean + enum: + - false + - true + key: + type: string + value: + oneOf: + - type: string + - type: number + - items: + type: string + type: array + required: + - op + - type + type: object + type: array + required: + - conditions + type: object + type: array + required: + - active + - conditionGroup + - id + - name + type: object + type: array + changes: + items: + type: string + description: (opaque JSON object) + type: array + managedRules: + properties: + bot_protection: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - challenge + - deny + - log + updatedAt: + type: string + userId: + type: string + username: + type: string + required: + - active + type: object + ai_bots: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - challenge + - deny + - log + updatedAt: + type: string + userId: + type: string + username: + type: string + required: + - active + type: object + owasp: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - challenge + - deny + - log + updatedAt: + type: string + userId: + type: string + username: + type: string + required: + - active + type: object + vercel_ruleset: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - challenge + - deny + - log + updatedAt: + type: string + userId: + type: string + username: + type: string + required: + - active + type: object + traffic_sources: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - challenge + - deny + - log + updatedAt: + type: string + userId: + type: string + username: + type: string + required: + - active + type: object + type: object + botIdEnabled: + type: boolean + enum: + - false + - true + logHeaders: + oneOf: + - items: + type: string + type: array + - type: string + enum: + - '*' + required: + - changes + - firewallEnabled + - id + - ips + - ownerId + - projectKey + - rules + - updatedAt + - version + type: object + type: array + required: + - active + - draft + - versions + type: object + '400': + description: '' + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + parameters: [] + put: + description: Set the firewall configuration to provided rules and settings. Creates or overwrite the existing firewall configuration. + operationId: putFirewallConfig + security: + - bearerToken: [] + summary: Put Firewall Configuration + tags: + - security + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + active: + properties: + ownerId: + type: string + projectKey: + type: string + id: + type: string + version: + type: number + updatedAt: + type: string + firewallEnabled: + type: boolean + enum: + - false + - true + crs: + properties: + sd: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - deny + - log + required: + - action + - active + type: object + description: Scanner Detection - Detect and prevent reconnaissance activities from network scanning tools. + ma: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - deny + - log + required: + - action + - active + type: object + description: Multipart Attack - Block attempts to bypass security controls using multipart/form-data encoding. + lfi: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - deny + - log + required: + - action + - active + type: object + description: Local File Inclusion Attack - Prevent unauthorized access to local files through web applications. + rfi: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - deny + - log + required: + - action + - active + type: object + description: Remote File Inclusion Attack - Prohibit unauthorized upload or execution of remote files. + rce: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - deny + - log + required: + - action + - active + type: object + description: Remote Execution Attack - Prevent unauthorized execution of remote scripts or commands. + php: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - deny + - log + required: + - action + - active + type: object + description: PHP Attack - Safeguard against vulnerability exploits in PHP-based applications. + gen: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - deny + - log + required: + - action + - active + type: object + description: Generic Attack - Provide broad protection from various undefined or novel attack vectors. + xss: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - deny + - log + required: + - action + - active + type: object + description: XSS Attack - Prevent injection of malicious scripts into trusted webpages. + sqli: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - deny + - log + required: + - action + - active + type: object + description: SQL Injection Attack - Prohibit unauthorized use of SQL commands to manipulate databases. + sf: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - deny + - log + required: + - action + - active + type: object + description: Session Fixation Attack - Prevent unauthorized takeover of user sessions by enforcing unique session IDs. + java: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - deny + - log + required: + - action + - active + type: object + description: Java Attack - Mitigate risks of exploitation targeting Java-based applications or components. + required: + - gen + - java + - lfi + - ma + - php + - rce + - rfi + - sd + - sf + - sqli + - xss + type: object + description: Custom Ruleset + rules: + items: + oneOf: + - properties: + id: + type: string + name: + type: string + description: + type: string + active: + type: boolean + enum: + - false + - true + conditionGroup: + items: + properties: + conditions: + items: + properties: + type: + type: string + enum: + - bot_category + - bot_name + - bot_protection + - bot_status + - cookie + - domain_environment + - environment + - geo_as_number + - geo_city + - geo_continent + - geo_country + - geo_country_region + - header + - host + - ip_address + - ja3_digest + - ja4_digest + - method + - path + - protocol + - query + - rate_limit_api_id + - raw_path + - region + - route + - ruleset + - scheme + - server_action + - shared_condition + - target_path + - traffic_source + - trusted_source + - user_agent + op: + type: string + enum: + - eq + - ex + - gt + - gte + - inc + - list + - lt + - lte + - neq + - nex + - ninc + - pre + - re + - sub + - suf + neg: + type: boolean + enum: + - false + - true + key: + type: string + value: + oneOf: + - type: string + - type: number + - items: + type: string + type: array + required: + - op + - type + type: object + type: array + required: + - conditions + type: object + type: array + action: + properties: + mitigate: + properties: + action: + type: string + enum: + - allow + - bypass + - challenge + - deny + - log + - rate_limit + - redirect + rateLimit: + nullable: true + properties: + algo: + type: string + enum: + - fixed_window + - token_bucket + window: + type: number + limit: + type: number + keys: + items: + type: string + type: array + action: + nullable: true + type: string + enum: + - challenge + - deny + - log + - rate_limit + - null + required: + - algo + - keys + - limit + - window + type: object + redirect: + nullable: true + properties: + location: + type: string + permanent: + type: boolean + enum: + - false + - true + required: + - location + - permanent + type: object + actionDuration: + nullable: true + type: string + bypassSystem: + nullable: true + type: boolean + enum: + - false + - true + - null + logHeaders: + oneOf: + - items: + type: string + type: array + - type: string + enum: + - '*' + required: + - action + type: object + type: object + valid: + type: boolean + enum: + - true + validationErrors: + nullable: true + required: + - action + - active + - conditionGroup + - id + - name + - valid + - validationErrors + type: object + - properties: + id: + type: string + name: + type: string + description: + type: string + active: + type: boolean + enum: + - false + - true + conditionGroup: + items: + properties: + conditions: + items: + properties: + type: + type: string + enum: + - bot_category + - bot_name + - bot_protection + - bot_status + - cookie + - domain_environment + - environment + - geo_as_number + - geo_city + - geo_continent + - geo_country + - geo_country_region + - header + - host + - ip_address + - ja3_digest + - ja4_digest + - method + - path + - protocol + - query + - rate_limit_api_id + - raw_path + - region + - route + - ruleset + - scheme + - server_action + - shared_condition + - target_path + - traffic_source + - trusted_source + - user_agent + op: + type: string + enum: + - eq + - ex + - gt + - gte + - inc + - list + - lt + - lte + - neq + - nex + - ninc + - pre + - re + - sub + - suf + neg: + type: boolean + enum: + - false + - true + key: + type: string + value: + oneOf: + - type: string + - type: number + - items: + type: string + type: array + required: + - op + - type + type: object + type: array + required: + - conditions + type: object + type: array + action: + properties: + mitigate: + properties: + action: + type: string + enum: + - allow + - bypass + - challenge + - deny + - log + - rate_limit + - redirect + rateLimit: + nullable: true + properties: + algo: + type: string + enum: + - fixed_window + - token_bucket + window: + type: number + limit: + type: number + keys: + items: + type: string + type: array + action: + nullable: true + type: string + enum: + - challenge + - deny + - log + - rate_limit + - null + required: + - algo + - keys + - limit + - window + type: object + redirect: + nullable: true + properties: + location: + type: string + permanent: + type: boolean + enum: + - false + - true + required: + - location + - permanent + type: object + actionDuration: + nullable: true + type: string + bypassSystem: + nullable: true + type: boolean + enum: + - false + - true + - null + logHeaders: + oneOf: + - items: + type: string + type: array + - type: string + enum: + - '*' + required: + - action + type: object + type: object + valid: + type: boolean + enum: + - false + validationErrors: + items: + type: string + type: array + required: + - action + - active + - conditionGroup + - id + - name + - valid + - validationErrors + type: object + type: array + ips: + items: + properties: + id: + type: string + hostname: + type: string + ip: + type: string + notes: + type: string + action: + type: string + enum: + - bypass + - challenge + - deny + - log + required: + - action + - hostname + - id + - ip + type: object + type: array + rulesets: + oneOf: + - items: + properties: + description: + type: string + id: + type: string + name: + type: string + active: + type: boolean + enum: + - false + - true + conditionGroup: + items: + properties: + conditions: + items: + properties: + type: + type: string + enum: + - bot_category + - bot_name + - bot_protection + - bot_status + - cookie + - domain_environment + - environment + - geo_as_number + - geo_city + - geo_continent + - geo_country + - geo_country_region + - header + - host + - ip_address + - ja3_digest + - ja4_digest + - method + - path + - protocol + - query + - rate_limit_api_id + - raw_path + - region + - route + - ruleset + - scheme + - server_action + - shared_condition + - target_path + - traffic_source + - trusted_source + - user_agent + op: + type: string + enum: + - eq + - ex + - gt + - gte + - inc + - list + - lt + - lte + - neq + - nex + - ninc + - pre + - re + - sub + - suf + neg: + type: boolean + enum: + - false + - true + key: + type: string + value: + oneOf: + - type: string + - type: number + - items: + type: string + type: array + required: + - op + - type + type: object + type: array + required: + - conditions + type: object + type: array + action: + properties: + mitigate: + properties: + action: + type: string + enum: + - allow + - bypass + - challenge + - deny + - log + - rate_limit + - redirect + rateLimit: + nullable: true + properties: + algo: + type: string + enum: + - fixed_window + - token_bucket + window: + type: number + limit: + type: number + keys: + items: + type: string + type: array + action: + nullable: true + type: string + enum: + - challenge + - deny + - log + - rate_limit + - null + required: + - algo + - keys + - limit + - window + type: object + redirect: + nullable: true + properties: + location: + type: string + permanent: + type: boolean + enum: + - false + - true + required: + - location + - permanent + type: object + actionDuration: + nullable: true + type: string + bypassSystem: + nullable: true + type: boolean + enum: + - false + - true + - null + logHeaders: + oneOf: + - items: + type: string + type: array + - type: string + enum: + - '*' + required: + - action + type: object + type: object + required: + - active + - conditionGroup + - id + - name + type: object + type: array + - additionalProperties: + properties: + action: + type: string + enum: + - allow + - bypass + - challenge + - deny + - log + - rate_limit + - redirect + rateLimit: + nullable: true + properties: + algo: + type: string + enum: + - fixed_window + - token_bucket + window: + type: number + limit: + type: number + keys: + items: + type: string + type: array + action: + nullable: true + type: string + enum: + - challenge + - deny + - log + - rate_limit + - null + required: + - algo + - keys + - limit + - window + type: object + redirect: + nullable: true + properties: + location: + type: string + permanent: + type: boolean + enum: + - false + - true + required: + - location + - permanent + type: object + actionDuration: + nullable: true + type: string + bypassSystem: + nullable: true + type: boolean + enum: + - false + - true + - null + logHeaders: + oneOf: + - items: + type: string + type: array + - type: string + enum: + - '*' + required: + - action + type: object + type: object + conditions: + items: + properties: + description: + type: string + id: + type: string + name: + type: string + active: + type: boolean + enum: + - false + - true + conditionGroup: + items: + properties: + conditions: + items: + properties: + type: + type: string + enum: + - bot_category + - bot_name + - bot_protection + - bot_status + - cookie + - domain_environment + - environment + - geo_as_number + - geo_city + - geo_continent + - geo_country + - geo_country_region + - header + - host + - ip_address + - ja3_digest + - ja4_digest + - method + - path + - protocol + - query + - rate_limit_api_id + - raw_path + - region + - route + - ruleset + - scheme + - server_action + - shared_condition + - target_path + - traffic_source + - trusted_source + - user_agent + op: + type: string + enum: + - eq + - ex + - gt + - gte + - inc + - list + - lt + - lte + - neq + - nex + - ninc + - pre + - re + - sub + - suf + neg: + type: boolean + enum: + - false + - true + key: + type: string + value: + oneOf: + - type: string + - type: number + - items: + type: string + type: array + required: + - op + - type + type: object + type: array + required: + - conditions + type: object + type: array + required: + - active + - conditionGroup + - id + - name + type: object + type: array + changes: + items: + type: string + description: (opaque JSON object) + type: array + managedRules: + properties: + bot_protection: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - challenge + - deny + - log + updatedAt: + type: string + userId: + type: string + username: + type: string + required: + - active + type: object + ai_bots: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - challenge + - deny + - log + updatedAt: + type: string + userId: + type: string + username: + type: string + required: + - active + type: object + owasp: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - challenge + - deny + - log + updatedAt: + type: string + userId: + type: string + username: + type: string + required: + - active + type: object + vercel_ruleset: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - challenge + - deny + - log + updatedAt: + type: string + userId: + type: string + username: + type: string + required: + - active + type: object + traffic_sources: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - challenge + - deny + - log + updatedAt: + type: string + userId: + type: string + username: + type: string + required: + - active + type: object + type: object + botIdEnabled: + type: boolean + enum: + - false + - true + logHeaders: + oneOf: + - items: + type: string + type: array + - type: string + enum: + - '*' + required: + - changes + - firewallEnabled + - id + - ips + - ownerId + - projectKey + - rules + - updatedAt + - version + type: object + required: + - active + type: object + '400': + description: |- + One of the provided values in the request body is invalid. + One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '402': + description: '' + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + '500': + description: '' + parameters: + - name: projectId + in: query + required: true + schema: + type: string + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + requestBody: + content: + application/json: + schema: + type: object + properties: + firewallEnabled: + type: boolean + managedRules: + type: string + description: (opaque JSON object) + crs: + type: object + properties: + sd: + type: object + properties: + active: + type: boolean + action: + type: string + enum: + - deny + - log + required: + - active + - action + additionalProperties: false + description: Scanner Detection - Detect and prevent reconnaissance activities from network scanning tools. + ma: + type: object + properties: + active: + type: boolean + action: + type: string + enum: + - deny + - log + required: + - active + - action + additionalProperties: false + description: Multipart Attack - Block attempts to bypass security controls using multipart/form-data encoding. + lfi: + type: object + properties: + active: + type: boolean + action: + type: string + enum: + - deny + - log + required: + - active + - action + additionalProperties: false + description: Local File Inclusion Attack - Prevent unauthorized access to local files through web applications. + rfi: + type: object + properties: + active: + type: boolean + action: + type: string + enum: + - deny + - log + required: + - active + - action + additionalProperties: false + description: Remote File Inclusion Attack - Prohibit unauthorized upload or execution of remote files. + rce: + type: object + properties: + active: + type: boolean + action: + type: string + enum: + - deny + - log + required: + - active + - action + additionalProperties: false + description: Remote Execution Attack - Prevent unauthorized execution of remote scripts or commands. + php: + type: object + properties: + active: + type: boolean + action: + type: string + enum: + - deny + - log + required: + - active + - action + additionalProperties: false + description: PHP Attack - Safeguard against vulnerability exploits in PHP-based applications. + gen: + type: object + properties: + active: + type: boolean + action: + type: string + enum: + - deny + - log + required: + - active + - action + additionalProperties: false + description: Generic Attack - Provide broad protection from various undefined or novel attack vectors. + xss: + type: object + properties: + active: + type: boolean + action: + type: string + enum: + - deny + - log + required: + - active + - action + additionalProperties: false + description: XSS Attack - Prevent injection of malicious scripts into trusted webpages. + sqli: + type: object + properties: + active: + type: boolean + action: + type: string + enum: + - deny + - log + required: + - active + - action + additionalProperties: false + description: SQL Injection Attack - Prohibit unauthorized use of SQL commands to manipulate databases. + sf: + type: object + properties: + active: + type: boolean + action: + type: string + enum: + - deny + - log + required: + - active + - action + additionalProperties: false + description: Session Fixation Attack - Prevent unauthorized takeover of user sessions by enforcing unique session IDs. + java: + type: object + properties: + active: + type: boolean + action: + type: string + enum: + - deny + - log + required: + - active + - action + additionalProperties: false + description: Java Attack - Mitigate risks of exploitation targeting Java-based applications or components. + additionalProperties: false + description: Custom Ruleset + rules: + type: array + items: + type: object + properties: + id: + type: string + name: + type: string + maxLength: 160 + description: + type: string + maxLength: 256 + active: + type: boolean + conditionGroup: + type: array + items: + type: object + properties: + conditions: + type: array + items: + type: object + properties: + type: + type: string + enum: + - host + - path + - method + - header + - query + - cookie + - target_path + - route + - raw_path + - ip_address + - region + - protocol + - scheme + - environment + - domain_environment + - user_agent + - geo_continent + - geo_country + - geo_country_region + - geo_city + - geo_as_number + - ja4_digest + - ja3_digest + - rate_limit_api_id + - server_action + - bot_name + - bot_category + - bot_status + - bot_protection + - shared_condition + - traffic_source + - ruleset + description: '[Parameter](https://vercel.com/docs/security/vercel-waf/rule-configuration#parameters) from the incoming traffic.' + op: + type: string + enum: + - re + - eq + - neq + - ex + - nex + - inc + - ninc + - pre + - suf + - sub + - gt + - gte + - lt + - lte + - list + neg: + type: boolean + key: + type: string + value: + anyOf: + - type: string + - type: array + items: + type: string + maxItems: 75 + - type: number + required: + - type + - op + additionalProperties: false + maxItems: 65 + required: + - conditions + additionalProperties: false + maxItems: 25 + action: + type: object + properties: + mitigate: + type: object + properties: + action: + type: string + enum: + - log + - challenge + - deny + - bypass + - rate_limit + - redirect + rateLimit: + anyOf: + - type: object + properties: + algo: + type: string + enum: + - fixed_window + - token_bucket + window: + type: number + limit: + type: number + keys: + type: array + items: + type: string + action: + anyOf: + - type: string + enum: + - log + - challenge + - deny + - rate_limit + - {} + nullable: true + required: + - algo + - window + - limit + - keys + additionalProperties: false + - {} + nullable: true + redirect: + anyOf: + - type: object + properties: + location: + type: string + permanent: + type: boolean + required: + - location + - permanent + additionalProperties: false + - {} + nullable: true + actionDuration: + type: string + nullable: true + bypassSystem: + type: boolean + nullable: true + logHeaders: + oneOf: + - type: string + - type: array + items: + type: string + required: + - action + additionalProperties: false + additionalProperties: false + valid: + type: boolean + validationErrors: + anyOf: + - type: array + items: + type: string + - type: string + required: + - name + - active + - conditionGroup + - action + additionalProperties: false + rulesets: + type: array + maxItems: 25 + items: + type: object + properties: + id: + type: string + name: + type: string + maxLength: 160 + description: + type: string + maxLength: 256 + active: + type: boolean + conditionGroup: + type: array + items: + type: object + properties: + conditions: + type: array + items: + type: object + properties: + type: + type: string + enum: + - host + - path + - method + - header + - query + - cookie + - target_path + - route + - raw_path + - ip_address + - region + - protocol + - scheme + - environment + - domain_environment + - user_agent + - geo_continent + - geo_country + - geo_country_region + - geo_city + - geo_as_number + - ja4_digest + - ja3_digest + - rate_limit_api_id + - server_action + - bot_name + - bot_category + - bot_status + - bot_protection + - shared_condition + - traffic_source + - ruleset + op: + type: string + enum: + - re + - eq + - neq + - ex + - nex + - inc + - ninc + - pre + - suf + - sub + - gt + - gte + - lt + - lte + - list + neg: + type: boolean + key: + type: string + value: + anyOf: + - type: string + - type: array + items: + type: string + maxItems: 75 + - type: number + required: + - type + - op + additionalProperties: false + maxItems: 65 + required: + - conditions + additionalProperties: false + maxItems: 25 + action: + type: object + properties: + mitigate: + type: object + properties: + action: + type: string + enum: + - deny + - challenge + - log + required: + - action + additionalProperties: false + additionalProperties: false + valid: + type: boolean + validationErrors: + anyOf: + - type: array + items: + type: string + - type: string + required: + - name + - active + - conditionGroup + additionalProperties: false + maxProperties: 25 + additionalProperties: + type: object + properties: + action: + type: string + enum: + - deny + - challenge + - log + - allow + required: + - action + additionalProperties: false + ips: + type: array + items: + type: object + properties: + id: + type: string + hostname: + type: string + ip: + type: string + notes: + type: string + action: + type: string + enum: + - deny + - challenge + - log + - bypass + required: + - hostname + - ip + - action + additionalProperties: false + botIdEnabled: + type: boolean + logHeaders: + type: string + items: + type: string + required: + - firewallEnabled + additionalProperties: false + required: true + patch: + description: Process updates to modify the existing firewall config for a project + operationId: updateFirewallConfig + security: + - bearerToken: [] + summary: Update Firewall Configuration + tags: + - security + responses: + '200': + description: '' + content: + application/json: + schema: + type: string + description: (opaque JSON object) + '400': + description: |- + One of the provided values in the request body is invalid. + One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '402': + description: '' + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + '500': + description: '' + parameters: + - name: projectId + in: query + required: true + schema: + type: string + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + requestBody: + content: + application/json: + schema: + description: Add a ruleset + type: object + properties: + action: + type: string + enum: + - firewallEnabled + id: + nullable: true + value: + type: object + properties: + name: + type: string + maxLength: 160 + description: + type: string + maxLength: 256 + active: + type: boolean + conditionGroup: + type: array + items: + type: object + properties: + conditions: + type: array + items: + type: object + properties: + type: + type: string + enum: + - host + - path + - method + - header + - query + - cookie + - target_path + - route + - raw_path + - ip_address + - region + - protocol + - scheme + - environment + - domain_environment + - user_agent + - geo_continent + - geo_country + - geo_country_region + - geo_city + - geo_as_number + - ja4_digest + - ja3_digest + - rate_limit_api_id + - server_action + - bot_name + - bot_category + - bot_status + - bot_protection + - shared_condition + - traffic_source + - ruleset + op: + type: string + enum: + - re + - eq + - neq + - ex + - nex + - inc + - ninc + - pre + - suf + - sub + - gt + - gte + - lt + - lte + - list + neg: + type: boolean + key: + type: string + value: + anyOf: + - type: string + - type: array + items: + type: string + maxItems: 75 + - type: number + required: + - type + - op + additionalProperties: false + maxItems: 65 + required: + - conditions + additionalProperties: false + maxItems: 25 + action: + type: object + properties: + mitigate: + type: object + properties: + action: + type: string + enum: + - deny + - challenge + - log + required: + - action + additionalProperties: false + additionalProperties: false + valid: + type: boolean + validationErrors: + anyOf: + - type: array + items: + type: string + - type: string + required: + - name + - active + - conditionGroup + additionalProperties: false + required: + - action + - value + - id + additionalProperties: false + required: true + /v1/security/firewall/config/{config_version}: + get: + description: Retrieve the specified firewall configuration for a project. The deployed configVersion will be `active` + operationId: getFirewallConfig + security: + - bearerToken: [] + summary: Read Firewall Configuration + tags: + - security + responses: + '200': + description: 'If the firewall configuration includes a [custom managed ruleset](https://vercel.com/docs/security/vercel-waf/managed-rulesets), it will include a `crs` item that has the following values: sd: Scanner Detection ma: Multipart Attack lfi: Local File Inclusion Attack rfi: Remote File Inclusion Attack rce: Remote Execution Attack php: PHP Attack gen: Generic Attack xss: XSS Attack sqli: SQL Injection Attack sf: Session Fixation Attack java: Java Attack' + content: + application/json: + schema: + properties: + ownerId: + type: string + projectKey: + type: string + id: + type: string + version: + type: number + updatedAt: + type: string + firewallEnabled: + type: boolean + enum: + - false + - true + crs: + properties: + sd: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - deny + - log + required: + - action + - active + type: object + description: Scanner Detection - Detect and prevent reconnaissance activities from network scanning tools. + ma: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - deny + - log + required: + - action + - active + type: object + description: Multipart Attack - Block attempts to bypass security controls using multipart/form-data encoding. + lfi: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - deny + - log + required: + - action + - active + type: object + description: Local File Inclusion Attack - Prevent unauthorized access to local files through web applications. + rfi: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - deny + - log + required: + - action + - active + type: object + description: Remote File Inclusion Attack - Prohibit unauthorized upload or execution of remote files. + rce: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - deny + - log + required: + - action + - active + type: object + description: Remote Execution Attack - Prevent unauthorized execution of remote scripts or commands. + php: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - deny + - log + required: + - action + - active + type: object + description: PHP Attack - Safeguard against vulnerability exploits in PHP-based applications. + gen: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - deny + - log + required: + - action + - active + type: object + description: Generic Attack - Provide broad protection from various undefined or novel attack vectors. + xss: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - deny + - log + required: + - action + - active + type: object + description: XSS Attack - Prevent injection of malicious scripts into trusted webpages. + sqli: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - deny + - log + required: + - action + - active + type: object + description: SQL Injection Attack - Prohibit unauthorized use of SQL commands to manipulate databases. + sf: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - deny + - log + required: + - action + - active + type: object + description: Session Fixation Attack - Prevent unauthorized takeover of user sessions by enforcing unique session IDs. + java: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - deny + - log + required: + - action + - active + type: object + description: Java Attack - Mitigate risks of exploitation targeting Java-based applications or components. + required: + - gen + - java + - lfi + - ma + - php + - rce + - rfi + - sd + - sf + - sqli + - xss + type: object + description: Custom Ruleset + rules: + items: + oneOf: + - properties: + id: + type: string + name: + type: string + description: + type: string + active: + type: boolean + enum: + - false + - true + conditionGroup: + items: + properties: + conditions: + items: + properties: + type: + type: string + enum: + - bot_category + - bot_name + - bot_protection + - bot_status + - cookie + - domain_environment + - environment + - geo_as_number + - geo_city + - geo_continent + - geo_country + - geo_country_region + - header + - host + - ip_address + - ja3_digest + - ja4_digest + - method + - path + - protocol + - query + - rate_limit_api_id + - raw_path + - region + - route + - ruleset + - scheme + - server_action + - shared_condition + - target_path + - traffic_source + - trusted_source + - user_agent + op: + type: string + enum: + - eq + - ex + - gt + - gte + - inc + - list + - lt + - lte + - neq + - nex + - ninc + - pre + - re + - sub + - suf + neg: + type: boolean + enum: + - false + - true + key: + type: string + value: + oneOf: + - type: string + - type: number + - items: + type: string + type: array + required: + - op + - type + type: object + type: array + required: + - conditions + type: object + type: array + action: + properties: + mitigate: + properties: + action: + type: string + enum: + - allow + - bypass + - challenge + - deny + - log + - rate_limit + - redirect + rateLimit: + nullable: true + properties: + algo: + type: string + enum: + - fixed_window + - token_bucket + window: + type: number + limit: + type: number + keys: + items: + type: string + type: array + action: + nullable: true + type: string + enum: + - challenge + - deny + - log + - rate_limit + - null + required: + - algo + - keys + - limit + - window + type: object + redirect: + nullable: true + properties: + location: + type: string + permanent: + type: boolean + enum: + - false + - true + required: + - location + - permanent + type: object + actionDuration: + nullable: true + type: string + bypassSystem: + nullable: true + type: boolean + enum: + - false + - true + - null + logHeaders: + oneOf: + - items: + type: string + type: array + - type: string + enum: + - '*' + required: + - action + type: object + type: object + valid: + type: boolean + enum: + - true + validationErrors: + nullable: true + required: + - action + - active + - conditionGroup + - id + - name + - valid + - validationErrors + type: object + - properties: + id: + type: string + name: + type: string + description: + type: string + active: + type: boolean + enum: + - false + - true + conditionGroup: + items: + properties: + conditions: + items: + properties: + type: + type: string + enum: + - bot_category + - bot_name + - bot_protection + - bot_status + - cookie + - domain_environment + - environment + - geo_as_number + - geo_city + - geo_continent + - geo_country + - geo_country_region + - header + - host + - ip_address + - ja3_digest + - ja4_digest + - method + - path + - protocol + - query + - rate_limit_api_id + - raw_path + - region + - route + - ruleset + - scheme + - server_action + - shared_condition + - target_path + - traffic_source + - trusted_source + - user_agent + op: + type: string + enum: + - eq + - ex + - gt + - gte + - inc + - list + - lt + - lte + - neq + - nex + - ninc + - pre + - re + - sub + - suf + neg: + type: boolean + enum: + - false + - true + key: + type: string + value: + oneOf: + - type: string + - type: number + - items: + type: string + type: array + required: + - op + - type + type: object + type: array + required: + - conditions + type: object + type: array + action: + properties: + mitigate: + properties: + action: + type: string + enum: + - allow + - bypass + - challenge + - deny + - log + - rate_limit + - redirect + rateLimit: + nullable: true + properties: + algo: + type: string + enum: + - fixed_window + - token_bucket + window: + type: number + limit: + type: number + keys: + items: + type: string + type: array + action: + nullable: true + type: string + enum: + - challenge + - deny + - log + - rate_limit + - null + required: + - algo + - keys + - limit + - window + type: object + redirect: + nullable: true + properties: + location: + type: string + permanent: + type: boolean + enum: + - false + - true + required: + - location + - permanent + type: object + actionDuration: + nullable: true + type: string + bypassSystem: + nullable: true + type: boolean + enum: + - false + - true + - null + logHeaders: + oneOf: + - items: + type: string + type: array + - type: string + enum: + - '*' + required: + - action + type: object + type: object + valid: + type: boolean + enum: + - false + validationErrors: + items: + type: string + type: array + required: + - action + - active + - conditionGroup + - id + - name + - valid + - validationErrors + type: object + type: array + ips: + items: + properties: + id: + type: string + hostname: + type: string + ip: + type: string + notes: + type: string + action: + type: string + enum: + - bypass + - challenge + - deny + - log + required: + - action + - hostname + - id + - ip + type: object + type: array + rulesets: + items: + properties: + description: + type: string + id: + type: string + name: + type: string + active: + type: boolean + enum: + - false + - true + conditionGroup: + items: + properties: + conditions: + items: + properties: + type: + type: string + enum: + - bot_category + - bot_name + - bot_protection + - bot_status + - cookie + - domain_environment + - environment + - geo_as_number + - geo_city + - geo_continent + - geo_country + - geo_country_region + - header + - host + - ip_address + - ja3_digest + - ja4_digest + - method + - path + - protocol + - query + - rate_limit_api_id + - raw_path + - region + - route + - ruleset + - scheme + - server_action + - shared_condition + - target_path + - traffic_source + - trusted_source + - user_agent + op: + type: string + enum: + - eq + - ex + - gt + - gte + - inc + - list + - lt + - lte + - neq + - nex + - ninc + - pre + - re + - sub + - suf + neg: + type: boolean + enum: + - false + - true + key: + type: string + value: + oneOf: + - type: string + - type: number + - items: + type: string + type: array + required: + - op + - type + type: object + type: array + required: + - conditions + type: object + type: array + action: + properties: + mitigate: + properties: + action: + type: string + enum: + - allow + - bypass + - challenge + - deny + - log + - rate_limit + - redirect + rateLimit: + nullable: true + properties: + algo: + type: string + enum: + - fixed_window + - token_bucket + window: + type: number + limit: + type: number + keys: + items: + type: string + type: array + action: + nullable: true + type: string + enum: + - challenge + - deny + - log + - rate_limit + - null + required: + - algo + - keys + - limit + - window + type: object + redirect: + nullable: true + properties: + location: + type: string + permanent: + type: boolean + enum: + - false + - true + required: + - location + - permanent + type: object + actionDuration: + nullable: true + type: string + bypassSystem: + nullable: true + type: boolean + enum: + - false + - true + - null + logHeaders: + oneOf: + - items: + type: string + type: array + - type: string + enum: + - '*' + required: + - action + type: object + type: object + required: + - active + - conditionGroup + - id + - name + type: object + type: array + additionalProperties: + properties: + action: + type: string + enum: + - allow + - bypass + - challenge + - deny + - log + - rate_limit + - redirect + rateLimit: + nullable: true + properties: + algo: + type: string + enum: + - fixed_window + - token_bucket + window: + type: number + limit: + type: number + keys: + items: + type: string + type: array + action: + nullable: true + type: string + enum: + - challenge + - deny + - log + - rate_limit + - null + required: + - algo + - keys + - limit + - window + type: object + redirect: + nullable: true + properties: + location: + type: string + permanent: + type: boolean + enum: + - false + - true + required: + - location + - permanent + type: object + actionDuration: + nullable: true + type: string + bypassSystem: + nullable: true + type: boolean + enum: + - false + - true + - null + logHeaders: + oneOf: + - items: + type: string + type: array + - type: string + enum: + - '*' + required: + - action + type: object + conditions: + items: + properties: + description: + type: string + id: + type: string + name: + type: string + active: + type: boolean + enum: + - false + - true + conditionGroup: + items: + properties: + conditions: + items: + properties: + type: + type: string + enum: + - bot_category + - bot_name + - bot_protection + - bot_status + - cookie + - domain_environment + - environment + - geo_as_number + - geo_city + - geo_continent + - geo_country + - geo_country_region + - header + - host + - ip_address + - ja3_digest + - ja4_digest + - method + - path + - protocol + - query + - rate_limit_api_id + - raw_path + - region + - route + - ruleset + - scheme + - server_action + - shared_condition + - target_path + - traffic_source + - trusted_source + - user_agent + op: + type: string + enum: + - eq + - ex + - gt + - gte + - inc + - list + - lt + - lte + - neq + - nex + - ninc + - pre + - re + - sub + - suf + neg: + type: boolean + enum: + - false + - true + key: + type: string + value: + oneOf: + - type: string + - type: number + - items: + type: string + type: array + required: + - op + - type + type: object + type: array + required: + - conditions + type: object + type: array + required: + - active + - conditionGroup + - id + - name + type: object + type: array + changes: + items: + type: string + description: (opaque JSON object) + type: array + managedRules: + properties: + bot_protection: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - challenge + - deny + - log + updatedAt: + type: string + userId: + type: string + username: + type: string + required: + - active + type: object + ai_bots: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - challenge + - deny + - log + updatedAt: + type: string + userId: + type: string + username: + type: string + required: + - active + type: object + owasp: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - challenge + - deny + - log + updatedAt: + type: string + userId: + type: string + username: + type: string + required: + - active + type: object + vercel_ruleset: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - challenge + - deny + - log + updatedAt: + type: string + userId: + type: string + username: + type: string + required: + - active + type: object + traffic_sources: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - challenge + - deny + - log + updatedAt: + type: string + userId: + type: string + username: + type: string + required: + - active + type: object + type: object + botIdEnabled: + type: boolean + enum: + - false + - true + logHeaders: + items: + type: string + type: array + enum: + - '*' + required: + - changes + - firewallEnabled + - id + - ips + - ownerId + - projectKey + - rules + - updatedAt + - version + type: object + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + parameters: + - name: projectId + in: query + required: true + schema: + type: string + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + - description: The deployed configVersion for the firewall configuration + in: path + name: config_version + required: true + schema: + type: string + delete: + description: Promotes a draft WAF config to an active config + operationId: deleteSecurityFirewallConfigByConfigVersion + security: [] + summary: Returns activated WAF config + tags: + - security + responses: + '204': + description: '' + content: + application/json: + schema: + type: string + enum: + - '' + '400': + description: '' + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + '500': + description: '' + parameters: + - description: The deployed configVersion for the firewall configuration + in: path + name: config_version + required: true + schema: + type: string + /v1/security/firewall/config/{config_version}/activate: + post: + description: Promotes a draft WAF config to an active config + operationId: createSecurityFirewallConfigByConfigVersionActivate + security: [] + summary: Returns activated WAF config + tags: + - security + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + ownerId: + type: string + projectKey: + type: string + id: + type: string + version: + type: number + updatedAt: + type: string + firewallEnabled: + type: boolean + enum: + - false + - true + crs: + properties: + sd: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - deny + - log + required: + - action + - active + type: object + ma: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - deny + - log + required: + - action + - active + type: object + lfi: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - deny + - log + required: + - action + - active + type: object + rfi: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - deny + - log + required: + - action + - active + type: object + rce: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - deny + - log + required: + - action + - active + type: object + php: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - deny + - log + required: + - action + - active + type: object + gen: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - deny + - log + required: + - action + - active + type: object + xss: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - deny + - log + required: + - action + - active + type: object + sqli: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - deny + - log + required: + - action + - active + type: object + sf: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - deny + - log + required: + - action + - active + type: object + java: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - deny + - log + required: + - action + - active + type: object + required: + - gen + - java + - lfi + - ma + - php + - rce + - rfi + - sd + - sf + - sqli + - xss + type: object + rules: + items: + oneOf: + - properties: + id: + type: string + name: + type: string + description: + type: string + active: + type: boolean + enum: + - false + - true + conditionGroup: + items: + properties: + conditions: + items: + properties: + type: + type: string + enum: + - bot_category + - bot_name + - bot_protection + - bot_status + - cookie + - domain_environment + - environment + - geo_as_number + - geo_city + - geo_continent + - geo_country + - geo_country_region + - header + - host + - ip_address + - ja3_digest + - ja4_digest + - method + - path + - protocol + - query + - rate_limit_api_id + - raw_path + - region + - route + - ruleset + - scheme + - server_action + - shared_condition + - target_path + - traffic_source + - trusted_source + - user_agent + op: + type: string + enum: + - eq + - ex + - gt + - gte + - inc + - list + - lt + - lte + - neq + - nex + - ninc + - pre + - re + - sub + - suf + neg: + type: boolean + enum: + - false + - true + key: + type: string + value: + oneOf: + - type: string + - type: number + - items: + type: string + type: array + required: + - op + - type + type: object + type: array + required: + - conditions + type: object + type: array + action: + properties: + mitigate: + properties: + action: + type: string + enum: + - allow + - bypass + - challenge + - deny + - log + - rate_limit + - redirect + rateLimit: + nullable: true + properties: + algo: + type: string + enum: + - fixed_window + - token_bucket + window: + type: number + limit: + type: number + keys: + items: + type: string + type: array + action: + nullable: true + type: string + enum: + - challenge + - deny + - log + - rate_limit + - null + required: + - algo + - keys + - limit + - window + type: object + redirect: + nullable: true + properties: + location: + type: string + permanent: + type: boolean + enum: + - false + - true + required: + - location + - permanent + type: object + actionDuration: + nullable: true + type: string + bypassSystem: + nullable: true + type: boolean + enum: + - false + - true + - null + logHeaders: + oneOf: + - items: + type: string + type: array + - type: string + enum: + - '*' + required: + - action + type: object + type: object + valid: + type: boolean + enum: + - true + validationErrors: + nullable: true + required: + - action + - active + - conditionGroup + - id + - name + - valid + - validationErrors + type: object + - properties: + id: + type: string + name: + type: string + description: + type: string + active: + type: boolean + enum: + - false + - true + conditionGroup: + items: + properties: + conditions: + items: + properties: + type: + type: string + enum: + - bot_category + - bot_name + - bot_protection + - bot_status + - cookie + - domain_environment + - environment + - geo_as_number + - geo_city + - geo_continent + - geo_country + - geo_country_region + - header + - host + - ip_address + - ja3_digest + - ja4_digest + - method + - path + - protocol + - query + - rate_limit_api_id + - raw_path + - region + - route + - ruleset + - scheme + - server_action + - shared_condition + - target_path + - traffic_source + - trusted_source + - user_agent + op: + type: string + enum: + - eq + - ex + - gt + - gte + - inc + - list + - lt + - lte + - neq + - nex + - ninc + - pre + - re + - sub + - suf + neg: + type: boolean + enum: + - false + - true + key: + type: string + value: + oneOf: + - type: string + - type: number + - items: + type: string + type: array + required: + - op + - type + type: object + type: array + required: + - conditions + type: object + type: array + action: + properties: + mitigate: + properties: + action: + type: string + enum: + - allow + - bypass + - challenge + - deny + - log + - rate_limit + - redirect + rateLimit: + nullable: true + properties: + algo: + type: string + enum: + - fixed_window + - token_bucket + window: + type: number + limit: + type: number + keys: + items: + type: string + type: array + action: + nullable: true + type: string + enum: + - challenge + - deny + - log + - rate_limit + - null + required: + - algo + - keys + - limit + - window + type: object + redirect: + nullable: true + properties: + location: + type: string + permanent: + type: boolean + enum: + - false + - true + required: + - location + - permanent + type: object + actionDuration: + nullable: true + type: string + bypassSystem: + nullable: true + type: boolean + enum: + - false + - true + - null + logHeaders: + oneOf: + - items: + type: string + type: array + - type: string + enum: + - '*' + required: + - action + type: object + type: object + valid: + type: boolean + enum: + - false + validationErrors: + items: + type: string + type: array + required: + - action + - active + - conditionGroup + - id + - name + - valid + - validationErrors + type: object + type: array + ips: + items: + properties: + id: + type: string + hostname: + type: string + ip: + type: string + notes: + type: string + action: + type: string + enum: + - bypass + - challenge + - deny + - log + required: + - action + - hostname + - id + - ip + type: object + type: array + rulesets: + items: + properties: + description: + type: string + id: + type: string + name: + type: string + active: + type: boolean + enum: + - false + - true + conditionGroup: + items: + properties: + conditions: + items: + properties: + type: + type: string + enum: + - bot_category + - bot_name + - bot_protection + - bot_status + - cookie + - domain_environment + - environment + - geo_as_number + - geo_city + - geo_continent + - geo_country + - geo_country_region + - header + - host + - ip_address + - ja3_digest + - ja4_digest + - method + - path + - protocol + - query + - rate_limit_api_id + - raw_path + - region + - route + - ruleset + - scheme + - server_action + - shared_condition + - target_path + - traffic_source + - trusted_source + - user_agent + op: + type: string + enum: + - eq + - ex + - gt + - gte + - inc + - list + - lt + - lte + - neq + - nex + - ninc + - pre + - re + - sub + - suf + neg: + type: boolean + enum: + - false + - true + key: + type: string + value: + oneOf: + - type: string + - type: number + - items: + type: string + type: array + required: + - op + - type + type: object + type: array + required: + - conditions + type: object + type: array + action: + properties: + mitigate: + properties: + action: + type: string + enum: + - allow + - bypass + - challenge + - deny + - log + - rate_limit + - redirect + rateLimit: + nullable: true + properties: + algo: + type: string + enum: + - fixed_window + - token_bucket + window: + type: number + limit: + type: number + keys: + items: + type: string + type: array + action: + nullable: true + type: string + enum: + - challenge + - deny + - log + - rate_limit + - null + required: + - algo + - keys + - limit + - window + type: object + redirect: + nullable: true + properties: + location: + type: string + permanent: + type: boolean + enum: + - false + - true + required: + - location + - permanent + type: object + actionDuration: + nullable: true + type: string + bypassSystem: + nullable: true + type: boolean + enum: + - false + - true + - null + logHeaders: + oneOf: + - items: + type: string + type: array + - type: string + enum: + - '*' + required: + - action + type: object + type: object + required: + - active + - conditionGroup + - id + - name + type: object + type: array + additionalProperties: + properties: + action: + type: string + enum: + - allow + - bypass + - challenge + - deny + - log + - rate_limit + - redirect + rateLimit: + nullable: true + properties: + algo: + type: string + enum: + - fixed_window + - token_bucket + window: + type: number + limit: + type: number + keys: + items: + type: string + type: array + action: + nullable: true + type: string + enum: + - challenge + - deny + - log + - rate_limit + - null + required: + - algo + - keys + - limit + - window + type: object + redirect: + nullable: true + properties: + location: + type: string + permanent: + type: boolean + enum: + - false + - true + required: + - location + - permanent + type: object + actionDuration: + nullable: true + type: string + bypassSystem: + nullable: true + type: boolean + enum: + - false + - true + - null + logHeaders: + oneOf: + - items: + type: string + type: array + - type: string + enum: + - '*' + required: + - action + type: object + conditions: + items: + properties: + description: + type: string + id: + type: string + name: + type: string + active: + type: boolean + enum: + - false + - true + conditionGroup: + items: + properties: + conditions: + items: + properties: + type: + type: string + enum: + - bot_category + - bot_name + - bot_protection + - bot_status + - cookie + - domain_environment + - environment + - geo_as_number + - geo_city + - geo_continent + - geo_country + - geo_country_region + - header + - host + - ip_address + - ja3_digest + - ja4_digest + - method + - path + - protocol + - query + - rate_limit_api_id + - raw_path + - region + - route + - ruleset + - scheme + - server_action + - shared_condition + - target_path + - traffic_source + - trusted_source + - user_agent + op: + type: string + enum: + - eq + - ex + - gt + - gte + - inc + - list + - lt + - lte + - neq + - nex + - ninc + - pre + - re + - sub + - suf + neg: + type: boolean + enum: + - false + - true + key: + type: string + value: + oneOf: + - type: string + - type: number + - items: + type: string + type: array + required: + - op + - type + type: object + type: array + required: + - conditions + type: object + type: array + required: + - active + - conditionGroup + - id + - name + type: object + type: array + changes: + items: + type: string + description: (opaque JSON object) + type: array + managedRules: + properties: + bot_protection: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - challenge + - deny + - log + updatedAt: + type: string + userId: + type: string + username: + type: string + required: + - active + type: object + ai_bots: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - challenge + - deny + - log + updatedAt: + type: string + userId: + type: string + username: + type: string + required: + - active + type: object + owasp: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - challenge + - deny + - log + updatedAt: + type: string + userId: + type: string + username: + type: string + required: + - active + type: object + vercel_ruleset: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - challenge + - deny + - log + updatedAt: + type: string + userId: + type: string + username: + type: string + required: + - active + type: object + traffic_sources: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - challenge + - deny + - log + updatedAt: + type: string + userId: + type: string + username: + type: string + required: + - active + type: object + type: object + botIdEnabled: + type: boolean + enum: + - false + - true + logHeaders: + items: + type: string + type: array + enum: + - '*' + required: + - changes + - firewallEnabled + - id + - ips + - ownerId + - projectKey + - rules + - updatedAt + - version + type: object + '400': + description: '' + '401': + description: The request is not authorized. + '402': + description: '' + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + '500': + description: '' + parameters: + - description: The deployed configVersion for the firewall configuration + in: path + name: config_version + required: true + schema: + type: string + /v1/security/firewall/attack-status: + get: + description: 'Retrieve active attack data within the last N days (default: 1 day)' + operationId: getActiveAttackStatus + security: + - bearerToken: [] + summary: Read active attack data + tags: + - security + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + anomalies: + items: + properties: + projectId: + type: string + ownerId: + type: string + startTime: + type: number + endTime: + nullable: true + type: number + atMinute: + type: number + state: + type: string + affectedHostMap: + additionalProperties: + properties: + anomalyAlerts: + additionalProperties: + properties: + at_minute: + type: string + zscore: + type: number + total_requests_minute: + type: number + avg_requests: + type: number + stddev_requests: + type: number + required: + - at_minute + - avg_requests + - stddev_requests + - total_requests_minute + - zscore + type: object + type: object + ddosAlerts: + additionalProperties: + properties: + atMinute: + type: string + totalReqs: + type: number + required: + - atMinute + - totalReqs + type: object + type: object + type: object + type: object + required: + - affectedHostMap + - atMinute + - endTime + - ownerId + - projectId + - startTime + type: object + type: array + required: + - anomalies + type: object + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + parameters: + - name: projectId + in: query + required: true + schema: + type: string + - name: since + in: query + required: false + schema: + type: number + minimum: 1 + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + x-speakeasy-test: false + /v1/security/firewall/bypass: + get: + description: Retrieve the system bypass rules configured for the specified project + operationId: getBypassIp + security: + - bearerToken: [] + summary: Read System Bypass + tags: + - security + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + result: + items: + properties: + OwnerId: + type: string + Id: + type: string + Domain: + type: string + Ip: + type: string + Action: + type: string + enum: + - block + - bypass + ProjectId: + type: string + IsProjectRule: + type: boolean + enum: + - false + - true + Note: + type: string + CreatedAt: + type: string + ActorId: + type: string + UpdatedAt: + type: string + UpdatedAtHour: + type: string + DeletedAt: + type: string + ExpiresAt: + nullable: true + type: number + required: + - CreatedAt + - Domain + - Id + - Ip + - OwnerId + - UpdatedAt + - UpdatedAtHour + type: object + type: array + pagination: + properties: + OwnerId: + type: string + Id: + type: string + required: + - Id + - OwnerId + type: object + required: + - result + type: object + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '402': + description: '' + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + '500': + description: '' + parameters: + - name: projectId + in: query + required: true + schema: + type: string + - name: limit + in: query + required: false + schema: + type: number + example: 10 + maximum: 256 + - name: sourceIp + description: Filter by source IP + in: query + required: false + schema: + description: Filter by source IP + type: string + maxLength: 49 + - name: domain + description: Filter by domain + in: query + required: false + schema: + description: Filter by domain + type: string + pattern: ([a-z]+[a-z.]+)$ + maxLength: 2544 + - name: projectScope + description: Filter by project scoped rules + in: query + required: false + schema: + description: Filter by project scoped rules + type: boolean + - name: offset + description: Used for pagination. Retrieves results after the provided id + in: query + required: false + schema: + description: Used for pagination. Retrieves results after the provided id + type: string + maxLength: 2560 + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + post: + description: Create new system bypass rules + operationId: addBypassIp + security: + - bearerToken: [] + summary: Create System Bypass Rule + tags: + - security + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + ok: + type: boolean + enum: + - false + - true + result: + items: + properties: + OwnerId: + type: string + Id: + type: string + Domain: + type: string + Ip: + type: string + ProjectId: + type: string + Note: + type: string + IsProjectRule: + type: boolean + enum: + - false + - true + required: + - Domain + - Id + - IsProjectRule + - Note + - OwnerId + - ProjectId + type: object + type: array + pagination: + nullable: true + required: + - ok + - pagination + - result + type: object + '400': + description: |- + One of the provided values in the request body is invalid. + One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '402': + description: '' + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + '500': + description: '' + parameters: + - name: projectId + in: query + required: true + schema: + type: string + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + requestBody: + content: + application/json: + schema: + type: object + additionalProperties: false + properties: + domain: + type: string + pattern: ([a-z]+[a-z.]+)$ + maxLength: 2544 + projectScope: + type: boolean + description: If the specified bypass will apply to all domains for a project. + sourceIp: + type: string + allSources: + type: boolean + ttl: + type: number + description: Time to live in milliseconds + note: + type: string + maxLength: 500 + required: + - domain + - projectScope + delete: + description: Remove system bypass rules + operationId: removeBypassIp + security: + - bearerToken: [] + summary: Remove System Bypass Rule + tags: + - security + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + ok: + type: boolean + enum: + - false + - true + required: + - ok + type: object + '400': + description: |- + One of the provided values in the request body is invalid. + One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '402': + description: '' + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + '500': + description: '' + parameters: + - name: projectId + in: query + required: true + schema: + type: string + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + requestBody: + content: + application/json: + schema: + type: object + additionalProperties: false + properties: + domain: + type: string + pattern: ([a-z]+[a-z.]+)$ + maxLength: 2544 + projectScope: + type: boolean + sourceIp: + type: string + allSources: + type: boolean + note: + type: string + maxLength: 500 + required: + - domain + - projectScope + /v1/security/firewall/events: + get: + description: Retrieve firewall actions for a project Rule names are resolved against the project's *current* active firewall configuration and the team's active rulesets, so a rule that has since been renamed reports its new name and one that has been deleted reports `null`. System rules such as `sys_dos_mitigation` and `ip_blocking` have no configured name and always report `null`. + operationId: getSecurityFirewallEvents + security: + - bearerToken: [] + summary: Read Firewall Actions by Project + tags: + - security + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + actions: + items: + properties: + ruleName: + nullable: true + type: string + startTime: + type: string + endTime: + type: string + isActive: + type: boolean + enum: + - false + - true + action_type: + type: string + action: + type: string + ruleId: + nullable: true + type: string + host: + type: string + public_ip: + type: string + count: + type: number + required: + - action + - action_type + - count + - endTime + - host + - isActive + - public_ip + - ruleId + - ruleName + - startTime + type: object + type: array + required: + - actions + type: object + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '408': + description: '' + '410': + description: '' + '500': + description: '' + parameters: + - name: projectId + in: query + required: true + schema: + type: string + - name: startTimestamp + in: query + required: false + schema: + type: number + - name: endTimestamp + in: query + required: false + schema: + type: number + - name: hosts + in: query + required: false + schema: + type: string + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + /v1/security/firewall/config/generate-rule: + post: + description: Generate a firewall rule from a natural language description. + operationId: generateFirewallRule + security: + - bearerToken: [] + summary: Generate a firewall rule from natural language + tags: + - security + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + rule: + properties: + name: + type: string + description: + type: string + active: + type: boolean + enum: + - false + - true + conditionGroup: + items: + properties: + conditions: + items: + properties: + type: + type: string + op: + type: string + neg: + type: boolean + enum: + - false + - true + key: + type: string + value: + oneOf: + - type: string + - type: number + - items: + type: string + type: array + required: + - op + - type + type: object + type: array + required: + - conditions + type: object + type: array + action: + properties: + mitigate: + properties: + action: + type: string + rateLimit: + nullable: true + properties: + algo: + type: string + window: + type: number + limit: + type: number + keys: + items: + type: string + type: array + action: + nullable: true + type: string + required: + - algo + - keys + - limit + - window + type: object + redirect: + nullable: true + properties: + location: + type: string + permanent: + type: boolean + enum: + - false + - true + required: + - location + - permanent + type: object + actionDuration: + nullable: true + type: string + required: + - action + type: object + type: object + required: + - action + - active + - conditionGroup + - name + type: object + error: + type: string + type: object + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '408': + description: '' + '410': + description: '' + '500': + description: '' + parameters: + - name: projectId + in: query + schema: + type: string + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug +components: + x-stackQL-resources: + attack_challenge_mode: + id: vercel.security.attack_challenge_mode + name: attack_challenge_mode + title: Attack Challenge Mode + methods: + update: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v1~1security~1attack-mode/post' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + sqlVerbs: + select: [] + insert: [] + update: + - $ref: '#/components/x-stackQL-resources/attack_challenge_mode/methods/update' + delete: [] + replace: [] + firewall_config: + id: vercel.security.firewall_config + name: firewall_config + title: Firewall Config + methods: + get: + operation: + $ref: '#/paths/~1v1~1security~1firewall~1config/get' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + replace: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v1~1security~1firewall~1config/put' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + update: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v1~1security~1firewall~1config/patch' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + generate_rule: + operation: + $ref: '#/paths/~1v1~1security~1firewall~1config~1generate-rule/post' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/firewall_config/methods/get' + insert: [] + update: + - $ref: '#/components/x-stackQL-resources/firewall_config/methods/update' + delete: [] + replace: + - $ref: '#/components/x-stackQL-resources/firewall_config/methods/replace' + firewall_config_versions: + id: vercel.security.firewall_config_versions + name: firewall_config_versions + title: Firewall Config Versions + methods: + get: + operation: + $ref: '#/paths/~1v1~1security~1firewall~1config~1{config_version}/get' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + delete: + operation: + $ref: '#/paths/~1v1~1security~1firewall~1config~1{config_version}/delete' + response: + mediaType: application/json + openAPIDocKey: '204' + request: + nativeCasing: camel + activate: + operation: + $ref: '#/paths/~1v1~1security~1firewall~1config~1{config_version}~1activate/post' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/firewall_config_versions/methods/get' + insert: [] + update: [] + delete: + - $ref: '#/components/x-stackQL-resources/firewall_config_versions/methods/delete' + replace: [] + attack_status: + id: vercel.security.attack_status + name: attack_status + title: Attack Status + methods: + get: + operation: + $ref: '#/paths/~1v1~1security~1firewall~1attack-status/get' + response: + mediaType: application/json + openAPIDocKey: '200' + objectKey: $.anomalies + request: + nativeCasing: camel + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/attack_status/methods/get' + insert: [] + update: [] + delete: [] + replace: [] + firewall_bypass: + id: vercel.security.firewall_bypass + name: firewall_bypass + title: Firewall Bypass + methods: + list: + operation: + $ref: '#/paths/~1v1~1security~1firewall~1bypass/get' + response: + mediaType: application/json + openAPIDocKey: '200' + objectKey: $.result + request: + nativeCasing: camel + config: + queryParamPushdown: + top: + paramName: limit + maxValue: 100 + create: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v1~1security~1firewall~1bypass/post' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + delete: + operation: + $ref: '#/paths/~1v1~1security~1firewall~1bypass/delete' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/firewall_bypass/methods/list' + insert: + - $ref: '#/components/x-stackQL-resources/firewall_bypass/methods/create' + update: [] + delete: + - $ref: '#/components/x-stackQL-resources/firewall_bypass/methods/delete' + replace: [] + firewall_events: + id: vercel.security.firewall_events + name: firewall_events + title: Firewall Events + methods: + list: + operation: + $ref: '#/paths/~1v1~1security~1firewall~1events/get' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/firewall_events/methods/list' + insert: [] + update: [] + delete: [] + replace: [] +servers: + - url: https://api.vercel.com diff --git a/provider-dev/openapi/src/vercel/v00.00.00000/services/storage.yaml b/provider-dev/openapi/src/vercel/v00.00.00000/services/storage.yaml new file mode 100644 index 0000000..3b14109 --- /dev/null +++ b/provider-dev/openapi/src/vercel/v00.00.00000/services/storage.yaml @@ -0,0 +1,653 @@ +openapi: 3.0.3 +info: + title: storage API + description: vercel storage API + version: 0.0.1 +paths: + /storage/stores/{id}: + get: + description: '' + operationId: getStorageStoresById + security: [] + summary: Get a store + tags: + - storage + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + store: + type: object + properties: + projectsMetadata: + items: + properties: + id: + type: string + projectId: + type: string + name: + type: string + framework: + nullable: true + type: string + enum: + - actix-web + - angular + - ash + - astro + - axum + - blitzjs + - brunch + - bun + - container + - create-react-app + - django + - docusaurus + - docusaurus-2 + - dojo + - eleventy + - elysia + - ember + - eve + - express + - factory-eve + - fastapi + - fasthtml + - fastify + - flask + - gatsby + - go + - gridsome + - h3 + - hexo + - hono + - hugo + - hydrogen + - ionic-angular + - ionic-react + - jekyll + - koa + - mastra + - middleman + - nestjs + - nextjs + - nitro + - node + - nuxtjs + - parcel + - polymer + - preact + - python + - react-router + - redwoodjs + - remix + - ruby + - rust + - saber + - sanity + - sanity-v2 + - sapper + - scully + - services + - solidstart + - solidstart-1 + - stencil + - storybook + - svelte + - sveltekit + - sveltekit-1 + - tanstack-start + - tanstack-start-lovable + - umijs + - vite + - vitepress + - vue + - vuepress + - xmcp + - zola + - null + latestDeployment: + type: string + environments: + items: + type: string + type: array + envVarPrefix: + nullable: true + type: string + environmentVariables: + items: + type: string + type: array + deployments: + properties: + required: + type: boolean + enum: + - false + - true + actions: + items: + properties: + slug: + type: string + environments: + items: + type: string + type: array + required: + - environments + - slug + type: object + type: array + required: + - actions + - required + type: object + makeEnvVarsSensitive: + type: boolean + enum: + - false + - true + required: + - envVarPrefix + - environmentVariables + - environments + - id + - name + - projectId + type: object + type: array + projectFilter: + properties: + git: + properties: + providers: + oneOf: + - items: + type: string + enum: + - bitbucket + - github + - gitlab + type: array + - type: string + enum: + - '*' + owners: + items: + type: string + type: array + repos: + items: + type: string + type: array + required: + - providers + type: object + type: object + totalConnectedProjects: + type: number + usageQuotaExceeded: + type: boolean + enum: + - false + - true + status: + nullable: true + type: string + enum: + - available + - error + - initializing + - limits-exceeded-suspended + - limits-exceeded-suspended-store-count + - onboarding + - suspended + - uninstalled + - null + required: + - projectsMetadata + - status + - usageQuotaExceeded + required: + - store + type: object + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + parameters: + - name: id + in: path + required: true + schema: + type: string + - name: skip-metadata + in: query + required: false + schema: + type: boolean + - name: include-guides + in: query + required: false + schema: + type: boolean + /storage/stores/blob: + post: + description: '' + operationId: createStorageStoresBlob + security: [] + summary: Create a Blob store + tags: + - storage + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + store: + nullable: true + type: object + properties: + projectsMetadata: + items: + properties: + id: + type: string + projectId: + type: string + name: + type: string + framework: + nullable: true + type: string + enum: + - actix-web + - angular + - ash + - astro + - axum + - blitzjs + - brunch + - bun + - container + - create-react-app + - django + - docusaurus + - docusaurus-2 + - dojo + - eleventy + - elysia + - ember + - eve + - express + - factory-eve + - fastapi + - fasthtml + - fastify + - flask + - gatsby + - go + - gridsome + - h3 + - hexo + - hono + - hugo + - hydrogen + - ionic-angular + - ionic-react + - jekyll + - koa + - mastra + - middleman + - nestjs + - nextjs + - nitro + - node + - nuxtjs + - parcel + - polymer + - preact + - python + - react-router + - redwoodjs + - remix + - ruby + - rust + - saber + - sanity + - sanity-v2 + - sapper + - scully + - services + - solidstart + - solidstart-1 + - stencil + - storybook + - svelte + - sveltekit + - sveltekit-1 + - tanstack-start + - tanstack-start-lovable + - umijs + - vite + - vitepress + - vue + - vuepress + - xmcp + - zola + - null + latestDeployment: + type: string + environments: + items: + type: string + type: array + envVarPrefix: + nullable: true + type: string + environmentVariables: + items: + type: string + type: array + deployments: + properties: + required: + type: boolean + enum: + - false + - true + actions: + items: + properties: + slug: + type: string + environments: + items: + type: string + type: array + required: + - environments + - slug + type: object + type: array + required: + - actions + - required + type: object + makeEnvVarsSensitive: + type: boolean + enum: + - false + - true + required: + - envVarPrefix + - environmentVariables + - environments + - id + - name + - projectId + type: object + type: array + projectFilter: + properties: + git: + properties: + providers: + oneOf: + - items: + type: string + enum: + - bitbucket + - github + - gitlab + type: array + - type: string + enum: + - '*' + owners: + items: + type: string + type: array + repos: + items: + type: string + type: array + required: + - providers + type: object + type: object + totalConnectedProjects: + type: number + usageQuotaExceeded: + type: boolean + enum: + - false + - true + status: + nullable: true + type: string + enum: + - available + - error + - initializing + - limits-exceeded-suspended + - limits-exceeded-suspended-store-count + - onboarding + - suspended + - uninstalled + - null + access: + type: string + enum: + - private + - public + kind: + type: string + enum: + - project-default + - user-created + description: A project-default store is a private blob store that is lazily created per-project, uses OIDC auth instead of read-write tokens, and cannot be modified through standard store mutation APIs. Undefined for legacy stores. + projectId: + type: string + description: The project this store is scoped to. Set for project-default stores and user-created stores with enforced project association. + size: + type: number + count: + type: number + region: + type: string + enum: + - arn1 + - bom1 + - cdg1 + - cle1 + - cpt1 + - dub1 + - dxb1 + - fra1 + - gru1 + - hkg1 + - hnd1 + - iad1 + - icn1 + - kix1 + - lhr1 + - pdx1 + - sfo1 + - sin1 + - syd1 + - yul1 + isTokenExpired: + type: boolean + enum: + - false + - true + required: + - count + - isTokenExpired + - projectsMetadata + - region + - size + - status + - usageQuotaExceeded + required: + - store + type: object + '400': + description: One of the provided values in the request body is invalid. + '401': + description: The request is not authorized. + '402': + description: The account is missing a payment so payment method must be updated + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '409': + description: '' + '410': + description: '' + '429': + description: '' + parameters: [] + requestBody: + content: + application/json: + schema: + type: object + required: + - name + properties: + name: + type: string + maxLength: 70 + region: + type: string + enum: + - arn1 + - bom1 + - cdg1 + - cle1 + - cpt1 + - dub1 + - dxb1 + - fra1 + - gru1 + - hkg1 + - hnd1 + - iad1 + - icn1 + - kix1 + - lhr1 + - pdx1 + - sfo1 + - sin1 + - syd1 + - yul1 + access: + type: string + enum: + - public + - private + default: public + projectId: + type: string + maxLength: 50 + /storage/stores/blob/{id}: + delete: + description: '' + operationId: deleteStorageStoresBlobById + security: [] + summary: Delete a Blob store + tags: + - storage + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + id: + type: string + required: + - id + type: object + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '409': + description: '' + '410': + description: '' + parameters: + - name: id + in: path + required: true + schema: + type: string +components: + x-stackQL-resources: + stores: + id: vercel.storage.stores + name: stores + title: Stores + methods: + get: + operation: + $ref: '#/paths/~1storage~1stores~1{id}/get' + response: + mediaType: application/json + openAPIDocKey: '200' + objectKey: $.store + request: + nativeCasing: camel + create_blob: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1storage~1stores~1blob/post' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + delete_blob: + operation: + $ref: '#/paths/~1storage~1stores~1blob~1{id}/delete' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/stores/methods/get' + insert: + - $ref: '#/components/x-stackQL-resources/stores/methods/create_blob' + update: [] + delete: + - $ref: '#/components/x-stackQL-resources/stores/methods/delete_blob' + replace: [] +servers: + - url: https://api.vercel.com diff --git a/provider-dev/openapi/src/vercel/v00.00.00000/services/teams.yaml b/provider-dev/openapi/src/vercel/v00.00.00000/services/teams.yaml index c6e8fb7..26afd85 100644 --- a/provider-dev/openapi/src/vercel/v00.00.00000/services/teams.yaml +++ b/provider-dev/openapi/src/vercel/v00.00.00000/services/teams.yaml @@ -1,476 +1,10 @@ openapi: 3.0.3 -servers: - - url: 'https://api.vercel.com' - description: Production API info: - contact: - email: support@vercel.com - name: Vercel Support - url: 'https://vercel.com/support' + title: teams API + description: vercel teams API version: 0.0.1 - title: Vercel API - teams - description: teams -components: - schemas: - Team: - type: object - description: Data representing a Team. - properties: - id: - type: string - description: The Team's unique identifier. - example: team_nllPyCtREAqxxdyFKbbMDlxd - slug: - type: string - description: 'The Team''s slug, which is unique across the Vercel platform.' - example: my-team - name: - nullable: true - type: string - description: 'Name associated with the Team account, or `null` if none has been provided.' - example: My Team - avatar: - nullable: true - type: string - description: The ID of the file used as avatar for this Team. - example: 6eb07268bcfadd309905ffb1579354084c24655c - additionalProperties: true - TeamLimited: - properties: - limited: - type: boolean - description: 'Property indicating that this Team data contains only limited information, due to the authentication token missing privileges to read the full Team data. Re-login with the Team''s configured SAML Single Sign-On provider in order to upgrade the authentication token with the necessary privileges.' - saml: - properties: - connection: - properties: - type: - type: string - description: 'The Identity Provider "type", for example Okta.' - example: OktaSAML - status: - type: string - description: Current status of the connection. - example: linked - state: - type: string - description: Current state of the connection. - example: active - connectedAt: - type: number - description: Timestamp (in milliseconds) of when the configuration was connected. - example: 1611796915677 - lastReceivedWebhookEvent: - type: number - description: Timestamp (in milliseconds) of when the last webhook event was received from WorkOS. - example: 1611796915677 - required: - - type - - status - - state - - connectedAt - type: object - description: Information for the SAML Single Sign-On configuration. - directory: - properties: - type: - type: string - description: 'The Identity Provider "type", for example Okta.' - example: OktaSAML - status: - type: string - description: Current status of the connection. - example: linked - state: - type: string - description: Current state of the connection. - example: active - connectedAt: - type: number - description: Timestamp (in milliseconds) of when the configuration was connected. - example: 1611796915677 - lastReceivedWebhookEvent: - type: number - description: Timestamp (in milliseconds) of when the last webhook event was received from WorkOS. - example: 1611796915677 - required: - - type - - status - - state - - connectedAt - type: object - description: Information for the SAML Single Sign-On configuration. - enforced: - type: boolean - description: 'When `true`, interactions with the Team **must** be done with an authentication token that has been authenticated with the Team''s SAML Single Sign-On provider.' - required: - - enforced - type: object - description: 'When "Single Sign-On (SAML)" is configured, this object contains information that allows the client-side to identify whether or not this Team has SAML enforced.' - id: - type: string - description: The Team's unique identifier. - example: team_nllPyCtREAqxxdyFKbbMDlxd - slug: - type: string - description: 'The Team''s slug, which is unique across the Vercel platform.' - example: my-team - name: - nullable: true - type: string - description: 'Name associated with the Team account, or `null` if none has been provided.' - example: My Team - avatar: - nullable: true - type: string - description: The ID of the file used as avatar for this Team. - example: 6eb07268bcfadd309905ffb1579354084c24655c - membership: - oneOf: - - properties: - confirmed: - type: boolean - confirmedAt: - type: number - accessRequestedAt: - type: number - role: - type: string - enum: - - OWNER - - MEMBER - - VIEWER - - DEVELOPER - - BILLING - - CONTRIBUTOR - teamId: - type: string - uid: - type: string - createdAt: - type: number - created: - type: number - joinedFrom: - properties: - origin: - type: string - enum: - - link - - saml - - mail - - import - - teams - - github - - gitlab - - bitbucket - - dsync - - feedback - - organization-teams - commitId: - type: string - repoId: - type: string - repoPath: - type: string - gitUserId: - oneOf: - - type: string - - type: number - gitUserLogin: - type: string - ssoUserId: - type: string - ssoConnectedAt: - type: number - idpUserId: - type: string - dsyncUserId: - type: string - dsyncConnectedAt: - type: number - required: - - origin - type: object - required: - - confirmed - - confirmedAt - - role - - uid - - createdAt - - created - type: object - description: The membership of the authenticated User in relation to the Team. - - properties: - confirmed: - type: boolean - confirmedAt: - type: number - accessRequestedAt: - type: number - role: - type: string - enum: - - OWNER - - MEMBER - - VIEWER - - DEVELOPER - - BILLING - - CONTRIBUTOR - teamId: - type: string - uid: - type: string - createdAt: - type: number - created: - type: number - joinedFrom: - properties: - origin: - type: string - enum: - - link - - saml - - mail - - import - - teams - - github - - gitlab - - bitbucket - - dsync - - feedback - - organization-teams - commitId: - type: string - repoId: - type: string - repoPath: - type: string - gitUserId: - oneOf: - - type: string - - type: number - gitUserLogin: - type: string - ssoUserId: - type: string - ssoConnectedAt: - type: number - idpUserId: - type: string - dsyncUserId: - type: string - dsyncConnectedAt: - type: number - required: - - origin - type: object - required: - - confirmed - - accessRequestedAt - - role - - uid - - createdAt - - created - type: object - description: The membership of the authenticated User in relation to the Team. - created: - type: string - description: Will remain undocumented. Remove in v3 API. - createdAt: - type: number - description: UNIX timestamp (in milliseconds) when the Team was created. - example: 1630748523395 - required: - - limited - - id - - slug - - name - - avatar - - membership - - created - - createdAt - type: object - description: 'A limited form of data representing a Team, due to the authentication token missing privileges to read the full Team data.' - Pagination: - properties: - count: - type: number - description: Amount of items in the current page. - example: 20 - next: - nullable: true - type: number - description: Timestamp that must be used to request the next page. - example: 1540095775951 - prev: - nullable: true - type: number - description: Timestamp that must be used to request the previous page. - example: 1540095775951 - required: - - count - - next - - prev - type: object - description: 'This object contains information related to the pagination of the current request, including the necessary parameters to get the next or previous page of data.' - responses: {} - securitySchemes: - bearerToken: - type: http - description: Default authentication mechanism - scheme: bearer - oauth2: - type: oauth2 - flows: - authorizationCode: - authorizationUrl: 'https://api.vercel.com/oauth/authorize' - tokenUrl: 'https://api.vercel.com/oauth/access_token' - scopes: {} - x-stackQL-resources: - members: - id: vercel.teams.members - name: members - title: Members - methods: - get_team_members: - operation: - $ref: '#/paths/~1v2~1teams~1{teamId}~1members/get' - response: - mediaType: application/json - openAPIDocKey: '200' - objectKey: $.members - _get_team_members: - operation: - $ref: '#/paths/~1v2~1teams~1{teamId}~1members/get' - response: - mediaType: application/json - openAPIDocKey: '200' - invite_user_to_team: - operation: - $ref: '#/paths/~1v1~1teams~1{teamId}~1members/post' - response: - mediaType: application/json - openAPIDocKey: '200' - update_team_member: - operation: - $ref: '#/paths/~1v1~1teams~1{teamId}~1members~1{uid}/patch' - response: - mediaType: application/json - openAPIDocKey: '200' - remove_team_member: - operation: - $ref: '#/paths/~1v1~1teams~1{teamId}~1members~1{uid}/delete' - response: - mediaType: application/json - openAPIDocKey: '200' - sqlVerbs: - select: - - $ref: '#/components/x-stackQL-resources/members/methods/get_team_members' - insert: [] - update: [] - delete: - - $ref: '#/components/x-stackQL-resources/members/methods/remove_team_member' - request: - id: vercel.teams.request - name: request - title: Request - methods: - request_access_to_team: - operation: - $ref: '#/paths/~1v1~1teams~1{teamId}~1request/post' - response: - mediaType: application/json - openAPIDocKey: '200' - get_team_access_request: - operation: - $ref: '#/paths/~1v1~1teams~1{teamId}~1request~1{userId}/get' - response: - mediaType: application/json - openAPIDocKey: '200' - sqlVerbs: - select: - - $ref: '#/components/x-stackQL-resources/request/methods/get_team_access_request' - insert: [] - update: [] - delete: [] - teams: - id: vercel.teams.teams - name: teams - title: Teams - methods: - join_team: - operation: - $ref: '#/paths/~1v1~1teams~1{teamId}~1members~1teams~1join/post' - response: - mediaType: application/json - openAPIDocKey: '200' - get_team: - operation: - $ref: '#/paths/~1v2~1teams~1{teamId}/get' - response: - mediaType: application/json - openAPIDocKey: '200' - patch_team: - operation: - $ref: '#/paths/~1v2~1teams~1{teamId}/patch' - response: - mediaType: application/json - openAPIDocKey: '200' - get_teams: - operation: - $ref: '#/paths/~1v2~1teams/get' - response: - mediaType: application/json - openAPIDocKey: '200' - objectKey: $.teams - _get_teams: - operation: - $ref: '#/paths/~1v2~1teams/get' - response: - mediaType: application/json - openAPIDocKey: '200' - create_team: - operation: - $ref: '#/paths/~1v1~1teams/post' - response: - mediaType: application/json - openAPIDocKey: '200' - delete_team: - operation: - $ref: '#/paths/~1v1~1teams~1{teamId}/delete' - response: - mediaType: application/json - openAPIDocKey: '200' - sqlVerbs: - select: - - $ref: '#/components/x-stackQL-resources/teams/methods/get_team' - - $ref: '#/components/x-stackQL-resources/teams/methods/get_teams' - insert: - - $ref: '#/components/x-stackQL-resources/teams/methods/create_team' - update: [] - delete: - - $ref: '#/components/x-stackQL-resources/teams/methods/delete_team' - invites: - id: vercel.teams.invites - name: invites - title: Invites - methods: - delete_team_invite_code: - operation: - $ref: '#/paths/~1v1~1teams~1{teamId}~1invites~1{inviteId}/delete' - response: - mediaType: application/json - openAPIDocKey: '200' - sqlVerbs: - select: [] - insert: [] - update: [] - delete: - - $ref: '#/components/x-stackQL-resources/invites/methods/delete_team_invite_code' paths: - '/v2/teams/{teamId}/members': + /v3/teams/{team_id}/members: get: description: Get a paginated list of team members for the provided team. operationId: getTeamMembers @@ -495,6 +29,9 @@ paths: example: 123a6c5209bc3778245d011443644c8d27dc2c50 confirmed: type: boolean + enum: + - false + - true description: Boolean that indicates if this member was confirmed by an owner. example: true email: @@ -522,12 +59,14 @@ paths: role: type: string enum: - - OWNER - - MEMBER - - DEVELOPER - - VIEWER - BILLING - CONTRIBUTOR + - DEVELOPER + - MEMBER + - OWNER + - SECURITY + - VIEWER + - VIEWER_FOR_PLUS description: Role of this user in the team. example: OWNER uid: @@ -555,17 +94,25 @@ paths: origin: type: string enum: - - mail - - link - - import - - teams - - github - - gitlab + - account-update - bitbucket - - saml - dsync - feedback + - github + - gitlab + - import + - link + - mail + - nsnb-auto-approve + - nsnb-hobby-upgrade + - nsnb-invite + - nsnb-redeploy + - nsnb-redeploy-attribution-card + - nsnb-request-access + - nsnb-viewer-upgrade - organization-teams + - saml + - teams commitId: type: string repoId: @@ -595,32 +142,46 @@ paths: projects: items: properties: - id: - type: string name: type: string + id: + type: string role: type: string enum: - ADMIN - PROJECT_DEVELOPER + - PROJECT_GUEST - PROJECT_VIEWER + required: + - id + - name type: object description: Array of project memberships type: array description: Array of project memberships + isEnterpriseManaged: + type: boolean + enum: + - false + - true + description: Indicates whether the user is managed by an enterprise. required: - confirmed + - createdAt - email - role - uid - username - - createdAt type: object type: array emailInviteCodes: items: properties: + accessGroups: + items: + type: string + type: array id: type: string email: @@ -628,26 +189,75 @@ paths: role: type: string enum: - - OWNER - - MEMBER - - DEVELOPER - - VIEWER - BILLING - CONTRIBUTOR + - DEVELOPER + - MEMBER + - OWNER + - SECURITY + - VIEWER + - VIEWER_FOR_PLUS + teamRoles: + items: + type: string + enum: + - BILLING + - CONTRIBUTOR + - DEVELOPER + - MEMBER + - OWNER + - SECURITY + - VIEWER + - VIEWER_FOR_PLUS + type: array + teamPermissions: + items: + type: string + enum: + - AiGatewayApiKeyOwnedBySelf + - AiGatewayBudgetManager + - AiGatewayCredits + - AiGatewaySettings + - AiGatewayTranscriptsManager + - AiGatewayTranscriptsViewer + - ConnectorManager + - CreateProject + - EnvVariableManager + - EnvironmentManager + - FullProductionDeployment + - IntegrationManager + - OrgAdmin + - OrgViewer + - UsageViewer + - V0Builder + - V0Chatter + - V0Viewer + - WorkflowDecryptor + type: array isDSyncUser: type: boolean + enum: + - false + - true createdAt: type: number expired: type: boolean + enum: + - true projects: additionalProperties: type: string enum: - ADMIN - PROJECT_DEVELOPER + - PROJECT_GUEST - PROJECT_VIEWER type: object + entitlements: + items: + type: string + type: array required: - id - isDSyncUser @@ -657,6 +267,9 @@ paths: properties: hasNext: type: boolean + enum: + - false + - true count: type: number description: Amount of items in the current page. @@ -672,8 +285,8 @@ paths: description: Timestamp that must be used to request the previous page. example: 1540095775951 required: - - hasNext - count + - hasNext - next - prev type: object @@ -681,22 +294,29 @@ paths: - members - pagination type: object + x-vercel-cli: + displayColumns: + username: members[].username + email: members[].email + role: members[].role + joinedFrom: members[].joinedFrom.origin + createdAt: members[].createdAt '400': description: One of the provided values in the request query is invalid. '401': - description: '' + description: The request is not authorized. '403': description: You do not have permission to access this resource. '404': - description: No team was found. + description: '' + '410': + description: '' + x-vercel-cli: + supportedSubcommands: true + supportedProduction: false + aliases: + - members parameters: - - name: teamId - description: ID of the Team. - in: path - required: true - schema: - type: string - description: ID of the Team. - name: limit description: Limit how many teams should be returned in: query @@ -704,6 +324,7 @@ paths: schema: description: Limit how many teams should be returned example: 20 + minimum: 1 type: number - name: since description: Timestamp in milliseconds to only include members added since then. @@ -722,11 +343,11 @@ paths: example: 1540095775951 type: number - name: search - description: 'Search team members by their name, username, and email.' + description: Search team members by their name, username, and email. in: query required: false schema: - description: 'Search team members by their name, username, and email.' + description: Search team members by their name, username, and email. type: string - name: role description: Only return members with the specified team role. @@ -740,8 +361,10 @@ paths: - OWNER - MEMBER - DEVELOPER - - VIEWER + - SECURITY - BILLING + - VIEWER + - VIEWER_FOR_PLUS - CONTRIBUTOR - name: excludeProject description: Exclude members who belong to the specified project. @@ -757,9 +380,25 @@ paths: schema: description: Include team members who are eligible to be members of the specified project. type: string - '/v1/teams/{teamId}/members': + - description: The Team identifier to perform the request on behalf of. + in: path + name: team_id + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + required: true + x-vercel-cli: + kind: argument + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + x-speakeasy-test: false + /v2/teams/{team_id}/members: post: - description: 'Invite a user to join the team specified in the URL. The authenticated user needs to be an `OWNER` in order to successfully invoke this endpoint. The user can be specified with an email or an ID. If both email and ID are provided, ID will take priority.' + description: Invite a user to join the team specified in the URL. The authenticated user needs to be an `OWNER` in order to successfully invoke this endpoint. The user to be invited must be specified by email. operationId: inviteUserToTeam security: - bearerToken: [] @@ -768,140 +407,101 @@ paths: - teams responses: '200': - description: The member was successfully added to the team + description: '' content: application/json: schema: - oneOf: - - properties: - uid: - type: string - description: The ID of the invited user - example: kr1PsOIzqEL5Xg6M4VZcZosf - username: - type: string - description: The username of the invited user - example: john-doe - email: - type: string - description: The email of the invited user. Not included if the user was invited via their UID. - example: john@user.co - role: - type: string - enum: - - OWNER - - MEMBER - - VIEWER - - DEVELOPER - - BILLING - - CONTRIBUTOR - description: The role used for the invitation - example: MEMBER - required: - - uid - - username - - email - - role - type: object - description: The member was successfully added to the team - - properties: - uid: - type: string - username: - type: string - role: - type: string - enum: - - OWNER - - MEMBER - - VIEWER - - DEVELOPER - - BILLING - - CONTRIBUTOR - required: - - uid - - username - - role - type: object + $ref: '#/components/schemas/InvitedTeamMember' '400': description: |- One of the provided values in the request body is invalid. One of the provided values in the request query is invalid. - The user already requested access to the team - Hobby teams are not allowed to add seats. - The team reached the maximum allowed amount of members '401': - description: '' + description: The request is not authorized. '403': description: |- You do not have permission to access this resource. The authenticated user must be a team owner to perform the action - '404': - description: The team was not found + '410': + description: '' + '503': + description: '' + x-vercel-cli: + supportedSubcommands: true + supportedProduction: false + aliases: + - invite parameters: - - name: teamId - description: ID of the Team. + - description: The Team identifier to perform the request on behalf of. in: path + name: team_id + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l required: true + x-vercel-cli: + kind: argument + - description: The Team slug to perform the request on behalf of. + in: query + name: slug schema: type: string - description: ID of the Team. + example: my-team-url-slug requestBody: content: application/json: schema: - type: object - properties: - uid: - type: string - description: The id of the user to invite - example: kr1PsOIzqEL5Xg6M4VZcZosf - email: - type: string - format: email - description: The email address of the user to invite - example: john@example.com - role: - type: string - enum: - - OWNER - - MEMBER - - VIEWER - - DEVELOPER - - BILLING - - CONTRIBUTOR - default: - - MEMBER - - VIEWER - description: The role of the user to invite - example: - - MEMBER - - VIEWER - projects: - type: array - items: - type: object - additionalProperties: false - required: - - role - - projectId - properties: - projectId: - type: string - maxLength: 256 - example: prj_ndlgr43fadlPyCtREAqxxdyFK - description: The ID of the project. - role: - type: string - enum: - - ADMIN - - PROJECT_VIEWER - - PROJECT_DEVELOPER - example: ADMIN - description: Sets the project roles for the invited user - '/v1/teams/{teamId}/request': + type: array + items: + type: object + required: + - email + properties: + email: + type: string + format: email + description: The email address of the user to invite + example: john@example.com + role: + type: string + enum: + - OWNER + - MEMBER + - DEVELOPER + - SECURITY + - BILLING + - VIEWER + - VIEWER_FOR_PLUS + - CONTRIBUTOR + default: VIEWER + description: The role of the user to invite + example: VIEWER + projects: + type: array + items: + type: object + additionalProperties: false + required: + - role + - projectId + properties: + projectId: + type: string + maxLength: 64 + example: prj_ndlgr43fadlPyCtREAqxxdyFK + description: The ID of the project. + role: + type: string + enum: + - ADMIN + - PROJECT_VIEWER + - PROJECT_DEVELOPER + - PROJECT_GUEST + example: ADMIN + description: Sets the project roles for the invited user + /v1/teams/{team_id}/request: post: - description: Request access to a team as a member. An owner has to approve the request. Only 10 users can request access to a team at the same time. + description: Request access to a team as a member. An owner has to approve the request. Only 100 users can request access to a team at the same time. operationId: requestAccessToTeam security: - bearerToken: [] @@ -921,22 +521,33 @@ paths: type: string confirmed: type: boolean + enum: + - false + - true joinedFrom: properties: origin: type: string enum: - - import - - teams - - github - - gitlab + - account-update - bitbucket + - dsync - feedback - - organization-teams - - mail + - github + - gitlab + - import - link + - mail + - nsnb-auto-approve + - nsnb-hobby-upgrade + - nsnb-invite + - nsnb-redeploy + - nsnb-redeploy-attribution-card + - nsnb-request-access + - nsnb-viewer-upgrade + - organization-teams - saml - - dsync + - teams commitId: type: string repoId: @@ -983,11 +594,11 @@ paths: type: string type: object required: - - teamSlug - - teamName + - bitbucket - github - gitlab - - bitbucket + - teamName + - teamSlug type: object '400': description: |- @@ -999,14 +610,20 @@ paths: description: You do not have permission to access this resource. '404': description: The team was not found. + '410': + description: '' + '429': + description: '' + '503': + description: '' parameters: - - name: teamId - description: ID of the Team. + - name: team_id in: path required: true schema: type: string - description: ID of the Team. + description: The unique team identifier + example: team_1a2b3c4d5e6f7g8h9i0j1k2l requestBody: content: application/json: @@ -1056,9 +673,10 @@ paths: type: string description: The login name for the Git account of the user who requests access. example: jane-doe - '/v1/teams/{teamId}/request/{userId}': + required: true + /v1/teams/{team_id}/request/{user_id}: get: - description: 'Check the status of a join request. It''ll respond with a 404 if the request has been declined. If no `userId` path segment was provided, this endpoint will instead return the status of the authenticated user.' + description: Check the status of a join request. It'll respond with a 404 if the request has been declined. If no `userId` path segment was provided, this endpoint will instead return the status of the authenticated user. operationId: getTeamAccessRequest security: - bearerToken: [] @@ -1082,24 +700,35 @@ paths: example: My Team confirmed: type: boolean - description: 'Current status of the membership. Will be `true` if confirmed, if pending it''ll be `false`.' + enum: + - false + - true + description: Current status of the membership. Will be `true` if confirmed, if pending it'll be `false`. example: false joinedFrom: properties: origin: type: string enum: - - mail - - link - - import - - teams - - github - - gitlab + - account-update - bitbucket - - saml - dsync - feedback + - github + - gitlab + - import + - link + - mail + - nsnb-auto-approve + - nsnb-hobby-upgrade + - nsnb-invite + - nsnb-redeploy + - nsnb-redeploy-attribution-card + - nsnb-request-access + - nsnb-viewer-upgrade - organization-teams + - saml + - teams commitId: type: string repoId: @@ -1152,41 +781,44 @@ paths: type: object description: Map of the connected Bitbucket account. required: - - teamSlug - - teamName - - confirmed - - joinedFrom - accessRequestedAt + - bitbucket + - confirmed - github - gitlab - - bitbucket + - joinedFrom + - teamName + - teamSlug type: object '400': description: |- One of the provided values in the request query is invalid. User is already a confirmed member of the team and did not request access. Only visible when the authenticated user does have access to the team. + '401': + description: '' '403': description: You do not have permission to access this resource. '404': description: |- The provided user doesn't have a membership. Team was not found. + '410': + description: '' parameters: - - name: teamId - description: ID of the Team. + - name: user_id in: path required: true schema: type: string - description: ID of the Team. - - name: userId - description: User ID. + description: The unique user identifier + - name: team_id in: path required: true schema: type: string - description: User ID. - '/v1/teams/{teamId}/members/teams/join': + description: The unique team identifier + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + /v1/teams/{team_id}/members/teams/join: post: description: Join a team with a provided invite code or team ID. operationId: joinTeam @@ -1219,16 +851,14 @@ paths: description: The origin of how the user joined. example: email required: - - teamId - - slug - - name - from + - name + - slug + - teamId type: object description: Successfully joined a team. '400': - description: |- - One of the provided values in the request body is invalid. - Reached the max. amount of team members. + description: One of the provided values in the request body is invalid. '401': description: '' '402': @@ -1236,15 +866,19 @@ paths: '403': description: You do not have permission to access this resource. '404': - description: Team not found. + description: '' + '410': + description: '' + '503': + description: '' parameters: - - name: teamId - description: ID of the Team. + - name: team_id in: path required: true schema: type: string - description: ID of the Team. + description: The unique team identifier + example: team_1a2b3c4d5e6f7g8h9i0j1k2l requestBody: content: application/json: @@ -1255,13 +889,10 @@ paths: type: string description: The invite code to join the team. example: fisdh38aejkeivn34nslfore9vjtn4ls - teamId: - example: team_3oNwMKqLHqEBh02CTPsrbNbe - description: The team ID. - type: string - '/v1/teams/{teamId}/members/{uid}': + required: true + /v1/teams/{team_id}/members/{uid}: patch: - description: 'Update the membership of a Team Member on the Team specified by `teamId`, such as changing the _role_ of the member, or confirming a request to join the Team for an unconfirmed member. The authenticated user must be an `OWNER` of the Team.' + description: Update the membership of a Team Member on the Team specified by `teamId`, such as changing the _role_ of the member, or confirming a request to join the Team for an unconfirmed member. The authenticated user must be an `OWNER` of the Team. operationId: updateTeamMember security: - bearerToken: [] @@ -1289,7 +920,9 @@ paths: Cannot confirm a member that is already confirmed. Cannot confirm a member that did not request access. '401': - description: 'Team members can only be updated by an owner, or by the authenticated user if they are only disconnecting their SAML connection to the Team.' + description: |- + The request is not authorized. + Team members can only be updated by an owner, or by the authenticated user if they are only disconnecting their SAML connection to the Team. '402': description: '' '403': @@ -1298,17 +931,13 @@ paths: description: |- The provided user is not part of this team. A user with the specified ID does not exist. - Team not found. + '409': + description: '' + '410': + description: '' '500': description: '' parameters: - - name: teamId - description: ID of the Team. - in: path - required: true - schema: - type: string - description: ID of the Team. - name: uid description: The ID of the member. in: path @@ -1317,6 +946,13 @@ paths: type: string description: The ID of the member. example: ndfasllgPyCtREAqxxdyFKb + - name: team_id + in: path + required: true + schema: + type: string + description: The unique team identifier + example: team_1a2b3c4d5e6f7g8h9i0j1k2l requestBody: content: application/json: @@ -1332,12 +968,36 @@ paths: role: type: string description: The role in the team of the member. - default: - - MEMBER - - VIEWER + example: VIEWER + default: MEMBER + teamPermissions: + type: array + description: The team permissions to set for the member. Permissions must be compatible with the team roles assigned to the member. example: - - MEMBER - - VIEWER + - CreateProject + - FullProductionDeployment + items: + type: string + enum: + - ConnectorManager + - IntegrationManager + - CreateProject + - FullProductionDeployment + - UsageViewer + - EnvVariableManager + - EnvironmentManager + - WorkflowDecryptor + - OrgAdmin + - OrgViewer + - AiGatewaySettings + - AiGatewayCredits + - AiGatewayApiKeyOwnedBySelf + - AiGatewayBudgetManager + - AiGatewayTranscriptsManager + - AiGatewayTranscriptsViewer + - V0Builder + - V0Chatter + - V0Viewer projects: type: array items: @@ -1354,22 +1014,23 @@ paths: description: The ID of the project. role: type: string + example: ADMIN + description: The project role of the member that will be added. \"null\" will remove this project level role. + nullable: true enum: - ADMIN - PROJECT_VIEWER - PROJECT_DEVELOPER - null - example: ADMIN - description: The project role of the member that will be added. \"null\" will remove this project level role. - nullable: true joinedFrom: additionalProperties: false type: object properties: ssoUserId: - type: 'null' + nullable: true + required: true delete: - description: 'Remove a Team Member from the Team, or dismiss a user that requested access, or leave a team.' + description: Remove a Team Member from the Team, or dismiss a user that requested access, or leave a team. Directory Sync members can be removed when their directory email is absent or does not match the user's primary or verified secondary emails. operationId: removeTeamMember security: - bearerToken: [] @@ -1386,34 +1047,24 @@ paths: id: type: string description: ID of the team. - newDefaultTeamIdError: - type: boolean required: - id - - newDefaultTeamIdError type: object '400': - description: |- - One of the provided values in the request query is invalid. - Cannot leave the team as the only owner. + description: One of the provided values in the request query is invalid. '401': - description: '' + description: The request is not authorized. '403': description: |- You do not have permission to access this resource. Not authorized to update the team. '404': - description: |- - A user with the specified ID does not exist. - No team found. + description: '' + '410': + description: '' + '503': + description: '' parameters: - - name: teamId - description: ID of the Team. - in: path - required: true - schema: - type: string - description: ID of the Team. - name: uid description: The user ID of the member. in: path @@ -1430,7 +1081,14 @@ paths: type: string description: The ID of the team to set as the new default team for the Northstar user. example: team_nllPyCtREAqxxdyFKbbMDlxd - '/v2/teams/{teamId}': + - name: team_id + in: path + required: true + schema: + type: string + description: The unique team identifier + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + /v2/teams/{team_id}: get: description: Get information for the Team specified by the `teamId` parameter. operationId: getTeam @@ -1449,24 +1107,35 @@ paths: '400': description: One of the provided values in the request query is invalid. '401': - description: '' + description: The request is not authorized. '403': description: |- You do not have permission to access this resource. Not authorized to access the team. '404': description: Team was not found. + '410': + description: '' + x-vercel-cli: + supportedSubcommands: true + supportedProduction: false + aliases: + - get parameters: - name: slug in: query schema: type: string - - description: The Team identifier or slug to perform the request on behalf of. + example: my-team-url-slug + - description: The Team identifier to perform the request on behalf of. in: path - name: teamId + name: team_id schema: type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l required: true + x-vercel-cli: + kind: argument patch: description: Update the information of a Team specified by the `teamId` parameter. The request body should contain the information that will be updated on the Team. operationId: patchTeam @@ -1485,22 +1154,32 @@ paths: '400': description: One of the provided values in the request body is invalid. '401': - description: '' + description: The request is not authorized. '402': description: '' '403': description: |- You do not have permission to access this resource. Not authorized to update the team. Must be an OWNER. - '404': - description: Team was not found. + '410': + description: '' + '428': + description: Owner does not have protection add-on + x-vercel-cli: + supportedSubcommands: true + supportedProduction: false + aliases: + - update parameters: - - description: The Team identifier or slug to perform the request on behalf of. + - description: The Team identifier to perform the request on behalf of. in: path - name: teamId + name: team_id schema: type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l required: true + x-vercel-cli: + kind: argument requestBody: content: application/json: @@ -1510,9 +1189,10 @@ paths: properties: avatar: type: string - format: regex - regex: '^[0-9a-f]{40}$' - description: The hash value of an uploaded image. + maxLength: 40 + pattern: ^[0-9a-f]+$ + description: The hash value of an uploaded image, or `null` to clear the avatar. + nullable: true description: type: string maxLength: 140 @@ -1521,7 +1201,6 @@ paths: emailDomain: type: string format: regex - regex: '\\b((?=[a-z0-9-]{1,63}\\.)(xn--)?[a-z0-9]+(-[a-z0-9]+)*\\.)+[a-z]{2,63}\\b' example: example.com nullable: true name: @@ -1549,15 +1228,27 @@ paths: description: Require that members of the team use SAML Single Sign-On. roles: type: object + description: Directory groups to role or access group mappings. additionalProperties: - type: string - enum: - - OWNER - - MEMBER - - VIEWER - - DEVELOPER - - BILLING - - CONTRIBUTOR + anyOf: + - type: string + enum: + - OWNER + - MEMBER + - DEVELOPER + - SECURITY + - BILLING + - VIEWER + - VIEWER_FOR_PLUS + - CONTRIBUTOR + - type: object + additionalProperties: false + required: + - accessGroupId + properties: + accessGroupId: + type: string + pattern: ^ag_[A-z0-9_ -]+$ slug: type: string example: my-team @@ -1565,15 +1256,19 @@ paths: enablePreviewFeedback: type: string example: 'on' - description: 'Enable preview comments: one of on, off or default.' + description: 'Enable preview toolbar: one of on, off or default.' + enableProductionFeedback: + type: string + example: 'on' + description: 'Enable production toolbar: one of on, off or default.' sensitiveEnvironmentVariablePolicy: type: string example: 'on' description: 'Sensitive environment variable policy: one of on, off or default.' - migrateExistingEnvVariablesToSensitive: - type: boolean - example: false - description: Runs a task that migrates all existing environment variables to sensitive environment variables. + disjunctiveProductionSecretPolicy: + type: string + example: 'on' + description: 'Require production secrets to be in their own environment group: one of on, off or default.' remoteCaching: type: object description: Whether or not remote caching is enabled for the team @@ -1587,6 +1282,394 @@ paths: type: boolean example: false description: Display or hide IP addresses in Monitoring queries. + hideIpAddressesInLogDrains: + type: boolean + example: false + description: Display or hide IP addresses in Log Drains. + dpAccessRequestsMode: + type: string + enum: + - all + - none + - email-domain + example: none + description: Controls who can request access to protected deployments. + requireVerifiedCommits: + type: boolean + example: true + description: When enabled, all projects in the team require commits to be signed and verified by the git provider before deployments will be created. + disableRepositoryDispatchEvents: + type: boolean + example: false + description: Default for projects in the team. When `true`, projects in this team will not emit GitHub repository-dispatch events on deployment events unless the project explicitly overrides this setting. + defaultDeploymentProtection: + type: object + description: Default deployment protection settings for new projects. + additionalProperties: false + properties: + passwordProtection: + additionalProperties: false + description: Allows to protect project deployments with a password + properties: + deploymentType: + description: Specify if the password will apply to every Deployment Target or just Preview + enum: + - all + - preview + - prod_deployment_urls_and_all_previews + - all_except_custom_domains + type: string + password: + description: The password that will be used to protect Project Deployments + maxLength: 72 + type: string + nullable: true + required: + - deploymentType + type: object + nullable: true + ssoProtection: + additionalProperties: false + description: Ensures visitors to your Preview Deployments are logged into Vercel and have a minimum of Viewer access on your team + properties: + deploymentType: + default: preview + description: Specify if the Vercel Authentication (SSO Protection) will apply to every Deployment Target or just Preview + enum: + - all + - preview + - prod_deployment_urls_and_all_previews + - all_except_custom_domains + type: string + required: + - deploymentType + type: object + nullable: true + defaultPassport: + description: Default Passport configuration for new projects. + type: object + additionalProperties: false + properties: + connectorId: + type: string + deploymentType: + type: string + default: all + enum: + - all + - preview + - prod_deployment_urls_and_all_previews + - all_except_custom_domains + required: + - connectorId + nullable: true + defaultExpirationSettings: + properties: + expiration: + description: The time period to keep non-production deployments for + example: 1y + type: string + enum: + - 3y + - 2y + - 1y + - 6m + - 3m + - 2m + - 1m + - 2w + - 1w + - 1d + - unlimited + expirationProduction: + description: The time period to keep production deployments for + example: 1y + type: string + enum: + - 3y + - 2y + - 1y + - 6m + - 3m + - 2m + - 1m + - 2w + - 1w + - 1d + - unlimited + expirationCanceled: + description: The time period to keep canceled deployments for + example: 1y + type: string + enum: + - 1y + - 6m + - 3m + - 2m + - 1m + - 2w + - 1w + - 1d + - unlimited + expirationErrored: + description: The time period to keep errored deployments for + example: 1y + type: string + enum: + - 1y + - 6m + - 3m + - 2m + - 1m + - 2w + - 1w + - 1d + - unlimited + type: object + additionalProperties: false + deploymentPolicy: + type: object + description: Composable deployment-time policy. Each rule type holds a list of rules, one per environment scope. + additionalProperties: false + properties: + gitSources: + anyOf: + - type: array + items: + type: object + additionalProperties: false + required: + - enabled + - environments + - sources + properties: + enabled: + type: boolean + environments: + type: array + items: + anyOf: + - type: object + additionalProperties: false + required: + - type + - target + properties: + type: + type: string + enum: + - system + target: + type: string + enum: + - production + - preview + - type: object + additionalProperties: false + required: + - type + - environmentId + properties: + type: + type: string + enum: + - custom + environmentId: + type: string + sources: + type: array + items: + anyOf: + - type: object + additionalProperties: false + required: + - provider + - org + properties: + provider: + type: string + enum: + - github + - bitbucket + org: + type: string + repo: + type: string + - type: object + additionalProperties: false + required: + - provider + - namespace + properties: + provider: + type: string + enum: + - gitlab + namespace: + type: string + project: + type: string + - type: string + deploymentSources: + anyOf: + - type: array + items: + type: object + additionalProperties: false + required: + - enabled + - environments + - sources + properties: + enabled: + type: boolean + environments: + type: array + items: + anyOf: + - type: object + additionalProperties: false + required: + - type + - target + properties: + type: + type: string + enum: + - system + target: + type: string + enum: + - production + - preview + - type: object + additionalProperties: false + required: + - type + - environmentId + properties: + type: + type: string + enum: + - custom + environmentId: + type: string + sources: + type: array + items: + type: string + enum: + - git + - cli + - rest-api + - deploy-hook + - integration + - v0 + - type: string + strictDeploymentProtectionSettings: + type: object + description: When enabled, deployment protection settings require stricter permissions (owner-only). + additionalProperties: false + properties: + enabled: + type: boolean + example: true + description: Enable or disable strict deployment protection settings. + required: + - enabled + strictShareableLinks: + type: object + description: When enabled, creating shareable links requires Owner role. + additionalProperties: false + properties: + enabled: + type: boolean + example: true + description: Enable or disable requiring Owner role to create shareable links. + required: + - enabled + strictPasswordProtectionSettings: + type: object + description: When enabled, adding, changing, or removing project password protection requires Owner role. + additionalProperties: false + properties: + enabled: + type: boolean + example: true + description: Enable or disable requiring Owner role to change project password protection. + required: + - enabled + strictConnectors: + type: object + description: When enabled, creating and managing connectors requires Owner role. + additionalProperties: false + properties: + enabled: + type: boolean + example: true + description: Enable or disable requiring Owner role to manage connectors. + required: + - enabled + nsnbConfig: + type: object + description: NSNB configuration for the team. + additionalProperties: false + properties: + preference: + type: string + enum: + - auto-approval + - manual-approval + - block + description: The NSNB preference for the team. + required: + - preference + defaultProjectJobs: + description: Default job configuration applied to new projects created in this team. + type: object + additionalProperties: false + properties: + lint: + type: object + additionalProperties: false + properties: + targets: + type: array + items: + type: string + required: + - targets + typecheck: + type: object + additionalProperties: false + properties: + targets: + type: array + items: + type: string + required: + - targets + resourceConfig: + type: object + description: Resource configuration for the team. + additionalProperties: false + properties: + buildMachine: + type: object + description: Build machine configuration. + additionalProperties: false + properties: + default: + type: string + enum: + - basic + - enhanced + - turbo + - standard + - elastic + example: standard + description: 'Default build machine type for new builds: standard, enhanced, turbo, or elastic.' + required: true /v2/teams: get: description: Get a paginated list of all the Teams the authenticated User is a member of. @@ -1612,16 +1695,32 @@ paths: pagination: $ref: '#/components/schemas/Pagination' required: - - teams - pagination + - teams type: object description: A paginated list of teams. + x-vercel-cli: + displayColumns: + name: teams[].name + id: teams[].id + slug: teams[].slug + role: teams[].membership.role + createdAt: teams[].createdAt '400': description: One of the provided values in the request query is invalid. '401': description: '' '403': description: You do not have permission to access this resource. + '410': + description: '' + '500': + description: '' + x-vercel-cli: + supportedSubcommands: true + supportedProduction: false + aliases: + - list parameters: - name: limit description: Maximum number of Teams which may be returned. @@ -1646,7 +1745,7 @@ paths: type: number /v1/teams: post: - description: 'Create a new Team under your account. You need to send a POST request with the desired Team slug, and optionally the Team name.' + description: Create a new Team under your account. You need to send a POST request with the desired Team slug, and optionally the Team name. operationId: createTeam security: - bearerToken: [] @@ -1666,1475 +1765,1908 @@ paths: example: team_nLlpyC6RE1qxqglFKbrMxlud slug: type: string - billing: - properties: - currency: - type: string - enum: - - usd - - eur - cancelation: - nullable: true - type: number - period: - nullable: true - properties: - start: - type: number - end: - type: number - required: - - start - - end - type: object - contract: - nullable: true - properties: - start: - type: number - end: - type: number - required: - - start - - end - type: object - plan: - type: string - enum: - - hobby - - pro - - enterprise - platform: - type: string - enum: - - stripe - - stripeTestMode - orbCustomerId: - type: string - syncedAt: - type: number - programType: - type: string - enum: - - startup - - agency - trial: - nullable: true - properties: - start: - type: number - end: - type: number - required: - - start - - end - type: object - email: - nullable: true - type: string - tax: - nullable: true - properties: - type: - type: string - id: - type: string - required: - - type - - id - type: object - language: - nullable: true - type: string - address: - nullable: true - properties: - line1: - type: string - line2: - type: string - postalCode: - type: string - city: - type: string - country: - type: string - state: - type: string + required: + - id + - slug + type: object + description: The team was created successfully + '400': + description: |- + One of the provided values in the request body is invalid. + The slug is already in use + '401': + description: '' + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '409': + description: '' + '410': + description: '' + x-vercel-cli: + supportedSubcommands: true + supportedProduction: false + aliases: + - create + parameters: [] + requestBody: + content: + application/json: + schema: + type: object + additionalProperties: false + required: + - slug + properties: + slug: + example: a-random-team + description: The desired slug for the Team + type: string + maxLength: 48 + name: + example: A Random Team + description: The desired name for the Team. It will be generated from the provided slug if nothing is provided + type: string + maxLength: 256 + attribution: + type: object + description: Attribution information for the session or current page + properties: + sessionReferrer: + type: string + description: Session referrer + landingPage: + type: string + description: Session landing page + pageBeforeConversionPage: + type: string + description: Referrer to the signup page + utm: + type: object + properties: + utmSource: + type: string + description: UTM source + utmMedium: + type: string + description: UTM medium + utmCampaign: + type: string + description: UTM campaign + utmTerm: + type: string + description: UTM term + required: true + /v1/teams/{team_id}/dsync-roles: + post: + description: Update the Directory Sync role mappings for a Team. This endpoint allows updating the mapping between directory groups and team roles or access groups. + operationId: postTeamDsyncRoles + security: + - bearerToken: [] + summary: Update Team Directory Sync Role Mappings + tags: + - teams + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + ok: + type: boolean + enum: + - false + - true + required: + - ok + type: object + '400': + description: One of the provided values in the request body is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '410': + description: '' + parameters: + - description: The Team identifier to perform the request on behalf of. + in: path + name: team_id + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + required: true + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + requestBody: + content: + application/json: + schema: + type: object + additionalProperties: false + required: + - roles + properties: + roles: + type: object + description: Directory groups to role or access group mappings. + additionalProperties: + anyOf: + - type: string + enum: + - OWNER + - MEMBER + - DEVELOPER + - SECURITY + - BILLING + - VIEWER + - VIEWER_FOR_PLUS + - CONTRIBUTOR + - type: object + additionalProperties: false required: - - line1 - type: object + - accessGroupId + properties: + accessGroupId: + type: string + pattern: ^ag_[A-z0-9_ -]+$ + /v1/teams/{team_id}: + delete: + description: Delete a team under your account. You need to send a `DELETE` request with the desired team `id`. An optional array of reasons for deletion may also be sent. + operationId: deleteTeam + security: + - bearerToken: [] + summary: Delete a Team + tags: + - teams + responses: + '200': + description: The Team was successfully deleted + content: + application/json: + schema: + properties: + id: + type: string + description: The ID of the deleted Team + example: team_LLHUOMOoDlqOp8wPE4kFo9pE + newDefaultTeamIdError: + type: boolean + enum: + - false + - true + description: Signifies whether the default team update has failed, when newDefaultTeamId is provided in request query. + example: true + required: + - id + type: object + description: The Team was successfully deleted + '400': + description: |- + One of the provided values in the request body is invalid. + One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '402': + description: '' + '403': + description: |- + You do not have permission to access this resource. + The authenticated user can't access the team + '409': + description: '' + '410': + description: '' + '503': + description: '' + parameters: + - name: newDefaultTeamId + description: Id of the team to be set as the new default team + in: query + required: false + schema: + type: string + description: Id of the team to be set as the new default team + example: team_LLHUOMOoDlqOp8wPE4kFo9pE + - description: The Team identifier to perform the request on behalf of. + in: path + name: team_id + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + required: true + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + requestBody: + content: + application/json: + schema: + type: object + additionalProperties: false + properties: + reasons: + type: array + description: Optional array of objects that describe the reason why the team is being deleted. + items: + type: object + description: An object describing the reason why the team is being deleted. + required: + - slug + - description + additionalProperties: false + properties: + slug: + type: string + description: Idenitifier slug of the reason why the team is being deleted. + description: + type: string + description: Description of the reason why the team is being deleted. + required: true + /v1/teams/{team_id}/invites/{invite_id}: + delete: + description: Delete an active Team invite code. + operationId: deleteTeamInviteCode + security: + - bearerToken: [] + summary: Delete a Team invite code + tags: + - teams + responses: + '200': + description: Successfully deleted Team invite code. + content: + application/json: + schema: + properties: + id: + type: string + description: ID of the team. + required: + - id + type: object + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: |- + You do not have permission to access this resource. + Invite managed by directory sync + Not authorized to access this team. + '404': + description: Team invite code not found. + '410': + description: '' + parameters: + - name: invite_id + description: The Team invite code ID. + in: path + required: true + schema: + type: string + description: The Team invite code ID. + example: 2wn2hudbr4chb1ecywo9dvzo7g9sscs6mzcz8htdde0txyom4l + - name: team_id + description: The Team identifier to perform the request on behalf of. + in: path + required: true + schema: + type: string + description: The Team identifier to perform the request on behalf of. + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + /v1/teams/{team_id}/microfrontends/{group_id}: + patch: + description: Updates a microfrontends group's settings. + operationId: updateMicrofrontendsGroup + security: + - bearerToken: [] + summary: Update a microfrontends group + tags: + - teams + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + updatedMicrofrontendsGroup: + properties: name: - nullable: true type: string - invoiceItems: - nullable: true - properties: - monitoring: - properties: - tier: - type: number - price: - type: number - quantity: - type: number - name: - type: string - hidden: - type: boolean - createdAt: - type: number - disabledAt: - nullable: true - type: number - frequency: - properties: - interval: - type: string - enum: - - month - intervalCount: - type: number - enum: - - 1 - - 2 - - 3 - - 6 - - 12 - required: - - interval - - intervalCount - type: object - maxQuantity: - type: number - required: - - price - - quantity - - hidden - type: object - description: 'Will be used to create an invoice item. The price must be in cents: 2000 for $20.' - pro: - properties: - tier: - type: number - price: - type: number - quantity: - type: number - name: - type: string - hidden: - type: boolean - createdAt: - type: number - disabledAt: - nullable: true - type: number - frequency: - properties: - interval: - type: string - enum: - - month - intervalCount: - type: number - enum: - - 1 - - 2 - - 3 - - 6 - - 12 - required: - - interval - - intervalCount - type: object - maxQuantity: - type: number - required: - - price - - quantity - - hidden - type: object - description: 'Will be used to create an invoice item. The price must be in cents: 2000 for $20.' - enterprise: - properties: - tier: - type: number - price: - type: number - quantity: - type: number - name: - type: string - hidden: - type: boolean - createdAt: - type: number - disabledAt: - nullable: true - type: number - frequency: - properties: - interval: - type: string - enum: - - month - intervalCount: - type: number - enum: - - 1 - - 2 - - 3 - - 6 - - 12 - required: - - interval - - intervalCount - type: object - maxQuantity: - type: number - required: - - price - - quantity - - hidden - type: object - description: 'Will be used to create an invoice item. The price must be in cents: 2000 for $20.' - analytics: - properties: - tier: - type: number - price: - type: number - quantity: - type: number - name: - type: string - hidden: - type: boolean - createdAt: - type: number - disabledAt: - nullable: true - type: number - frequency: - properties: - interval: - type: string - enum: - - month - intervalCount: - type: number - enum: - - 1 - - 2 - - 3 - - 6 - - 12 - required: - - interval - - intervalCount - type: object - maxQuantity: - type: number - required: - - price - - quantity - - hidden - type: object - description: 'Will be used to create an invoice item. The price must be in cents: 2000 for $20.' - concurrentBuilds: - properties: - tier: - type: number - price: - type: number - quantity: - type: number - name: - type: string - hidden: - type: boolean - createdAt: - type: number - disabledAt: - nullable: true - type: number - frequency: - properties: - interval: - type: string - enum: - - month - intervalCount: - type: number - enum: - - 1 - - 2 - - 3 - - 6 - - 12 - required: - - interval - - intervalCount - type: object - maxQuantity: - type: number - required: - - price - - quantity - - hidden - type: object - description: 'Will be used to create an invoice item. The price must be in cents: 2000 for $20.' - passwordProtection: - properties: - tier: - type: number - price: - type: number - quantity: - type: number - name: - type: string - hidden: - type: boolean - createdAt: - type: number - disabledAt: - nullable: true - type: number - frequency: - properties: - interval: - type: string - enum: - - month - intervalCount: - type: number - enum: - - 1 - - 2 - - 3 - - 6 - - 12 - required: - - interval - - intervalCount - type: object - maxQuantity: - type: number - required: - - price - - quantity - - hidden - type: object - description: 'Will be used to create an invoice item. The price must be in cents: 2000 for $20.' - previewDeploymentSuffix: - properties: - tier: - type: number - price: - type: number - quantity: - type: number - name: - type: string - hidden: - type: boolean - createdAt: - type: number - disabledAt: - nullable: true - type: number - frequency: - properties: - interval: - type: string - enum: - - month - intervalCount: - type: number - enum: - - 1 - - 2 - - 3 - - 6 - - 12 - required: - - interval - - intervalCount - type: object - maxQuantity: - type: number - required: - - price - - quantity - - hidden - type: object - description: 'Will be used to create an invoice item. The price must be in cents: 2000 for $20.' - saml: - properties: - tier: - type: number - price: - type: number - quantity: - type: number - name: - type: string - hidden: - type: boolean - createdAt: - type: number - disabledAt: - nullable: true - type: number - frequency: - properties: - interval: - type: string - enum: - - month - intervalCount: - type: number - enum: - - 1 - - 2 - - 3 - - 6 - - 12 - required: - - interval - - intervalCount - type: object - maxQuantity: - type: number - required: - - price - - quantity - - hidden - type: object - description: 'Will be used to create an invoice item. The price must be in cents: 2000 for $20.' - teamSeats: - properties: - tier: - type: number - price: - type: number - quantity: - type: number - name: - type: string - hidden: - type: boolean - createdAt: - type: number - disabledAt: - nullable: true - type: number - frequency: - properties: - interval: - type: string - enum: - - month - intervalCount: - type: number - enum: - - 1 - - 2 - - 3 - - 6 - - 12 - required: - - interval - - intervalCount - type: object - maxQuantity: - type: number - required: - - price - - quantity - - hidden - type: object - description: 'Will be used to create an invoice item. The price must be in cents: 2000 for $20.' - webAnalytics: - properties: - tier: - type: number - price: - type: number - quantity: - type: number - name: - type: string - hidden: - type: boolean - createdAt: - type: number - disabledAt: - nullable: true - type: number - frequency: - properties: - interval: - type: string - enum: - - month - intervalCount: - type: number - enum: - - 1 - - 2 - - 3 - - 6 - - 12 - required: - - interval - - intervalCount - type: object - maxQuantity: - type: number - required: - - price - - quantity - - hidden - type: object - description: 'Will be used to create an invoice item. The price must be in cents: 2000 for $20.' - analyticsUsage: - properties: - tier: - type: number - price: - type: number - batch: - type: number - threshold: - type: number - name: - type: string - hidden: - type: boolean - disabledAt: - nullable: true - type: number - enabledAt: - nullable: true - type: number - required: - - price - - batch - - threshold - - hidden - type: object - artifacts: - properties: - tier: - type: number - price: - type: number - batch: - type: number - threshold: - type: number - name: - type: string - hidden: - type: boolean - disabledAt: - nullable: true - type: number - enabledAt: - nullable: true - type: number - required: - - price - - batch - - threshold - - hidden - type: object - bandwidth: - properties: - tier: - type: number - price: - type: number - batch: - type: number - threshold: - type: number - name: - type: string - hidden: - type: boolean - disabledAt: - nullable: true - type: number - enabledAt: - nullable: true - type: number - required: - - price - - batch - - threshold - - hidden - type: object - cronJobInvocation: - properties: - tier: - type: number - price: - type: number - batch: - type: number - threshold: - type: number - name: - type: string - hidden: - type: boolean - disabledAt: - nullable: true - type: number - enabledAt: - nullable: true - type: number - required: - - price - - batch - - threshold - - hidden - type: object - dataCacheRead: - properties: - tier: - type: number - price: - type: number - batch: - type: number - threshold: - type: number - name: - type: string - hidden: - type: boolean - disabledAt: - nullable: true - type: number - enabledAt: - nullable: true - type: number - required: - - price - - batch - - threshold - - hidden - type: object - dataCacheRevalidation: - properties: - tier: - type: number - price: - type: number - batch: - type: number - threshold: - type: number - name: - type: string - hidden: - type: boolean - disabledAt: - nullable: true - type: number - enabledAt: - nullable: true - type: number - required: - - price - - batch - - threshold - - hidden - type: object - dataCacheWrite: - properties: - tier: - type: number - price: - type: number - batch: - type: number - threshold: - type: number - name: - type: string - hidden: - type: boolean - disabledAt: - nullable: true - type: number - enabledAt: - nullable: true - type: number - required: - - price - - batch - - threshold - - hidden - type: object - edgeConfigRead: - properties: - tier: - type: number - price: - type: number - batch: - type: number - threshold: - type: number - name: - type: string - hidden: - type: boolean - disabledAt: - nullable: true - type: number - enabledAt: - nullable: true - type: number - required: - - price - - batch - - threshold - - hidden - type: object - edgeConfigWrite: - properties: - tier: - type: number - price: - type: number - batch: - type: number - threshold: - type: number - name: - type: string - hidden: - type: boolean - disabledAt: - nullable: true - type: number - enabledAt: - nullable: true - type: number - required: - - price - - batch - - threshold - - hidden - type: object - edgeFunctionExecutionUnits: - properties: - tier: - type: number - price: - type: number - batch: - type: number - threshold: - type: number - name: - type: string - hidden: - type: boolean - disabledAt: - nullable: true - type: number - enabledAt: - nullable: true - type: number - required: - - price - - batch - - threshold - - hidden - type: object - edgeMiddlewareInvocations: - properties: - tier: - type: number - price: - type: number - batch: - type: number - threshold: - type: number - name: - type: string - hidden: - type: boolean - disabledAt: - nullable: true - type: number - enabledAt: - nullable: true - type: number - required: - - price - - batch - - threshold - - hidden - type: object - monitoringMetric: - properties: - tier: - type: number - price: - type: number - batch: - type: number - threshold: - type: number - name: - type: string - hidden: - type: boolean - disabledAt: - nullable: true - type: number - enabledAt: - nullable: true - type: number - required: - - price - - batch - - threshold - - hidden - type: object - postgresComputeTime: - properties: - tier: - type: number - price: - type: number - batch: - type: number - threshold: - type: number - name: - type: string - hidden: - type: boolean - disabledAt: - nullable: true - type: number - enabledAt: - nullable: true - type: number - required: - - price - - batch - - threshold - - hidden - type: object - postgresDatabase: - properties: - tier: - type: number - price: - type: number - batch: - type: number - threshold: - type: number - name: - type: string - hidden: - type: boolean - disabledAt: - nullable: true - type: number - enabledAt: - nullable: true - type: number - required: - - price - - batch - - threshold - - hidden - type: object - postgresDataStorage: - properties: - tier: - type: number - price: - type: number - batch: - type: number - threshold: - type: number - name: - type: string - hidden: - type: boolean - disabledAt: - nullable: true - type: number - enabledAt: - nullable: true - type: number - required: - - price - - batch - - threshold - - hidden - type: object - postgresDataTransfer: - properties: - tier: - type: number - price: - type: number - batch: - type: number - threshold: - type: number - name: - type: string - hidden: - type: boolean - disabledAt: - nullable: true - type: number - enabledAt: - nullable: true - type: number - required: - - price - - batch - - threshold - - hidden - type: object - postgresWrittenData: - properties: - tier: - type: number - price: - type: number - batch: - type: number - threshold: - type: number - name: - type: string - hidden: - type: boolean - disabledAt: - nullable: true - type: number - enabledAt: - nullable: true - type: number - required: - - price - - batch - - threshold - - hidden - type: object - serverlessFunctionExecution: - properties: - tier: - type: number - price: - type: number - batch: - type: number - threshold: - type: number - name: - type: string - hidden: - type: boolean - disabledAt: - nullable: true - type: number - enabledAt: - nullable: true - type: number - required: - - price - - batch - - threshold - - hidden - type: object - sourceImages: - properties: - tier: - type: number - price: - type: number - batch: - type: number - threshold: - type: number - name: - type: string - hidden: - type: boolean - disabledAt: - nullable: true - type: number - enabledAt: - nullable: true - type: number - required: - - price - - batch - - threshold - - hidden - type: object - storageRedisTotalBandwidthInBytes: - properties: - tier: - type: number - price: - type: number - batch: - type: number - threshold: - type: number - name: - type: string - hidden: - type: boolean - disabledAt: - nullable: true - type: number - enabledAt: - nullable: true - type: number - required: - - price - - batch - - threshold - - hidden - type: object - storageRedisTotalCommands: - properties: - tier: - type: number - price: - type: number - batch: - type: number - threshold: - type: number - name: - type: string - hidden: - type: boolean - disabledAt: - nullable: true - type: number - enabledAt: - nullable: true - type: number - required: - - price - - batch - - threshold - - hidden - type: object - storageRedisTotalDailyAvgStorageInBytes: - properties: - tier: - type: number - price: - type: number - batch: - type: number - threshold: - type: number - name: - type: string - hidden: - type: boolean - disabledAt: - nullable: true - type: number - enabledAt: - nullable: true - type: number - required: - - price - - batch - - threshold - - hidden - type: object - storageRedisTotalDatabases: - properties: - tier: - type: number - price: - type: number - batch: - type: number - threshold: - type: number - name: - type: string - hidden: - type: boolean - disabledAt: - nullable: true - type: number - enabledAt: - nullable: true - type: number - required: - - price - - batch - - threshold - - hidden - type: object - webAnalyticsEvent: - properties: - tier: - type: number - price: - type: number - batch: - type: number - threshold: - type: number - name: - type: string - hidden: - type: boolean - disabledAt: - nullable: true - type: number - enabledAt: - nullable: true - type: number - required: - - price - - batch - - threshold - - hidden - type: object - type: object - invoiceSettings: - properties: - footer: - type: string - type: object - subscriptions: - nullable: true - items: - properties: - id: + slug: + type: string + id: + type: string + fallbackEnvironment: + type: string + enablePolyrepoBranchRouting: + type: boolean + enum: + - false + - true + required: + - id + type: object + required: + - updatedMicrofrontendsGroup + type: object + '400': + description: |- + One of the provided values in the request body is invalid. + One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + parameters: + - name: group_id + in: path + required: true + schema: + type: string + - description: The Team identifier to perform the request on behalf of. + in: path + name: team_id + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + required: true + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + requestBody: + content: + application/json: + schema: + type: object + properties: + name: + type: string + example: MFE Group 1 + description: The new name for the existing microfrontends group. + fallbackEnvironment: + type: string + description: The new fallback environment for the microfrontends group. Must be "SAME_ENV", "PRODUCTION", or a valid custom environment slug from the default app. + enablePolyrepoBranchRouting: + type: boolean + description: Whether Preview Deployments can link to branches with the same name in other Git repositories. + delete: + description: Deletes a microfrontends group from the team associated with the group ID. + operationId: deleteMicrofrontendsGroup + security: + - bearerToken: [] + summary: Delete a microfrontends group + tags: + - teams + responses: + '200': + description: '' + content: + application/json: + schema: + type: string + description: (opaque JSON object) + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + '500': + description: '' + parameters: + - name: group_id + description: The microfrontend group ID to delete. + in: path + required: true + schema: + type: string + example: mfe_ + description: The microfrontend group ID to delete. + - description: The Team identifier to perform the request on behalf of. + in: path + name: team_id + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + required: true + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug +components: + schemas: + InvitedTeamMember: + properties: + uid: + type: string + description: The ID of the invited user + example: kr1PsOIzqEL5Xg6M4VZcZosf + username: + type: string + description: The username of the invited user + example: john-doe + email: + type: string + description: The email of the invited user. + example: john@user.co + role: + type: string + enum: + - BILLING + - CONTRIBUTOR + - DEVELOPER + - MEMBER + - OWNER + - SECURITY + - VIEWER + - VIEWER_FOR_PLUS + description: The role used for the invitation + example: MEMBER + teamRoles: + items: + type: string + enum: + - BILLING + - CONTRIBUTOR + - DEVELOPER + - MEMBER + - OWNER + - SECURITY + - VIEWER + - VIEWER_FOR_PLUS + description: The team roles of the user + example: + - MEMBER + type: array + description: The team roles of the user + example: + - MEMBER + teamPermissions: + items: + type: string + enum: + - AiGatewayApiKeyOwnedBySelf + - AiGatewayBudgetManager + - AiGatewayCredits + - AiGatewaySettings + - AiGatewayTranscriptsManager + - AiGatewayTranscriptsViewer + - ConnectorManager + - CreateProject + - EnvVariableManager + - EnvironmentManager + - FullProductionDeployment + - IntegrationManager + - OrgAdmin + - OrgViewer + - UsageViewer + - V0Builder + - V0Chatter + - V0Viewer + - WorkflowDecryptor + description: The team permissions of the user + example: + - CreateProject + type: array + description: The team permissions of the user + example: + - CreateProject + required: + - email + - role + - uid + - username + type: object + description: The member was successfully added to the team. + Team: + properties: + connect: + properties: + enabled: + type: boolean + enum: + - false + - true + type: object + creatorId: + type: string + description: The ID of the user who created the Team. + example: R6efeCJQ2HKXywuasPDc0fOWB + updatedAt: + type: number + description: Timestamp (in milliseconds) of when the Team was last updated. + example: 1611796915677 + emailDomain: + nullable: true + type: string + description: Hostname that'll be matched with emails on sign-up to automatically join the Team. + example: example.com + saml: + properties: + connection: + properties: + type: + type: string + description: The Identity Provider "type", for example Okta. + example: OktaSAML + state: + type: string + description: Current state of the connection. + example: active + connectedAt: + type: number + description: Timestamp (in milliseconds) of when the configuration was connected. + example: 1611796915677 + lastReceivedWebhookEvent: + type: number + description: Timestamp (in milliseconds) of when the last webhook event was received from WorkOS. + example: 1611796915677 + lastSyncedAt: + type: number + description: Timestamp (in milliseconds) of when the last directory sync was performed. + example: 1611796915677 + syncState: + type: string + enum: + - ACTIVE + - SETUP + description: 'Controls whether directory sync events are processed. - ''SETUP'': Directory connected but role mappings not yet configured. Events are acknowledged but not processed. - ''ACTIVE'': Fully configured. Events are processed normally. - undefined: Legacy directory (pre-feature), treat as ''ACTIVE'' for backwards compatibility.' + status: + type: string + required: + - connectedAt + - state + - status + - type + type: object + description: Information for the SAML Single Sign-On configuration. + directory: + properties: + type: + type: string + description: The Identity Provider "type", for example Okta. + example: OktaSAML + state: + type: string + description: Current state of the connection. + example: active + connectedAt: + type: number + description: Timestamp (in milliseconds) of when the configuration was connected. + example: 1611796915677 + lastReceivedWebhookEvent: + type: number + description: Timestamp (in milliseconds) of when the last webhook event was received from WorkOS. + example: 1611796915677 + lastSyncedAt: + type: number + description: Timestamp (in milliseconds) of when the last directory sync was performed. + example: 1611796915677 + syncState: + type: string + enum: + - ACTIVE + - SETUP + description: 'Controls whether directory sync events are processed. - ''SETUP'': Directory connected but role mappings not yet configured. Events are acknowledged but not processed. - ''ACTIVE'': Fully configured. Events are processed normally. - undefined: Legacy directory (pre-feature), treat as ''ACTIVE'' for backwards compatibility.' + required: + - connectedAt + - state + - type + type: object + description: Information for the Directory Sync configuration. + enforced: + type: boolean + enum: + - false + - true + description: When `true`, interactions with the Team **must** be done with an authentication token that has been authenticated with the Team's SAML Single Sign-On provider. + defaultRedirectUri: + type: string + enum: + - v0.app + - v0.dev + - vercel.com + description: The default redirect URI to use after successful SAML authentication. + roles: + additionalProperties: + oneOf: + - properties: + accessGroupId: + type: string + required: + - accessGroupId + type: object + description: When "Directory Sync" is configured, this object contains a mapping of which Directory Group (by ID) should be assigned to which Vercel Team "role". + - type: string + enum: + - BILLING + - CONTRIBUTOR + - DEVELOPER + - MEMBER + - OWNER + - SECURITY + - VIEWER + - VIEWER_FOR_PLUS + type: object + description: When "Directory Sync" is configured, this object contains a mapping of which Directory Group (by ID) should be assigned to which Vercel Team "role". + required: + - enforced + type: object + description: When "Single Sign-On (SAML)" is configured, this object contains information regarding the configuration of the Identity Provider (IdP). + inviteCode: + type: string + description: Code that can be used to join this Team. Only visible to Team owners. + example: hasihf9e89 + billing: + nullable: true + properties: + plan: + type: string + enum: + - enterprise + - hobby + - pro + required: + - plan + type: object + description: The team's billing plan. + description: + nullable: true + type: string + description: A short description of the Team. + example: Our mission is to make cloud computing accessible to everyone. + defaultRoles: + properties: + teamRoles: + items: + type: string + enum: + - BILLING + - CONTRIBUTOR + - DEVELOPER + - MEMBER + - OWNER + - SECURITY + - VIEWER + - VIEWER_FOR_PLUS + type: array + teamPermissions: + items: + type: string + enum: + - AiGatewayApiKeyOwnedBySelf + - AiGatewayBudgetManager + - AiGatewayCredits + - AiGatewaySettings + - AiGatewayTranscriptsManager + - AiGatewayTranscriptsViewer + - ConnectorManager + - CreateProject + - EnvVariableManager + - EnvironmentManager + - FullProductionDeployment + - IntegrationManager + - OrgAdmin + - OrgViewer + - UsageViewer + - V0Builder + - V0Chatter + - V0Viewer + - WorkflowDecryptor + type: array + type: object + description: Default roles for the team. + stagingPrefix: + type: string + description: The prefix that is prepended to automatic aliases. + resourceConfig: + properties: + concurrentBuilds: + type: number + description: The total amount of concurrent builds that can be used. + elasticConcurrencyEnabled: + type: boolean + enum: + - false + - true + description: Whether every build for this team / user has elastic concurrency enabled automatically. + edgeConfigSize: + type: number + description: The maximum size in kilobytes of an Edge Config. Only specified if a custom limit is set. + edgeConfigs: + type: number + description: The maximum number of edge configs an account can create. + kvDatabases: + type: number + description: The maximum number of kv databases an account can create. + blobStores: + type: number + description: The maximum number of blob stores an account can create. + postgresDatabases: + type: number + description: The maximum number of postgres databases an account can create. + customEnvironmentsPerProject: + type: number + description: The maximum number of custom environments allowed per project. + serverlessFunctionMaxMemorySize: + type: number + description: The maximum memory size (in MB) for a serverless function. Only specified if a custom limit is set. + buildEntitlements: + properties: + enhancedBuilds: + type: boolean + enum: + - false + - true + type: object + buildMachine: + properties: + default: + type: string + enum: + - basic + - elastic + - enhanced + - standard + - turbo + description: Default build machine type for new builds + type: object + description: Build machine configuration + type: object + previewDeploymentSuffix: + nullable: true + type: string + description: The hostname that is current set as preview deployment suffix. + example: example.dev + platform: + type: boolean + enum: + - false + - true + description: Whether the team is a platform team. + example: true + disableHardAutoBlocks: + type: number + enum: + - false + - true + remoteCaching: + properties: + enabled: + type: boolean + enum: + - false + - true + type: object + description: Is remote caching enabled for this team + defaultDeploymentProtection: + properties: + passwordProtection: + nullable: true + properties: + deploymentType: + type: string + required: + - deploymentType + type: object + ssoProtection: + nullable: true + properties: + deploymentType: + type: string + required: + - deploymentType + type: object + type: object + description: Default deployment protection for this team null indicates protection is disabled + defaultPassport: + nullable: true + properties: + connectorId: + type: string + description: Default Passport configuration for new projects in this team. + deploymentType: + type: string + enum: + - all + - all_except_custom_domains + - preview + - prod_deployment_urls_and_all_previews + description: Default Passport configuration for new projects in this team. + required: + - connectorId + - deploymentType + type: object + description: Default Passport configuration for new projects in this team. + defaultExpirationSettings: + properties: + expirationDays: + type: number + description: Number of days to keep non-production deployments (mostly preview deployments) before soft deletion. + expirationDaysProduction: + type: number + description: Number of days to keep production deployments before soft deletion. + expirationDaysCanceled: + type: number + description: Number of days to keep canceled deployments before soft deletion. + expirationDaysErrored: + type: number + description: Number of days to keep errored deployments before soft deletion. + deploymentsToKeep: + type: number + description: Minimum number of production deployments to keep for this project, even if they are over the production expiration limit. + type: object + description: Default deployment expiration settings for this team + defaultProjectJobs: + properties: + lint: + properties: + targets: + items: + type: string + type: array + description: Default job configuration applied to new projects created in this team. + required: + - targets + type: object + description: Default job configuration applied to new projects created in this team. + typecheck: + properties: + targets: + items: + type: string + type: array + description: Default job configuration applied to new projects created in this team. + required: + - targets + type: object + description: Default job configuration applied to new projects created in this team. + mfe-config-present: + properties: + targets: + items: + type: string + type: array + description: Default job configuration applied to new projects created in this team. + required: + - targets + type: object + description: Default job configuration applied to new projects created in this team. + type: object + description: Default job configuration applied to new projects created in this team. + enablePreviewFeedback: + nullable: true + type: string + enum: + - default + - default-force + - 'off' + - off-force + - 'on' + - on-force + - null + description: Whether toolbar is enabled on preview deployments + enableProductionFeedback: + nullable: true + type: string + enum: + - default + - default-force + - 'off' + - off-force + - 'on' + - on-force + - null + description: Whether toolbar is enabled on production deployments + sensitiveEnvironmentVariablePolicy: + nullable: true + type: string + enum: + - default + - 'off' + - 'on' + - null + description: Sensitive environment variable policy for this team + disjunctiveProductionSecretPolicy: + nullable: true + type: string + enum: + - default + - 'off' + - 'on' + - null + description: Require production secrets to use a different value than preview or development. + hideIpAddresses: + nullable: true + type: boolean + enum: + - false + - true + - null + description: Indicates if IP addresses should be accessible in observability (o11y) tooling + hideIpAddressesInLogDrains: + nullable: true + type: boolean + enum: + - false + - true + - null + description: Indicates if IP addresses should be accessible in log drains + dpAccessRequestsMode: + type: string + enum: + - all + - email-domain + - none + description: Controls who can request access to protected deployments. + ipBuckets: + items: + properties: + bucket: + type: string + supportUntil: + type: number + default: + type: boolean + enum: + - false + - true + required: + - bucket + type: object + type: array + requireVerifiedCommits: + type: boolean + enum: + - false + - true + description: When enabled, all projects in the team require commits to be signed and verified by the git provider before deployments will be created. Projects may override this via `project.gitProviderOptions.requireVerifiedCommits` (gated by `Project:Update`). + disableRepositoryDispatchEvents: + type: boolean + enum: + - false + - true + description: Default for projects in the team. When `true`, projects in this team will not emit GitHub repository-dispatch events on deployment events unless the project explicitly overrides this setting via `project.gitProviderOptions.disableRepositoryDispatchEvents`. + strictDeploymentProtectionSettings: + properties: + enabled: + type: boolean + enum: + - false + - true + updatedAt: + type: number + required: + - enabled + - updatedAt + type: object + description: When enabled, deployment protection settings require stricter permissions (owner-only). + strictShareableLinks: + properties: + enabled: + type: boolean + enum: + - false + - true + updatedAt: + type: number + required: + - enabled + - updatedAt + type: object + description: When enabled, creating shareable links requires Owner role. + strictPasswordProtectionSettings: + properties: + enabled: + type: boolean + enum: + - false + - true + updatedAt: + type: number + required: + - enabled + - updatedAt + type: object + description: When enabled, adding, changing, or removing project password protection requires Owner role. + strictConnectors: + properties: + enabled: + type: boolean + enum: + - false + - true + updatedAt: + type: number + required: + - enabled + - updatedAt + type: object + description: When enabled, creating and managing connectors requires Owner role or the ConnectorManager permission. + nsnbConfig: + properties: + preference: + type: string + enum: + - auto-approval + - block + - manual-approval + required: + - preference + type: object + description: NSNB configuration for the team. + deploymentPolicy: + properties: + gitSources: + items: + properties: + sources: + items: + oneOf: + - properties: + provider: + type: string + enum: + - bitbucket + - github + org: + type: string + repo: type: string - trial: - nullable: true - properties: - start: - type: number - end: - type: number - required: - - start - - end - type: object - period: - properties: - start: - type: number - end: - type: number - required: - - start - - end - type: object - frequency: - properties: - interval: - type: string - enum: - - month - - day - - week - - year - intervalCount: - type: number - required: - - interval - - intervalCount - type: object - discount: - nullable: true - properties: - id: - type: string - coupon: - properties: - id: - type: string - name: - nullable: true - type: string - amountOff: - nullable: true - type: number - percentageOff: - nullable: true - type: number - durationInMonths: - nullable: true - type: number - duration: - type: string - enum: - - forever - - repeating - - once - required: - - id - - name - - amountOff - - percentageOff - - durationInMonths - - duration - type: object - required: - - id - - coupon - type: object - items: - items: - properties: - id: - type: string - priceId: - type: string - productId: - type: string - amount: - type: number - quantity: - type: number - required: - - id - - priceId - - productId - - amount - - quantity - type: object - type: array required: - - id - - trial - - period - - frequency - - discount - - items + - org + - provider type: object - type: array - controls: - nullable: true - properties: - analyticsSampleRateInPercent: - nullable: true - type: number - analyticsSpendLimitInDollars: - nullable: true - type: number - type: object - purchaseOrder: - nullable: true - type: string - status: - type: string - enum: - - active - - trialing - - overdue - - expired - - canceled - pricingExperiment: - type: string - enum: - - august-2022 - orbMigrationScheduledAt: - nullable: true - type: number - required: - - period - - plan - type: object + description: Allowlist entry for GitHub and Bitbucket, whose repos are identified by a flat `org`/`repo` (Bitbucket's workspace/owner maps to `org`, its repo slug to `repo`). Omit `repo` to match any repo in the org. Org is matched case-insensitively. + - properties: + provider: + type: string + enum: + - gitlab + namespace: + type: string + project: + type: string + required: + - namespace + - provider + type: object + description: Allowlist entry for GitLab, which uses nested groups rather than a flat org/repo. `namespace` is the full group path (e.g. `group` or `group/subgroup`); `project` is the leaf project name. Omit `project` to match any project under the namespace. Namespace is matched case-insensitively. + type: array + enabled: + type: boolean + enum: + - false + - true + environments: + items: + oneOf: + - properties: + type: + type: string + enum: + - system + target: + type: string + enum: + - preview + - production + required: + - target + - type + type: object + - properties: + type: + type: string + enum: + - custom + environmentId: + type: string + required: + - environmentId + - type + type: object + type: array required: - - id - - slug - - billing + - enabled + - environments + - sources type: object - description: The team was created successfully - '400': - description: |- - One of the provided values in the request body is invalid. - The slug is already in use - '403': - description: You do not have permission to access this resource. - parameters: [] - requestBody: - content: - application/json: - schema: - type: object - additionalProperties: false - required: - - slug - properties: - slug: - example: a-random-team - description: The desired slug for the Team - type: string - maxLength: 48 - name: - example: A Random Team - description: The desired name for the Team. It will be generated from the provided slug if nothing is provided - type: string - maxLength: 256 - '/v1/teams/{teamId}': - delete: - description: Delete a team under your account. You need to send a `DELETE` request with the desired team `id`. An optional array of reasons for deletion may also be sent. - operationId: deleteTeam - security: - - bearerToken: [] - summary: Delete a Team - tags: - - teams - responses: - '200': - description: The Team was successfully deleted - content: - application/json: - schema: + description: '`enabled: true` with empty `sources` is deny-all.' + type: array + deploymentSources: + items: properties: - id: - type: string - description: The ID of the deleted Team - example: team_LLHUOMOoDlqOp8wPE4kFo9pE - newDefaultTeamIdError: + sources: + items: + type: string + enum: + - cli + - deploy-hook + - git + - integration + - rest-api + - v0 + description: 'Customer-configurable deployment sources. Every deploy classifies to exactly one. JSON schema in `packages/deployment-policy/schemas/body.ts` enumerates exactly these values. - `''git''` — git provider webhook. - `''cli''` — Vercel CLI (legacy classic-token CLI and SIWV CLI both). - `''rest-api''` — direct user/team-token REST upload. Does NOT cover deploy hooks, Marketplace integrations, or first-party app tokens. - `''deploy-hook''` — project deploy-hook URL. The URL is the credential. - `''integration''` — third-party Marketplace actor: Marketplace integration token, user-delegated OAuth from a Marketplace app, or an unrecognized third-party Vercel App. First-party Vercel Apps are never `''integration''`. - `''v0''` — the v0 product surface (entitlement-gated). v0 deploys through the CLI under the hood, but classifies as its own source so a team can allow or deny v0 independently of `''cli''`. First-party Vercel apps (Toolbar, etc.) classify as `''first-party''` — see `ClassifiedSource` in `./checks`. They''re not in this union because they aren''t customer-configurable; they bypass `checkDeploymentSources` entirely. v0 is intentionally NOT among them: like the CLI, it''s a real product surface and is policy-controllable.' + type: array + enabled: type: boolean - description: 'Signifies whether the default team update has failed, when newDefaultTeamId is provided in request query.' - example: true + enum: + - false + - true + environments: + items: + oneOf: + - properties: + type: + type: string + enum: + - system + target: + type: string + enum: + - preview + - production + required: + - target + - type + type: object + - properties: + type: + type: string + enum: + - custom + environmentId: + type: string + required: + - environmentId + - type + type: object + type: array required: - - id + - enabled + - environments + - sources type: object - description: The Team was successfully deleted - '400': - description: |- - One of the provided values in the request body is invalid. - One of the provided values in the request query is invalid. - '401': - description: '' - '402': - description: '' - '403': - description: |- - You do not have permission to access this resource. - The authenticated user can't access the team - '404': - description: The team was not found - '409': - description: '' - parameters: - - name: newDefaultTeamId - description: Id of the team to be set as the new default team - in: query - required: false - schema: - type: string - description: Id of the team to be set as the new default team - example: team_LLHUOMOoDlqOp8wPE4kFo9pE - - description: The Team identifier or slug to perform the request on behalf of. - in: path - name: teamId - schema: + description: '`enabled: true` with empty `sources` is deny-all.' + type: array + type: object + description: Composable deployment-time policy for the team. Used as the default for every project on the team, with optional per-project overrides on `project.deploymentPolicy`. + personalAccessTokensInvalidatedAt: + type: number + description: Timestamp (ms) after which personal access tokens created at or before this time are considered invalid for this team. + appTokensInvalidatedAt: + type: number + description: Timestamp (ms) after which Vercel App tokens created at or before this time are considered invalid for this team. + apiKeysInvalidatedAt: + type: number + description: Timestamp (ms) after which API keys created at or before this time are considered invalid for this team. + integrationTokensInvalidatedAt: + type: number + description: Timestamp (ms) after which integration tokens created at or before this time are considered invalid for this team. + id: + type: string + description: The Team's unique identifier. + example: team_nllPyCtREAqxxdyFKbbMDlxd + slug: + type: string + description: The Team's slug, which is unique across the Vercel platform. + example: my-team + name: + nullable: true + type: string + description: Name associated with the Team account, or `null` if none has been provided. + example: My Team + avatar: + nullable: true + type: string + description: The ID of the file used as avatar for this Team. + example: 6eb07268bcfadd309905ffb1579354084c24655c + membership: + properties: + uid: + type: string + entitlements: + items: + properties: + entitlement: + type: string + required: + - entitlement + type: object + type: array + teamId: + type: string + confirmed: + type: boolean + enum: + - true + accessRequestedAt: + type: number + role: + type: string + enum: + - BILLING + - CONTRIBUTOR + - DEVELOPER + - MEMBER + - OWNER + - SECURITY + - VIEWER + - VIEWER_FOR_PLUS + teamRoles: + items: + type: string + enum: + - BILLING + - CONTRIBUTOR + - DEVELOPER + - MEMBER + - OWNER + - SECURITY + - VIEWER + - VIEWER_FOR_PLUS + type: array + teamPermissions: + items: + type: string + enum: + - AiGatewayApiKeyOwnedBySelf + - AiGatewayBudgetManager + - AiGatewayCredits + - AiGatewaySettings + - AiGatewayTranscriptsManager + - AiGatewayTranscriptsViewer + - ConnectorManager + - CreateProject + - EnvVariableManager + - EnvironmentManager + - FullProductionDeployment + - IntegrationManager + - OrgAdmin + - OrgViewer + - UsageViewer + - V0Builder + - V0Chatter + - V0Viewer + - WorkflowDecryptor + type: array + createdAt: + type: number + created: + type: number + joinedFrom: + properties: + origin: + type: string + enum: + - account-update + - bitbucket + - dsync + - feedback + - github + - gitlab + - import + - link + - mail + - nsnb-auto-approve + - nsnb-hobby-upgrade + - nsnb-invite + - nsnb-redeploy + - nsnb-redeploy-attribution-card + - nsnb-request-access + - nsnb-viewer-upgrade + - organization-teams + - saml + - teams + commitId: + type: string + repoId: + type: string + repoPath: + type: string + gitUserId: + oneOf: + - type: string + - type: number + gitUserLogin: + type: string + ssoUserId: + type: string + ssoConnectedAt: + type: number + idpUserId: + type: string + dsyncUserId: + type: string + dsyncConnectedAt: + type: number + required: + - origin + type: object + required: + - confirmed + - created + - createdAt + - role + type: object + description: The membership of the authenticated User in relation to the Team. + createdAt: + type: number + description: UNIX timestamp (in milliseconds) when the Team was created. + example: 1630748523395 + parentId: + type: string + description: The organizationId for teams that belong to an organization (set on both the organization's root team and its child teams). + example: org_nllPyCtREAqxxdyFKbbMDlxd + orgRootTeamId: + type: string + description: Best-effort ID of the organization’s root billing team. When present, compare `orgRootTeamId === id` to identify the root team. It may be omitted even when `parentId` is set if organization resolution fails or the referenced organization is missing. Always omitted for non-organization teams. + example: team_nllPyCtREAqxxdyFKbbMDlxd + required: + - avatar + - billing + - createdAt + - creatorId + - description + - id + - name + - slug + - stagingPrefix + - updatedAt + type: object + description: Data representing a Team. + additionalProperties: true + TeamLimited: + properties: + limited: + type: boolean + enum: + - true + description: Property indicating that this Team data contains only limited information, due to the authentication token missing privileges to read the full Team data or due to team having MFA enforced and the user not having MFA enabled. Re-login with the Team's configured SAML Single Sign-On provider in order to upgrade the authentication token with the necessary privileges. + limitedBy: + items: type: string - required: true - requestBody: - content: - application/json: - schema: + enum: + - invalidated + - mfa + - scope + type: array + saml: + properties: + connection: + properties: + type: + type: string + description: The Identity Provider "type", for example Okta. + example: OktaSAML + state: + type: string + description: Current state of the connection. + example: active + connectedAt: + type: number + description: Timestamp (in milliseconds) of when the configuration was connected. + example: 1611796915677 + lastReceivedWebhookEvent: + type: number + description: Timestamp (in milliseconds) of when the last webhook event was received from WorkOS. + example: 1611796915677 + lastSyncedAt: + type: number + description: Timestamp (in milliseconds) of when the last directory sync was performed. + example: 1611796915677 + syncState: + type: string + enum: + - ACTIVE + - SETUP + description: 'Controls whether directory sync events are processed. - ''SETUP'': Directory connected but role mappings not yet configured. Events are acknowledged but not processed. - ''ACTIVE'': Fully configured. Events are processed normally. - undefined: Legacy directory (pre-feature), treat as ''ACTIVE'' for backwards compatibility.' + status: + type: string + required: + - connectedAt + - state + - status + - type + type: object + description: Information for the SAML Single Sign-On configuration. + directory: + properties: + type: + type: string + description: The Identity Provider "type", for example Okta. + example: OktaSAML + state: + type: string + description: Current state of the connection. + example: active + connectedAt: + type: number + description: Timestamp (in milliseconds) of when the configuration was connected. + example: 1611796915677 + lastReceivedWebhookEvent: + type: number + description: Timestamp (in milliseconds) of when the last webhook event was received from WorkOS. + example: 1611796915677 + lastSyncedAt: + type: number + description: Timestamp (in milliseconds) of when the last directory sync was performed. + example: 1611796915677 + syncState: + type: string + enum: + - ACTIVE + - SETUP + description: 'Controls whether directory sync events are processed. - ''SETUP'': Directory connected but role mappings not yet configured. Events are acknowledged but not processed. - ''ACTIVE'': Fully configured. Events are processed normally. - undefined: Legacy directory (pre-feature), treat as ''ACTIVE'' for backwards compatibility.' + required: + - connectedAt + - state + - type type: object - additionalProperties: false - properties: - reasons: - type: array - description: Optional array of objects that describe the reason why the team is being deleted. - items: - type: object - description: An object describing the reason why the team is being deleted. - required: - - slug - - description - additionalProperties: false - properties: - slug: - type: string - description: Idenitifier slug of the reason why the team is being deleted. - description: - type: string - description: Description of the reason why the team is being deleted. - '/v1/teams/{teamId}/invites/{inviteId}': - delete: - description: Delete an active Team invite code. - operationId: deleteTeamInviteCode - security: - - bearerToken: [] - summary: Delete a Team invite code - tags: - - teams - responses: - '200': - description: Successfully deleted Team invite code. - content: - application/json: - schema: + description: Information for the Directory Sync configuration. + enforced: + type: boolean + enum: + - false + - true + description: When `true`, interactions with the Team **must** be done with an authentication token that has been authenticated with the Team's SAML Single Sign-On provider. + required: + - enforced + type: object + description: When "Single Sign-On (SAML)" is configured, this object contains information that allows the client-side to identify whether or not this Team has SAML enforced. + id: + type: string + description: The Team's unique identifier. + example: team_nllPyCtREAqxxdyFKbbMDlxd + slug: + type: string + description: The Team's slug, which is unique across the Vercel platform. + example: my-team + name: + nullable: true + type: string + description: Name associated with the Team account, or `null` if none has been provided. + example: My Team + avatar: + nullable: true + type: string + description: The ID of the file used as avatar for this Team. + example: 6eb07268bcfadd309905ffb1579354084c24655c + membership: + properties: + uid: + type: string + entitlements: + items: properties: - id: + entitlement: type: string - description: ID of the team. required: - - id + - entitlement type: object - '400': - description: One of the provided values in the request query is invalid. - '401': - description: '' - '403': - description: |- - You do not have permission to access this resource. - Invite managed by directory sync - Not authorized to access this team. - '404': - description: |- - Team invite code not found. - No team found. - parameters: - - description: The Team identifier or slug to perform the request on behalf of. - in: path - name: teamId - schema: - type: string - required: true - - name: inviteId - description: The Team invite code ID. - in: path - required: true - schema: - type: string - description: The Team invite code ID. - example: 2wn2hudbr4chb1ecywo9dvzo7g9sscs6mzcz8htdde0txyom4l + type: array + teamId: + type: string + confirmed: + type: boolean + enum: + - true + accessRequestedAt: + type: number + role: + type: string + enum: + - BILLING + - CONTRIBUTOR + - DEVELOPER + - MEMBER + - OWNER + - SECURITY + - VIEWER + - VIEWER_FOR_PLUS + teamRoles: + items: + type: string + enum: + - BILLING + - CONTRIBUTOR + - DEVELOPER + - MEMBER + - OWNER + - SECURITY + - VIEWER + - VIEWER_FOR_PLUS + type: array + teamPermissions: + items: + type: string + enum: + - AiGatewayApiKeyOwnedBySelf + - AiGatewayBudgetManager + - AiGatewayCredits + - AiGatewaySettings + - AiGatewayTranscriptsManager + - AiGatewayTranscriptsViewer + - ConnectorManager + - CreateProject + - EnvVariableManager + - EnvironmentManager + - FullProductionDeployment + - IntegrationManager + - OrgAdmin + - OrgViewer + - UsageViewer + - V0Builder + - V0Chatter + - V0Viewer + - WorkflowDecryptor + type: array + createdAt: + type: number + created: + type: number + joinedFrom: + properties: + origin: + type: string + enum: + - account-update + - bitbucket + - dsync + - feedback + - github + - gitlab + - import + - link + - mail + - nsnb-auto-approve + - nsnb-hobby-upgrade + - nsnb-invite + - nsnb-redeploy + - nsnb-redeploy-attribution-card + - nsnb-request-access + - nsnb-viewer-upgrade + - organization-teams + - saml + - teams + commitId: + type: string + repoId: + type: string + repoPath: + type: string + gitUserId: + oneOf: + - type: string + - type: number + gitUserLogin: + type: string + ssoUserId: + type: string + ssoConnectedAt: + type: number + idpUserId: + type: string + dsyncUserId: + type: string + dsyncConnectedAt: + type: number + required: + - origin + type: object + required: + - confirmed + - created + - createdAt + - role + type: object + description: The membership of the authenticated User in relation to the Team. + createdAt: + type: number + description: UNIX timestamp (in milliseconds) when the Team was created. + example: 1630748523395 + parentId: + type: string + description: The organizationId for teams that belong to an organization (set on both the organization's root team and its child teams). + example: org_nllPyCtREAqxxdyFKbbMDlxd + orgRootTeamId: + type: string + description: Best-effort ID of the organization’s root billing team. When present, compare `orgRootTeamId === id` to identify the root team. It may be omitted even when `parentId` is set if organization resolution fails or the referenced organization is missing. Always omitted for non-organization teams. + example: team_nllPyCtREAqxxdyFKbbMDlxd + required: + - avatar + - createdAt + - id + - limited + - limitedBy + - name + - slug + type: object + description: A limited form of data representing a Team, due to the authentication token missing privileges to read the full Team data. + Pagination: + properties: + count: + type: number + description: Amount of items in the current page. + example: 20 + next: + nullable: true + type: number + description: Timestamp that must be used to request the next page. + example: 1540095775951 + prev: + nullable: true + type: number + description: Timestamp that must be used to request the previous page. + example: 1540095775951 + required: + - count + - next + - prev + type: object + description: This object contains information related to the pagination of the current request, including the necessary parameters to get the next or previous page of data. + x-stackQL-resources: + members: + id: vercel.teams.members + name: members + title: Members + methods: + list: + operation: + $ref: '#/paths/~1v3~1teams~1{team_id}~1members/get' + response: + mediaType: application/json + openAPIDocKey: '200' + objectKey: $.members + request: + nativeCasing: camel + config: + pagination: + requestToken: + key: until + location: query + responseToken: + key: $.pagination.next + location: body + queryParamPushdown: + top: + paramName: limit + maxValue: 100 + invite: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v2~1teams~1{team_id}~1members/post' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + join: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v1~1teams~1{team_id}~1members~1teams~1join/post' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + update: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v1~1teams~1{team_id}~1members~1{uid}/patch' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + remove: + operation: + $ref: '#/paths/~1v1~1teams~1{team_id}~1members~1{uid}/delete' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + delete_invite: + operation: + $ref: '#/paths/~1v1~1teams~1{team_id}~1invites~1{invite_id}/delete' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/members/methods/list' + insert: + - $ref: '#/components/x-stackQL-resources/members/methods/invite' + update: + - $ref: '#/components/x-stackQL-resources/members/methods/update' + delete: + - $ref: '#/components/x-stackQL-resources/members/methods/remove' + - $ref: '#/components/x-stackQL-resources/members/methods/delete_invite' + replace: [] + access_requests: + id: vercel.teams.access_requests + name: access_requests + title: Access Requests + methods: + create: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v1~1teams~1{team_id}~1request/post' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + get: + operation: + $ref: '#/paths/~1v1~1teams~1{team_id}~1request~1{user_id}/get' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/access_requests/methods/get' + insert: + - $ref: '#/components/x-stackQL-resources/access_requests/methods/create' + update: [] + delete: [] + replace: [] + teams: + id: vercel.teams.teams + name: teams + title: Teams + methods: + get: + operation: + $ref: '#/paths/~1v2~1teams~1{team_id}/get' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + update: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v2~1teams~1{team_id}/patch' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + list: + operation: + $ref: '#/paths/~1v2~1teams/get' + response: + mediaType: application/json + openAPIDocKey: '200' + objectKey: $.teams + request: + nativeCasing: camel + config: + pagination: + requestToken: + key: until + location: query + responseToken: + key: $.pagination.next + location: body + queryParamPushdown: + top: + paramName: limit + maxValue: 100 + create: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v1~1teams/post' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + update_dsync_roles: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v1~1teams~1{team_id}~1dsync-roles/post' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + delete: + operation: + $ref: '#/paths/~1v1~1teams~1{team_id}/delete' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/teams/methods/get' + - $ref: '#/components/x-stackQL-resources/teams/methods/list' + insert: + - $ref: '#/components/x-stackQL-resources/teams/methods/create' + update: + - $ref: '#/components/x-stackQL-resources/teams/methods/update' + delete: + - $ref: '#/components/x-stackQL-resources/teams/methods/delete' + replace: [] + microfrontend_groups: + id: vercel.teams.microfrontend_groups + name: microfrontend_groups + title: Microfrontend Groups + methods: + update: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v1~1teams~1{team_id}~1microfrontends~1{group_id}/patch' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + delete: + operation: + $ref: '#/paths/~1v1~1teams~1{team_id}~1microfrontends~1{group_id}/delete' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + sqlVerbs: + select: [] + insert: [] + update: + - $ref: '#/components/x-stackQL-resources/microfrontend_groups/methods/update' + delete: + - $ref: '#/components/x-stackQL-resources/microfrontend_groups/methods/delete' + replace: [] +servers: + - url: https://api.vercel.com diff --git a/provider-dev/openapi/src/vercel/v00.00.00000/services/user.yaml b/provider-dev/openapi/src/vercel/v00.00.00000/services/user.yaml index 5d0fb5e..9514da9 100644 --- a/provider-dev/openapi/src/vercel/v00.00.00000/services/user.yaml +++ b/provider-dev/openapi/src/vercel/v00.00.00000/services/user.yaml @@ -1,1477 +1,8363 @@ openapi: 3.0.3 -servers: - - url: 'https://api.vercel.com' - description: Production API info: - contact: - email: support@vercel.com - name: Vercel Support - url: 'https://vercel.com/support' + title: user API + description: vercel user API version: 0.0.1 - title: Vercel API - user - description: user -components: - schemas: - UserEvent: - properties: - id: - type: string - description: The unique identifier of the Event. - example: uev_bfmMjiMnXfnPbT97dGdpJbCN - text: - type: string - description: The human-readable text of the Event. - example: You logged in via GitHub - entities: - items: - properties: - type: - type: string - enum: - - author - - bitbucket_login - - bold - - deployment_host - - dns_record - - git_link - - github_login - - gitlab_login - - hook_name - - integration - - edge-config - - link - - project_name - - scaling_rules - - env_var_name - - target - - store - - system - description: The type of entity. - example: author - start: - type: number - description: The index of where the entity begins within the `text` (inclusive). - example: 0 - end: - type: number - description: The index of where the entity ends within the `text` (non-inclusive). - example: 3 - required: - - type - - start - - end - type: object - description: A list of "entities" within the event `text`. Useful for enhancing the displayed text with additional styling and links. - type: array - description: A list of "entities" within the event `text`. Useful for enhancing the displayed text with additional styling and links. - createdAt: - type: number - description: Timestamp (in milliseconds) of when the event was generated. - example: 1632859321020 - user: - properties: - avatar: - type: string - email: - type: string - slug: - type: string - uid: - type: string - username: - type: string - required: - - avatar - - email - - uid - - username - type: object - description: Metadata for the User who generated the event. - userId: - type: string - description: The unique identifier of the User who generated the event. - example: zTuNVUXEAvvnNN3IaqinkyMw - required: - - id - - text - - entities - - createdAt - - userId - type: object - description: Array of events generated by the User. - AuthUser: - properties: - createdAt: - type: number - description: UNIX timestamp (in milliseconds) when the User account was created. - example: 1630748523395 - softBlock: - nullable: true - properties: - blockedAt: - type: number - reason: - type: string - enum: - - SUBSCRIPTION_CANCELED - - SUBSCRIPTION_EXPIRED - - UNPAID_INVOICE - - ENTERPRISE_TRIAL_ENDED - - FAIR_USE_LIMITS_EXCEEDED - - BLOCKED_FOR_PLATFORM_ABUSE - blockedDueToOverageType: - type: string - enum: - - blobStores - - analyticsUsage - - artifacts - - bandwidth - - cronJobInvocation - - dataCacheRead - - dataCacheRevalidation - - dataCacheWrite - - edgeConfigRead - - edgeConfigWrite - - edgeFunctionExecutionUnits - - edgeMiddlewareInvocations - - monitoringMetric - - postgresComputeTime - - postgresDatabase - - postgresDataStorage - - postgresDataTransfer - - postgresWrittenData - - serverlessFunctionExecution - - sourceImages - - storageRedisTotalBandwidthInBytes - - storageRedisTotalCommands - - storageRedisTotalDailyAvgStorageInBytes - - storageRedisTotalDatabases - - webAnalyticsEvent - - blobTotalSimpleRequests - - blobTotalAdvancedRequests - - blobTotalAvgSizeInBytes - - blobTotalGetResponseObjectSizeInBytes - required: - - blockedAt - - reason - type: object - description: 'When the User account has been "soft blocked", this property will contain the date when the restriction was enacted, and the identifier for why.' - billing: - nullable: true - properties: - currency: - type: string - enum: - - usd - - eur - cancelation: - nullable: true - type: number - period: - nullable: true - properties: - start: - type: number - end: - type: number - required: - - start - - end - type: object - contract: - nullable: true - properties: - start: - type: number - end: - type: number - required: - - start - - end - type: object - plan: - type: string - enum: - - pro - - enterprise - - hobby - platform: - type: string - enum: - - stripe - - stripeTestMode - orbCustomerId: - type: string - syncedAt: - type: number - programType: - type: string - enum: - - startup - - agency - trial: - nullable: true - properties: - start: - type: number - end: - type: number - required: - - start - - end - type: object - email: - nullable: true - type: string - tax: - nullable: true - properties: - type: - type: string - id: - type: string - required: - - type - - id - type: object - language: - nullable: true - type: string - address: - nullable: true - properties: - line1: - type: string - line2: - type: string - postalCode: - type: string - city: - type: string - country: - type: string - state: - type: string - required: - - line1 - type: object - name: - nullable: true - type: string - invoiceItems: - nullable: true - properties: - concurrentBuilds: - properties: - tier: - type: number - price: - type: number - quantity: - type: number - name: - type: string - hidden: - type: boolean - createdAt: - type: number - disabledAt: - nullable: true - type: number - frequency: - properties: - interval: - type: string - enum: - - month - intervalCount: - type: number - enum: - - 1 - - 2 - - 3 - - 6 - - 12 - required: - - interval - - intervalCount - type: object - maxQuantity: - type: number - required: - - price - - quantity - - hidden - type: object - description: 'Will be used to create an invoice item. The price must be in cents: 2000 for $20.' - webAnalytics: - properties: - tier: - type: number - price: - type: number - quantity: - type: number - name: - type: string - hidden: - type: boolean - createdAt: - type: number - disabledAt: - nullable: true - type: number - frequency: - properties: - interval: - type: string - enum: - - month - intervalCount: - type: number - enum: - - 1 - - 2 - - 3 - - 6 - - 12 - required: - - interval - - intervalCount - type: object - maxQuantity: - type: number +paths: + /v3/events: + get: + description: Retrieves a list of "events" generated by the User on Vercel. Events are generated when the User performs a particular action, such as logging in, creating a deployment, and joining a Team (just to name a few). When the `teamId` parameter is supplied, then the events that are returned will be in relation to the Team that was specified. + operationId: listUserEvents + security: + - bearerToken: [] + summary: List User Events + tags: + - user + responses: + '200': + description: Successful response. + content: + application/json: + schema: + properties: + events: + items: + $ref: '#/components/schemas/UserEvent' + type: array + description: Array of events generated by the User. + required: + - events + type: object + description: Successful response. + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '410': + description: '' + x-vercel-cli: + supportedSubcommands: true + supportedProduction: false + aliases: + - events + parameters: + - name: limit + description: Maximum number of items which may be returned. + in: query + schema: + description: Maximum number of items which may be returned. + example: 20 + type: number + - name: since + description: Timestamp to only include items created since then. + in: query + schema: + description: Timestamp to only include items created since then. + example: '2019-12-08T10:00:38.976Z' + type: string + - name: until + description: Timestamp to only include items created until then. + in: query + schema: + description: Timestamp to only include items created until then. + example: '2019-12-09T23:00:38.976Z' + type: string + - name: types + description: Comma-delimited list of event "types" to filter the results by. + in: query + schema: + description: Comma-delimited list of event "types" to filter the results by. + example: login,team-member-join,domain-buy + type: string + - name: userId + description: Deprecated. Use `principalId` instead. If `principalId` and `userId` both exist, `principalId` will be used. + in: query + schema: + description: Deprecated. Use `principalId` instead. If `principalId` and `userId` both exist, `principalId` will be used. + example: aeIInYVk59zbFF2SxfyxxmuO + type: string + - name: principalId + description: When retrieving events for a Team, the `principalId` parameter may be specified to filter events generated by a specific principal. + in: query + schema: + description: When retrieving events for a Team, the `principalId` parameter may be specified to filter events generated by a specific principal. + example: aeIInYVk59zbFF2SxfyxxmuO + type: string + - name: projectIds + description: Comma-delimited list of project IDs to filter the results by. + in: query + schema: + description: Comma-delimited list of project IDs to filter the results by. + example: aeIInYVk59zbFF2SxfyxxmuO + type: string + - name: entityId + description: Filters events to those associated with a specific entity (matched against `payload.id`). For example, a connector ID. + in: query + schema: + description: Filters events to those associated with a specific entity (matched against `payload.id`). For example, a connector ID. + example: scl_123 + type: string + - name: withPayload + description: When set to `true`, the response will include the `payload` field for each event. + in: query + schema: + description: When set to `true`, the response will include the `payload` field for each event. + example: 'true' + type: string + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + /v1/events/types: + get: + description: Returns the list of user-facing event types with descriptions. + operationId: listEventTypes + security: + - bearerToken: [] + summary: List Event Types + tags: + - user + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ListEventTypesResponse' + '400': + description: '' + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '410': + description: '' + parameters: + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + /v2/user: + get: + description: Retrieves information related to the currently authenticated User. + operationId: getAuthUser + security: + - bearerToken: [] + summary: Get the User + tags: + - user + responses: + '200': + description: Successful response. + content: + application/json: + schema: + properties: + user: + properties: + createdAt: + type: number + description: UNIX timestamp (in milliseconds) when the User account was created. + example: 1630748523395 + softBlock: + nullable: true + properties: + blockedAt: + type: number + reason: + type: string + enum: + - BLOCKED_FOR_PLATFORM_ABUSE + - DOMAIN_OWNER_DELETION_REQUEST + - ENTERPRISE_TRIAL_ENDED + - ENTERPRISE_UNPAID_INVOICE + - EXPOSURE_CAP_EXCEEDED + - FAIR_USE_LIMITS_EXCEEDED + - SUBSCRIPTION_CANCELED + - SUBSCRIPTION_EXPIRED + - UNPAID_INVOICE + blockedDueToOverageType: + type: string + enum: + - analyticsUsage + - artifacts + - bandwidth + - blobDataTransfer + - blobTotalAdvancedRequests + - blobTotalAvgSizeInBytes + - blobTotalGetResponseObjectSizeInBytes + - blobTotalSimpleRequests + - connectDataTransfer + - dataCacheRead + - dataCacheWrite + - edgeConfigRead + - edgeConfigWrite + - edgeFunctionExecutionUnits + - edgeMiddlewareInvocations + - edgeRequest + - edgeRequestAdditionalCpuDuration + - elasticConcurrencyBuildSlots + - fastDataTransfer + - fastOriginTransfer + - fluidCpuDuration + - fluidDuration + - functionDuration + - functionInvocation + - imageOptimizationCacheRead + - imageOptimizationCacheWrite + - imageOptimizationTransformation + - logDrainsVolume + - monitoringMetric + - observabilityEvent + - onDemandConcurrencyMinutes + - runtimeCacheRead + - runtimeCacheWrite + - serverlessFunctionExecution + - sourceImages + - wafOwaspExcessBytes + - wafOwaspRequests + - wafRateLimitRequest + - webAnalyticsEvent + unpauseAt: + type: number + description: Since September 2026. Set only by `billing-usage-alerts` for usage plans with a `blockDurationMs`; its presence marks a pause that expires on its own. + required: + - blockedAt + - reason + type: object + description: When the User account has been "soft blocked", this property will contain the date when the restriction was enacted, and the identifier for why. + billing: + nullable: true + type: string + description: An object containing billing infomation associated with the User account. (opaque JSON object) + resourceConfig: + properties: + concurrentBuilds: + type: number + description: An object containing infomation related to the amount of platform resources may be allocated to the User account. + nodeType: + type: string + description: An object containing infomation related to the amount of platform resources may be allocated to the User account. + elasticConcurrencyEnabled: + type: boolean + enum: + - false + - true + description: An object containing infomation related to the amount of platform resources may be allocated to the User account. + buildEntitlements: + properties: + enhancedBuilds: + type: boolean + enum: + - false + - true + description: An object containing infomation related to the amount of platform resources may be allocated to the User account. + type: object + description: An object containing infomation related to the amount of platform resources may be allocated to the User account. + buildQueue: + properties: + configuration: + type: string + enum: + - SKIP_NAMESPACE_QUEUE + - WAIT_FOR_NAMESPACE_QUEUE + description: An object containing infomation related to the amount of platform resources may be allocated to the User account. + type: object + description: An object containing infomation related to the amount of platform resources may be allocated to the User account. + awsAccountType: + type: string + description: An object containing infomation related to the amount of platform resources may be allocated to the User account. + awsAccountIds: + items: + type: string + type: array + description: An object containing infomation related to the amount of platform resources may be allocated to the User account. + cfZoneName: + type: string + description: An object containing infomation related to the amount of platform resources may be allocated to the User account. + imageOptimizationType: + type: string + description: An object containing infomation related to the amount of platform resources may be allocated to the User account. + edgeConfigs: + type: number + description: An object containing infomation related to the amount of platform resources may be allocated to the User account. + edgeConfigSize: + type: number + description: An object containing infomation related to the amount of platform resources may be allocated to the User account. + edgeFunctionMaxSizeBytes: + type: number + description: An object containing infomation related to the amount of platform resources may be allocated to the User account. + edgeFunctionExecutionTimeoutMs: + type: number + description: An object containing infomation related to the amount of platform resources may be allocated to the User account. + serverlessFunctionMaxDuration: + type: number + description: An object containing infomation related to the amount of platform resources may be allocated to the User account. + serverlessFunctionMaxMemorySize: + type: number + description: An object containing infomation related to the amount of platform resources may be allocated to the User account. + kvDatabases: + type: number + description: An object containing infomation related to the amount of platform resources may be allocated to the User account. + postgresDatabases: + type: number + description: An object containing infomation related to the amount of platform resources may be allocated to the User account. + blobStores: + type: number + description: An object containing infomation related to the amount of platform resources may be allocated to the User account. + integrationStores: + type: number + description: An object containing infomation related to the amount of platform resources may be allocated to the User account. + cronJobsPerProject: + type: number + description: An object containing infomation related to the amount of platform resources may be allocated to the User account. + microfrontendGroupsPerTeam: + type: number + description: An object containing infomation related to the amount of platform resources may be allocated to the User account. + microfrontendProjectsPerGroup: + type: number + description: An object containing infomation related to the amount of platform resources may be allocated to the User account. + flagsExplorerOverridesThreshold: + type: number + description: An object containing infomation related to the amount of platform resources may be allocated to the User account. + flagsExplorerUnlimitedOverrides: + type: boolean + enum: + - false + - true + description: An object containing infomation related to the amount of platform resources may be allocated to the User account. + customEnvironmentsPerProject: + type: number + description: An object containing infomation related to the amount of platform resources may be allocated to the User account. + security: + properties: + rateLimit: + type: number + description: An object containing infomation related to the amount of platform resources may be allocated to the User account. + customRules: + type: number + description: An object containing infomation related to the amount of platform resources may be allocated to the User account. + ipBlocks: + type: number + description: An object containing infomation related to the amount of platform resources may be allocated to the User account. + ipBypass: + type: number + description: An object containing infomation related to the amount of platform resources may be allocated to the User account. + type: object + description: An object containing infomation related to the amount of platform resources may be allocated to the User account. + bulkRedirectsFreeLimitOverride: + type: number + description: An object containing infomation related to the amount of platform resources may be allocated to the User account. + type: object + description: An object containing infomation related to the amount of platform resources may be allocated to the User account. + stagingPrefix: + type: string + description: Prefix that will be used in the URL of "Preview" deployments created by the User account. + activeDashboardViews: + items: + properties: + scopeId: + type: string + viewPreference: + nullable: true + type: string + enum: + - cards + - list + - null + favoritesViewPreference: + nullable: true + type: string + enum: + - closed + - open + - null + recentsViewPreference: + nullable: true + type: string + enum: + - closed + - open + - null + required: + - scopeId + type: object + description: set of dashboard view preferences (cards or list) per scopeId + type: array + description: set of dashboard view preferences (cards or list) per scopeId + importFlowGitNamespace: + nullable: true + type: string + importFlowGitNamespaceId: + nullable: true + type: string + importFlowGitProvider: + nullable: true + type: string + enum: + - bitbucket + - cursor-origin + - github + - github-custom-host + - github-limited + - gitlab + - vercel + - null + preferredScopesAndGitNamespaces: + items: + properties: + scopeId: + type: string + gitNamespaceId: + nullable: true + oneOf: + - type: string + - type: number + required: + - gitNamespaceId + - scopeId + type: object + type: array + dismissedToasts: + items: + properties: + name: + type: string + dismissals: + items: + properties: + scopeId: + type: string + createdAt: + type: number + required: + - createdAt + - scopeId + type: object + type: array + required: + - dismissals + - name + type: object + description: A record of when, under a certain scopeId, a toast was dismissed + type: array + description: A record of when, under a certain scopeId, a toast was dismissed + favoriteProjectsAndSpaces: + items: + properties: + teamId: + type: string + projectId: + type: string + required: + - projectId + - teamId + type: object + description: A list of projects and spaces across teams that a user has marked as a favorite. + type: array + description: A list of projects and spaces across teams that a user has marked as a favorite. + hasTrialAvailable: + type: boolean + enum: + - false + - true + description: Whether the user has a trial available for a paid plan subscription. + remoteCaching: + properties: + enabled: + type: boolean + enum: + - false + - true + type: object + description: remote caching settings + dataCache: + properties: + excessBillingEnabled: + type: boolean + enum: + - false + - true + type: object + description: data cache settings + featureBlocks: + properties: + webAnalytics: + properties: + blockedFrom: + type: number + blockedUntil: + type: number + isCurrentlyBlocked: + type: boolean + enum: + - false + - true + required: + - isCurrentlyBlocked + type: object + speedInsightsFree: + properties: + blockedFrom: + type: number + blockedUntil: + type: number + blockReason: + type: string + enum: + - admin_override + - hard_blocked + - limits_exceeded + isCurrentlyBlocked: + type: boolean + enum: + - false + - true + required: + - blockReason + - isCurrentlyBlocked + type: object + description: Client-facing view of the `speedInsightsFree` ingestion block. The dashboard needs `blockReason` to tell usage pauses apart from admin blocks. + type: object + description: Feature blocks for the user + isAccountUpdateRequired: + type: boolean + enum: + - false + - true + description: When `true`, the user must complete the EMU Update Account flow before they can use the dashboard. + accountUpdateContext: + properties: + canOptOut: + type: boolean + enum: + - false + - true + description: Whether this user can cancel their optional Account Update flow. + organization: + properties: + id: + type: string + name: + type: string + slug: + type: string + required: + - id + - name + - slug + type: object + managedTeams: + items: + properties: + teamId: + type: string + slug: + type: string + name: + type: string + avatar: + nullable: true + type: string + workEmail: + type: string + required: + - avatar + - name + - slug + - teamId + - workEmail + type: object + type: array + verifiedEmuDomains: + items: + type: string + type: array + required: + - canOptOut + - managedTeams + - verifiedEmuDomains + type: object + description: Context for the Update Account screen. Present only when `isAccountUpdateRequired` is true. `managedTeams` is empty for orphan mode (user matches an EMU domain but is not on the team). + id: + type: string + description: The User's unique identifier. + example: AEIIDYVk59zbFF2Sxfyxxmua + email: + type: string + description: Email address associated with the User account. + example: me@example.com + name: + nullable: true + type: string + description: Name associated with the User account, or `null` if none has been provided. + example: John Doe + username: + type: string + description: Unique username associated with the User account. + example: jdoe + avatar: + nullable: true + type: string + description: SHA1 hash of the avatar for the User account. Can be used in conjuction with the ... endpoint to retrieve the avatar image. + example: 22cb30c85ff45ac4c72de8981500006b28114aa1 + defaultTeamId: + nullable: true + type: string + description: The user's default team. + isEnterpriseManaged: + type: boolean + enum: + - false + - true + description: Indicates whether the user is managed by an enterprise. + shouldShowEnterpriseManagedWelcome: + type: boolean + enum: + - false + - true + description: Whether the Enterprise Managed User joined the current team through the Update Account flow and should see its welcome experience. + limited: + type: boolean + enum: + - true + description: Property indicating that this User data contains only limited information, due to the authentication token missing privileges to read the full User data. Re-login with email, GitHub, GitLab or Bitbucket in order to upgrade the authentication token with the necessary privileges. + required: + - avatar + - billing + - createdAt + - defaultTeamId + - email + - hasTrialAvailable + - id + - name + - resourceConfig + - softBlock + - stagingPrefix + - username + - limited + type: object + description: Data for the currently authenticated User. + required: + - user + type: object + description: Successful response. + x-vercel-cli: + displayProperty: user + displayColumns: + name: user.name + id: user.id + email: user.email + username: user.username + defaultTeamId: user.defaultTeamId + createdAt: user.createdAt + blockedAt: user.softBlock.blockedAt + blockedReason: user.softBlock.reason + '302': + description: '' + '400': + description: '' + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '409': + description: '' + '410': + description: '' + x-vercel-cli: + supportedSubcommands: true + supportedProduction: false + parameters: [] + x-speakeasy-test: false + /v1/user: + delete: + description: Initiates the deletion process for the currently authenticated User, by sending a deletion confirmation email. The email contains a link that the user needs to visit in order to proceed with the deletion process. + operationId: requestDelete + security: + - bearerToken: [] + summary: Delete User Account + tags: + - user + responses: + '202': + description: Response indicating that the User deletion process has been initiated, and a confirmation email has been sent. + content: + application/json: + schema: + properties: + id: + type: string + description: Unique identifier of the User who has initiated deletion. + email: + type: string + description: Email address of the User who has initiated deletion. + message: + type: string + description: User deletion progress status. + example: Verification email sent + required: + - email + - id + - message + type: object + '400': + description: One of the provided values in the request body is invalid. + '401': + description: '' + '402': + description: '' + '403': + description: You do not have permission to access this resource. + '410': + description: '' + parameters: [] + requestBody: + content: + application/json: + schema: + type: object + additionalProperties: false + properties: + reasons: + type: array + description: Optional array of objects that describe the reason why the User account is being deleted. + items: + type: object + description: An object describing the reason why the User account is being deleted. + required: + - slug + - description + additionalProperties: false + properties: + slug: + type: string + description: Idenitifier slug of the reason why the User account is being deleted. + description: + type: string + description: Description of the reason why the User account is being deleted. + required: true +components: + schemas: + UserEvent: + properties: + id: + type: string + description: The unique identifier of the Event. + example: uev_bfmMjiMnXfnPbT97dGdpJbCN + text: + type: string + description: The human-readable text of the Event. + example: You logged in via GitHub + entities: + items: + properties: + type: + type: string + enum: + - app + - author + - bitbucket_login + - bold + - deployment_host + - deployment_inspector + - dns_record + - edge-config + - env_var_name + - flag + - flags-segment + - flags-settings + - git_link + - github_login + - gitlab_login + - hook_name + - integration + - link + - project_name + - scaling_rules + - store + - system + - target + example: author + description: The type of entity. + start: + type: number + description: The index of where the entity begins within the `text` (inclusive). + example: 0 + end: + type: number + description: The index of where the entity ends within the `text` (non-inclusive). + example: 3 + required: + - end + - start + - type + type: object + description: A list of "entities" within the event `text`. Useful for enhancing the displayed text with additional styling and links. + type: array + description: A list of "entities" within the event `text`. Useful for enhancing the displayed text with additional styling and links. + type: + type: string + enum: + - access-group-created + - access-group-deleted + - access-group-project-updated + - access-group-updated + - access-group-user-added + - access-group-user-removed + - admin-agentic-provisioning-account-unlinked + - admin-plan-updated + - admin-secondary-email-added + - admin-secondary-email-removed + - admin-team-name-update + - admin-team-slug-update + - admin-user-delete + - admin-user-primary-email-updated + - admin-username-updated + - agentic-provisioning-account-blocked + - agentic-provisioning-account-linked + - agentic-provisioning-account-relinked + - agentic-provisioning-account-unlinked + - agentic-provisioning-credentials-rotated + - agentic-provisioning-plan-changed + - agentic-provisioning-team-created + - ai-alert-investigation + - ai-code-review + - ai-gateway-api-key-created + - ai-gateway-api-key-deleted + - ai-gateway-api-key-quota-updated + - ai-gateway-auto-reload-updated + - ai-gateway-budget-default-updated + - ai-gateway-byok-credential-created + - ai-gateway-byok-credential-deleted + - ai-gateway-byok-credential-updated + - ai-gateway-byok-model-mappings-updated + - ai-gateway-credits-purchased + - ai-gateway-guardrails-updated + - ai-gateway-hipaa-compliance-toggled + - ai-gateway-inference-regions-updated + - ai-gateway-model-allowlist-models-updated + - ai-gateway-model-allowlist-toggled + - ai-gateway-private-model-created + - ai-gateway-private-model-deleted + - ai-gateway-private-model-updated + - ai-gateway-private-provider-created + - ai-gateway-private-provider-deleted + - ai-gateway-private-provider-updated + - ai-gateway-prompt-training-opt-out-toggled + - ai-gateway-provider-allowlist-providers-updated + - ai-gateway-provider-allowlist-toggled + - ai-gateway-rule-created + - ai-gateway-rule-deleted + - ai-gateway-rule-updated + - ai-gateway-scope-budget-updated + - ai-gateway-transcripts-default-disabled + - ai-gateway-transcripts-default-enabled + - ai-gateway-transcripts-disabled + - ai-gateway-transcripts-enabled + - ai-gateway-transcripts-retention-updated + - ai-gateway-virtual-model-config-archived + - ai-gateway-virtual-model-config-created + - ai-gateway-virtual-model-config-deleted + - ai-gateway-virtual-model-config-restored + - ai-gateway-virtual-model-config-updated + - ai-gateway-zero-data-retention-toggled + - ai-omniagent + - alert-investigation-project-allowlist-updated + - alert-rule-created + - alert-rule-deleted + - alert-rule-updated + - alias + - alias-chown + - alias-delete + - alias-invite-created + - alias-invite-joined + - alias-invite-revoked + - alias-protection-bypass-created + - alias-protection-bypass-exception + - alias-protection-bypass-regenerated + - alias-protection-bypass-revoked + - alias-system + - alias-user-scoped-access-denied + - alias-user-scoped-access-granted + - alias-user-scoped-access-requested + - alias-user-scoped-access-revoked + - aliases-assigned + - attack-mode-disabled + - attack-mode-enabled + - audit-log-export-downloaded + - audit-log-export-requested + - authorize-git-deployment + - auto-expose-system-envs + - avatar + - billing-settings-updated + - bulk-redirects-settings-updated + - bulk-redirects-version-promoted + - bulk-redirects-version-restored + - cert + - cert-autorenew + - cert-chown + - cert-clone + - cert-delete + - cert-renew + - cert-replace + - cert-system-create + - code-owners-config-updated + - compliance-document-downloaded + - compliance-document-previewed + - compliance-documents-bulk-downloaded + - concurrent-builds-update + - connect-attach-project + - connect-bitbucket + - connect-bitbucket-app + - connect-configuration-created + - connect-configuration-deleted + - connect-configuration-link-updated + - connect-configuration-linked + - connect-configuration-unlinked + - connect-configuration-updated + - connect-create-connector + - connect-delete-connector + - connect-delete-installation + - connect-detach-project + - connect-github + - connect-github-custom-host + - connect-github-limited + - connect-gitlab + - connect-gitlab-app + - connect-import-tokens + - connect-revoke-all-tokens + - connect-update-connector + - connect-update-trigger-destinations + - connect-upsert-installation + - custom-alert-created + - custom-alert-deleted + - custom-alert-updated + - custom-environments-settings-updated + - custom-metric-metadata-deleted + - custom-metric-metadata-updated + - custom-suffix-clear + - custom-suffix-disable + - custom-suffix-enable + - custom-suffix-pending + - custom-suffix-ready + - deploy-hook-created + - deploy-hook-deduped + - deploy-hook-deleted + - deploy-hook-processed + - deployment + - deployment-check-created + - deployment-check-deleted + - deployment-check-updated + - deployment-chown + - deployment-creation-blocked + - deployment-delete + - deployment-policy-blocked + - deployment-undeleted + - disabled-integration-installation-removed + - disconnect-bitbucket-app + - disconnect-github + - disconnect-github-custom-host + - disconnect-github-limited + - disconnect-gitlab-app + - dns-add + - dns-delete + - dns-record-internal + - dns-update + - dns-zonefile-import + - domain + - domain-buy + - domain-cdn + - domain-chown + - domain-custom-ns-change + - domain-delegated + - domain-delete + - domain-ech-change + - domain-move-in + - domain-move-out + - domain-move-out-request-sent + - domain-renew-change + - domain-service-type-updated + - domain-transfer-in + - domain-transfer-in-canceled + - domain-transfer-in-completed + - domain-zone-change + - domain-zone-change-internal + - drain-created + - drain-deleted + - drain-disabled + - drain-enabled + - drain-updated + - edge-cache-dangerously-delete-by-src-images + - edge-cache-dangerously-delete-by-tags + - edge-cache-dangerously-delete-immutable-static + - edge-cache-invalidate-by-src-images + - edge-cache-invalidate-by-tags + - edge-cache-purge-all + - edge-cache-rollback-purge + - edge-config-backup-restored + - edge-config-created + - edge-config-deleted + - edge-config-items-updated + - edge-config-schema-deleted + - edge-config-schema-updated + - edge-config-token-created + - edge-config-token-deleted + - edge-config-transfer-in + - edge-config-transfer-out + - edge-config-updated + - email + - email-notification-rule-removed + - email-notification-rule-updated + - emu-member-removed-unverified-domain + - enforce-disjunctive-production-secrets + - enforce-sensitive-environment-variables + - env-variable-add + - env-variable-delete + - env-variable-edit + - env-variable-masked + - env-variable-read + - env-variable-read:cli:dev + - env-variable-read:cli:env:add + - env-variable-read:cli:env:ls + - env-variable-read:cli:env:pull + - env-variable-read:cli:env:rm + - env-variable-read:cli:pull + - env-variable-read:unknown-source + - env-variable-read:v0:env:pull + - env-variable-rotated + - experiment-created + - experiment-deleted + - experiment-transitioned + - experiment-updated + - firewall-bypass-created + - firewall-bypass-deleted + - firewall-config-modified + - firewall-config-promoted + - firewall-config-removed + - firewall-managed-rulegroup-updated + - firewall-managed-ruleset-updated + - flag + - flag-archived + - flag-created + - flag-deleted + - flag-unarchived + - flag-updated + - flags-explorer-subscription + - flags-sdk-key + - flags-sdk-key-added + - flags-sdk-key-deleted + - flags-sdk-key-read + - flags-segment + - flags-settings + - flags-transferred + - flat-rate-cdn-auto-upgrade-consent + - git-integration-repo-push + - git_account_integration_link_added + - global-config-backup-restored + - global-config-created + - global-config-deleted + - global-config-items-updated + - global-config-schema-deleted + - global-config-schema-updated + - global-config-token-created + - global-config-token-deleted + - global-config-transfer-in + - global-config-transfer-out + - global-config-updated + - instant-rollback-created + - integration-configuration-credential-revoked + - integration-configuration-credential-rotated + - integration-configuration-owner-changed + - integration-configuration-scope-change-confirmed + - integration-configuration-transfer-in-success + - integration-configuration-transfer-out-success + - integration-configurations-disabled + - integration-installation-billing-plan-updated + - integration-installation-completed + - integration-installation-permission-updated + - integration-installation-removed + - integration-resource-redis-command-executed + - integration-resource-sql-query-executed + - integration-scope-changed + - invoice-modified + - invoice-refunded + - kms-issuer-created + - kms-issuer-deleted + - kms-issuer-key-activated + - kms-issuer-key-created + - kms-issuer-key-revoked + - kms-issuer-key-rotated + - kms-issuer-policy-created + - kms-issuer-policy-deleted + - kms-issuer-policy-updated + - kms-issuer-updated + - log-drain-created + - log-drain-deleted + - log-drain-disabled + - log-drain-enabled + - login + - login-connection-linked + - login-connection-unlinked + - manual-deployment-promotion-created + - marketplace-flex-commit-opt-in + - marketplace-integration-allowlist-updated + - microfrontend-group-added + - microfrontend-group-deleted + - microfrontend-group-updated + - microfrontend-project-added-to-group + - microfrontend-project-removed-from-group + - microfrontend-project-updated + - monitoring-alert-updated + - monitoring-disabled + - monitoring-enabled + - oauth-app-connection-created + - oauth-app-connection-removed + - oauth-app-connection-updated + - oauth-app-created + - oauth-app-deleted + - oauth-app-secret-deleted + - oauth-app-secret-generated + - oauth-app-token-created + - oauth-app-updated + - observability-disabled + - observability-enabled + - observability-plus-project-disabled + - observability-plus-project-enabled + - oidc-policy-created + - oidc-policy-deleted + - oidc-policy-updated + - oidc-policy-used-to-obtain-app-token + - organization-create + - organization-delete + - organization-dsync-group-delete + - organization-dsync-group-upsert + - organization-slug-update + - organization-team-add + - organization-team-create + - organization-team-delete + - organization-team-sso-update + - owner-blocked + - owner-soft-blocked + - owner-soft-unblocked + - owner-unblocked + - page-integrity-config-updated + - page-integrity-header-approved + - page-integrity-header-rejected + - page-integrity-inventory-cleared + - page-integrity-resource-approved + - page-integrity-resource-deleted + - page-integrity-resource-rejected + - page-integrity-script-approval-rule-created + - page-integrity-script-approval-rule-deleted + - passkey-created + - passkey-deleted + - passkey-updated + - passport-access-granted + - password-protection-disabled + - password-protection-enabled + - payment-method-added + - payment-method-default-updated + - payment-method-removed + - plan + - preview-deployment-suffix-disabled + - preview-deployment-suffix-enabled + - preview-deployment-suffix-update + - privatelink-endpoint-created + - privatelink-endpoint-deleted + - privatelink-endpoint-updated + - production-branch-updated + - project-add-alias + - project-add-redirect + - project-affected-projects-deployments-updated + - project-alias-configured-change + - project-analytics-disabled + - project-analytics-enabled + - project-auto-assign-custom-production-domains-updated + - project-automation-bypass + - project-avatar-update + - project-build-command-updated + - project-build-logs-and-source-protection-updated + - project-build-machine-updated + - project-card-widget-preference-updated + - project-client-cert-delete + - project-client-cert-upload + - project-connect-configurations + - project-consolidated-git-commit-status-updated + - project-created + - project-cron-jobs-toggled + - project-custom-environment-created + - project-custom-environment-deleted + - project-custom-environment-updated + - project-customer-success-code-visibility-updated + - project-delete + - project-deployment-policy-updated + - project-deployment-retention-updated + - project-directory-listing + - project-domain-deleted + - project-domain-moved + - project-domain-unverified + - project-domain-updated + - project-domain-verified + - project-elastic-concurrency-updated + - project-expiration-locked + - project-expiration-reached + - project-expiration-scheduled + - project-expiration-unlocked + - project-external-rewrite-caching-updated + - project-framework-updated + - project-function-cpu-memory + - project-function-failover + - project-function-max-duration + - project-function-regions + - project-functions-beta-updated + - project-functions-fluid-disabled + - project-functions-fluid-enabled + - project-git-commit-comments-toggled + - project-git-commit-status-toggled + - project-git-create-deployments-toggled + - project-git-credential-bound-created + - project-git-credential-bound-deleted + - project-git-credential-bound-updated + - project-git-credential-grant-created + - project-git-credential-grant-deleted + - project-git-credential-grant-updated + - project-git-fork-protection-updated + - project-git-lfs-toggled + - project-git-pr-comments-toggled + - project-git-repository-connected + - project-git-repository-disconnected + - project-git-repository-dispatch-events-toggled + - project-git-require-verified-commits-toggled + - project-ignored-build-step-updated + - project-install-command-updated + - project-member-added + - project-member-invited + - project-member-removed + - project-member-removed-batch + - project-member-updated + - project-move-in-success + - project-move-out-failed + - project-move-out-started + - project-move-out-success + - project-name + - project-node-version-updated + - project-oidc-issuer-mode-updated + - project-oidc-token-created + - project-options-allowlist + - project-output-directory-updated + - project-passport-updated + - project-password-protection + - project-paused + - project-preview-deployment-suffix + - project-preview-environment-branch-tracking-updated + - project-prioritize-production-builds-updated + - project-program-enrollment-changed + - project-protected-sourcemaps-updated + - project-rollback-description-updated + - project-rolling-release-aborted + - project-rolling-release-approved + - project-rolling-release-completed + - project-rolling-release-configured + - project-rolling-release-continued + - project-rolling-release-disabled + - project-rolling-release-enabled + - project-rolling-release-paused + - project-rolling-release-started + - project-rolling-release-suggested-actions-generated + - project-rolling-release-timer + - project-root-directory-updated + - project-routes-version-promoted + - project-routes-version-restored + - project-sandbox-config-updated + - project-sandbox-url-protection-updated + - project-skew-protection-allowed-domains-updated + - project-skew-protection-max-age-updated + - project-skew-protection-threshold-updated + - project-source-files-outside-root-directory-updated + - project-speed-insights-disabled + - project-speed-insights-enabled + - project-speed-insights-free-data-started + - project-sso-protection + - project-static-ips-updated + - project-trusted-ips + - project-trusted-sources + - project-unpaused + - project-web-analytics-disabled + - project-web-analytics-enabled + - protected-git-scope-added + - protected-git-scope-removed + - runtime-cache-purge-all + - saml-connection-created + - saml-connection-deleted + - sandbox-alias-assigned + - sandbox-alias-delete + - sandbox-drive-created + - sandbox-drive-deleted + - sandbox-snapshot-regions-updated + - scale + - scale-auto + - secondary-email-added + - secondary-email-removed + - secondary-email-verified + - secret-add + - secret-delete + - secret-rename + - security-list-created + - security-list-deleted + - security-list-updated + - security-plus-updated + - set-bio + - set-name + - set-profiles + - set-scale + - shared-env-variable-create + - shared-env-variable-delete + - shared-env-variable-read + - shared-env-variable-repo-link + - shared-env-variable-repo-unlink + - shared-env-variable-update + - show-ip-addresses + - signup + - signup-via-bitbucket + - signup-via-github + - signup-via-gitlab + - speed-insights-settings-updated + - spend-created + - spend-deleted + - spend-updated + - sso-login + - storage-accept-tos + - storage-access-token-set + - storage-accessed-data-browser + - storage-connect-project + - storage-create + - storage-delete + - storage-disconnect-project + - storage-disconnect-projects + - storage-inactive-store-deleted + - storage-reset-credentials + - storage-resource-repl-command + - storage-set-locked + - storage-transfer-in-success + - storage-transfer-out-success + - storage-transfer-request-created + - storage-update + - storage-update-project-connection + - storage-upgrade-project-connection-to-oidc + - storage-view-secret + - strict-connectors + - strict-deployment-protection-settings + - strict-password-protection-settings + - strict-shareable-links + - subscription-created + - subscription-product-added + - subscription-product-removed + - subscription-updated + - support-session-created + - team + - team-agent-billing-migration-decision-changed + - team-avatar-update + - team-collaboration-settings-updated + - team-default-build-machine-updated + - team-default-passport-updated + - team-delete + - team-deployment-policy-updated + - team-domain-verification-created + - team-domain-verification-deleted + - team-domain-verification-verified + - team-email-domain-update + - team-emu-updated + - team-ended-trial + - team-firewall-config-modified + - team-firewall-config-promoted + - team-git-repository-dispatch-events-toggled + - team-git-require-verified-commits-toggled + - team-invite-bulk-delete + - team-invite-code-reset + - team-invite-link-created + - team-invite-link-deleted + - team-ip-blocking-rules-created + - team-ip-blocking-rules-removed + - team-member-add + - team-member-confirm-request + - team-member-decline-request + - team-member-delete + - team-member-entitlement-added + - team-member-entitlement-canceled + - team-member-entitlement-reactivated + - team-member-entitlement-removed + - team-member-join + - team-member-leave + - team-member-request-access + - team-member-role-update + - team-member-sso-authorization-attempt + - team-mfa-enforcement-updated + - team-name-update + - team-paid-invoice + - team-program-enrollment-changed + - team-remote-caching-purge + - team-remote-caching-update + - team-saml-enforced + - team-saml-roles + - team-slug-update + - team-tokens-invalidated + - tracing-configured + - tracing-disabled + - tracing-paused + - tracing-resumed + - unlink-login-connection + - update-account-flow-dismissed + - update-account-flow-triggered + - user-auto-block-configured + - user-blocked + - user-delete + - user-delete-requested + - user-emu-account-archived + - user-emu-account-deleted + - user-emu-account-recovered + - user-emu-account-update-opted-in + - user-emu-account-update-opted-out + - user-emu-recovery-email-sent + - user-emu-recovery-initiated + - user-emu-toggled + - user-mfa-challenge-failed + - user-mfa-challenge-initiated + - user-mfa-challenge-verified + - user-mfa-change-failed + - user-mfa-configuration-updated + - user-mfa-recovery-code-used + - user-mfa-recovery-codes-regenerated + - user-mfa-removed + - user-mfa-setup-skipped + - user-mfa-totp-verification-started + - user-mfa-totp-verified + - user-phone-removed + - user-phone-updated + - user-primary-email-updated + - user-provider-email-claim-evaluated + - user-sudo-mode-removed + - user-token-created + - user-token-deleted + - user-tokens-deleted + - user-unblocked + - username + - v0-chat-ai-usage + - v0-chat-created + - v0-chat-message-sent + - vcr-image-deleted + - vcr-image-pushed + - vcr-repository-created + - vcr-repository-deleted + - vcr-repository-permission-added + - vcr-repository-permission-removed + - vcr-repository-permissions-cleared + - vcr-repository-visibility-changed + - vercel-agent-elevated-permissions-approved + - vercel-agent-elevated-permissions-requested + - vercel-agent-session-created + - vercel-agent-team-trial-credits-applied + - vercel-app-installation-request-dismissed + - vercel-app-installation-requested + - vercel-app-installation-updated + - vercel-app-installed + - vercel-app-tokens-revoked + - vercel-app-uninstalled + - vercel-toolbar + - vpc-peering-connection-accepted + - vpc-peering-connection-deleted + - vpc-peering-connection-rejected + - vpc-peering-connection-updated + - vulnerability-banner-dismissed + - web-analytics-tier-updated + - webhook-created + - webhook-deleted + - webhook-updated + - workflow-deployment-key-accessed + description: The type of the event. + example: login + categories: + items: + type: string + enum: + - account + - ai + - ai-gateway + - billing + - connect + - deployment + - domain + - edge + - env-variable + - feature-flags + - firewall + - integration + - microfrontends + - network + - observability + - other + - project + - security + - storage + - team + - v0 + - vercel-app + - workflow + example: + - deployment + description: The categories that group this event with related event types. An event can belong to multiple categories (e.g. a firewall event is both Firewall and Security). The first entry is the "primary" category. Use the `/events/types` endpoint to discover the full list of categories. + type: array + description: The categories that group this event with related event types. An event can belong to multiple categories (e.g. a firewall event is both Firewall and Security). The first entry is the "primary" category. Use the `/events/types` endpoint to discover the full list of categories. + example: + - deployment + createdAt: + type: number + description: Timestamp (in milliseconds) of when the event was generated. + example: 1632859321020 + user: + properties: + slug: + type: string + avatar: + type: string + email: + type: string + username: + type: string + uid: + type: string + required: + - avatar + - email + - uid + - username + type: object + description: Metadata for {@link userId}. + principal: + properties: + type: + type: string + enum: + - user + avatar: + type: string + email: + type: string + slug: + type: string + uid: + type: string + username: + type: string + id: + type: string + description: The backing Vercel App ID. When absent, defaults to `clientId`. + clientId: + type: string + description: The OAuth 2.0 client ID, which may be a CIMD URL. + name: + type: string + required: + - avatar + - email + - uid + - username + - clientId + - name + - type + - id + type: object + description: Metadata for {@link principalId}. + via: + items: + oneOf: + - properties: + type: + type: string + enum: + - user + avatar: + type: string + email: + type: string + slug: + type: string + uid: + type: string + username: + type: string + required: + - avatar + - email + - uid + - username + type: object + description: Metadata for {@link viaIds}. + - properties: + type: + type: string + enum: + - app + id: + type: string + description: The backing Vercel App ID. When absent, defaults to `clientId`. + clientId: + type: string + description: The OAuth 2.0 client ID, which may be a CIMD URL. + name: + type: string + required: + - clientId + - name + - type + type: object + description: Metadata for {@link viaIds}. + - properties: + type: + type: string + enum: + - external + id: + type: string + name: + type: string + email: + type: string + required: + - id + - name + - type + type: object + description: Metadata for {@link viaIds}. + - properties: + type: + type: string + enum: + - system + required: + - type + type: object + description: Metadata for {@link viaIds}. + type: array + description: Metadata for {@link viaIds}. + userId: + type: string + description: When the principal who generated the event is a user, this is their ID; otherwise, it is empty. + example: zTuNVUXEAvvnNN3IaqinkyMw + principalId: + type: string + description: The ID of the principal who generated the event. The principal is typically a user, but it could also be an app, an integration, etc. The principal may have delegated its authority to an acting party, and so {@link viaIds} should be checked as well. + viaIds: + items: + type: string + type: array + description: If the principal delegated its authority (for example, a user delegating to an app), then this array contains the ID of the current actor. For example, if `principalId` is "user123" and `viaIds` is `["app456"]`, we can say the event was triggered by - "app456 on behalf of user123", or - "user123 via app4556". Both are equivalent. Arbitrarily long chains of delegation can be represented. For example, if `principalId` is "user123" and `viaIds` is `["service1", "service2"]`, we can say the event was triggered by "user123 via service1 via service2". + tokenId: + type: string + description: The public ID of the token that the principal authenticated with, when the request behind this event carried one. + sessionId: + type: string + description: The ID of the session that the principal's token belongs to, when it belongs to one. + requestId: + type: string + payload: + type: string + description: The payload of the event, if requested. (opaque JSON object) + properties: + action: + type: string + enum: + - archived + - created + - deleted + - unarchived + - updated + id: + type: string + slug: + type: string + projectId: + type: string + projectName: + type: string + name: + type: string + state: + type: string + label: + type: string + environment: + type: string + policyId: + type: string + provider: + type: string + enum: + - chatgpt + - stripe + description: Present on new events only. Equivalent to "stripe" when absent. + providerAccount: + type: string + description: Present on new events only. Equivalent to `stripeAccount` when absent. + stripeAccount: + type: string + description: Present when `provider` is "stripe". Equivalent to `providerAccount`. + stripeOrganisation: + type: string + description: Present when `provider` is "stripe". + teamId: + type: string + accountRequestId: + type: string + teamSlug: + type: string + reason: + type: string + blockCode: + type: string + resourceId: + type: string + actorId: + type: string + description: Okta user id. + actorType: + type: string + enum: + - admin + actorName: + type: string + fromPlan: + type: string + enum: + - hobby + - pro + toPlan: + type: string + enum: + - hobby + - pro + apiKey: + properties: + id: + type: string + name: + type: string + required: + - id + - name + type: object + budget: + nullable: true + properties: + limitAmount: + type: number + description: Spend cap, in dollars. + refreshPeriod: + type: string + enum: + - daily + - monthly + - none + - weekly + alertThresholds: + items: + type: number + type: array + required: + - limitAmount + - refreshPeriod + type: object + description: Spend budget on an AI Gateway API key, as surfaced in activity messages. Defined locally (rather than imported from `@api/pubsub-types`) because `@api/pubsub-types` already depends on `@api/events`; importing it here would create a circular dependency. Must stay structurally aligned with `APIKeyBudget` in `@api/pubsub-types/event-payloads/api-keys`. + zdrExemption: + type: boolean + enum: + - false + - true + description: True when the key was created with a ZDR exemption. + bypassAll: + type: boolean + enum: + - false + - true + description: True when the key was created to bypass all of the team's restrictions (the ZDR-only model restriction and the provider/model allowlist). + change: + type: string + enum: + - disable + - enable + - remove + - set + settings: + properties: + minimumBalance: + type: string + targetBalance: + type: string + maximumMonthlySpend: + nullable: true + type: string + required: + - maximumMonthlySpend + - minimumBalance + - targetBalance + type: object + previous: + properties: + minimumBalance: + type: string + targetBalance: + type: string + maximumMonthlySpend: + nullable: true + type: string + required: + - maximumMonthlySpend + - minimumBalance + - targetBalance + type: object + commitment: + properties: + maximumMonthlySpend: + nullable: true + type: string + deferredInvoiceTargetBalance: + type: string + required: + - deferredInvoiceTargetBalance + - maximumMonthlySpend + type: object + scopeType: + type: string + enum: + - api-key + - project + - team + - user + userId: + type: string + description: Associates the event with a member for filtering; not rendered. + userName: + type: string + credential: + properties: + id: + type: string + name: + type: string + providerSlug: + type: string + required: + - id + - name + - providerSlug + type: object + added: + items: + type: string + type: array + removed: + items: + type: string + type: array + changed: + items: + type: string + type: array + enabled: + type: boolean + enum: + - false + - true + amount: + type: string + purchaseIntentId: + type: string + privateModel: + properties: + slug: + type: string + providerSlug: + type: string + required: + - providerSlug + - slug + type: object + privateProvider: + properties: + slug: + type: string + required: + - slug + type: object + piiRedaction: + properties: + from: + type: boolean + enum: + - false + - true + to: + type: boolean + enum: + - false + - true + required: + - from + - to + type: object + moderationPolicyCount: + type: number + policiesAdded: + items: + type: string + type: array + policiesRemoved: + items: + type: string + type: array + policiesModified: + items: + type: string + type: array + regions: + items: + type: string + type: array + retention: + properties: + defaultMode: + type: string + enum: + - days + - until-requested + defaultDays: + type: number + ceilingMode: + type: string + enum: + - days + - until-requested + ceilingDays: + type: number + required: + - ceilingMode + - defaultMode + type: object + rule: + properties: + id: + type: string + type: + type: string + model: + type: string + rewriteModel: + type: string + required: + - id + - type + type: object + virtualModelConfig: + properties: + id: + type: string + displayName: + type: string + modelSlug: + type: string + required: + - id + type: object + accessGroup: + properties: + id: + type: string + name: + type: string + required: + - id + - name + type: object + teamRoles: + items: + type: string + type: array + teamPermissions: + items: + type: string + type: array + entitlements: + items: + type: string + type: array + author: + type: string + project: + properties: + id: + type: string + name: + type: string + required: + - id + type: object + next_role: + nullable: true + type: string + enum: + - ADMIN + - PROJECT_DEVELOPER + - PROJECT_GUEST + - PROJECT_VIEWER + - null + previous_role: + type: string + enum: + - ADMIN + - PROJECT_DEVELOPER + - PROJECT_GUEST + - PROJECT_VIEWER + previousName: + type: string + previousTeamRoles: + items: + type: string + type: array + previousTeamPermissions: + items: + type: string + type: array + entitlementsAdded: + items: + type: string + type: array + entitlementsRemoved: + items: + type: string + type: array + user: + properties: + id: + type: string + username: + type: string + required: + - id + type: object + directoryType: + type: string + price: + type: number + currency: + type: string + alias: + type: string + deployment: + nullable: true + properties: + id: + type: string + name: + type: string + url: + type: string + meta: + additionalProperties: + type: string + type: object + readyState: + type: string + allowListedReadyStateReasonInternal: + type: string + enum: + - EARLY_IGNORE_STEP + - IGNORE_STEP + - NAMESPACE_PRUNED + - UNAFFECTED_PROJECT + - UNVERIFIED_COMMIT + description: A narrowed subset of the deployment's `readyStateReasonInternal` — only values in the public allowlist are permitted here. Callers should run their raw reason through `toAllowListedReadyStateReasonInternal` from `@api/events` before assigning. This keeps abuse / moderation / admin reasons out of the public activity log. + required: + - id + - meta + - name + - url + type: object + ruleCount: + type: number + deploymentUrl: + type: string + aliasId: + type: string + deploymentId: + nullable: true + type: string + oldDeploymentId: + nullable: true + type: string + redirect: + type: string + redirectStatusCode: + nullable: true + type: number + target: + nullable: true + type: string + system: + type: boolean + enum: + - false + - true + aliasUpdatedAt: + type: number + aliasCount: + type: number + oldTeam: + properties: + name: + type: string + required: + - name + type: object + newTeam: + properties: + name: + type: string + required: + - name + type: object + email: + type: string + username: + type: string + appName: + type: string + appId: + type: string + scopes: + items: + type: string + enum: + - email + - offline_access + - openid + - profile + type: array + permissions: + items: + type: string + enum: + - '*' + - manage:speed-insights + - manage:web-analytics + - read-write:ai-gateway-api-key + - read-write:ai-gateway-guardrails + - read-write:ai-gateway-private-models + - read-write:ai-gateway-rules + - read-write:ai-gateway-virtual-model-configs + - read-write:alerts + - read-write:automations + - read-write:billing + - read-write:blob + - read-write:connect + - read-write:deployment + - read-write:domain + - read-write:domain-registrar + - read-write:drains + - read-write:edge-cache + - read-write:edge-config + - read-write:firewall + - read-write:integration-configuration + - read-write:integration-resource + - read-write:kms + - read-write:project + - read-write:project-env-vars + - read-write:project-env-vars-non-production + - read-write:project-env-vars-production + - read-write:project-flags-non-production + - read-write:project-flags-production + - read-write:project-protection-bypass + - read-write:remote-cache + - read-write:sandbox + - read-write:team-members + - read-write:vcr + - read:access-group + - read:ai-gateway-guardrails + - read:ai-gateway-private-models + - read:ai-gateway-rules + - read:ai-gateway-virtual-model-configs + - read:alerts + - read:automations + - read:billing + - read:connect + - read:deployment + - read:domain + - read:event + - read:firewall + - read:integration-configuration + - read:integration-resource + - read:kms + - read:monitoring + - read:project + - read:project-env-vars-non-production + - read:project-env-vars-production + - read:project-flags + - read:remote-cache + - read:sandbox + - read:speed-insights + - read:team + - read:user + - read:vcr + - read:web-analytics + - read:webhooks + - use:ai-gateway + type: array + nextScopes: + items: + type: string + enum: + - email + - offline_access + - openid + - profile + type: array + nextPermissions: + items: + type: string + enum: + - '*' + - manage:speed-insights + - manage:web-analytics + - read-write:ai-gateway-api-key + - read-write:ai-gateway-guardrails + - read-write:ai-gateway-private-models + - read-write:ai-gateway-rules + - read-write:ai-gateway-virtual-model-configs + - read-write:alerts + - read-write:automations + - read-write:billing + - read-write:blob + - read-write:connect + - read-write:deployment + - read-write:domain + - read-write:domain-registrar + - read-write:drains + - read-write:edge-cache + - read-write:edge-config + - read-write:firewall + - read-write:integration-configuration + - read-write:integration-resource + - read-write:kms + - read-write:project + - read-write:project-env-vars + - read-write:project-env-vars-non-production + - read-write:project-env-vars-production + - read-write:project-flags-non-production + - read-write:project-flags-production + - read-write:project-protection-bypass + - read-write:remote-cache + - read-write:sandbox + - read-write:team-members + - read-write:vcr + - read:access-group + - read:ai-gateway-guardrails + - read:ai-gateway-private-models + - read:ai-gateway-rules + - read:ai-gateway-virtual-model-configs + - read:alerts + - read:automations + - read:billing + - read:connect + - read:deployment + - read:domain + - read:event + - read:firewall + - read:integration-configuration + - read:integration-resource + - read:kms + - read:monitoring + - read:project + - read:project-env-vars-non-production + - read:project-env-vars-production + - read:project-flags + - read:remote-cache + - read:sandbox + - read:speed-insights + - read:team + - read:user + - read:vcr + - read:web-analytics + - read:webhooks + - use:ai-gateway + type: array + installationId: + type: string + before: + properties: + resources: + properties: + projectIds: + properties: + type: + type: string + enum: + - list + required: + type: boolean + enum: + - true + items: + properties: + type: + type: string + enum: + - string + required: + - type + type: object + required: + - items + - required + - type + type: object + description: Specific project IDs or all projects on the team (`['*']`). + required: + - projectIds + type: object + permissions: + items: + type: string + enum: + - manage:speed-insights + - manage:web-analytics + - read-write:ai-gateway-api-key + - read-write:ai-gateway-guardrails + - read-write:ai-gateway-private-models + - read-write:ai-gateway-rules + - read-write:ai-gateway-virtual-model-configs + - read-write:alerts + - read-write:automations + - read-write:billing + - read-write:blob + - read-write:connect + - read-write:deployment + - read-write:domain + - read-write:domain-registrar + - read-write:drains + - read-write:edge-cache + - read-write:edge-config + - read-write:firewall + - read-write:integration-configuration + - read-write:integration-resource + - read-write:kms + - read-write:project + - read-write:project-env-vars + - read-write:project-env-vars-non-production + - read-write:project-env-vars-production + - read-write:project-flags-non-production + - read-write:project-flags-production + - read-write:project-protection-bypass + - read-write:remote-cache + - read-write:sandbox + - read-write:team-members + - read-write:vcr + - read:access-group + - read:ai-gateway-guardrails + - read:ai-gateway-private-models + - read:ai-gateway-rules + - read:ai-gateway-virtual-model-configs + - read:alerts + - read:automations + - read:billing + - read:connect + - read:deployment + - read:domain + - read:event + - read:firewall + - read:integration-configuration + - read:integration-resource + - read:kms + - read:monitoring + - read:project + - read:project-env-vars-non-production + - read:project-env-vars-production + - read:project-flags + - read:remote-cache + - read:sandbox + - read:speed-insights + - read:team + - read:vcr + - read:web-analytics + - read:webhooks + - use:ai-gateway + type: array + type: object + after: + properties: + resources: + properties: + projectIds: + properties: + type: + type: string + enum: + - list + required: + type: boolean + enum: + - true + items: + properties: + type: + type: string + enum: + - string + required: + - type + type: object + required: + - items + - required + - type + type: object + description: Specific project IDs or all projects on the team (`['*']`). + required: + - projectIds + type: object + permissions: + items: + type: string + enum: + - manage:speed-insights + - manage:web-analytics + - read-write:ai-gateway-api-key + - read-write:ai-gateway-guardrails + - read-write:ai-gateway-private-models + - read-write:ai-gateway-rules + - read-write:ai-gateway-virtual-model-configs + - read-write:alerts + - read-write:automations + - read-write:billing + - read-write:blob + - read-write:connect + - read-write:deployment + - read-write:domain + - read-write:domain-registrar + - read-write:drains + - read-write:edge-cache + - read-write:edge-config + - read-write:firewall + - read-write:integration-configuration + - read-write:integration-resource + - read-write:kms + - read-write:project + - read-write:project-env-vars + - read-write:project-env-vars-non-production + - read-write:project-env-vars-production + - read-write:project-flags-non-production + - read-write:project-flags-production + - read-write:project-protection-bypass + - read-write:remote-cache + - read-write:sandbox + - read-write:team-members + - read-write:vcr + - read:access-group + - read:ai-gateway-guardrails + - read:ai-gateway-private-models + - read:ai-gateway-rules + - read:ai-gateway-virtual-model-configs + - read:alerts + - read:automations + - read:billing + - read:connect + - read:deployment + - read:domain + - read:event + - read:firewall + - read:integration-configuration + - read:integration-resource + - read:kms + - read:monitoring + - read:project + - read:project-env-vars-non-production + - read:project-env-vars-production + - read:project-flags + - read:remote-cache + - read:sandbox + - read:speed-insights + - read:team + - read:vcr + - read:web-analytics + - read:webhooks + - use:ai-gateway + type: array + type: object + resources: + properties: + projectIds: + properties: + type: + type: string + enum: + - list + required: + type: boolean + enum: + - true + items: + properties: + type: + type: string + enum: + - string + required: + - type + type: object + required: + - items + - required + - type + type: object + description: Specific project IDs or all projects on the team (`['*']`). + required: + - projectIds + type: object + secretLastFourChars: + type: string + app: + properties: + id: + type: string + description: The App's ID. + name: + type: string + description: The App's name at the moment this even was published (it may have changed since then). + required: + - id + - name + type: object + description: Note that not all historical events have this field. + issuedBefore: + type: number + description: UNIX timestamp in seconds. Tokens issued before this timestamp will be revoked. Note that not all historical events have this field. + prevAttackModeEnabled: + type: boolean + enum: + - false + - true + prevAttackModeActiveUntil: + nullable: true + type: number + attackModeEnabled: + type: boolean + enum: + - false + - true + attackModeActiveUntil: + nullable: true + type: number + autoExposeSystemEnvs: + type: boolean + enum: + - false + - true + avatar: + type: string + invoiceId: + type: string + refundReason: + type: string + lineItemCount: + type: number + newInvoiceId: + type: string + settlementMethod: + type: string + enum: + - credited-paid + - credited-payment-pending + - refunded-paid + - refunded-payment-pending + paymentMethodId: + type: string + brand: + type: string + last4: + type: string + changedFields: + items: + type: string + enum: + - address + - email + - language + - name + - purchaseOrder + - tax + type: array + subscriptionId: + type: string + planSlug: + type: string + data: + properties: + planSlug: + type: string + enum: + - v0_business + - v0_teams + reason: + type: string + enum: + - non-payment + required: + - planSlug + type: object + productAliases: + items: + type: string + type: array + bulkRedirectsLimit: + type: number + prevBulkRedirectsLimit: + type: number + versionId: + type: string + cn: + type: string + cns: + items: + type: string + type: array + custom: + type: boolean + enum: + - false + - true + src: + type: string + dst: + type: string + gitOwnerName: + type: string + gitRepositoryName: + type: string + next: + properties: + enabled: + type: boolean + enum: + - false + - true + autoAddReviewers: + type: boolean + enum: + - false + - true + required: + - autoAddReviewers + - enabled + type: object + documentId: + type: string + title: + type: string + fingerprint: + type: string + count: + type: number + documents: + items: + properties: + slug: + type: string + documentId: + type: string + title: + type: string + fingerprint: + type: string + required: + - documentId + - fingerprint + - slug + - title + type: object + description: A single document included in a bulk compliance download. + type: array + configuration: + properties: + id: + type: string + name: + type: string + required: + - id + - name + type: object + team: + properties: + name: + type: string + id: + type: string + required: + - id + - name + type: object + buildsEnabled: + type: boolean + enum: + - false + - true + passive: + type: boolean + enum: + - false + - true + newName: + type: string + githubLogin: + type: string + host: + type: string + gitlabLogin: + type: string + gitlabEmail: + type: string + gitlabName: + type: string + zeitAccount: + type: string + zeitAccountType: + type: string + gitlabUserId: + type: number + bitbucketEmail: + type: string + bitbucketLogin: + type: string + bitbucketName: + type: string + bitbucketAccountId: + type: string + clientId: + type: string + clientUid: + type: string + clientName: + type: string + subjectType: + type: string + enum: + - app + - user + fields: + items: + type: string + type: array + environments: + items: + type: string + type: array + triggerDestinationCount: + type: number + tokenCount: + type: number + acceptedTokenCount: + type: number + importedTokenCount: + type: number + tokensDeleted: + type: number + purchasedAmount: + type: number + prevPurchasedAmount: + type: number + metricName: + type: string + suffix: + type: string + status: + type: string + hookName: + type: string + ref: + type: string + job: + properties: + deployHook: + properties: + createdAt: + type: number + id: + type: string + name: + type: string + ref: + type: string + required: + - createdAt + - id + - name + - ref + type: object + state: + type: string + required: + - deployHook + - state + type: object + checkId: + type: string + checkName: + type: string + url: + type: string + forced: + type: boolean + enum: + - false + - true + gitCredentialSource: + type: string + enum: + - external-token + plan: + type: string + type: + type: string + sha: + type: string + gitUserPlatform: + type: string + gitCommitterName: + type: string + source: + type: string + ruleName: + type: string + enum: + - deploymentSources + - gitSources + description: Which rule blocked the deploy. + ruleProvenance: + type: string + enum: + - default + - project + - team + description: Team-level or project-level rule. + deploymentName: + nullable: true + type: string + integrationId: + type: string + configurationId: + type: string + integrationSlug: + type: string + integrationName: + type: string + ownerId: + type: string + projectIds: + items: + type: string + type: array + value: + type: string + domain: + type: string + mxPriority: + type: number + initiator: + type: string + enum: + - system + - user + previousValue: + type: string + zone: + type: boolean + enum: + - false + - true + cdnEnabled: + type: boolean + enum: + - false + - true + ownerName: + type: string + domainId: + type: string + previousServiceType: + type: string + serviceType: + type: string + nameservers: + items: + type: string + type: array + customNameservers: + nullable: true + items: + type: string + type: array + prevCustomNameservers: + nullable: true + items: + type: string + type: array + echMode: + type: string + enum: + - auto + - disabled + - enabled + previousEchMode: + type: string + enum: + - auto + - disabled + - enabled + previousZone: + type: boolean + enum: + - false + - true + fromId: + nullable: true + type: string + fromName: + nullable: true + type: string + destinationId: + nullable: true + type: string + destinationName: + nullable: true + type: string + renew: + type: boolean + enum: + - false + - true + drainUrl: + nullable: true + type: string + drainName: + nullable: true + type: string + srcImages: + items: + type: string + type: array + tags: + items: + type: string + type: array + path: + type: string + edgeConfigId: + type: string + edgeConfigSlug: + type: string + edgeConfigDigest: + type: string + edgeConfigBackupVersionId: + type: string + edgeConfigSchema: + type: string + description: (opaque JSON object) + edgeConfig: + properties: + id: + type: string + slug: + type: string + required: + - id + - slug + type: object + fromAccount: + properties: + id: + type: string + type: + type: string + enum: + - team + - user + slug: + type: string + username: + type: string + required: + - id + - type + type: object + toAccount: + properties: + id: + type: string + type: + type: string + enum: + - team + - user + slug: + type: string + username: + type: string + required: + - id + - type + type: object + edgeConfigTokenId: + type: string + edgeConfigTokenIds: + items: + type: string + type: array + description: ids of deleted tokens + previousRule: + properties: + email: + type: string + required: + - email + type: object + nextRule: + properties: + email: + type: string + required: + - email + type: object + deletedUser: + properties: + username: + type: string + email: + type: string + required: + - email + - username + type: object + deletedUid: + type: string + emailDomain: + type: string + key: + type: string + customEnvironmentSlugs: + items: + type: string + type: array + gitBranch: + type: string + ipAddress: + type: string + created: + type: string + format: date-time + description: The date when the Shared Env Var was created. + example: '2021-02-10T13:11:49.180Z' + createdBy: + nullable: true + type: string + description: The unique identifier of the user who created the Shared Env Var. + example: 2qDDuGFTWXBLDNnqZfWPDp1A + deletedBy: + nullable: true + type: string + description: The unique identifier of the user who deleted the Shared Env Var. + example: 2qDDuGFTWXBLDNnqZfWPDp1A + updatedBy: + nullable: true + type: string + description: The unique identifier of the user who last updated the Shared Env Var. + example: 2qDDuGFTWXBLDNnqZfWPDp1A + createdAt: + type: number + description: Timestamp for when the Shared Env Var was created. + example: 1609492210000 + deletedAt: + type: number + description: Timestamp for when the Shared Env Var was (soft) deleted. + example: 1609492210000 + updatedAt: + type: number + description: Timestamp for when the Shared Env Var was last updated. + example: 1609492210000 + applyToAllCustomEnvironments: + type: boolean + enum: + - false + - true + description: whether or not this env varible applies to custom environments + customEnvironmentIds: + items: + type: string + type: array + description: The custom environment IDs that this Shared Env Var is scoped to. + decrypted: + type: boolean + enum: + - false + - true + description: whether or not this env variable is decrypted + comment: + type: string + description: A user provided comment that describes what this Shared Env Var is for. + lastEditedByDisplayName: + type: string + description: The last editor full name or username. + projectNames: + items: + type: string + type: array + envId: + type: string + envKey: + type: string + organizationId: + type: string + repository: + type: string + oldEnvVar: + properties: + created: + type: string + format: date-time + description: The date when the Shared Env Var was created. + example: '2021-02-10T13:11:49.180Z' + key: + type: string + description: The name of the Shared Env Var. + example: my-api-key + ownerId: + nullable: true + type: string + description: The unique identifier of the owner (team) the Shared Env Var was created for. + example: team_LLHUOMOoDlqOp8wPE4kFo9pE + id: + type: string + description: The unique identifier of the Shared Env Var. + example: env_XCG7t7AIHuO2SBA8667zNUiM + createdBy: + nullable: true + type: string + description: The unique identifier of the user who created the Shared Env Var. + example: 2qDDuGFTWXBLDNnqZfWPDp1A + deletedBy: + nullable: true + type: string + description: The unique identifier of the user who deleted the Shared Env Var. + example: 2qDDuGFTWXBLDNnqZfWPDp1A + updatedBy: + nullable: true + type: string + description: The unique identifier of the user who last updated the Shared Env Var. + example: 2qDDuGFTWXBLDNnqZfWPDp1A + createdAt: + type: number + description: Timestamp for when the Shared Env Var was created. + example: 1609492210000 + deletedAt: + type: number + description: Timestamp for when the Shared Env Var was (soft) deleted. + example: 1609492210000 + updatedAt: + type: number + description: Timestamp for when the Shared Env Var was last updated. + example: 1609492210000 + value: + type: string + description: The value of the Shared Env Var. + projectId: + items: + type: string + type: array + description: The unique identifiers of the projects which the Shared Env Var is linked to. + example: + - prj_2WjyKQmM8ZnGcJsPWMrHRHrE + - prj_2WjyKQmM8ZnGcJsPWMrasEFg + type: + type: string + enum: + - encrypted + - plain + - sensitive + - system + description: The type of this cosmos doc instance, if blank, assume secret. + example: encrypted + target: + items: + type: string + enum: + - development + - preview + - production + example: production + description: environments this env variable targets + type: array + description: environments this env variable targets + example: production + applyToAllCustomEnvironments: + type: boolean + enum: + - false + - true + description: whether or not this env varible applies to custom environments + customEnvironmentIds: + items: + type: string + type: array + description: The custom environment IDs that this Shared Env Var is scoped to. + decrypted: + type: boolean + enum: + - false + - true + description: whether or not this env variable is decrypted + comment: + type: string + description: A user provided comment that describes what this Shared Env Var is for. + lastEditedByDisplayName: + type: string + description: The last editor full name or username. + type: object + newEnvVar: + properties: + created: + type: string + format: date-time + description: The date when the Shared Env Var was created. + example: '2021-02-10T13:11:49.180Z' + key: + type: string + description: The name of the Shared Env Var. + example: my-api-key + ownerId: + nullable: true + type: string + description: The unique identifier of the owner (team) the Shared Env Var was created for. + example: team_LLHUOMOoDlqOp8wPE4kFo9pE + id: + type: string + description: The unique identifier of the Shared Env Var. + example: env_XCG7t7AIHuO2SBA8667zNUiM + createdBy: + nullable: true + type: string + description: The unique identifier of the user who created the Shared Env Var. + example: 2qDDuGFTWXBLDNnqZfWPDp1A + deletedBy: + nullable: true + type: string + description: The unique identifier of the user who deleted the Shared Env Var. + example: 2qDDuGFTWXBLDNnqZfWPDp1A + updatedBy: + nullable: true + type: string + description: The unique identifier of the user who last updated the Shared Env Var. + example: 2qDDuGFTWXBLDNnqZfWPDp1A + createdAt: + type: number + description: Timestamp for when the Shared Env Var was created. + example: 1609492210000 + deletedAt: + type: number + description: Timestamp for when the Shared Env Var was (soft) deleted. + example: 1609492210000 + updatedAt: + type: number + description: Timestamp for when the Shared Env Var was last updated. + example: 1609492210000 + value: + type: string + description: The value of the Shared Env Var. + projectId: + items: + type: string + type: array + description: The unique identifiers of the projects which the Shared Env Var is linked to. + example: + - prj_2WjyKQmM8ZnGcJsPWMrHRHrE + - prj_2WjyKQmM8ZnGcJsPWMrasEFg + type: + type: string + enum: + - encrypted + - plain + - sensitive + - system + description: The type of this cosmos doc instance, if blank, assume secret. + example: encrypted + target: + items: + type: string + enum: + - development + - preview + - production + example: production + description: environments this env variable targets + type: array + description: environments this env variable targets + example: production + applyToAllCustomEnvironments: + type: boolean + enum: + - false + - true + description: whether or not this env varible applies to custom environments + customEnvironmentIds: + items: + type: string + type: array + description: The custom environment IDs that this Shared Env Var is scoped to. + decrypted: + type: boolean + enum: + - false + - true + description: whether or not this env variable is decrypted + comment: + type: string + description: A user provided comment that describes what this Shared Env Var is for. + lastEditedByDisplayName: + type: string + description: The last editor full name or username. + type: object + updateDiff: + properties: + id: + type: string + key: + type: string + newKey: + type: string + oldTarget: + items: + type: string + enum: + - development + - preview + - production + type: array + newTarget: + items: + type: string + enum: + - development + - preview + - production + type: array + oldType: + type: string + newType: + type: string + oldProjects: + items: + properties: + projectName: + type: string + projectId: + type: string + required: + - projectId + type: object + type: array + newProjects: + items: + properties: + projectName: + type: string + projectId: + type: string + required: + - projectId + type: object + type: array + oldCustomEnvironmentIds: + items: + type: string + type: array + newCustomEnvironmentIds: + items: + type: string + type: array + changedValue: + type: boolean + enum: + - false + - true + required: + - changedValue + - id + type: object + scope: + type: string + expiresAt: + nullable: true + type: number + configVersion: + oneOf: + - type: string + - type: number + configChangeCount: + type: number + configChanges: + items: + type: string + description: (opaque JSON object) + type: array + restore: + type: boolean + enum: + - false + - true + rulesetName: + type: string + ruleGroups: + additionalProperties: + properties: + active: + type: boolean + enum: + - false + - true + action: + type: string + enum: + - challenge + - deny + - log + required: + - active + type: object + type: object + active: + type: boolean + enum: + - false + - true + previousOwnerId: + type: string + newOwnerId: + type: string + actorLogin: + nullable: true + type: string + description: Display name only. Logins are mutable; join on `actorAccountId`. + actorAccountId: + nullable: true + type: string + description: Stable account id on `provider`. + usedAppToken: + type: boolean + enum: + - false + - true + sourceRepo: + nullable: true + type: string + description: Source repository, "owner/name". Null when the pushed content was generated in-request (push-files-to-repo) rather than copied from a repository. + sourceCommitSha: + nullable: true + type: string + destinationRepo: + type: string + description: '"owner/name", or the raw request value if blocked before it resolved.' + destinationBranch: + nullable: true + type: string + description: Branch actually pushed to, or the requested one if blocked. + resultCommitSha: + nullable: true + type: string + outcome: + type: string + enum: + - failure + - success + failureStage: + type: string + enum: + - authorization + - push + - unexpected + - unknown + - validation + description: Mirrors `PushFailureStage` in `@api/git-push-repo`. + failureCode: + type: string + description: Sanitized code, never a raw error message. + fromDeploymentId: + type: string + toDeploymentId: + type: string + newOwner: + nullable: true + properties: + abuse: + properties: + blockHistory: + items: + properties: + action: + type: string + enum: + - blocked + - hard-blocked + - soft-blocked + - unblocked + createdAt: + type: number + caseId: + type: string + reason: + type: string + actor: + type: string + statusCode: + type: number + comment: + type: string + ineligibleForAppeal: + type: boolean + enum: + - false + - true + required: + - action + - createdAt + - reason + type: object + description: Since June 2023 + type: array + description: Since June 2023 + gitAuthHistory: + items: + type: string + type: array + description: 'Since March 2022. Helps abuse checks by tracking git auths. Format: `::`' + history: + items: + properties: + scanner: + type: string + reason: + type: string + by: + type: string + byId: + type: string + at: + type: number + required: + - at + - by + - byId + - reason + - scanner + type: object + description: (scanner history). Since November 2021. First element is newest. + type: array + description: (scanner history). Since November 2021. First element is newest. + gitLineageBlocks: + type: number + description: Since September 2023. How often did this owner trigger an actual git lineage deploy block? + gitLineageBlocksDry: + type: number + description: Since September 2023. How often did this owner trigger a git lineage deploy block dry run? + scanner: + type: string + description: Since November 2021. Guides the abuse scanner in build container. + scheduledUnblockAt: + type: string + description: 'Since December 2025. UTC timestamp string of when an auto-unblock is scheduled. Format: "Wed, 03 Dec 2025 20:32:13 GMT"' + scheduledBlock: + properties: + executeAt: + type: number + description: Unix ms timestamp of the scheduled EventBridge execution. + reason: + type: string + description: Violation reason (string value of the `Violation` enum). + source: + type: string + description: What triggered the scheduled block (string value of `TeamBlockSource`). + createdAt: + type: number + description: Unix ms timestamp of when the marker was written. + caseId: + type: string + description: Absent from the automated evaluation path, which has no case. + scheduleName: + type: string + description: EventBridge schedule name, persisted so the pending event can be cancelled. + required: + - createdAt + - executeAt + - reason + - source + type: object + description: Since June 2026. A hard block that is scheduled (the delay varies by source; see `executeAt`) but not yet executed. Powers admin visibility, scheduler dedup, and cancellation. Cleared on execution or when the team is unblocked/reviewed before `executeAt`; the executor treats its absence as "block cancelled". + updatedAt: + type: number + description: Since November 2021 + creationUserAgent: + type: string + creationIp: + type: string + removedPhoneNumbers: + type: string + required: + - updatedAt + type: object + acceptanceState: + type: string + acceptedAt: + type: number + avatar: + type: string + billing: + type: object + properties: + plan: + type: string + enum: + - enterprise + - hobby + - pro + required: + - plan + blocked: + nullable: true + type: number + blockReason: + type: string + created: + type: number + createdAt: + type: number + credentials: + items: + oneOf: + - properties: + type: + type: string + enum: + - apple + - bitbucket + - chatgpt + - github-oauth + - github-oauth-limited + - gitlab + - google + - vercel + id: + type: string + required: + - id + - type + type: object + - properties: + type: + type: string + enum: + - github-oauth-custom-host + host: + type: string + id: + type: string + required: + - host + - id + - type + type: object + type: array + customerId: + nullable: true + type: string + orbCustomerId: + nullable: true + type: string + dataCache: + properties: + excessBillingEnabled: + type: boolean + enum: + - false + - true + type: object + deletedAt: + nullable: true + type: number + deploymentSecret: + type: string + dismissedTeams: + items: + type: string + type: array + dismissedToasts: + items: + properties: + name: + type: string + dismissals: + items: + properties: + scopeId: + type: string + createdAt: + type: number + required: + - createdAt + - scopeId + type: object + type: array + required: + - dismissals + - name + type: object + type: array + favoriteProjectsAndSpaces: + items: + properties: + teamId: + type: string + projectId: + type: string + required: + - projectId + - teamId + type: object + type: array + email: + type: string + id: + type: string + importFlowGitNamespace: + nullable: true + oneOf: + - type: string + - type: number + importFlowGitNamespaceId: + nullable: true + oneOf: + - type: string + - type: number + importFlowGitProvider: + nullable: true + type: string + enum: + - bitbucket + - cursor-origin + - github + - github-custom-host + - github-limited + - gitlab + - vercel + - null + preferredScopesAndGitNamespaces: + items: + properties: + scopeId: + type: string + gitNamespaceId: + nullable: true + oneOf: + - type: string + - type: number + required: + - gitNamespaceId + - scopeId + type: object + type: array + isDomainReseller: + type: boolean + enum: + - false + - true + isZeitPub: + type: boolean + enum: + - false + - true + testAccountExpiresAt: + type: number + maxActiveSlots: + type: number + name: + type: string + phoneNumber: + type: string + platformVersion: + nullable: true + type: number + preventAutoBlocking: + oneOf: + - type: number + - type: boolean + enum: + - false + - true + projectDomainsLimit: + type: number + description: Overrides our DEFAULT project domains limit per account or per project. + projectCardWidgetPreferences: + items: + properties: + projectId: + type: string + widget: + type: string + enum: + - analytics-online + - analytics-page-views + - analytics-visitors + - firewall-allowed + - firewall-denied + - observability-alert + - observability-edge-requests + - observability-error-rate + - observability-function-invocations + - shortcut + - speed-insights-cls + - speed-insights-lcp + - speed-insights-res + config: + properties: + url: + type: string + required: + - url + type: object + required: + - projectId + - widget + type: object + type: array + remoteCaching: + properties: + enabled: + type: boolean + enum: + - false + - true + type: object + description: Represents configuration for remote caching + removedAliasesAt: + type: number + removedBillingSubscriptionAt: + type: number + removedConfigurationsAt: + type: number + removedDeploymentsAt: + type: number + removedDomiansAt: + type: number + removedEventsAt: + type: number + removedProjectsAt: + type: number + removedSecretsAt: + type: number + removedSharedEnvVarsAt: + type: number + removedEdgeConfigsAt: + type: number + resourceConfig: + properties: + concurrentBuilds: + type: number + nodeType: + type: string + elasticConcurrencyEnabled: + type: boolean + enum: + - false + - true + buildEntitlements: + properties: + enhancedBuilds: + type: boolean + enum: + - false + - true + type: object + buildQueue: + properties: + configuration: + type: string + enum: + - SKIP_NAMESPACE_QUEUE + - WAIT_FOR_NAMESPACE_QUEUE + type: object + awsAccountType: + type: string + awsAccountIds: + items: + type: string + type: array + cfZoneName: + type: string + imageOptimizationType: + type: string + edgeConfigs: + type: number + edgeConfigSize: + type: number + edgeFunctionMaxSizeBytes: + type: number + edgeFunctionExecutionTimeoutMs: + type: number + serverlessFunctionMaxDuration: + type: number + serverlessFunctionMaxMemorySize: + type: number + kvDatabases: + type: number + postgresDatabases: + type: number + blobStores: + type: number + integrationStores: + type: number + cronJobsPerProject: + type: number + microfrontendGroupsPerTeam: + type: number + microfrontendProjectsPerGroup: + type: number + flagsExplorerOverridesThreshold: + type: number + flagsExplorerUnlimitedOverrides: + type: boolean + enum: + - false + - true + customEnvironmentsPerProject: + type: number + security: + properties: + rateLimit: + type: number + customRules: + type: number + ipBlocks: + type: number + ipBypass: + type: number + type: object + bulkRedirectsFreeLimitOverride: + type: number + buildMachine: + properties: + default: + type: string + enum: + - basic + - elastic + - enhanced + - standard + - turbo + description: Default build machine type for new deployments. This must be used in combination with the buildEntitlements field. It is respected over Vercel's notion of the default build machine, and was originally implemented to allow Teams to "downgrade". - Hobby customers cannot set this, because they only have access to one machine type - Pro customers get Turbo machines by default, so this field is effectively for downgrading - ENT customers cannot set this (yet), because their default is based on their contract. https://linear.app/vercel/project/self-serve-build-machines-for-enterprise-customers-0cbc357e26d2/overview + type: object + description: Build machine configuration recorded on a team or user `resourceConfig`. This is deliberately separate from the build machine config recorded on a deployment (`DeploymentBuildMachine` in `@api/deployments-types`). A team/user only expresses its default machine for new deployments; the per-build fields (`purchaseType`, `defaultPurchaseType`, `machineSelectionType`, `cores`, `memory`) are recorded on the deployment record when a build actually runs and never belong on a team/user document. + type: object + resourceLimits: + additionalProperties: + oneOf: + - properties: + max: + type: number + duration: + type: number + required: + - duration + - max + type: object + description: 'Override for a token-bucket rate limit: a fixed quantity per duration.' + - properties: + minRate: + type: number + maxRate: + type: number + stepPerMinute: + type: number + type: object + description: 'Overrides for a ramp (slew-rate) admission limit, which bounds how quickly the allowed rate may change over time rather than capping a fixed quantity. All three are expressed in units per minute. - `minRate`: the floor the allowed rate never drops below. Also the cold-start rate a new or idle consumer begins at. - `maxRate`: the ceiling the allowed rate may climb to. - `stepPerMinute`: how much the allowed rate moves per minute of activity — the slope at which it ramps up toward `maxRate` (and, where supported, decays back down toward `minRate`).' + type: object + description: User | Team resource limits. Each entry overrides either a token-bucket rate limit or a ramp admission limit, never both. + activeDashboardViews: + items: + properties: + scopeId: + type: string + viewPreference: + nullable: true + type: string + enum: + - cards + - list + - null + favoritesViewPreference: + nullable: true + type: string + enum: + - closed + - open + - null + recentsViewPreference: + nullable: true + type: string + enum: + - closed + - open + - null + required: + - scopeId + type: object + type: array + secondaryEmails: + items: + properties: + email: + type: string + verified: + type: boolean + enum: + - false + - true + required: + - email + - verified + type: object + type: array + emailDomains: + items: + type: string + type: array + emailNotifications: + properties: + rules: + additionalProperties: + properties: + email: + type: string + required: + - email + type: object + type: object + type: object + siftScore: + type: number + siftScores: + additionalProperties: + properties: + score: + type: number + reasons: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + required: + - reasons + - score + type: object + type: object + siftRoute: + properties: + name: + type: string + enum: + - string + required: + - name + type: object + sfdcId: + type: string + softBlock: + nullable: true + properties: + blockedAt: + type: number + reason: + type: string + enum: + - BLOCKED_FOR_PLATFORM_ABUSE + - DOMAIN_OWNER_DELETION_REQUEST + - ENTERPRISE_TRIAL_ENDED + - ENTERPRISE_UNPAID_INVOICE + - EXPOSURE_CAP_EXCEEDED + - FAIR_USE_LIMITS_EXCEEDED + - SUBSCRIPTION_CANCELED + - SUBSCRIPTION_EXPIRED + - UNPAID_INVOICE + blockedDueToOverageType: + type: string + enum: + - analyticsUsage + - artifacts + - bandwidth + - blobDataTransfer + - blobTotalAdvancedRequests + - blobTotalAvgSizeInBytes + - blobTotalGetResponseObjectSizeInBytes + - blobTotalSimpleRequests + - connectDataTransfer + - dataCacheRead + - dataCacheWrite + - edgeConfigRead + - edgeConfigWrite + - edgeFunctionExecutionUnits + - edgeMiddlewareInvocations + - edgeRequest + - edgeRequestAdditionalCpuDuration + - elasticConcurrencyBuildSlots + - fastDataTransfer + - fastOriginTransfer + - fluidCpuDuration + - fluidDuration + - functionDuration + - functionInvocation + - imageOptimizationCacheRead + - imageOptimizationCacheWrite + - imageOptimizationTransformation + - logDrainsVolume + - monitoringMetric + - observabilityEvent + - onDemandConcurrencyMinutes + - runtimeCacheRead + - runtimeCacheWrite + - serverlessFunctionExecution + - sourceImages + - wafOwaspExcessBytes + - wafOwaspRequests + - wafRateLimitRequest + - webAnalyticsEvent + unpauseAt: + type: number + description: Since September 2026. Set only by `billing-usage-alerts` for usage plans with a `blockDurationMs`; its presence marks a pause that expires on its own. required: - - price - - quantity - - hidden + - blockedAt + - reason + type: object + stagingPrefix: + type: string + sysToken: + type: string + teams: + items: + properties: + teamId: + type: string + createdAt: + type: number + role: + type: string + enum: + - BILLING + - CONTRIBUTOR + - DEVELOPER + - MEMBER + - OWNER + - SECURITY + - VIEWER + - VIEWER_FOR_PLUS + confirmed: + type: boolean + enum: + - true + confirmedAt: + type: number + accessRequestedAt: + type: number + teamRoles: + items: + type: string + enum: + - BILLING + - CONTRIBUTOR + - DEVELOPER + - MEMBER + - OWNER + - SECURITY + - VIEWER + - VIEWER_FOR_PLUS + type: array + teamPermissions: + items: + type: string + enum: + - AiGatewayApiKeyOwnedBySelf + - AiGatewayBudgetManager + - AiGatewayCredits + - AiGatewaySettings + - AiGatewayTranscriptsManager + - AiGatewayTranscriptsViewer + - ConnectorManager + - CreateProject + - EnvVariableManager + - EnvironmentManager + - FullProductionDeployment + - IntegrationManager + - OrgAdmin + - OrgViewer + - UsageViewer + - V0Builder + - V0Chatter + - V0Viewer + - WorkflowDecryptor + type: array + created: + type: number + joinedFrom: + properties: + origin: + type: string + enum: + - account-update + - bitbucket + - dsync + - feedback + - github + - gitlab + - import + - link + - mail + - nsnb-auto-approve + - nsnb-hobby-upgrade + - nsnb-invite + - nsnb-redeploy + - nsnb-redeploy-attribution-card + - nsnb-request-access + - nsnb-viewer-upgrade + - organization-teams + - saml + - teams + commitId: + type: string + repoId: + type: string + repoPath: + type: string + gitUserId: + oneOf: + - type: string + - type: number + gitUserLogin: + type: string + ssoUserId: + type: string + ssoConnectedAt: + type: number + idpUserId: + type: string + dsyncUserId: + type: string + dsyncConnectedAt: + type: number + required: + - origin + type: object + required: + - confirmed + - confirmedAt + - created + - createdAt + - role + - teamId + type: object + type: array + description: A helper that allows to describe a relationship attribute. It receives the shape of a relationship plus the foreignKey name to make it mandatory in the resulting type. + trialTeamIds: + items: + type: string + type: array + description: Introduced 2022-04-12 An array of teamIds (for trial teams created after 2022-04-01), created by the user in question. Used in determining whether the team has a trial available in utils/api-teams/user-has-trial-available.ts. + maxTrials: + type: number + description: Introduced 2022-04-19 Number of maximum trials to allocate to a user. When undefined, defaults to MAX_TRIALS in utils/api-teams/user-has-trial-available.ts. This is set to trialTeamIds + 1 by services/api-backoffice/src/handlers/add-additional-trial.ts. + trialTeamId: + type: string + description: Deprecated on 2022-04-12 in favor of trialTeamIds and using utils/api-teams/user-has-trial-available.ts. + type: + type: string + enum: + - user + usageAlerts: + nullable: true + properties: + warningAt: + nullable: true + type: number + blockingAt: + nullable: true + type: number + type: object + description: Contains the timestamps when a user was notified about their usage + overageUsageAlerts: + properties: + analyticsUsage: + properties: + currentThreshold: + type: number + warningAt: + nullable: true + type: number + blockedAt: + nullable: true + type: number + blockGracePeriodStartedAt: + nullable: true + type: number + required: + - currentThreshold + type: object + artifacts: + properties: + currentThreshold: + type: number + warningAt: + nullable: true + type: number + blockedAt: + nullable: true + type: number + blockGracePeriodStartedAt: + nullable: true + type: number + required: + - currentThreshold + type: object + bandwidth: + properties: + currentThreshold: + type: number + warningAt: + nullable: true + type: number + blockedAt: + nullable: true + type: number + blockGracePeriodStartedAt: + nullable: true + type: number + required: + - currentThreshold + type: object + blobTotalAdvancedRequests: + properties: + currentThreshold: + type: number + warningAt: + nullable: true + type: number + blockedAt: + nullable: true + type: number + blockGracePeriodStartedAt: + nullable: true + type: number + required: + - currentThreshold + type: object + blobTotalAvgSizeInBytes: + properties: + currentThreshold: + type: number + warningAt: + nullable: true + type: number + blockedAt: + nullable: true + type: number + blockGracePeriodStartedAt: + nullable: true + type: number + required: + - currentThreshold + type: object + blobTotalGetResponseObjectSizeInBytes: + properties: + currentThreshold: + type: number + warningAt: + nullable: true + type: number + blockedAt: + nullable: true + type: number + blockGracePeriodStartedAt: + nullable: true + type: number + required: + - currentThreshold + type: object + blobTotalSimpleRequests: + properties: + currentThreshold: + type: number + warningAt: + nullable: true + type: number + blockedAt: + nullable: true + type: number + blockGracePeriodStartedAt: + nullable: true + type: number + required: + - currentThreshold + type: object + connectDataTransfer: + properties: + currentThreshold: + type: number + warningAt: + nullable: true + type: number + blockedAt: + nullable: true + type: number + blockGracePeriodStartedAt: + nullable: true + type: number + required: + - currentThreshold + type: object + dataCacheRead: + properties: + currentThreshold: + type: number + warningAt: + nullable: true + type: number + blockedAt: + nullable: true + type: number + blockGracePeriodStartedAt: + nullable: true + type: number + required: + - currentThreshold + type: object + dataCacheWrite: + properties: + currentThreshold: + type: number + warningAt: + nullable: true + type: number + blockedAt: + nullable: true + type: number + blockGracePeriodStartedAt: + nullable: true + type: number + required: + - currentThreshold + type: object + edgeConfigRead: + properties: + currentThreshold: + type: number + warningAt: + nullable: true + type: number + blockedAt: + nullable: true + type: number + blockGracePeriodStartedAt: + nullable: true + type: number + required: + - currentThreshold + type: object + edgeConfigWrite: + properties: + currentThreshold: + type: number + warningAt: + nullable: true + type: number + blockedAt: + nullable: true + type: number + blockGracePeriodStartedAt: + nullable: true + type: number + required: + - currentThreshold + type: object + edgeFunctionExecutionUnits: + properties: + currentThreshold: + type: number + warningAt: + nullable: true + type: number + blockedAt: + nullable: true + type: number + blockGracePeriodStartedAt: + nullable: true + type: number + required: + - currentThreshold + type: object + edgeMiddlewareInvocations: + properties: + currentThreshold: + type: number + warningAt: + nullable: true + type: number + blockedAt: + nullable: true + type: number + blockGracePeriodStartedAt: + nullable: true + type: number + required: + - currentThreshold + type: object + edgeRequestAdditionalCpuDuration: + properties: + currentThreshold: + type: number + warningAt: + nullable: true + type: number + blockedAt: + nullable: true + type: number + blockGracePeriodStartedAt: + nullable: true + type: number + required: + - currentThreshold + type: object + edgeRequest: + properties: + currentThreshold: + type: number + warningAt: + nullable: true + type: number + blockedAt: + nullable: true + type: number + blockGracePeriodStartedAt: + nullable: true + type: number + required: + - currentThreshold + type: object + elasticConcurrencyBuildSlots: + properties: + currentThreshold: + type: number + warningAt: + nullable: true + type: number + blockedAt: + nullable: true + type: number + blockGracePeriodStartedAt: + nullable: true + type: number + required: + - currentThreshold + type: object + fastDataTransfer: + properties: + currentThreshold: + type: number + warningAt: + nullable: true + type: number + blockedAt: + nullable: true + type: number + blockGracePeriodStartedAt: + nullable: true + type: number + required: + - currentThreshold + type: object + fastOriginTransfer: + properties: + currentThreshold: + type: number + warningAt: + nullable: true + type: number + blockedAt: + nullable: true + type: number + blockGracePeriodStartedAt: + nullable: true + type: number + required: + - currentThreshold + type: object + fluidCpuDuration: + properties: + currentThreshold: + type: number + warningAt: + nullable: true + type: number + blockedAt: + nullable: true + type: number + blockGracePeriodStartedAt: + nullable: true + type: number + required: + - currentThreshold + type: object + fluidDuration: + properties: + currentThreshold: + type: number + warningAt: + nullable: true + type: number + blockedAt: + nullable: true + type: number + blockGracePeriodStartedAt: + nullable: true + type: number + required: + - currentThreshold + type: object + functionDuration: + properties: + currentThreshold: + type: number + warningAt: + nullable: true + type: number + blockedAt: + nullable: true + type: number + blockGracePeriodStartedAt: + nullable: true + type: number + required: + - currentThreshold + type: object + functionInvocation: + properties: + currentThreshold: + type: number + warningAt: + nullable: true + type: number + blockedAt: + nullable: true + type: number + blockGracePeriodStartedAt: + nullable: true + type: number + required: + - currentThreshold + type: object + imageOptimizationCacheRead: + properties: + currentThreshold: + type: number + warningAt: + nullable: true + type: number + blockedAt: + nullable: true + type: number + blockGracePeriodStartedAt: + nullable: true + type: number + required: + - currentThreshold + type: object + imageOptimizationCacheWrite: + properties: + currentThreshold: + type: number + warningAt: + nullable: true + type: number + blockedAt: + nullable: true + type: number + blockGracePeriodStartedAt: + nullable: true + type: number + required: + - currentThreshold + type: object + imageOptimizationTransformation: + properties: + currentThreshold: + type: number + warningAt: + nullable: true + type: number + blockedAt: + nullable: true + type: number + blockGracePeriodStartedAt: + nullable: true + type: number + required: + - currentThreshold + type: object + logDrainsVolume: + properties: + currentThreshold: + type: number + warningAt: + nullable: true + type: number + blockedAt: + nullable: true + type: number + blockGracePeriodStartedAt: + nullable: true + type: number + required: + - currentThreshold + type: object + monitoringMetric: + properties: + currentThreshold: + type: number + warningAt: + nullable: true + type: number + blockedAt: + nullable: true + type: number + blockGracePeriodStartedAt: + nullable: true + type: number + required: + - currentThreshold + type: object + blobDataTransfer: + properties: + currentThreshold: + type: number + warningAt: + nullable: true + type: number + blockedAt: + nullable: true + type: number + blockGracePeriodStartedAt: + nullable: true + type: number + required: + - currentThreshold + type: object + observabilityEvent: + properties: + currentThreshold: + type: number + warningAt: + nullable: true + type: number + blockedAt: + nullable: true + type: number + blockGracePeriodStartedAt: + nullable: true + type: number + required: + - currentThreshold + type: object + onDemandConcurrencyMinutes: + properties: + currentThreshold: + type: number + warningAt: + nullable: true + type: number + blockedAt: + nullable: true + type: number + blockGracePeriodStartedAt: + nullable: true + type: number + required: + - currentThreshold + type: object + runtimeCacheRead: + properties: + currentThreshold: + type: number + warningAt: + nullable: true + type: number + blockedAt: + nullable: true + type: number + blockGracePeriodStartedAt: + nullable: true + type: number + required: + - currentThreshold + type: object + runtimeCacheWrite: + properties: + currentThreshold: + type: number + warningAt: + nullable: true + type: number + blockedAt: + nullable: true + type: number + blockGracePeriodStartedAt: + nullable: true + type: number + required: + - currentThreshold + type: object + serverlessFunctionExecution: + properties: + currentThreshold: + type: number + warningAt: + nullable: true + type: number + blockedAt: + nullable: true + type: number + blockGracePeriodStartedAt: + nullable: true + type: number + required: + - currentThreshold + type: object + sourceImages: + properties: + currentThreshold: + type: number + warningAt: + nullable: true + type: number + blockedAt: + nullable: true + type: number + blockGracePeriodStartedAt: + nullable: true + type: number + required: + - currentThreshold + type: object + wafOwaspExcessBytes: + properties: + currentThreshold: + type: number + warningAt: + nullable: true + type: number + blockedAt: + nullable: true + type: number + blockGracePeriodStartedAt: + nullable: true + type: number + required: + - currentThreshold + type: object + wafOwaspRequests: + properties: + currentThreshold: + type: number + warningAt: + nullable: true + type: number + blockedAt: + nullable: true + type: number + blockGracePeriodStartedAt: + nullable: true + type: number + required: + - currentThreshold + type: object + wafRateLimitRequest: + properties: + currentThreshold: + type: number + warningAt: + nullable: true + type: number + blockedAt: + nullable: true + type: number + blockGracePeriodStartedAt: + nullable: true + type: number + required: + - currentThreshold + type: object + webAnalyticsEvent: + properties: + currentThreshold: + type: number + warningAt: + nullable: true + type: number + blockedAt: + nullable: true + type: number + blockGracePeriodStartedAt: + nullable: true + type: number + required: + - currentThreshold + type: object type: object - description: 'Will be used to create an invoice item. The price must be in cents: 2000 for $20.' - pro: + overageMetadata: properties: - tier: + firstTimeOnDemandNotificationSentAt: type: number - price: + description: Tracks if the first time on-demand overage email has been sent. + dailyOverageSummaryEmailSentAt: type: number - quantity: + description: Tracks the last time we sent a daily summary email. + weeklyOverageSummaryEmailSentAt: type: number - name: - type: string - hidden: - type: boolean - createdAt: + description: Tracks the last time we sent a weekly summary email. + overageSummaryExpiresAt: type: number - disabledAt: - nullable: true + description: Tracks when the overage summary email will stop auto-sending. We currently lock the user into email for a month after the last on-demand usage. + increasedOnDemandEmailSentAt: + type: number + description: Tracks the last time we sent a increased on-demand email. + increasedOnDemandEmailAttemptedAt: + type: number + description: Tracks the last time we attempted to send an increased on-demand email. This check is to limit the number of attempts per day. + type: object + description: Contains the timestamps for usage summary emails. + speedInsightsFreeUsageAlert: + properties: + currentThreshold: type: number - frequency: + description: Highest allocation percentage threshold notified (e.g. 75 or 100). + notifiedAt: + type: number + description: When the notification for `currentThreshold` was sent. + required: + - currentThreshold + - notifiedAt + type: object + description: Tracks notifications sent for the team-wide Speed Insights free allocation. The allocation is measured over a rolling window (not a billing period), so deduplication is time-based rather than reset at period start. + username: + type: string + updatedAt: + type: number + enablePreviewFeedback: + type: string + enum: + - default + - default-force + - 'off' + - off-force + - 'on' + - on-force + description: Whether the Vercel Toolbar is enabled for preview deployments. + featureBlocks: + properties: + webAnalytics: properties: - interval: + updatedAt: + type: number + blockedFrom: + type: number + blockedUntil: + type: number + blockReason: type: string enum: - - month - intervalCount: + - admin_override + - hard_blocked + - limits_exceeded + graceEmailSentAt: type: number - enum: - - 1 - - 2 - - 3 - - 6 - - 12 required: - - interval - - intervalCount + - blockReason + - updatedAt type: object - maxQuantity: - type: number - required: - - price - - quantity - - hidden - type: object - description: 'Will be used to create an invoice item. The price must be in cents: 2000 for $20.' - enterprise: - properties: - tier: - type: number - price: - type: number - quantity: - type: number - name: - type: string - hidden: - type: boolean - createdAt: - type: number - disabledAt: - nullable: true - type: number - frequency: + monitoring: properties: - interval: + updatedAt: + type: number + blockedFrom: + type: number + blockedUntil: + type: number + blockReason: + type: string + enum: + - admin_override + - hard_blocked + - limits_exceeded + blockType: type: string enum: - - month - intervalCount: + - hard + - soft + required: + - blockReason + - blockType + - updatedAt + type: object + description: A soft block indicates a temporary pause in data collection (ex limit exceeded for the current cycle) A hard block indicates a stoppage in data collection that requires manual intervention (ex upgrading a pro trial) + observabilityPlus: + properties: + updatedAt: + type: number + blockedFrom: type: number + blockedUntil: + type: number + blockReason: + type: string + enum: + - admin_override + - hard_blocked + - limits_exceeded + blockType: + type: string enum: - - 1 - - 2 - - 3 - - 6 - - 12 + - hard + - soft required: - - interval - - intervalCount + - blockReason + - blockType + - updatedAt type: object - maxQuantity: - type: number - required: - - price - - quantity - - hidden - type: object - description: 'Will be used to create an invoice item. The price must be in cents: 2000 for $20.' - analytics: - properties: - tier: - type: number - price: - type: number - quantity: - type: number - name: - type: string - hidden: - type: boolean - createdAt: - type: number - disabledAt: - nullable: true - type: number - frequency: + dataCache: properties: - interval: + updatedAt: + type: number + blockedFrom: + type: number + blockedUntil: + type: number + blockReason: type: string enum: - - month - intervalCount: + - admin_override + - hard_blocked + - limits_exceeded + required: + - blockReason + - updatedAt + type: object + imageOptimizationTransformation: + properties: + updatedAt: type: number + blockedFrom: + type: number + blockedUntil: + type: number + blockReason: + type: string enum: - - 1 - - 2 - - 3 - - 6 - - 12 + - admin_override + - hard_blocked + - limits_exceeded required: - - interval - - intervalCount + - blockReason + - updatedAt type: object - maxQuantity: - type: number - required: - - price - - quantity - - hidden - type: object - description: 'Will be used to create an invoice item. The price must be in cents: 2000 for $20.' - monitoring: - properties: - tier: - type: number - price: - type: number - quantity: - type: number - name: - type: string - hidden: - type: boolean - createdAt: - type: number - disabledAt: - nullable: true - type: number - frequency: + sourceImages: properties: - interval: + updatedAt: + type: number + blockedFrom: + type: number + blockedUntil: + type: number + blockReason: type: string enum: - - month - intervalCount: + - admin_override + - hard_blocked + - limits_exceeded + required: + - blockReason + - updatedAt + type: object + blob: + oneOf: + - properties: + updatedAt: + type: number + blockedFrom: + type: number + blockedUntil: + type: number + blockReason: + type: string + enum: + - limits_exceeded + overageReason: + type: string + enum: + - analyticsUsage + - artifacts + - bandwidth + - blobDataTransfer + - blobTotalAdvancedRequests + - blobTotalAvgSizeInBytes + - blobTotalGetResponseObjectSizeInBytes + - blobTotalSimpleRequests + - connectDataTransfer + - dataCacheRead + - dataCacheWrite + - edgeConfigRead + - edgeConfigWrite + - edgeFunctionExecutionUnits + - edgeMiddlewareInvocations + - edgeRequest + - edgeRequestAdditionalCpuDuration + - elasticConcurrencyBuildSlots + - fastDataTransfer + - fastOriginTransfer + - fluidCpuDuration + - fluidDuration + - functionDuration + - functionInvocation + - imageOptimizationCacheRead + - imageOptimizationCacheWrite + - imageOptimizationTransformation + - logDrainsVolume + - monitoringMetric + - observabilityEvent + - onDemandConcurrencyMinutes + - runtimeCacheRead + - runtimeCacheWrite + - serverlessFunctionExecution + - sourceImages + - wafOwaspExcessBytes + - wafOwaspRequests + - wafRateLimitRequest + - webAnalyticsEvent + required: + - blockReason + - overageReason + - updatedAt + type: object + - properties: + updatedAt: + type: number + blockedFrom: + type: number + blockedUntil: + type: number + blockReason: + type: string + enum: + - admin_override + - hard_blocked + required: + - blockReason + - updatedAt + type: object + postgres: + oneOf: + - properties: + updatedAt: + type: number + blockedFrom: + type: number + blockedUntil: + type: number + blockReason: + type: string + enum: + - limits_exceeded + overageReason: + type: string + enum: + - analyticsUsage + - artifacts + - bandwidth + - blobDataTransfer + - blobTotalAdvancedRequests + - blobTotalAvgSizeInBytes + - blobTotalGetResponseObjectSizeInBytes + - blobTotalSimpleRequests + - connectDataTransfer + - dataCacheRead + - dataCacheWrite + - edgeConfigRead + - edgeConfigWrite + - edgeFunctionExecutionUnits + - edgeMiddlewareInvocations + - edgeRequest + - edgeRequestAdditionalCpuDuration + - elasticConcurrencyBuildSlots + - fastDataTransfer + - fastOriginTransfer + - fluidCpuDuration + - fluidDuration + - functionDuration + - functionInvocation + - imageOptimizationCacheRead + - imageOptimizationCacheWrite + - imageOptimizationTransformation + - logDrainsVolume + - monitoringMetric + - observabilityEvent + - onDemandConcurrencyMinutes + - runtimeCacheRead + - runtimeCacheWrite + - serverlessFunctionExecution + - sourceImages + - wafOwaspExcessBytes + - wafOwaspRequests + - wafRateLimitRequest + - webAnalyticsEvent + required: + - blockReason + - overageReason + - updatedAt + type: object + - properties: + updatedAt: + type: number + blockedFrom: + type: number + blockedUntil: + type: number + blockReason: + type: string + enum: + - admin_override + - hard_blocked + required: + - blockReason + - updatedAt + type: object + redis: + oneOf: + - properties: + updatedAt: + type: number + blockedFrom: + type: number + blockedUntil: + type: number + blockReason: + type: string + enum: + - limits_exceeded + overageReason: + type: string + enum: + - analyticsUsage + - artifacts + - bandwidth + - blobDataTransfer + - blobTotalAdvancedRequests + - blobTotalAvgSizeInBytes + - blobTotalGetResponseObjectSizeInBytes + - blobTotalSimpleRequests + - connectDataTransfer + - dataCacheRead + - dataCacheWrite + - edgeConfigRead + - edgeConfigWrite + - edgeFunctionExecutionUnits + - edgeMiddlewareInvocations + - edgeRequest + - edgeRequestAdditionalCpuDuration + - elasticConcurrencyBuildSlots + - fastDataTransfer + - fastOriginTransfer + - fluidCpuDuration + - fluidDuration + - functionDuration + - functionInvocation + - imageOptimizationCacheRead + - imageOptimizationCacheWrite + - imageOptimizationTransformation + - logDrainsVolume + - monitoringMetric + - observabilityEvent + - onDemandConcurrencyMinutes + - runtimeCacheRead + - runtimeCacheWrite + - serverlessFunctionExecution + - sourceImages + - wafOwaspExcessBytes + - wafOwaspRequests + - wafRateLimitRequest + - webAnalyticsEvent + required: + - blockReason + - overageReason + - updatedAt + type: object + - properties: + updatedAt: + type: number + blockedFrom: + type: number + blockedUntil: + type: number + blockReason: + type: string + enum: + - admin_override + - hard_blocked + required: + - blockReason + - updatedAt + type: object + microfrontendsRequest: + properties: + updatedAt: + type: number + blockedFrom: type: number + blockedUntil: + type: number + blockReason: + type: string enum: - - 1 - - 2 - - 3 - - 6 - - 12 + - admin_override + - hard_blocked + - limits_exceeded required: - - interval - - intervalCount + - blockReason + - updatedAt type: object - maxQuantity: - type: number - required: - - price - - quantity - - hidden - type: object - description: 'Will be used to create an invoice item. The price must be in cents: 2000 for $20.' - passwordProtection: - properties: - tier: - type: number - price: - type: number - quantity: - type: number - name: - type: string - hidden: - type: boolean - createdAt: - type: number - disabledAt: - nullable: true - type: number - frequency: + workflowStorageWrite: properties: - interval: + updatedAt: + type: number + blockedFrom: + type: number + blockedUntil: + type: number + blockReason: type: string enum: - - month - intervalCount: + - admin_override + - hard_blocked + - limits_exceeded + required: + - blockReason + - updatedAt + type: object + workflowEvents: + properties: + updatedAt: + type: number + blockedFrom: + type: number + blockedUntil: type: number + blockReason: + type: string enum: - - 1 - - 2 - - 3 - - 6 - - 12 + - admin_override + - hard_blocked + - limits_exceeded required: - - interval - - intervalCount + - blockReason + - updatedAt type: object - maxQuantity: - type: number - required: - - price - - quantity - - hidden - type: object - description: 'Will be used to create an invoice item. The price must be in cents: 2000 for $20.' - previewDeploymentSuffix: - properties: - tier: - type: number - price: - type: number - quantity: - type: number - name: - type: string - hidden: - type: boolean - createdAt: - type: number - disabledAt: - nullable: true - type: number - frequency: + connexForwardTriggers: properties: - interval: + updatedAt: + type: number + blockedFrom: + type: number + blockedUntil: + type: number + blockReason: type: string enum: - - month - intervalCount: + - admin_override + - hard_blocked + - limits_exceeded + required: + - blockReason + - updatedAt + type: object + connexTokenRequests: + properties: + updatedAt: + type: number + blockedFrom: type: number + blockedUntil: + type: number + blockReason: + type: string enum: - - 1 - - 2 - - 3 - - 6 - - 12 + - admin_override + - hard_blocked + - limits_exceeded required: - - interval - - intervalCount + - blockReason + - updatedAt type: object - maxQuantity: - type: number - required: - - price - - quantity - - hidden - type: object - description: 'Will be used to create an invoice item. The price must be in cents: 2000 for $20.' - saml: - properties: - tier: - type: number - price: - type: number - quantity: - type: number - name: - type: string - hidden: - type: boolean - createdAt: - type: number - disabledAt: - nullable: true - type: number - frequency: + kmsOperations: properties: - interval: + updatedAt: + type: number + blockedFrom: + type: number + blockedUntil: + type: number + blockReason: type: string enum: - - month - intervalCount: + - admin_override + - hard_blocked + - limits_exceeded + required: + - blockReason + - updatedAt + type: object + tracing: + properties: + updatedAt: type: number + blockedFrom: + type: number + blockedUntil: + type: number + blockReason: + type: string enum: - - 1 - - 2 - - 3 - - 6 - - 12 + - admin_override + - hard_blocked + - limits_exceeded required: - - interval - - intervalCount + - blockReason + - updatedAt type: object - maxQuantity: - type: number - required: - - price - - quantity - - hidden - type: object - description: 'Will be used to create an invoice item. The price must be in cents: 2000 for $20.' - teamSeats: - properties: - tier: - type: number - price: - type: number - quantity: - type: number - name: - type: string - hidden: - type: boolean - createdAt: - type: number - disabledAt: - nullable: true - type: number - frequency: + sandboxStorage: properties: - interval: + updatedAt: + type: number + blockedFrom: + type: number + blockedUntil: + type: number + blockReason: type: string enum: - - month - intervalCount: + - admin_override + - hard_blocked + - limits_exceeded + required: + - blockReason + - updatedAt + type: object + vcr: + properties: + updatedAt: + type: number + blockedFrom: type: number + blockedUntil: + type: number + blockReason: + type: string enum: - - 1 - - 2 - - 3 - - 6 - - 12 + - admin_override + - hard_blocked + - limits_exceeded required: - - interval - - intervalCount + - blockReason + - updatedAt type: object - maxQuantity: - type: number - required: - - price - - quantity - - hidden - type: object - description: 'Will be used to create an invoice item. The price must be in cents: 2000 for $20.' - analyticsUsage: - properties: - tier: - type: number - price: - type: number - batch: - type: number - threshold: - type: number - name: - type: string - hidden: - type: boolean - disabledAt: - nullable: true - type: number - enabledAt: - nullable: true - type: number - required: - - price - - batch - - threshold - - hidden - type: object - artifacts: - properties: - tier: - type: number - price: - type: number - batch: - type: number - threshold: - type: number - name: - type: string - hidden: - type: boolean - disabledAt: - nullable: true - type: number - enabledAt: - nullable: true - type: number - required: - - price - - batch - - threshold - - hidden - type: object - bandwidth: - properties: - tier: - type: number - price: - type: number - batch: - type: number - threshold: - type: number - name: - type: string - hidden: - type: boolean - disabledAt: - nullable: true - type: number - enabledAt: - nullable: true - type: number - required: - - price - - batch - - threshold - - hidden - type: object - cronJobInvocation: - properties: - tier: - type: number - price: - type: number - batch: - type: number - threshold: - type: number - name: - type: string - hidden: - type: boolean - disabledAt: - nullable: true - type: number - enabledAt: - nullable: true - type: number - required: - - price - - batch - - threshold - - hidden - type: object - dataCacheRead: - properties: - tier: - type: number - price: - type: number - batch: - type: number - threshold: - type: number - name: - type: string - hidden: - type: boolean - disabledAt: - nullable: true - type: number - enabledAt: - nullable: true - type: number - required: - - price - - batch - - threshold - - hidden - type: object - dataCacheRevalidation: - properties: - tier: - type: number - price: - type: number - batch: - type: number - threshold: - type: number - name: - type: string - hidden: - type: boolean - disabledAt: - nullable: true - type: number - enabledAt: - nullable: true - type: number - required: - - price - - batch - - threshold - - hidden - type: object - dataCacheWrite: - properties: - tier: - type: number - price: - type: number - batch: - type: number - threshold: - type: number - name: - type: string - hidden: - type: boolean - disabledAt: - nullable: true - type: number - enabledAt: - nullable: true - type: number - required: - - price - - batch - - threshold - - hidden - type: object - edgeConfigRead: - properties: - tier: - type: number - price: - type: number - batch: - type: number - threshold: - type: number - name: - type: string - hidden: - type: boolean - disabledAt: - nullable: true - type: number - enabledAt: - nullable: true - type: number - required: - - price - - batch - - threshold - - hidden - type: object - edgeConfigWrite: - properties: - tier: - type: number - price: - type: number - batch: - type: number - threshold: - type: number - name: - type: string - hidden: - type: boolean - disabledAt: - nullable: true - type: number - enabledAt: - nullable: true - type: number - required: - - price - - batch - - threshold - - hidden - type: object - edgeFunctionExecutionUnits: - properties: - tier: - type: number - price: - type: number - batch: - type: number - threshold: - type: number - name: - type: string - hidden: - type: boolean - disabledAt: - nullable: true - type: number - enabledAt: - nullable: true - type: number - required: - - price - - batch - - threshold - - hidden - type: object - edgeMiddlewareInvocations: - properties: - tier: - type: number - price: - type: number - batch: - type: number - threshold: - type: number - name: - type: string - hidden: - type: boolean - disabledAt: - nullable: true - type: number - enabledAt: - nullable: true - type: number - required: - - price - - batch - - threshold - - hidden + speedInsightsFree: + properties: + updatedAt: + type: number + blockedFrom: + type: number + blockedUntil: + type: number + blockReason: + type: string + enum: + - admin_override + - hard_blocked + - limits_exceeded + required: + - blockReason + - updatedAt + type: object + description: Pauses Speed Insights free data-point ingestion when the team-wide free allocation is exhausted. The block lasts at least 14 days and is extended while rolling usage stays above half of the allocation. type: object - monitoringMetric: + description: Information about which features are blocked for a user. Blocks can be either soft (the user can still access the feature, but with a warning, e.g. prompting an upgrade) or hard (the user cannot access the feature at all). + defaultTeamId: + type: string + version: + type: string + enum: + - northstar + isMFAEnforced: + type: boolean + enum: + - false + - true + description: Whether MFA is enforced for this user. Set to true when the user has a + northstarMigration: properties: - tier: + teamId: + type: string + description: The ID of the team we created for this user. + projects: type: number - price: + description: The number of projects migrated for this user. + stores: type: number - batch: + description: The number of stores migrated for this user. + integrationConfigurations: type: number - threshold: + description: The number of integration configurations migrated for this user. + integrationClients: type: number - name: - type: string - hidden: - type: boolean - disabledAt: - nullable: true + description: The number of integration clients migrated for this user. + startTime: type: number - enabledAt: - nullable: true + description: The migration start time timestamp for this user. + endTime: type: number + description: The migration end time timestamp for this user. required: - - price - - batch - - threshold - - hidden + - endTime + - integrationClients + - integrationConfigurations + - projects + - startTime + - stores + - teamId type: object - postgresComputeTime: + description: An archive of information about the Northstar migration, derived from the old (deprecated) property, `northstarMigrationEvents`. + opportunityId: + type: string + description: The salesforce opportunity ID that this user is linked to. This is used to automatically associate a team of the user's choosing with the opportunity. + mfaConfiguration: properties: - tier: - type: number - price: - type: number - batch: - type: number - threshold: - type: number - name: - type: string - hidden: + enabled: type: boolean - disabledAt: - nullable: true - type: number + enum: + - false + - true enabledAt: - nullable: true type: number + recoveryCodes: + items: + type: string + type: array + totp: + properties: + secret: + type: string + createdAt: + type: number + required: + - createdAt + - secret + type: object + history: + items: + properties: + action: + type: string + enum: + - disabled + - enabled + description: The action that occurred + timestamp: + nullable: true + type: number + description: Unix timestamp (milliseconds) when the change occurred. May be null for events that occurred before history tracking was implemented. + method: + type: string + enum: + - admin_removal + - passkey + - self_serve_recovery + - totp + - unknown + - user_disabled + description: 'Method used for the state change - ''totp'': User set up TOTP authenticator - ''passkey'': User registered a passkey - ''user_disabled'': User disabled their own MFA - ''admin_removal'': Admin removed MFA via backoffice - ''self_serve_recovery'': User disabled their own MFA through the self-serve MFA disable recovery flow (a "Locked Out User" with only a passkey) - ''unknown'': Method unknown (for pre-tracking events)' + actorId: + type: string + description: 'ID of the actor who made the change - For user actions: the user''s own ID - For admin actions: the admin''s user ID' + actorType: + type: string + enum: + - admin + - user + description: Type of actor + reason: + type: string + description: 'Optional: Additional context or reason e.g., "Account recovery request - ticket #12345"' + required: + - action + - actorId + - actorType + - method + - timestamp + type: object + description: History of MFA state changes (enabled/disabled events). Most recent events first. + type: array + description: History of MFA state changes (enabled/disabled events). Most recent events first. required: - - price - - batch - - threshold - - hidden + - enabled + - recoveryCodes type: object - postgresDatabase: - properties: - tier: - type: number - price: - type: number - batch: - type: number - threshold: - type: number - name: + description: MFA configuration. When enabled, the user will be required to provide a second factor of authentication when logging in. + isEnterpriseManaged: + type: boolean + enum: + - false + - true + description: Indicates that the underlying user entity is a managed user for the enterprise it's associated with The intention is that this field is only set to true for users that are provisioned by the enterprise which means that the domain associated with the user's email is the same domain associated with the team Allowing us to query information about the user's team at login time through the domain verification service + required: + - billing + - blocked + - createdAt + - deploymentSecret + - email + - id + - platformVersion + - stagingPrefix + - sysToken + - type + - updatedAt + - username + - version + type: object + confirmedScopes: + items: + type: string + type: array + integration: + properties: + id: + type: string + slug: + type: string + name: + type: string + configurationId: + type: string + required: + - configurationId + - id + - name + - slug + type: object + destinationTeamId: + type: string + destinationTeamName: + type: string + originTeamId: + type: string + originTeamName: + type: string + configurations: + items: + properties: + integrationId: + type: string + configurationId: + type: string + integrationSlug: + type: string + integrationName: + type: string + required: + - configurationId + - integrationId + - integrationSlug + type: object + type: array + billingPlanId: + type: string + billingPlanName: + type: string + integrationProductSlug: + type: string + databaseName: + type: string + queryType: + type: string + enum: + - data-edit + - data-view + - schema + - user + readonly: + type: boolean + enum: + - false + - true + rolledBack: + type: boolean + enum: + - false + - true + failedQueryIndex: + nullable: true + type: number + errorCode: + nullable: true + type: string + queryCount: + type: number + queries: + items: + properties: + command: + nullable: true + type: string + rowCount: + type: number + tables: + items: type: string - hidden: - type: boolean - disabledAt: - nullable: true - type: number - enabledAt: - nullable: true - type: number + type: array + primaryKey: + items: + properties: + column: + type: string + value: + nullable: true + type: string + required: + - column + - value + type: object + type: array + required: + - command + type: object + type: array + requestKind: + type: string + enum: + - raw_commands + commands: + items: + properties: + command: + type: string + errorCode: + type: string + required: + - command + type: object + type: array + errorIndex: + type: number + pattern: + type: string + keys: + items: + type: string + type: array + issuerId: + type: string + issuerName: + type: string + algorithm: + type: string + origin: + type: string + managedBy: + type: string + keyId: + type: string + kind: + type: string + policyKey: + type: string + logDrainUrl: + nullable: true + type: string + login: + type: string + userAgent: + type: string + geolocation: + nullable: true + properties: + city: + properties: + names: + properties: + en: + type: string + required: + - en + type: object required: - - price - - batch - - threshold - - hidden + - names type: object - postgresDataStorage: + country: properties: - tier: - type: number - price: - type: number - batch: - type: number - threshold: - type: number - name: - type: string - hidden: - type: boolean - disabledAt: - nullable: true - type: number - enabledAt: - nullable: true - type: number + names: + properties: + en: + type: string + required: + - en + type: object required: - - price - - batch - - threshold - - hidden + - names type: object - postgresDataTransfer: + most_specific_subdivision: properties: - tier: - type: number - price: - type: number - batch: - type: number - threshold: - type: number - name: - type: string - hidden: - type: boolean - disabledAt: - nullable: true - type: number - enabledAt: - nullable: true - type: number + names: + properties: + en: + type: string + required: + - en + type: object required: - - price - - batch - - threshold - - hidden + - names type: object - postgresWrittenData: - properties: - tier: - type: number - price: - type: number - batch: - type: number - threshold: - type: number - name: + regionName: + type: string + required: + - country + type: object + env: + type: string + os: + type: string + loginSessionId: + type: string + description: Browser login correlation ID. This is not an authentication credential. + ssoType: + type: string + factors: + oneOf: + - items: + oneOf: + - properties: + origin: + type: string + enum: + - apple + - bitbucket + - chatgpt + - email + - emu-recovery + - github + - gitlab + - google + - invite + - magic-link + - otp + - otp-link + - saml + - webauthn + username: + type: string + teamId: + type: string + legacy: + type: boolean + enum: + - false + - true + ssoType: + type: string + required: + - origin + type: object + maxItems: 1 + minItems: 1 + type: array + - items: + oneOf: + - properties: + origin: + type: string + enum: + - apple + - bitbucket + - chatgpt + - email + - emu-recovery + - github + - gitlab + - google + - invite + - magic-link + - otp + - otp-link + - saml + - webauthn + username: + type: string + teamId: + type: string + legacy: + type: boolean + enum: + - false + - true + ssoType: + type: string + required: + - origin + type: object + - properties: + origin: + type: string + enum: + - recovery-code + - totp + - webauthn + required: + - origin + type: object + maxItems: 2 + minItems: 2 + type: array + viaOTP: + type: boolean + enum: + - false + - true + viaGithub: + type: boolean + enum: + - false + - true + viaGitlab: + type: boolean + enum: + - false + - true + viaBitbucket: + type: boolean + enum: + - false + - true + viaGoogle: + type: boolean + enum: + - false + - true + viaApple: + type: boolean + enum: + - false + - true + viaSamlSso: + type: boolean + enum: + - false + - true + viaPasskey: + type: boolean + enum: + - false + - true + periods: + items: + properties: + periodNumber: + type: number + percent: + type: string + startDate: + type: string + endDate: + type: string + required: + - endDate + - percent + - periodNumber + - startDate + type: object + type: array + allowedIntegrationCount: + type: number + allowedIntegrationIds: + items: + type: string + type: array + fallbackEnvironment: + type: string + enablePolyrepoBranchRouting: + type: boolean + enum: + - false + - true + prev: + properties: + name: + type: string + slug: + type: string + fallbackEnvironment: + type: string + enablePolyrepoBranchRouting: + type: boolean + enum: + - false + - true + required: + - fallbackEnvironment + - name + - slug + type: object + group: + properties: + id: + type: string + slug: + type: string + name: + type: string + required: + - id + - name + - slug + type: object + alertId: + type: string + alertName: + type: string + rootTeamId: + type: string + directoryGroupId: + type: string + directoryId: + type: string + groupName: + type: string + billingPlan: + type: string + enum: + - enterprise + - platform + teamName: + type: string + previousMode: + type: string + enum: + - organization + - team + mode: + type: string + enum: + - organization + - team + cause: + type: string + blockReason: + type: string + siftRoute: + properties: + name: + type: string + required: + - name + type: object + headerName: + type: string + previousStatus: + type: string + justification: + type: string + deletedCount: + type: number + scriptCount: + type: number + connectSrcCount: + type: number + connectSrcOriginCount: + type: number + headerCount: + type: number + connectSrcUserNormalizationRuleCount: + type: number + connectSrcNormalizationRulesCleared: + type: boolean + enum: + - false + - true + approvalScope: + type: string + enum: + - all + - preview + resourceUrl: + type: string + oldName: + type: string + connectorId: + type: string + connectorType: + type: string + connectorService: + type: string + externalIssuer: + type: string + externalSubject: + type: string + sessionId: + type: string + emailVerified: + type: boolean + enum: + - false + - true + tenantId: + type: string + removedUsers: + additionalProperties: + properties: + role: + type: string + enum: + - BILLING + - CONTRIBUTOR + - DEVELOPER + - MEMBER + - OWNER + - SECURITY + - VIEWER + - VIEWER_FOR_PLUS + confirmed: + type: boolean + enum: + - false + - true + confirmedAt: + type: number + joinedFrom: + properties: + origin: + type: string + enum: + - account-update + - bitbucket + - dsync + - feedback + - github + - gitlab + - import + - link + - mail + - nsnb-auto-approve + - nsnb-hobby-upgrade + - nsnb-invite + - nsnb-redeploy + - nsnb-redeploy-attribution-card + - nsnb-request-access + - nsnb-viewer-upgrade + - organization-teams + - saml + - teams + commitId: + type: string + repoId: + type: string + repoPath: + type: string + gitUserId: + oneOf: + - type: string + - type: number + gitUserLogin: + type: string + ssoUserId: + type: string + ssoConnectedAt: + type: number + idpUserId: + type: string + dsyncUserId: + type: string + dsyncConnectedAt: + type: number + required: + - origin + type: object + required: + - confirmed + - role + type: object + type: object + prevPlan: + type: string + priorPlan: + type: string + isDowngrade: + type: boolean + enum: + - false + - true + isReactivate: + type: boolean + enum: + - false + - true + isTrialUpgrade: + type: boolean + enum: + - false + - true + automated: + type: boolean + enum: + - false + - true + description: Whether the plan change was system-initiated rather than human-initiated. + timestamp: + type: number + removedMemberCount: + type: number + previewDeploymentSuffix: + nullable: true + type: string + previousPreviewDeploymentSuffix: + nullable: true + type: string + endpoint: + properties: + id: + type: string + name: + type: string + projectId: + type: string + vercelRegion: + type: string + awsServiceName: + type: string + privateDnsNames: + items: + type: string + type: array + required: + - awsServiceName + - id + - name + - projectId + - vercelRegion + type: object + privateLinkEndpoint: + properties: + id: + type: string + name: + type: string + required: + - id + - name + type: object + current: + properties: + id: + type: string + name: + type: string + projectId: + type: string + vercelRegion: + type: string + awsServiceName: + type: string + privateDnsNames: + items: + type: string + type: array + required: + - awsServiceName + - id + - name + - projectId + - vercelRegion + type: object + previousEndpoint: + properties: + name: + type: string + environmentIds: + items: + type: string + type: array + privateDnsNames: + items: + type: string + type: array + required: + - name + type: object + branch: + type: string + directoryListing: + type: boolean + enum: + - false + - true + projectAnalytics: + nullable: true + properties: + id: + type: string + canceledAt: + nullable: true + type: number + disabledAt: + type: number + enabledAt: + type: number + paidAt: + type: number + sampleRatePercent: + nullable: true + type: number + spendLimitInDollars: + nullable: true + type: number + required: + - disabledAt + - enabledAt + - id + type: object + prevProjectAnalytics: + nullable: true + properties: + id: + type: string + canceledAt: + nullable: true + type: number + disabledAt: + type: number + enabledAt: + type: number + paidAt: + type: number + sampleRatePercent: + nullable: true + type: number + spendLimitInDollars: + nullable: true + type: number + required: + - disabledAt + - enabledAt + - id + type: object + isEnvVar: + type: boolean + enum: + - false + - true + note: + type: string + enableAffectedProjectsDeployments: + type: boolean + enum: + - false + - true + enableExternalRewriteCaching: + type: boolean + enum: + - false + - true + productionDeploymentsFastLane: + type: boolean + enum: + - false + - true + sourceFilesOutsideRootDirectory: + type: boolean + enum: + - false + - true + previousBuildMachineType: + type: string + nextBuildMachineType: + type: string + previousBuildMachineSelection: + type: string + nextBuildMachineSelection: + type: string + isSystemInitiated: + type: boolean + enum: + - false + - true + widget: + nullable: true + type: string + enum: + - alert + - analytics-online + - analytics-page-views + - analytics-visitors + - firewall-allowed + - firewall-denied + - observability-alert + - observability-edge-requests + - observability-error-rate + - observability-function-invocations + - online + - res + - shortcut + - speed-insights-cls + - speed-insights-lcp + - speed-insights-res + - null + certId: + type: string + updated: + type: boolean + enum: + - false + - true + elasticConcurrencyEnabled: + type: boolean + enum: + - false + - true + oldElasticConcurrencyEnabled: + type: boolean + enum: + - false + - true + buildQueueConfiguration: + type: string + enum: + - SKIP_NAMESPACE_QUEUE + - WAIT_FOR_NAMESPACE_QUEUE + oldBuildQueueConfiguration: + type: string + enum: + - SKIP_NAMESPACE_QUEUE + - WAIT_FOR_NAMESPACE_QUEUE + autoAssignCustomDomains: + type: boolean + enum: + - false + - true + previewDeploymentsEnabled: + type: boolean + enum: + - false + - true + customEnvironmentId: + type: string + customEnvironmentSlug: + type: string + enableFunctionsBeta: + type: boolean + enum: + - false + - true + newProjectName: + type: string + gitProvider: + type: string + enum: + - bitbucket + - cursor-origin + - github + - github-custom-host + - github-limited + - gitlab + - v0 + - vercel + gitRepoId: + type: string + onPullRequest: + type: boolean + enum: + - false + - true + onCommit: + type: boolean + enum: + - false + - true + disableRepositoryDispatchEvents: + type: boolean + enum: + - false + - true + createDeployments: + type: string + enum: + - disabled + - enabled + requireVerifiedCommits: + nullable: true + type: boolean + enum: + - false + - true + - null + gitCommitStatus: + type: boolean + enum: + - false + - true + gitLFS: + type: boolean + enum: + - false + - true + consolidatedGitCommitStatus: + nullable: true + properties: + enabled: + type: boolean + enum: + - false + - true + propagateFailures: + type: boolean + enum: + - false + - true + required: + - enabled + - propagateFailures + type: object + configuredBy: + type: string + oldProjectId: + type: string + oldProjectName: + type: string + newProjectId: + type: string + projects: + items: + properties: + projectId: + type: string + role: + type: string + enum: + - ADMIN + - PROJECT_DEVELOPER + - PROJECT_GUEST + - PROJECT_VIEWER + membershipCreatedAt: + type: number + required: + - membershipCreatedAt + - projectId + - role + type: object + type: array + teamMembership: + properties: + uid: + type: string + username: + type: string + required: + - uid + type: object + prevConfiguredBy: + nullable: true + type: string + projectMembership: + nullable: true + properties: + role: + type: string + enum: + - ADMIN + - PROJECT_DEVELOPER + - PROJECT_GUEST + - PROJECT_VIEWER + uid: + type: string + createdAt: + type: number + username: + type: string + required: + - createdAt + - role + - uid + type: object + removedMembership: + properties: + role: + type: string + enum: + - ADMIN + - PROJECT_DEVELOPER + - PROJECT_GUEST + - PROJECT_VIEWER + uid: + type: string + createdAt: + type: number + username: + type: string + required: + - createdAt + - role + - uid + type: object + previousProjectId: + type: string + previousProjectName: + type: string + originAccountName: + type: string + transferId: + type: string + destinationAccountName: + nullable: true + type: string + destinationAccountId: + type: string + optionsAllowlist: + nullable: true + properties: + paths: + items: + properties: + value: + type: string + required: + - value + type: object + type: array + required: + - paths + type: object + oldOptionsAllowlist: + nullable: true + properties: + paths: + items: + properties: + value: + type: string + required: + - value + type: object + type: array + required: + - paths + type: object + passwordProtection: + nullable: true + oneOf: + - properties: + deploymentType: type: string - hidden: - type: boolean - disabledAt: - nullable: true - type: number - enabledAt: - nullable: true - type: number + enum: + - all + - all_except_custom_domains + - preview + - prod_deployment_urls_and_all_previews required: - - price - - batch - - threshold - - hidden + - deploymentType type: object - serverlessFunctionExecution: - properties: - tier: - type: number - price: - type: number - batch: - type: number - threshold: - type: number - name: + - type: string + enum: + - all + - all_except_custom_domains + - preview + - prod_deployment_urls_and_all_previews + oldPasswordProtection: + nullable: true + oneOf: + - properties: + deploymentType: type: string - hidden: - type: boolean - disabledAt: - nullable: true - type: number - enabledAt: - nullable: true - type: number + enum: + - all + - all_except_custom_domains + - preview + - prod_deployment_urls_and_all_previews required: - - price - - batch - - threshold - - hidden + - deploymentType type: object - sourceImages: - properties: - tier: - type: number - price: - type: number - batch: - type: number - threshold: - type: number - name: + - type: string + enum: + - all + - all_except_custom_domains + - preview + - prod_deployment_urls_and_all_previews + reasonCode: + type: string + enum: + - BACKOFFICE + - BUDGET_REACHED + - PUBLIC_API + consent: + type: string + enum: + - granted + - refused + projectAccountId: + type: string + rollbackDescription: + properties: + userId: + type: string + description: The user who rolled back the project. + username: + type: string + description: The username of the user who rolled back the project. + description: + type: string + description: User-supplied explanation of why they rolled back the project. Limited to 250 characters. + createdAt: + type: number + description: Timestamp of when the rollback was requested. + required: + - createdAt + - description + - userId + - username + type: object + description: Description of why a project was rolled back, and by whom. Note that lastAliasRequest contains the from/to details of the rollback. + targetDeploymentId: + type: string + newTargetPercentage: + type: number + region: + type: string + failoverRegions: + items: + type: string + type: array + customerSupportCodeVisibility: + type: boolean + enum: + - false + - true + gitForkProtection: + type: boolean + enum: + - false + - true + protectedSourcemaps: + type: boolean + enum: + - false + - true + inheritDeploymentProtection: + type: boolean + enum: + - false + - true + publicSource: + type: boolean + enum: + - false + - true + ssoProtection: + nullable: true + oneOf: + - properties: + deploymentType: type: string - hidden: - type: boolean - disabledAt: - nullable: true - type: number - enabledAt: + enum: + - all + - all_except_custom_domains + - preview + - prod_deployment_urls_and_all_previews + cve55182MigrationAppliedFrom: nullable: true - type: number - required: - - price - - batch - - threshold - - hidden - type: object - storageRedisTotalBandwidthInBytes: - properties: - tier: - type: number - price: - type: number - batch: - type: number - threshold: - type: number - name: type: string - hidden: - type: boolean - disabledAt: - nullable: true - type: number - enabledAt: + enum: + - all + - all_except_custom_domains + - preview + - prod_deployment_urls_and_all_previews + - null + april2026SecurityIncidentMigrationAppliedFrom: nullable: true - type: number - required: - - price - - batch - - threshold - - hidden - type: object - storageRedisTotalCommands: - properties: - tier: - type: number - price: - type: number - batch: - type: number - threshold: - type: number - name: type: string - hidden: - type: boolean - disabledAt: - nullable: true - type: number - enabledAt: - nullable: true - type: number + enum: + - all + - all_except_custom_domains + - preview + - prod_deployment_urls_and_all_previews + - null required: - - price - - batch - - threshold - - hidden + - deploymentType type: object - storageRedisTotalDailyAvgStorageInBytes: - properties: - tier: - type: number - price: - type: number - batch: - type: number - threshold: - type: number - name: + - type: string + enum: + - all + - all_except_custom_domains + - preview + - prod_deployment_urls_and_all_previews + oldSsoProtection: + nullable: true + oneOf: + - properties: + deploymentType: type: string - hidden: - type: boolean - disabledAt: - nullable: true - type: number - enabledAt: + enum: + - all + - all_except_custom_domains + - preview + - prod_deployment_urls_and_all_previews + cve55182MigrationAppliedFrom: nullable: true - type: number - required: - - price - - batch - - threshold - - hidden - type: object - storageRedisTotalDatabases: - properties: - tier: - type: number - price: - type: number - batch: - type: number - threshold: - type: number - name: type: string - hidden: - type: boolean - disabledAt: - nullable: true - type: number - enabledAt: + enum: + - all + - all_except_custom_domains + - preview + - prod_deployment_urls_and_all_previews + - null + april2026SecurityIncidentMigrationAppliedFrom: nullable: true - type: number - required: - - price - - batch - - threshold - - hidden - type: object - webAnalyticsEvent: - properties: - tier: - type: number - price: - type: number - batch: - type: number - threshold: - type: number - name: type: string - hidden: - type: boolean - disabledAt: - nullable: true - type: number - enabledAt: - nullable: true - type: number + enum: + - all + - all_except_custom_domains + - preview + - prod_deployment_urls_and_all_previews + - null required: - - price - - batch - - threshold - - hidden + - deploymentType type: object + - type: string + enum: + - all + - all_except_custom_domains + - preview + - prod_deployment_urls_and_all_previews + trustedIps: + nullable: true + type: string + enum: + - all + - all_except_custom_domains + - preview + - prod_deployment_urls_and_all_previews + - production + - null + oldTrustedIps: + nullable: true + type: string + enum: + - all + - all_except_custom_domains + - preview + - prod_deployment_urls_and_all_previews + - production + - null + addedAddresses: + nullable: true + items: + type: string + type: array + removedAddresses: + nullable: true + items: + type: string + type: array + enableVercelCiSameRepository: + type: boolean + enum: + - false + - true + addedProjects: + items: + properties: + id: + type: string + name: + type: string + required: + - id + - name + type: object + type: array + removedProjects: + items: + properties: + id: + type: string + name: + type: string + required: + - id + - name + type: object + type: array + addedProviders: + items: + type: string + type: array + removedProviders: + items: + type: string + type: array + projectWebAnalytics: + properties: + id: + type: string + disabledAt: + type: number + canceledAt: + type: number + enabledAt: + type: number + hasData: + type: boolean + enum: + - true + required: + - id + type: object + prevProjectWebAnalytics: + nullable: true + properties: + id: + type: string + disabledAt: + type: number + canceledAt: + type: number + enabledAt: + type: number + hasData: + type: boolean + enum: + - true + required: + - id + type: object + gitProviderGroupDescriptor: + type: string + gitScope: + type: string + connectionId: + type: string + connectionType: + type: string + sandboxName: + type: string + sandboxId: + type: string + driveName: + type: string + snapshotId: + type: string + targetRegions: + items: + type: string + type: array + instances: + type: number + verified: + type: boolean + enum: + - false + - true + uid: + type: string + firstEnabledAt: + type: number + bio: + type: string + scalingRules: + additionalProperties: + properties: + min: + type: number + max: + type: number + required: + - max + - min + type: object + type: object + min: + type: number + max: + type: number + analyticsId: + type: string + sampleRatePercent: + nullable: true + type: number + spendLimitInDollars: + nullable: true + type: number + webhookUrl: + type: string + prevBudget: + properties: + type: + type: string + enum: + - fixed + description: The budget type + fixedBudget: + type: number + description: Budget amount (USD / dollars) + previousSpend: + items: + type: number + type: array + description: Array of the last 3 months of spend data + notifiedAt: + items: + type: number + type: array + description: Array of 50, 75, 100 to keep track of notifications sent out + webhookId: + type: string + description: Webhook id that corresponds to a webhook in Cosmos webhook collection + webhookNotified: + type: boolean + enum: + - false + - true + description: Keep track if the webhook has been called for the month + createdAt: + type: number + description: Date time when budget is created + updatedAt: + type: number + description: Date time when budget is updated last + isActive: + type: boolean + enum: + - false + - true + description: Is the budget currently active for a customer + pauseProjects: + type: boolean + enum: + - false + - true + description: Should all projects be paused if budget is exceeded + pricingPlan: + type: string + enum: + - flex + - legacy + - platform + - plus + - unbundled + description: The acive pricing plan the team is billed with + teamId: + type: string + description: Partition key + id: + type: string + description: Sort key that needs to be unique per teamId + required: + - createdAt + - fixedBudget + - id + - isActive + - notifiedAt + - previousSpend + - teamId + - type + type: object + description: Represents a budget for tracking and notifying teams on their spending. + prevWebhookUrl: + type: string + storeType: + type: string + enum: + - postgres + - redis + transferRequestCode: + type: string + store: + properties: + id: + type: string + name: + type: string + type: + type: string + enum: + - blob + - edge-config + - integration + - postgres + - redis + required: + - id + - type + type: object + computeUnitsMax: + type: number + computeUnitsMin: + type: number + suspendTimeoutSeconds: + type: number + access: + type: string + enum: + - private + - public + locked: + type: boolean + enum: + - false + - true + caseNumber: + type: string + client: + type: string + trialCreditsIssuedAt: + type: number + eventId: + type: string + sessionKind: + type: string + description: 'Currently emitted session kinds: chat, investigation.' + surface: + type: string + description: 'Currently emitted surfaces: dashboard, internal, slack, automation, github.' + occurredAt: + type: number + planId: + type: string + requestedScopes: + items: + type: string + type: array + description: Scopes requested by the model-authored plan. + elevatedScopes: + items: + type: string + type: array + description: Requested Vercel scopes that are not included in the baseline token. + mergedScopes: + items: + type: string + type: array + description: Baseline plus elevated Vercel scopes used when minting scoped tokens. + githubScopes: + items: + type: string + type: array + description: External GitHub scopes requested by the plan; these are not Vercel token scopes. + requestedScopeCount: + type: number + elevatedScopeCount: + type: number + mergedScopeCount: + type: number + githubScopeCount: + type: number + by: + type: string + byUid: + type: string + reasons: + items: + properties: + slug: + type: string + description: + type: string + required: + - description + - slug + type: object + type: array + inviteIds: + items: + type: string + type: array + invitedUser: + properties: + username: + type: string + email: + type: string + required: + - email + - username + type: object + invitedEmail: + type: string + invitationRole: + type: string + invitedUid: + type: string + gitUsername: + type: string + githubUsername: + nullable: true + type: string + gitlabUsername: + nullable: true + type: string + bitbucketUsername: + nullable: true + type: string + updatedUid: + type: string + role: + type: string + enum: + - BILLING + - CONTRIBUTOR + - DEVELOPER + - MEMBER + - OWNER + - SECURITY + - VIEWER + - VIEWER_FOR_PLUS + previousPlan: + type: string + enum: + - enterprise + - hobby + - pro + newPlan: + type: string + enum: + - enterprise + - hobby + - pro + entitlement: + type: string + previousCanceledAt: + type: string + updatedUser: + properties: + username: + type: string + email: + type: string + required: + - email + - username + type: object + invitedBy: + properties: + email: + type: string + userId: + type: string + name: + type: string + required: + - email + type: object + requestedTeamName: + type: string + requestedTeamSlug: + type: string + requestedUserName: + type: string + previousRole: + type: string + authorized: + type: boolean + enum: + - false + - true + enforced: + type: boolean + enum: + - false + - true + publicId: + type: string + maxUses: + type: number + previousConcurrentBuilds: + type: number + nextConcurrentBuilds: + type: number + trial: + nullable: true + properties: + start: + type: number + end: + type: number + required: + - end + - start + type: object + convertedFromTrial: + type: boolean + enum: + - false + - true + inviteCode: + type: string + decision: + type: string + enum: + - keep_on + - turn_off + version: + type: string + remoteCaching: + properties: + enabled: + type: boolean + enum: + - false + - true + type: object + description: Represents configuration for remote caching + ips: + items: + type: string + type: array + tokenTypes: + items: + type: string + type: array + exportId: + type: string + from: + type: number + to: + type: number + format: + type: string + fileId: + type: string + sampling: + items: + properties: + type: + type: string + enum: + - head_sampling + rate: + type: number + env: + type: string + enum: + - preview + - production + requestPath: + type: string + required: + - rate + - type + type: object + type: array + totp: + type: boolean + enum: + - false + - true + recoveryCodes: + type: number + autoBlockPrevented: + type: boolean + enum: + - false + - true + preventUntil: + type: number + method: + type: string + enum: + - email-otp + - recovery-code + - totp + - webauthn + flowId: + type: string + allowedMethods: + items: + type: string + enum: + - recovery-code + - totp + - webauthn + type: array + firstFactor: + type: string + remaining: + type: number + context: + type: string + enum: + - login + - sudo + description: Absent on events predating the field; those were all logins. + mfaEnabled: + type: boolean + enum: + - false + - true + mfa: + properties: + enabled: + type: boolean + enum: + - false + - true + totpVerified: + type: boolean + enum: + - false + - true + required: + - enabled + - totpVerified + type: object + totpVerified: + type: boolean + enum: + - false + - true + providerSubjectId: + type: string + prevEmail: + type: string + repositoryName: + type: string + reference: + type: string + digest: + type: string + sharedWithTeamId: + type: string + sharedWithTeamSlug: + type: string + public: + type: boolean + enum: + - false + - true + removedTeamIds: + items: + type: string + type: array + previousProjectCount: + nullable: true + type: number + nextProjectCount: + nullable: true + type: number + customAlertTitle: + type: string + vulnerabilities: + items: + type: string + type: array + protectionEnabled: + type: boolean + enum: + - false + - true + protectedProjectCount: + type: number + peering: + properties: + id: + type: string + accountId: + type: string + region: + type: string + vpcId: + type: string + required: + - accountId + - id + - region + - vpcId type: object - invoiceSettings: + tier: + type: string + enum: + - plus + - pro + chatId: + type: string + chatTitle: + type: string + model: + type: string + useCase: + type: string + messageId: + type: string + inputTokens: + type: number + outputTokens: + type: number + events: + items: + properties: + eventId: + type: string + modelId: + type: string + inputTokens: + type: number + outputTokens: + type: number + totalTokens: + type: number + cacheCreationInputTokens: + type: number + cacheReadInputTokens: + type: number + timestamp: + type: string + required: + - cacheCreationInputTokens + - cacheReadInputTokens + - eventId + - inputTokens + - modelId + - outputTokens + - timestamp + - totalTokens + type: object + type: array + runId: + type: string + grantType: + type: string + enum: + - authorization_code + - urn:ietf:params:oauth:grant-type:device_code + - urn:ietf:params:oauth:grant-type:token-exchange + atTTL: + type: number + description: access_token TTL + rtTTL: + type: number + description: refresh_token TTL + authMethod: + type: string + enum: + - app + - apple + - bitbucket + - chatgpt + - email + - emu + - github + - github-webhook + - gitlab + - google + - invite + - manual + - otp + - passkey + - saml + - sms + - token-exchange-oidc + includesRefreshToken: + type: boolean + enum: + - false + - true + description: optional since entries prior to 2025-10-13 do not contain this field + tokenPrefix: + type: string + enum: + - vca_ + description: optional since entries prior to 2026-04-23 do not contain this field + tokenSuffix: + type: string + description: optional since entries prior to 2026-04-23 do not contain this field + refreshTokenPublicId: + type: string + description: optional; only present when a refresh token was issued (offline_access). + refreshTokenPrefix: + type: string + enum: + - vcr_ + description: optional; only present when a refresh token was issued (offline_access). + refreshTokenSuffix: + type: string + description: optional; only present when a refresh token was issued (offline_access). + ip: + nullable: true + type: string + description: optional since entries prior to 2026-04-23 do not contain this field + issuerUrl: + type: string + description: 'OIDC issuer (`iss`) of the token that authenticated the request. Present for OIDC-authenticated flows: the token-exchange grant, or `client_credentials` with the `oidc_token` client-authentication method.' + oidcSubject: + type: string + description: '`sub` claim of the OIDC token. Present for OIDC-authenticated flows (see {@link issuerUrl}).' + policy: properties: - footer: + policyId: type: string - type: object - subscriptions: - nullable: true - items: - properties: - id: - type: string - trial: - nullable: true - properties: - start: - type: number - end: - type: number - required: - - start - - end - type: object - period: - properties: - start: - type: number - end: - type: number - required: - - start - - end - type: object - frequency: - properties: - interval: - type: string - enum: - - month - - day - - week - - year - intervalCount: - type: number - required: - - interval - - intervalCount - type: object - discount: - nullable: true + clientId: + type: string + issuerUrl: + type: string + teamId: + type: string + name: + nullable: true + type: string + description: Human-readable policy name, or `null` when unnamed. + claims: + items: properties: - id: + name: type: string - coupon: - properties: - id: - type: string - name: - nullable: true - type: string - amountOff: - nullable: true - type: number - percentageOff: - nullable: true - type: number - durationInMonths: - nullable: true - type: number - duration: - type: string - enum: - - forever - - repeating - - once - required: - - id - - name - - amountOff - - percentageOff - - durationInMonths - - duration - type: object + values: + items: + properties: + value: + type: string + wildcards: + type: boolean + enum: + - false + - true + required: + - value + - wildcards + type: object + type: array required: - - id - - coupon + - name + - values type: object + description: Claim matchers an OIDC token must satisfy to use the policy. + type: array + description: Claim matchers an OIDC token must satisfy to use the policy. + permissions: items: - items: - properties: - id: - type: string - priceId: - type: string - productId: - type: string - amount: - type: number - quantity: - type: number - required: - - id - - priceId - - productId - - amount - - quantity - type: object - type: array - required: - - id - - trial - - period - - frequency - - discount - - items - type: object - type: array - controls: - nullable: true - properties: - analyticsSampleRateInPercent: + type: string + type: array + description: Permission boundary (`['*']` = the app's full declared permissions). + resources: nullable: true + properties: + projectIds: + items: + type: string + type: array + required: + - projectIds + type: object + description: Resource boundary, or `null` when the policy has none. + createdAt: type: number - analyticsSpendLimitInDollars: - nullable: true + description: Creation time (epoch ms). + updatedAt: type: number + description: Last-update time (epoch ms). + required: + - claims + - clientId + - createdAt + - issuerUrl + - name + - permissions + - policyId + - resources + - teamId + - updatedAt type: object - purchaseOrder: - nullable: true + description: A full point-in-time snapshot of an OIDC exchange policy, captured on every lifecycle event so the audit trail records exactly what the policy looked like. Mirrors the management endpoints' public response shape. + tokenId: type: string - status: + description: The token's public ID. + tokenName: type: string + description: User-supplied name of the token. + projectScope: + type: string + enum: + - account + - project-only + description: Present when `scope` is `'project'`. + hasAuthorizationDetails: + type: boolean enum: - - active - - trialing - - overdue - - expired - - canceled - pricingExperiment: + - false + - true + description: Whether the token was issued with RFC 9396 authorization details. + reqId: + type: string + reqUrl: + type: string + tokenType: + type: string + actorTokenId: type: string + description: The token's public ID. + expired: + type: boolean enum: - - august-2022 - orbMigrationScheduledAt: - nullable: true - type: number + - false + - true + leaked: + type: boolean + enum: + - false + - true + revoked: + type: boolean + enum: + - false + - true required: - - period + - action + - id + - projectId + - slug + - name + - state + - environment + - policyId + - projectName + - accountRequestId + - teamId + - teamSlug + - blockCode + - reason + - resourceId + - actorId + - actorType + - fromPlan + - toPlan + - apiKey + - change + - scopeType + - credential + - added + - changed + - removed + - enabled + - amount + - purchaseIntentId + - privateModel + - privateProvider + - moderationPolicyCount + - piiRedaction + - policiesAdded + - policiesModified + - policiesRemoved + - regions + - retention + - rule + - virtualModelConfig + - accessGroup + - author + - project + - user + - aliasCount + - alias + - aliasId + - deploymentId + - deploymentUrl + - appName + - scopes + - nextScopes + - attackModeEnabled + - autoExposeSystemEnvs + - invoiceId + - lineItemCount + - refundReason + - newInvoiceId + - settlementMethod + - paymentMethodId + - changedFields + - planSlug + - data + - productAliases + - bulkRedirectsLimit + - prevBulkRedirectsLimit + - versionId + - custom + - cns + - dst + - src + - gitOwnerName + - gitRepositoryName + - next + - previous + - documentId + - fingerprint + - title + - count + - documents + - configuration + - team + - newName + - githubLogin + - host + - gitlabEmail + - gitlabLogin + - gitlabUserId + - bitbucketEmail + - bitbucketLogin + - bitbucketAccountId + - prevPurchasedAmount + - purchasedAmount + - metricName + - suffix + - status + - hookName + - ref + - job + - checkId + - checkName + - url + - gitCommitterName + - gitUserPlatform + - sha + - source + - deployment + - ruleName + - ruleProvenance + - deploymentName + - configurationId + - integrationId + - integrationName + - integrationSlug + - ownerId + - domain + - type + - value + - initiator + - price + - cdnEnabled + - ownerName + - userId + - domainId + - nameservers + - previousServiceType + - serviceType + - customNameservers + - prevCustomNameservers + - echMode + - previousEchMode + - zone + - fromId + - fromName + - destinationId + - destinationName + - drainName + - drainUrl + - srcImages + - tags + - path + - edgeConfigDigest + - edgeConfigId + - edgeConfigSlug + - edgeConfigBackupVersionId + - edgeConfig + - fromAccount + - toAccount + - edgeConfigTokenId + - label + - edgeConfigTokenIds + - email + - previousRule + - envId + - envKey + - organizationId + - provider + - repository + - target + - scope + - configVersion + - configChangeCount + - configChanges + - restore + - ruleGroups + - rulesetName + - active + - newOwnerId + - previousOwnerId + - actorAccountId + - actorLogin + - destinationBranch + - destinationRepo + - installationId + - outcome + - resultCommitSha + - sourceCommitSha + - sourceRepo + - usedAppToken + - fromDeploymentId + - toDeploymentId + - newOwner + - confirmedScopes + - destinationTeamId + - destinationTeamName + - integration + - originTeamId + - originTeamName + - configurations + - billingPlanId + - databaseName + - errorCode + - failedQueryIndex + - integrationProductSlug + - queries + - queryCount + - queryType + - readonly + - rolledBack + - commands + - requestKind + - keys + - key + - algorithm + - issuerId + - issuerName + - origin + - kind + - policyKey + - logDrainUrl + - login + - periods + - prev + - group + - alertId + - alertName + - rootTeamId + - directoryGroupId + - directoryId + - groupName + - billingPlan + - mode + - previousMode + - teamName + - cause + - headerName + - justification + - previousStatus + - connectSrcCount + - connectSrcOriginCount + - deletedCount + - headerCount + - scriptCount + - resourceUrl + - pattern + - oldName + - connectorId + - connectorService + - connectorType + - externalIssuer + - externalSubject + - sessionId - plan + - endpoint + - privateLinkEndpoint + - current + - previousEndpoint + - branch + - directoryListing + - prevProjectAnalytics + - projectAnalytics + - enableAffectedProjectsDeployments + - enableExternalRewriteCaching + - productionDeploymentsFastLane + - sourceFilesOutsideRootDirectory + - nextBuildMachineSelection + - nextBuildMachineType + - previousBuildMachineSelection + - widget + - elasticConcurrencyEnabled + - oldElasticConcurrencyEnabled + - autoAssignCustomDomains + - previewDeploymentsEnabled + - customEnvironmentId + - customEnvironmentSlug + - enableFunctionsBeta + - previewDeploymentSuffix + - newProjectName + - gitProvider + - gitRepoId + - onPullRequest + - onCommit + - disableRepositoryDispatchEvents + - createDeployments + - requireVerifiedCommits + - gitCommitStatus + - gitLFS + - consolidatedGitCommitStatus + - gitBranch + - redirect + - redirectStatusCode + - newProjectId + - oldProjectId + - oldProjectName + - projects + - projectMembership + - removedMembership + - originAccountName + - previousProjectName + - destinationAccountName + - destinationAccountId + - oldPasswordProtection + - passwordProtection + - expiresAt + - consent + - projectAccountId + - customerSupportCodeVisibility + - gitForkProtection + - protectedSourcemaps + - inheritDeploymentProtection + - publicSource + - oldSsoProtection + - ssoProtection + - addedProjects + - addedProviders + - removedProjects + - removedProviders + - gitProviderGroupDescriptor + - gitScope + - connectionId + - connectionType + - sandboxName + - driveName + - region + - snapshotId + - targetRegions + - instances + - verified + - uid + - updatedAt + - bio + - max + - min + - scalingRules + - bitbucketName + - zeitAccount + - zeitAccountType + - gitlabName + - sampleRatePercent + - spendLimitInDollars + - budget + - storeType + - store + - transferRequestCode + - locked + - currency + - trialCreditsIssuedAt + - eventId + - occurredAt + - sessionKind + - surface + - elevatedScopeCount + - elevatedScopes + - githubScopeCount + - githubScopes + - mergedScopeCount + - mergedScopes + - planId + - requestedScopeCount + - requestedScopes + - by + - inviteIds + - entitlement + - requestedTeamName + - previousRole + - authorized + - enforced + - maxUses + - publicId + - role + - nextConcurrentBuilds + - previousConcurrentBuilds + - convertedFromTrial + - decision + - version + - ips + - tokenTypes + - exportId + - format + - from + - to + - fileId + - recoveryCodes + - totp + - username + - autoBlockPrevented + - method + - allowedMethods + - firstFactor + - flowId + - remaining + - mfaEnabled + - mfa + - totpVerified + - providerSubjectId + - prevEmail + - repositoryName + - digest + - reference + - sharedWithTeamId + - sharedWithTeamSlug + - public + - removedTeamIds + - nextProjectCount + - previousProjectCount + - customAlertTitle + - protectedProjectCount + - protectionEnabled + - vulnerabilities + - peering + - tier + - chatId + - events + - inputTokens + - messageId + - model + - outputTokens + - timestamp + - useCase + - runId + - atTTL + - authMethod + - grantType + - policy + - after + - before + - tokenId + - tokenName + - actorTokenId + - tokenType + additionalProperties: true + required: + - createdAt + - entities + - id + - principalId + - text + type: object + description: Array of events generated by the User. + ListEventTypesResponse: + properties: + types: + items: + $ref: '#/components/schemas/ListEventType' + type: array + categories: + items: + properties: + name: + type: string + enum: + - account + - ai + - ai-gateway + - billing + - connect + - deployment + - domain + - edge + - env-variable + - feature-flags + - firewall + - integration + - microfrontends + - network + - observability + - other + - project + - security + - storage + - team + - v0 + - vercel-app + - workflow + label: + type: string + required: + - label + - name + type: object + type: array + required: + - categories + - types + type: object + description: Response returned by the List Event Types endpoint. + AuthUser: + properties: + createdAt: + type: number + description: UNIX timestamp (in milliseconds) when the User account was created. + example: 1630748523395 + softBlock: + nullable: true + properties: + blockedAt: + type: number + reason: + type: string + enum: + - BLOCKED_FOR_PLATFORM_ABUSE + - DOMAIN_OWNER_DELETION_REQUEST + - ENTERPRISE_TRIAL_ENDED + - ENTERPRISE_UNPAID_INVOICE + - EXPOSURE_CAP_EXCEEDED + - FAIR_USE_LIMITS_EXCEEDED + - SUBSCRIPTION_CANCELED + - SUBSCRIPTION_EXPIRED + - UNPAID_INVOICE + blockedDueToOverageType: + type: string + enum: + - analyticsUsage + - artifacts + - bandwidth + - blobDataTransfer + - blobTotalAdvancedRequests + - blobTotalAvgSizeInBytes + - blobTotalGetResponseObjectSizeInBytes + - blobTotalSimpleRequests + - connectDataTransfer + - dataCacheRead + - dataCacheWrite + - edgeConfigRead + - edgeConfigWrite + - edgeFunctionExecutionUnits + - edgeMiddlewareInvocations + - edgeRequest + - edgeRequestAdditionalCpuDuration + - elasticConcurrencyBuildSlots + - fastDataTransfer + - fastOriginTransfer + - fluidCpuDuration + - fluidDuration + - functionDuration + - functionInvocation + - imageOptimizationCacheRead + - imageOptimizationCacheWrite + - imageOptimizationTransformation + - logDrainsVolume + - monitoringMetric + - observabilityEvent + - onDemandConcurrencyMinutes + - runtimeCacheRead + - runtimeCacheWrite + - serverlessFunctionExecution + - sourceImages + - wafOwaspExcessBytes + - wafOwaspRequests + - wafRateLimitRequest + - webAnalyticsEvent + unpauseAt: + type: number + description: Since September 2026. Set only by `billing-usage-alerts` for usage plans with a `blockDurationMs`; its presence marks a pause that expires on its own. + required: + - blockedAt + - reason type: object - description: An object containing billing infomation associated with the User account. + description: When the User account has been "soft blocked", this property will contain the date when the restriction was enacted, and the identifier for why. + billing: + nullable: true + type: string + description: An object containing billing infomation associated with the User account. (opaque JSON object) resourceConfig: properties: + concurrentBuilds: + type: number + description: An object containing infomation related to the amount of platform resources may be allocated to the User account. nodeType: type: string description: An object containing infomation related to the amount of platform resources may be allocated to the User account. - concurrentBuilds: - type: number + elasticConcurrencyEnabled: + type: boolean + enum: + - false + - true + description: An object containing infomation related to the amount of platform resources may be allocated to the User account. + buildEntitlements: + properties: + enhancedBuilds: + type: boolean + enum: + - false + - true + description: An object containing infomation related to the amount of platform resources may be allocated to the User account. + type: object + description: An object containing infomation related to the amount of platform resources may be allocated to the User account. + buildQueue: + properties: + configuration: + type: string + enum: + - SKIP_NAMESPACE_QUEUE + - WAIT_FOR_NAMESPACE_QUEUE + description: An object containing infomation related to the amount of platform resources may be allocated to the User account. + type: object description: An object containing infomation related to the amount of platform resources may be allocated to the User account. awsAccountType: type: string @@ -1484,6 +8370,9 @@ components: cfZoneName: type: string description: An object containing infomation related to the amount of platform resources may be allocated to the User account. + imageOptimizationType: + type: string + description: An object containing infomation related to the amount of platform resources may be allocated to the User account. edgeConfigs: type: number description: An object containing infomation related to the amount of platform resources may be allocated to the User account. @@ -1496,7 +8385,10 @@ components: edgeFunctionExecutionTimeoutMs: type: number description: An object containing infomation related to the amount of platform resources may be allocated to the User account. - serverlessFunctionDefaultMaxExecutionTime: + serverlessFunctionMaxDuration: + type: number + description: An object containing infomation related to the amount of platform resources may be allocated to the User account. + serverlessFunctionMaxMemorySize: type: number description: An object containing infomation related to the amount of platform resources may be allocated to the User account. kvDatabases: @@ -1508,6 +8400,49 @@ components: blobStores: type: number description: An object containing infomation related to the amount of platform resources may be allocated to the User account. + integrationStores: + type: number + description: An object containing infomation related to the amount of platform resources may be allocated to the User account. + cronJobsPerProject: + type: number + description: An object containing infomation related to the amount of platform resources may be allocated to the User account. + microfrontendGroupsPerTeam: + type: number + description: An object containing infomation related to the amount of platform resources may be allocated to the User account. + microfrontendProjectsPerGroup: + type: number + description: An object containing infomation related to the amount of platform resources may be allocated to the User account. + flagsExplorerOverridesThreshold: + type: number + description: An object containing infomation related to the amount of platform resources may be allocated to the User account. + flagsExplorerUnlimitedOverrides: + type: boolean + enum: + - false + - true + description: An object containing infomation related to the amount of platform resources may be allocated to the User account. + customEnvironmentsPerProject: + type: number + description: An object containing infomation related to the amount of platform resources may be allocated to the User account. + security: + properties: + rateLimit: + type: number + description: An object containing infomation related to the amount of platform resources may be allocated to the User account. + customRules: + type: number + description: An object containing infomation related to the amount of platform resources may be allocated to the User account. + ipBlocks: + type: number + description: An object containing infomation related to the amount of platform resources may be allocated to the User account. + ipBypass: + type: number + description: An object containing infomation related to the amount of platform resources may be allocated to the User account. + type: object + description: An object containing infomation related to the amount of platform resources may be allocated to the User account. + bulkRedirectsFreeLimitOverride: + type: number + description: An object containing infomation related to the amount of platform resources may be allocated to the User account. type: object description: An object containing infomation related to the amount of platform resources may be allocated to the User account. stagingPrefix: @@ -1519,33 +8454,50 @@ components: scopeId: type: string viewPreference: + nullable: true type: string enum: - cards - list + - null + favoritesViewPreference: + nullable: true + type: string + enum: + - closed + - open + - null + recentsViewPreference: + nullable: true + type: string + enum: + - closed + - open + - null required: - scopeId - - viewPreference type: object description: set of dashboard view preferences (cards or list) per scopeId type: array description: set of dashboard view preferences (cards or list) per scopeId importFlowGitNamespace: nullable: true - oneOf: - - type: string - - type: number + type: string importFlowGitNamespaceId: nullable: true - oneOf: - - type: string - - type: number + type: string importFlowGitProvider: + nullable: true type: string enum: + - bitbucket + - cursor-origin - github + - github-custom-host + - github-limited - gitlab - - bitbucket + - vercel + - null preferredScopesAndGitNamespaces: items: properties: @@ -1557,8 +8509,8 @@ components: - type: string - type: number required: - - scopeId - gitNamespaceId + - scopeId type: object type: array dismissedToasts: @@ -1574,61 +8526,53 @@ components: createdAt: type: number required: - - scopeId - createdAt + - scopeId type: object type: array required: - - name - dismissals + - name type: object - description: 'A record of when, under a certain scopeId, a toast was dismissed' + description: A record of when, under a certain scopeId, a toast was dismissed type: array - description: 'A record of when, under a certain scopeId, a toast was dismissed' + description: A record of when, under a certain scopeId, a toast was dismissed favoriteProjectsAndSpaces: items: - oneOf: - - properties: - projectId: - type: string - scopeSlug: - type: string - scopeId: - type: string - required: - - projectId - - scopeSlug - - scopeId - type: object - description: A list of projects and spaces across teams that a user has marked as a favorite. - - properties: - spaceId: - type: string - scopeSlug: - type: string - scopeId: - type: string - required: - - spaceId - - scopeSlug - - scopeId - type: object - description: A list of projects and spaces across teams that a user has marked as a favorite. + properties: + teamId: + type: string + projectId: + type: string + required: + - projectId + - teamId + type: object + description: A list of projects and spaces across teams that a user has marked as a favorite. type: array description: A list of projects and spaces across teams that a user has marked as a favorite. hasTrialAvailable: type: boolean + enum: + - false + - true description: Whether the user has a trial available for a paid plan subscription. remoteCaching: properties: enabled: type: boolean + enum: + - false + - true type: object description: remote caching settings dataCache: properties: excessBillingEnabled: type: boolean + enum: + - false + - true type: object description: data cache settings featureBlocks: @@ -1641,15 +8585,95 @@ components: type: number isCurrentlyBlocked: type: boolean + enum: + - false + - true + required: + - isCurrentlyBlocked + type: object + speedInsightsFree: + properties: + blockedFrom: + type: number + blockedUntil: + type: number + blockReason: + type: string + enum: + - admin_override + - hard_blocked + - limits_exceeded + isCurrentlyBlocked: + type: boolean + enum: + - false + - true required: + - blockReason - isCurrentlyBlocked type: object + description: Client-facing view of the `speedInsightsFree` ingestion block. The dashboard needs `blockReason` to tell usage pauses apart from admin blocks. type: object description: Feature blocks for the user - defaultTeamId: - nullable: true - type: string - description: The user's default team. Only applies if the user's `version` is `'northstar'`. + isAccountUpdateRequired: + type: boolean + enum: + - false + - true + description: When `true`, the user must complete the EMU Update Account flow before they can use the dashboard. + accountUpdateContext: + properties: + canOptOut: + type: boolean + enum: + - false + - true + description: Whether this user can cancel their optional Account Update flow. + organization: + properties: + id: + type: string + name: + type: string + slug: + type: string + required: + - id + - name + - slug + type: object + managedTeams: + items: + properties: + teamId: + type: string + slug: + type: string + name: + type: string + avatar: + nullable: true + type: string + workEmail: + type: string + required: + - avatar + - name + - slug + - teamId + - workEmail + type: object + type: array + verifiedEmuDomains: + items: + type: string + type: array + required: + - canOptOut + - managedTeams + - verifiedEmuDomains + type: object + description: Context for the Update Account screen. Present only when `isAccountUpdateRequired` is true. `managedTeams` is empty for orphan mode (user matches an EMU domain but is not on the team). id: type: string description: The User's unique identifier. @@ -1661,7 +8685,7 @@ components: name: nullable: true type: string - description: 'Name associated with the User account, or `null` if none has been provided.' + description: Name associated with the User account, or `null` if none has been provided. example: John Doe username: type: string @@ -1672,33 +8696,44 @@ components: type: string description: SHA1 hash of the avatar for the User account. Can be used in conjuction with the ... endpoint to retrieve the avatar image. example: 22cb30c85ff45ac4c72de8981500006b28114aa1 - version: + defaultTeamId: nullable: true type: string + description: The user's default team. + isEnterpriseManaged: + type: boolean + enum: + - false + - true + description: Indicates whether the user is managed by an enterprise. + shouldShowEnterpriseManagedWelcome: + type: boolean enum: - - northstar - description: The user's version. Will either be unset or `northstar`. + - false + - true + description: Whether the Enterprise Managed User joined the current team through the Update Account flow and should see its welcome experience. required: - - createdAt - - softBlock + - avatar - billing - - resourceConfig - - stagingPrefix - - hasTrialAvailable + - createdAt - defaultTeamId - - id - email + - hasTrialAvailable + - id - name + - resourceConfig + - softBlock + - stagingPrefix - username - - avatar - - version type: object description: Data for the currently authenticated User. AuthUserLimited: properties: limited: type: boolean - description: 'Property indicating that this User data contains only limited information, due to the authentication token missing privileges to read the full User data. Re-login with email, GitHub, GitLab or Bitbucket in order to upgrade the authentication token with the necessary privileges.' + enum: + - true + description: Property indicating that this User data contains only limited information, due to the authentication token missing privileges to read the full User data. Re-login with email, GitHub, GitLab or Bitbucket in order to upgrade the authentication token with the necessary privileges. id: type: string description: The User's unique identifier. @@ -1710,7 +8745,7 @@ components: name: nullable: true type: string - description: 'Name associated with the User account, or `null` if none has been provided.' + description: Name associated with the User account, or `null` if none has been provided. example: John Doe username: type: string @@ -1721,255 +8756,1522 @@ components: type: string description: SHA1 hash of the avatar for the User account. Can be used in conjuction with the ... endpoint to retrieve the avatar image. example: 22cb30c85ff45ac4c72de8981500006b28114aa1 - version: + defaultTeamId: nullable: true type: string + description: The user's default team. + isEnterpriseManaged: + type: boolean + enum: + - false + - true + description: Indicates whether the user is managed by an enterprise. + shouldShowEnterpriseManagedWelcome: + type: boolean enum: - - northstar - description: The user's version. Will either be unset or `northstar`. + - false + - true + description: Whether the Enterprise Managed User joined the current team through the Update Account flow and should see its welcome experience. required: - - limited - - id + - avatar + - defaultTeamId - email + - id + - limited - name - username - - avatar - - version type: object - description: 'A limited form of data for the currently authenticated User, due to the authentication token missing privileges to read the full User data.' - responses: {} - securitySchemes: - bearerToken: - type: http - description: Default authentication mechanism - scheme: bearer - oauth2: - type: oauth2 - flows: - authorizationCode: - authorizationUrl: 'https://api.vercel.com/oauth/authorize' - tokenUrl: 'https://api.vercel.com/oauth/access_token' - scopes: {} + description: A limited form of data for the currently authenticated User, due to the authentication token missing privileges to read the full User data. + ListEventType: + properties: + name: + type: string + enum: + - access-group-created + - access-group-deleted + - access-group-project-updated + - access-group-updated + - access-group-user-added + - access-group-user-removed + - admin-agentic-provisioning-account-unlinked + - admin-plan-updated + - admin-secondary-email-added + - admin-secondary-email-removed + - admin-team-name-update + - admin-team-slug-update + - admin-user-delete + - admin-user-primary-email-updated + - admin-username-updated + - agentic-provisioning-account-blocked + - agentic-provisioning-account-linked + - agentic-provisioning-account-relinked + - agentic-provisioning-account-unlinked + - agentic-provisioning-credentials-rotated + - agentic-provisioning-plan-changed + - agentic-provisioning-team-created + - ai-alert-investigation + - ai-code-review + - ai-gateway-api-key-created + - ai-gateway-api-key-deleted + - ai-gateway-api-key-quota-updated + - ai-gateway-auto-reload-updated + - ai-gateway-budget-default-updated + - ai-gateway-byok-credential-created + - ai-gateway-byok-credential-deleted + - ai-gateway-byok-credential-updated + - ai-gateway-byok-model-mappings-updated + - ai-gateway-credits-purchased + - ai-gateway-guardrails-updated + - ai-gateway-hipaa-compliance-toggled + - ai-gateway-inference-regions-updated + - ai-gateway-model-allowlist-models-updated + - ai-gateway-model-allowlist-toggled + - ai-gateway-private-model-created + - ai-gateway-private-model-deleted + - ai-gateway-private-model-updated + - ai-gateway-private-provider-created + - ai-gateway-private-provider-deleted + - ai-gateway-private-provider-updated + - ai-gateway-prompt-training-opt-out-toggled + - ai-gateway-provider-allowlist-providers-updated + - ai-gateway-provider-allowlist-toggled + - ai-gateway-rule-created + - ai-gateway-rule-deleted + - ai-gateway-rule-updated + - ai-gateway-scope-budget-updated + - ai-gateway-transcripts-default-disabled + - ai-gateway-transcripts-default-enabled + - ai-gateway-transcripts-disabled + - ai-gateway-transcripts-enabled + - ai-gateway-transcripts-retention-updated + - ai-gateway-virtual-model-config-archived + - ai-gateway-virtual-model-config-created + - ai-gateway-virtual-model-config-deleted + - ai-gateway-virtual-model-config-restored + - ai-gateway-virtual-model-config-updated + - ai-gateway-zero-data-retention-toggled + - ai-omniagent + - alert-investigation-project-allowlist-updated + - alert-rule-created + - alert-rule-deleted + - alert-rule-updated + - alias + - alias-chown + - alias-delete + - alias-invite-created + - alias-invite-joined + - alias-invite-revoked + - alias-protection-bypass-created + - alias-protection-bypass-exception + - alias-protection-bypass-regenerated + - alias-protection-bypass-revoked + - alias-system + - alias-user-scoped-access-denied + - alias-user-scoped-access-granted + - alias-user-scoped-access-requested + - alias-user-scoped-access-revoked + - aliases-assigned + - attack-mode-disabled + - attack-mode-enabled + - audit-log-export-downloaded + - audit-log-export-requested + - authorize-git-deployment + - auto-expose-system-envs + - avatar + - billing-settings-updated + - bulk-redirects-settings-updated + - bulk-redirects-version-promoted + - bulk-redirects-version-restored + - cert + - cert-autorenew + - cert-chown + - cert-clone + - cert-delete + - cert-renew + - cert-replace + - cert-system-create + - code-owners-config-updated + - compliance-document-downloaded + - compliance-document-previewed + - compliance-documents-bulk-downloaded + - concurrent-builds-update + - connect-attach-project + - connect-bitbucket + - connect-bitbucket-app + - connect-configuration-created + - connect-configuration-deleted + - connect-configuration-link-updated + - connect-configuration-linked + - connect-configuration-unlinked + - connect-configuration-updated + - connect-create-connector + - connect-delete-connector + - connect-delete-installation + - connect-detach-project + - connect-github + - connect-github-custom-host + - connect-github-limited + - connect-gitlab + - connect-gitlab-app + - connect-import-tokens + - connect-revoke-all-tokens + - connect-update-connector + - connect-update-trigger-destinations + - connect-upsert-installation + - custom-alert-created + - custom-alert-deleted + - custom-alert-updated + - custom-environments-settings-updated + - custom-metric-metadata-deleted + - custom-metric-metadata-updated + - custom-suffix-clear + - custom-suffix-disable + - custom-suffix-enable + - custom-suffix-pending + - custom-suffix-ready + - deploy-hook-created + - deploy-hook-deduped + - deploy-hook-deleted + - deploy-hook-processed + - deployment + - deployment-check-created + - deployment-check-deleted + - deployment-check-updated + - deployment-chown + - deployment-creation-blocked + - deployment-delete + - deployment-policy-blocked + - deployment-undeleted + - disabled-integration-installation-removed + - disconnect-bitbucket-app + - disconnect-github + - disconnect-github-custom-host + - disconnect-github-limited + - disconnect-gitlab-app + - dns-add + - dns-delete + - dns-record-internal + - dns-update + - dns-zonefile-import + - domain + - domain-buy + - domain-cdn + - domain-chown + - domain-custom-ns-change + - domain-delegated + - domain-delete + - domain-ech-change + - domain-move-in + - domain-move-out + - domain-move-out-request-sent + - domain-renew-change + - domain-service-type-updated + - domain-transfer-in + - domain-transfer-in-canceled + - domain-transfer-in-completed + - domain-zone-change + - domain-zone-change-internal + - drain-created + - drain-deleted + - drain-disabled + - drain-enabled + - drain-updated + - edge-cache-dangerously-delete-by-src-images + - edge-cache-dangerously-delete-by-tags + - edge-cache-dangerously-delete-immutable-static + - edge-cache-invalidate-by-src-images + - edge-cache-invalidate-by-tags + - edge-cache-purge-all + - edge-cache-rollback-purge + - edge-config-backup-restored + - edge-config-created + - edge-config-deleted + - edge-config-items-updated + - edge-config-schema-deleted + - edge-config-schema-updated + - edge-config-token-created + - edge-config-token-deleted + - edge-config-transfer-in + - edge-config-transfer-out + - edge-config-updated + - email + - email-notification-rule-removed + - email-notification-rule-updated + - emu-member-removed-unverified-domain + - enforce-disjunctive-production-secrets + - enforce-sensitive-environment-variables + - env-variable-add + - env-variable-delete + - env-variable-edit + - env-variable-masked + - env-variable-read + - env-variable-read:cli:dev + - env-variable-read:cli:env:add + - env-variable-read:cli:env:ls + - env-variable-read:cli:env:pull + - env-variable-read:cli:env:rm + - env-variable-read:cli:pull + - env-variable-read:unknown-source + - env-variable-read:v0:env:pull + - env-variable-rotated + - experiment-created + - experiment-deleted + - experiment-transitioned + - experiment-updated + - firewall-bypass-created + - firewall-bypass-deleted + - firewall-config-modified + - firewall-config-promoted + - firewall-config-removed + - firewall-managed-rulegroup-updated + - firewall-managed-ruleset-updated + - flag + - flag-archived + - flag-created + - flag-deleted + - flag-unarchived + - flag-updated + - flags-explorer-subscription + - flags-sdk-key + - flags-sdk-key-added + - flags-sdk-key-deleted + - flags-sdk-key-read + - flags-segment + - flags-settings + - flags-transferred + - flat-rate-cdn-auto-upgrade-consent + - git-integration-repo-push + - git_account_integration_link_added + - global-config-backup-restored + - global-config-created + - global-config-deleted + - global-config-items-updated + - global-config-schema-deleted + - global-config-schema-updated + - global-config-token-created + - global-config-token-deleted + - global-config-transfer-in + - global-config-transfer-out + - global-config-updated + - instant-rollback-created + - integration-configuration-credential-revoked + - integration-configuration-credential-rotated + - integration-configuration-owner-changed + - integration-configuration-scope-change-confirmed + - integration-configuration-transfer-in-success + - integration-configuration-transfer-out-success + - integration-configurations-disabled + - integration-installation-billing-plan-updated + - integration-installation-completed + - integration-installation-permission-updated + - integration-installation-removed + - integration-resource-redis-command-executed + - integration-resource-sql-query-executed + - integration-scope-changed + - invoice-modified + - invoice-refunded + - kms-issuer-created + - kms-issuer-deleted + - kms-issuer-key-activated + - kms-issuer-key-created + - kms-issuer-key-revoked + - kms-issuer-key-rotated + - kms-issuer-policy-created + - kms-issuer-policy-deleted + - kms-issuer-policy-updated + - kms-issuer-updated + - log-drain-created + - log-drain-deleted + - log-drain-disabled + - log-drain-enabled + - login + - login-connection-linked + - login-connection-unlinked + - manual-deployment-promotion-created + - marketplace-flex-commit-opt-in + - marketplace-integration-allowlist-updated + - microfrontend-group-added + - microfrontend-group-deleted + - microfrontend-group-updated + - microfrontend-project-added-to-group + - microfrontend-project-removed-from-group + - microfrontend-project-updated + - monitoring-alert-updated + - monitoring-disabled + - monitoring-enabled + - oauth-app-connection-created + - oauth-app-connection-removed + - oauth-app-connection-updated + - oauth-app-created + - oauth-app-deleted + - oauth-app-secret-deleted + - oauth-app-secret-generated + - oauth-app-token-created + - oauth-app-updated + - observability-disabled + - observability-enabled + - observability-plus-project-disabled + - observability-plus-project-enabled + - oidc-policy-created + - oidc-policy-deleted + - oidc-policy-updated + - oidc-policy-used-to-obtain-app-token + - organization-create + - organization-delete + - organization-dsync-group-delete + - organization-dsync-group-upsert + - organization-slug-update + - organization-team-add + - organization-team-create + - organization-team-delete + - organization-team-sso-update + - owner-blocked + - owner-soft-blocked + - owner-soft-unblocked + - owner-unblocked + - page-integrity-config-updated + - page-integrity-header-approved + - page-integrity-header-rejected + - page-integrity-inventory-cleared + - page-integrity-resource-approved + - page-integrity-resource-deleted + - page-integrity-resource-rejected + - page-integrity-script-approval-rule-created + - page-integrity-script-approval-rule-deleted + - passkey-created + - passkey-deleted + - passkey-updated + - passport-access-granted + - password-protection-disabled + - password-protection-enabled + - payment-method-added + - payment-method-default-updated + - payment-method-removed + - plan + - preview-deployment-suffix-disabled + - preview-deployment-suffix-enabled + - preview-deployment-suffix-update + - privatelink-endpoint-created + - privatelink-endpoint-deleted + - privatelink-endpoint-updated + - production-branch-updated + - project-add-alias + - project-add-redirect + - project-affected-projects-deployments-updated + - project-alias-configured-change + - project-analytics-disabled + - project-analytics-enabled + - project-auto-assign-custom-production-domains-updated + - project-automation-bypass + - project-avatar-update + - project-build-command-updated + - project-build-logs-and-source-protection-updated + - project-build-machine-updated + - project-card-widget-preference-updated + - project-client-cert-delete + - project-client-cert-upload + - project-connect-configurations + - project-consolidated-git-commit-status-updated + - project-created + - project-cron-jobs-toggled + - project-custom-environment-created + - project-custom-environment-deleted + - project-custom-environment-updated + - project-customer-success-code-visibility-updated + - project-delete + - project-deployment-policy-updated + - project-deployment-retention-updated + - project-directory-listing + - project-domain-deleted + - project-domain-moved + - project-domain-unverified + - project-domain-updated + - project-domain-verified + - project-elastic-concurrency-updated + - project-expiration-locked + - project-expiration-reached + - project-expiration-scheduled + - project-expiration-unlocked + - project-external-rewrite-caching-updated + - project-framework-updated + - project-function-cpu-memory + - project-function-failover + - project-function-max-duration + - project-function-regions + - project-functions-beta-updated + - project-functions-fluid-disabled + - project-functions-fluid-enabled + - project-git-commit-comments-toggled + - project-git-commit-status-toggled + - project-git-create-deployments-toggled + - project-git-credential-bound-created + - project-git-credential-bound-deleted + - project-git-credential-bound-updated + - project-git-credential-grant-created + - project-git-credential-grant-deleted + - project-git-credential-grant-updated + - project-git-fork-protection-updated + - project-git-lfs-toggled + - project-git-pr-comments-toggled + - project-git-repository-connected + - project-git-repository-disconnected + - project-git-repository-dispatch-events-toggled + - project-git-require-verified-commits-toggled + - project-ignored-build-step-updated + - project-install-command-updated + - project-member-added + - project-member-invited + - project-member-removed + - project-member-removed-batch + - project-member-updated + - project-move-in-success + - project-move-out-failed + - project-move-out-started + - project-move-out-success + - project-name + - project-node-version-updated + - project-oidc-issuer-mode-updated + - project-oidc-token-created + - project-options-allowlist + - project-output-directory-updated + - project-passport-updated + - project-password-protection + - project-paused + - project-preview-deployment-suffix + - project-preview-environment-branch-tracking-updated + - project-prioritize-production-builds-updated + - project-program-enrollment-changed + - project-protected-sourcemaps-updated + - project-rollback-description-updated + - project-rolling-release-aborted + - project-rolling-release-approved + - project-rolling-release-completed + - project-rolling-release-configured + - project-rolling-release-continued + - project-rolling-release-disabled + - project-rolling-release-enabled + - project-rolling-release-paused + - project-rolling-release-started + - project-rolling-release-suggested-actions-generated + - project-rolling-release-timer + - project-root-directory-updated + - project-routes-version-promoted + - project-routes-version-restored + - project-sandbox-config-updated + - project-sandbox-url-protection-updated + - project-skew-protection-allowed-domains-updated + - project-skew-protection-max-age-updated + - project-skew-protection-threshold-updated + - project-source-files-outside-root-directory-updated + - project-speed-insights-disabled + - project-speed-insights-enabled + - project-speed-insights-free-data-started + - project-sso-protection + - project-static-ips-updated + - project-trusted-ips + - project-trusted-sources + - project-unpaused + - project-web-analytics-disabled + - project-web-analytics-enabled + - protected-git-scope-added + - protected-git-scope-removed + - runtime-cache-purge-all + - saml-connection-created + - saml-connection-deleted + - sandbox-alias-assigned + - sandbox-alias-delete + - sandbox-drive-created + - sandbox-drive-deleted + - sandbox-snapshot-regions-updated + - scale + - scale-auto + - secondary-email-added + - secondary-email-removed + - secondary-email-verified + - secret-add + - secret-delete + - secret-rename + - security-list-created + - security-list-deleted + - security-list-updated + - security-plus-updated + - set-bio + - set-name + - set-profiles + - set-scale + - shared-env-variable-create + - shared-env-variable-delete + - shared-env-variable-read + - shared-env-variable-repo-link + - shared-env-variable-repo-unlink + - shared-env-variable-update + - show-ip-addresses + - signup + - signup-via-bitbucket + - signup-via-github + - signup-via-gitlab + - speed-insights-settings-updated + - spend-created + - spend-deleted + - spend-updated + - sso-login + - storage-accept-tos + - storage-access-token-set + - storage-accessed-data-browser + - storage-connect-project + - storage-create + - storage-delete + - storage-disconnect-project + - storage-disconnect-projects + - storage-inactive-store-deleted + - storage-reset-credentials + - storage-resource-repl-command + - storage-set-locked + - storage-transfer-in-success + - storage-transfer-out-success + - storage-transfer-request-created + - storage-update + - storage-update-project-connection + - storage-upgrade-project-connection-to-oidc + - storage-view-secret + - strict-connectors + - strict-deployment-protection-settings + - strict-password-protection-settings + - strict-shareable-links + - subscription-created + - subscription-product-added + - subscription-product-removed + - subscription-updated + - support-session-created + - team + - team-agent-billing-migration-decision-changed + - team-avatar-update + - team-collaboration-settings-updated + - team-default-build-machine-updated + - team-default-passport-updated + - team-delete + - team-deployment-policy-updated + - team-domain-verification-created + - team-domain-verification-deleted + - team-domain-verification-verified + - team-email-domain-update + - team-emu-updated + - team-ended-trial + - team-firewall-config-modified + - team-firewall-config-promoted + - team-git-repository-dispatch-events-toggled + - team-git-require-verified-commits-toggled + - team-invite-bulk-delete + - team-invite-code-reset + - team-invite-link-created + - team-invite-link-deleted + - team-ip-blocking-rules-created + - team-ip-blocking-rules-removed + - team-member-add + - team-member-confirm-request + - team-member-decline-request + - team-member-delete + - team-member-entitlement-added + - team-member-entitlement-canceled + - team-member-entitlement-reactivated + - team-member-entitlement-removed + - team-member-join + - team-member-leave + - team-member-request-access + - team-member-role-update + - team-member-sso-authorization-attempt + - team-mfa-enforcement-updated + - team-name-update + - team-paid-invoice + - team-program-enrollment-changed + - team-remote-caching-purge + - team-remote-caching-update + - team-saml-enforced + - team-saml-roles + - team-slug-update + - team-tokens-invalidated + - tracing-configured + - tracing-disabled + - tracing-paused + - tracing-resumed + - unlink-login-connection + - update-account-flow-dismissed + - update-account-flow-triggered + - user-auto-block-configured + - user-blocked + - user-delete + - user-delete-requested + - user-emu-account-archived + - user-emu-account-deleted + - user-emu-account-recovered + - user-emu-account-update-opted-in + - user-emu-account-update-opted-out + - user-emu-recovery-email-sent + - user-emu-recovery-initiated + - user-emu-toggled + - user-mfa-challenge-failed + - user-mfa-challenge-initiated + - user-mfa-challenge-verified + - user-mfa-change-failed + - user-mfa-configuration-updated + - user-mfa-recovery-code-used + - user-mfa-recovery-codes-regenerated + - user-mfa-removed + - user-mfa-setup-skipped + - user-mfa-totp-verification-started + - user-mfa-totp-verified + - user-phone-removed + - user-phone-updated + - user-primary-email-updated + - user-provider-email-claim-evaluated + - user-sudo-mode-removed + - user-token-created + - user-token-deleted + - user-tokens-deleted + - user-unblocked + - username + - v0-chat-ai-usage + - v0-chat-created + - v0-chat-message-sent + - vcr-image-deleted + - vcr-image-pushed + - vcr-repository-created + - vcr-repository-deleted + - vcr-repository-permission-added + - vcr-repository-permission-removed + - vcr-repository-permissions-cleared + - vcr-repository-visibility-changed + - vercel-agent-elevated-permissions-approved + - vercel-agent-elevated-permissions-requested + - vercel-agent-session-created + - vercel-agent-team-trial-credits-applied + - vercel-app-installation-request-dismissed + - vercel-app-installation-requested + - vercel-app-installation-updated + - vercel-app-installed + - vercel-app-tokens-revoked + - vercel-app-uninstalled + - vercel-toolbar + - vpc-peering-connection-accepted + - vpc-peering-connection-deleted + - vpc-peering-connection-rejected + - vpc-peering-connection-updated + - vulnerability-banner-dismissed + - web-analytics-tier-updated + - webhook-created + - webhook-deleted + - webhook-updated + - workflow-deployment-key-accessed + description: The name of the event type. + example: deployment-created + description: + type: string + description: Description of the event, visible to users in the Activity dashboard and docs. + categories: + items: + type: string + enum: + - account + - ai + - ai-gateway + - billing + - connect + - deployment + - domain + - edge + - env-variable + - feature-flags + - firewall + - integration + - microfrontends + - network + - observability + - other + - project + - security + - storage + - team + - v0 + - vercel-app + - workflow + example: + - deployment + description: Categories that group this event type with related event types. + type: array + description: Categories that group this event type with related event types. + example: + - deployment + deprecated: + type: boolean + enum: + - false + - true + description: Present only when this event type is deprecated. + replacedBy: + items: + type: string + enum: + - access-group-created + - access-group-deleted + - access-group-project-updated + - access-group-updated + - access-group-user-added + - access-group-user-removed + - admin-agentic-provisioning-account-unlinked + - admin-plan-updated + - admin-secondary-email-added + - admin-secondary-email-removed + - admin-team-name-update + - admin-team-slug-update + - admin-user-delete + - admin-user-primary-email-updated + - admin-username-updated + - agentic-provisioning-account-blocked + - agentic-provisioning-account-linked + - agentic-provisioning-account-relinked + - agentic-provisioning-account-unlinked + - agentic-provisioning-credentials-rotated + - agentic-provisioning-plan-changed + - agentic-provisioning-team-created + - ai-alert-investigation + - ai-code-review + - ai-gateway-api-key-created + - ai-gateway-api-key-deleted + - ai-gateway-api-key-quota-updated + - ai-gateway-auto-reload-updated + - ai-gateway-budget-default-updated + - ai-gateway-byok-credential-created + - ai-gateway-byok-credential-deleted + - ai-gateway-byok-credential-updated + - ai-gateway-byok-model-mappings-updated + - ai-gateway-credits-purchased + - ai-gateway-guardrails-updated + - ai-gateway-hipaa-compliance-toggled + - ai-gateway-inference-regions-updated + - ai-gateway-model-allowlist-models-updated + - ai-gateway-model-allowlist-toggled + - ai-gateway-private-model-created + - ai-gateway-private-model-deleted + - ai-gateway-private-model-updated + - ai-gateway-private-provider-created + - ai-gateway-private-provider-deleted + - ai-gateway-private-provider-updated + - ai-gateway-prompt-training-opt-out-toggled + - ai-gateway-provider-allowlist-providers-updated + - ai-gateway-provider-allowlist-toggled + - ai-gateway-rule-created + - ai-gateway-rule-deleted + - ai-gateway-rule-updated + - ai-gateway-scope-budget-updated + - ai-gateway-transcripts-default-disabled + - ai-gateway-transcripts-default-enabled + - ai-gateway-transcripts-disabled + - ai-gateway-transcripts-enabled + - ai-gateway-transcripts-retention-updated + - ai-gateway-virtual-model-config-archived + - ai-gateway-virtual-model-config-created + - ai-gateway-virtual-model-config-deleted + - ai-gateway-virtual-model-config-restored + - ai-gateway-virtual-model-config-updated + - ai-gateway-zero-data-retention-toggled + - ai-omniagent + - alert-investigation-project-allowlist-updated + - alert-rule-created + - alert-rule-deleted + - alert-rule-updated + - alias + - alias-chown + - alias-delete + - alias-invite-created + - alias-invite-joined + - alias-invite-revoked + - alias-protection-bypass-created + - alias-protection-bypass-exception + - alias-protection-bypass-regenerated + - alias-protection-bypass-revoked + - alias-system + - alias-user-scoped-access-denied + - alias-user-scoped-access-granted + - alias-user-scoped-access-requested + - alias-user-scoped-access-revoked + - aliases-assigned + - attack-mode-disabled + - attack-mode-enabled + - audit-log-export-downloaded + - audit-log-export-requested + - authorize-git-deployment + - auto-expose-system-envs + - avatar + - billing-settings-updated + - bulk-redirects-settings-updated + - bulk-redirects-version-promoted + - bulk-redirects-version-restored + - cert + - cert-autorenew + - cert-chown + - cert-clone + - cert-delete + - cert-renew + - cert-replace + - cert-system-create + - code-owners-config-updated + - compliance-document-downloaded + - compliance-document-previewed + - compliance-documents-bulk-downloaded + - concurrent-builds-update + - connect-attach-project + - connect-bitbucket + - connect-bitbucket-app + - connect-configuration-created + - connect-configuration-deleted + - connect-configuration-link-updated + - connect-configuration-linked + - connect-configuration-unlinked + - connect-configuration-updated + - connect-create-connector + - connect-delete-connector + - connect-delete-installation + - connect-detach-project + - connect-github + - connect-github-custom-host + - connect-github-limited + - connect-gitlab + - connect-gitlab-app + - connect-import-tokens + - connect-revoke-all-tokens + - connect-update-connector + - connect-update-trigger-destinations + - connect-upsert-installation + - custom-alert-created + - custom-alert-deleted + - custom-alert-updated + - custom-environments-settings-updated + - custom-metric-metadata-deleted + - custom-metric-metadata-updated + - custom-suffix-clear + - custom-suffix-disable + - custom-suffix-enable + - custom-suffix-pending + - custom-suffix-ready + - deploy-hook-created + - deploy-hook-deduped + - deploy-hook-deleted + - deploy-hook-processed + - deployment + - deployment-check-created + - deployment-check-deleted + - deployment-check-updated + - deployment-chown + - deployment-creation-blocked + - deployment-delete + - deployment-policy-blocked + - deployment-undeleted + - disabled-integration-installation-removed + - disconnect-bitbucket-app + - disconnect-github + - disconnect-github-custom-host + - disconnect-github-limited + - disconnect-gitlab-app + - dns-add + - dns-delete + - dns-record-internal + - dns-update + - dns-zonefile-import + - domain + - domain-buy + - domain-cdn + - domain-chown + - domain-custom-ns-change + - domain-delegated + - domain-delete + - domain-ech-change + - domain-move-in + - domain-move-out + - domain-move-out-request-sent + - domain-renew-change + - domain-service-type-updated + - domain-transfer-in + - domain-transfer-in-canceled + - domain-transfer-in-completed + - domain-zone-change + - domain-zone-change-internal + - drain-created + - drain-deleted + - drain-disabled + - drain-enabled + - drain-updated + - edge-cache-dangerously-delete-by-src-images + - edge-cache-dangerously-delete-by-tags + - edge-cache-dangerously-delete-immutable-static + - edge-cache-invalidate-by-src-images + - edge-cache-invalidate-by-tags + - edge-cache-purge-all + - edge-cache-rollback-purge + - edge-config-backup-restored + - edge-config-created + - edge-config-deleted + - edge-config-items-updated + - edge-config-schema-deleted + - edge-config-schema-updated + - edge-config-token-created + - edge-config-token-deleted + - edge-config-transfer-in + - edge-config-transfer-out + - edge-config-updated + - email + - email-notification-rule-removed + - email-notification-rule-updated + - emu-member-removed-unverified-domain + - enforce-disjunctive-production-secrets + - enforce-sensitive-environment-variables + - env-variable-add + - env-variable-delete + - env-variable-edit + - env-variable-masked + - env-variable-read + - env-variable-read:cli:dev + - env-variable-read:cli:env:add + - env-variable-read:cli:env:ls + - env-variable-read:cli:env:pull + - env-variable-read:cli:env:rm + - env-variable-read:cli:pull + - env-variable-read:unknown-source + - env-variable-read:v0:env:pull + - env-variable-rotated + - experiment-created + - experiment-deleted + - experiment-transitioned + - experiment-updated + - firewall-bypass-created + - firewall-bypass-deleted + - firewall-config-modified + - firewall-config-promoted + - firewall-config-removed + - firewall-managed-rulegroup-updated + - firewall-managed-ruleset-updated + - flag + - flag-archived + - flag-created + - flag-deleted + - flag-unarchived + - flag-updated + - flags-explorer-subscription + - flags-sdk-key + - flags-sdk-key-added + - flags-sdk-key-deleted + - flags-sdk-key-read + - flags-segment + - flags-settings + - flags-transferred + - flat-rate-cdn-auto-upgrade-consent + - git-integration-repo-push + - git_account_integration_link_added + - global-config-backup-restored + - global-config-created + - global-config-deleted + - global-config-items-updated + - global-config-schema-deleted + - global-config-schema-updated + - global-config-token-created + - global-config-token-deleted + - global-config-transfer-in + - global-config-transfer-out + - global-config-updated + - instant-rollback-created + - integration-configuration-credential-revoked + - integration-configuration-credential-rotated + - integration-configuration-owner-changed + - integration-configuration-scope-change-confirmed + - integration-configuration-transfer-in-success + - integration-configuration-transfer-out-success + - integration-configurations-disabled + - integration-installation-billing-plan-updated + - integration-installation-completed + - integration-installation-permission-updated + - integration-installation-removed + - integration-resource-redis-command-executed + - integration-resource-sql-query-executed + - integration-scope-changed + - invoice-modified + - invoice-refunded + - kms-issuer-created + - kms-issuer-deleted + - kms-issuer-key-activated + - kms-issuer-key-created + - kms-issuer-key-revoked + - kms-issuer-key-rotated + - kms-issuer-policy-created + - kms-issuer-policy-deleted + - kms-issuer-policy-updated + - kms-issuer-updated + - log-drain-created + - log-drain-deleted + - log-drain-disabled + - log-drain-enabled + - login + - login-connection-linked + - login-connection-unlinked + - manual-deployment-promotion-created + - marketplace-flex-commit-opt-in + - marketplace-integration-allowlist-updated + - microfrontend-group-added + - microfrontend-group-deleted + - microfrontend-group-updated + - microfrontend-project-added-to-group + - microfrontend-project-removed-from-group + - microfrontend-project-updated + - monitoring-alert-updated + - monitoring-disabled + - monitoring-enabled + - oauth-app-connection-created + - oauth-app-connection-removed + - oauth-app-connection-updated + - oauth-app-created + - oauth-app-deleted + - oauth-app-secret-deleted + - oauth-app-secret-generated + - oauth-app-token-created + - oauth-app-updated + - observability-disabled + - observability-enabled + - observability-plus-project-disabled + - observability-plus-project-enabled + - oidc-policy-created + - oidc-policy-deleted + - oidc-policy-updated + - oidc-policy-used-to-obtain-app-token + - organization-create + - organization-delete + - organization-dsync-group-delete + - organization-dsync-group-upsert + - organization-slug-update + - organization-team-add + - organization-team-create + - organization-team-delete + - organization-team-sso-update + - owner-blocked + - owner-soft-blocked + - owner-soft-unblocked + - owner-unblocked + - page-integrity-config-updated + - page-integrity-header-approved + - page-integrity-header-rejected + - page-integrity-inventory-cleared + - page-integrity-resource-approved + - page-integrity-resource-deleted + - page-integrity-resource-rejected + - page-integrity-script-approval-rule-created + - page-integrity-script-approval-rule-deleted + - passkey-created + - passkey-deleted + - passkey-updated + - passport-access-granted + - password-protection-disabled + - password-protection-enabled + - payment-method-added + - payment-method-default-updated + - payment-method-removed + - plan + - preview-deployment-suffix-disabled + - preview-deployment-suffix-enabled + - preview-deployment-suffix-update + - privatelink-endpoint-created + - privatelink-endpoint-deleted + - privatelink-endpoint-updated + - production-branch-updated + - project-add-alias + - project-add-redirect + - project-affected-projects-deployments-updated + - project-alias-configured-change + - project-analytics-disabled + - project-analytics-enabled + - project-auto-assign-custom-production-domains-updated + - project-automation-bypass + - project-avatar-update + - project-build-command-updated + - project-build-logs-and-source-protection-updated + - project-build-machine-updated + - project-card-widget-preference-updated + - project-client-cert-delete + - project-client-cert-upload + - project-connect-configurations + - project-consolidated-git-commit-status-updated + - project-created + - project-cron-jobs-toggled + - project-custom-environment-created + - project-custom-environment-deleted + - project-custom-environment-updated + - project-customer-success-code-visibility-updated + - project-delete + - project-deployment-policy-updated + - project-deployment-retention-updated + - project-directory-listing + - project-domain-deleted + - project-domain-moved + - project-domain-unverified + - project-domain-updated + - project-domain-verified + - project-elastic-concurrency-updated + - project-expiration-locked + - project-expiration-reached + - project-expiration-scheduled + - project-expiration-unlocked + - project-external-rewrite-caching-updated + - project-framework-updated + - project-function-cpu-memory + - project-function-failover + - project-function-max-duration + - project-function-regions + - project-functions-beta-updated + - project-functions-fluid-disabled + - project-functions-fluid-enabled + - project-git-commit-comments-toggled + - project-git-commit-status-toggled + - project-git-create-deployments-toggled + - project-git-credential-bound-created + - project-git-credential-bound-deleted + - project-git-credential-bound-updated + - project-git-credential-grant-created + - project-git-credential-grant-deleted + - project-git-credential-grant-updated + - project-git-fork-protection-updated + - project-git-lfs-toggled + - project-git-pr-comments-toggled + - project-git-repository-connected + - project-git-repository-disconnected + - project-git-repository-dispatch-events-toggled + - project-git-require-verified-commits-toggled + - project-ignored-build-step-updated + - project-install-command-updated + - project-member-added + - project-member-invited + - project-member-removed + - project-member-removed-batch + - project-member-updated + - project-move-in-success + - project-move-out-failed + - project-move-out-started + - project-move-out-success + - project-name + - project-node-version-updated + - project-oidc-issuer-mode-updated + - project-oidc-token-created + - project-options-allowlist + - project-output-directory-updated + - project-passport-updated + - project-password-protection + - project-paused + - project-preview-deployment-suffix + - project-preview-environment-branch-tracking-updated + - project-prioritize-production-builds-updated + - project-program-enrollment-changed + - project-protected-sourcemaps-updated + - project-rollback-description-updated + - project-rolling-release-aborted + - project-rolling-release-approved + - project-rolling-release-completed + - project-rolling-release-configured + - project-rolling-release-continued + - project-rolling-release-disabled + - project-rolling-release-enabled + - project-rolling-release-paused + - project-rolling-release-started + - project-rolling-release-suggested-actions-generated + - project-rolling-release-timer + - project-root-directory-updated + - project-routes-version-promoted + - project-routes-version-restored + - project-sandbox-config-updated + - project-sandbox-url-protection-updated + - project-skew-protection-allowed-domains-updated + - project-skew-protection-max-age-updated + - project-skew-protection-threshold-updated + - project-source-files-outside-root-directory-updated + - project-speed-insights-disabled + - project-speed-insights-enabled + - project-speed-insights-free-data-started + - project-sso-protection + - project-static-ips-updated + - project-trusted-ips + - project-trusted-sources + - project-unpaused + - project-web-analytics-disabled + - project-web-analytics-enabled + - protected-git-scope-added + - protected-git-scope-removed + - runtime-cache-purge-all + - saml-connection-created + - saml-connection-deleted + - sandbox-alias-assigned + - sandbox-alias-delete + - sandbox-drive-created + - sandbox-drive-deleted + - sandbox-snapshot-regions-updated + - scale + - scale-auto + - secondary-email-added + - secondary-email-removed + - secondary-email-verified + - secret-add + - secret-delete + - secret-rename + - security-list-created + - security-list-deleted + - security-list-updated + - security-plus-updated + - set-bio + - set-name + - set-profiles + - set-scale + - shared-env-variable-create + - shared-env-variable-delete + - shared-env-variable-read + - shared-env-variable-repo-link + - shared-env-variable-repo-unlink + - shared-env-variable-update + - show-ip-addresses + - signup + - signup-via-bitbucket + - signup-via-github + - signup-via-gitlab + - speed-insights-settings-updated + - spend-created + - spend-deleted + - spend-updated + - sso-login + - storage-accept-tos + - storage-access-token-set + - storage-accessed-data-browser + - storage-connect-project + - storage-create + - storage-delete + - storage-disconnect-project + - storage-disconnect-projects + - storage-inactive-store-deleted + - storage-reset-credentials + - storage-resource-repl-command + - storage-set-locked + - storage-transfer-in-success + - storage-transfer-out-success + - storage-transfer-request-created + - storage-update + - storage-update-project-connection + - storage-upgrade-project-connection-to-oidc + - storage-view-secret + - strict-connectors + - strict-deployment-protection-settings + - strict-password-protection-settings + - strict-shareable-links + - subscription-created + - subscription-product-added + - subscription-product-removed + - subscription-updated + - support-session-created + - team + - team-agent-billing-migration-decision-changed + - team-avatar-update + - team-collaboration-settings-updated + - team-default-build-machine-updated + - team-default-passport-updated + - team-delete + - team-deployment-policy-updated + - team-domain-verification-created + - team-domain-verification-deleted + - team-domain-verification-verified + - team-email-domain-update + - team-emu-updated + - team-ended-trial + - team-firewall-config-modified + - team-firewall-config-promoted + - team-git-repository-dispatch-events-toggled + - team-git-require-verified-commits-toggled + - team-invite-bulk-delete + - team-invite-code-reset + - team-invite-link-created + - team-invite-link-deleted + - team-ip-blocking-rules-created + - team-ip-blocking-rules-removed + - team-member-add + - team-member-confirm-request + - team-member-decline-request + - team-member-delete + - team-member-entitlement-added + - team-member-entitlement-canceled + - team-member-entitlement-reactivated + - team-member-entitlement-removed + - team-member-join + - team-member-leave + - team-member-request-access + - team-member-role-update + - team-member-sso-authorization-attempt + - team-mfa-enforcement-updated + - team-name-update + - team-paid-invoice + - team-program-enrollment-changed + - team-remote-caching-purge + - team-remote-caching-update + - team-saml-enforced + - team-saml-roles + - team-slug-update + - team-tokens-invalidated + - tracing-configured + - tracing-disabled + - tracing-paused + - tracing-resumed + - unlink-login-connection + - update-account-flow-dismissed + - update-account-flow-triggered + - user-auto-block-configured + - user-blocked + - user-delete + - user-delete-requested + - user-emu-account-archived + - user-emu-account-deleted + - user-emu-account-recovered + - user-emu-account-update-opted-in + - user-emu-account-update-opted-out + - user-emu-recovery-email-sent + - user-emu-recovery-initiated + - user-emu-toggled + - user-mfa-challenge-failed + - user-mfa-challenge-initiated + - user-mfa-challenge-verified + - user-mfa-change-failed + - user-mfa-configuration-updated + - user-mfa-recovery-code-used + - user-mfa-recovery-codes-regenerated + - user-mfa-removed + - user-mfa-setup-skipped + - user-mfa-totp-verification-started + - user-mfa-totp-verified + - user-phone-removed + - user-phone-updated + - user-primary-email-updated + - user-provider-email-claim-evaluated + - user-sudo-mode-removed + - user-token-created + - user-token-deleted + - user-tokens-deleted + - user-unblocked + - username + - v0-chat-ai-usage + - v0-chat-created + - v0-chat-message-sent + - vcr-image-deleted + - vcr-image-pushed + - vcr-repository-created + - vcr-repository-deleted + - vcr-repository-permission-added + - vcr-repository-permission-removed + - vcr-repository-permissions-cleared + - vcr-repository-visibility-changed + - vercel-agent-elevated-permissions-approved + - vercel-agent-elevated-permissions-requested + - vercel-agent-session-created + - vercel-agent-team-trial-credits-applied + - vercel-app-installation-request-dismissed + - vercel-app-installation-requested + - vercel-app-installation-updated + - vercel-app-installed + - vercel-app-tokens-revoked + - vercel-app-uninstalled + - vercel-toolbar + - vpc-peering-connection-accepted + - vpc-peering-connection-deleted + - vpc-peering-connection-rejected + - vpc-peering-connection-updated + - vulnerability-banner-dismissed + - web-analytics-tier-updated + - webhook-created + - webhook-deleted + - webhook-updated + - workflow-deployment-key-accessed + description: Event type names that supersede this deprecated event type. + type: array + description: Event type names that supersede this deprecated event type. + required: + - categories + - description + - name + type: object + description: A user-facing event type. x-stackQL-resources: events: id: vercel.user.events name: events title: Events methods: - list_user_events: + list: operation: $ref: '#/paths/~1v3~1events/get' response: mediaType: application/json openAPIDocKey: '200' objectKey: $.events - _list_user_events: + request: + nativeCasing: camel + config: + queryParamPushdown: + top: + paramName: limit + maxValue: 100 + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/events/methods/list' + insert: [] + update: [] + delete: [] + replace: [] + event_types: + id: vercel.user.event_types + name: event_types + title: Event Types + methods: + list: operation: - $ref: '#/paths/~1v3~1events/get' + $ref: '#/paths/~1v1~1events~1types/get' response: mediaType: application/json openAPIDocKey: '200' + objectKey: $.types + request: + nativeCasing: camel sqlVerbs: select: - - $ref: '#/components/x-stackQL-resources/events/methods/list_user_events' + - $ref: '#/components/x-stackQL-resources/event_types/methods/list' insert: [] update: [] delete: [] + replace: [] user: id: vercel.user.user name: user title: User methods: - get_auth_user: + get: operation: $ref: '#/paths/~1v2~1user/get' response: mediaType: application/json openAPIDocKey: '200' objectKey: $.user - _get_auth_user: - operation: - $ref: '#/paths/~1v2~1user/get' - response: - mediaType: application/json - openAPIDocKey: '200' - request_delete: + request: + nativeCasing: camel + delete: operation: $ref: '#/paths/~1v1~1user/delete' response: mediaType: application/json - openAPIDocKey: '200' + openAPIDocKey: '202' + request: + nativeCasing: camel sqlVerbs: select: - - $ref: '#/components/x-stackQL-resources/user/methods/get_auth_user' + - $ref: '#/components/x-stackQL-resources/user/methods/get' insert: [] update: [] delete: - - $ref: '#/components/x-stackQL-resources/user/methods/request_delete' -paths: - /v3/events: - get: - description: 'Retrieves a list of "events" generated by the User on Vercel. Events are generated when the User performs a particular action, such as logging in, creating a deployment, and joining a Team (just to name a few). When the `teamId` parameter is supplied, then the events that are returned will be in relation to the Team that was specified.' - operationId: listUserEvents - security: - - bearerToken: [] - summary: List User Events - tags: - - user - responses: - '200': - description: Successful response. - content: - application/json: - schema: - properties: - events: - items: - $ref: '#/components/schemas/UserEvent' - type: array - description: Array of events generated by the User. - required: - - events - type: object - description: Successful response. - '400': - description: One of the provided values in the request query is invalid. - '401': - description: '' - '403': - description: You do not have permission to access this resource. - parameters: - - name: limit - description: Maximum number of items which may be returned. - in: query - schema: - description: Maximum number of items which may be returned. - example: 20 - type: number - - name: since - description: Timestamp to only include items created since then. - in: query - schema: - description: Timestamp to only include items created since then. - example: '2019-12-08T10:00:38.976Z' - type: string - - name: until - description: Timestamp to only include items created until then. - in: query - schema: - description: Timestamp to only include items created until then. - example: '2019-12-09T23:00:38.976Z' - type: string - - name: types - description: Comma-delimited list of event \"types\" to filter the results by. - in: query - schema: - description: Comma-delimited list of event \"types\" to filter the results by. - example: 'login,team-member-join,domain-buy' - type: string - - name: userId - description: 'When retrieving events for a Team, the `userId` parameter may be specified to filter events generated by a specific member of the Team.' - in: query - schema: - description: 'When retrieving events for a Team, the `userId` parameter may be specified to filter events generated by a specific member of the Team.' - example: aeIInYVk59zbFF2SxfyxxmuO - type: string - - description: The Team identifier or slug to perform the request on behalf of. - in: query - name: teamId - required: true - schema: - type: string - /v2/user: - get: - description: Retrieves information related to the currently authenticated User. - operationId: getAuthUser - security: - - bearerToken: [] - summary: Get the User - tags: - - user - responses: - '200': - description: Successful response. - content: - application/json: - schema: - properties: - user: - oneOf: - - $ref: '#/components/schemas/AuthUser' - - $ref: '#/components/schemas/AuthUserLimited' - required: - - user - type: object - description: Successful response. - '302': - description: '' - '400': - description: '' - '401': - description: '' - '403': - description: You do not have permission to access this resource. - parameters: [] - /v1/user: - delete: - description: 'Initiates the deletion process for the currently authenticated User, by sending a deletion confirmation email. The email contains a link that the user needs to visit in order to proceed with the deletion process.' - operationId: requestDelete - security: - - bearerToken: [] - summary: Delete User Account - tags: - - user - responses: - '202': - description: 'Response indicating that the User deletion process has been initiated, and a confirmation email has been sent.' - content: - application/json: - schema: - properties: - id: - type: string - description: Unique identifier of the User who has initiated deletion. - email: - type: string - description: Email address of the User who has initiated deletion. - message: - type: string - description: User deletion progress status. - example: Verification email sent - required: - - id - - email - - message - type: object - '400': - description: One of the provided values in the request body is invalid. - '403': - description: You do not have permission to access this resource. - parameters: [] - requestBody: - content: - application/json: - schema: - type: object - additionalProperties: false - properties: - reasons: - type: array - description: Optional array of objects that describe the reason why the User account is being deleted. - items: - type: object - description: An object describing the reason why the User account is being deleted. - required: - - slug - - description - additionalProperties: false - properties: - slug: - type: string - description: Idenitifier slug of the reason why the User account is being deleted. - description: - type: string - description: Description of the reason why the User account is being deleted. + - $ref: '#/components/x-stackQL-resources/user/methods/delete' + replace: [] +servers: + - url: https://api.vercel.com diff --git a/provider-dev/openapi/src/vercel/v00.00.00000/services/vcr.yaml b/provider-dev/openapi/src/vercel/v00.00.00000/services/vcr.yaml new file mode 100644 index 0000000..bc71d67 --- /dev/null +++ b/provider-dev/openapi/src/vercel/v00.00.00000/services/vcr.yaml @@ -0,0 +1,2414 @@ +openapi: 3.0.3 +info: + title: vcr API + description: vercel vcr API + version: 0.0.1 +paths: + /v1/vcr/repository: + post: + description: Create a container registry repository for a project. + operationId: createRepository + security: + - bearerToken: [] + summary: Create a repository + tags: + - vcr + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + repository: + $ref: '#/components/schemas/VcrRepository' + required: + - repository + type: object + '400': + description: One of the provided values in the request body is invalid. + '401': + description: The request is not authorized. + '402': + description: The account is missing a payment so payment method must be updated + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '409': + description: '' + '410': + description: '' + parameters: + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + requestBody: + content: + application/json: + schema: + type: object + additionalProperties: false + required: + - projectId + - name + properties: + projectId: + type: string + description: Project ID. Missing or empty values return HTTP 400. + name: + type: string + pattern: ^[a-z0-9]+(?:(?:\\.|_|__|-+)[a-z0-9]+)*$ + maxLength: 255 + description: Single Docker repository name component. + example: nginx + get: + description: List container registry repositories for a project. + operationId: listRepositories + security: + - bearerToken: [] + summary: List repositories + tags: + - vcr + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/VcrRepositoryList' + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + parameters: + - name: projectId + description: Project ID. Missing or empty values return HTTP 400. + in: query + required: true + schema: + type: string + description: Project ID. Missing or empty values return HTTP 400. + - name: limit + in: query + required: false + schema: + type: integer + minimum: 1 + maximum: 1000 + - name: cursor + description: Opaque pagination cursor returned by a previous list response. + in: query + required: false + schema: + type: string + maxLength: 1024 + description: Opaque pagination cursor returned by a previous list response. + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + /v1/vcr/repository/{id_or_name}: + get: + description: Fetch a container registry repository for a project by ID or name. + operationId: getRepository + security: + - bearerToken: [] + summary: Get a repository + tags: + - vcr + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + repository: + $ref: '#/components/schemas/VcrRepository' + required: + - repository + type: object + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + parameters: + - name: projectId + description: Project ID. Missing or empty values return HTTP 400. + in: query + required: true + schema: + type: string + description: Project ID. Missing or empty values return HTTP 400. + - name: id_or_name + in: path + required: true + schema: + type: string + maxLength: 255 + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + delete: + description: Schedule a repository for deletion. The repository is marked so it disappears from list/get immediately; subscriber-vcr reclaims every image (manifests, blobs, tags and rows) and finally deletes the repository row asynchronously via the VcrRepositoryRemoved event. + operationId: deleteRepository + security: + - bearerToken: [] + summary: Delete a repository + tags: + - vcr + responses: + '202': + description: '' + content: + application/json: + schema: + nullable: true + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + parameters: + - name: projectId + description: Project ID. Missing or empty values return HTTP 400. + in: query + required: true + schema: + type: string + description: Project ID. Missing or empty values return HTTP 400. + - name: id_or_name + in: path + required: true + schema: + type: string + maxLength: 255 + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + /v1/vcr/repository/{id_or_name}/images: + get: + description: List images for a container registry repository, including their tags. + operationId: listRepositoryImages + security: + - bearerToken: [] + summary: List repository images + tags: + - vcr + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/VcrImageList' + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + parameters: + - name: projectId + description: Project ID. Missing or empty values return HTTP 400. + in: query + required: true + schema: + type: string + description: Project ID. Missing or empty values return HTTP 400. + - name: id_or_name + in: path + required: true + schema: + type: string + maxLength: 255 + - name: limit + in: query + required: false + schema: + type: integer + minimum: 1 + maximum: 100 + - name: cursor + description: Opaque pagination cursor returned by a previous list response. + in: query + required: false + schema: + type: string + maxLength: 1024 + description: Opaque pagination cursor returned by a previous list response. + - name: untagged + in: query + required: false + schema: + type: boolean + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + /v1/vcr/repository/{id_or_name}/permissions: + post: + description: Grant a team access to a VCR repository. Sharing applies to the whole repository. + operationId: addRepositoryPermission + security: + - bearerToken: [] + summary: Add a repository permission + tags: + - vcr + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + permission: + $ref: '#/components/schemas/VcrRepositoryPermission' + required: + - permission + type: object + '400': + description: |- + One of the provided values in the request body is invalid. + One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + parameters: + - name: projectId + description: Project ID. Missing or empty values return HTTP 400. + in: query + required: true + schema: + type: string + description: Project ID. Missing or empty values return HTTP 400. + - name: id_or_name + in: path + required: true + schema: + type: string + maxLength: 255 + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + requestBody: + content: + application/json: + schema: + type: object + additionalProperties: false + properties: + teamId: + type: string + pattern: ^team_[a-zA-Z0-9]+$ + maxLength: 64 + description: ID of a team that is granted access to a repository. + example: team_LLHUOMOoDlqOp8wPE4kFo9pE + teamSlug: + type: string + pattern: ^[a-z0-9](?:[a-z0-9-]{0,46}[a-z0-9])?$ + maxLength: 64 + description: Slug of a team that is granted access to a repository. + example: my-team + delete: + description: Revoke a team's access to a VCR repository. + operationId: removeRepositoryPermission + security: + - bearerToken: [] + summary: Remove a repository permission + tags: + - vcr + responses: + '204': + description: '' + content: + application/json: + schema: + nullable: true + '400': + description: |- + One of the provided values in the request body is invalid. + One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + parameters: + - name: projectId + description: Project ID. Missing or empty values return HTTP 400. + in: query + required: true + schema: + type: string + description: Project ID. Missing or empty values return HTTP 400. + - name: id_or_name + in: path + required: true + schema: + type: string + maxLength: 255 + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + requestBody: + content: + application/json: + schema: + type: object + additionalProperties: false + properties: + teamId: + type: string + pattern: ^team_[a-zA-Z0-9]+$ + maxLength: 64 + description: ID of a team that is granted access to a repository. + example: team_LLHUOMOoDlqOp8wPE4kFo9pE + teamSlug: + type: string + pattern: ^[a-z0-9](?:[a-z0-9-]{0,46}[a-z0-9])?$ + maxLength: 64 + description: Slug of a team that is granted access to a repository. + example: my-team + get: + description: List the teams a VCR repository is shared with. + operationId: listRepositoryPermissions + security: + - bearerToken: [] + summary: List repository permissions + tags: + - vcr + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/VcrRepositoryPermissionList' + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + parameters: + - name: projectId + description: Project ID. Missing or empty values return HTTP 400. + in: query + required: true + schema: + type: string + description: Project ID. Missing or empty values return HTTP 400. + - name: id_or_name + in: path + required: true + schema: + type: string + maxLength: 255 + - name: limit + in: query + required: false + schema: + type: integer + minimum: 1 + maximum: 100 + - name: cursor + description: Opaque pagination cursor returned by a previous list response. + in: query + required: false + schema: + type: string + maxLength: 1024 + description: Opaque pagination cursor returned by a previous list response. + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + /v1/vcr/repository/{id_or_name}/permissions/all: + delete: + description: Revoke every team's access to a VCR repository. Clearing an unshared repository is a no-op. + operationId: clearRepositoryPermissions + security: + - bearerToken: [] + summary: Clear all repository permissions + tags: + - vcr + responses: + '204': + description: '' + content: + application/json: + schema: + nullable: true + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + parameters: + - name: projectId + description: Project ID. Missing or empty values return HTTP 400. + in: query + required: true + schema: + type: string + description: Project ID. Missing or empty values return HTTP 400. + - name: id_or_name + in: path + required: true + schema: + type: string + maxLength: 255 + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + /v1/vcr/repository/{id_or_name}/tags: + get: + description: List a repository's tags. + operationId: listRepositoryTags + security: + - bearerToken: [] + summary: List repository tags + tags: + - vcr + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + tags: + items: + properties: + tag: + type: string + manifestDigest: + type: string + imageId: + type: string + kind: + type: string + enum: + - attestation + - index + - manifest + platform: + type: string + arch: + type: string + pushedBy: + type: string + status: + nullable: true + type: string + enum: + - preparing + - ready + - unoptimized + - null + sizeInBytes: + type: number + createdAt: + type: string + updatedAt: + type: string + required: + - createdAt + - imageId + - kind + - manifestDigest + - sizeInBytes + - status + - tag + - updatedAt + type: object + type: array + nextCursor: + type: string + required: + - tags + type: object + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + parameters: + - name: projectId + description: Project ID. Missing or empty values return HTTP 400. + in: query + required: true + schema: + type: string + description: Project ID. Missing or empty values return HTTP 400. + - name: id_or_name + in: path + required: true + schema: + type: string + maxLength: 255 + - name: limit + in: query + required: false + schema: + type: integer + minimum: 1 + maximum: 100 + - name: cursor + in: query + required: false + schema: + type: string + - name: sortBy + description: Field to sort the non-pinned tags by. + in: query + required: false + schema: + description: Field to sort the non-pinned tags by. + type: string + enum: + - updatedAt + - tag + default: updatedAt + - name: sortOrder + description: Sort direction. Defaults to desc. + in: query + required: false + schema: + description: Sort direction. Defaults to desc. + type: string + enum: + - asc + - desc + default: desc + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + /v1/vcr/repository/{id_or_name}/tags/{tag}: + get: + description: Fetch a single tag from a repository, including the backing image's metadata and VHS-readiness status. + operationId: getRepositoryTag + security: + - bearerToken: [] + summary: Get a repository tag + tags: + - vcr + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + tag: + $ref: '#/components/schemas/VcrTag' + required: + - tag + type: object + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + parameters: + - name: projectId + description: Project ID. Missing or empty values return HTTP 400. + in: query + required: true + schema: + type: string + description: Project ID. Missing or empty values return HTTP 400. + - name: id_or_name + in: path + required: true + schema: + type: string + maxLength: 255 + - name: tag + in: path + required: true + schema: + type: string + maxLength: 255 + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + /v1/vcr/repository/{id_or_name}/images/{image_id_or_digest}: + get: + description: Fetch an individual image from a repository, including its tags and Dockerfile history entries with discriminated layer details for UI rendering. The image may be addressed by its internal id (`image_...`) or by its manifest digest (`sha256:...`). + operationId: getRepositoryImage + security: + - bearerToken: [] + summary: Get a repository image + tags: + - vcr + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + image: + $ref: '#/components/schemas/VcrImageDetail' + required: + - image + type: object + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + parameters: + - name: projectId + description: Project ID. Missing or empty values return HTTP 400. + in: query + required: true + schema: + type: string + description: Project ID. Missing or empty values return HTTP 400. + - name: id_or_name + in: path + required: true + schema: + type: string + maxLength: 255 + - name: image_id_or_digest + description: The internal image id (`image_...`) or the image manifest digest (`sha256:...`). + in: path + required: true + schema: + type: string + maxLength: 255 + description: The internal image id (`image_...`) or the image manifest digest (`sha256:...`). + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + /v1/vcr/repository/{id_or_name}/images/{image_id}: + delete: + description: Schedule an image for deletion. The image is marked so it disappears from list/get immediately; subscriber-vcr reclaims the manifest, blobs, tags and row asynchronously via the VcrManifestRemoved event. + operationId: deleteRepositoryImage + security: + - bearerToken: [] + summary: Delete a repository image + tags: + - vcr + responses: + '202': + description: '' + content: + application/json: + schema: + nullable: true + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + parameters: + - name: projectId + description: Project ID. Missing or empty values return HTTP 400. + in: query + required: true + schema: + type: string + description: Project ID. Missing or empty values return HTTP 400. + - name: id_or_name + in: path + required: true + schema: + type: string + maxLength: 255 + - name: image_id + in: path + required: true + schema: + type: string + maxLength: 255 + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + /v2/: + get: + description: GET /v2/ Docker Registry v2 version check. Returns a 401 challenge when no credentials are provided, prompting the Docker client to send auth. With valid credentials, returns 200 so the client can proceed. + operationId: getRoot + security: [] + summary: Check registry API version support + tags: + - vcr + responses: + '200': + description: '' + content: + application/json: + schema: + type: string + description: (opaque JSON object) + '400': + description: '' + '401': + description: The request is not authorized. + '402': + description: The account is missing a payment so payment method must be updated + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + parameters: [] + /v2/{team_slug}/{project_slug}/{repository_name}/blobs/{digest}: + head: + description: HEAD /v2/:teamSlug/:projectSlug/:repositoryName/blobs/:digest Check whether a blob exists. Used by the Docker client before pushing a layer to avoid re-uploading content that already exists. + operationId: headByTeamSlugByProjectSlugByRepositoryNameBlobsByDigest + security: [] + summary: Check if a blob exists + tags: + - vcr + responses: + '200': + description: '' + content: + application/json: + schema: + nullable: true + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '402': + description: The account is missing a payment so payment method must be updated + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + parameters: + - name: teamSlug + description: Single Docker repository team slug component. + in: path + required: true + schema: + type: string + pattern: ^[a-z0-9](?:[a-z0-9-]{0,46}[a-z0-9])?$ + maxLength: 255 + description: Single Docker repository team slug component. + example: team-slug + - name: projectSlug + description: Single Docker repository project slug component. + in: path + required: true + schema: + type: string + pattern: ^[a-z0-9](?:[a-z0-9-]{0,46}[a-z0-9])?$ + maxLength: 255 + description: Single Docker repository project slug component. + example: project-slug + - name: repositoryName + description: Single Docker repository name component. + in: path + required: true + schema: + type: string + pattern: ^[a-z0-9]+(?:(?:\\.|_|__|-+)[a-z0-9]+)*$ + maxLength: 255 + description: Single Docker repository name component. + example: nginx + - name: digest + description: Content-addressable digest (algorithm:hex). + in: path + required: true + schema: + type: string + pattern: ^[A-Za-z0-9_+.-]+:[A-Fa-f0-9]+$ + maxLength: 255 + description: Content-addressable digest (algorithm:hex). + example: sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + get: + description: GET /v2/:teamSlug/:projectSlug/:repositoryName/blobs/:digest Fetch a blob by digest. + operationId: getByTeamSlugByProjectSlugByRepositoryNameBlobsByDigest + security: [] + summary: Download a blob + tags: + - vcr + responses: + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '402': + description: The account is missing a payment so payment method must be updated + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + '416': + description: '' + parameters: + - name: team_slug + description: Single Docker repository team slug component. + in: path + required: true + schema: + type: string + pattern: ^[a-z0-9](?:[a-z0-9-]{0,46}[a-z0-9])?$ + maxLength: 255 + description: Single Docker repository team slug component. + example: team-slug + - name: project_slug + description: Single Docker repository project slug component. + in: path + required: true + schema: + type: string + pattern: ^[a-z0-9](?:[a-z0-9-]{0,46}[a-z0-9])?$ + maxLength: 255 + description: Single Docker repository project slug component. + example: project-slug + - name: repository_name + description: Single Docker repository name component. + in: path + required: true + schema: + type: string + pattern: ^[a-z0-9]+(?:(?:\\.|_|__|-+)[a-z0-9]+)*$ + maxLength: 255 + description: Single Docker repository name component. + example: nginx + - name: digest + description: Content-addressable digest (algorithm:hex). + in: path + required: true + schema: + type: string + pattern: ^[A-Za-z0-9_+.-]+:[A-Fa-f0-9]+$ + maxLength: 255 + description: Content-addressable digest (algorithm:hex). + example: sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + delete: + description: DELETE /v2/:teamSlug/:projectSlug/:repositoryName/blobs/:digest Blob deletion is intentionally not supported. Matches the behaviour of most public registries. + operationId: deleteByTeamSlugByProjectSlugByRepositoryNameBlobsByDigest + security: [] + summary: Delete a blob + tags: + - vcr + responses: + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '402': + description: The account is missing a payment so payment method must be updated + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '405': + description: '' + '410': + description: '' + parameters: + - name: team_slug + description: Single Docker repository team slug component. + in: path + required: true + schema: + type: string + pattern: ^[a-z0-9](?:[a-z0-9-]{0,46}[a-z0-9])?$ + maxLength: 255 + description: Single Docker repository team slug component. + example: team-slug + - name: project_slug + description: Single Docker repository project slug component. + in: path + required: true + schema: + type: string + pattern: ^[a-z0-9](?:[a-z0-9-]{0,46}[a-z0-9])?$ + maxLength: 255 + description: Single Docker repository project slug component. + example: project-slug + - name: repository_name + description: Single Docker repository name component. + in: path + required: true + schema: + type: string + pattern: ^[a-z0-9]+(?:(?:\\.|_|__|-+)[a-z0-9]+)*$ + maxLength: 255 + description: Single Docker repository name component. + example: nginx + - name: digest + description: Content-addressable digest (algorithm:hex). + in: path + required: true + schema: + type: string + pattern: ^[A-Za-z0-9_+.-]+:[A-Fa-f0-9]+$ + maxLength: 255 + description: Content-addressable digest (algorithm:hex). + example: sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + /v2/{team_slug}/{project_slug}/{repository_name}/blobs/uploads/{uuid}: + get: + description: GET /v2/:teamSlug/:projectSlug/:repositoryName/blobs/uploads/:uuid Query the status of an in-progress blob upload. Used by clients to resume a partial upload after an interruption. + operationId: getByTeamSlugByProjectSlugByRepositoryNameBlobsUploadsByUuid + security: [] + summary: Get blob upload status + tags: + - vcr + responses: + '204': + description: '' + content: + application/json: + schema: + nullable: true + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '402': + description: The account is missing a payment so payment method must be updated + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + parameters: + - name: team_slug + description: Single Docker repository team slug component. + in: path + required: true + schema: + type: string + pattern: ^[a-z0-9](?:[a-z0-9-]{0,46}[a-z0-9])?$ + maxLength: 255 + description: Single Docker repository team slug component. + example: team-slug + - name: project_slug + description: Single Docker repository project slug component. + in: path + required: true + schema: + type: string + pattern: ^[a-z0-9](?:[a-z0-9-]{0,46}[a-z0-9])?$ + maxLength: 255 + description: Single Docker repository project slug component. + example: project-slug + - name: repository_name + description: Single Docker repository name component. + in: path + required: true + schema: + type: string + pattern: ^[a-z0-9]+(?:(?:\\.|_|__|-+)[a-z0-9]+)*$ + maxLength: 255 + description: Single Docker repository name component. + example: nginx + - name: uuid + description: Blob upload session identifier. + in: path + required: true + schema: + type: string + pattern: ^[a-f0-9]{40}$ + maxLength: 40 + description: Blob upload session identifier. + example: 0123456789abcdef0123456789abcdef01234567 + delete: + description: DELETE /v2/:teamSlug/:projectSlug/:repositoryName/blobs/uploads/:uuid Cancel an in-flight blob upload. Aborts the underlying S3 multipart upload (if one was started) and discards the session. + operationId: deleteByTeamSlugByProjectSlugByRepositoryNameBlobsUploadsByUuid + security: [] + summary: Cancel a blob upload + tags: + - vcr + responses: + '204': + description: '' + content: + application/json: + schema: + nullable: true + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '402': + description: The account is missing a payment so payment method must be updated + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + parameters: + - name: team_slug + description: Single Docker repository team slug component. + in: path + required: true + schema: + type: string + pattern: ^[a-z0-9](?:[a-z0-9-]{0,46}[a-z0-9])?$ + maxLength: 255 + description: Single Docker repository team slug component. + example: team-slug + - name: project_slug + description: Single Docker repository project slug component. + in: path + required: true + schema: + type: string + pattern: ^[a-z0-9](?:[a-z0-9-]{0,46}[a-z0-9])?$ + maxLength: 255 + description: Single Docker repository project slug component. + example: project-slug + - name: repository_name + description: Single Docker repository name component. + in: path + required: true + schema: + type: string + pattern: ^[a-z0-9]+(?:(?:\\.|_|__|-+)[a-z0-9]+)*$ + maxLength: 255 + description: Single Docker repository name component. + example: nginx + - name: uuid + description: Blob upload session identifier. + in: path + required: true + schema: + type: string + pattern: ^[a-f0-9]{40}$ + maxLength: 40 + description: Blob upload session identifier. + example: 0123456789abcdef0123456789abcdef01234567 + patch: + description: PATCH /v2/:teamSlug/:projectSlug/:repositoryName/blobs/uploads/:uuid Upload a chunk of blob data. The request body is streamed directly to S3 as a multipart upload part while hashing incrementally. The client may call this multiple times for chunked uploads. + operationId: updateByTeamSlugByProjectSlugByRepositoryNameBlobsUploadsByUuid + security: [] + summary: Upload a blob chunk + tags: + - vcr + responses: + '202': + description: '' + content: + application/json: + schema: + nullable: true + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '402': + description: The account is missing a payment so payment method must be updated + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + '413': + description: '' + parameters: + - name: team_slug + description: Single Docker repository team slug component. + in: path + required: true + schema: + type: string + pattern: ^[a-z0-9](?:[a-z0-9-]{0,46}[a-z0-9])?$ + maxLength: 255 + description: Single Docker repository team slug component. + example: team-slug + - name: project_slug + description: Single Docker repository project slug component. + in: path + required: true + schema: + type: string + pattern: ^[a-z0-9](?:[a-z0-9-]{0,46}[a-z0-9])?$ + maxLength: 255 + description: Single Docker repository project slug component. + example: project-slug + - name: repository_name + description: Single Docker repository name component. + in: path + required: true + schema: + type: string + pattern: ^[a-z0-9]+(?:(?:\\.|_|__|-+)[a-z0-9]+)*$ + maxLength: 255 + description: Single Docker repository name component. + example: nginx + - name: uuid + description: Blob upload session identifier. + in: path + required: true + schema: + type: string + pattern: ^[a-f0-9]{40}$ + maxLength: 40 + description: Blob upload session identifier. + example: 0123456789abcdef0123456789abcdef01234567 + put: + description: PUT /v2/:teamSlug/:projectSlug/:repositoryName/blobs/uploads/:uuid?digest= Complete the blob upload. This may include a final chunk of data in the request body (monolithic upload) or just finalize a previous chunked upload. + operationId: replaceByTeamSlugByProjectSlugByRepositoryNameBlobsUploadsByUuid + security: [] + summary: Complete a blob upload + tags: + - vcr + responses: + '201': + description: '' + content: + application/json: + schema: + nullable: true + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '402': + description: The account is missing a payment so payment method must be updated + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + '413': + description: '' + parameters: + - name: team_slug + description: Single Docker repository team slug component. + in: path + required: true + schema: + type: string + pattern: ^[a-z0-9](?:[a-z0-9-]{0,46}[a-z0-9])?$ + maxLength: 255 + description: Single Docker repository team slug component. + example: team-slug + - name: project_slug + description: Single Docker repository project slug component. + in: path + required: true + schema: + type: string + pattern: ^[a-z0-9](?:[a-z0-9-]{0,46}[a-z0-9])?$ + maxLength: 255 + description: Single Docker repository project slug component. + example: project-slug + - name: repository_name + description: Single Docker repository name component. + in: path + required: true + schema: + type: string + pattern: ^[a-z0-9]+(?:(?:\\.|_|__|-+)[a-z0-9]+)*$ + maxLength: 255 + description: Single Docker repository name component. + example: nginx + - name: uuid + description: Blob upload session identifier. + in: path + required: true + schema: + type: string + pattern: ^[a-f0-9]{40}$ + maxLength: 40 + description: Blob upload session identifier. + example: 0123456789abcdef0123456789abcdef01234567 + - name: digest + description: Content-addressable digest (algorithm:hex). + in: query + required: true + schema: + type: string + pattern: ^[A-Za-z0-9_+.-]+:[A-Fa-f0-9]+$ + maxLength: 255 + description: Content-addressable digest (algorithm:hex). + example: sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + /v2/{team_slug}/{project_slug}/{repository_name}/blobs/uploads/: + post: + description: POST /v2/:teamSlug/:projectSlug/:repositoryName/blobs/uploads/[?mount=&from=] Initiate a blob upload. Returns a UUID in the Location header that the client uses for subsequent PATCH (chunk) and PUT (complete) requests. + operationId: createByTeamSlugByProjectSlugByRepositoryNameBlobsUploads + security: [] + summary: Start a blob upload + tags: + - vcr + responses: + '202': + description: '' + content: + application/json: + schema: + nullable: true + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '402': + description: The account is missing a payment so payment method must be updated + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + parameters: + - name: team_slug + description: Single Docker repository team slug component. + in: path + required: true + schema: + type: string + pattern: ^[a-z0-9](?:[a-z0-9-]{0,46}[a-z0-9])?$ + maxLength: 255 + description: Single Docker repository team slug component. + example: team-slug + - name: project_slug + description: Single Docker repository project slug component. + in: path + required: true + schema: + type: string + pattern: ^[a-z0-9](?:[a-z0-9-]{0,46}[a-z0-9])?$ + maxLength: 255 + description: Single Docker repository project slug component. + example: project-slug + - name: repository_name + description: Single Docker repository name component. + in: path + required: true + schema: + type: string + pattern: ^[a-z0-9]+(?:(?:\\.|_|__|-+)[a-z0-9]+)*$ + maxLength: 255 + description: Single Docker repository name component. + example: nginx + - name: mount + description: Digest of the blob to mount from another repository. + in: query + required: false + schema: + type: string + pattern: ^[A-Za-z0-9_+.-]+:[A-Fa-f0-9]+$ + maxLength: 255 + description: Digest of the blob to mount from another repository. + - name: from + description: Source repository to mount the blob from. + in: query + required: false + schema: + type: string + pattern: ^[a-z0-9](?:[a-z0-9-]{0,46}[a-z0-9])?\\/[a-z0-9](?:[a-z0-9-]{0,46}[a-z0-9])?\\/[a-z0-9]+(?:(?:\\.|_|__|-+)[a-z0-9]+)*$ + maxLength: 255 + description: Source repository to mount the blob from. + /v2/{team_slug}/{project_slug}/{repository_name}/manifests/{reference}: + put: + description: PUT /v2/:teamSlug/:projectSlug/:repositoryName/manifests/:reference Upload an image manifest. The digest is computed from the body and returned in the Docker-Content-Digest header. + operationId: replaceByTeamSlugByProjectSlugByRepositoryNameManifestsByReference + security: [] + summary: Push an image manifest + tags: + - vcr + responses: + '201': + description: '' + content: + application/json: + schema: + nullable: true + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '402': + description: The account is missing a payment so payment method must be updated + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + '413': + description: '' + parameters: + - name: team_slug + description: Single Docker repository team slug component. + in: path + required: true + schema: + type: string + pattern: ^[a-z0-9](?:[a-z0-9-]{0,46}[a-z0-9])?$ + maxLength: 255 + description: Single Docker repository team slug component. + example: team-slug + - name: project_slug + description: Single Docker repository project slug component. + in: path + required: true + schema: + type: string + pattern: ^[a-z0-9](?:[a-z0-9-]{0,46}[a-z0-9])?$ + maxLength: 255 + description: Single Docker repository project slug component. + example: project-slug + - name: repository_name + description: Single Docker repository name component. + in: path + required: true + schema: + type: string + pattern: ^[a-z0-9]+(?:(?:\\.|_|__|-+)[a-z0-9]+)*$ + maxLength: 255 + description: Single Docker repository name component. + example: nginx + - name: reference + description: 'Manifest reference: a tag or digest.' + in: path + required: true + schema: + type: string + pattern: ^(?:[a-zA-Z0-9_][a-zA-Z0-9._-]{0,127}|[A-Za-z0-9_+.-]+:[A-Fa-f0-9]+)$ + maxLength: 255 + description: 'Manifest reference: a tag or digest.' + example: latest + head: + description: HEAD /v2/:teamSlug/:projectSlug/:repositoryName/manifests/:reference Check whether a manifest exists. Used by Docker client during push to determine if a manifest (or config blob referenced by digest) is already present. + operationId: headByTeamSlugByProjectSlugByRepositoryNameManifestsByReference + security: [] + summary: Check if a manifest exists + tags: + - vcr + responses: + '200': + description: '' + content: + application/json: + schema: + nullable: true + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '402': + description: The account is missing a payment so payment method must be updated + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + parameters: + - name: teamSlug + description: Single Docker repository team slug component. + in: path + required: true + schema: + type: string + pattern: ^[a-z0-9](?:[a-z0-9-]{0,46}[a-z0-9])?$ + maxLength: 255 + description: Single Docker repository team slug component. + example: team-slug + - name: projectSlug + description: Single Docker repository project slug component. + in: path + required: true + schema: + type: string + pattern: ^[a-z0-9](?:[a-z0-9-]{0,46}[a-z0-9])?$ + maxLength: 255 + description: Single Docker repository project slug component. + example: project-slug + - name: repositoryName + description: Single Docker repository name component. + in: path + required: true + schema: + type: string + pattern: ^[a-z0-9]+(?:(?:\\.|_|__|-+)[a-z0-9]+)*$ + maxLength: 255 + description: Single Docker repository name component. + example: nginx + - name: reference + description: 'Manifest reference: a tag or digest.' + in: path + required: true + schema: + type: string + pattern: ^(?:[a-zA-Z0-9_][a-zA-Z0-9._-]{0,127}|[A-Za-z0-9_+.-]+:[A-Fa-f0-9]+)$ + maxLength: 255 + description: 'Manifest reference: a tag or digest.' + example: latest + get: + description: GET /v2/:teamSlug/:projectSlug/:repositoryName/manifests/:reference Fetch a manifest by tag or digest. + operationId: getByTeamSlugByProjectSlugByRepositoryNameManifestsByReference + security: [] + summary: Pull an image manifest + tags: + - vcr + responses: + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '402': + description: The account is missing a payment so payment method must be updated + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + parameters: + - name: team_slug + description: Single Docker repository team slug component. + in: path + required: true + schema: + type: string + pattern: ^[a-z0-9](?:[a-z0-9-]{0,46}[a-z0-9])?$ + maxLength: 255 + description: Single Docker repository team slug component. + example: team-slug + - name: project_slug + description: Single Docker repository project slug component. + in: path + required: true + schema: + type: string + pattern: ^[a-z0-9](?:[a-z0-9-]{0,46}[a-z0-9])?$ + maxLength: 255 + description: Single Docker repository project slug component. + example: project-slug + - name: repository_name + description: Single Docker repository name component. + in: path + required: true + schema: + type: string + pattern: ^[a-z0-9]+(?:(?:\\.|_|__|-+)[a-z0-9]+)*$ + maxLength: 255 + description: Single Docker repository name component. + example: nginx + - name: reference + description: 'Manifest reference: a tag or digest.' + in: path + required: true + schema: + type: string + pattern: ^(?:[a-zA-Z0-9_][a-zA-Z0-9._-]{0,127}|[A-Za-z0-9_+.-]+:[A-Fa-f0-9]+)$ + maxLength: 255 + description: 'Manifest reference: a tag or digest.' + example: latest + delete: + description: DELETE /v2/:teamSlug/:projectSlug/:repositoryName/manifests/:reference Reference must be a digest. + operationId: deleteByTeamSlugByProjectSlugByRepositoryNameManifestsByReference + security: [] + summary: Delete an image manifest + tags: + - vcr + responses: + '202': + description: '' + content: + application/json: + schema: + nullable: true + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '402': + description: The account is missing a payment so payment method must be updated + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + parameters: + - name: team_slug + description: Single Docker repository team slug component. + in: path + required: true + schema: + type: string + pattern: ^[a-z0-9](?:[a-z0-9-]{0,46}[a-z0-9])?$ + maxLength: 255 + description: Single Docker repository team slug component. + example: team-slug + - name: project_slug + description: Single Docker repository project slug component. + in: path + required: true + schema: + type: string + pattern: ^[a-z0-9](?:[a-z0-9-]{0,46}[a-z0-9])?$ + maxLength: 255 + description: Single Docker repository project slug component. + example: project-slug + - name: repository_name + description: Single Docker repository name component. + in: path + required: true + schema: + type: string + pattern: ^[a-z0-9]+(?:(?:\\.|_|__|-+)[a-z0-9]+)*$ + maxLength: 255 + description: Single Docker repository name component. + example: nginx + - name: reference + description: Content-addressable digest (algorithm:hex). + in: path + required: true + schema: + type: string + pattern: ^[A-Za-z0-9_+.-]+:[A-Fa-f0-9]+$ + maxLength: 255 + description: Content-addressable digest (algorithm:hex). + example: sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 + /v2/{team_slug}/{project_slug}/{repository_name}/tags/list: + get: + description: GET /v2/:teamSlug/:projectSlug/:repositoryName/tags/list List the tags in a repository. + operationId: getByTeamSlugByProjectSlugByRepositoryNameTagsList + security: [] + summary: List image tags + tags: + - vcr + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + name: + type: string + tags: + items: + type: string + type: array + required: + - name + - tags + type: object + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '402': + description: The account is missing a payment so payment method must be updated + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + parameters: + - name: team_slug + description: Single Docker repository team slug component. + in: path + required: true + schema: + type: string + pattern: ^[a-z0-9](?:[a-z0-9-]{0,46}[a-z0-9])?$ + maxLength: 255 + description: Single Docker repository team slug component. + example: team-slug + - name: project_slug + description: Single Docker repository project slug component. + in: path + required: true + schema: + type: string + pattern: ^[a-z0-9](?:[a-z0-9-]{0,46}[a-z0-9])?$ + maxLength: 255 + description: Single Docker repository project slug component. + example: project-slug + - name: repository_name + description: Single Docker repository name component. + in: path + required: true + schema: + type: string + pattern: ^[a-z0-9]+(?:(?:\\.|_|__|-+)[a-z0-9]+)*$ + maxLength: 255 + description: Single Docker repository name component. + example: nginx + - name: 'n' + in: query + required: false + schema: + type: integer + minimum: 1 + maximum: 1000 + - name: last + description: Opaque pagination cursor returned by a previous list response. + in: query + required: false + schema: + type: string + maxLength: 1024 + description: Opaque pagination cursor returned by a previous list response. +components: + schemas: + VcrRepository: + properties: + id: + type: string + description: Unique identifier of the repository. + example: repo_a1b2c3d4e5f6 + projectId: + type: string + description: Identifier of the project the repository belongs to. + example: prj_a1b2c3d4e5f6 + name: + type: string + description: Name of the repository. + example: my-app + public: + type: boolean + enum: + - false + - true + description: Whether the repository is public. Images in public repositories can be pulled by anyone. Defaults to `false` (private). + example: false + createdAt: + type: string + description: ISO 8601 timestamp of when the repository was created. + example: '2026-06-30T10:00:00.000Z' + updatedAt: + type: string + description: ISO 8601 timestamp of when the repository was last updated. + example: '2026-06-30T10:00:00.000Z' + required: + - createdAt + - id + - name + - projectId + - public + - updatedAt + type: object + description: A Vercel Container Registry repository. + VcrRepositoryList: + properties: + repositories: + items: + $ref: '#/components/schemas/VcrRepository' + type: array + nextCursor: + type: string + description: Cursor to fetch the next page of results, when more are available. + required: + - repositories + type: object + description: A paginated list of Vercel Container Registry repositories. + VcrImageList: + properties: + images: + items: + $ref: '#/components/schemas/VcrImageListItem' + type: array + nextCursor: + type: string + description: Cursor to fetch the next page of results, when more are available. + required: + - images + type: object + description: A paginated list of images for a repository. + VcrRepositoryPermission: + properties: + repositoryId: + type: string + description: Identifier of the repository the permission grants access to. + example: repo_a1b2c3d4e5f6 + teamId: + type: string + description: Identifier of the team that is granted access to the repository. + example: team_a1b2c3d4e5f6 + teamSlug: + type: string + description: Slug of the team that is granted access to the repository. + example: my-team + createdAt: + type: string + description: ISO 8601 timestamp of when the permission was created. + example: '2026-06-30T10:00:00.000Z' + required: + - createdAt + - repositoryId + - teamId + - teamSlug + type: object + description: A team's access grant to a Vercel Container Registry repository. + VcrRepositoryPermissionList: + properties: + permissions: + items: + $ref: '#/components/schemas/VcrRepositoryPermission' + type: array + nextCursor: + type: string + description: Cursor to fetch the next page of results, when more are available. + required: + - permissions + type: object + description: A paginated list of Vercel Container Registry repository permissions. + VcrTag: + properties: + tag: + type: string + description: The tag name. + example: latest + manifestDigest: + type: string + description: SHA-256 digest of the image manifest the tag points at. + example: sha256:2c4e8f3a1b9d0e5c7a6f4b2d8e1c9a0b3d5f7e9c1a2b4d6f8e0c2a4b6d8f0e2c + imageId: + type: string + description: Internal identifier of the image the tag points at. + example: img_a1b2c3d4e5f6 + kind: + type: string + enum: + - attestation + - index + - manifest + description: Whether the manifest is a multi-platform image index, a single-platform image manifest or an attestation. + platform: + type: string + description: Operating system the manifest targets. Only present for single-platform manifests. + example: linux + arch: + type: string + description: CPU architecture the manifest targets. Only present for single-platform manifests. + example: amd64 + pushedBy: + type: string + description: Identifier of the actor that pushed the image. + status: + nullable: true + type: string + enum: + - preparing + - ready + - unoptimized + - null + description: VHS-readiness status, or `null` for a multi-platform index. + sizeInBytes: + type: number + description: Total size in bytes of the image's resources (manifest, config and layer blobs) stored by the registry. + createdAt: + type: string + description: ISO 8601 timestamp of when the tag was created. + example: '2026-06-30T10:00:00.000Z' + updatedAt: + type: string + description: ISO 8601 timestamp of when the tag was last updated. + example: '2026-06-30T10:00:00.000Z' + required: + - createdAt + - imageId + - kind + - manifestDigest + - sizeInBytes + - status + - tag + - updatedAt + type: object + description: A tag pointing at an image in a Vercel Container Registry repository, enriched with the backing image's metadata and VHS-readiness status. + VcrImageDetail: + properties: + layers: + items: + $ref: '#/components/schemas/VcrImageLayer' + type: array + tags: + items: + type: string + type: array + description: Tags pointing at this image's manifest. + id: + type: string + description: Internal identifier of the image. + example: img_a1b2c3d4e5f6 + repositoryId: + type: string + description: Identifier of the repository the image belongs to. + example: repo_a1b2c3d4e5f6 + manifestDigest: + type: string + description: SHA-256 digest of the image manifest. + example: sha256:2c4e8f3a1b9d0e5c7a6f4b2d8e1c9a0b3d5f7e9c1a2b4d6f8e0c2a4b6d8f0e2c + kind: + type: string + enum: + - attestation + - index + - manifest + description: Whether the manifest is a multi-platform image index, a single-platform image manifest or an attestation. + platform: + type: string + description: Operating system the manifest targets. Only present for single-platform manifests. + example: linux + arch: + type: string + description: CPU architecture the manifest targets. Only present for single-platform manifests. + example: amd64 + pushedBy: + type: string + description: Identifier of the actor that pushed the image. + sizeInBytes: + type: number + description: Total size in bytes of the image's resources (manifest, config and layer blobs) stored by the registry. + status: + nullable: true + type: string + enum: + - preparing + - ready + - unoptimized + - null + description: VHS-readiness status, or `null` for a multi-platform index. + createdAt: + type: string + description: ISO 8601 timestamp of when the image was created. + example: '2026-06-30T10:00:00.000Z' + required: + - createdAt + - id + - kind + - layers + - manifestDigest + - repositoryId + - sizeInBytes + - status + - tags + type: object + description: A single image with its tags, status and resolved Dockerfile layer history. + VcrImageListItem: + properties: + tags: + items: + type: string + type: array + description: Tags pointing at this image's manifest. + id: + type: string + description: Internal identifier of the image. + example: img_a1b2c3d4e5f6 + repositoryId: + type: string + description: Identifier of the repository the image belongs to. + example: repo_a1b2c3d4e5f6 + manifestDigest: + type: string + description: SHA-256 digest of the image manifest. + example: sha256:2c4e8f3a1b9d0e5c7a6f4b2d8e1c9a0b3d5f7e9c1a2b4d6f8e0c2a4b6d8f0e2c + kind: + type: string + enum: + - attestation + - index + - manifest + description: Whether the manifest is a multi-platform image index, a single-platform image manifest or an attestation. + platform: + type: string + description: Operating system the manifest targets. Only present for single-platform manifests. + example: linux + arch: + type: string + description: CPU architecture the manifest targets. Only present for single-platform manifests. + example: amd64 + pushedBy: + type: string + description: Identifier of the actor that pushed the image. + sizeInBytes: + type: number + description: Total size in bytes of the image's resources (manifest, config and layer blobs) stored by the registry. + status: + nullable: true + type: string + enum: + - preparing + - ready + - unoptimized + - null + description: VHS-readiness status, or `null` for a multi-platform index. + createdAt: + type: string + description: ISO 8601 timestamp of when the image was created. + example: '2026-06-30T10:00:00.000Z' + required: + - createdAt + - id + - kind + - manifestDigest + - repositoryId + - sizeInBytes + - status + - tags + type: object + description: An image enriched with its tags and VHS-readiness status, as returned when listing a repository's images. + VcrImageLayer: + properties: + createdBy: + nullable: true + type: string + digest: + nullable: true + type: string + operation: + type: string + enum: + - ADD + - ARG + - CMD + - COPY + - ENTRYPOINT + - ENV + - EXPOSE + - FROM + - HEALTHCHECK + - LABEL + - ONBUILD + - RUN + - SHELL + - STOPSIGNAL + - UNKNOWN + - USER + - VOLUME + - WORKDIR + description: Docker/OCI build instruction associated with an image layer. + sizeBytes: + nullable: true + type: number + type: + type: string + enum: + - FROM + baseImage: + nullable: true + type: string + collapsedDigests: + items: + type: string + type: array + collapsedLayerCount: + type: number + command: + nullable: true + type: string + env: + nullable: true + type: string + value: + nullable: true + type: string + required: + - baseImage + - collapsedDigests + - collapsedLayerCount + - createdBy + - digest + - operation + - sizeBytes + - type + - command + - env + - value + type: object + x-stackQL-resources: + repositories: + id: vercel.vcr.repositories + name: repositories + title: Repositories + methods: + create: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v1~1vcr~1repository/post' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + list: + operation: + $ref: '#/paths/~1v1~1vcr~1repository/get' + response: + mediaType: application/json + openAPIDocKey: '200' + objectKey: $.repositories + request: + nativeCasing: camel + config: + pagination: + requestToken: + key: cursor + location: query + responseToken: + key: $.nextCursor + location: body + queryParamPushdown: + top: + paramName: limit + maxValue: 100 + get: + operation: + $ref: '#/paths/~1v1~1vcr~1repository~1{id_or_name}/get' + response: + mediaType: application/json + openAPIDocKey: '200' + objectKey: $.repository + request: + nativeCasing: camel + delete: + operation: + $ref: '#/paths/~1v1~1vcr~1repository~1{id_or_name}/delete' + response: + mediaType: application/json + openAPIDocKey: '202' + request: + nativeCasing: camel + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/repositories/methods/get' + - $ref: '#/components/x-stackQL-resources/repositories/methods/list' + insert: + - $ref: '#/components/x-stackQL-resources/repositories/methods/create' + update: [] + delete: + - $ref: '#/components/x-stackQL-resources/repositories/methods/delete' + replace: [] + images: + id: vercel.vcr.images + name: images + title: Images + methods: + list: + operation: + $ref: '#/paths/~1v1~1vcr~1repository~1{id_or_name}~1images/get' + response: + mediaType: application/json + openAPIDocKey: '200' + objectKey: $.images + request: + nativeCasing: camel + config: + pagination: + requestToken: + key: cursor + location: query + responseToken: + key: $.nextCursor + location: body + queryParamPushdown: + top: + paramName: limit + maxValue: 100 + get: + operation: + $ref: '#/paths/~1v1~1vcr~1repository~1{id_or_name}~1images~1{image_id_or_digest}/get' + response: + mediaType: application/json + openAPIDocKey: '200' + objectKey: $.image + request: + nativeCasing: camel + delete: + operation: + $ref: '#/paths/~1v1~1vcr~1repository~1{id_or_name}~1images~1{image_id}/delete' + response: + mediaType: application/json + openAPIDocKey: '202' + request: + nativeCasing: camel + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/images/methods/get' + - $ref: '#/components/x-stackQL-resources/images/methods/list' + insert: [] + update: [] + delete: + - $ref: '#/components/x-stackQL-resources/images/methods/delete' + replace: [] + permissions: + id: vercel.vcr.permissions + name: permissions + title: Permissions + methods: + create: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v1~1vcr~1repository~1{id_or_name}~1permissions/post' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + delete: + operation: + $ref: '#/paths/~1v1~1vcr~1repository~1{id_or_name}~1permissions/delete' + response: + mediaType: application/json + openAPIDocKey: '204' + request: + nativeCasing: camel + list: + operation: + $ref: '#/paths/~1v1~1vcr~1repository~1{id_or_name}~1permissions/get' + response: + mediaType: application/json + openAPIDocKey: '200' + objectKey: $.permissions + request: + nativeCasing: camel + config: + pagination: + requestToken: + key: cursor + location: query + responseToken: + key: $.nextCursor + location: body + queryParamPushdown: + top: + paramName: limit + maxValue: 100 + clear: + operation: + $ref: '#/paths/~1v1~1vcr~1repository~1{id_or_name}~1permissions~1all/delete' + response: + mediaType: application/json + openAPIDocKey: '204' + request: + nativeCasing: camel + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/permissions/methods/list' + insert: + - $ref: '#/components/x-stackQL-resources/permissions/methods/create' + update: [] + delete: + - $ref: '#/components/x-stackQL-resources/permissions/methods/delete' + replace: [] + tags: + id: vercel.vcr.tags + name: tags + title: Tags + methods: + list: + operation: + $ref: '#/paths/~1v1~1vcr~1repository~1{id_or_name}~1tags/get' + response: + mediaType: application/json + openAPIDocKey: '200' + objectKey: $.tags + request: + nativeCasing: camel + config: + pagination: + requestToken: + key: cursor + location: query + responseToken: + key: $.nextCursor + location: body + queryParamPushdown: + top: + paramName: limit + maxValue: 100 + get: + operation: + $ref: '#/paths/~1v1~1vcr~1repository~1{id_or_name}~1tags~1{tag}/get' + response: + mediaType: application/json + openAPIDocKey: '200' + objectKey: $.tag + request: + nativeCasing: camel + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/tags/methods/get' + - $ref: '#/components/x-stackQL-resources/tags/methods/list' + insert: [] + update: [] + delete: [] + replace: [] +servers: + - url: https://api.vercel.com diff --git a/provider-dev/openapi/src/vercel/v00.00.00000/services/web_analytics.yaml b/provider-dev/openapi/src/vercel/v00.00.00000/services/web_analytics.yaml new file mode 100644 index 0000000..f625cc8 --- /dev/null +++ b/provider-dev/openapi/src/vercel/v00.00.00000/services/web_analytics.yaml @@ -0,0 +1,3646 @@ +openapi: 3.0.3 +info: + title: web_analytics API + description: vercel web_analytics API + version: 0.0.1 +paths: + /speed-insights/toggle: + post: + description: '' + operationId: createSpeedInsightsToggle + security: [] + tags: [] + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + value: + type: boolean + enum: + - false + - true + required: + - value + type: object + '400': + description: |- + One of the provided values in the request body is invalid. + One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '402': + description: '' + '403': + description: You do not have permission to access this resource. + '410': + description: '' + parameters: + - name: projectId + in: query + required: true + schema: + type: string + requestBody: + content: + application/json: + schema: + properties: + value: + type: boolean + required: + - value + type: object + /web/insights/toggle: + post: + description: '' + operationId: createWebInsightsToggle + security: [] + tags: [] + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + value: + type: boolean + enum: + - false + - true + required: + - value + type: object + '400': + description: |- + One of the provided values in the request body is invalid. + One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '403': + description: You do not have permission to access this resource. + '410': + description: '' + parameters: + - name: projectId + in: query + required: true + schema: + type: string + requestBody: + content: + application/json: + schema: + properties: + value: + type: boolean + required: + - value + type: object + /v1/query/web-analytics/visits/aggregate: + get: + description: Counts pageviews on a project, within the requested date range. Results are either aggregated or broken down over time. Results can additionally be broken down by one dimension, and filtered by multiple dimensions. + operationId: aggregatePageviews + security: + - bearerToken: [] + summary: Aggregates page views + tags: + - web-analytics + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + version: + type: number + query: + properties: + since: + type: string + until: + type: string + groupBy: + items: + oneOf: + - type: string + - type: string + enum: + - browserName + - country + - deviceType + - environment + - flags + - osName + - referrerHostname + - requestPath + - route + - utmCampaign + - utmContent + - utmMedium + - utmSource + - utmTerm + type: array + filter: + type: string + limit: + type: number + required: + - limit + - since + - until + type: object + data: + items: + properties: + projectId: + type: string + country: + type: string + deviceType: + type: string + environment: + type: string + requestPath: + type: string + referrerHostname: + type: string + osName: + type: string + browserName: + type: string + route: + type: string + utmSource: + type: string + utmMedium: + type: string + utmCampaign: + type: string + utmContent: + type: string + utmTerm: + type: string + flags: + type: string + errorMessage: + type: string + entryRevalidateSeconds: + type: string + projectName: + type: string + deploymentId: + type: string + pathType: + type: string + pathTypeVariant: + type: string + requestHostname: + type: string + requestResolvedIp: + type: string + requestMethod: + type: string + requestExtension: + type: string + requestId: + type: string + requestApi: + type: string + referrerUrl: + type: string + serverActionName: + type: string + httpStatus: + type: string + errorCode: + type: string + source: + type: string + edgeType: + type: string + reason: + type: string + edgeNetworkRegion: + type: string + functionRegion: + type: string + imageTransformationRegion: + type: string + dataCacheRegion: + type: string + cause: + type: string + runtime: + type: string + provider: + type: string + isrCacheRegion: + type: string + isrAction: + type: string + cacheResult: + type: string + cacheOperation: + type: string + cacheHostname: + type: string + cachePath: + type: string + cacheHitState: + type: string + cacheHitLevel: + type: string + cacheApi: + type: string + cacheReason: + type: string + pprState: + type: string + clientIp: + type: string + clientIpCountry: + type: string + clientUserAgent: + type: string + httpAccept: + type: string + clientJa4Digest: + type: string + asnId: + type: string + asnName: + type: string + botName: + type: string + botCategory: + type: string + botCategoryLegacy: + type: string + botVerified: + type: string + botCheckResult: + type: string + deepAnalysisCheck: + type: string + wafAction: + type: string + wafRuleId: + type: string + ruleCategory: + type: string + skewProtection: + type: string + functionStartType: + type: string + functionDispatcher: + type: string + isAdditionalRequest: + type: string + originHostname: + type: string + originPath: + type: string + originRoute: + type: string + fetchType: + type: string + fetchIndex: + type: string + imageSource: + type: string + sourceImage: + type: string + sourceImagePathname: + type: string + sourceImageHostname: + type: string + sourceImageHash: + type: string + optimizedQuality: + type: string + optimizedWidthPixels: + type: string + optimizedFormatMimeType: + type: string + vdcOperationOrigin: + type: string + entryName: + type: string + entryId: + type: string + entryItemId: + type: string + tagName: + type: string + cacheTags: + type: string + storeId: + type: string + storeName: + type: string + blobOperationType: + type: string + blobOperationLevel: + type: string + visitorId: + type: string + eventName: + type: string + attributionTarget: + type: string + attributionEventName: + type: string + metricName: + type: string + attributes: + type: string + flagKey: + type: string + flagVariant: + type: string + flagEvaluationReason: + type: string + flagClientName: + type: string + sdkKeyId: + type: string + sdkKeyEnvironment: + type: string + reportingProjectId: + type: string + reportingProjectName: + type: string + eventData: + type: string + middlewareAction: + type: string + middlewareActionTarget: + type: string + aiModel: + type: string + aiGatewayModelId: + type: string + aiProvider: + type: string + aiModelType: + type: string + servedSpeed: + type: string + virtualModelSlug: + type: string + virtualModelKind: + type: string + inferenceEndpointSlug: + type: string + inferenceScope: + type: string + inferenceGeoRegion: + type: string + inferenceProviderRegion: + type: string + requestedInferenceRegion: + type: string + costCurrency: + type: string + marketCostCurrency: + type: string + cachedInputTokensCurrency: + type: string + cacheCreationInputTokensCurrency: + type: string + cacheCreation1hInputTokensCurrency: + type: string + surchargeCostCurrency: + type: string + gatewayCostCurrency: + type: string + keyId: + type: string + keyName: + type: string + authMethod: + type: string + appName: + type: string + codingAgent: + type: string + isByok: + type: string + spendAttribution: + type: string + isPrivateModel: + type: string + isStreaming: + type: string + isRequestZdr: + type: string + hipaaRequested: + type: string + quotaRequested: + type: string + quotaEntityId: + type: string + quotaEntityType: + type: string + videoResolution: + type: string + videoAspectRatio: + type: string + piiRedactionApplied: + type: string + moderationApplied: + type: string + queueName: + type: string + consumerGroup: + type: string + messageId: + type: string + eventType: + type: string + notificationUrl: + type: string + queueRegion: + type: string + sandboxSessionId: + type: string + sandboxName: + type: string + workflowRunId: + type: string + workflowName: + type: string + workflowStatus: + type: string + stepRunId: + type: string + workflowStepName: + type: string + workflowEventType: + type: string + region: + type: string + specVersion: + type: string + contentType: + type: string + rewriteDestinationHostname: + type: string + externalRewriteTargetHost: + type: string + externalRewriteTargetPath: + type: string + commitSha: + type: string + reviewConclusion: + type: string + pullRequestNumber: + type: string + repositoryName: + type: string + repositoryOwner: + type: string + reviewStatus: + type: string + pullRequestState: + type: string + triggeringTag: + type: string + redirectLocation: + type: string + microfrontendsResponseReason: + type: string + microfrontendsMatchedPath: + type: string + microfrontendsDefaultAppDeploymentId: + type: string + microfrontendsDefaultAppProjectId: + type: string + service: + type: string + isPrefetchRequest: + type: string + spendReportGroupBy: + type: string + spendReportDatePart: + type: string + providerAttemptCanonicalSlug: + type: string + providerAttemptCredentialType: + type: string + providerAttemptSuccess: + type: string + providerAttemptStatusCode: + type: string + providerAttemptTimeout: + type: string + providerAttemptIsFinal: + type: string + providerAttemptNumber: + type: string + providerAttemptTotalInRequest: + type: string + generationId: + type: string + sessionId: + type: string + contentCaptureStatus: + type: string + contentCaptureInputs: + type: string + contentCaptureOutputs: + type: string + transcriptStatus: + type: string + transcriptInputs: + type: string + transcriptOutputs: + type: string + providerAttemptError: + type: string + providerAttemptSafetyIdentifier: + type: string + providerAttemptDevSafetyIdentifier: + type: string + providerAttemptRegion: + type: string + providerAttemptModelIndex: + type: string + toolCallType: + type: string + toolCallProvider: + type: string + toolCallSuccess: + type: string + toolCallErrorType: + type: string + toolCallStatusCode: + type: string + environmentId: + type: string + billableRegion: + type: string + direction: + type: string + networkTenancy: + type: string + trafficSource: + type: string + networkId: + type: string + privatelinkEndpointId: + type: string + privatelinkDnsName: + type: string + privatelinkIpAddress: + type: string + timestamp: + type: string + format: date-time + type: object + required: + - timestamp + - aiGatewayModelId + - aiModel + - aiModelType + - aiProvider + - appName + - asnId + - asnName + - attributes + - attributionEventName + - attributionTarget + - authMethod + - billableRegion + - blobOperationLevel + - blobOperationType + - botCategory + - botCategoryLegacy + - botCheckResult + - botName + - botVerified + - browserName + - cacheApi + - cacheCreation1hInputTokensCurrency + - cacheCreationInputTokensCurrency + - cacheHitLevel + - cacheHitState + - cacheHostname + - cacheOperation + - cachePath + - cacheReason + - cacheResult + - cacheTags + - cachedInputTokensCurrency + - cause + - clientIp + - clientIpCountry + - clientJa4Digest + - clientUserAgent + - codingAgent + - commitSha + - consumerGroup + - contentCaptureInputs + - contentCaptureOutputs + - contentCaptureStatus + - contentType + - costCurrency + - country + - dataCacheRegion + - deepAnalysisCheck + - deploymentId + - deviceType + - direction + - edgeNetworkRegion + - edgeType + - entryId + - entryItemId + - entryName + - entryRevalidateSeconds + - environment + - environmentId + - errorCode + - errorMessage + - eventData + - eventName + - eventType + - externalRewriteTargetHost + - externalRewriteTargetPath + - fetchIndex + - fetchType + - flagClientName + - flagEvaluationReason + - flagKey + - flagVariant + - flags + - functionDispatcher + - functionRegion + - functionStartType + - gatewayCostCurrency + - generationId + - hipaaRequested + - httpAccept + - httpStatus + - imageSource + - imageTransformationRegion + - inferenceEndpointSlug + - inferenceGeoRegion + - inferenceProviderRegion + - inferenceScope + - isAdditionalRequest + - isByok + - isPrefetchRequest + - isPrivateModel + - isRequestZdr + - isStreaming + - isrAction + - isrCacheRegion + - keyId + - keyName + - marketCostCurrency + - messageId + - metricName + - microfrontendsDefaultAppDeploymentId + - microfrontendsDefaultAppProjectId + - microfrontendsMatchedPath + - microfrontendsResponseReason + - middlewareAction + - middlewareActionTarget + - moderationApplied + - networkId + - networkTenancy + - notificationUrl + - optimizedFormatMimeType + - optimizedQuality + - optimizedWidthPixels + - originHostname + - originPath + - originRoute + - osName + - pathType + - pathTypeVariant + - piiRedactionApplied + - pprState + - privatelinkDnsName + - privatelinkEndpointId + - privatelinkIpAddress + - projectId + - projectName + - provider + - providerAttemptCanonicalSlug + - providerAttemptCredentialType + - providerAttemptDevSafetyIdentifier + - providerAttemptError + - providerAttemptIsFinal + - providerAttemptModelIndex + - providerAttemptNumber + - providerAttemptRegion + - providerAttemptSafetyIdentifier + - providerAttemptStatusCode + - providerAttemptSuccess + - providerAttemptTimeout + - providerAttemptTotalInRequest + - pullRequestNumber + - pullRequestState + - queueName + - queueRegion + - quotaEntityId + - quotaEntityType + - quotaRequested + - reason + - redirectLocation + - referrerHostname + - referrerUrl + - region + - reportingProjectId + - reportingProjectName + - repositoryName + - repositoryOwner + - requestApi + - requestExtension + - requestHostname + - requestId + - requestMethod + - requestPath + - requestResolvedIp + - requestedInferenceRegion + - reviewConclusion + - reviewStatus + - rewriteDestinationHostname + - route + - ruleCategory + - runtime + - sandboxName + - sandboxSessionId + - sdkKeyEnvironment + - sdkKeyId + - servedSpeed + - serverActionName + - service + - sessionId + - skewProtection + - source + - sourceImage + - sourceImageHash + - sourceImageHostname + - sourceImagePathname + - specVersion + - spendAttribution + - spendReportDatePart + - spendReportGroupBy + - stepRunId + - storeId + - storeName + - surchargeCostCurrency + - tagName + - toolCallErrorType + - toolCallProvider + - toolCallStatusCode + - toolCallSuccess + - toolCallType + - trafficSource + - transcriptInputs + - transcriptOutputs + - transcriptStatus + - triggeringTag + - utmCampaign + - utmContent + - utmMedium + - utmSource + - utmTerm + - vdcOperationOrigin + - videoAspectRatio + - videoResolution + - virtualModelKind + - virtualModelSlug + - visitorId + - wafAction + - wafRuleId + - workflowEventType + - workflowName + - workflowRunId + - workflowStatus + - workflowStepName + additionalProperties: + nullable: true + type: number + type: array + required: + - data + - query + - version + type: object + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '402': + description: '' + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + parameters: + - name: projectId + description: The project identifier or the project name + in: query + required: true + schema: + description: The project identifier or the project name + example: prj_XLKmu1DyR1eY7zq8UgeRKbA7yVLA + type: string + - name: by + description: |- + Up to two dimensions used to break down results. + + At most one time granularity is allowed: hour, day, week, month, year. + + Other dimensions: country, deviceType, environment, requestPath, referrerHostname, osName, browserName, route, utmSource, utmMedium, utmCampaign, utmContent, utmTerm. + + JSON dimensions: flags. Used bare, it breaks down results by key, for example flags returns one group per flag name. With a key, it breaks down results by that key's value, for example flags/beta_banner. Wrap keys containing characters other than letters, digits, and underscores in single quotes, for example flags/'my-flag'. + in: query + required: true + schema: + description: |- + Up to two dimensions used to break down results. + + At most one time granularity is allowed: hour, day, week, month, year. + + Other dimensions: country, deviceType, environment, requestPath, referrerHostname, osName, browserName, route, utmSource, utmMedium, utmCampaign, utmContent, utmTerm. + + JSON dimensions: flags. Used bare, it breaks down results by key, for example flags returns one group per flag name. With a key, it breaks down results by that key's value, for example flags/beta_banner. Wrap keys containing characters other than letters, digits, and underscores in single quotes, for example flags/'my-flag'. + example: + - day + - country + type: array + minItems: 1 + maxItems: 2 + uniqueItems: true + items: + type: string + anyOf: + - enum: + - hour + - day + - week + - month + - year + - country + - deviceType + - environment + - requestPath + - referrerHostname + - osName + - browserName + - route + - utmSource + - utmMedium + - utmCampaign + - utmContent + - utmTerm + - flags + - pattern: ^(flags)(/([0-9A-Za-z_]+|'([^']|'')*'))+$ + errorMessage: '`by` items should be equal to one of the allowed values "hour, day, week, month, year, country, deviceType, environment, requestPath, referrerHostname, osName, browserName, route, utmSource, utmMedium, utmCampaign, utmContent, utmTerm, flags", or a JSON dimension key such as "flags/"' + - name: since + description: |- + Timestamp in milliseconds, or a valid Date string. + + Selects data from (including) this date and time. + Will be adjusted according to the desired time granularity. + in: query + required: true + schema: + description: |- + Timestamp in milliseconds, or a valid Date string. + + Selects data from (including) this date and time. + Will be adjusted according to the desired time granularity. + example: '2024-09-01T00:00:00.000Z' + anyOf: + - type: number + - type: string + - name: until + description: |- + Timestamp in milliseconds, or a valid Date string. + + Selects data until (including) this date. + Will be adjusted according to the desired time granularity. + in: query + required: true + schema: + description: |- + Timestamp in milliseconds, or a valid Date string. + + Selects data until (including) this date. + Will be adjusted according to the desired time granularity. + example: '2024-09-08T00:00:00.000Z' + anyOf: + - type: number + - type: string + - name: limit + description: Number of distinct results, default to 10. Other results are grouped into "Others" group. + in: query + required: false + schema: + description: Number of distinct results, default to 10. Other results are grouped into "Others" group. + default: 10 + example: 3 + type: integer + minimum: 1 + maximum: 100 + - name: filter + description: |- + OData-compliant filter. Encode the value when sending it in a URL. + + Allows filtering on one or multiple dimensions. By default, filters for production environment only. + + Supported dimensions: country, deviceType, environment, requestPath, referrerHostname, osName, browserName, route, utmSource, utmMedium, utmCampaign, utmContent, utmTerm. + + JSON dimensions filtered by key: flags/, for example flags/beta_banner eq 'true'. Wrap keys containing characters other than letters, digits, and underscores in single quotes, for example flags/'my-flag' eq 'true'. + + Supported operations include eq, ne, in, and logical operators and, or, not with parentheses. Functions such as startswith are supported by the OData parser. + in: query + required: false + schema: + description: |- + OData-compliant filter. Encode the value when sending it in a URL. + + Allows filtering on one or multiple dimensions. By default, filters for production environment only. + + Supported dimensions: country, deviceType, environment, requestPath, referrerHostname, osName, browserName, route, utmSource, utmMedium, utmCampaign, utmContent, utmTerm. + + JSON dimensions filtered by key: flags/, for example flags/beta_banner eq 'true'. Wrap keys containing characters other than letters, digits, and underscores in single quotes, for example flags/'my-flag' eq 'true'. + + Supported operations include eq, ne, in, and logical operators and, or, not with parentheses. Functions such as startswith are supported by the OData parser. + example: requestPath eq '/docs' + type: string + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + /v1/query/web-analytics/events/aggregate: + get: + description: Counts custom events on a project, within the requested date range. Results are either aggregated or broken down over time. Results can additionally be broken down by one dimension, and filtered by multiple dimensions. + operationId: aggregateEvents + security: + - bearerToken: [] + summary: Aggregates custom events + tags: + - web-analytics + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + version: + type: number + query: + properties: + since: + type: string + until: + type: string + groupBy: + items: + oneOf: + - type: string + - type: string + enum: + - browserName + - country + - deviceType + - environment + - eventData + - eventName + - flags + - osName + - referrerHostname + - requestPath + - route + - utmCampaign + - utmContent + - utmMedium + - utmSource + - utmTerm + type: array + filter: + type: string + limit: + type: number + required: + - limit + - since + - until + type: object + data: + items: + properties: + projectId: + type: string + country: + type: string + deviceType: + type: string + environment: + type: string + requestPath: + type: string + referrerHostname: + type: string + osName: + type: string + browserName: + type: string + route: + type: string + utmSource: + type: string + utmMedium: + type: string + utmCampaign: + type: string + utmContent: + type: string + utmTerm: + type: string + flags: + type: string + errorMessage: + type: string + entryRevalidateSeconds: + type: string + projectName: + type: string + deploymentId: + type: string + pathType: + type: string + pathTypeVariant: + type: string + requestHostname: + type: string + requestResolvedIp: + type: string + requestMethod: + type: string + requestExtension: + type: string + requestId: + type: string + requestApi: + type: string + referrerUrl: + type: string + serverActionName: + type: string + httpStatus: + type: string + errorCode: + type: string + source: + type: string + edgeType: + type: string + reason: + type: string + edgeNetworkRegion: + type: string + functionRegion: + type: string + imageTransformationRegion: + type: string + dataCacheRegion: + type: string + cause: + type: string + runtime: + type: string + provider: + type: string + isrCacheRegion: + type: string + isrAction: + type: string + cacheResult: + type: string + cacheOperation: + type: string + cacheHostname: + type: string + cachePath: + type: string + cacheHitState: + type: string + cacheHitLevel: + type: string + cacheApi: + type: string + cacheReason: + type: string + pprState: + type: string + clientIp: + type: string + clientIpCountry: + type: string + clientUserAgent: + type: string + httpAccept: + type: string + clientJa4Digest: + type: string + asnId: + type: string + asnName: + type: string + botName: + type: string + botCategory: + type: string + botCategoryLegacy: + type: string + botVerified: + type: string + botCheckResult: + type: string + deepAnalysisCheck: + type: string + wafAction: + type: string + wafRuleId: + type: string + ruleCategory: + type: string + skewProtection: + type: string + functionStartType: + type: string + functionDispatcher: + type: string + isAdditionalRequest: + type: string + originHostname: + type: string + originPath: + type: string + originRoute: + type: string + fetchType: + type: string + fetchIndex: + type: string + imageSource: + type: string + sourceImage: + type: string + sourceImagePathname: + type: string + sourceImageHostname: + type: string + sourceImageHash: + type: string + optimizedQuality: + type: string + optimizedWidthPixels: + type: string + optimizedFormatMimeType: + type: string + vdcOperationOrigin: + type: string + entryName: + type: string + entryId: + type: string + entryItemId: + type: string + tagName: + type: string + cacheTags: + type: string + storeId: + type: string + storeName: + type: string + blobOperationType: + type: string + blobOperationLevel: + type: string + visitorId: + type: string + eventName: + type: string + attributionTarget: + type: string + attributionEventName: + type: string + metricName: + type: string + attributes: + type: string + flagKey: + type: string + flagVariant: + type: string + flagEvaluationReason: + type: string + flagClientName: + type: string + sdkKeyId: + type: string + sdkKeyEnvironment: + type: string + reportingProjectId: + type: string + reportingProjectName: + type: string + eventData: + type: string + middlewareAction: + type: string + middlewareActionTarget: + type: string + aiModel: + type: string + aiGatewayModelId: + type: string + aiProvider: + type: string + aiModelType: + type: string + servedSpeed: + type: string + virtualModelSlug: + type: string + virtualModelKind: + type: string + inferenceEndpointSlug: + type: string + inferenceScope: + type: string + inferenceGeoRegion: + type: string + inferenceProviderRegion: + type: string + requestedInferenceRegion: + type: string + costCurrency: + type: string + marketCostCurrency: + type: string + cachedInputTokensCurrency: + type: string + cacheCreationInputTokensCurrency: + type: string + cacheCreation1hInputTokensCurrency: + type: string + surchargeCostCurrency: + type: string + gatewayCostCurrency: + type: string + keyId: + type: string + keyName: + type: string + authMethod: + type: string + appName: + type: string + codingAgent: + type: string + isByok: + type: string + spendAttribution: + type: string + isPrivateModel: + type: string + isStreaming: + type: string + isRequestZdr: + type: string + hipaaRequested: + type: string + quotaRequested: + type: string + quotaEntityId: + type: string + quotaEntityType: + type: string + videoResolution: + type: string + videoAspectRatio: + type: string + piiRedactionApplied: + type: string + moderationApplied: + type: string + queueName: + type: string + consumerGroup: + type: string + messageId: + type: string + eventType: + type: string + notificationUrl: + type: string + queueRegion: + type: string + sandboxSessionId: + type: string + sandboxName: + type: string + workflowRunId: + type: string + workflowName: + type: string + workflowStatus: + type: string + stepRunId: + type: string + workflowStepName: + type: string + workflowEventType: + type: string + region: + type: string + specVersion: + type: string + contentType: + type: string + rewriteDestinationHostname: + type: string + externalRewriteTargetHost: + type: string + externalRewriteTargetPath: + type: string + commitSha: + type: string + reviewConclusion: + type: string + pullRequestNumber: + type: string + repositoryName: + type: string + repositoryOwner: + type: string + reviewStatus: + type: string + pullRequestState: + type: string + triggeringTag: + type: string + redirectLocation: + type: string + microfrontendsResponseReason: + type: string + microfrontendsMatchedPath: + type: string + microfrontendsDefaultAppDeploymentId: + type: string + microfrontendsDefaultAppProjectId: + type: string + service: + type: string + isPrefetchRequest: + type: string + spendReportGroupBy: + type: string + spendReportDatePart: + type: string + providerAttemptCanonicalSlug: + type: string + providerAttemptCredentialType: + type: string + providerAttemptSuccess: + type: string + providerAttemptStatusCode: + type: string + providerAttemptTimeout: + type: string + providerAttemptIsFinal: + type: string + providerAttemptNumber: + type: string + providerAttemptTotalInRequest: + type: string + generationId: + type: string + sessionId: + type: string + contentCaptureStatus: + type: string + contentCaptureInputs: + type: string + contentCaptureOutputs: + type: string + transcriptStatus: + type: string + transcriptInputs: + type: string + transcriptOutputs: + type: string + providerAttemptError: + type: string + providerAttemptSafetyIdentifier: + type: string + providerAttemptDevSafetyIdentifier: + type: string + providerAttemptRegion: + type: string + providerAttemptModelIndex: + type: string + toolCallType: + type: string + toolCallProvider: + type: string + toolCallSuccess: + type: string + toolCallErrorType: + type: string + toolCallStatusCode: + type: string + environmentId: + type: string + billableRegion: + type: string + direction: + type: string + networkTenancy: + type: string + trafficSource: + type: string + networkId: + type: string + privatelinkEndpointId: + type: string + privatelinkDnsName: + type: string + privatelinkIpAddress: + type: string + timestamp: + type: string + format: date-time + type: object + required: + - timestamp + - aiGatewayModelId + - aiModel + - aiModelType + - aiProvider + - appName + - asnId + - asnName + - attributes + - attributionEventName + - attributionTarget + - authMethod + - billableRegion + - blobOperationLevel + - blobOperationType + - botCategory + - botCategoryLegacy + - botCheckResult + - botName + - botVerified + - browserName + - cacheApi + - cacheCreation1hInputTokensCurrency + - cacheCreationInputTokensCurrency + - cacheHitLevel + - cacheHitState + - cacheHostname + - cacheOperation + - cachePath + - cacheReason + - cacheResult + - cacheTags + - cachedInputTokensCurrency + - cause + - clientIp + - clientIpCountry + - clientJa4Digest + - clientUserAgent + - codingAgent + - commitSha + - consumerGroup + - contentCaptureInputs + - contentCaptureOutputs + - contentCaptureStatus + - contentType + - costCurrency + - country + - dataCacheRegion + - deepAnalysisCheck + - deploymentId + - deviceType + - direction + - edgeNetworkRegion + - edgeType + - entryId + - entryItemId + - entryName + - entryRevalidateSeconds + - environment + - environmentId + - errorCode + - errorMessage + - eventData + - eventName + - eventType + - externalRewriteTargetHost + - externalRewriteTargetPath + - fetchIndex + - fetchType + - flagClientName + - flagEvaluationReason + - flagKey + - flagVariant + - flags + - functionDispatcher + - functionRegion + - functionStartType + - gatewayCostCurrency + - generationId + - hipaaRequested + - httpAccept + - httpStatus + - imageSource + - imageTransformationRegion + - inferenceEndpointSlug + - inferenceGeoRegion + - inferenceProviderRegion + - inferenceScope + - isAdditionalRequest + - isByok + - isPrefetchRequest + - isPrivateModel + - isRequestZdr + - isStreaming + - isrAction + - isrCacheRegion + - keyId + - keyName + - marketCostCurrency + - messageId + - metricName + - microfrontendsDefaultAppDeploymentId + - microfrontendsDefaultAppProjectId + - microfrontendsMatchedPath + - microfrontendsResponseReason + - middlewareAction + - middlewareActionTarget + - moderationApplied + - networkId + - networkTenancy + - notificationUrl + - optimizedFormatMimeType + - optimizedQuality + - optimizedWidthPixels + - originHostname + - originPath + - originRoute + - osName + - pathType + - pathTypeVariant + - piiRedactionApplied + - pprState + - privatelinkDnsName + - privatelinkEndpointId + - privatelinkIpAddress + - projectId + - projectName + - provider + - providerAttemptCanonicalSlug + - providerAttemptCredentialType + - providerAttemptDevSafetyIdentifier + - providerAttemptError + - providerAttemptIsFinal + - providerAttemptModelIndex + - providerAttemptNumber + - providerAttemptRegion + - providerAttemptSafetyIdentifier + - providerAttemptStatusCode + - providerAttemptSuccess + - providerAttemptTimeout + - providerAttemptTotalInRequest + - pullRequestNumber + - pullRequestState + - queueName + - queueRegion + - quotaEntityId + - quotaEntityType + - quotaRequested + - reason + - redirectLocation + - referrerHostname + - referrerUrl + - region + - reportingProjectId + - reportingProjectName + - repositoryName + - repositoryOwner + - requestApi + - requestExtension + - requestHostname + - requestId + - requestMethod + - requestPath + - requestResolvedIp + - requestedInferenceRegion + - reviewConclusion + - reviewStatus + - rewriteDestinationHostname + - route + - ruleCategory + - runtime + - sandboxName + - sandboxSessionId + - sdkKeyEnvironment + - sdkKeyId + - servedSpeed + - serverActionName + - service + - sessionId + - skewProtection + - source + - sourceImage + - sourceImageHash + - sourceImageHostname + - sourceImagePathname + - specVersion + - spendAttribution + - spendReportDatePart + - spendReportGroupBy + - stepRunId + - storeId + - storeName + - surchargeCostCurrency + - tagName + - toolCallErrorType + - toolCallProvider + - toolCallStatusCode + - toolCallSuccess + - toolCallType + - trafficSource + - transcriptInputs + - transcriptOutputs + - transcriptStatus + - triggeringTag + - utmCampaign + - utmContent + - utmMedium + - utmSource + - utmTerm + - vdcOperationOrigin + - videoAspectRatio + - videoResolution + - virtualModelKind + - virtualModelSlug + - visitorId + - wafAction + - wafRuleId + - workflowEventType + - workflowName + - workflowRunId + - workflowStatus + - workflowStepName + additionalProperties: + nullable: true + type: number + type: array + required: + - data + - query + - version + type: object + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '402': + description: '' + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + parameters: + - name: projectId + description: The project identifier or the project name + in: query + required: true + schema: + description: The project identifier or the project name + example: prj_XLKmu1DyR1eY7zq8UgeRKbA7yVLA + type: string + - name: by + description: |- + Up to two dimensions used to break down results. + + At most one time granularity is allowed: hour, day, week, month, year. + + Other dimensions: country, deviceType, environment, requestPath, referrerHostname, osName, browserName, route, utmSource, utmMedium, utmCampaign, utmContent, utmTerm, eventName. + + JSON dimensions: flags, eventData. Used bare, they break down results by key, for example flags returns one group per flag name. With a key, they break down results by that key's value, for example eventData/plan. Wrap keys containing characters other than letters, digits, and underscores in single quotes, for example flags/'my-flag'. + in: query + required: true + schema: + description: |- + Up to two dimensions used to break down results. + + At most one time granularity is allowed: hour, day, week, month, year. + + Other dimensions: country, deviceType, environment, requestPath, referrerHostname, osName, browserName, route, utmSource, utmMedium, utmCampaign, utmContent, utmTerm, eventName. + + JSON dimensions: flags, eventData. Used bare, they break down results by key, for example flags returns one group per flag name. With a key, they break down results by that key's value, for example eventData/plan. Wrap keys containing characters other than letters, digits, and underscores in single quotes, for example flags/'my-flag'. + example: + - day + - eventName + type: array + minItems: 1 + maxItems: 2 + uniqueItems: true + items: + type: string + anyOf: + - enum: + - hour + - day + - week + - month + - year + - country + - deviceType + - environment + - requestPath + - referrerHostname + - osName + - browserName + - route + - utmSource + - utmMedium + - utmCampaign + - utmContent + - utmTerm + - eventName + - flags + - eventData + - pattern: ^(flags|eventData)(/([0-9A-Za-z_]+|'([^']|'')*'))+$ + errorMessage: '`by` items should be equal to one of the allowed values "hour, day, week, month, year, country, deviceType, environment, requestPath, referrerHostname, osName, browserName, route, utmSource, utmMedium, utmCampaign, utmContent, utmTerm, eventName, flags, eventData", or a JSON dimension key such as "flags/, eventData/"' + - name: since + description: |- + Timestamp in milliseconds, or a valid Date string. + + Selects data from (including) this date and time. + Will be adjusted according to the desired time granularity. + in: query + required: true + schema: + description: |- + Timestamp in milliseconds, or a valid Date string. + + Selects data from (including) this date and time. + Will be adjusted according to the desired time granularity. + example: '2024-09-01T00:00:00.000Z' + anyOf: + - type: number + - type: string + - name: until + description: |- + Timestamp in milliseconds, or a valid Date string. + + Selects data until (including) this date. + Will be adjusted according to the desired time granularity. + in: query + required: true + schema: + description: |- + Timestamp in milliseconds, or a valid Date string. + + Selects data until (including) this date. + Will be adjusted according to the desired time granularity. + example: '2024-09-08T00:00:00.000Z' + anyOf: + - type: number + - type: string + - name: limit + description: Number of distinct results, default to 10. Other results are grouped into "Others" group. + in: query + required: false + schema: + description: Number of distinct results, default to 10. Other results are grouped into "Others" group. + default: 10 + example: 3 + type: integer + minimum: 1 + maximum: 100 + - name: filter + description: |- + OData-compliant filter. Encode the value when sending it in a URL. + + Allows filtering on one or multiple dimensions. By default, filters for production environment only. + + Supported dimensions: country, deviceType, environment, requestPath, referrerHostname, osName, browserName, route, utmSource, utmMedium, utmCampaign, utmContent, utmTerm, eventName. + + JSON dimensions filtered by key: flags/, eventData/, for example eventData/plan eq 'pro'. Wrap keys containing characters other than letters, digits, and underscores in single quotes, for example flags/'my-flag' eq 'true'. + + Supported operations include eq, ne, in, and logical operators and, or, not with parentheses. Functions such as startswith are supported by the OData parser. + in: query + required: false + schema: + description: |- + OData-compliant filter. Encode the value when sending it in a URL. + + Allows filtering on one or multiple dimensions. By default, filters for production environment only. + + Supported dimensions: country, deviceType, environment, requestPath, referrerHostname, osName, browserName, route, utmSource, utmMedium, utmCampaign, utmContent, utmTerm, eventName. + + JSON dimensions filtered by key: flags/, eventData/, for example eventData/plan eq 'pro'. Wrap keys containing characters other than letters, digits, and underscores in single quotes, for example flags/'my-flag' eq 'true'. + + Supported operations include eq, ne, in, and logical operators and, or, not with parentheses. Functions such as startswith are supported by the OData parser. + example: eventData/plan eq 'pro' + type: string + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + /v1/query/web-analytics/visits/count: + get: + description: Counts the number of page views on a project (production only), since Web Analytics was enabled. Results can be filtered on supported dimensions. + operationId: countPageviews + security: + - bearerToken: [] + summary: Counts page views + tags: + - web-analytics + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + version: + type: number + query: + properties: + since: + type: string + until: + type: string + filter: + type: string + required: + - since + - until + type: object + data: + properties: + projectId: + type: string + country: + type: string + deviceType: + type: string + environment: + type: string + requestPath: + type: string + referrerHostname: + type: string + osName: + type: string + browserName: + type: string + route: + type: string + utmSource: + type: string + utmMedium: + type: string + utmCampaign: + type: string + utmContent: + type: string + utmTerm: + type: string + flags: + type: string + errorMessage: + type: string + entryRevalidateSeconds: + type: string + projectName: + type: string + deploymentId: + type: string + pathType: + type: string + pathTypeVariant: + type: string + requestHostname: + type: string + requestResolvedIp: + type: string + requestMethod: + type: string + requestExtension: + type: string + requestId: + type: string + requestApi: + type: string + referrerUrl: + type: string + serverActionName: + type: string + httpStatus: + type: string + errorCode: + type: string + source: + type: string + edgeType: + type: string + reason: + type: string + edgeNetworkRegion: + type: string + functionRegion: + type: string + imageTransformationRegion: + type: string + dataCacheRegion: + type: string + cause: + type: string + runtime: + type: string + provider: + type: string + isrCacheRegion: + type: string + isrAction: + type: string + cacheResult: + type: string + cacheOperation: + type: string + cacheHostname: + type: string + cachePath: + type: string + cacheHitState: + type: string + cacheHitLevel: + type: string + cacheApi: + type: string + cacheReason: + type: string + pprState: + type: string + clientIp: + type: string + clientIpCountry: + type: string + clientUserAgent: + type: string + httpAccept: + type: string + clientJa4Digest: + type: string + asnId: + type: string + asnName: + type: string + botName: + type: string + botCategory: + type: string + botCategoryLegacy: + type: string + botVerified: + type: string + botCheckResult: + type: string + deepAnalysisCheck: + type: string + wafAction: + type: string + wafRuleId: + type: string + ruleCategory: + type: string + skewProtection: + type: string + functionStartType: + type: string + functionDispatcher: + type: string + isAdditionalRequest: + type: string + originHostname: + type: string + originPath: + type: string + originRoute: + type: string + fetchType: + type: string + fetchIndex: + type: string + imageSource: + type: string + sourceImage: + type: string + sourceImagePathname: + type: string + sourceImageHostname: + type: string + sourceImageHash: + type: string + optimizedQuality: + type: string + optimizedWidthPixels: + type: string + optimizedFormatMimeType: + type: string + vdcOperationOrigin: + type: string + entryName: + type: string + entryId: + type: string + entryItemId: + type: string + tagName: + type: string + cacheTags: + type: string + storeId: + type: string + storeName: + type: string + blobOperationType: + type: string + blobOperationLevel: + type: string + visitorId: + type: string + eventName: + type: string + attributionTarget: + type: string + attributionEventName: + type: string + metricName: + type: string + attributes: + type: string + flagKey: + type: string + flagVariant: + type: string + flagEvaluationReason: + type: string + flagClientName: + type: string + sdkKeyId: + type: string + sdkKeyEnvironment: + type: string + reportingProjectId: + type: string + reportingProjectName: + type: string + eventData: + type: string + middlewareAction: + type: string + middlewareActionTarget: + type: string + aiModel: + type: string + aiGatewayModelId: + type: string + aiProvider: + type: string + aiModelType: + type: string + servedSpeed: + type: string + virtualModelSlug: + type: string + virtualModelKind: + type: string + inferenceEndpointSlug: + type: string + inferenceScope: + type: string + inferenceGeoRegion: + type: string + inferenceProviderRegion: + type: string + requestedInferenceRegion: + type: string + costCurrency: + type: string + marketCostCurrency: + type: string + cachedInputTokensCurrency: + type: string + cacheCreationInputTokensCurrency: + type: string + cacheCreation1hInputTokensCurrency: + type: string + surchargeCostCurrency: + type: string + gatewayCostCurrency: + type: string + keyId: + type: string + keyName: + type: string + authMethod: + type: string + appName: + type: string + codingAgent: + type: string + isByok: + type: string + spendAttribution: + type: string + isPrivateModel: + type: string + isStreaming: + type: string + isRequestZdr: + type: string + hipaaRequested: + type: string + quotaRequested: + type: string + quotaEntityId: + type: string + quotaEntityType: + type: string + videoResolution: + type: string + videoAspectRatio: + type: string + piiRedactionApplied: + type: string + moderationApplied: + type: string + queueName: + type: string + consumerGroup: + type: string + messageId: + type: string + eventType: + type: string + notificationUrl: + type: string + queueRegion: + type: string + sandboxSessionId: + type: string + sandboxName: + type: string + workflowRunId: + type: string + workflowName: + type: string + workflowStatus: + type: string + stepRunId: + type: string + workflowStepName: + type: string + workflowEventType: + type: string + region: + type: string + specVersion: + type: string + contentType: + type: string + rewriteDestinationHostname: + type: string + externalRewriteTargetHost: + type: string + externalRewriteTargetPath: + type: string + commitSha: + type: string + reviewConclusion: + type: string + pullRequestNumber: + type: string + repositoryName: + type: string + repositoryOwner: + type: string + reviewStatus: + type: string + pullRequestState: + type: string + triggeringTag: + type: string + redirectLocation: + type: string + microfrontendsResponseReason: + type: string + microfrontendsMatchedPath: + type: string + microfrontendsDefaultAppDeploymentId: + type: string + microfrontendsDefaultAppProjectId: + type: string + service: + type: string + isPrefetchRequest: + type: string + spendReportGroupBy: + type: string + spendReportDatePart: + type: string + providerAttemptCanonicalSlug: + type: string + providerAttemptCredentialType: + type: string + providerAttemptSuccess: + type: string + providerAttemptStatusCode: + type: string + providerAttemptTimeout: + type: string + providerAttemptIsFinal: + type: string + providerAttemptNumber: + type: string + providerAttemptTotalInRequest: + type: string + generationId: + type: string + sessionId: + type: string + contentCaptureStatus: + type: string + contentCaptureInputs: + type: string + contentCaptureOutputs: + type: string + transcriptStatus: + type: string + transcriptInputs: + type: string + transcriptOutputs: + type: string + providerAttemptError: + type: string + providerAttemptSafetyIdentifier: + type: string + providerAttemptDevSafetyIdentifier: + type: string + providerAttemptRegion: + type: string + providerAttemptModelIndex: + type: string + toolCallType: + type: string + toolCallProvider: + type: string + toolCallSuccess: + type: string + toolCallErrorType: + type: string + toolCallStatusCode: + type: string + environmentId: + type: string + billableRegion: + type: string + direction: + type: string + networkTenancy: + type: string + trafficSource: + type: string + networkId: + type: string + privatelinkEndpointId: + type: string + privatelinkDnsName: + type: string + privatelinkIpAddress: + type: string + visitors: + type: number + pageviews: + type: number + required: + - aiGatewayModelId + - aiModel + - aiModelType + - aiProvider + - appName + - asnId + - asnName + - attributes + - attributionEventName + - attributionTarget + - authMethod + - billableRegion + - blobOperationLevel + - blobOperationType + - botCategory + - botCategoryLegacy + - botCheckResult + - botName + - botVerified + - browserName + - cacheApi + - cacheCreation1hInputTokensCurrency + - cacheCreationInputTokensCurrency + - cacheHitLevel + - cacheHitState + - cacheHostname + - cacheOperation + - cachePath + - cacheReason + - cacheResult + - cacheTags + - cachedInputTokensCurrency + - cause + - clientIp + - clientIpCountry + - clientJa4Digest + - clientUserAgent + - codingAgent + - commitSha + - consumerGroup + - contentCaptureInputs + - contentCaptureOutputs + - contentCaptureStatus + - contentType + - costCurrency + - country + - dataCacheRegion + - deepAnalysisCheck + - deploymentId + - deviceType + - direction + - edgeNetworkRegion + - edgeType + - entryId + - entryItemId + - entryName + - entryRevalidateSeconds + - environment + - environmentId + - errorCode + - errorMessage + - eventData + - eventName + - eventType + - externalRewriteTargetHost + - externalRewriteTargetPath + - fetchIndex + - fetchType + - flagClientName + - flagEvaluationReason + - flagKey + - flagVariant + - flags + - functionDispatcher + - functionRegion + - functionStartType + - gatewayCostCurrency + - generationId + - hipaaRequested + - httpAccept + - httpStatus + - imageSource + - imageTransformationRegion + - inferenceEndpointSlug + - inferenceGeoRegion + - inferenceProviderRegion + - inferenceScope + - isAdditionalRequest + - isByok + - isPrefetchRequest + - isPrivateModel + - isRequestZdr + - isStreaming + - isrAction + - isrCacheRegion + - keyId + - keyName + - marketCostCurrency + - messageId + - metricName + - microfrontendsDefaultAppDeploymentId + - microfrontendsDefaultAppProjectId + - microfrontendsMatchedPath + - microfrontendsResponseReason + - middlewareAction + - middlewareActionTarget + - moderationApplied + - networkId + - networkTenancy + - notificationUrl + - optimizedFormatMimeType + - optimizedQuality + - optimizedWidthPixels + - originHostname + - originPath + - originRoute + - osName + - pathType + - pathTypeVariant + - piiRedactionApplied + - pprState + - privatelinkDnsName + - privatelinkEndpointId + - privatelinkIpAddress + - projectId + - projectName + - provider + - providerAttemptCanonicalSlug + - providerAttemptCredentialType + - providerAttemptDevSafetyIdentifier + - providerAttemptError + - providerAttemptIsFinal + - providerAttemptModelIndex + - providerAttemptNumber + - providerAttemptRegion + - providerAttemptSafetyIdentifier + - providerAttemptStatusCode + - providerAttemptSuccess + - providerAttemptTimeout + - providerAttemptTotalInRequest + - pullRequestNumber + - pullRequestState + - queueName + - queueRegion + - quotaEntityId + - quotaEntityType + - quotaRequested + - reason + - redirectLocation + - referrerHostname + - referrerUrl + - region + - reportingProjectId + - reportingProjectName + - repositoryName + - repositoryOwner + - requestApi + - requestExtension + - requestHostname + - requestId + - requestMethod + - requestPath + - requestResolvedIp + - requestedInferenceRegion + - reviewConclusion + - reviewStatus + - rewriteDestinationHostname + - route + - ruleCategory + - runtime + - sandboxName + - sandboxSessionId + - sdkKeyEnvironment + - sdkKeyId + - servedSpeed + - serverActionName + - service + - sessionId + - skewProtection + - source + - sourceImage + - sourceImageHash + - sourceImageHostname + - sourceImagePathname + - specVersion + - spendAttribution + - spendReportDatePart + - spendReportGroupBy + - stepRunId + - storeId + - storeName + - surchargeCostCurrency + - tagName + - toolCallErrorType + - toolCallProvider + - toolCallStatusCode + - toolCallSuccess + - toolCallType + - trafficSource + - transcriptInputs + - transcriptOutputs + - transcriptStatus + - triggeringTag + - utmCampaign + - utmContent + - utmMedium + - utmSource + - utmTerm + - vdcOperationOrigin + - videoAspectRatio + - videoResolution + - virtualModelKind + - virtualModelSlug + - visitorId + - wafAction + - wafRuleId + - workflowEventType + - workflowName + - workflowRunId + - workflowStatus + - workflowStepName + - pageviews + - visitors + type: object + additionalProperties: + nullable: true + type: number + required: + - data + - query + - version + type: object + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '402': + description: '' + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + parameters: + - name: projectId + description: The project identifier or the project name + in: query + required: true + schema: + description: The project identifier or the project name + example: prj_XLKmu1DyR1eY7zq8UgeRKbA7yVLA + type: string + - name: since + description: |- + Timestamp in milliseconds, or a valid Date string. + + Selects data from (including) this date and time. + Will be adjusted according to the desired time granularity. + in: query + required: false + schema: + description: |- + Timestamp in milliseconds, or a valid Date string. + + Selects data from (including) this date and time. + Will be adjusted according to the desired time granularity. + example: '2024-09-01T00:00:00.000Z' + anyOf: + - type: number + - type: string + - name: until + description: |- + Timestamp in milliseconds, or a valid Date string. + + Selects data until (including) this date. + Will be adjusted according to the desired time granularity. + in: query + required: false + schema: + description: |- + Timestamp in milliseconds, or a valid Date string. + + Selects data until (including) this date. + Will be adjusted according to the desired time granularity. + example: '2024-09-08T00:00:00.000Z' + anyOf: + - type: number + - type: string + - name: filter + description: |- + OData-compliant filter. Encode the value when sending it in a URL. + + Allows filtering on one or multiple dimensions. + + Supported dimensions: country, deviceType, environment, requestPath, referrerHostname, osName, browserName, route, utmSource, utmMedium, utmCampaign, utmContent, utmTerm. + + JSON dimensions filtered by key: flags/, for example flags/beta_banner eq 'true'. Wrap keys containing characters other than letters, digits, and underscores in single quotes, for example flags/'my-flag' eq 'true'. + + Supported operations include eq, ne, in, and logical operators and, or, not with parentheses. Functions such as startswith are supported by the OData parser. + in: query + required: false + schema: + description: |- + OData-compliant filter. Encode the value when sending it in a URL. + + Allows filtering on one or multiple dimensions. + + Supported dimensions: country, deviceType, environment, requestPath, referrerHostname, osName, browserName, route, utmSource, utmMedium, utmCampaign, utmContent, utmTerm. + + JSON dimensions filtered by key: flags/, for example flags/beta_banner eq 'true'. Wrap keys containing characters other than letters, digits, and underscores in single quotes, for example flags/'my-flag' eq 'true'. + + Supported operations include eq, ne, in, and logical operators and, or, not with parentheses. Functions such as startswith are supported by the OData parser. + example: route eq '/home' + type: string + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + /v1/query/web-analytics/events/count: + get: + description: Counts the number of custom events on a project (production only), since Web Analytics was enabled. Results can be filtered on supported dimensions. + operationId: countEvents + security: + - bearerToken: [] + summary: Counts custom events + tags: + - web-analytics + responses: + '200': + description: '' + content: + application/json: + schema: + properties: + version: + type: number + query: + properties: + since: + type: string + until: + type: string + filter: + type: string + required: + - since + - until + type: object + data: + properties: + projectId: + type: string + country: + type: string + deviceType: + type: string + environment: + type: string + requestPath: + type: string + referrerHostname: + type: string + osName: + type: string + browserName: + type: string + route: + type: string + utmSource: + type: string + utmMedium: + type: string + utmCampaign: + type: string + utmContent: + type: string + utmTerm: + type: string + flags: + type: string + errorMessage: + type: string + entryRevalidateSeconds: + type: string + projectName: + type: string + deploymentId: + type: string + pathType: + type: string + pathTypeVariant: + type: string + requestHostname: + type: string + requestResolvedIp: + type: string + requestMethod: + type: string + requestExtension: + type: string + requestId: + type: string + requestApi: + type: string + referrerUrl: + type: string + serverActionName: + type: string + httpStatus: + type: string + errorCode: + type: string + source: + type: string + edgeType: + type: string + reason: + type: string + edgeNetworkRegion: + type: string + functionRegion: + type: string + imageTransformationRegion: + type: string + dataCacheRegion: + type: string + cause: + type: string + runtime: + type: string + provider: + type: string + isrCacheRegion: + type: string + isrAction: + type: string + cacheResult: + type: string + cacheOperation: + type: string + cacheHostname: + type: string + cachePath: + type: string + cacheHitState: + type: string + cacheHitLevel: + type: string + cacheApi: + type: string + cacheReason: + type: string + pprState: + type: string + clientIp: + type: string + clientIpCountry: + type: string + clientUserAgent: + type: string + httpAccept: + type: string + clientJa4Digest: + type: string + asnId: + type: string + asnName: + type: string + botName: + type: string + botCategory: + type: string + botCategoryLegacy: + type: string + botVerified: + type: string + botCheckResult: + type: string + deepAnalysisCheck: + type: string + wafAction: + type: string + wafRuleId: + type: string + ruleCategory: + type: string + skewProtection: + type: string + functionStartType: + type: string + functionDispatcher: + type: string + isAdditionalRequest: + type: string + originHostname: + type: string + originPath: + type: string + originRoute: + type: string + fetchType: + type: string + fetchIndex: + type: string + imageSource: + type: string + sourceImage: + type: string + sourceImagePathname: + type: string + sourceImageHostname: + type: string + sourceImageHash: + type: string + optimizedQuality: + type: string + optimizedWidthPixels: + type: string + optimizedFormatMimeType: + type: string + vdcOperationOrigin: + type: string + entryName: + type: string + entryId: + type: string + entryItemId: + type: string + tagName: + type: string + cacheTags: + type: string + storeId: + type: string + storeName: + type: string + blobOperationType: + type: string + blobOperationLevel: + type: string + visitorId: + type: string + eventName: + type: string + attributionTarget: + type: string + attributionEventName: + type: string + metricName: + type: string + attributes: + type: string + flagKey: + type: string + flagVariant: + type: string + flagEvaluationReason: + type: string + flagClientName: + type: string + sdkKeyId: + type: string + sdkKeyEnvironment: + type: string + reportingProjectId: + type: string + reportingProjectName: + type: string + eventData: + type: string + middlewareAction: + type: string + middlewareActionTarget: + type: string + aiModel: + type: string + aiGatewayModelId: + type: string + aiProvider: + type: string + aiModelType: + type: string + servedSpeed: + type: string + virtualModelSlug: + type: string + virtualModelKind: + type: string + inferenceEndpointSlug: + type: string + inferenceScope: + type: string + inferenceGeoRegion: + type: string + inferenceProviderRegion: + type: string + requestedInferenceRegion: + type: string + costCurrency: + type: string + marketCostCurrency: + type: string + cachedInputTokensCurrency: + type: string + cacheCreationInputTokensCurrency: + type: string + cacheCreation1hInputTokensCurrency: + type: string + surchargeCostCurrency: + type: string + gatewayCostCurrency: + type: string + keyId: + type: string + keyName: + type: string + authMethod: + type: string + appName: + type: string + codingAgent: + type: string + isByok: + type: string + spendAttribution: + type: string + isPrivateModel: + type: string + isStreaming: + type: string + isRequestZdr: + type: string + hipaaRequested: + type: string + quotaRequested: + type: string + quotaEntityId: + type: string + quotaEntityType: + type: string + videoResolution: + type: string + videoAspectRatio: + type: string + piiRedactionApplied: + type: string + moderationApplied: + type: string + queueName: + type: string + consumerGroup: + type: string + messageId: + type: string + eventType: + type: string + notificationUrl: + type: string + queueRegion: + type: string + sandboxSessionId: + type: string + sandboxName: + type: string + workflowRunId: + type: string + workflowName: + type: string + workflowStatus: + type: string + stepRunId: + type: string + workflowStepName: + type: string + workflowEventType: + type: string + region: + type: string + specVersion: + type: string + contentType: + type: string + rewriteDestinationHostname: + type: string + externalRewriteTargetHost: + type: string + externalRewriteTargetPath: + type: string + commitSha: + type: string + reviewConclusion: + type: string + pullRequestNumber: + type: string + repositoryName: + type: string + repositoryOwner: + type: string + reviewStatus: + type: string + pullRequestState: + type: string + triggeringTag: + type: string + redirectLocation: + type: string + microfrontendsResponseReason: + type: string + microfrontendsMatchedPath: + type: string + microfrontendsDefaultAppDeploymentId: + type: string + microfrontendsDefaultAppProjectId: + type: string + service: + type: string + isPrefetchRequest: + type: string + spendReportGroupBy: + type: string + spendReportDatePart: + type: string + providerAttemptCanonicalSlug: + type: string + providerAttemptCredentialType: + type: string + providerAttemptSuccess: + type: string + providerAttemptStatusCode: + type: string + providerAttemptTimeout: + type: string + providerAttemptIsFinal: + type: string + providerAttemptNumber: + type: string + providerAttemptTotalInRequest: + type: string + generationId: + type: string + sessionId: + type: string + contentCaptureStatus: + type: string + contentCaptureInputs: + type: string + contentCaptureOutputs: + type: string + transcriptStatus: + type: string + transcriptInputs: + type: string + transcriptOutputs: + type: string + providerAttemptError: + type: string + providerAttemptSafetyIdentifier: + type: string + providerAttemptDevSafetyIdentifier: + type: string + providerAttemptRegion: + type: string + providerAttemptModelIndex: + type: string + toolCallType: + type: string + toolCallProvider: + type: string + toolCallSuccess: + type: string + toolCallErrorType: + type: string + toolCallStatusCode: + type: string + environmentId: + type: string + billableRegion: + type: string + direction: + type: string + networkTenancy: + type: string + trafficSource: + type: string + networkId: + type: string + privatelinkEndpointId: + type: string + privatelinkDnsName: + type: string + privatelinkIpAddress: + type: string + visitors: + type: number + count: + type: number + required: + - aiGatewayModelId + - aiModel + - aiModelType + - aiProvider + - appName + - asnId + - asnName + - attributes + - attributionEventName + - attributionTarget + - authMethod + - billableRegion + - blobOperationLevel + - blobOperationType + - botCategory + - botCategoryLegacy + - botCheckResult + - botName + - botVerified + - browserName + - cacheApi + - cacheCreation1hInputTokensCurrency + - cacheCreationInputTokensCurrency + - cacheHitLevel + - cacheHitState + - cacheHostname + - cacheOperation + - cachePath + - cacheReason + - cacheResult + - cacheTags + - cachedInputTokensCurrency + - cause + - clientIp + - clientIpCountry + - clientJa4Digest + - clientUserAgent + - codingAgent + - commitSha + - consumerGroup + - contentCaptureInputs + - contentCaptureOutputs + - contentCaptureStatus + - contentType + - costCurrency + - country + - dataCacheRegion + - deepAnalysisCheck + - deploymentId + - deviceType + - direction + - edgeNetworkRegion + - edgeType + - entryId + - entryItemId + - entryName + - entryRevalidateSeconds + - environment + - environmentId + - errorCode + - errorMessage + - eventData + - eventName + - eventType + - externalRewriteTargetHost + - externalRewriteTargetPath + - fetchIndex + - fetchType + - flagClientName + - flagEvaluationReason + - flagKey + - flagVariant + - flags + - functionDispatcher + - functionRegion + - functionStartType + - gatewayCostCurrency + - generationId + - hipaaRequested + - httpAccept + - httpStatus + - imageSource + - imageTransformationRegion + - inferenceEndpointSlug + - inferenceGeoRegion + - inferenceProviderRegion + - inferenceScope + - isAdditionalRequest + - isByok + - isPrefetchRequest + - isPrivateModel + - isRequestZdr + - isStreaming + - isrAction + - isrCacheRegion + - keyId + - keyName + - marketCostCurrency + - messageId + - metricName + - microfrontendsDefaultAppDeploymentId + - microfrontendsDefaultAppProjectId + - microfrontendsMatchedPath + - microfrontendsResponseReason + - middlewareAction + - middlewareActionTarget + - moderationApplied + - networkId + - networkTenancy + - notificationUrl + - optimizedFormatMimeType + - optimizedQuality + - optimizedWidthPixels + - originHostname + - originPath + - originRoute + - osName + - pathType + - pathTypeVariant + - piiRedactionApplied + - pprState + - privatelinkDnsName + - privatelinkEndpointId + - privatelinkIpAddress + - projectId + - projectName + - provider + - providerAttemptCanonicalSlug + - providerAttemptCredentialType + - providerAttemptDevSafetyIdentifier + - providerAttemptError + - providerAttemptIsFinal + - providerAttemptModelIndex + - providerAttemptNumber + - providerAttemptRegion + - providerAttemptSafetyIdentifier + - providerAttemptStatusCode + - providerAttemptSuccess + - providerAttemptTimeout + - providerAttemptTotalInRequest + - pullRequestNumber + - pullRequestState + - queueName + - queueRegion + - quotaEntityId + - quotaEntityType + - quotaRequested + - reason + - redirectLocation + - referrerHostname + - referrerUrl + - region + - reportingProjectId + - reportingProjectName + - repositoryName + - repositoryOwner + - requestApi + - requestExtension + - requestHostname + - requestId + - requestMethod + - requestPath + - requestResolvedIp + - requestedInferenceRegion + - reviewConclusion + - reviewStatus + - rewriteDestinationHostname + - route + - ruleCategory + - runtime + - sandboxName + - sandboxSessionId + - sdkKeyEnvironment + - sdkKeyId + - servedSpeed + - serverActionName + - service + - sessionId + - skewProtection + - source + - sourceImage + - sourceImageHash + - sourceImageHostname + - sourceImagePathname + - specVersion + - spendAttribution + - spendReportDatePart + - spendReportGroupBy + - stepRunId + - storeId + - storeName + - surchargeCostCurrency + - tagName + - toolCallErrorType + - toolCallProvider + - toolCallStatusCode + - toolCallSuccess + - toolCallType + - trafficSource + - transcriptInputs + - transcriptOutputs + - transcriptStatus + - triggeringTag + - utmCampaign + - utmContent + - utmMedium + - utmSource + - utmTerm + - vdcOperationOrigin + - videoAspectRatio + - videoResolution + - virtualModelKind + - virtualModelSlug + - visitorId + - wafAction + - wafRuleId + - workflowEventType + - workflowName + - workflowRunId + - workflowStatus + - workflowStepName + - count + - visitors + type: object + additionalProperties: + nullable: true + type: number + required: + - data + - query + - version + type: object + '400': + description: One of the provided values in the request query is invalid. + '401': + description: The request is not authorized. + '402': + description: '' + '403': + description: You do not have permission to access this resource. + '404': + description: '' + '410': + description: '' + parameters: + - name: projectId + description: The project identifier or the project name + in: query + required: true + schema: + description: The project identifier or the project name + example: prj_XLKmu1DyR1eY7zq8UgeRKbA7yVLA + type: string + - name: since + description: |- + Timestamp in milliseconds, or a valid Date string. + + Selects data from (including) this date and time. + Will be adjusted according to the desired time granularity. + in: query + required: false + schema: + description: |- + Timestamp in milliseconds, or a valid Date string. + + Selects data from (including) this date and time. + Will be adjusted according to the desired time granularity. + example: '2024-09-01T00:00:00.000Z' + anyOf: + - type: number + - type: string + - name: until + description: |- + Timestamp in milliseconds, or a valid Date string. + + Selects data until (including) this date. + Will be adjusted according to the desired time granularity. + in: query + required: false + schema: + description: |- + Timestamp in milliseconds, or a valid Date string. + + Selects data until (including) this date. + Will be adjusted according to the desired time granularity. + example: '2024-09-08T00:00:00.000Z' + anyOf: + - type: number + - type: string + - name: filter + description: |- + OData-compliant filter. Encode the value when sending it in a URL. + + Allows filtering on one or multiple dimensions. + + Supported dimensions: country, deviceType, environment, requestPath, referrerHostname, osName, browserName, route, utmSource, utmMedium, utmCampaign, utmContent, utmTerm, eventName. + + JSON dimensions filtered by key: flags/, eventData/, for example eventData/plan eq 'pro'. Wrap keys containing characters other than letters, digits, and underscores in single quotes, for example flags/'my-flag' eq 'true'. + + Supported operations include eq, ne, in, and logical operators and, or, not with parentheses. Functions such as startswith are supported by the OData parser. + in: query + required: false + schema: + description: |- + OData-compliant filter. Encode the value when sending it in a URL. + + Allows filtering on one or multiple dimensions. + + Supported dimensions: country, deviceType, environment, requestPath, referrerHostname, osName, browserName, route, utmSource, utmMedium, utmCampaign, utmContent, utmTerm, eventName. + + JSON dimensions filtered by key: flags/, eventData/, for example eventData/plan eq 'pro'. Wrap keys containing characters other than letters, digits, and underscores in single quotes, for example flags/'my-flag' eq 'true'. + + Supported operations include eq, ne, in, and logical operators and, or, not with parentheses. Functions such as startswith are supported by the OData parser. + example: eventName eq 'signup' + type: string + - description: The Team identifier to perform the request on behalf of. + in: query + name: teamId + schema: + type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug +components: + x-stackQL-resources: + speed_insights: + id: vercel.web_analytics.speed_insights + name: speed_insights + title: Speed Insights + methods: + toggle: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1speed-insights~1toggle/post' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + sqlVerbs: + select: [] + insert: [] + update: [] + delete: [] + replace: [] + web_insights: + id: vercel.web_analytics.web_insights + name: web_insights + title: Web Insights + methods: + toggle: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1web~1insights~1toggle/post' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + sqlVerbs: + select: [] + insert: [] + update: [] + delete: [] + replace: [] + pageview_aggregates: + id: vercel.web_analytics.pageview_aggregates + name: pageview_aggregates + title: Pageview Aggregates + methods: + list: + operation: + $ref: '#/paths/~1v1~1query~1web-analytics~1visits~1aggregate/get' + response: + mediaType: application/json + openAPIDocKey: '200' + objectKey: $.data + request: + nativeCasing: camel + config: + queryParamPushdown: + top: + paramName: limit + maxValue: 100 + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/pageview_aggregates/methods/list' + insert: [] + update: [] + delete: [] + replace: [] + event_aggregates: + id: vercel.web_analytics.event_aggregates + name: event_aggregates + title: Event Aggregates + methods: + list: + operation: + $ref: '#/paths/~1v1~1query~1web-analytics~1events~1aggregate/get' + response: + mediaType: application/json + openAPIDocKey: '200' + objectKey: $.data + request: + nativeCasing: camel + config: + queryParamPushdown: + top: + paramName: limit + maxValue: 100 + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/event_aggregates/methods/list' + insert: [] + update: [] + delete: [] + replace: [] + pageview_counts: + id: vercel.web_analytics.pageview_counts + name: pageview_counts + title: Pageview Counts + methods: + list: + operation: + $ref: '#/paths/~1v1~1query~1web-analytics~1visits~1count/get' + response: + mediaType: application/json + openAPIDocKey: '200' + objectKey: $.data + request: + nativeCasing: camel + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/pageview_counts/methods/list' + insert: [] + update: [] + delete: [] + replace: [] + event_counts: + id: vercel.web_analytics.event_counts + name: event_counts + title: Event Counts + methods: + list: + operation: + $ref: '#/paths/~1v1~1query~1web-analytics~1events~1count/get' + response: + mediaType: application/json + openAPIDocKey: '200' + objectKey: $.data + request: + nativeCasing: camel + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/event_counts/methods/list' + insert: [] + update: [] + delete: [] + replace: [] +servers: + - url: https://api.vercel.com diff --git a/provider-dev/openapi/src/vercel/v00.00.00000/services/webhooks.yaml b/provider-dev/openapi/src/vercel/v00.00.00000/services/webhooks.yaml index 20772df..166615e 100644 --- a/provider-dev/openapi/src/vercel/v00.00.00000/services/webhooks.yaml +++ b/provider-dev/openapi/src/vercel/v00.00.00000/services/webhooks.yaml @@ -1,69 +1,8 @@ openapi: 3.0.3 -servers: - - url: 'https://api.vercel.com' - description: Production API info: - contact: - email: support@vercel.com - name: Vercel Support - url: 'https://vercel.com/support' + title: webhooks API + description: vercel webhooks API version: 0.0.1 - title: Vercel API - webhooks - description: webhooks -components: - schemas: {} - responses: {} - securitySchemes: - bearerToken: - type: http - description: Default authentication mechanism - scheme: bearer - oauth2: - type: oauth2 - flows: - authorizationCode: - authorizationUrl: 'https://api.vercel.com/oauth/authorize' - tokenUrl: 'https://api.vercel.com/oauth/access_token' - scopes: {} - x-stackQL-resources: - webhooks: - id: vercel.webhooks.webhooks - name: webhooks - title: Webhooks - methods: - create_webhook: - operation: - $ref: '#/paths/~1v1~1webhooks/post' - response: - mediaType: application/json - openAPIDocKey: '200' - get_webhooks: - operation: - $ref: '#/paths/~1v1~1webhooks/get' - response: - mediaType: application/json - openAPIDocKey: '200' - get_webhook: - operation: - $ref: '#/paths/~1v1~1webhooks~1{id}/get' - response: - mediaType: application/json - openAPIDocKey: '200' - delete_webhook: - operation: - $ref: '#/paths/~1v1~1webhooks~1{id}/delete' - response: - mediaType: application/json - openAPIDocKey: '200' - sqlVerbs: - select: - - $ref: '#/components/x-stackQL-resources/webhooks/methods/get_webhook' - - $ref: '#/components/x-stackQL-resources/webhooks/methods/get_webhooks' - insert: - - $ref: '#/components/x-stackQL-resources/webhooks/methods/create_webhook' - update: [] - delete: - - $ref: '#/components/x-stackQL-resources/webhooks/methods/delete_webhook' paths: /v1/webhooks: post: @@ -84,38 +23,199 @@ paths: secret: type: string description: The webhook secret used to sign the payload + alertRuleIds: + items: + type: string + type: array events: items: type: string enum: + - ai-gateway.auto-reload.limit-reached + - ai-gateway.balance-depleted + - alerts.triggered + - botid.anomaly - budget.reached - - domain.created + - comment.created + - comment.deleted + - comment.mentioned + - comment.reaction-added + - comment.reaction-removed + - comment.resolved + - comment.unresolved + - comment.updated + - deployment + - deployment-canceled + - deployment-check-rerequested + - deployment-checks-completed + - deployment-error + - deployment-prepared + - deployment-ready + - deployment.blocked + - deployment.build-requested + - deployment.canceled + - deployment.check-rerequested + - deployment.checkrun.cancel + - deployment.checkrun.start + - deployment.checks.failed + - deployment.checks.succeeded + - deployment.cleanup - deployment.created - deployment.error - - deployment.canceled - - deployment.succeeded + - deployment.integration.action.cancel + - deployment.integration.action.cleanup + - deployment.integration.action.start + - deployment.promoted - deployment.ready - - deployment.check-rerequested + - deployment.rollback + - deployment.succeeded + - domain-created + - domain.auto-renew.changed + - domain.certificate.add + - domain.certificate.add.failed + - domain.certificate.deleted + - domain.certificate.renew + - domain.certificate.renew.failed + - domain.created + - domain.dns.records.changed + - domain.renewal + - domain.renewal.failed + - domain.transfer-in.completed + - domain.transfer-in.failed + - domain.transfer-in.started + - edge-config.created + - edge-config.deleted + - edge-config.items.updated + - firewall.attack + - firewall.custom-rule-anomaly + - firewall.system-rule-anomaly + - flag.created + - flag.deleted + - flag.segment.created + - flag.segment.deleted + - flag.segment.updated + - flag.updated + - function.archival-required + - function.removal-required + - integration-configuration-permission-updated + - integration-configuration-removed + - integration-configuration-scope-change-confirmed - integration-configuration.permission-upgraded - integration-configuration.removed - integration-configuration.scope-change-confirmed - - project.created - - project.removed - - deployment-checks-completed - - deployment-ready - - deployment-prepared - - deployment-error - - deployment-check-rerequested - - deployment-canceled + - integration-configuration.transferred + - integration-resource.project-connected + - integration-resource.project-disconnected + - marketplace.invoice.created + - marketplace.invoice.notpaid + - marketplace.invoice.overdue + - marketplace.invoice.paid + - marketplace.invoice.refunded + - marketplace.member.changed + - message.created + - message.deleted + - message.mentioned + - message.reaction-added + - message.reaction-removed + - message.updated + - observability.anomaly + - observability.anomaly-error + - observability.error-anomaly + - observability.usage-anomaly - project-created - project-removed - - domain-created - - deployment - - integration-configuration-permission-updated - - integration-configuration-removed - - integration-configuration-scope-change-confirmed - description: The webhooks events + - project.created + - project.domain.created + - project.domain.deleted + - project.domain.moved + - project.domain.unverified + - project.domain.updated + - project.domain.verified + - project.env-variable.created + - project.env-variable.deleted + - project.env-variable.updated + - project.removed + - project.renamed + - project.rolling-release.aborted + - project.rolling-release.approved + - project.rolling-release.completed + - project.rolling-release.started + - test-webhook + - thread.resolved + - thread.unresolved example: deployment.created + description: The webhooks events + x-speakeasy-enums: + budget.reached: BudgetReached + domain.created: DomainCreated + domain.dns.records.changed: DomainDnsRecordsChanged + domain.transfer-in.started: DomainTransferInStarted + domain.transfer-in.completed: DomainTransferInCompleted + domain.transfer-in.failed: DomainTransferInFailed + domain.certificate.add: DomainCertificateAdd + domain.certificate.add.failed: DomainCertificateAddFailed + domain.certificate.renew: DomainCertificateRenew + domain.certificate.renew.failed: DomainCertificateRenewFailed + domain.certificate.deleted: DomainCertificateDeleted + domain.renewal: DomainRenewal + domain.renewal.failed: DomainRenewalFailed + domain.auto-renew.changed: DomainAutoRenewChanged + deployment.created: DeploymentCreated + deployment.cleanup: DeploymentCleanup + deployment.error: DeploymentError + deployment.canceled: DeploymentCanceled + deployment.succeeded: DeploymentSucceeded + deployment.ready: DeploymentReady + deployment.check-rerequested: DeploymentCheckRerequested + deployment.promoted: DeploymentPromoted + deployment.integration.action.start: DeploymentIntegrationActionStart + deployment.integration.action.cancel: DeploymentIntegrationActionCancel + deployment.integration.action.cleanup: DeploymentIntegrationActionCleanup + deployment.checkrun.start: DeploymentCheckrunStart + deployment.checkrun.cancel: DeploymentCheckrunCancel + edge-config.created: EdgeConfigCreated + edge-config.deleted: EdgeConfigDeleted + edge-config.items.updated: EdgeConfigItemsUpdated + firewall.attack: FirewallAttack + integration-configuration.permission-upgraded: IntegrationConfigurationPermissionUpgraded + integration-configuration.removed: IntegrationConfigurationRemoved + integration-configuration.scope-change-confirmed: IntegrationConfigurationScopeChangeConfirmed + integration-resource.project-connected: IntegrationResourceProjectConnected + integration-resource.project-disconnected: IntegrationResourceProjectDisconnected + project.created: ProjectCreated + project.removed: ProjectRemoved + project.domain.created: ProjectDomainCreated + project.domain.updated: ProjectDomainUpdated + project.domain.deleted: ProjectDomainDeleted + project.domain.verified: ProjectDomainVerified + project.domain.unverified: ProjectDomainUnverified + project.domain.moved: ProjectDomainMoved + project.rolling-release.started: ProjectRollingReleaseStarted + project.rolling-release.aborted: ProjectRollingReleaseAborted + project.rolling-release.completed: ProjectRollingReleaseCompleted + project.rolling-release.approved: ProjectRollingReleaseApproved + deployment.checks.failed: DeploymentChecksFailed + deployment.checks.succeeded: DeploymentChecksSucceeded + deployment-checks-completed: DeploymentChecksCompleted + deployment-ready: DeploymentReadyHyphen + deployment-prepared: DeploymentPreparedHyphen + deployment-error: DeploymentErrorHyphen + deployment-check-rerequested: DeploymentCheckRerequestedHyphen + deployment-canceled: DeploymentCanceledHyphen + project-created: ProjectCreatedHyphen + project-removed: ProjectRemovedHyphen + domain-created: DomainCreatedHyphen + deployment: Deployment + integration-configuration-permission-updated: IntegrationConfigurationPermissionUpdatedHyphen + integration-configuration-removed: IntegrationConfigurationRemovedHyphen + integration-configuration-scope-change-confirmed: IntegrationConfigurationScopeChangeConfirmedHyphen + marketplace.invoice.created: MarketplaceInvoiceCreated + marketplace.invoice.paid: MarketplaceInvoicePaid + marketplace.invoice.notpaid: MarketplaceInvoiceNotpaid + marketplace.invoice.refunded: MarketplaceInvoiceRefunded + observability.anomaly: ObservabilityAnomaly + observability.anomaly-error: ObservabilityAnomalyError + test-webhook: TestWebhook type: array description: The webhooks events example: deployment.created @@ -126,7 +226,7 @@ paths: url: type: string description: A string with the URL of the webhook - example: 'https://my-webhook.com' + example: https://my-webhook.com ownerId: type: string description: The unique ID of the team the webhook belongs to @@ -147,27 +247,35 @@ paths: example: - prj_12HKQaOmR5t5Uy6vdcQsNIiZgHGB required: - - secret + - createdAt - events - id - - url - ownerId - - createdAt + - secret - updatedAt + - url type: object '400': description: One of the provided values in the request body is invalid. '401': - description: '' + description: The request is not authorized. '403': description: You do not have permission to access this resource. + '410': + description: '' parameters: - - description: The Team identifier or slug to perform the request on behalf of. + - description: The Team identifier to perform the request on behalf of. in: query name: teamId - required: true schema: type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug requestBody: content: application/json: @@ -180,7 +288,7 @@ paths: properties: url: format: uri - pattern: '^https?://' + pattern: ^https?:// type: string events: minItems: 1 @@ -190,17 +298,67 @@ paths: enum: - budget.reached - domain.created + - domain.dns.records.changed + - domain.transfer-in.started + - domain.transfer-in.completed + - domain.transfer-in.failed + - domain.certificate.add + - domain.certificate.add.failed + - domain.certificate.renew + - domain.certificate.renew.failed + - domain.certificate.deleted + - domain.renewal + - domain.renewal.failed + - domain.auto-renew.changed - deployment.created + - deployment.build-requested + - deployment.cleanup - deployment.error + - deployment.blocked - deployment.canceled - deployment.succeeded - deployment.ready - deployment.check-rerequested + - deployment.promoted + - deployment.rollback + - deployment.integration.action.start + - deployment.integration.action.cancel + - deployment.integration.action.cleanup + - deployment.checkrun.start + - deployment.checkrun.cancel + - edge-config.created + - edge-config.deleted + - edge-config.items.updated + - firewall.attack + - firewall.system-rule-anomaly + - firewall.custom-rule-anomaly + - function.archival-required + - function.removal-required + - alerts.triggered - integration-configuration.permission-upgraded - integration-configuration.removed - integration-configuration.scope-change-confirmed + - integration-configuration.transferred + - integration-resource.project-connected + - integration-resource.project-disconnected - project.created - project.removed + - project.renamed + - project.env-variable.created + - project.env-variable.updated + - project.env-variable.deleted + - project.domain.created + - project.domain.updated + - project.domain.deleted + - project.domain.verified + - project.domain.unverified + - project.domain.moved + - project.rolling-release.started + - project.rolling-release.aborted + - project.rolling-release.completed + - project.rolling-release.approved + - deployment.checks.failed + - deployment.checks.succeeded - deployment-checks-completed - deployment-ready - deployment-prepared @@ -214,13 +372,121 @@ paths: - integration-configuration-permission-updated - integration-configuration-removed - integration-configuration-scope-change-confirmed + - marketplace.member.changed + - marketplace.invoice.created + - marketplace.invoice.paid + - marketplace.invoice.notpaid + - marketplace.invoice.overdue + - marketplace.invoice.refunded + - ai-gateway.balance-depleted + - ai-gateway.auto-reload.limit-reached + - observability.anomaly + - observability.anomaly-error + - observability.usage-anomaly + - observability.error-anomaly + - botid.anomaly + - flag.created + - flag.updated + - flag.deleted + - flag.segment.created + - flag.segment.updated + - flag.segment.deleted + - test-webhook + - message.created + - message.updated + - message.deleted + - thread.resolved + - thread.unresolved + - message.reaction-added + - message.reaction-removed + - message.mentioned + - comment.created + - comment.updated + - comment.deleted + - comment.resolved + - comment.unresolved + - comment.reaction-added + - comment.reaction-removed + - comment.mentioned + x-speakeasy-enums: + budget.reached: BudgetReached + domain.created: DomainCreated + domain.dns.records.changed: DomainDnsRecordsChanged + domain.transfer-in.started: DomainTransferInStarted + domain.transfer-in.completed: DomainTransferInCompleted + domain.transfer-in.failed: DomainTransferInFailed + domain.certificate.add: DomainCertificateAdd + domain.certificate.add.failed: DomainCertificateAddFailed + domain.certificate.renew: DomainCertificateRenew + domain.certificate.renew.failed: DomainCertificateRenewFailed + domain.certificate.deleted: DomainCertificateDeleted + domain.renewal: DomainRenewal + domain.renewal.failed: DomainRenewalFailed + domain.auto-renew.changed: DomainAutoRenewChanged + deployment.created: DeploymentCreated + deployment.cleanup: DeploymentCleanup + deployment.error: DeploymentError + deployment.canceled: DeploymentCanceled + deployment.succeeded: DeploymentSucceeded + deployment.ready: DeploymentReady + deployment.check-rerequested: DeploymentCheckRerequested + deployment.promoted: DeploymentPromoted + deployment.integration.action.start: DeploymentIntegrationActionStart + deployment.integration.action.cancel: DeploymentIntegrationActionCancel + deployment.integration.action.cleanup: DeploymentIntegrationActionCleanup + deployment.checkrun.start: DeploymentCheckrunStart + deployment.checkrun.cancel: DeploymentCheckrunCancel + edge-config.created: EdgeConfigCreated + edge-config.deleted: EdgeConfigDeleted + edge-config.items.updated: EdgeConfigItemsUpdated + firewall.attack: FirewallAttack + integration-configuration.permission-upgraded: IntegrationConfigurationPermissionUpgraded + integration-configuration.removed: IntegrationConfigurationRemoved + integration-configuration.scope-change-confirmed: IntegrationConfigurationScopeChangeConfirmed + integration-resource.project-connected: IntegrationResourceProjectConnected + integration-resource.project-disconnected: IntegrationResourceProjectDisconnected + project.created: ProjectCreated + project.removed: ProjectRemoved + project.domain.created: ProjectDomainCreated + project.domain.updated: ProjectDomainUpdated + project.domain.deleted: ProjectDomainDeleted + project.domain.verified: ProjectDomainVerified + project.domain.unverified: ProjectDomainUnverified + project.domain.moved: ProjectDomainMoved + project.rolling-release.started: ProjectRollingReleaseStarted + project.rolling-release.aborted: ProjectRollingReleaseAborted + project.rolling-release.completed: ProjectRollingReleaseCompleted + project.rolling-release.approved: ProjectRollingReleaseApproved + deployment.checks.failed: DeploymentChecksFailed + deployment.checks.succeeded: DeploymentChecksSucceeded + deployment-checks-completed: DeploymentChecksCompleted + deployment-ready: DeploymentReadyHyphen + deployment-prepared: DeploymentPreparedHyphen + deployment-error: DeploymentErrorHyphen + deployment-check-rerequested: DeploymentCheckRerequestedHyphen + deployment-canceled: DeploymentCanceledHyphen + project-created: ProjectCreatedHyphen + project-removed: ProjectRemovedHyphen + domain-created: DomainCreatedHyphen + deployment: Deployment + integration-configuration-permission-updated: IntegrationConfigurationPermissionUpdatedHyphen + integration-configuration-removed: IntegrationConfigurationRemovedHyphen + integration-configuration-scope-change-confirmed: IntegrationConfigurationScopeChangeConfirmedHyphen + marketplace.invoice.created: MarketplaceInvoiceCreated + marketplace.invoice.paid: MarketplaceInvoicePaid + marketplace.invoice.notpaid: MarketplaceInvoiceNotpaid + marketplace.invoice.refunded: MarketplaceInvoiceRefunded + observability.anomaly: ObservabilityAnomaly + observability.anomaly-error: ObservabilityAnomalyError + test-webhook: TestWebhook projectIds: minItems: 1 maxItems: 50 type: array items: - pattern: '^[a-zA-z0-9_]+$' + pattern: ^[a-zA-z0-9_]+$ type: string + required: true get: description: Get a list of webhooks operationId: getWebhooks @@ -235,234 +501,34 @@ paths: content: application/json: schema: - oneOf: - - items: - properties: - projectsMetadata: - nullable: true - items: - properties: - id: - type: string - name: - type: string - framework: - nullable: true - type: string - enum: - - blitzjs - - nextjs - - gatsby - - remix - - astro - - hexo - - eleventy - - docusaurus-2 - - docusaurus - - preact - - solidstart - - dojo - - ember - - vue - - scully - - ionic-angular - - angular - - polymer - - svelte - - sveltekit - - sveltekit-1 - - ionic-react - - create-react-app - - gridsome - - umijs - - sapper - - saber - - stencil - - nuxtjs - - redwoodjs - - hugo - - jekyll - - brunch - - middleman - - zola - - hydrogen - - vite - - vitepress - - vuepress - - parcel - - sanity - - storybook - latestDeployment: - type: string - required: - - id - - name - type: object - type: array - events: - items: - type: string - enum: - - budget.reached - - domain.created - - deployment.created - - deployment.error - - deployment.canceled - - deployment.succeeded - - deployment.ready - - deployment.check-rerequested - - integration-configuration.permission-upgraded - - integration-configuration.removed - - integration-configuration.scope-change-confirmed - - project.created - - project.removed - - deployment-checks-completed - - deployment-ready - - deployment-prepared - - deployment-error - - deployment-check-rerequested - - deployment-canceled - - project-created - - project-removed - - domain-created - - deployment - - integration-configuration-permission-updated - - integration-configuration-removed - - integration-configuration-scope-change-confirmed - description: The webhooks events - example: deployment.created - type: array - description: The webhooks events - example: deployment.created - id: - type: string - description: The webhook id - example: account_hook_GflD6EYyo7F4ViYS - url: - type: string - description: A string with the URL of the webhook - example: 'https://my-webhook.com' - ownerId: - type: string - description: The unique ID of the team the webhook belongs to - example: ZspSRT4ljIEEmMHgoDwKWDei - createdAt: - type: number - description: A number containing the date when the webhook was created in in milliseconds - example: 1567024758130 - updatedAt: - type: number - description: A number containing the date when the webhook was updated in in milliseconds - example: 1567024758130 - projectIds: - items: - type: string - type: array - description: The ID of the projects the webhook is associated with - example: - - prj_12HKQaOmR5t5Uy6vdcQsNIiZgHGB - required: - - projectsMetadata - - events - - id - - url - - ownerId - - createdAt - - updatedAt - type: object - type: array - - items: - properties: - events: - items: - type: string - enum: - - budget.reached - - domain.created - - deployment.created - - deployment.error - - deployment.canceled - - deployment.succeeded - - deployment.ready - - deployment.check-rerequested - - integration-configuration.permission-upgraded - - integration-configuration.removed - - integration-configuration.scope-change-confirmed - - project.created - - project.removed - - deployment-checks-completed - - deployment-ready - - deployment-prepared - - deployment-error - - deployment-check-rerequested - - deployment-canceled - - project-created - - project-removed - - domain-created - - deployment - - integration-configuration-permission-updated - - integration-configuration-removed - - integration-configuration-scope-change-confirmed - description: The webhooks events - example: deployment.created - type: array - description: The webhooks events - example: deployment.created - id: - type: string - description: The webhook id - example: account_hook_GflD6EYyo7F4ViYS - url: - type: string - description: A string with the URL of the webhook - example: 'https://my-webhook.com' - ownerId: - type: string - description: The unique ID of the team the webhook belongs to - example: ZspSRT4ljIEEmMHgoDwKWDei - createdAt: - type: number - description: A number containing the date when the webhook was created in in milliseconds - example: 1567024758130 - updatedAt: - type: number - description: A number containing the date when the webhook was updated in in milliseconds - example: 1567024758130 - projectIds: - items: - type: string - type: array - description: The ID of the projects the webhook is associated with - example: - - prj_12HKQaOmR5t5Uy6vdcQsNIiZgHGB - required: - - events - - id - - url - - ownerId - - createdAt - - updatedAt - type: object - type: array + $ref: '#/components/schemas/GetWebhooksResponse' '400': description: One of the provided values in the request query is invalid. '401': - description: '' + description: The request is not authorized. '403': description: You do not have permission to access this resource. + '410': + description: '' parameters: - name: projectId in: query schema: - pattern: '^[a-zA-z0-9_]+$' + pattern: ^[a-zA-z0-9_]+$ type: string - - description: The Team identifier or slug to perform the request on behalf of. + - description: The Team identifier to perform the request on behalf of. in: query name: teamId - required: true schema: type: string - '/v1/webhooks/{id}': + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug + /v1/webhooks/{id}: get: description: Get a webhook operationId: getWebhook @@ -478,38 +544,199 @@ paths: application/json: schema: properties: + alertRuleIds: + items: + type: string + type: array events: items: type: string enum: + - ai-gateway.auto-reload.limit-reached + - ai-gateway.balance-depleted + - alerts.triggered + - botid.anomaly - budget.reached - - domain.created + - comment.created + - comment.deleted + - comment.mentioned + - comment.reaction-added + - comment.reaction-removed + - comment.resolved + - comment.unresolved + - comment.updated + - deployment + - deployment-canceled + - deployment-check-rerequested + - deployment-checks-completed + - deployment-error + - deployment-prepared + - deployment-ready + - deployment.blocked + - deployment.build-requested + - deployment.canceled + - deployment.check-rerequested + - deployment.checkrun.cancel + - deployment.checkrun.start + - deployment.checks.failed + - deployment.checks.succeeded + - deployment.cleanup - deployment.created - deployment.error - - deployment.canceled - - deployment.succeeded + - deployment.integration.action.cancel + - deployment.integration.action.cleanup + - deployment.integration.action.start + - deployment.promoted - deployment.ready - - deployment.check-rerequested + - deployment.rollback + - deployment.succeeded + - domain-created + - domain.auto-renew.changed + - domain.certificate.add + - domain.certificate.add.failed + - domain.certificate.deleted + - domain.certificate.renew + - domain.certificate.renew.failed + - domain.created + - domain.dns.records.changed + - domain.renewal + - domain.renewal.failed + - domain.transfer-in.completed + - domain.transfer-in.failed + - domain.transfer-in.started + - edge-config.created + - edge-config.deleted + - edge-config.items.updated + - firewall.attack + - firewall.custom-rule-anomaly + - firewall.system-rule-anomaly + - flag.created + - flag.deleted + - flag.segment.created + - flag.segment.deleted + - flag.segment.updated + - flag.updated + - function.archival-required + - function.removal-required + - integration-configuration-permission-updated + - integration-configuration-removed + - integration-configuration-scope-change-confirmed - integration-configuration.permission-upgraded - integration-configuration.removed - integration-configuration.scope-change-confirmed - - project.created - - project.removed - - deployment-checks-completed - - deployment-ready - - deployment-prepared - - deployment-error - - deployment-check-rerequested - - deployment-canceled + - integration-configuration.transferred + - integration-resource.project-connected + - integration-resource.project-disconnected + - marketplace.invoice.created + - marketplace.invoice.notpaid + - marketplace.invoice.overdue + - marketplace.invoice.paid + - marketplace.invoice.refunded + - marketplace.member.changed + - message.created + - message.deleted + - message.mentioned + - message.reaction-added + - message.reaction-removed + - message.updated + - observability.anomaly + - observability.anomaly-error + - observability.error-anomaly + - observability.usage-anomaly - project-created - project-removed - - domain-created - - deployment - - integration-configuration-permission-updated - - integration-configuration-removed - - integration-configuration-scope-change-confirmed - description: The webhooks events + - project.created + - project.domain.created + - project.domain.deleted + - project.domain.moved + - project.domain.unverified + - project.domain.updated + - project.domain.verified + - project.env-variable.created + - project.env-variable.deleted + - project.env-variable.updated + - project.removed + - project.renamed + - project.rolling-release.aborted + - project.rolling-release.approved + - project.rolling-release.completed + - project.rolling-release.started + - test-webhook + - thread.resolved + - thread.unresolved example: deployment.created + description: The webhooks events + x-speakeasy-enums: + budget.reached: BudgetReached + domain.created: DomainCreated + domain.dns.records.changed: DomainDnsRecordsChanged + domain.transfer-in.started: DomainTransferInStarted + domain.transfer-in.completed: DomainTransferInCompleted + domain.transfer-in.failed: DomainTransferInFailed + domain.certificate.add: DomainCertificateAdd + domain.certificate.add.failed: DomainCertificateAddFailed + domain.certificate.renew: DomainCertificateRenew + domain.certificate.renew.failed: DomainCertificateRenewFailed + domain.certificate.deleted: DomainCertificateDeleted + domain.renewal: DomainRenewal + domain.renewal.failed: DomainRenewalFailed + domain.auto-renew.changed: DomainAutoRenewChanged + deployment.created: DeploymentCreated + deployment.cleanup: DeploymentCleanup + deployment.error: DeploymentError + deployment.canceled: DeploymentCanceled + deployment.succeeded: DeploymentSucceeded + deployment.ready: DeploymentReady + deployment.check-rerequested: DeploymentCheckRerequested + deployment.promoted: DeploymentPromoted + deployment.integration.action.start: DeploymentIntegrationActionStart + deployment.integration.action.cancel: DeploymentIntegrationActionCancel + deployment.integration.action.cleanup: DeploymentIntegrationActionCleanup + deployment.checkrun.start: DeploymentCheckrunStart + deployment.checkrun.cancel: DeploymentCheckrunCancel + edge-config.created: EdgeConfigCreated + edge-config.deleted: EdgeConfigDeleted + edge-config.items.updated: EdgeConfigItemsUpdated + firewall.attack: FirewallAttack + integration-configuration.permission-upgraded: IntegrationConfigurationPermissionUpgraded + integration-configuration.removed: IntegrationConfigurationRemoved + integration-configuration.scope-change-confirmed: IntegrationConfigurationScopeChangeConfirmed + integration-resource.project-connected: IntegrationResourceProjectConnected + integration-resource.project-disconnected: IntegrationResourceProjectDisconnected + project.created: ProjectCreated + project.removed: ProjectRemoved + project.domain.created: ProjectDomainCreated + project.domain.updated: ProjectDomainUpdated + project.domain.deleted: ProjectDomainDeleted + project.domain.verified: ProjectDomainVerified + project.domain.unverified: ProjectDomainUnverified + project.domain.moved: ProjectDomainMoved + project.rolling-release.started: ProjectRollingReleaseStarted + project.rolling-release.aborted: ProjectRollingReleaseAborted + project.rolling-release.completed: ProjectRollingReleaseCompleted + project.rolling-release.approved: ProjectRollingReleaseApproved + deployment.checks.failed: DeploymentChecksFailed + deployment.checks.succeeded: DeploymentChecksSucceeded + deployment-checks-completed: DeploymentChecksCompleted + deployment-ready: DeploymentReadyHyphen + deployment-prepared: DeploymentPreparedHyphen + deployment-error: DeploymentErrorHyphen + deployment-check-rerequested: DeploymentCheckRerequestedHyphen + deployment-canceled: DeploymentCanceledHyphen + project-created: ProjectCreatedHyphen + project-removed: ProjectRemovedHyphen + domain-created: DomainCreatedHyphen + deployment: Deployment + integration-configuration-permission-updated: IntegrationConfigurationPermissionUpdatedHyphen + integration-configuration-removed: IntegrationConfigurationRemovedHyphen + integration-configuration-scope-change-confirmed: IntegrationConfigurationScopeChangeConfirmedHyphen + marketplace.invoice.created: MarketplaceInvoiceCreated + marketplace.invoice.paid: MarketplaceInvoicePaid + marketplace.invoice.notpaid: MarketplaceInvoiceNotpaid + marketplace.invoice.refunded: MarketplaceInvoiceRefunded + observability.anomaly: ObservabilityAnomaly + observability.anomaly-error: ObservabilityAnomalyError + test-webhook: TestWebhook type: array description: The webhooks events example: deployment.created @@ -520,7 +747,7 @@ paths: url: type: string description: A string with the URL of the webhook - example: 'https://my-webhook.com' + example: https://my-webhook.com ownerId: type: string description: The unique ID of the team the webhook belongs to @@ -541,31 +768,39 @@ paths: example: - prj_12HKQaOmR5t5Uy6vdcQsNIiZgHGB required: + - createdAt - events - id - - url - ownerId - - createdAt - updatedAt + - url type: object '400': description: One of the provided values in the request query is invalid. '401': - description: '' + description: The request is not authorized. '403': description: You do not have permission to access this resource. + '410': + description: '' parameters: - name: id in: path required: true schema: type: string - - description: The Team identifier or slug to perform the request on behalf of. + - description: The Team identifier to perform the request on behalf of. in: query name: teamId - required: true schema: type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug delete: description: Deletes a webhook operationId: deleteWebhook @@ -580,18 +815,423 @@ paths: '400': description: One of the provided values in the request query is invalid. '401': - description: '' + description: The request is not authorized. '403': description: You do not have permission to access this resource. + '410': + description: '' parameters: - name: id in: path required: true schema: type: string - - description: The Team identifier or slug to perform the request on behalf of. + - description: The Team identifier to perform the request on behalf of. in: query name: teamId - required: true schema: type: string + example: team_1a2b3c4d5e6f7g8h9i0j1k2l + - description: The Team slug to perform the request on behalf of. + in: query + name: slug + schema: + type: string + example: my-team-url-slug +components: + schemas: + GetWebhooksResponse: + type: object + properties: + webhooks: + type: array + items: + properties: + projectsMetadata: + nullable: true + items: + properties: + id: + type: string + name: + type: string + framework: + nullable: true + type: string + enum: + - actix-web + - angular + - ash + - astro + - axum + - blitzjs + - brunch + - bun + - container + - create-react-app + - django + - docusaurus + - docusaurus-2 + - dojo + - eleventy + - elysia + - ember + - eve + - express + - factory-eve + - fastapi + - fasthtml + - fastify + - flask + - gatsby + - go + - gridsome + - h3 + - hexo + - hono + - hugo + - hydrogen + - ionic-angular + - ionic-react + - jekyll + - koa + - mastra + - middleman + - nestjs + - nextjs + - nitro + - node + - nuxtjs + - parcel + - polymer + - preact + - python + - react-router + - redwoodjs + - remix + - ruby + - rust + - saber + - sanity + - sanity-v2 + - sapper + - scully + - services + - solidstart + - solidstart-1 + - stencil + - storybook + - svelte + - sveltekit + - sveltekit-1 + - tanstack-start + - tanstack-start-lovable + - umijs + - vite + - vitepress + - vue + - vuepress + - xmcp + - zola + - null + latestDeployment: + type: string + required: + - id + - name + type: object + type: array + alertRuleIds: + items: + type: string + type: array + events: + items: + type: string + enum: + - ai-gateway.auto-reload.limit-reached + - ai-gateway.balance-depleted + - alerts.triggered + - botid.anomaly + - budget.reached + - comment.created + - comment.deleted + - comment.mentioned + - comment.reaction-added + - comment.reaction-removed + - comment.resolved + - comment.unresolved + - comment.updated + - deployment + - deployment-canceled + - deployment-check-rerequested + - deployment-checks-completed + - deployment-error + - deployment-prepared + - deployment-ready + - deployment.blocked + - deployment.build-requested + - deployment.canceled + - deployment.check-rerequested + - deployment.checkrun.cancel + - deployment.checkrun.start + - deployment.checks.failed + - deployment.checks.succeeded + - deployment.cleanup + - deployment.created + - deployment.error + - deployment.integration.action.cancel + - deployment.integration.action.cleanup + - deployment.integration.action.start + - deployment.promoted + - deployment.ready + - deployment.rollback + - deployment.succeeded + - domain-created + - domain.auto-renew.changed + - domain.certificate.add + - domain.certificate.add.failed + - domain.certificate.deleted + - domain.certificate.renew + - domain.certificate.renew.failed + - domain.created + - domain.dns.records.changed + - domain.renewal + - domain.renewal.failed + - domain.transfer-in.completed + - domain.transfer-in.failed + - domain.transfer-in.started + - edge-config.created + - edge-config.deleted + - edge-config.items.updated + - firewall.attack + - firewall.custom-rule-anomaly + - firewall.system-rule-anomaly + - flag.created + - flag.deleted + - flag.segment.created + - flag.segment.deleted + - flag.segment.updated + - flag.updated + - function.archival-required + - function.removal-required + - integration-configuration-permission-updated + - integration-configuration-removed + - integration-configuration-scope-change-confirmed + - integration-configuration.permission-upgraded + - integration-configuration.removed + - integration-configuration.scope-change-confirmed + - integration-configuration.transferred + - integration-resource.project-connected + - integration-resource.project-disconnected + - marketplace.invoice.created + - marketplace.invoice.notpaid + - marketplace.invoice.overdue + - marketplace.invoice.paid + - marketplace.invoice.refunded + - marketplace.member.changed + - message.created + - message.deleted + - message.mentioned + - message.reaction-added + - message.reaction-removed + - message.updated + - observability.anomaly + - observability.anomaly-error + - observability.error-anomaly + - observability.usage-anomaly + - project-created + - project-removed + - project.created + - project.domain.created + - project.domain.deleted + - project.domain.moved + - project.domain.unverified + - project.domain.updated + - project.domain.verified + - project.env-variable.created + - project.env-variable.deleted + - project.env-variable.updated + - project.removed + - project.renamed + - project.rolling-release.aborted + - project.rolling-release.approved + - project.rolling-release.completed + - project.rolling-release.started + - test-webhook + - thread.resolved + - thread.unresolved + example: deployment.created + description: The webhooks events + x-speakeasy-enums: + budget.reached: BudgetReached + domain.created: DomainCreated + domain.dns.records.changed: DomainDnsRecordsChanged + domain.transfer-in.started: DomainTransferInStarted + domain.transfer-in.completed: DomainTransferInCompleted + domain.transfer-in.failed: DomainTransferInFailed + domain.certificate.add: DomainCertificateAdd + domain.certificate.add.failed: DomainCertificateAddFailed + domain.certificate.renew: DomainCertificateRenew + domain.certificate.renew.failed: DomainCertificateRenewFailed + domain.certificate.deleted: DomainCertificateDeleted + domain.renewal: DomainRenewal + domain.renewal.failed: DomainRenewalFailed + domain.auto-renew.changed: DomainAutoRenewChanged + deployment.created: DeploymentCreated + deployment.cleanup: DeploymentCleanup + deployment.error: DeploymentError + deployment.canceled: DeploymentCanceled + deployment.succeeded: DeploymentSucceeded + deployment.ready: DeploymentReady + deployment.check-rerequested: DeploymentCheckRerequested + deployment.promoted: DeploymentPromoted + deployment.integration.action.start: DeploymentIntegrationActionStart + deployment.integration.action.cancel: DeploymentIntegrationActionCancel + deployment.integration.action.cleanup: DeploymentIntegrationActionCleanup + deployment.checkrun.start: DeploymentCheckrunStart + deployment.checkrun.cancel: DeploymentCheckrunCancel + edge-config.created: EdgeConfigCreated + edge-config.deleted: EdgeConfigDeleted + edge-config.items.updated: EdgeConfigItemsUpdated + firewall.attack: FirewallAttack + integration-configuration.permission-upgraded: IntegrationConfigurationPermissionUpgraded + integration-configuration.removed: IntegrationConfigurationRemoved + integration-configuration.scope-change-confirmed: IntegrationConfigurationScopeChangeConfirmed + integration-resource.project-connected: IntegrationResourceProjectConnected + integration-resource.project-disconnected: IntegrationResourceProjectDisconnected + project.created: ProjectCreated + project.removed: ProjectRemoved + project.domain.created: ProjectDomainCreated + project.domain.updated: ProjectDomainUpdated + project.domain.deleted: ProjectDomainDeleted + project.domain.verified: ProjectDomainVerified + project.domain.unverified: ProjectDomainUnverified + project.domain.moved: ProjectDomainMoved + project.rolling-release.started: ProjectRollingReleaseStarted + project.rolling-release.aborted: ProjectRollingReleaseAborted + project.rolling-release.completed: ProjectRollingReleaseCompleted + project.rolling-release.approved: ProjectRollingReleaseApproved + deployment.checks.failed: DeploymentChecksFailed + deployment.checks.succeeded: DeploymentChecksSucceeded + deployment-checks-completed: DeploymentChecksCompleted + deployment-ready: DeploymentReadyHyphen + deployment-prepared: DeploymentPreparedHyphen + deployment-error: DeploymentErrorHyphen + deployment-check-rerequested: DeploymentCheckRerequestedHyphen + deployment-canceled: DeploymentCanceledHyphen + project-created: ProjectCreatedHyphen + project-removed: ProjectRemovedHyphen + domain-created: DomainCreatedHyphen + deployment: Deployment + integration-configuration-permission-updated: IntegrationConfigurationPermissionUpdatedHyphen + integration-configuration-removed: IntegrationConfigurationRemovedHyphen + integration-configuration-scope-change-confirmed: IntegrationConfigurationScopeChangeConfirmedHyphen + marketplace.invoice.created: MarketplaceInvoiceCreated + marketplace.invoice.paid: MarketplaceInvoicePaid + marketplace.invoice.notpaid: MarketplaceInvoiceNotpaid + marketplace.invoice.refunded: MarketplaceInvoiceRefunded + observability.anomaly: ObservabilityAnomaly + observability.anomaly-error: ObservabilityAnomalyError + test-webhook: TestWebhook + type: array + description: The webhooks events + example: deployment.created + id: + type: string + description: The webhook id + example: account_hook_GflD6EYyo7F4ViYS + url: + type: string + description: A string with the URL of the webhook + example: https://my-webhook.com + ownerId: + type: string + description: The unique ID of the team the webhook belongs to + example: ZspSRT4ljIEEmMHgoDwKWDei + createdAt: + type: number + description: A number containing the date when the webhook was created in in milliseconds + example: 1567024758130 + updatedAt: + type: number + description: A number containing the date when the webhook was updated in in milliseconds + example: 1567024758130 + projectIds: + items: + type: string + type: array + description: The ID of the projects the webhook is associated with + example: + - prj_12HKQaOmR5t5Uy6vdcQsNIiZgHGB + required: + - createdAt + - events + - id + - ownerId + - projectsMetadata + - updatedAt + - url + type: object + x-stackQL-resources: + webhooks: + id: vercel.webhooks.webhooks + name: webhooks + title: Webhooks + methods: + create: + config: + requestBodyTranslate: + algorithm: naive + operation: + $ref: '#/paths/~1v1~1webhooks/post' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + list: + operation: + $ref: '#/paths/~1v1~1webhooks/get' + response: + mediaType: application/json + openAPIDocKey: '200' + objectKey: $.webhooks + overrideMediaType: application/json + schema_override: + $ref: '#/components/schemas/GetWebhooksResponse' + transform: + body: |- + {{- $wrapped := printf "{\"webhooks\":%s}" . -}} + {{- $wrapped -}} + type: golang_template_text_v0.3.0 + request: + nativeCasing: camel + get: + operation: + $ref: '#/paths/~1v1~1webhooks~1{id}/get' + response: + mediaType: application/json + openAPIDocKey: '200' + request: + nativeCasing: camel + delete: + operation: + $ref: '#/paths/~1v1~1webhooks~1{id}/delete' + response: + mediaType: application/json + openAPIDocKey: '204' + request: + nativeCasing: camel + sqlVerbs: + select: + - $ref: '#/components/x-stackQL-resources/webhooks/methods/get' + - $ref: '#/components/x-stackQL-resources/webhooks/methods/list' + insert: + - $ref: '#/components/x-stackQL-resources/webhooks/methods/create' + update: [] + delete: + - $ref: '#/components/x-stackQL-resources/webhooks/methods/delete' + replace: [] +servers: + - url: https://api.vercel.com diff --git a/provider-dev/scripts/lib/csv.mjs b/provider-dev/scripts/lib/csv.mjs new file mode 100644 index 0000000..7f0fc95 --- /dev/null +++ b/provider-dev/scripts/lib/csv.mjs @@ -0,0 +1,56 @@ +// Minimal RFC 4180 CSV helpers for the mapping manifest (all_services.csv). + +export const MAPPING_COLUMNS = ['stackql_resource_name', 'stackql_method_name', 'stackql_verb', 'stackql_object_key']; + +export function rowKey(row) { + return `${row.filename}::${row.path}::${row.verb}`; +} + +function parseLine(line) { + const out = []; + let cur = ''; + let quoted = false; + for (let i = 0; i < line.length; i++) { + const ch = line[i]; + if (quoted) { + if (ch === '"') { + if (line[i + 1] === '"') { cur += '"'; i++; } else { quoted = false; } + } else { + cur += ch; + } + } else if (ch === '"') { + quoted = true; + } else if (ch === ',') { + out.push(cur); + cur = ''; + } else { + cur += ch; + } + } + out.push(cur); + return out; +} + +export function parseCsv(text) { + const lines = text.replace(/\r\n/g, '\n').split('\n').filter((l) => l.length > 0); + if (lines.length === 0) return { header: [], rows: [] }; + const header = parseLine(lines[0]); + const rows = lines.slice(1).map((l) => { + const cells = parseLine(l); + const row = {}; + header.forEach((h, i) => { row[h] = cells[i] ?? ''; }); + return row; + }); + return { header, rows }; +} + +function formatCell(v) { + const s = v == null ? '' : String(v); + return /[",\n\r]/.test(s) ? `"${s.replace(/"/g, '""')}"` : s; +} + +export function formatCsv(header, rows) { + const lines = [header.map(formatCell).join(',')]; + for (const r of rows) lines.push(header.map((h) => formatCell(r[h])).join(',')); + return lines.join('\n') + '\n'; +} diff --git a/provider-dev/scripts/merge_mappings.mjs b/provider-dev/scripts/merge_mappings.mjs new file mode 100644 index 0000000..ceb84c3 --- /dev/null +++ b/provider-dev/scripts/merge_mappings.mjs @@ -0,0 +1,82 @@ +#!/usr/bin/env node + +// Merge a fresh provider-utils `analyze` skeleton into the checked-in +// mapping manifest, provider-dev/config/all_services.csv. +// +// The checked-in CSV is the durable record of how every Vercel operation maps +// to a StackQL resource, method and SQL verb. It is never regenerated from +// scratch: a regeneration would let an upstream reshuffle silently move an +// operation to a different resource or rename a resource between provider +// versions. Instead: +// +// - rows that already exist (keyed on filename + path + HTTP verb) keep +// their stackql_* mapping columns; the descriptive columns (operationId, +// tags, description) are refreshed from the fresh analysis +// - operations new upstream are appended with blank mapping columns, so +// validate_mappings.mjs fails until a maintainer maps them +// - rows for operations no longer upstream are kept in place; they are +// reported here and fail validate_mappings.mjs until deleted deliberately +// +// Existing row order is preserved so the diff of a refresh is only the change. +// +// Usage: node provider-dev/scripts/merge_mappings.mjs [] + +import fs from 'fs'; +import path from 'path'; +import { fileURLToPath } from 'url'; +import { parseCsv, formatCsv, MAPPING_COLUMNS, rowKey } from './lib/csv.mjs'; + +const repoRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..', '..'); +const freshPath = process.argv[2]; +const manifestPath = process.argv[3] || path.join(repoRoot, 'provider-dev', 'config', 'all_services.csv'); + +if (!freshPath || !fs.existsSync(freshPath)) { + console.error('Usage: merge_mappings.mjs []'); + process.exit(1); +} + +const fresh = parseCsv(fs.readFileSync(freshPath, 'utf8')); +const existing = fs.existsSync(manifestPath) ? parseCsv(fs.readFileSync(manifestPath, 'utf8')) : { header: fresh.header, rows: [] }; + +if (fresh.header.join(',') !== existing.header.join(',')) { + console.error('merge_mappings: column layout differs between the fresh analysis and the manifest'); + console.error(` fresh: ${fresh.header.join(',')}`); + console.error(` manifest: ${existing.header.join(',')}`); + process.exit(1); +} + +const freshByKey = new Map(fresh.rows.map((r) => [rowKey(r), r])); +const out = []; +let kept = 0, refreshed = 0, added = 0; +const stale = []; + +for (const row of existing.rows) { + const k = rowKey(row); + const f = freshByKey.get(k); + if (!f) { + stale.push(row); + out.push(row); + continue; + } + const merged = { ...f }; + for (const col of MAPPING_COLUMNS) merged[col] = row[col] ?? ''; + const changed = fresh.header.some((c) => (merged[c] ?? '') !== (row[c] ?? '')); + if (changed) refreshed++; else kept++; + out.push(merged); + freshByKey.delete(k); +} +for (const f of freshByKey.values()) { + out.push({ ...f }); + added++; +} + +fs.writeFileSync(manifestPath, formatCsv(fresh.header, out)); +console.log(`merge_mappings: ${kept} unchanged, ${refreshed} refreshed, ${added} new (unmapped), ${stale.length} stale -> ${path.relative(repoRoot, manifestPath)}`); +if (added) { + console.log(' new operations (map them in the CSV, then re-run make validate-mappings):'); + for (const r of out.slice(-added)) console.log(` ${r.filename} ${r.verb.toUpperCase()} ${r.path} (${r.operationId})`); +} +if (stale.length) { + console.log(' operations no longer upstream (delete the rows once the removal is reviewed):'); + for (const r of stale) console.log(` ${r.filename} ${r.verb.toUpperCase()} ${r.path} (${r.operationId})`); +} diff --git a/provider-dev/scripts/post_process.mjs b/provider-dev/scripts/post_process.mjs new file mode 100644 index 0000000..633fd09 --- /dev/null +++ b/provider-dev/scripts/post_process.mjs @@ -0,0 +1,251 @@ +#!/usr/bin/env node + +// Post-generation pass over provider-dev/openapi/src/vercel/v00.00.00000: +// everything the provider-utils generator cannot express, derived from the +// operations themselves so the pass is deterministic and idempotent. +// +// 1. snake_case surface. `request.nativeCasing: camel` on every method, +// paired with `snake_case_aliases: true` on the provider config (set by the +// Makefile PROVIDER_CONFIG). WHERE / INSERT / EXEC keys written in +// snake_case (team_id, project_id, build_command) resolve to the camelCase +// wire names; SELECT and DESCRIBE columns present as snake aliases. +// +// 2. Pagination. Vercel pages in four dialects, all signalled by the response: +// - timestamp: ?until= (deployments, domains, teams, ...) +// - from: ?from= (projects) +// - next token: ?next= (access groups, kms, edge config backups) +// - cursor: ?cursor= (connect, feature flags, sandboxes, vcr, ai gateway) +// - page number: ?page=N until pagination.numPages (bulk redirects) +// The dialect is inferred per select method from its query parameters and +// its 200 schema, and written as a method-level `config.pagination` block. +// The token is followed until the response token is null. +// +// 3. LIMIT pushdown. Select methods whose operation accepts a `limit` query +// parameter get `config.queryParamPushdown.top` so `SELECT ... LIMIT n` +// is sent as `?limit=n` (capped at 100, Vercel's page ceiling). +// +// 4. Octet-stream request bodies (file, artifact and avatar uploads). The +// body is one `value` column whose text is sent verbatim +// (request.transform, the cloudflare Workers AI precedent). The +// hyphenated digest/size headers (x-vercel-digest, x-now-size) are +// written as x_vercel_digest / x_now_size (any-sdk aliases hyphenated +// wire names from snake_case). +// +// 5. Non-JSON success responses (application/jsonl, application/x-ndjson, +// application/stream+json, application/octet-stream). The body is +// surfaced as one row with a `contents` text column via a text template +// (the bare-array wrap machinery: overrideMediaType + schema_override + +// objectKey + transform). +// +// Validates and fails without writing on any unresolved method reference. +// Usage: node provider-dev/scripts/post_process.mjs [--verbose] + +import fs from 'fs'; +import path from 'path'; +import { fileURLToPath } from 'url'; +import yaml from 'js-yaml'; + +const repoRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..', '..'); +const servicesDir = path.join(repoRoot, 'provider-dev', 'openapi', 'src', 'vercel', 'v00.00.00000', 'services'); +const verbose = process.argv.includes('--verbose'); + +if (!fs.existsSync(servicesDir)) { + console.error(`post_process: ${servicesDir} not found - run the generate step first`); + process.exit(1); +} + +const LIMIT_MAX = 100; +const OCTET_BODY_SCHEMA = 'StackqlOctetStreamBody'; +const TEXT_RESPONSE_SCHEMA = 'StackqlTextResponse'; + +const errors = []; +const stats = { methods: 0, camel: 0, kebab: 0, pagination: {}, pushdown: 0, octetRequests: 0, textResponses: 0 }; +const detail = []; + +function decodeRef(ref) { + // '#/paths/~1v10~1projects/get' -> { path: '/v10/projects', verb: 'get' } + const m = /^#\/paths\/(.+)\/(get|post|put|patch|delete)$/.exec(ref); + if (!m) return null; + return { path: m[1].replace(/~1/g, '/').replace(/~0/g, '~'), verb: m[2] }; +} + +function deref(doc, node) { + if (node && node.$ref) { + const name = node.$ref.split('/').pop(); + return doc.components?.schemas?.[name] || node; + } + return node; +} + +function resolveParams(doc, pathItem, op) { + const raw = [...(pathItem.parameters || []), ...(op.parameters || [])]; + return raw.map((p) => (p.$ref ? doc.components?.parameters?.[p.$ref.split('/').pop()] || {} : p)); +} + +// Merge the properties of a schema and any oneOf/anyOf/allOf variants it +// carries (the normalize pass merges response variants, which can leave the +// `pagination` property itself as a oneOf of the variants' definitions). +function mergedProps(doc, node) { + const n = deref(doc, node); + if (!n) return {}; + const out = { ...(n.properties || {}) }; + for (const key of ['oneOf', 'anyOf', 'allOf']) { + for (const v of n[key] || []) Object.assign(out, mergedProps(doc, v)); + } + return out; +} + +function paginationFor(doc, queryNames, schema) { + const props = mergedProps(doc, schema); + const pag = props.pagination ? deref(doc, props.pagination) : null; + const pagProps = pag ? mergedProps(doc, pag) : {}; + const q = new Set(queryNames); + const token = (reqKey, respKey) => ({ + requestToken: { key: reqKey, location: 'query' }, + responseToken: { key: respKey, location: 'body' }, + }); + if (pag && pagProps.numPages && q.has('page')) { + return { + family: 'page_number', + config: { + algorithm: 'page_number', + requestToken: { key: 'page', location: 'query' }, + responseToken: { key: '$.pagination.page', location: 'body' }, + responseTerminator: { key: '$.pagination.numPages', location: 'body' }, + }, + }; + } + if (pag && pagProps.next) { + if (q.has('until')) return { family: 'until', config: token('until', '$.pagination.next') }; + if (q.has('from')) return { family: 'from', config: token('from', '$.pagination.next') }; + if (q.has('next')) return { family: 'next', config: token('next', '$.pagination.next') }; + if (q.has('cursor')) return { family: 'cursor', config: token('cursor', '$.pagination.next') }; + } + if (props.nextCursor && q.has('cursor')) return { family: 'cursor', config: token('cursor', '$.nextCursor') }; + if (props.cursor && q.has('cursor')) return { family: 'cursor', config: token('cursor', '$.cursor') }; + return null; +} + +function ensureSchema(doc, name, schema) { + doc.components = doc.components || {}; + doc.components.schemas = doc.components.schemas || {}; + if (!doc.components.schemas[name]) doc.components.schemas[name] = schema; +} + +const files = fs.readdirSync(servicesDir).filter((f) => f.endsWith('.yaml')).sort(); +const outputs = []; + +for (const file of files) { + const full = path.join(servicesDir, file); + const doc = yaml.load(fs.readFileSync(full, 'utf8')); + const resources = doc.components?.['x-stackQL-resources'] || {}; + + for (const [resName, res] of Object.entries(resources)) { + const selectRefs = new Set((res.sqlVerbs?.select || []).map((r) => r.$ref)); + for (const [methodName, method] of Object.entries(res.methods || {})) { + stats.methods++; + const where = `${file} ${resName}.${methodName}`; + const loc = decodeRef(method.operation?.$ref || ''); + const pathItem = loc && doc.paths?.[loc.path]; + const op = pathItem && pathItem[loc.verb]; + if (!op) { errors.push(`${where}: cannot resolve ${method.operation?.$ref}`); continue; } + + const params = resolveParams(doc, pathItem, op); + const queryNames = params.filter((p) => p.in === 'query').map((p) => p.name); + const isSelect = selectRefs.has(`#/components/x-stackQL-resources/${resName}/methods/${methodName}`); + + // 4. octet-stream request bodies, else 1. camel casing + const reqTypes = Object.keys(op.requestBody?.content || {}); + if (reqTypes.includes('application/octet-stream')) { + ensureSchema(doc, OCTET_BODY_SCHEMA, { + type: 'object', + description: 'Raw request body for octet-stream uploads: the text in `value` is sent verbatim as the request body.', + properties: { value: { type: 'string', description: 'Raw body content (sent as-is).' } }, + required: ['value'], + }); + // The operation's own body schema is the binary string; replace it + // with the one-column object so the request validator accepts a + // {"value": ...} payload and the transform emits it verbatim. + op.requestBody.content['application/octet-stream'].schema = { $ref: `#/components/schemas/${OCTET_BODY_SCHEMA}` }; + method.request = { + mediaType: 'application/octet-stream', + required: ['value'], + schema_override: { $ref: `#/components/schemas/${OCTET_BODY_SCHEMA}` }, + transform: { type: 'golang_template_json_v0.1.0', body: '{{ .value }}' }, + nativeCasing: 'camel', + }; + stats.octetRequests++; + stats.camel++; + detail.push(`octet request ${where}`); + } else { + method.request = { ...(method.request || {}), nativeCasing: 'camel' }; + stats.camel++; + } + + // 5. non-JSON success responses, and select responses whose JSON schema + // is opaque (an undeclared or free-form object such as an Edge Config + // JSON schema document or the registry root): both become one row + // with a `contents` text column. + const code = method.response?.openAPIDocKey || '200'; + const respTypes = Object.keys(op.responses?.[code]?.content || {}); + const jsonSchema = deref(doc, op.responses?.[code]?.content?.['application/json']?.schema); + const hasStructure = (s) => s && ((s.properties && Object.keys(s.properties).length > 0) || s.items || s.oneOf || s.allOf || s.anyOf); + const isOpaqueJson = respTypes.includes('application/json') && isSelect + && (!jsonSchema || (!hasStructure(jsonSchema) && (jsonSchema.type === 'string' || jsonSchema.type === 'object' || !jsonSchema.type))); + if ((respTypes.length > 0 && !respTypes.includes('application/json')) || isOpaqueJson) { + ensureSchema(doc, TEXT_RESPONSE_SCHEMA, { + type: 'object', + description: 'Wrapper for non-JSON response bodies (jsonl, ndjson, streamed json, octet-stream): one row carrying the raw body text.', + properties: { + items: { + type: 'array', + items: { type: 'object', properties: { contents: { type: 'string', description: 'Raw response body.' } } }, + }, + }, + }); + method.response = { + ...method.response, + mediaType: 'text/plain', + openAPIDocKey: code, + overrideMediaType: 'application/json', + schema_override: { $ref: `#/components/schemas/${TEXT_RESPONSE_SCHEMA}` }, + objectKey: '$.items', + transform: { type: 'golang_template_text_v0.3.0', body: '{"items":[{"contents": {{ toJson . }}}]}' }, + }; + stats.textResponses++; + detail.push(`text response ${where} (${respTypes.join('|')})`); + } + + if (!isSelect) continue; + + // 2. pagination and 3. LIMIT pushdown on select methods + const schema = deref(doc, op.responses?.[code]?.content?.['application/json']?.schema); + const pag = paginationFor(doc, queryNames, schema); + const config = { ...(method.config || {}) }; + delete config.pagination; + delete config.queryParamPushdown; + if (pag) { + config.pagination = pag.config; + stats.pagination[pag.family] = (stats.pagination[pag.family] || 0) + 1; + detail.push(`pagination/${pag.family.padEnd(11)} ${where}`); + } + if (queryNames.includes('limit')) { + config.queryParamPushdown = { top: { paramName: 'limit', maxValue: LIMIT_MAX } }; + stats.pushdown++; + } + if (Object.keys(config).length) method.config = config; else delete method.config; + } + } + outputs.push({ full, doc }); +} + +if (errors.length) { + console.error('post_process: FAILED'); + for (const e of errors) console.error(` - ${e}`); + process.exit(1); +} +for (const { full, doc } of outputs) { + fs.writeFileSync(full, yaml.dump(doc, { lineWidth: -1, noRefs: true })); +} +if (verbose) for (const d of detail.sort()) console.log(` ${d}`); +console.log(`post_process: ${stats.methods} methods across ${files.length} services; nativeCasing camel=${stats.camel} kebab=${stats.kebab}; pagination ${JSON.stringify(stats.pagination)}; limit pushdown=${stats.pushdown}; octet requests=${stats.octetRequests}; text responses=${stats.textResponses}`); diff --git a/provider-dev/scripts/pre_normalize.mjs b/provider-dev/scripts/pre_normalize.mjs new file mode 100644 index 0000000..14c8863 --- /dev/null +++ b/provider-dev/scripts/pre_normalize.mjs @@ -0,0 +1,215 @@ +#!/usr/bin/env node + +// Vercel-specific spec corrections applied to the split service specs in +// provider-dev/source BEFORE the generic provider-utils normalize pass. +// +// The published Vercel OpenAPI document (https://openapi.vercel.sh) disagrees +// with the wire in a handful of places, and several list responses are +// declared as a oneOf that mixes an opaque `{type: object}` placeholder (or a +// scalar) with the real envelope. The normalize pass merges every oneOf +// variant into one schema, so an opaque or scalar variant poisons the merged +// type (it comes out as `type: string`) and the row projector cannot latch on +// to the list key. Each correction below is backed by a live observation +// recorded in NOTES.md. +// +// Every targeted patch names the operation it expects; a missing operation +// fails the run so upstream drift is reviewed rather than silently skipped. +// The generic oneOf clean-up applies to every 2xx response schema. +// +// Idempotent - safe to re-run. Usage: node provider-dev/scripts/pre_normalize.mjs + +import fs from 'fs'; +import path from 'path'; +import { fileURLToPath } from 'url'; +import yaml from 'js-yaml'; + +const repoRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..', '..'); +const sourceDir = path.join(repoRoot, 'provider-dev', 'source'); + +const errors = []; +const stats = { targeted: 0, variantsDropped: 0, paramsDropped: 0, collisionOps: [], filesChanged: 0 }; + +function findOperation(doc, operationId) { + for (const [p, item] of Object.entries(doc.paths || {})) { + for (const verb of ['get', 'post', 'put', 'patch', 'delete']) { + const op = item?.[verb]; + if (op && op.operationId === operationId) return { path: p, verb, op }; + } + } + return null; +} + +function successSchema(op) { + const res = op.responses?.['200'] || op.responses?.['201']; + const content = res?.content?.['application/json']; + return content ? content : null; +} + +function isStructured(v) { + return !!(v && (v.$ref || (v.properties && Object.keys(v.properties).length > 0) || v.type === 'array' || v.allOf || v.oneOf || v.anyOf)); +} + +// Targeted corrections: operationId -> (content) => void. `content` is the +// `application/json` media object of the 2xx response (has `.schema`). +const TARGETED = { + // GET /v1/global-config returns a bare array of Global Config (Edge Config) + // objects; the spec declares a single object. Observed live: `[]`. + getEdgeConfigs: (content) => { + if (content.schema.type !== 'array') content.schema = { type: 'array', items: content.schema }; + }, + // GET /v1/global-config/{id}/tokens returns an array of tokens; the spec + // declares a single $ref GlobalConfigToken. + getEdgeConfigTokens: (content) => { + if (content.schema.type !== 'array') content.schema = { type: 'array', items: content.schema }; + }, + // GET /v1/log-drains: oneOf [array, {drains}]; the wire is the bare array. + // Observed live: `[]`. + getAllLogDrains: (content) => { + const s = content.schema; + if (s.oneOf) { + const arr = s.oneOf.find((v) => v.type === 'array'); + if (!arr) { errors.push('getAllLogDrains: no array variant found'); return; } + content.schema = arr; + } + }, + // GET /v1/webhooks and GET /v1/integrations/configurations: oneOf of two + // near-identical array variants; keep the first. Observed live: `[]`. + getWebhooks: (content) => { + const s = content.schema; + if (s.oneOf && s.oneOf.every((v) => v.type === 'array')) content.schema = s.oneOf[0]; + }, + getConfigurations: (content) => { + const s = content.schema; + if (s.oneOf && s.oneOf.every((v) => v.type === 'array')) content.schema = s.oneOf[0]; + }, + // GET /v10/projects: oneOf [legacy bare array, {projects, pagination} x2]; + // the wire is the envelope. Observed live: `{"projects":[],"pagination":...}`. + getProjects: (content) => { + const s = content.schema; + if (s.oneOf) { + const kept = s.oneOf.filter((v) => v.type !== 'array'); + if (kept.length === 0) { errors.push('getProjects: no envelope variant found'); return; } + s.oneOf = kept; + } + }, + // GET /v1/microfrontends/groups is declared as an opaque object. Observed + // live: {"groups":[],"maxMicrofrontendsGroupsPerTeam":1,"maxMicrofrontendsPerGroup":2}. + getMicrofrontendsGroups: (content) => { + const s = content.schema; + if (!s.properties) { + content.schema = { + type: 'object', + properties: { + groups: { type: 'array', items: { type: 'object', additionalProperties: true } }, + maxMicrofrontendsGroupsPerTeam: { type: 'number' }, + maxMicrofrontendsPerGroup: { type: 'number' }, + }, + }; + } + }, +}; + +// Generic: a request body property that shares its name with a query +// parameter of the same operation (Vercel's team `slug` alias on +// createEdgeConfig, createFlag, patchTeam, ...; `teamId` on stageRedirects) +// is ambiguous for the naive body translation - the value binds to the query +// parameter and the body goes out empty (observed as a 415 on +// POST /v1/global-config). The query parameter is dropped on those +// operations: `teamId` remains the team scope on every one of them except +// stageRedirects / repository permissions, where the body carries it. +function collectBodyProps(doc, schema, depth = 0) { + const s = schema && schema.$ref ? doc.components?.schemas?.[schema.$ref.split('/').pop()] : schema; + if (!s || depth > 2) return []; + let out = Object.keys(s.properties || {}); + for (const key of ['oneOf', 'anyOf', 'allOf']) { + for (const v of s[key] || []) out = out.concat(collectBodyProps(doc, v, depth + 1)); + } + return out; +} + +function dropCollidingQueryParams(doc, file) { + for (const [p, item] of Object.entries(doc.paths || {})) { + for (const verb of ['post', 'put', 'patch', 'delete']) { + const op = item?.[verb]; + const body = op?.requestBody?.content?.['application/json']?.schema; + if (!body) continue; + const props = new Set(collectBodyProps(doc, body)); + const before = (op.parameters || []).length; + op.parameters = (op.parameters || []).filter((prm) => { + const resolved = prm.$ref ? doc.components?.parameters?.[prm.$ref.split('/').pop()] : prm; + return !(resolved && resolved.in === 'query' && props.has(resolved.name)); + }); + const dropped = before - op.parameters.length; + if (dropped) { + stats.paramsDropped += dropped; + stats.collisionOps.push(`${file}:${op.operationId}`); + } + } + } +} + +// Generic: at the top level of a 2xx JSON response schema, drop oneOf +// variants that carry no structure (an opaque `{type: object}` placeholder or +// a scalar) when at least one structured variant remains. +function cleanVariants(schema, label) { + if (!schema || !Array.isArray(schema.oneOf)) return; + const structured = schema.oneOf.filter(isStructured); + if (structured.length === 0 || structured.length === schema.oneOf.length) return; + stats.variantsDropped += schema.oneOf.length - structured.length; + schema.oneOf = structured; + if (schema.oneOf.length === 1) { + const only = schema.oneOf[0]; + delete schema.oneOf; + Object.assign(schema, only); + } +} + +const files = fs.readdirSync(sourceDir).filter((f) => f.endsWith('.yaml')); +const seenTargets = new Set(); +for (const file of files) { + const full = path.join(sourceDir, file); + const before = fs.readFileSync(full, 'utf8'); + const doc = yaml.load(before); + + for (const [opId, patch] of Object.entries(TARGETED)) { + const found = findOperation(doc, opId); + if (!found) continue; + seenTargets.add(opId); + const content = successSchema(found.op); + if (!content || !content.schema) { errors.push(`${file}: ${opId} has no application/json 2xx schema`); continue; } + patch(content); + stats.targeted++; + } + + dropCollidingQueryParams(doc, file); + + for (const [p, item] of Object.entries(doc.paths || {})) { + for (const verb of ['get', 'post', 'put', 'patch', 'delete']) { + const op = item?.[verb]; + if (!op) continue; + for (const [code, res] of Object.entries(op.responses || {})) { + if (!code.startsWith('2')) continue; + const content = res?.content?.['application/json']; + if (content?.schema) cleanVariants(content.schema, `${file} ${verb.toUpperCase()} ${p} ${code}`); + } + } + } + + const after = yaml.dump(doc, { lineWidth: -1, noRefs: true }); + if (after !== before) { + fs.writeFileSync(full, after); + stats.filesChanged++; + } +} + +for (const opId of Object.keys(TARGETED)) { + if (!seenTargets.has(opId)) errors.push(`expected operation ${opId} not found in any service spec (upstream drift - review the patch)`); +} + +if (errors.length) { + console.error('pre_normalize: FAILED'); + for (const e of errors) console.error(` - ${e}`); + process.exit(1); +} +console.log(`pre_normalize: ${stats.targeted} targeted correction(s), ${stats.variantsDropped} opaque/scalar oneOf variant(s) dropped, ${stats.paramsDropped} colliding query parameter(s) dropped on ${stats.collisionOps.length} operation(s), ${stats.filesChanged} file(s) changed`); +if (stats.collisionOps.length) console.log(` collisions resolved: ${stats.collisionOps.join(', ')}`); diff --git a/provider-dev/scripts/record_spec_pin.mjs b/provider-dev/scripts/record_spec_pin.mjs new file mode 100644 index 0000000..098f430 --- /dev/null +++ b/provider-dev/scripts/record_spec_pin.mjs @@ -0,0 +1,82 @@ +#!/usr/bin/env node + +// Helper for bin/fetch-spec.sh: validate the downloaded Vercel OpenAPI +// document, compare it with the recorded pin, and (unless --check mode) +// move it into place and rewrite provider-dev/config/spec_pin.json. +// +// Environment (set by fetch-spec.sh): CHECK, TMP_FILE, DOWNLOAD_DIR, +// PIN_FILE, SPEC_URL, SPEC_FILE. + +import crypto from 'crypto'; +import fs from 'fs'; +import path from 'path'; + +const { CHECK, TMP_FILE, DOWNLOAD_DIR, PIN_FILE, SPEC_URL, SPEC_FILE } = process.env; +const check = CHECK === 'true'; + +const raw = fs.readFileSync(TMP_FILE, 'utf8'); +let doc; +try { + doc = JSON.parse(raw); +} catch (err) { + console.error(`fetch-spec: downloaded document is not valid JSON: ${err.message}`); + process.exit(1); +} +if (!doc.openapi || !doc.paths || !doc.info) { + console.error('fetch-spec: downloaded document does not look like an OpenAPI document (missing openapi / info / paths)'); + process.exit(1); +} + +const VERBS = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options']; +let operations = 0; +const tags = new Set(); +for (const item of Object.values(doc.paths)) { + for (const verb of VERBS) { + const op = item?.[verb]; + if (!op) continue; + operations++; + for (const t of op.tags || []) tags.add(t); + } +} + +const sha256 = crypto.createHash('sha256').update(raw).digest('hex'); +const pin = { + source: SPEC_URL, + file: `provider-dev/downloaded/${SPEC_FILE}`, + fetched_at: new Date().toISOString().slice(0, 10), + openapi: doc.openapi, + stated_version: doc.info.version || null, + paths: Object.keys(doc.paths).length, + operations, + tags: tags.size, + sha256, + bytes: Buffer.byteLength(raw), +}; + +let previous = null; +if (fs.existsSync(PIN_FILE)) { + try { previous = JSON.parse(fs.readFileSync(PIN_FILE, 'utf8')); } catch { previous = null; } +} + +console.log(`fetch-spec: openapi ${pin.openapi}, stated version ${pin.stated_version}, ${pin.paths} paths, ${pin.operations} operations, ${pin.tags} tags, sha256 ${sha256.slice(0, 12)}...`); + +if (previous) { + if (previous.sha256 === sha256) { + console.log(`fetch-spec: matches the recorded pin (fetched ${previous.fetched_at})`); + } else { + console.log(`fetch-spec: DRIFT from the recorded pin (fetched ${previous.fetched_at}): paths ${previous.paths} -> ${pin.paths}, operations ${previous.operations} -> ${pin.operations}, tags ${previous.tags} -> ${pin.tags}`); + console.log('fetch-spec: run make mappings validate-mappings to surface new or removed operations'); + if (check) process.exit(1); + } +} else { + console.log('fetch-spec: no pin recorded yet'); + if (check) process.exit(1); +} + +if (check) process.exit(0); + +fs.mkdirSync(DOWNLOAD_DIR, { recursive: true }); +fs.mkdirSync(path.dirname(PIN_FILE), { recursive: true }); +fs.copyFileSync(TMP_FILE, path.join(DOWNLOAD_DIR, SPEC_FILE)); +fs.writeFileSync(PIN_FILE, JSON.stringify(pin, null, 2) + '\n'); +console.log(`fetch-spec: wrote ${path.join(DOWNLOAD_DIR, SPEC_FILE)} and ${PIN_FILE}`); diff --git a/provider-dev/scripts/svc-discriminator.mjs b/provider-dev/scripts/svc-discriminator.mjs new file mode 100644 index 0000000..9d2e483 --- /dev/null +++ b/provider-dev/scripts/svc-discriminator.mjs @@ -0,0 +1,90 @@ +// Service discriminator for the Vercel OpenAPI spec. +// +// Used by `provider-dev-utils split --svc-discriminator function`. Maps the +// first tag of each operation to a stable snake_case StackQL service name. +// Tags that are versioned duplicates of one another (checks / checks-v2, +// ai-gateway / api-ai-gateway) or that hold a single operation (logs, +// static-ips) are folded into a primary service so the service surface +// stays small and stable across upstream spec revisions. +// +// Signature: (pathKey, operationId, tags, { providerName, pathItem, operation }) +// Return a service name, or null to skip the operation. + +const TAG_TO_SERVICE = { + 'access-groups': 'access_groups', + 'ai-gateway': 'ai_gateway', + 'api-ai-gateway': 'ai_gateway', + 'aliases': 'aliases', + 'artifacts': 'artifacts', + 'authentication': 'authentication', + 'billing': 'billing', + 'bulk-redirects': 'bulk_redirects', + 'certs': 'certs', + 'checks': 'checks', + 'checks-v2': 'checks', + 'connect': 'connect', + 'deployments': 'deployments', + 'dns': 'dns', + 'domains': 'domains', + 'domains-registrar': 'domains_registrar', + 'drains': 'drains', + 'edge-cache': 'edge_cache', + 'environment': 'environments', + 'feature-flags': 'feature_flags', + 'global-config': 'edge_config', + 'integrations': 'integrations', + 'kms': 'kms', + 'logDrains': 'log_drains', + 'logs': 'deployments', + 'marketplace': 'marketplace', + 'microfrontends': 'microfrontends', + 'networking': 'networking', + 'observability': 'observability', + 'projectMembers': 'project_members', + 'project-routes': 'project_routes', + 'projects': 'projects', + 'rolling-release': 'rolling_release', + 'sandboxes': 'sandboxes', + 'security': 'security', + 'static-ips': 'networking', + 'storage': 'storage', + 'teams': 'teams', + 'user': 'user', + 'vcr': 'vcr', + 'web-analytics': 'web_analytics', + 'webhooks': 'webhooks', +}; + +// Operations tagged with more than one tag where the first tag is not the +// service we want them filed under. +const OPERATION_TO_SERVICE = { + 'exchange-sso-token': 'marketplace', +}; + +// Untagged operations are routed by path prefix. +const PATH_PREFIX_TO_SERVICE = [ + ['/domains/', 'dns'], + ['/api-keys', 'authentication'], + ['/v2/observability/', 'observability'], + ['/speed-insights/', 'web_analytics'], + ['/web/insights/', 'web_analytics'], +]; + +export default function svcDiscriminator(pathKey, operationId, tags) { + if (operationId && OPERATION_TO_SERVICE[operationId]) { + return OPERATION_TO_SERVICE[operationId]; + } + for (const tag of tags || []) { + if (TAG_TO_SERVICE[tag]) return TAG_TO_SERVICE[tag]; + } + for (const [prefix, service] of PATH_PREFIX_TO_SERVICE) { + if (pathKey.startsWith(prefix)) return service; + } + const fallback = (tags && tags[0]) ? tags[0] : null; + if (!fallback) { + console.error(`svc-discriminator: no tag for ${operationId} ${pathKey}; skipping`); + return null; + } + console.error(`svc-discriminator: unmapped tag '${fallback}' for ${operationId}; using normalized tag name`); + return fallback; +} diff --git a/provider-dev/scripts/validate_mappings.mjs b/provider-dev/scripts/validate_mappings.mjs new file mode 100644 index 0000000..a586650 --- /dev/null +++ b/provider-dev/scripts/validate_mappings.mjs @@ -0,0 +1,104 @@ +#!/usr/bin/env node + +// Validate the mapping manifest (provider-dev/config/all_services.csv) +// against the split service specs in provider-dev/source. Exit 1 on any +// violation, so `make all` stops before a provider is generated from an +// incomplete or drifted manifest: +// +// - every operation present in the source specs has a manifest row +// - every row is mapped (resource + method + verb) or marked +// skip_this_resource +// - no row refers to an operation that is no longer in the source specs +// (an upstream removal must be acknowledged by deleting the row) +// - stackql_verb is one of select / insert / update / delete / replace / exec +// - method names are unique within a resource of a service +// - stackql_object_key is only set on select methods +// - resource and method names are snake_case identifiers +// +// Usage: node provider-dev/scripts/validate_mappings.mjs [--summary] + +import fs from 'fs'; +import path from 'path'; +import { fileURLToPath } from 'url'; +import yaml from 'js-yaml'; +import { parseCsv, rowKey } from './lib/csv.mjs'; + +const repoRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..', '..'); +const manifestPath = path.join(repoRoot, 'provider-dev', 'config', 'all_services.csv'); +const sourceDir = path.join(repoRoot, 'provider-dev', 'source'); +const summary = process.argv.includes('--summary'); + +const VERBS = new Set(['select', 'insert', 'update', 'delete', 'replace', 'exec']); +const HTTP_VERBS = ['get', 'post', 'put', 'patch', 'delete']; +const IDENT = /^[a-z][a-z0-9_]*$/; + +const { rows } = parseCsv(fs.readFileSync(manifestPath, 'utf8')); +const errors = []; + +// operations present upstream (in the split specs) +const upstream = new Map(); +for (const file of fs.readdirSync(sourceDir).filter((f) => f.endsWith('.yaml'))) { + const doc = yaml.load(fs.readFileSync(path.join(sourceDir, file), 'utf8')); + for (const [p, item] of Object.entries(doc.paths || {})) { + for (const verb of HTTP_VERBS) { + const op = item?.[verb]; + if (op && op.operationId) upstream.set(`${file}::${p}::${verb}`, op.operationId); + } + } +} + +const seenKeys = new Set(); +const methodKeys = new Map(); +const perService = {}; +const verbCounts = {}; +let skipped = 0; + +for (const row of rows) { + const k = rowKey(row); + const where = `${row.filename} ${row.verb.toUpperCase()} ${row.path}`; + if (seenKeys.has(k)) errors.push(`duplicate row: ${where}`); + seenKeys.add(k); + if (!upstream.has(k)) errors.push(`stale row (operation no longer upstream): ${where} (${row.operationId})`); + + const res = row.stackql_resource_name; + const method = row.stackql_method_name; + const verb = row.stackql_verb; + if (res === 'skip_this_resource') { skipped++; continue; } + if (!res || !method || !verb) { + errors.push(`unmapped: ${where} (${row.operationId}) - set stackql_resource_name, stackql_method_name, stackql_verb`); + continue; + } + if (!IDENT.test(res)) errors.push(`resource name is not snake_case: '${res}' at ${where}`); + if (!IDENT.test(method)) errors.push(`method name is not snake_case: '${method}' at ${where}`); + if (!VERBS.has(verb)) errors.push(`invalid stackql_verb '${verb}' at ${where}`); + if (row.stackql_object_key && verb !== 'select') errors.push(`stackql_object_key set on a ${verb} method at ${where}`); + if (row.stackql_object_key && row.verb !== 'get') errors.push(`stackql_object_key only applies to GET operations (generator rule) at ${where}`); + const mk = `${row.filename}::${res}::${method}`; + if (methodKeys.has(mk)) errors.push(`duplicate method ${res}.${method} in ${row.filename} (${methodKeys.get(mk)} and ${row.operationId})`); + methodKeys.set(mk, row.operationId); + const svc = row.filename.replace(/\.yaml$/, ''); + perService[svc] = perService[svc] || new Set(); + perService[svc].add(res); + verbCounts[verb] = (verbCounts[verb] || 0) + 1; +} + +for (const [k, opId] of upstream) { + if (!seenKeys.has(k)) { + const [file, p, verb] = k.split('::'); + errors.push(`missing row for upstream operation: ${file} ${verb.toUpperCase()} ${p} (${opId}) - run make mappings`); + } +} + +if (errors.length) { + console.error(`validate_mappings: FAILED (${errors.length} problem(s))`); + for (const e of errors) console.error(` - ${e}`); + process.exit(1); +} + +const resourceTotal = Object.values(perService).reduce((n, s) => n + s.size, 0); +console.log(`validate_mappings: OK - ${rows.length} rows, ${rows.length - skipped} mapped, ${skipped} skipped, ${Object.keys(perService).length} services, ${resourceTotal} resources; verbs ${JSON.stringify(verbCounts)}`); +if (summary) { + for (const svc of Object.keys(perService).sort()) { + console.log(` ${svc}: ${[...perService[svc]].sort().join(', ')}`); + } +} diff --git a/provider-dev/source/.gitkeep b/provider-dev/source/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/tests/offline_validation.mjs b/tests/offline_validation.mjs new file mode 100644 index 0000000..ddd1f8c --- /dev/null +++ b/tests/offline_validation.mjs @@ -0,0 +1,155 @@ +#!/usr/bin/env node + +// Offline validation of the generated vercel provider against the local file +// registry - no network, no server, no credentials. Runs SHOW SERVICES / +// SHOW RESOURCES / SHOW METHODS and DESCRIBE EXTENDED over representative +// resources through `stackql exec`, and asserts the post-process extensions +// directly in the generated YAML (pagination, LIMIT pushdown, nativeCasing, +// the upload and text-response transforms). Exit 1 on any failure. +// +// Usage: node tests/offline_validation.mjs +// Binary resolution: $STACKQL, ./stackql(.exe), then `stackql` on PATH. + +import { spawn } from 'child_process'; +import fs from 'fs'; +import path from 'path'; +import { fileURLToPath } from 'url'; +import yaml from 'js-yaml'; + +const repoRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..'); +const regPath = path.join(repoRoot, 'provider-dev', 'openapi').replace(/\\/g, '/'); +const registry = JSON.stringify({ url: `file://${regPath}`, localDocRoot: regPath, verifyConfig: { nopVerify: true } }); +const servicesDir = path.join(repoRoot, 'provider-dev', 'openapi', 'src', 'vercel', 'v00.00.00000', 'services'); + +function findBinary() { + if (process.env.STACKQL && fs.existsSync(process.env.STACKQL)) return process.env.STACKQL; + for (const name of ['stackql', 'stackql.exe']) { + const local = path.join(repoRoot, name); + if (fs.existsSync(local)) return local; + } + return 'stackql'; +} +const bin = findBinary(); + +function runSql(sql) { + return new Promise((resolve) => { + const child = spawn(bin, [`--registry=${registry}`, 'exec', sql, '--output', 'json'], { cwd: repoRoot, env: { ...process.env, VERCEL_API_TOKEN: process.env.VERCEL_API_TOKEN || 'offline' } }); + let stdout = '', stderr = ''; + child.stdout.on('data', (d) => (stdout += d)); + child.stderr.on('data', (d) => (stderr += d)); + child.on('close', (code) => { + let rows = []; + try { rows = JSON.parse(stdout) ?? []; } catch { rows = []; } + resolve({ code, rows, stdout, stderr }); + }); + child.on('error', (err) => resolve({ code: -1, rows: [], stdout: '', stderr: String(err) })); + }); +} + +const results = []; +function check(name, cond, note = '') { + results.push({ name, pass: !!cond }); + console.log(` ${cond ? 'PASS' : 'FAIL'} ${name}${cond ? '' : ` [${String(note).slice(0, 200)}]`}`); +} + +const EXPECTED_SERVICES = [ + 'access_groups', 'ai_gateway', 'aliases', 'artifacts', 'authentication', 'billing', 'bulk_redirects', 'certs', 'checks', + 'connect', 'deployments', 'dns', 'domains', 'domains_registrar', 'drains', 'edge_cache', 'edge_config', 'environments', + 'feature_flags', 'integrations', 'kms', 'log_drains', 'marketplace', 'microfrontends', 'networking', 'observability', + 'project_members', 'project_routes', 'projects', 'rolling_release', 'sandboxes', 'security', 'storage', 'teams', 'user', + 'vcr', 'web_analytics', 'webhooks', +]; +const EXPECTED_RESOURCES = { + projects: ['domains', 'env_vars', 'projects', 'promote_aliases', 'traces', 'transfer_requests'], + deployments: ['deployment_events', 'deployment_files', 'deployments', 'files', 'runtime_logs'], + edge_config: ['backups', 'edge_configs', 'items', 'schema', 'tokens'], + teams: ['access_requests', 'members', 'microfrontend_groups', 'teams'], + user: ['event_types', 'events', 'user'], +}; + +console.log(`stackql: ${bin}`); +let r = await runSql('SHOW SERVICES IN vercel'); +const svcNames = r.rows.map((x) => x.name).sort(); +check(`SHOW SERVICES (${EXPECTED_SERVICES.length})`, JSON.stringify(svcNames) === JSON.stringify(EXPECTED_SERVICES), r.stderr || JSON.stringify(svcNames)); + +for (const [svc, expected] of Object.entries(EXPECTED_RESOURCES)) { + r = await runSql(`SHOW RESOURCES IN vercel.${svc}`); + const names = r.rows.map((x) => x.name).sort(); + check(`SHOW RESOURCES IN vercel.${svc} (${expected.length})`, JSON.stringify(names) === JSON.stringify(expected), r.stderr || JSON.stringify(names)); +} + +// deployments.deployments: verbs and the lifecycle exec methods +r = await runSql('SHOW METHODS IN vercel.deployments.deployments'); +let byName = Object.fromEntries(r.rows.map((m) => [m.MethodName, m])); +check('deployments.deployments verbs (list/get SELECT, create INSERT, delete DELETE, cancel EXEC)', + byName.list?.SQLVerb === 'SELECT' && byName.get?.SQLVerb === 'SELECT' && byName.create?.SQLVerb === 'INSERT' && byName.delete?.SQLVerb === 'DELETE' && byName.cancel?.SQLVerb === 'EXEC', + JSON.stringify(byName)); +check('deployments.deployments get requires id_or_url (snake_case path params)', String(byName.get?.RequiredParams || '').includes('id_or_url'), JSON.stringify(byName.get)); + +// projects.projects: lifecycle exec methods attached to the resource +r = await runSql('SHOW METHODS IN vercel.projects.projects'); +byName = Object.fromEntries(r.rows.map((m) => [m.MethodName, m])); +check('projects.projects lifecycle methods are EXEC (pause, unpause, promote, rollback)', + ['pause', 'unpause', 'promote', 'rollback'].every((m) => byName[m]?.SQLVerb === 'EXEC'), JSON.stringify(Object.keys(byName))); +check('projects.projects create requires name (naive request body translate)', String(byName.create?.RequiredParams || '').includes('name'), JSON.stringify(byName.create)); + +// files.upload: octet-stream body exposed as the `value` column +r = await runSql('SHOW METHODS IN vercel.deployments.files'); +check('deployments.files.upload is an EXEC method', r.rows.some((m) => m.MethodName === 'upload' && m.SQLVerb === 'EXEC'), JSON.stringify(r.rows)); + +// DESCRIBE EXTENDED on representative resources: snake_case column aliases +r = await runSql('DESCRIBE EXTENDED vercel.projects.projects'); +let cols = r.rows.map((c) => c.name); +check('DESCRIBE projects.projects has snake_case columns (account_id, created_at, build_command, root_directory)', + ['id', 'name', 'account_id', 'created_at', 'build_command', 'root_directory'].every((c) => cols.includes(c)), JSON.stringify(cols).slice(0, 300)); +r = await runSql('DESCRIBE EXTENDED vercel.deployments.deployments'); +cols = r.rows.map((c) => c.name); +// DESCRIBE reports the first select method (get, the more specific one); the +// list method's rows carry `uid` instead of `id` - a Vercel API quirk noted +// in the docs. +check('DESCRIBE deployments.deployments has snake_case columns (id, url, ready_state, created_at)', + ['id', 'url', 'ready_state', 'created_at'].every((c) => cols.includes(c)) && !cols.includes('pagination'), JSON.stringify(cols).slice(0, 300)); +r = await runSql('DESCRIBE EXTENDED vercel.edge_config.edge_configs'); +cols = r.rows.map((c) => c.name); +check('DESCRIBE edge_config.edge_configs (bare-array wrap) has id, slug, item_count', ['id', 'slug', 'item_count'].every((c) => cols.includes(c)), JSON.stringify(cols)); +r = await runSql('DESCRIBE EXTENDED vercel.domains_registrar.tlds'); +check('DESCRIBE domains_registrar.tlds (scalar bare-array wrap) has a column', r.rows.length > 0, r.stderr); +r = await runSql('DESCRIBE EXTENDED vercel.billing.charges'); +check('DESCRIBE billing.charges (jsonl text response) has contents', r.rows.some((c) => c.name === 'contents'), JSON.stringify(r.rows)); +r = await runSql('DESCRIBE EXTENDED vercel.user.user'); +check('DESCRIBE user.user projects $.user (username, default_team_id)', ['username', 'default_team_id'].every((c) => r.rows.some((x) => x.name === c)), JSON.stringify(r.rows.map((x) => x.name))); + +// generated-YAML assertions for the post-process extensions +function loadService(name) { + return yaml.load(fs.readFileSync(path.join(servicesDir, `${name}.yaml`), 'utf8')); +} +function method(doc, res, m) { + return doc.components['x-stackQL-resources'][res].methods[m]; +} +const dep = loadService('deployments'); +const depList = method(dep, 'deployments', 'list'); +check('deployments.list pages on $.pagination.next -> ?until', depList.config?.pagination?.requestToken?.key === 'until' && depList.config?.pagination?.responseToken?.key === '$.pagination.next', JSON.stringify(depList.config)); +check('deployments.list pushes SQL LIMIT to ?limit (max 100)', depList.config?.queryParamPushdown?.top?.paramName === 'limit' && depList.config?.queryParamPushdown?.top?.maxValue === 100, JSON.stringify(depList.config)); +check('deployments.list uses request.nativeCasing camel', depList.request?.nativeCasing === 'camel', JSON.stringify(depList.request)); +const upload = method(dep, 'files', 'upload'); +check('files.upload sends the value column as an octet-stream body', upload.request?.mediaType === 'application/octet-stream' && upload.request?.transform?.body === '{{ .value }}' && upload.request?.nativeCasing === 'camel', JSON.stringify(upload.request)); +const prj = loadService('projects'); +check('projects.list pages on $.pagination.next -> ?from', method(prj, 'projects', 'list').config?.pagination?.requestToken?.key === 'from', JSON.stringify(method(prj, 'projects', 'list').config)); +const ag = loadService('access_groups'); +check('access_groups.list pages on ?next', method(ag, 'access_groups', 'list').config?.pagination?.requestToken?.key === 'next', JSON.stringify(method(ag, 'access_groups', 'list').config)); +const conn = loadService('connect'); +check('connectors.list pages on ?cursor', method(conn, 'connectors', 'list').config?.pagination?.requestToken?.key === 'cursor', JSON.stringify(method(conn, 'connectors', 'list').config)); +const br = loadService('bulk_redirects'); +check('bulk_redirects.redirects.list uses page_number pagination', method(br, 'redirects', 'list').config?.pagination?.algorithm === 'page_number', JSON.stringify(method(br, 'redirects', 'list').config)); +const ec = loadService('edge_config'); +check('edge_configs.create has naive request body translate', method(ec, 'edge_configs', 'create').config?.requestBodyTranslate?.algorithm === 'naive', JSON.stringify(method(ec, 'edge_configs', 'create').config)); +check('edge_configs.create has no colliding team slug query param', !(ec.paths['/v1/global-config'].post.parameters || []).some((p) => p.name === 'slug'), JSON.stringify(ec.paths['/v1/global-config'].post.parameters)); +const bill = loadService('billing'); +check('billing.charges.list wraps the jsonl body as text', method(bill, 'charges', 'list').response?.mediaType === 'text/plain' && method(bill, 'charges', 'list').response?.objectKey === '$.items', JSON.stringify(method(bill, 'charges', 'list').response)); +const provider = yaml.load(fs.readFileSync(path.join(servicesDir, '..', 'provider.yaml'), 'utf8')); +check('provider.yaml: bearer auth from VERCEL_API_TOKEN and snake_case_aliases', provider.config?.auth?.type === 'bearer' && provider.config?.auth?.credentialsenvvar === 'VERCEL_API_TOKEN' && provider.config?.snake_case_aliases === true, JSON.stringify(provider.config)); +check('provider.yaml lists every service', Object.keys(provider.providerServices || {}).sort().join(',') === EXPECTED_SERVICES.join(','), Object.keys(provider.providerServices || {}).join(',')); + +const failed = results.filter((x) => !x.pass); +console.log(`\n${results.length - failed.length}/${results.length} passed`); +if (failed.length) process.exit(1); diff --git a/tests/smoke_test.mjs b/tests/smoke_test.mjs new file mode 100644 index 0000000..028c09e --- /dev/null +++ b/tests/smoke_test.mjs @@ -0,0 +1,368 @@ +#!/usr/bin/env node + +// Live smoke suite for the vercel StackQL provider, over the Postgres wire +// protocol with @stackql/pgwire-lite against a stackql server the suite +// starts itself. +// +// Exercises the operations a Vercel user reaches for first (mirroring the +// Terraform provider's headline resources: vercel_project, +// vercel_project_environment_variable, vercel_edge_config, +// vercel_edge_config_item, vercel_edge_config_token, vercel_deployment): +// +// read smokes user, teams, projects, deployments, aliases, domains, +// edge configs, API tokens, event types, supported TLDs +// lifecycle INSERT a project -> SELECT it -> UPDATE it -> +// INSERT / SELECT / UPDATE / DELETE an environment variable -> +// INSERT an edge config, UPDATE its items, SELECT items and a +// single item, INSERT a read token -> upload a hello world +// index.html (EXEC files.upload) and INSERT a production +// deployment -> poll until READY -> fetch the production alias +// over HTTPS and assert the page body -> SELECT deployment +// files and events -> DELETE the edge config and the project +// +// Everything created is named stackql-smoke-. The suite sweeps +// breadcrumbs with that prefix before it starts so a failed run cannot leave +// resources behind past the next run. Cost: a Hobby team is free (deployments +// count against the daily limit); on a Pro team the run is well under $1. +// +// Credentials come from the environment, exactly as the provider reads them: +// +// VERCEL_API_TOKEN required (the Terraform provider's variable) +// VERCEL_TEAM_ID optional; the token's default team is used otherwise. +// Vercel scopes by a teamId query parameter, so the id +// is supplied on every statement as WHERE team_id = ... +// +// Usage: +// node tests/smoke_test.mjs # local file registry (provider-dev/openapi) +// node tests/smoke_test.mjs --live # published provider from the public registry +// node tests/smoke_test.mjs --read-only # read smokes only +// node tests/smoke_test.mjs --cleanup-only # sweep breadcrumbs and exit +// node tests/smoke_test.mjs --port 5445 --stackql /path/to/stackql +// +// Never run this against a production team you care about: the sweep deletes +// every project and edge config whose name starts with stackql-smoke-. + +import { spawn } from 'child_process'; +import crypto from 'crypto'; +import fs from 'fs'; +import net from 'net'; +import path from 'path'; +import { fileURLToPath } from 'url'; +import { runQuery } from '@stackql/pgwire-lite'; + +const repoRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..'); +const SMOKE_PREFIX = 'stackql-smoke-'; +const PACE_MS = 400; +const READY_TIMEOUT_S = 180; + +// ------------------------------------------------------------------ args +const argv = process.argv.slice(2); +const flag = (name) => argv.includes(name); +const opt = (name, dflt) => { const i = argv.indexOf(name); return i !== -1 ? argv[i + 1] : dflt; }; +const args = { + live: flag('--live'), + readOnly: flag('--read-only'), + cleanupOnly: flag('--cleanup-only'), + port: parseInt(opt('--port', '5445'), 10), + stackql: opt('--stackql', null), + verbose: flag('--verbose'), +}; + +if (!process.env.VERCEL_API_TOKEN) { + console.error('VERCEL_API_TOKEN is not set (source .env or export it) - see the module docstring'); + process.exit(2); +} + +// ---------------------------------------------------------------- helpers +const sleep = (ms) => new Promise((r) => setTimeout(r, ms)); + +function findBinary() { + if (args.stackql && fs.existsSync(args.stackql)) return args.stackql; + if (process.env.STACKQL && fs.existsSync(process.env.STACKQL)) return process.env.STACKQL; + for (const name of ['stackql', 'stackql.exe']) { + const local = path.join(repoRoot, name); + if (fs.existsSync(local)) return local; + } + return 'stackql'; +} + +function waitForPort(port, timeoutMs) { + const start = Date.now(); + return new Promise((resolve, reject) => { + const attempt = () => { + const sock = net.connect({ host: '127.0.0.1', port }, () => { sock.destroy(); resolve(); }); + sock.on('error', () => { + sock.destroy(); + if (Date.now() - start > timeoutMs) reject(new Error(`stackql server did not accept connections on ${port} within ${timeoutMs}ms`)); + else setTimeout(attempt, 500); + }); + }; + attempt(); + }); +} + +class Server { + constructor(bin, port, live) { + this.bin = bin; + this.port = port; + this.live = live; + this.proc = null; + this.log = ''; + } + async start() { + const regPath = path.join(repoRoot, 'provider-dev', 'openapi').replace(/\\/g, '/'); + const argsList = []; + if (!this.live) { + argsList.push(`--registry=${JSON.stringify({ url: `file://${regPath}`, localDocRoot: regPath, verifyConfig: { nopVerify: true } })}`); + } + argsList.push(`--pgsrv.port=${this.port}`, '--pgsrv.address=127.0.0.1', 'srv'); + this.proc = spawn(this.bin, argsList, { cwd: repoRoot, env: process.env, stdio: ['ignore', 'pipe', 'pipe'] }); + this.proc.stdout.on('data', (d) => { this.log += d; }); + this.proc.stderr.on('data', (d) => { this.log += d; }); + this.proc.on('exit', (code) => { this.exited = code; }); + await waitForPort(this.port, 30000); + } + stop() { + if (this.proc && !this.exited) this.proc.kill(); + } +} + +class Smoke { + constructor(server) { + this.server = server; + this.conn = { user: 'stackql', database: 'stackql', host: '127.0.0.1', port: server.port, debug: false, statement_timeout: 120000 }; + this.stamp = String(Date.now()).slice(-6); + this.name = `${SMOKE_PREFIX}${this.stamp}`; + this.results = []; + this.statements = 0; + this.team = process.env.VERCEL_TEAM_ID || null; + } + + // run one statement; returns { rows, err }. Mutations that return no + // result set are reported by the wire as an error string - treated as ok. + async q(sql) { + this.statements++; + if (args.verbose) console.log(` > ${sql}`); + await sleep(PACE_MS); + try { + const res = await runQuery(this.conn, sql); + return { rows: res.data || [], err: null }; + } catch (e) { + const msg = String(e.message || e); + if (/didn't produce a result|despatched successfully/i.test(msg)) return { rows: [], err: null }; + return { rows: [], err: msg }; + } + } + + record(name, pass, note = '') { + this.results.push({ name, pass, note }); + console.log(` ${pass ? 'PASS' : 'FAIL'} ${name}${pass ? '' : ` [${note.slice(0, 160)}]`}`); + return pass; + } + + async step(name, sql, { expectRows = false, contains = null } = {}) { + const { rows, err } = await this.q(sql); + if (err) { this.record(name, false, err); return null; } + const blob = JSON.stringify(rows); + if (expectRows && rows.length === 0) { this.record(name, false, 'expected rows, got none'); return null; } + if (contains && !blob.includes(contains)) { this.record(name, false, `'${contains}' not in ${blob.slice(0, 120)}`); return null; } + this.record(name, true); + return rows; + } + + async waitFor(name, sql, pred, timeoutS, intervalS = 5) { + const start = Date.now(); + let last = ''; + while ((Date.now() - start) / 1000 < timeoutS) { + const { rows, err } = await this.q(sql); + last = err || JSON.stringify(rows).slice(0, 160); + if (!err && pred(rows)) { this.record(name, true, `${Math.round((Date.now() - start) / 1000)}s`); return rows; } + await sleep(intervalS * 1000); + } + this.record(name, false, `timeout: ${last}`); + return null; + } + + get T() { return this.team; } + + // --------------------------------------------------------------- setup + async resolveTeam() { + if (this.team) return; + const { rows, err } = await this.q('SELECT default_team_id FROM vercel.user.user'); + if (err || !rows.length || !rows[0].default_team_id) { + console.error(`cannot resolve a team: set VERCEL_TEAM_ID (${err || 'no default team on the token'})`); + process.exit(2); + } + this.team = rows[0].default_team_id; + } + + async pullIfLive() { + if (!this.server.live) return; + const { err } = await this.q('REGISTRY PULL vercel'); + if (err) { console.error(`REGISTRY PULL vercel failed: ${err}`); process.exit(2); } + } + + // ------------------------------------------------------------ breadcrumbs + async cleanupBreadcrumbs() { + console.log('== breadcrumb sweep =='); + const { rows: ecs, err: e1 } = await this.q(`SELECT id, slug FROM vercel.edge_config.edge_configs WHERE team_id = '${this.T}'`); + if (e1) console.log(` WARN edge config list failed: ${e1.slice(0, 120)}`); + for (const r of ecs) { + if (String(r.slug || '').startsWith(SMOKE_PREFIX)) { + console.log(` sweeping edge config ${r.slug}`); + await this.q(`DELETE FROM vercel.edge_config.edge_configs WHERE edge_config_id = '${r.id}' AND team_id = '${this.T}'`); + } + } + const { rows: prjs, err: e2 } = await this.q(`SELECT id, name FROM vercel.projects.projects WHERE team_id = '${this.T}'`); + if (e2) console.log(` WARN project list failed: ${e2.slice(0, 120)}`); + for (const r of prjs) { + if (String(r.name || '').startsWith(SMOKE_PREFIX)) { + console.log(` sweeping project ${r.name}`); + await this.q(`DELETE FROM vercel.projects.projects WHERE id_or_name = '${r.id}' AND team_id = '${this.T}'`); + } + } + } + + // -------------------------------------------------------------- reads + async readSmokes() { + console.log('== read smokes =='); + const T = this.T; + await this.step('SHOW SERVICES IN vercel', 'SHOW SERVICES IN vercel', { expectRows: true, contains: 'projects' }); + await this.step('user (objectKey $.user)', 'SELECT id, username, email, default_team_id FROM vercel.user.user', { expectRows: true, contains: 'username' }); + await this.step('teams', 'SELECT id, slug, name FROM vercel.teams.teams', { expectRows: true, contains: T }); + await this.step('team get', `SELECT id, slug, name, created_at FROM vercel.teams.teams WHERE team_id = '${T}'`, { expectRows: true, contains: T }); + await this.step('team members', `SELECT uid, email, role, confirmed FROM vercel.teams.members WHERE team_id = '${T}'`, { expectRows: true }); + await this.step('projects list', `SELECT id, name, framework, created_at FROM vercel.projects.projects WHERE team_id = '${T}'`); + await this.step('deployments list', `SELECT uid, url, ready_state, created_at FROM vercel.deployments.deployments WHERE team_id = '${T}'`); + await this.step('aliases list', `SELECT alias, deployment_id, created_at FROM vercel.aliases.aliases WHERE team_id = '${T}'`); + await this.step('domains list', `SELECT name, verified, created_at FROM vercel.domains.domains WHERE team_id = '${T}'`); + await this.step('edge configs list (bare-array wrap)', `SELECT id, slug, item_count FROM vercel.edge_config.edge_configs WHERE team_id = '${T}'`); + await this.step('API tokens', 'SELECT id, name, type, created_at FROM vercel.authentication.tokens', { expectRows: true }); + await this.step('event types (LIMIT pushdown)', 'SELECT name, description FROM vercel.user.event_types LIMIT 3', { expectRows: true }); + await this.step('supported TLDs (scalar bare-array wrap)', 'SELECT count(*) AS n FROM vercel.domains_registrar.tlds', { expectRows: true }); + await this.step('team events (last 5)', `SELECT id, type, created_at FROM vercel.user.events WHERE team_id = '${T}' LIMIT 5`); + } + + // ------------------------------------------------------------ lifecycle + async lifecycle() { + const T = this.T; + const name = this.name; + console.log(`== lifecycle (${name}) ==`); + + // project + await this.step('project INSERT', `INSERT INTO vercel.projects.projects (team_id, name) SELECT '${T}', '${name}'`); + const rows = await this.step('project visible in list', `SELECT id, name FROM vercel.projects.projects WHERE team_id = '${T}'`, { expectRows: true, contains: name }); + const project = rows?.find((r) => r.name === name); + if (!project) { this.record('project id resolved', false, 'not in list'); return; } + const pid = project.id; + this.record('project id resolved', true); + // NOTE: within one `stackql srv` session the first select method used on + // a resource fixes its physical table (drm getTableName is keyed on + // provider.service.resource + discovery generation, not the method), so + // a `get` after a `list` on a resource whose two response shapes differ + // (projects, deployments) returns no rows over the wire. Reads below + // stay on the list method for those resources; see NOTES.md. + // dev_command is inert for the static deployment below (a build_command + // would make Vercel run a build and fail for lack of an output directory) + await this.step('project UPDATE (dev_command)', `UPDATE vercel.projects.projects SET dev_command = 'echo stackql' WHERE id_or_name = '${pid}' AND team_id = '${T}'`); + await this.step('project reflects UPDATE', `SELECT id, dev_command FROM vercel.projects.projects WHERE team_id = '${T}'`, { expectRows: true, contains: 'echo stackql' }); + + try { + // environment variable + await this.step('env var INSERT', `INSERT INTO vercel.projects.env_vars (id_or_name, team_id, key, value, type, target) SELECT '${pid}', '${T}', 'SMOKE_KEY', 'smoke-value', 'plain', '["production","preview"]'`); + const envs = await this.step('env var visible', `SELECT id, key, value, target FROM vercel.projects.env_vars WHERE id_or_name = '${pid}' AND team_id = '${T}'`, { expectRows: true, contains: 'SMOKE_KEY' }); + const env = envs?.find((r) => r.key === 'SMOKE_KEY'); + if (env) { + await this.step('env var get', `SELECT key, value FROM vercel.projects.env_vars WHERE id_or_name = '${pid}' AND id = '${env.id}' AND team_id = '${T}'`, { expectRows: true, contains: 'smoke-value' }); + await this.step('env var UPDATE', `UPDATE vercel.projects.env_vars SET value = 'smoke-value-2' WHERE id_or_name = '${pid}' AND id = '${env.id}' AND team_id = '${T}'`); + await this.step('env var reflects UPDATE', `SELECT value FROM vercel.projects.env_vars WHERE id_or_name = '${pid}' AND id = '${env.id}' AND team_id = '${T}'`, { expectRows: true, contains: 'smoke-value-2' }); + await this.step('env var DELETE', `DELETE FROM vercel.projects.env_vars WHERE id_or_name = '${pid}' AND id = '${env.id}' AND team_id = '${T}'`); + const after = await this.step('env var gone', `SELECT id FROM vercel.projects.env_vars WHERE id_or_name = '${pid}' AND team_id = '${T}'`); + if (after) this.record('env var not in list after DELETE', !after.some((r) => r.id === env.id), JSON.stringify(after)); + } + + // edge config (Hobby teams allow one; the sweep keeps the slot free) + await this.step('edge config INSERT', `INSERT INTO vercel.edge_config.edge_configs (team_id, slug) SELECT '${T}', '${name}'`); + const ecs = await this.step('edge config visible', `SELECT id, slug FROM vercel.edge_config.edge_configs WHERE team_id = '${T}'`, { expectRows: true, contains: name }); + const ec = ecs?.find((r) => r.slug === name); + if (ec) { + await this.step('edge config items UPDATE (upsert two items)', `UPDATE vercel.edge_config.items SET items = '[{"operation":"upsert","key":"greeting","value":"hello"},{"operation":"upsert","key":"flags","value":{"featureA":true}}]' WHERE edge_config_id = '${ec.id}' AND team_id = '${T}'`); + await this.step('edge config items list', `SELECT key, value FROM vercel.edge_config.items WHERE edge_config_id = '${ec.id}' AND team_id = '${T}'`, { expectRows: true, contains: 'greeting' }); + await this.step('edge config item get', `SELECT key, value FROM vercel.edge_config.items WHERE edge_config_id = '${ec.id}' AND edge_config_item_key = 'greeting' AND team_id = '${T}'`, { expectRows: true, contains: 'hello' }); + await this.step('edge config token INSERT', `INSERT INTO vercel.edge_config.tokens (edge_config_id, team_id, label) SELECT '${ec.id}', '${T}', 'smoke read token'`); + await this.step('edge config tokens list', `SELECT id, label FROM vercel.edge_config.tokens WHERE edge_config_id = '${ec.id}' AND team_id = '${T}'`, { expectRows: true, contains: 'smoke read token' }); + await this.step('edge config DELETE', `DELETE FROM vercel.edge_config.edge_configs WHERE edge_config_id = '${ec.id}' AND team_id = '${T}'`); + } + + // hello world deployment + const html = `${name}

Hello World from StackQL

${name}

`; + const sha = crypto.createHash('sha1').update(html).digest('hex'); + const size = Buffer.byteLength(html); + await this.step('hello world upload (EXEC files.upload, octet-stream)', `EXEC vercel.deployments.files.upload @team_id = '${T}', @x_vercel_digest = '${sha}', @value = '${html}'`); + await this.step('deployment INSERT (production)', `INSERT INTO vercel.deployments.deployments (team_id, name, project, files, target, project_settings) SELECT '${T}', '${name}', '${pid}', '[{"file":"index.html","sha":"${sha}","size":${size}}]', 'production', '{"framework": null}'`); + const deps = await this.step('deployment visible in list', `SELECT uid, url, ready_state FROM vercel.deployments.deployments WHERE team_id = '${T}' AND project_id = '${pid}'`, { expectRows: true }); + const dep = deps?.[0]; + if (dep) { + await this.waitFor('deployment READY', `SELECT uid, ready_state FROM vercel.deployments.deployments WHERE team_id = '${T}' AND project_id = '${pid}'`, (r) => r.some((x) => x.uid === dep.uid && x.ready_state === 'READY'), READY_TIMEOUT_S); + const url = `https://${name}.vercel.app`; + let body = ''; + try { + for (let i = 0; i < 6 && !body.includes('Hello World from StackQL'); i++) { + const res = await fetch(url, { redirect: 'follow' }); + body = await res.text(); + if (!body.includes('Hello World from StackQL')) await sleep(5000); + } + } catch (e) { body = String(e); } + this.record(`production alias serves the page (${url})`, body.includes('Hello World from StackQL'), body.slice(0, 120)); + // the file tree's top level is the `src` directory holding index.html + await this.step('deployment files (bare-array wrap)', `SELECT name, type FROM vercel.deployments.deployment_files WHERE id = '${dep.uid}' AND team_id = '${T}'`, { expectRows: true, contains: 'src' }); + await this.step('deployment events', `SELECT type, created FROM vercel.deployments.deployment_events WHERE id_or_url = '${dep.uid}' AND team_id = '${T}'`); + await this.step('deployment aliases', `SELECT alias FROM vercel.aliases.aliases WHERE team_id = '${T}'`, { expectRows: true, contains: `${name}.vercel.app` }); + // lifecycle EXEC methods on the project (snake_case path and query variables) + await this.step('project EXEC pause', `EXEC vercel.projects.projects.pause @project_id = '${pid}', @team_id = '${T}'`); + await this.step('project reflects pause', `SELECT id, paused FROM vercel.projects.projects WHERE team_id = '${T}'`, { expectRows: true, contains: '"paused":"true"' }); + await this.step('project EXEC unpause', `EXEC vercel.projects.projects.unpause @project_id = '${pid}', @team_id = '${T}'`); + } + } finally { + await this.step('project DELETE (cascades deployments)', `DELETE FROM vercel.projects.projects WHERE id_or_name = '${pid}' AND team_id = '${T}'`); + const left = await this.step('project gone', `SELECT id FROM vercel.projects.projects WHERE team_id = '${T}'`); + if (left) this.record('project not in list after DELETE', !left.some((r) => r.id === pid), JSON.stringify(left)); + } + } + + summary() { + console.log('\n== summary =='); + const failed = this.results.filter((r) => !r.pass); + for (const r of failed) console.log(` FAIL ${r.name} [${r.note.slice(0, 110)}]`); + console.log(` ${this.results.length - failed.length} passed, ${failed.length} failed; ${this.statements} statements, paced at ${PACE_MS}ms (registry: ${this.server.live ? 'public' : 'local'})`); + return failed.length ? 1 : 0; + } +} + +// ------------------------------------------------------------------ main +const bin = findBinary(); +const server = new Server(bin, args.port, args.live); +let code = 1; +try { + console.log(`vercel smoke test registry=${args.live ? 'public' : 'local'} stackql=${bin} port=${args.port}`); + await server.start(); + const smoke = new Smoke(server); + await smoke.pullIfLive(); + await smoke.resolveTeam(); + console.log(`team=${smoke.T} name=${smoke.name}`); + await smoke.cleanupBreadcrumbs(); + if (!args.cleanupOnly) { + await smoke.readSmokes(); + if (!args.readOnly) await smoke.lifecycle(); + code = smoke.summary(); + } else { + code = 0; + } +} catch (e) { + console.error(`smoke test aborted: ${e.message || e}`); + if (server.log) console.error(server.log.slice(-2000)); + code = 1; +} finally { + server.stop(); +} +process.exit(code); diff --git a/website/.gitignore b/website/.gitignore index b2d6de3..dc32d51 100644 --- a/website/.gitignore +++ b/website/.gitignore @@ -18,3 +18,6 @@ npm-debug.log* yarn-debug.log* yarn-error.log* + +# vendored shared docusaurus config (cloned at build time) +.shared-config diff --git a/website/docs/index.md b/website/docs/index.md index 2317f8a..7480b3a 100644 --- a/website/docs/index.md +++ b/website/docs/index.md @@ -1,96 +1,322 @@ ---- -title: vercel -hide_title: false -hide_table_of_contents: false -keywords: - - vercel - - stackql - - infrastructure-as-code - - configuration-as-data - - cloud inventory -description: Query, deploy, and manage Vercel resources using SQL -custom_edit_url: null -image: /img/stackql-vercel-provider-featured-image.png -id: 'provider-intro' ---- - -import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; - -Cloud platform for serverless deployment and hosting of web applications. +--- +title: vercel +hide_title: false +hide_table_of_contents: false +keywords: + - vercel + - stackql + - infrastructure-as-code + - configuration-as-data + - cloud inventory + - deployments + - edge config +description: Query, deploy and manage Vercel projects, deployments, domains, environment variables, Edge Config, teams and more using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +id: 'provider-intro' +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; + +Query, provision and operate the Vercel platform using SQL - projects, deployments (including uploading files and creating deployments), aliases, domains and DNS records, environment variables, Edge Config stores and items, teams and members, access groups, webhooks, log and trace drains, feature flags, the firewall, AI Gateway, sandboxes, the container registry and billing. The provider is generated from the published Vercel REST API OpenAPI document and covers every REST operation in it. + :::info[Provider Summary] -total services: __19__ -total resources: __59__ +total services: __38__ +total resources: __172__ ::: -See also: -[[` SHOW `]](https://stackql.io/docs/language-spec/show) [[` DESCRIBE `]](https://stackql.io/docs/language-spec/describe) [[` REGISTRY `]](https://stackql.io/docs/language-spec/registry) -* * * - -## Installation - -To pull the latest version of the `vercel` provider, run the following command: - -```bash -REGISTRY PULL vercel; -``` -> To view previous provider versions or to pull a specific provider version, see [here](https://stackql.io/docs/language-spec/registry). - -## Authentication - -The following system environment variables are used for authentication by default: - -- - Vercel API Token (see Creating a Vercel API Token) - -These variables are sourced at runtime (from the local machine or as CI variables/secrets). - -
- -Using different environment variables - -To use different environment variables (instead of the defaults), use the `--auth` flag of the `stackql` program. For example: - -```bash - -AUTH='{ "vercel": { "type": "bearer", "credentialsenvvar": "YOUR_VERCEL_API_TOKEN_VAR" }}' -stackql shell --auth="${AUTH}" - -``` -or using PowerShell: - -```powershell - -$Auth = "{ 'vercel': { 'type': 'bearer', 'credentialsenvvar': 'YOUR_VERCEL_API_TOKEN_VAR' }}" -stackql.exe shell --auth=$Auth - -``` +See also: +[[` SHOW `]](https://stackql.io/docs/language-spec/show) [[` DESCRIBE `]](https://stackql.io/docs/language-spec/describe) [[` REGISTRY `]](https://stackql.io/docs/language-spec/registry) +* * * + +## Installation + +To pull the latest version of the `vercel` provider, run the following command: + +```bash +REGISTRY PULL vercel; +``` +> To view previous provider versions or to pull a specific provider version, see [here](https://stackql.io/docs/language-spec/registry). + +## Authentication + +The following system environment variable is used for authentication by default: + +- - a Vercel API token (see [Creating an access token](https://vercel.com/docs/rest-api/reference/welcome#creating-an-access-token)); the same variable the Vercel Terraform provider reads + +The variable is sourced at runtime (from the local machine or as a CI variable/secret). Tokens are scoped to the teams you select when creating them; a token created for a Hobby account covers that account's default team. + +
+ +Using a different environment variable + +To use a different environment variable (instead of the default), use the `--auth` flag of the `stackql` program. For example: + +```bash + +AUTH='{ "vercel": { "type": "bearer", "credentialsenvvar": "MY_VERCEL_TOKEN" }}' +stackql shell --auth="${AUTH}" + +``` +or using PowerShell: + +```powershell + +$Auth = "{ 'vercel': { 'type': 'bearer', 'credentialsenvvar': 'MY_VERCEL_TOKEN' }}" +stackql.exe shell --auth=$Auth + +```
+## Team scope + +Vercel scopes almost every operation to a team through the `teamId` query parameter (`team_id` in SQL). Projects, deployments, domains, Edge Config stores, environment variables and most other resources belong to a team, and listing them without a team returns nothing, so supply the team on every statement: + +```sql +SELECT id, name, framework +FROM vercel.projects.projects +WHERE team_id = 'team_xxxxxxxxxxxxxxxxxxxxxxxx'; +``` + +Find your team ids with: + +```sql +SELECT id, slug, name FROM vercel.teams.teams; +-- or the token's default team +SELECT default_team_id FROM vercel.user.user; +``` + +A handful of resources are user-scoped and take no `team_id`: , (list), and . + +> The Vercel Terraform provider takes the team as a provider argument; keep the id in an environment variable such as for your scripts and pass it into the `WHERE` clause. StackQL does not currently default a query parameter from the environment (that mechanism applies to server URL variables only), so `team_id` is always explicit in SQL. + +## Parameter and column casing + +The Vercel API uses camelCase on the wire (`teamId`, `createdAt`, `buildCommand`). This provider presents a snake_case surface: `WHERE` parameters, `INSERT` and `UPDATE` columns and `EXEC` variables are written in snake_case and resolved to the wire names, and result columns are returned as snake_case (`created_at`, `ready_state`). Nested JSON columns keep their wire casing inside the value; use `json_extract` to reach into them. + +```sql +SELECT uid, url, ready_state, created_at, + json_extract(meta, '$.githubCommitRef') AS branch +FROM vercel.deployments.deployments +WHERE team_id = 'team_xxxxxxxxxxxxxxxxxxxxxxxx'; +``` + +## Pagination and limits + +List operations page automatically until the last page. `LIMIT n` is pushed down as the API's `limit` parameter (capped at 100, the Vercel page size ceiling), so `SELECT ... LIMIT 20` fetches one page. + +## Project inventory + +Every project in a team, with framework and the latest production deployment: + +```sql +SELECT + id, + name, + framework, + node_version, + json_extract(latest_deployments, '$[0].url') AS latest_url, + json_extract(latest_deployments, '$[0].readyState') AS latest_state, + created_at +FROM vercel.projects.projects +WHERE team_id = 'team_xxxxxxxxxxxxxxxxxxxxxxxx'; +``` + +## Deployments by state + +Deployments that failed or were cancelled recently (the list method returns `uid`; the single-deployment method returns `id`): + +```sql +SELECT uid, name, url, ready_state, target, created_at +FROM vercel.deployments.deployments +WHERE team_id = 'team_xxxxxxxxxxxxxxxxxxxxxxxx' +AND ready_state IN ('ERROR', 'CANCELED') +ORDER BY created_at DESC; +``` + +A single deployment by id or hostname: + +```sql +SELECT id, url, ready_state, ready_substate, build_command, output_directory +FROM vercel.deployments.deployments +WHERE id_or_url = 'dpl_xxxxxxxxxxxxxxxxxxxxxxxx' +AND team_id = 'team_xxxxxxxxxxxxxxxxxxxxxxxx'; +``` + +## Environment variable audit + +Every environment variable of a project, its targets and type (values of `encrypted` and `sensitive` variables are not returned): + +```sql +SELECT key, type, target, git_branch, updated_at +FROM vercel.projects.env_vars +WHERE id_or_name = 'my-project' +AND team_id = 'team_xxxxxxxxxxxxxxxxxxxxxxxx'; +``` + +## Domains and DNS + +Domains in the team and their verification state, then the DNS records of one of them: + +```sql +SELECT name, verified, service_type, expires_at, created_at +FROM vercel.domains.domains +WHERE team_id = 'team_xxxxxxxxxxxxxxxxxxxxxxxx'; + +SELECT id, name, type, value, ttl +FROM vercel.dns.records +WHERE domain = 'example.com' +AND team_id = 'team_xxxxxxxxxxxxxxxxxxxxxxxx'; +``` + +## Edge Config items + +```sql +SELECT id, slug, item_count, size_in_bytes, updated_at +FROM vercel.edge_config.edge_configs +WHERE team_id = 'team_xxxxxxxxxxxxxxxxxxxxxxxx'; + +SELECT key, value, updated_at +FROM vercel.edge_config.items +WHERE edge_config_id = 'ecfg_xxxxxxxxxxxxxxxxxxxxxxxxxxxx' +AND team_id = 'team_xxxxxxxxxxxxxxxxxxxxxxxx'; +``` + +## Team members and tokens + +```sql +SELECT uid, email, role, confirmed, created_at +FROM vercel.teams.members +WHERE team_id = 'team_xxxxxxxxxxxxxxxxxxxxxxxx'; + +SELECT id, name, type, created_at, expires_at +FROM vercel.authentication.tokens; +``` + +## Provision, mutate and tear down + +Mutations use the same SQL grammar - `INSERT` creates a resource, `UPDATE` patches it, `EXEC` invokes lifecycle methods and `DELETE` removes it. Request body fields are written as columns in snake_case; JSON values (arrays and objects) are passed as JSON text. + +A project, an environment variable and an Edge Config store end to end: + +```sql +-- create a project +INSERT INTO vercel.projects.projects (team_id, name, framework) +SELECT 'team_xxxxxxxxxxxxxxxxxxxxxxxx', 'my-project', 'nextjs'; + +-- add an environment variable for production and preview +INSERT INTO vercel.projects.env_vars (id_or_name, team_id, key, value, type, target) +SELECT 'my-project', 'team_xxxxxxxxxxxxxxxxxxxxxxxx', 'API_URL', 'https://api.example.com', 'plain', '["production", "preview"]'; + +-- change a project setting +UPDATE vercel.projects.projects +SET build_command = 'npm run build' +WHERE id_or_name = 'my-project' AND team_id = 'team_xxxxxxxxxxxxxxxxxxxxxxxx'; + +-- create an Edge Config store and upsert two items +INSERT INTO vercel.edge_config.edge_configs (team_id, slug) +SELECT 'team_xxxxxxxxxxxxxxxxxxxxxxxx', 'my-config'; + +UPDATE vercel.edge_config.items +SET items = '[{"operation": "upsert", "key": "greeting", "value": "hello"}, {"operation": "upsert", "key": "flags", "value": {"featureA": true}}]' +WHERE edge_config_id = 'ecfg_xxxxxxxxxxxxxxxxxxxxxxxxxxxx' AND team_id = 'team_xxxxxxxxxxxxxxxxxxxxxxxx'; + +-- remove them +DELETE FROM vercel.edge_config.edge_configs +WHERE edge_config_id = 'ecfg_xxxxxxxxxxxxxxxxxxxxxxxxxxxx' AND team_id = 'team_xxxxxxxxxxxxxxxxxxxxxxxx'; + +DELETE FROM vercel.projects.projects +WHERE id_or_name = 'my-project' AND team_id = 'team_xxxxxxxxxxxxxxxxxxxxxxxx'; +``` + +## Deploy a static site + +A deployment is two steps: upload each file by its SHA1 digest with the `files.upload` method (the file contents go in the `value` variable and are sent as the raw request body), then create the deployment referencing the uploaded digests. A project that is not linked to a framework needs `project_settings`. + +```sql +-- 1. upload index.html (sha1 of the exact bytes, size in bytes) +EXEC vercel.deployments.files.upload + @team_id = 'team_xxxxxxxxxxxxxxxxxxxxxxxx', + @x_vercel_digest = 'fbda2260a7c9bf8a993343caa2238cf17402918c', + @value = 'Hello

Hello World from StackQL

'; + +-- 2. create a production deployment from the uploaded file +INSERT INTO vercel.deployments.deployments (team_id, name, project, files, target, project_settings) +SELECT 'team_xxxxxxxxxxxxxxxxxxxxxxxx', 'my-project', 'my-project', + '[{"file": "index.html", "sha": "fbda2260a7c9bf8a993343caa2238cf17402918c", "size": 115}]', + 'production', '{"framework": null}'; + +-- 3. watch it become READY (the production alias is https://my-project.vercel.app) +SELECT uid, url, ready_state +FROM vercel.deployments.deployments +WHERE team_id = 'team_xxxxxxxxxxxxxxxxxxxxxxxx' AND project_id = 'prj_xxxxxxxxxxxxxxxxxxxxxxxx'; +``` + +Lifecycle operations are invoked with `EXEC`: + +```sql +-- cancel a running build +EXEC vercel.deployments.deployments.cancel + @id = 'dpl_xxxxxxxxxxxxxxxxxxxxxxxx', @team_id = 'team_xxxxxxxxxxxxxxxxxxxxxxxx'; + +-- promote a deployment to production, or roll back to one +EXEC vercel.projects.projects.promote + @project_id = 'prj_xxxxxxxxxxxxxxxxxxxxxxxx', @deployment_id = 'dpl_xxxxxxxxxxxxxxxxxxxxxxxx', @team_id = 'team_xxxxxxxxxxxxxxxxxxxxxxxx'; + +EXEC vercel.projects.projects.rollback + @project_id = 'prj_xxxxxxxxxxxxxxxxxxxxxxxx', @deployment_id = 'dpl_xxxxxxxxxxxxxxxxxxxxxxxx', @team_id = 'team_xxxxxxxxxxxxxxxxxxxxxxxx'; + +-- pause and unpause a project (needs an active production deployment) +EXEC vercel.projects.projects.pause @project_id = 'prj_xxxxxxxxxxxxxxxxxxxxxxxx', @team_id = 'team_xxxxxxxxxxxxxxxxxxxxxxxx'; +EXEC vercel.projects.projects.unpause @project_id = 'prj_xxxxxxxxxxxxxxxxxxxxxxxx', @team_id = 'team_xxxxxxxxxxxxxxxxxxxxxxxx'; +``` + + ## Services diff --git a/website/docs/services/access_groups/access_group_members/index.md b/website/docs/services/access_groups/access_group_members/index.md new file mode 100644 index 0000000..3084b75 --- /dev/null +++ b/website/docs/services/access_groups/access_group_members/index.md @@ -0,0 +1,194 @@ +--- +title: access_group_members +hide_title: false +hide_table_of_contents: false +keywords: + - access_group_members + - access_groups + - vercel + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists an access_group_members resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string
string
string (wire: createdAt)
string
string (BILLING, CONTRIBUTOR, DEVELOPER, MEMBER, OWNER, SECURITY, VIEWER, VIEWER_FOR_PLUS) (wire: teamRole)
string
string
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
id_or_namelimit, next, search, team_id, slugList members of an access group
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringThe ID or name of the Access Group.
integerLimit how many access group members should be returned.
stringContinuation cursor to retrieve the next page of results.
stringThe Team slug to perform the request on behalf of.
stringThe Team identifier to perform the request on behalf of. (wire: teamId)
+ +## `SELECT` examples + + + + +List members of an access group + +```sql +SELECT +name, +avatar, +created_at, +email, +team_role, +uid, +username +FROM vercel.access_groups.access_group_members +WHERE id_or_name = '{{ id_or_name }}' -- required +AND limit = '{{ limit }}' +AND next = '{{ next }}' +AND search = '{{ search }}' +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + diff --git a/website/docs/services/access_groups/access_group_projects/index.md b/website/docs/services/access_groups/access_group_projects/index.md new file mode 100644 index 0000000..f11915f --- /dev/null +++ b/website/docs/services/access_groups/access_group_projects/index.md @@ -0,0 +1,406 @@ +--- +title: access_group_projects +hide_title: false +hide_table_of_contents: false +keywords: + - access_group_projects + - access_groups + - vercel + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists an access_group_projects resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string (wire: accessGroupId)
string (wire: projectId)
string (wire: teamId)
string (wire: createdAt)
string (ADMIN, PROJECT_DEVELOPER, PROJECT_GUEST, PROJECT_VIEWER)
string (wire: updatedAt)
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string (wire: projectId)
string (wire: createdAt)
object
string (ADMIN, PROJECT_DEVELOPER, PROJECT_GUEST, PROJECT_VIEWER)
string (wire: updatedAt)
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
access_group_id_or_name, project_idteam_id, slugAllows reading an access group project
id_or_namelimit, next, team_id, slugList projects of an access group
access_group_id_or_name, role, project_idteam_id, slugAllows creation of an access group project
access_group_id_or_name, project_id, roleteam_id, slugAllows update of an access group project
access_group_id_or_name, project_idteam_id, slugAllows deletion of an access group project
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string
stringThe ID or name of the Access Group.
string (example: prj_ndlgr43fadlPyCtREAqxxdyFK)
integerLimit how many access group projects should be returned.
stringContinuation cursor to retrieve the next page of results.
stringThe Team slug to perform the request on behalf of.
stringThe Team identifier to perform the request on behalf of. (wire: teamId)
+ +## `SELECT` examples + + + + +Allows reading an access group project + +```sql +SELECT +access_group_id, +project_id, +team_id, +created_at, +role, +updated_at +FROM vercel.access_groups.access_group_projects +WHERE access_group_id_or_name = '{{ access_group_id_or_name }}' -- required +AND project_id = '{{ project_id }}' -- required +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + + +List projects of an access group + +```sql +SELECT +project_id, +created_at, +project, +role, +updated_at +FROM vercel.access_groups.access_group_projects +WHERE id_or_name = '{{ id_or_name }}' -- required +AND limit = '{{ limit }}' +AND next = '{{ next }}' +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + + + +## `INSERT` examples + + + + +Allows creation of an access group project + +```sql +INSERT INTO vercel.access_groups.access_group_projects ( +project_id, +role, +access_group_id_or_name, +team_id, +slug +) +SELECT +'{{ project_id }}' /* required */, +'{{ role }}' /* required */, +'{{ access_group_id_or_name }}', +'{{ team_id }}', +'{{ slug }}' +RETURNING +access_group_id, +project_id, +team_id, +created_at, +role, +updated_at +; +``` + + + +{`# Description fields are for documentation purposes +- name: access_group_projects + props: + - name: access_group_id_or_name + value: "{{ access_group_id_or_name }}" + description: Required parameter for the access_group_projects resource. + - name: project_id + value: "{{ project_id }}" + description: | + The ID of the project. + - name: role + value: "{{ role }}" + description: | + The project role that will be added to this Access Group. + valid_values: ['ADMIN', 'PROJECT_VIEWER', 'PROJECT_DEVELOPER'] + - name: team_id + value: "{{ team_id }}" + description: The Team identifier to perform the request on behalf of. + description: The Team identifier to perform the request on behalf of. + - name: slug + value: "{{ slug }}" + description: The Team slug to perform the request on behalf of. + description: The Team slug to perform the request on behalf of. +`} + + + + + +## `UPDATE` examples + + + + +Allows update of an access group project + +```sql +UPDATE vercel.access_groups.access_group_projects +SET +role = '{{ role }}' +WHERE +access_group_id_or_name = '{{ access_group_id_or_name }}' --required +AND project_id = '{{ project_id }}' --required +AND role = '{{ role }}' --required +AND team_id = '{{ team_id}}' +AND slug = '{{ slug}}' +RETURNING +access_group_id, +project_id, +team_id, +created_at, +role, +updated_at; +``` + + + + +## `DELETE` examples + + + + +Allows deletion of an access group project + +```sql +DELETE FROM vercel.access_groups.access_group_projects +WHERE access_group_id_or_name = '{{ access_group_id_or_name }}' --required +AND project_id = '{{ project_id }}' --required +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + diff --git a/website/docs/services/access_groups/access_groups/index.md b/website/docs/services/access_groups/access_groups/index.md new file mode 100644 index 0000000..5ade88b --- /dev/null +++ b/website/docs/services/access_groups/access_groups/index.md @@ -0,0 +1,505 @@ +--- +title: access_groups +hide_title: false +hide_table_of_contents: false +keywords: + - access_groups + - access_groups + - vercel + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists an access_groups resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringThe name of this access group. (example: my-access-group)
stringID of the access group. (example: ag_123a6c5209bc3778245d011443644c8d27dc2c50) (wire: accessGroupId)
stringID of the team that this access group belongs to. (example: team_123a6c5209bc3778245d011443644c8d27dc2c50) (wire: teamId)
stringTimestamp in milliseconds when the access group was created. (wire: createdAt)
array
boolean (false, true) (wire: isDsyncManaged)
numberNumber of members in the access group. (wire: membersCount)
numberNumber of projects in the access group. (wire: projectsCount)
array (wire: teamPermissions)
arrayRoles that the team has in the access group. (wire: teamRoles)
stringTimestamp in milliseconds when the access group was last updated. (wire: updatedAt)
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringThe name of this access group. (example: my-access-group)
stringID of the access group. (example: ag_123a6c5209bc3778245d011443644c8d27dc2c50) (wire: accessGroupId)
stringID of the team that this access group belongs to. (example: team_123a6c5209bc3778245d011443644c8d27dc2c50) (wire: teamId)
stringTimestamp in milliseconds when the access group was created. (wire: createdAt)
array
boolean (false, true) (wire: isDsyncManaged)
array
numberNumber of members in the access group. (wire: membersCount)
array
numberNumber of projects in the access group. (wire: projectsCount)
array (wire: teamPermissions)
arrayRoles that the team has in the access group. (wire: teamRoles)
stringTimestamp in milliseconds when the access group was last updated. (wire: updatedAt)
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
id_or_nameteam_id, slugAllows to read an access group
project_id, search, members_limit, projects_limit, limit, next, team_id, slugList access groups
nameteam_id, slugAllows to create an access group
id_or_nameteam_id, slugAllows to update an access group metadata
id_or_nameteam_id, slugAllows to delete an access group
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string
integerLimit how many access group should be returned.
integerNumber of members to include in the response. (wire: membersLimit)
stringContinuation cursor to retrieve the next page of results.
stringFilter access groups by project. (wire: projectId)
integerNumber of projects to include in the response. (wire: projectsLimit)
stringThe Team slug to perform the request on behalf of.
stringThe Team identifier to perform the request on behalf of. (wire: teamId)
+ +## `SELECT` examples + + + + +Allows to read an access group + +```sql +SELECT +name, +access_group_id, +team_id, +created_at, +entitlements, +is_dsync_managed, +members_count, +projects_count, +team_permissions, +team_roles, +updated_at +FROM vercel.access_groups.access_groups +WHERE id_or_name = '{{ id_or_name }}' -- required +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + + +List access groups + +```sql +SELECT +name, +access_group_id, +team_id, +created_at, +entitlements, +is_dsync_managed, +members, +members_count, +projects, +projects_count, +team_permissions, +team_roles, +updated_at +FROM vercel.access_groups.access_groups +WHERE project_id = '{{ project_id }}' +AND search = '{{ search }}' +AND members_limit = '{{ members_limit }}' +AND projects_limit = '{{ projects_limit }}' +AND limit = '{{ limit }}' +AND next = '{{ next }}' +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + + + +## `INSERT` examples + + + + +Allows to create an access group + +```sql +INSERT INTO vercel.access_groups.access_groups ( +name, +projects, +members_to_add, +team_id, +slug +) +SELECT +'{{ name }}' /* required */, +'{{ projects }}', +'{{ members_to_add }}', +'{{ team_id }}', +'{{ slug }}' +RETURNING +name, +access_group_id, +team_id, +created_at, +entitlements, +members_count, +projects_count, +team_permissions, +team_roles, +updated_at +; +``` + + + +{`# Description fields are for documentation purposes +- name: access_groups + props: + - name: name + value: "{{ name }}" + description: | + The name of the access group + - name: projects + value: + - projectId: "{{ projectId }}" + role: "{{ role }}" + - name: members_to_add + value: + - "{{ members_to_add }}" + description: | + List of members to add to the access group. + - name: team_id + value: "{{ team_id }}" + description: The Team identifier to perform the request on behalf of. + description: The Team identifier to perform the request on behalf of. + - name: slug + value: "{{ slug }}" + description: The Team slug to perform the request on behalf of. + description: The Team slug to perform the request on behalf of. +`} + + + + + +## `UPDATE` examples + + + + +Allows to update an access group metadata + +```sql +UPDATE vercel.access_groups.access_groups +SET +name = '{{ name }}', +projects = '{{ projects }}', +members_to_add = '{{ members_to_add }}', +members_to_remove = '{{ members_to_remove }}' +WHERE +id_or_name = '{{ id_or_name }}' --required +AND team_id = '{{ team_id}}' +AND slug = '{{ slug}}' +RETURNING +name, +access_group_id, +team_id, +created_at, +entitlements, +members_count, +projects_count, +team_permissions, +team_roles, +updated_at; +``` + + + + +## `DELETE` examples + + + + +Allows to delete an access group + +```sql +DELETE FROM vercel.access_groups.access_groups +WHERE id_or_name = '{{ id_or_name }}' --required +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + diff --git a/website/docs/services/access_groups/index.md b/website/docs/services/access_groups/index.md new file mode 100644 index 0000000..1bc237f --- /dev/null +++ b/website/docs/services/access_groups/index.md @@ -0,0 +1,34 @@ +--- +title: access_groups +hide_title: false +hide_table_of_contents: false +keywords: + - access_groups + - vercel + - stackql + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +access_groups service documentation. + +:::info[Service Summary] + +total resources: __3__ + +::: + +## Resources + \ No newline at end of file diff --git a/website/docs/services/ai_gateway/index.md b/website/docs/services/ai_gateway/index.md new file mode 100644 index 0000000..d75c0b5 --- /dev/null +++ b/website/docs/services/ai_gateway/index.md @@ -0,0 +1,33 @@ +--- +title: ai_gateway +hide_title: false +hide_table_of_contents: false +keywords: + - ai_gateway + - vercel + - stackql + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +ai_gateway service documentation. + +:::info[Service Summary] + +total resources: __2__ + +::: + +## Resources + \ No newline at end of file diff --git a/website/docs/services/ai_gateway/rules/index.md b/website/docs/services/ai_gateway/rules/index.md new file mode 100644 index 0000000..311ac1c --- /dev/null +++ b/website/docs/services/ai_gateway/rules/index.md @@ -0,0 +1,350 @@ +--- +title: rules +hide_title: false +hide_table_of_contents: false +keywords: + - rules + - ai_gateway + - vercel + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a rules resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + +Public response shape for AI Gateway routing rules. Used so OpenAPI generation can avoid ElectroDB's recursive EntityItem types. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string (wire: ownerId)
string (wire: ruleId)
object
number (wire: createdAt)
string (wire: createdBy)
boolean (false, true)
string
boolean (false, true)
object
string (deny, rewrite)
number (wire: updatedAt)
string (wire: updatedBy)
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
include_disabled, team_id, slugList the authenticated team's routing rules
team_id, slugCreate a routing rule
team_id, slugUpdate a routing rule (enabled, action, or description)
rule_idteam_id, slugDelete a routing rule (soft delete)
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string (wire: ruleId)
string (wire: includeDisabled)
stringThe Team slug to perform the request on behalf of.
stringThe Team identifier to perform the request on behalf of. (wire: teamId)
+ +## `SELECT` examples + + + + +List the authenticated team's routing rules + +```sql +SELECT +owner_id, +rule_id, +action, +created_at, +created_by, +deleted, +description, +enabled, +match, +type, +updated_at, +updated_by +FROM vercel.ai_gateway.rules +WHERE include_disabled = '{{ include_disabled }}' +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + + + +## `INSERT` examples + + + + +Create a routing rule + +```sql +INSERT INTO vercel.ai_gateway.rules ( +team_id, +slug +) +SELECT +'{{ team_id }}', +'{{ slug }}' +RETURNING +owner_id, +rule_id, +action, +created_at, +created_by, +deleted, +description, +enabled, +match, +type, +updated_at, +updated_by +; +``` + + + +{`# Description fields are for documentation purposes +- name: rules + props: + - name: team_id + value: "{{ team_id }}" + description: The Team identifier to perform the request on behalf of. + description: The Team identifier to perform the request on behalf of. + - name: slug + value: "{{ slug }}" + description: The Team slug to perform the request on behalf of. + description: The Team slug to perform the request on behalf of. +`} + + + + + +## `UPDATE` examples + + + + +Update a routing rule (enabled, action, or description) + +```sql +UPDATE vercel.ai_gateway.rules +SET +-- No updatable properties +WHERE +team_id = '{{ team_id}}' +AND slug = '{{ slug}}' +RETURNING +owner_id, +rule_id, +action, +created_at, +created_by, +deleted, +description, +enabled, +match, +type, +updated_at, +updated_by; +``` + + + + +## `DELETE` examples + + + + +Delete a routing rule (soft delete) + +```sql +DELETE FROM vercel.ai_gateway.rules +WHERE rule_id = '{{ rule_id }}' --required +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + diff --git a/website/docs/services/ai_gateway/virtual_model_configs/index.md b/website/docs/services/ai_gateway/virtual_model_configs/index.md new file mode 100644 index 0000000..953c068 --- /dev/null +++ b/website/docs/services/ai_gateway/virtual_model_configs/index.md @@ -0,0 +1,921 @@ +--- +title: virtual_model_configs +hide_title: false +hide_table_of_contents: false +keywords: + - virtual_model_configs + - ai_gateway + - vercel + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a virtual_model_configs resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + +Public response shape for virtual model configs. Used so OpenAPI generation can avoid ElectroDB's recursive EntityItem types. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringThe concrete model-provider instance this VMC resolves to. (wire: instanceId)
stringTeam (owner) that owns this VMC. (wire: ownerId)
stringHuman-readable name for UI. (wire: displayName)
booleanAllow fallback from fast to standard providers on failure. (false, true) (wire: allowFallbackFromFast)
stringFor kind=relay: URL the gateway forwards requests to as a transparent proxy. (wire: baseUrl)
arrayBYOK credential IDs allowed for this VMC. (wire: byokCredentialIds)
stringUse caching if available. (auto)
numberCreation timestamp (epoch ms). (wire: createdAt)
booleanWhether this VMC is soft-deleted. (false, true)
stringOptional description for UI.
booleanOnly use providers that will not train on your prompts. (false, true) (wire: disallowPromptTraining)
arrayLimit providers to those with these features.
booleanOnly use HIPAA-compliant providers. (false, true) (wire: hipaaCompliant)
objectRegion pinned on the VMC for system-credential routing (alias/router only). (wire: inferenceRegion)
stringVMC kind: alias, relay, or router.
stringCanonical model slug this VMC maps to (e.g. "creator/model"). Not used by kind=router. (wire: modelSlug)
arrayFor kind=router: ordered candidates, model slugs or router references. Otherwise: fallback models.
arrayObservability tags attached to requests through this VMC. (wire: observabilityTags)
arrayRestrict routing to only these providers. (wire: providerOnly)
objectArbitrary per-provider AI SDK options, keyed by gateway provider slug. (wire: providerOptions)
arrayOrdered list of providers to try as fallbacks on failure. (wire: providerOrder)
objectPer-request provider timeouts in ms, keyed by provider slug for BYOK credentials. (wire: providerTimeouts)
arrayFor kind=router: capability tags a candidate must have.
stringFor kind=router: how to order candidates. (cost, priority, tps, ttft)
stringService tier for providers that support it. (fast, flex, priority) (wire: serviceTier)
stringRank eligible providers by an attribute. (cost, latency, price, throughput, tps, ttft)
stringOnly use fastest providers with short timeouts. (fast)
stringUI lifecycle status: draft, active, or archived.
numberLast update timestamp (epoch ms). (wire: updatedAt)
stringUser id that last updated this VMC. (wire: updatedBy)
stringClient-facing alias used as the model slug in Gateway calls. (wire: virtualModelSlug)
stringVisibility in listings: public, internal, or stealth.
booleanOnly use providers with zero data retention. (false, true) (wire: zeroDataRetention)
+
+ + +Public response shape for virtual model configs. Used so OpenAPI generation can avoid ElectroDB's recursive EntityItem types. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringThe concrete model-provider instance this VMC resolves to. (wire: instanceId)
stringTeam (owner) that owns this VMC. (wire: ownerId)
stringHuman-readable name for UI. (wire: displayName)
booleanAllow fallback from fast to standard providers on failure. (false, true) (wire: allowFallbackFromFast)
stringFor kind=relay: URL the gateway forwards requests to as a transparent proxy. (wire: baseUrl)
arrayBYOK credential IDs allowed for this VMC. (wire: byokCredentialIds)
stringUse caching if available. (auto)
numberCreation timestamp (epoch ms). (wire: createdAt)
booleanWhether this VMC is soft-deleted. (false, true)
stringOptional description for UI.
booleanOnly use providers that will not train on your prompts. (false, true) (wire: disallowPromptTraining)
arrayLimit providers to those with these features.
booleanOnly use HIPAA-compliant providers. (false, true) (wire: hipaaCompliant)
objectRegion pinned on the VMC for system-credential routing (alias/router only). (wire: inferenceRegion)
stringVMC kind: alias, relay, or router.
stringCanonical model slug this VMC maps to (e.g. "creator/model"). Not used by kind=router. (wire: modelSlug)
arrayFor kind=router: ordered candidates, model slugs or router references. Otherwise: fallback models.
arrayObservability tags attached to requests through this VMC. (wire: observabilityTags)
arrayRestrict routing to only these providers. (wire: providerOnly)
objectArbitrary per-provider AI SDK options, keyed by gateway provider slug. (wire: providerOptions)
arrayOrdered list of providers to try as fallbacks on failure. (wire: providerOrder)
objectPer-request provider timeouts in ms, keyed by provider slug for BYOK credentials. (wire: providerTimeouts)
arrayFor kind=router: capability tags a candidate must have.
stringFor kind=router: how to order candidates. (cost, priority, tps, ttft)
stringService tier for providers that support it. (fast, flex, priority) (wire: serviceTier)
stringRank eligible providers by an attribute. (cost, latency, price, throughput, tps, ttft)
stringOnly use fastest providers with short timeouts. (fast)
stringUI lifecycle status: draft, active, or archived.
numberLast update timestamp (epoch ms). (wire: updatedAt)
stringUser id that last updated this VMC. (wire: updatedBy)
stringClient-facing alias used as the model slug in Gateway calls. (wire: virtualModelSlug)
stringVisibility in listings: public, internal, or stealth.
booleanOnly use providers with zero data retention. (false, true) (wire: zeroDataRetention)
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
vmc_slugowner_id, team_id, slugGet a virtual model config by path slug
owner_id, limit, cursor, team_id, slugList virtual model configs. With `ownerId`, returns all of that team's VMCs. Without it, pages through VMCs across all teams (newest-first, `limit`/`cursor`).
team_id, slugCreate a virtual model config (VMC)
vmc_slugteam_id, slugUpdate a virtual model config by path slug
team_id, slugUpdate a virtual model config
vmc_slugowner_id, updated_by, acting_ip, acting_user_agent, team_id, slugDelete a virtual model config by path slug (soft delete)
virtual_model_slugowner_id, updated_by, acting_ip, acting_user_agent, team_id, slugDelete a virtual model config (soft delete)
ownerId, virtualModelSlug, limit, cursor, teamId, slugGet a virtual model config
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string (wire: virtualModelSlug)
string
string (wire: actingIp)
string (wire: actingUserAgent)
string
integer
string
string (wire: ownerId)
stringThe Team slug to perform the request on behalf of.
stringThe Team identifier to perform the request on behalf of.
stringThe Team identifier to perform the request on behalf of. (wire: teamId)
string (wire: updatedBy)
string
+ +## `SELECT` examples + + + + +Get a virtual model config by path slug + +```sql +SELECT +instance_id, +owner_id, +display_name, +allow_fallback_from_fast, +base_url, +byok_credential_ids, +caching, +created_at, +deleted, +description, +disallow_prompt_training, +has, +hipaa_compliant, +inference_region, +kind, +model_slug, +models, +observability_tags, +provider_only, +provider_options, +provider_order, +provider_timeouts, +requires, +selector, +service_tier, +sort, +speed, +status, +updated_at, +updated_by, +virtual_model_slug, +visibility, +zero_data_retention +FROM vercel.ai_gateway.virtual_model_configs +WHERE vmc_slug = '{{ vmc_slug }}' -- required +AND owner_id = '{{ owner_id }}' +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + + +List virtual model configs. With `ownerId`, returns all of that team's VMCs. Without it, pages through VMCs across all teams (newest-first, `limit`/`cursor`). + +```sql +SELECT +instance_id, +owner_id, +display_name, +allow_fallback_from_fast, +base_url, +byok_credential_ids, +caching, +created_at, +deleted, +description, +disallow_prompt_training, +has, +hipaa_compliant, +inference_region, +kind, +model_slug, +models, +observability_tags, +provider_only, +provider_options, +provider_order, +provider_timeouts, +requires, +selector, +service_tier, +sort, +speed, +status, +updated_at, +updated_by, +virtual_model_slug, +visibility, +zero_data_retention +FROM vercel.ai_gateway.virtual_model_configs +WHERE owner_id = '{{ owner_id }}' +AND limit = '{{ limit }}' +AND cursor = '{{ cursor }}' +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + + + +## `INSERT` examples + + + + +Create a virtual model config (VMC) + +```sql +INSERT INTO vercel.ai_gateway.virtual_model_configs ( +team_id, +slug +) +SELECT +'{{ team_id }}', +'{{ slug }}' +RETURNING +instance_id, +owner_id, +display_name, +allow_fallback_from_fast, +base_url, +byok_credential_ids, +caching, +created_at, +deleted, +description, +disallow_prompt_training, +has, +hipaa_compliant, +inference_region, +kind, +model_slug, +models, +observability_tags, +provider_only, +provider_options, +provider_order, +provider_timeouts, +requires, +selector, +service_tier, +sort, +speed, +status, +updated_at, +updated_by, +virtual_model_slug, +visibility, +zero_data_retention +; +``` + + + +{`# Description fields are for documentation purposes +- name: virtual_model_configs + props: + - name: team_id + value: "{{ team_id }}" + description: The Team identifier to perform the request on behalf of. + description: The Team identifier to perform the request on behalf of. + - name: slug + value: "{{ slug }}" + description: The Team slug to perform the request on behalf of. + description: The Team slug to perform the request on behalf of. +`} + + + + + +## `UPDATE` examples + + + + +Update a virtual model config by path slug + +```sql +UPDATE vercel.ai_gateway.virtual_model_configs +SET +-- No updatable properties +WHERE +vmc_slug = '{{ vmc_slug }}' --required +AND team_id = '{{ team_id}}' +AND slug = '{{ slug}}' +RETURNING +instance_id, +owner_id, +display_name, +allow_fallback_from_fast, +base_url, +byok_credential_ids, +caching, +created_at, +deleted, +description, +disallow_prompt_training, +has, +hipaa_compliant, +inference_region, +kind, +model_slug, +models, +observability_tags, +provider_only, +provider_options, +provider_order, +provider_timeouts, +requires, +selector, +service_tier, +sort, +speed, +status, +updated_at, +updated_by, +virtual_model_slug, +visibility, +zero_data_retention; +``` + + + +Update a virtual model config + +```sql +UPDATE vercel.ai_gateway.virtual_model_configs +SET +-- No updatable properties +WHERE +team_id = '{{ team_id}}' +AND slug = '{{ slug}}' +RETURNING +instance_id, +owner_id, +display_name, +allow_fallback_from_fast, +base_url, +byok_credential_ids, +caching, +created_at, +deleted, +description, +disallow_prompt_training, +has, +hipaa_compliant, +inference_region, +kind, +model_slug, +models, +observability_tags, +provider_only, +provider_options, +provider_order, +provider_timeouts, +requires, +selector, +service_tier, +sort, +speed, +status, +updated_at, +updated_by, +virtual_model_slug, +visibility, +zero_data_retention; +``` + + + + +## `DELETE` examples + + + + +Delete a virtual model config by path slug (soft delete) + +```sql +DELETE FROM vercel.ai_gateway.virtual_model_configs +WHERE vmc_slug = '{{ vmc_slug }}' --required +AND owner_id = '{{ owner_id }}' +AND updated_by = '{{ updated_by }}' +AND acting_ip = '{{ acting_ip }}' +AND acting_user_agent = '{{ acting_user_agent }}' +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + + +Delete a virtual model config (soft delete) + +```sql +DELETE FROM vercel.ai_gateway.virtual_model_configs +WHERE virtual_model_slug = '{{ virtual_model_slug }}' --required +AND owner_id = '{{ owner_id }}' +AND updated_by = '{{ updated_by }}' +AND acting_ip = '{{ acting_ip }}' +AND acting_user_agent = '{{ acting_user_agent }}' +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + + + +## Lifecycle Methods + +EXEC variables use wire (API) names. + + + + +Get a virtual model config + +```sql +EXEC vercel.ai_gateway.virtual_model_configs.get_by_query +@ownerId='{{ ownerId }}', +@virtualModelSlug='{{ virtualModelSlug }}', +@limit='{{ limit }}', +@cursor='{{ cursor }}', +@teamId='{{ teamId }}', +@slug='{{ slug }}' +; +``` + + diff --git a/website/docs/services/aliases/aliases/index.md b/website/docs/services/aliases/aliases/index.md index 2db9e6f..8ee2b6e 100644 --- a/website/docs/services/aliases/aliases/index.md +++ b/website/docs/services/aliases/aliases/index.md @@ -15,6 +15,7 @@ image: /img/stackql-vercel-provider-featured-image.png --- import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; @@ -22,7 +23,7 @@ Creates, updates, deletes, gets or lists an aliases resource. ## Overview - +
Namealiases
Name
TypeResource
Id
@@ -32,13 +33,13 @@ Creates, updates, deletes, gets or lists an aliases resource. The following fields are returned by `SELECT` queries: - + The alias information @@ -51,6 +52,16 @@ The alias information + + + string + The deployment ID (example: dpl_5m8CQaRBm3FnWRW1od3wKTpaECPx) (wire: deploymentId) + + + + string + The unique identifier of the project (example: prj_12HKQaOmR5t5Uy6vdcQsNIiZgHGB) (wire: projectId) + string @@ -62,9 +73,9 @@ The alias information The date when the alias was created (example: 2017-04-26T23:00:34.232Z) - + number - The date when the alias was created in milliseconds since the UNIX epoch + The date when the alias was created in milliseconds since the UNIX epoch (wire: createdAt) @@ -72,9 +83,9 @@ The alias information Information of the user who created the alias - + number - The date when the alias was deleted in milliseconds since the UNIX epoch + The date when the alias was deleted in milliseconds since the UNIX epoch (wire: deletedAt) @@ -82,19 +93,14 @@ The alias information A map with the deployment ID, URL and metadata - - string - The deployment ID (example: dpl_5m8CQaRBm3FnWRW1od3wKTpaECPx) - - - - string - The unique identifier of the project (example: prj_12HKQaOmR5t5Uy6vdcQsNIiZgHGB) + + object + The microfrontends for the alias including the routing configuration - + object - The protection bypass for the alias + The protection bypass for the alias (wire: protectionBypass) @@ -102,9 +108,9 @@ The alias information Target destination domain for redirect when the alias is a redirect - + number - Status code to be used on redirect + Status code to be used on redirect (301, 302, 307, 308, ) (wire: redirectStatusCode) @@ -112,14 +118,14 @@ The alias information The unique identifier of the alias - + number - The date when the alias was updated in milliseconds since the UNIX epoch + The date when the alias was updated in milliseconds since the UNIX epoch (wire: updatedAt) - + The paginated list of aliases @@ -132,6 +138,16 @@ The paginated list of aliases + + + string + The deployment ID (example: dpl_5m8CQaRBm3FnWRW1od3wKTpaECPx) (wire: deploymentId) + + + + string + The unique identifier of the project (example: prj_12HKQaOmR5t5Uy6vdcQsNIiZgHGB) (wire: projectId) + string @@ -143,9 +159,9 @@ The paginated list of aliases The date when the alias was created (example: 2017-04-26T23:00:34.232Z) - + number - The date when the alias was created in milliseconds since the UNIX epoch + The date when the alias was created in milliseconds since the UNIX epoch (wire: createdAt) @@ -153,9 +169,9 @@ The paginated list of aliases Information of the user who created the alias - + number - The date when the alias was deleted in milliseconds since the UNIX epoch + The date when the alias was deleted in milliseconds since the UNIX epoch (wire: deletedAt) @@ -163,19 +179,14 @@ The paginated list of aliases A map with the deployment ID, URL and metadata - - string - The deployment ID (example: dpl_5m8CQaRBm3FnWRW1od3wKTpaECPx) - - - - string - The unique identifier of the project (example: prj_12HKQaOmR5t5Uy6vdcQsNIiZgHGB) + + object + The microfrontends for the alias including the routing configuration - + object - The protection bypass for the alias + The protection bypass for the alias (wire: protectionBypass) @@ -183,9 +194,9 @@ The paginated list of aliases Target destination domain for redirect when the alias is a redirect - + number - Status code to be used on redirect + Status code to be used on redirect (301, 302, 307, 308, ) (wire: redirectStatusCode) @@ -193,9 +204,9 @@ The paginated list of aliases The unique identifier of the alias - + number - The date when the alias was updated in milliseconds since the UNIX epoch + The date when the alias was updated in milliseconds since the UNIX epoch (wire: updatedAt) @@ -218,32 +229,32 @@ The following methods are available for this resource: - + - idOrAlias, teamId - from, projectId, since, until + id_or_alias + from, project_id, since, until, team_id, slug Retrieves an Alias for the given host name or alias ID. - + - teamId - domain, from, limit, projectId, since, until, rollbackDeploymentId + + domain, from, limit, project_id, since, until, rollback_deployment_id, team_id, slug Retrieves a list of aliases for the authenticated User or Team. When `domain` is provided, only aliases for that domain will be returned. When `projectId` is provided, it will only return the given project aliases. - + - aliasId, teamId - + alias_id + team_id, slug Delete an Alias with the specified ID. - + - teamId - domain, from, limit, projectId, since, until, rollbackDeploymentId - Retrieves a list of aliases for the authenticated User or Team. When `domain` is provided, only aliases for that domain will be returned. When `projectId` is provided, it will only return the given project aliases. + id, scope, override + teamId, slug + Update the protection bypass for the alias or deployment URL (used for user access & comment access for deployments). Used as shareable links and user scoped access for Vercel Authentication and also to allow external (logged in) people to comment on previews for Preview Comments (next-live-mode). @@ -261,20 +272,20 @@ Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](# - - + + The ID or alias that will be removed - - + + string - The alias or alias ID to be retrieved + The alias or deployment ID - - + + string - The Team identifier or slug to perform the request on behalf of. + The alias or alias ID to be retrieved @@ -291,21 +302,36 @@ Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](# number Maximum number of aliases to list from a request - - + + string - Filter aliases from the given `projectId` + Filter aliases from the given `projectId` (wire: projectId) - - + + string - Get aliases that would be rolled back for the given deployment + Get aliases that would be rolled back for the given deployment (wire: rollbackDeploymentId) number Get aliases created after this JavaScript timestamp + + + string + The Team slug to perform the request on behalf of. + + + + string + The Team identifier to perform the request on behalf of. + + + + string + The Team identifier to perform the request on behalf of. (wire: teamId) + number @@ -317,69 +343,73 @@ Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](# ## `SELECT` examples - + Retrieves an Alias for the given host name or alias ID. ```sql SELECT +deployment_id, +project_id, alias, created, -createdAt, +created_at, creator, -deletedAt, +deleted_at, deployment, -deploymentId, -projectId, -protectionBypass, +microfrontends, +protection_bypass, redirect, -redirectStatusCode, +redirect_status_code, uid, -updatedAt +updated_at FROM vercel.aliases.aliases -WHERE idOrAlias = '{{ idOrAlias }}' -- required -AND teamId = '{{ teamId }}' -- required +WHERE id_or_alias = '{{ id_or_alias }}' -- required AND from = '{{ from }}' -AND projectId = '{{ projectId }}' +AND project_id = '{{ project_id }}' AND since = '{{ since }}' AND until = '{{ until }}' +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' ; ``` - + Retrieves a list of aliases for the authenticated User or Team. When `domain` is provided, only aliases for that domain will be returned. When `projectId` is provided, it will only return the given project aliases. ```sql SELECT +deployment_id, +project_id, alias, created, -createdAt, +created_at, creator, -deletedAt, +deleted_at, deployment, -deploymentId, -projectId, -protectionBypass, +microfrontends, +protection_bypass, redirect, -redirectStatusCode, +redirect_status_code, uid, -updatedAt +updated_at FROM vercel.aliases.aliases -WHERE teamId = '{{ teamId }}' -- required -AND domain = '{{ domain }}' +WHERE domain = '{{ domain }}' AND from = '{{ from }}' AND limit = '{{ limit }}' -AND projectId = '{{ projectId }}' +AND project_id = '{{ project_id }}' AND since = '{{ since }}' AND until = '{{ until }}' -AND rollbackDeploymentId = '{{ rollbackDeploymentId }}' +AND rollback_deployment_id = '{{ rollback_deployment_id }}' +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' ; ``` @@ -389,19 +419,20 @@ AND rollbackDeploymentId = '{{ rollbackDeploymentId }}' ## `DELETE` examples - + Delete an Alias with the specified ID. ```sql DELETE FROM vercel.aliases.aliases -WHERE aliasId = '{{ aliasId }}' --required -AND teamId = '{{ teamId }}' --required +WHERE alias_id = '{{ alias_id }}' --required +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' ; ``` @@ -410,26 +441,30 @@ AND teamId = '{{ teamId }}' --required ## Lifecycle Methods +EXEC variables use wire (API) names. + - + -Retrieves a list of aliases for the authenticated User or Team. When `domain` is provided, only aliases for that domain will be returned. When `projectId` is provided, it will only return the given project aliases. +Update the protection bypass for the alias or deployment URL (used for user access & comment access for deployments). Used as shareable links and user scoped access for Vercel Authentication and also to allow external (logged in) people to comment on previews for Preview Comments (next-live-mode). ```sql -EXEC vercel.aliases.aliases._list_aliases -@teamId='{{ teamId }}' --required, -@domain='{{ domain }}', -@from='{{ from }}', -@limit='{{ limit }}', -@projectId='{{ projectId }}', -@since='{{ since }}', -@until='{{ until }}', -@rollbackDeploymentId='{{ rollbackDeploymentId }}' +EXEC vercel.aliases.aliases.update_protection_bypass +@id='{{ id }}' --required, +@teamId='{{ teamId }}', +@slug='{{ slug }}' +@@json= +'{ +"ttl": {{ ttl }}, +"revoke": "{{ revoke }}", +"scope": "{{ scope }}", +"override": "{{ override }}" +}' ; ``` diff --git a/website/docs/services/aliases/deployment_aliases/index.md b/website/docs/services/aliases/deployment_aliases/index.md new file mode 100644 index 0000000..d159f72 --- /dev/null +++ b/website/docs/services/aliases/deployment_aliases/index.md @@ -0,0 +1,238 @@ +--- +title: deployment_aliases +hide_title: false +hide_table_of_contents: false +keywords: + - deployment_aliases + - aliases + - vercel + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a deployment_aliases resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + +The list of aliases assigned to the deployment + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringThe alias name, it could be a `.vercel.app` subdomain or a custom domain (example: my-alias.vercel.app)
string (date-time)The date when the alias was created (example: 2017-04-26T23:00:34.232Z)
objectThe protection bypass for the alias (wire: protectionBypass)
stringTarget destination domain for redirect when the alias is a redirect
stringThe unique identifier of the alias (example: 2WjyKQmM8ZnGcJsPWMrHRHrE)
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
idteam_id, slugRetrieves all Aliases for the Deployment with the given ID. The authenticated user or team must own the deployment.
idteam_id, slugCreates a new alias for the deployment resolved from the given deployment or alias ID or URL. The authenticated user or team must own this deployment. If the desired alias is already assigned to another deployment, then it will be removed from the old deployment and assigned to the new one.
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
The deployment or alias ID or URL to assign from
stringThe Team slug to perform the request on behalf of.
stringThe Team identifier to perform the request on behalf of. (wire: teamId)
+ +## `SELECT` examples + + + + +Retrieves all Aliases for the Deployment with the given ID. The authenticated user or team must own the deployment. + +```sql +SELECT +alias, +created, +protection_bypass, +redirect, +uid +FROM vercel.aliases.deployment_aliases +WHERE id = '{{ id }}' -- required +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + + + +## `INSERT` examples + + + + +Creates a new alias for the deployment resolved from the given deployment or alias ID or URL. The authenticated user or team must own this deployment. If the desired alias is already assigned to another deployment, then it will be removed from the old deployment and assigned to the new one. + +```sql +INSERT INTO vercel.aliases.deployment_aliases ( +alias, +redirect, +id, +team_id, +slug +) +SELECT +'{{ alias }}', +'{{ redirect }}', +'{{ id }}', +'{{ team_id }}', +'{{ slug }}' +RETURNING +old_deployment_id, +alias, +created, +uid +; +``` + + + +{`# Description fields are for documentation purposes +- name: deployment_aliases + props: + - name: id + value: "{{ id }}" + description: Required parameter for the deployment_aliases resource. + - name: alias + value: "{{ alias }}" + description: | + The alias we want to assign to the deployment defined in the URL + - name: redirect + value: "{{ redirect }}" + description: | + The redirect property will take precedence over the deployment id from the URL and consists of a hostname (like test.com) to which the alias should redirect using status code 307 + - name: team_id + value: "{{ team_id }}" + description: The Team identifier to perform the request on behalf of. + description: The Team identifier to perform the request on behalf of. + - name: slug + value: "{{ slug }}" + description: The Team slug to perform the request on behalf of. + description: The Team slug to perform the request on behalf of. +`} + + + diff --git a/website/docs/services/aliases/deployments/index.md b/website/docs/services/aliases/deployments/index.md deleted file mode 100644 index ef6b368..0000000 --- a/website/docs/services/aliases/deployments/index.md +++ /dev/null @@ -1,212 +0,0 @@ ---- -title: deployments -hide_title: false -hide_table_of_contents: false -keywords: - - deployments - - aliases - - vercel - - infrastructure-as-code - - configuration-as-data - - cloud inventory -description: Query, deploy and manage vercel resources using SQL -custom_edit_url: null -image: /img/stackql-vercel-provider-featured-image.png ---- - -import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; - -Creates, updates, deletes, gets or lists a deployments resource. - -## Overview - - - - -
Namedeployments
TypeResource
Id
- -## Fields - -The following fields are returned by `SELECT` queries: - - - - -The list of aliases assigned to the deployment - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDatatypeDescription
stringThe alias name, it could be a `.vercel.app` subdomain or a custom domain (example: my-alias.vercel.app)
string (date-time)The date when the alias was created (example: 2017-04-26T23:00:34.232Z)
objectThe protection bypass for the alias
stringTarget destination domain for redirect when the alias is a redirect
stringThe unique identifier of the alias (example: 2WjyKQmM8ZnGcJsPWMrHRHrE)
-
-
- -## Methods - -The following methods are available for this resource: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameAccessible byRequired ParamsOptional ParamsDescription
id, teamIdRetrieves all Aliases for the Deployment with the given ID. The authenticated user or team must own the deployment.
id, teamIdRetrieves all Aliases for the Deployment with the given ID. The authenticated user or team must own the deployment.
id, teamIdCreates a new alias for the deployment with the given deployment ID. The authenticated user or team must own this deployment. If the desired alias is already assigned to another deployment, then it will be removed from the old deployment and assigned to the new one.
- -## Parameters - -Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. - - - - - - - - - - - - - - - - - - - - - -
NameDatatypeDescription
The ID of the deployment the aliases should be listed for
stringThe Team identifier or slug to perform the request on behalf of.
- -## `SELECT` examples - - - - -Retrieves all Aliases for the Deployment with the given ID. The authenticated user or team must own the deployment. - -```sql -SELECT -alias, -created, -protectionBypass, -redirect, -uid -FROM vercel.aliases.deployments -WHERE id = '{{ id }}' -- required -AND teamId = '{{ teamId }}' -- required -; -``` - - - - -## Lifecycle Methods - - - - -Retrieves all Aliases for the Deployment with the given ID. The authenticated user or team must own the deployment. - -```sql -EXEC vercel.aliases.deployments._list_deployment_aliases -@id='{{ id }}' --required, -@teamId='{{ teamId }}' --required -; -``` - - - -Creates a new alias for the deployment with the given deployment ID. The authenticated user or team must own this deployment. If the desired alias is already assigned to another deployment, then it will be removed from the old deployment and assigned to the new one. - -```sql -EXEC vercel.aliases.deployments.assign_alias -@id='{{ id }}' --required, -@teamId='{{ teamId }}' --required -@@json= -'{ -"alias": "{{ alias }}", -"redirect": "{{ redirect }}" -}' -; -``` - - diff --git a/website/docs/services/aliases/index.md b/website/docs/services/aliases/index.md index abe60f7..8547876 100644 --- a/website/docs/services/aliases/index.md +++ b/website/docs/services/aliases/index.md @@ -28,6 +28,6 @@ total resources: __2__ aliases \ No newline at end of file diff --git a/website/docs/services/artifacts/artifact_status/index.md b/website/docs/services/artifacts/artifact_status/index.md new file mode 100644 index 0000000..e415b94 --- /dev/null +++ b/website/docs/services/artifacts/artifact_status/index.md @@ -0,0 +1,134 @@ +--- +title: artifact_status +hide_title: false +hide_table_of_contents: false +keywords: + - artifact_status + - artifacts + - vercel + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists an artifact_status resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
team_id, slugCheck the status of Remote Caching for this principal. Returns a JSON-encoded status indicating if Remote Caching is enabled, disabled, or disabled due to usage limits.
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringThe Team slug to perform the request on behalf of.
stringThe Team identifier to perform the request on behalf of. (wire: teamId)
+ +## `SELECT` examples + + + + +Check the status of Remote Caching for this principal. Returns a JSON-encoded status indicating if Remote Caching is enabled, disabled, or disabled due to usage limits. + +```sql +SELECT +status +FROM vercel.artifacts.artifact_status +WHERE team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + diff --git a/website/docs/services/artifacts/artifacts/index.md b/website/docs/services/artifacts/artifacts/index.md index 50b100f..bf2631d 100644 --- a/website/docs/services/artifacts/artifacts/index.md +++ b/website/docs/services/artifacts/artifacts/index.md @@ -15,6 +15,7 @@ image: /img/stackql-vercel-provider-featured-image.png --- import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; @@ -22,7 +23,7 @@ Creates, updates, deletes, gets or lists an artifacts resource. ## Overview - +
Nameartifacts
Name
TypeResource
Id
@@ -50,45 +51,38 @@ The following methods are available for this resource: - - - teamId - x-artifact-client-ci, x-artifact-client-interactive - Records an artifacts cache usage event. The body of this request is an array of cache usage events. The supported event types are `HIT` and `MISS`. The source is either `LOCAL` the cache event was on the users filesystem cache or `REMOTE` if the cache event is for a remote cache. When the event is a `HIT` the request also accepts a number `duration` which is the time taken to generate the artifact in the cache. + + + + team_id, slug + Deletes all cache artifacts stored for the authenticated team or user, clearing the Remote Cache. Subsequent builds will re-populate the cache. - + - teamId - Check the status of Remote Caching for this principal. Returns a JSON-encoded status indicating if Remote Caching is enabled, disabled, or disabled due to usage limits. + x-artifact-client-ci, x-artifact-client-interactive, teamId, slug + Records an artifacts cache usage event. The body of this request is an array of cache usage events. The supported event types are `HIT` and `MISS`. The source is either `LOCAL` the cache event was on the users filesystem cache or `REMOTE` if the cache event is for a remote cache. When the event is a `HIT` the request also accepts a number `duration` which is the time taken to generate the artifact in the cache. - + - Content-Length, hash, teamId - x-artifact-duration, x-artifact-client-ci, x-artifact-client-interactive, x-artifact-tag + Content-Length, hash, value + x-artifact-duration, x-artifact-client-ci, x-artifact-client-interactive, x-artifact-tag, x-artifact-sha, x-artifact-dirty-hash, teamId, slug Uploads a cache artifact identified by the `hash` specified on the path. The cache artifact can then be downloaded with the provided `hash`. - + - hash, teamId - x-artifact-client-ci, x-artifact-client-interactive + hash + x-artifact-client-ci, x-artifact-client-interactive, teamId, slug Downloads a cache artifact indentified by its `hash` specified on the request path. The artifact is downloaded as an octet-stream. The client should verify the content-length header and response body. - + - hash, teamId - - Check that a cache artifact with the given `hash` exists. This request returns response headers only and is equivalent to a `GET` request to this endpoint where the response contains no body. - - - - - teamId, hashes - + hashes + teamId, slug Query information about an array of artifacts. @@ -117,10 +111,20 @@ Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](# string The artifact hash + + + string + The Team slug to perform the request on behalf of. + string - The Team identifier or slug to perform the request on behalf of. + The Team identifier to perform the request on behalf of. + + + + string + The Team identifier to perform the request on behalf of. (wire: teamId) @@ -132,11 +136,21 @@ Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](# integer 1 if the client is an interactive shell. Otherwise 0 + + + string + A hash representing uncommitted changes in the working directory when this artifact was generated. + number The time taken to generate the uploaded artifact in milliseconds. + + + string + The SHA of the source control revision that generated this artifact. + string @@ -145,17 +159,39 @@ Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](# +## `DELETE` examples + + + + +Deletes all cache artifacts stored for the authenticated team or user, clearing the Remote Cache. Subsequent builds will re-populate the cache. + +```sql +DELETE FROM vercel.artifacts.artifacts +WHERE team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + + + ## Lifecycle Methods +EXEC variables use wire (API) names. + @@ -164,69 +200,58 @@ Records an artifacts cache usage event. The body of this request is an array of ```sql EXEC vercel.artifacts.artifacts.record_events -@teamId='{{ teamId }}' --required, @x-artifact-client-ci='{{ x-artifact-client-ci }}', -@x-artifact-client-interactive='{{ x-artifact-client-interactive }}' -; -``` - - - -Check the status of Remote Caching for this principal. Returns a JSON-encoded status indicating if Remote Caching is enabled, disabled, or disabled due to usage limits. - -```sql -EXEC vercel.artifacts.artifacts.status -@teamId='{{ teamId }}' --required +@x-artifact-client-interactive='{{ x-artifact-client-interactive }}', +@teamId='{{ teamId }}', +@slug='{{ slug }}' ; ``` - + Uploads a cache artifact identified by the `hash` specified on the path. The cache artifact can then be downloaded with the provided `hash`. ```sql -EXEC vercel.artifacts.artifacts.upload_artifact +EXEC vercel.artifacts.artifacts.upload @Content-Length='{{ Content-Length }}' --required, @hash='{{ hash }}' --required, -@teamId='{{ teamId }}' --required, @x-artifact-duration='{{ x-artifact-duration }}', @x-artifact-client-ci='{{ x-artifact-client-ci }}', @x-artifact-client-interactive='{{ x-artifact-client-interactive }}', -@x-artifact-tag='{{ x-artifact-tag }}' +@x-artifact-tag='{{ x-artifact-tag }}', +@x-artifact-sha='{{ x-artifact-sha }}', +@x-artifact-dirty-hash='{{ x-artifact-dirty-hash }}', +@teamId='{{ teamId }}', +@slug='{{ slug }}' +@@json= +'{ +"value": "{{ value }}" +}' ; ``` - + Downloads a cache artifact indentified by its `hash` specified on the request path. The artifact is downloaded as an octet-stream. The client should verify the content-length header and response body. ```sql -EXEC vercel.artifacts.artifacts.download_artifact +EXEC vercel.artifacts.artifacts.download @hash='{{ hash }}' --required, -@teamId='{{ teamId }}' --required, @x-artifact-client-ci='{{ x-artifact-client-ci }}', -@x-artifact-client-interactive='{{ x-artifact-client-interactive }}' -; -``` - - - -Check that a cache artifact with the given `hash` exists. This request returns response headers only and is equivalent to a `GET` request to this endpoint where the response contains no body. - -```sql -EXEC vercel.artifacts.artifacts.artifact_exists -@hash='{{ hash }}' --required, -@teamId='{{ teamId }}' --required +@x-artifact-client-interactive='{{ x-artifact-client-interactive }}', +@teamId='{{ teamId }}', +@slug='{{ slug }}' ; ``` - + Query information about an array of artifacts. ```sql -EXEC vercel.artifacts.artifacts.artifact_query -@teamId='{{ teamId }}' --required +EXEC vercel.artifacts.artifacts.query +@teamId='{{ teamId }}', +@slug='{{ slug }}' @@json= '{ "hashes": "{{ hashes }}" diff --git a/website/docs/services/artifacts/index.md b/website/docs/services/artifacts/index.md index d179b59..986f65a 100644 --- a/website/docs/services/artifacts/index.md +++ b/website/docs/services/artifacts/index.md @@ -18,16 +18,16 @@ artifacts service documentation. :::info[Service Summary] -total resources: __1__ +total resources: __2__ ::: ## Resources \ No newline at end of file diff --git a/website/docs/services/authentication/api_keys/index.md b/website/docs/services/authentication/api_keys/index.md new file mode 100644 index 0000000..5a5d4dc --- /dev/null +++ b/website/docs/services/authentication/api_keys/index.md @@ -0,0 +1,151 @@ +--- +title: api_keys +hide_title: false +hide_table_of_contents: false +keywords: + - api_keys + - authentication + - vercel + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists an api_keys resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + +`SELECT` not supported for this resource, use `SHOW METHODS` to view available operations for the resource. + + +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
purpose
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + +
NameDatatypeDescription
+ +## `INSERT` examples + + + + +No description available. + +```sql +INSERT INTO vercel.authentication.api_keys ( +purpose, +project_id, +name, +expires_at, +ai_gateway_quota, +metadata +) +SELECT +'{{ purpose }}' /* required */, +'{{ project_id }}', +'{{ name }}', +{{ expires_at }}, +'{{ ai_gateway_quota }}', +'{{ metadata }}' +RETURNING +api_key, +api_key_string +; +``` + + + +{`# Description fields are for documentation purposes +- name: api_keys + props: + - name: purpose + value: "{{ purpose }}" + description: | + The API key's purpose, which restricts how it can be used. + - name: project_id + value: "{{ project_id }}" + description: | + An optional project to restrict the API key to. + - name: name + value: "{{ name }}" + description: | + An optional name for the API key. + - name: expires_at + value: {{ expires_at }} + description: | + The API key's expiration, expressed as a UNIX timestamp in milliseconds. + - name: ai_gateway_quota + description: | + Optional AI Gateway quota configuration for the API key. + value: + limitAmount: {{ limitAmount }} + includeByokInQuota: {{ includeByokInQuota }} + refreshPeriod: "{{ refreshPeriod }}" + alertThresholds: + - {{ alertThresholds }} + - name: metadata + value: "{{ metadata }}" + description: | + Optional generic metadata for the API key. The accepted shape depends on the key's \`purpose\` and is validated on creation; for \`ai-gateway\` keys this accepts \`environment\`. +`} + + + diff --git a/website/docs/services/authentication/index.md b/website/docs/services/authentication/index.md index 601f98a..f389d7a 100644 --- a/website/docs/services/authentication/index.md +++ b/website/docs/services/authentication/index.md @@ -18,16 +18,16 @@ authentication service documentation. :::info[Service Summary] -total resources: __1__ +total resources: __2__ ::: ## Resources \ No newline at end of file diff --git a/website/docs/services/authentication/tokens/index.md b/website/docs/services/authentication/tokens/index.md new file mode 100644 index 0000000..58504c6 --- /dev/null +++ b/website/docs/services/authentication/tokens/index.md @@ -0,0 +1,420 @@ +--- +title: tokens +hide_title: false +hide_table_of_contents: false +keywords: + - tokens + - authentication + - vercel + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a tokens resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + +Successful response. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringThe unique identifier of the token. (example: 5d9f2ebd38ddca62e5d51e9c1704c72530bdc8bfdd41e782a6687c48399e8391)
stringThe human-readable name of the token.
numberTimestamp (in milliseconds) of when the token was most recently used. (wire: activeAt)
numberTimestamp (in milliseconds) of when the token was created. (wire: createdAt)
numberTimestamp (in milliseconds) of when the token expires. (wire: expiresAt)
numberTimestamp (in milliseconds) of when the token was marked as leaked. (wire: leakedAt)
stringURL where the token was discovered as leaked. (wire: leakedUrl)
stringThe origin of how the token was created. (example: github)
stringThe token's prefix, for identification purposes. (example: vcp_)
numberTimestamp (in milliseconds) of when the token was revoked. (wire: revokedAt)
arrayThe access scopes granted to the token.
stringThe last few characters of the token, for identification purposes. (example: abc123)
stringThe type of the token. (example: oauth2-token)
+
+ + +Authentication token metadata. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringThe unique identifier of the token. (example: 5d9f2ebd38ddca62e5d51e9c1704c72530bdc8bfdd41e782a6687c48399e8391)
stringThe human-readable name of the token.
numberTimestamp (in milliseconds) of when the token was most recently used. (wire: activeAt)
numberTimestamp (in milliseconds) of when the token was created. (wire: createdAt)
numberTimestamp (in milliseconds) of when the token expires. (wire: expiresAt)
numberTimestamp (in milliseconds) of when the token was marked as leaked. (wire: leakedAt)
stringURL where the token was discovered as leaked. (wire: leakedUrl)
stringThe origin of how the token was created. (example: github)
stringThe token's prefix, for identification purposes. (example: vcp_)
numberTimestamp (in milliseconds) of when the token was revoked. (wire: revokedAt)
arrayThe access scopes granted to the token.
stringThe last few characters of the token, for identification purposes. (example: abc123)
stringThe type of the token. (example: oauth2-token)
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
token_idRetrieve metadata about an authentication token belonging to the currently authenticated User.
Retrieve a list of the current User's authentication tokens.
nameteam_id, slugCreates and returns a new authentication token for the currently authenticated User. The `bearerToken` property is only provided once, in the response body, so be sure to save it on the client for use with API requests.
token_idInvalidate an authentication token, such that it will no longer be valid for future HTTP requests.
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringThe identifier of the token to invalidate. The special value "current" may be supplied, which invalidates the token that the HTTP request was authenticated with.
stringThe Team slug to perform the request on behalf of.
stringThe Team identifier to perform the request on behalf of. (wire: teamId)
+ +## `SELECT` examples + + + + +Retrieve metadata about an authentication token belonging to the currently authenticated User. + +```sql +SELECT +id, +name, +active_at, +created_at, +expires_at, +leaked_at, +leaked_url, +origin, +prefix, +revoked_at, +scopes, +suffix, +type +FROM vercel.authentication.tokens +WHERE token_id = '{{ token_id }}' -- required +; +``` + + + +Retrieve a list of the current User's authentication tokens. + +```sql +SELECT +id, +name, +active_at, +created_at, +expires_at, +leaked_at, +leaked_url, +origin, +prefix, +revoked_at, +scopes, +suffix, +type +FROM vercel.authentication.tokens +; +``` + + + + +## `INSERT` examples + + + + +Creates and returns a new authentication token for the currently authenticated User. The `bearerToken` property is only provided once, in the response body, so be sure to save it on the client for use with API requests. + +```sql +INSERT INTO vercel.authentication.tokens ( +name, +expires_at, +project_id, +team_id, +slug +) +SELECT +'{{ name }}' /* required */, +{{ expires_at }}, +'{{ project_id }}', +'{{ team_id }}', +'{{ slug }}' +RETURNING +bearer_token, +token +; +``` + + + +{`# Description fields are for documentation purposes +- name: tokens + props: + - name: name + value: "{{ name }}" + - name: expires_at + value: {{ expires_at }} + - name: project_id + value: "{{ project_id }}" + description: | + The ID of the project to scope this token to + - name: team_id + value: "{{ team_id }}" + description: The Team identifier to perform the request on behalf of. + description: The Team identifier to perform the request on behalf of. + - name: slug + value: "{{ slug }}" + description: The Team slug to perform the request on behalf of. + description: The Team slug to perform the request on behalf of. +`} + + + + + +## `DELETE` examples + + + + +Invalidate an authentication token, such that it will no longer be valid for future HTTP requests. + +```sql +DELETE FROM vercel.authentication.tokens +WHERE token_id = '{{ token_id }}' --required +; +``` + + diff --git a/website/docs/services/authentication/user_tokens/index.md b/website/docs/services/authentication/user_tokens/index.md deleted file mode 100644 index 2fcadba..0000000 --- a/website/docs/services/authentication/user_tokens/index.md +++ /dev/null @@ -1,408 +0,0 @@ ---- -title: user_tokens -hide_title: false -hide_table_of_contents: false -keywords: - - user_tokens - - authentication - - vercel - - infrastructure-as-code - - configuration-as-data - - cloud inventory -description: Query, deploy and manage vercel resources using SQL -custom_edit_url: null -image: /img/stackql-vercel-provider-featured-image.png ---- - -import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; - -Creates, updates, deletes, gets or lists a user_tokens resource. - -## Overview - - - - -
Nameuser_tokens
TypeResource
Id
- -## Fields - -The following fields are returned by `SELECT` queries: - - - - -Successful response. - - - - - - - - - - - - - - - - -
NameDatatypeDescription
objectAuthentication token metadata.
-
- - -Authentication token metadata. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDatatypeDescription
stringThe unique identifier of the token. (example: 5d9f2ebd38ddca62e5d51e9c1704c72530bdc8bfdd41e782a6687c48399e8391)
stringThe human-readable name of the token.
numberTimestamp (in milliseconds) of when the token was most recently used.
numberTimestamp (in milliseconds) of when the token was created.
numberTimestamp (in milliseconds) of when the token expires.
stringThe origin of how the token was created. (example: github)
arrayThe access scopes granted to the token.
stringThe type of the token. (example: oauth2-token)
-
-
- -## Methods - -The following methods are available for this resource: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameAccessible byRequired ParamsOptional ParamsDescription
tokenIdRetrieve metadata about an authentication token belonging to the currently authenticated User.
Retrieve a list of the current User's authentication tokens.
teamId, data__nameCreates and returns a new authentication token for the currently authenticated User. The `bearerToken` property is only provided once, in the response body, so be sure to save it on the client for use with API requests.
tokenIdInvalidate an authentication token, such that it will no longer be valid for future HTTP requests.
Retrieve a list of the current User's authentication tokens.
tokenemail, tokenName, ssoUserId, teamName, teamSlug, teamPlanVerify the user accepted the login request and get a authentication token. The user email address and the token received after requesting the login must be added to the URL as a query string with the names `email` and `token`.
emailRequest a new login for a user to get a token. This will respond with a verification token and send an email to confirm the request. Once confirmed you can use the verification token to get an authentication token.
- -## Parameters - -Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDatatypeDescription
stringThe Team identifier or slug to perform the request on behalf of.
stringThe token returned when the login was requested.
stringThe identifier of the token to invalidate. The special value \"current\" may be supplied, which invalidates the token that the HTTP request was authenticated with.
stringEmail to verify the login.
stringThe SAML Profile ID, when connecting a SAML Profile to a Team member for the first time.
stringThe name of this user's team.
stringThe plan for this user's team (pro or hobby).
stringThe slug for this user's team.
stringThe desired name for the token. It will be displayed on the user account details.
- -## `SELECT` examples - - - - -Retrieve metadata about an authentication token belonging to the currently authenticated User. - -```sql -SELECT -token -FROM vercel.authentication.user_tokens -WHERE tokenId = '{{ tokenId }}' -- required -; -``` - - - -Retrieve a list of the current User's authentication tokens. - -```sql -SELECT -id, -name, -activeAt, -createdAt, -expiresAt, -origin, -scopes, -type -FROM vercel.authentication.user_tokens -; -``` - - - - -## `INSERT` examples - - - - -Creates and returns a new authentication token for the currently authenticated User. The `bearerToken` property is only provided once, in the response body, so be sure to save it on the client for use with API requests. - -```sql -INSERT INTO vercel.authentication.user_tokens ( -data__name, -data__expiresAt, -teamId -) -SELECT -'{{ name }}' /* required */, -{{ expiresAt }}, -'{{ teamId }}' -RETURNING -bearerToken, -token -; -``` - - - -```yaml -# Description fields are for documentation purposes -- name: user_tokens - props: - - name: teamId - value: string - description: Required parameter for the user_tokens resource. - - name: name - value: string - - name: expiresAt - value: number -``` - - - - -## `DELETE` examples - - - - -Invalidate an authentication token, such that it will no longer be valid for future HTTP requests. - -```sql -DELETE FROM vercel.authentication.user_tokens -WHERE tokenId = '{{ tokenId }}' --required -; -``` - - - - -## Lifecycle Methods - - - - -Retrieve a list of the current User's authentication tokens. - -```sql -EXEC vercel.authentication.user_tokens._list_auth_tokens - -; -``` - - - -Verify the user accepted the login request and get a authentication token. The user email address and the token received after requesting the login must be added to the URL as a query string with the names `email` and `token`. - -```sql -EXEC vercel.authentication.user_tokens.verify_token -@token='{{ token }}' --required, -@email='{{ email }}', -@tokenName='{{ tokenName }}', -@ssoUserId='{{ ssoUserId }}', -@teamName='{{ teamName }}', -@teamSlug='{{ teamSlug }}', -@teamPlan='{{ teamPlan }}' -; -``` - - - -Request a new login for a user to get a token. This will respond with a verification token and send an email to confirm the request. Once confirmed you can use the verification token to get an authentication token. - -```sql -EXEC vercel.authentication.user_tokens.email_login -@@json= -'{ -"email": "{{ email }}", -"tokenName": "{{ tokenName }}" -}' -; -``` - - diff --git a/website/docs/services/billing/charges/index.md b/website/docs/services/billing/charges/index.md new file mode 100644 index 0000000..28df748 --- /dev/null +++ b/website/docs/services/billing/charges/index.md @@ -0,0 +1,148 @@ +--- +title: charges +hide_title: false +hide_table_of_contents: false +keywords: + - charges + - billing + - vercel + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a charges resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + +Wrapper for non-JSON response bodies (jsonl, ndjson, streamed json, octet-stream): one row carrying the raw body text. + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringRaw response body.
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
from, toteam_id, slugReturns the billing charge data in FOCUS v1.3 JSONL format for a specified Vercel team, within a date range specified by `from` and `to` query parameters. Supports 1-day granularity with a maximum date range of 1 year. The response is streamed as newline-delimited JSON (JSONL) and can be optionally compressed with gzip if the `Accept-Encoding: gzip` header is provided. This is only available for Owner, Member, Developer, Security, Billing, and Enterprise Viewer roles for the supplied team.
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringInclusive start of the date range as an ISO 8601 date-time string in UTC.
stringExclusive end of the date range as an ISO 8601 date-time string in UTC.
stringThe Team slug to perform the request on behalf of.
stringThe Team identifier to perform the request on behalf of. (wire: teamId)
+ +## `SELECT` examples + + + + +Returns the billing charge data in FOCUS v1.3 JSONL format for a specified Vercel team, within a date range specified by `from` and `to` query parameters. Supports 1-day granularity with a maximum date range of 1 year. The response is streamed as newline-delimited JSON (JSONL) and can be optionally compressed with gzip if the `Accept-Encoding: gzip` header is provided. This is only available for Owner, Member, Developer, Security, Billing, and Enterprise Viewer roles for the supplied team. + +```sql +SELECT +contents +FROM vercel.billing.charges +WHERE from = '{{ from }}' -- required +AND to = '{{ to }}' -- required +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + diff --git a/website/docs/services/billing/contract_commitments/index.md b/website/docs/services/billing/contract_commitments/index.md new file mode 100644 index 0000000..69debd9 --- /dev/null +++ b/website/docs/services/billing/contract_commitments/index.md @@ -0,0 +1,136 @@ +--- +title: contract_commitments +hide_title: false +hide_table_of_contents: false +keywords: + - contract_commitments + - billing + - vercel + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a contract_commitments resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + +Wrapper for non-JSON response bodies (jsonl, ndjson, streamed json, octet-stream): one row carrying the raw body text. + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringRaw response body.
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
team_id, slugReturns commitment allocations per contract period in FOCUS v1.3 JSONL format for a specified Vercel team. The response is streamed as newline-delimited JSON (JSONL). This endpoint is only applicable to Enterprise Vercel customers. An empty response is returned for non-Enterprise (Pro/Flex) customers.
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringThe Team slug to perform the request on behalf of.
stringThe Team identifier to perform the request on behalf of. (wire: teamId)
+ +## `SELECT` examples + + + + +Returns commitment allocations per contract period in FOCUS v1.3 JSONL format for a specified Vercel team. The response is streamed as newline-delimited JSON (JSONL). This endpoint is only applicable to Enterprise Vercel customers. An empty response is returned for non-Enterprise (Pro/Flex) customers. + +```sql +SELECT +contents +FROM vercel.billing.contract_commitments +WHERE team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + diff --git a/website/docs/services/billing/credits/index.md b/website/docs/services/billing/credits/index.md new file mode 100644 index 0000000..8713db5 --- /dev/null +++ b/website/docs/services/billing/credits/index.md @@ -0,0 +1,120 @@ +--- +title: credits +hide_title: false +hide_table_of_contents: false +keywords: + - credits + - billing + - vercel + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a credits resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + +`SELECT` not supported for this resource, use `SHOW METHODS` to view available operations for the resource. + + +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
itemsource, teamId, slugPurchases credits for a Vercel team using the default payment method on file. The purchase is charged immediately via Stripe invoice. Supported credit types are `v0`, `gateway`, and `agent`. The `amount` field specifies the number of credits to purchase and must be a positive integer. An optional `source` query parameter can be provided to identify the caller. Defaults to `api` if not specified. This is only available for Owner, Member, Developer, Security, and Billing roles for the supplied team.
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringThe Team slug to perform the request on behalf of.
stringThe source of the purchase request. Defaults to `api` if not specified.
stringThe Team identifier to perform the request on behalf of.
+ +## Lifecycle Methods + +EXEC variables use wire (API) names. + + + + +Purchases credits for a Vercel team using the default payment method on file. The purchase is charged immediately via Stripe invoice. Supported credit types are `v0`, `gateway`, and `agent`. The `amount` field specifies the number of credits to purchase and must be a positive integer. An optional `source` query parameter can be provided to identify the caller. Defaults to `api` if not specified. This is only available for Owner, Member, Developer, Security, and Billing roles for the supplied team. + +```sql +EXEC vercel.billing.credits.buy +@source='{{ source }}', +@teamId='{{ teamId }}', +@slug='{{ slug }}' +@@json= +'{ +"item": "{{ item }}" +}' +; +``` + + diff --git a/website/docs/services/billing/index.md b/website/docs/services/billing/index.md new file mode 100644 index 0000000..264ce2c --- /dev/null +++ b/website/docs/services/billing/index.md @@ -0,0 +1,34 @@ +--- +title: billing +hide_title: false +hide_table_of_contents: false +keywords: + - billing + - vercel + - stackql + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +billing service documentation. + +:::info[Service Summary] + +total resources: __3__ + +::: + +## Resources + \ No newline at end of file diff --git a/website/docs/services/bulk_redirects/index.md b/website/docs/services/bulk_redirects/index.md new file mode 100644 index 0000000..d8eb36f --- /dev/null +++ b/website/docs/services/bulk_redirects/index.md @@ -0,0 +1,33 @@ +--- +title: bulk_redirects +hide_title: false +hide_table_of_contents: false +keywords: + - bulk_redirects + - vercel + - stackql + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +bulk_redirects service documentation. + +:::info[Service Summary] + +total resources: __2__ + +::: + +## Resources +
+ + +
\ No newline at end of file diff --git a/website/docs/services/bulk_redirects/redirects/index.md b/website/docs/services/bulk_redirects/redirects/index.md new file mode 100644 index 0000000..eb8f5cd --- /dev/null +++ b/website/docs/services/bulk_redirects/redirects/index.md @@ -0,0 +1,378 @@ +--- +title: redirects +hide_title: false +hide_table_of_contents: false +keywords: + - redirects + - bulk_redirects + - vercel + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a redirects resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
boolean (false, true) (wire: caseSensitive)
string
boolean (false, true)
boolean (false, true) (wire: preserveQueryParams)
boolean (false, true)
boolean (false, true)
string
number (wire: statusCode)
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
project_idversion_id, q, diff, page, per_page, sort_by, sort_order, team_id, slugGet the version history for a project's bulk redirects
project_id, redirectteam_id, slugEdits a single redirect identified by its source path. Stages a new change with the modified redirect and returns the alias for the new version in the response.
project_id, team_idslugStages new redirects for a project and returns the new version.
project_idteam_id, slugDeletes the provided redirects from the latest version of the projects' bulk redirects. Stages a new change with the new redirects and returns the alias for the new version in the response.
projectId, redirectsteamId, slugRestores the provided redirects in the staging version to the value in the production version. If no production version exists, removes the redirects from staging.
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string
string (wire: projectId)
integer
integer
string
stringThe Team slug to perform the request on behalf of.
string
string
stringThe Team identifier to perform the request on behalf of.
stringThe Team identifier to perform the request on behalf of. (wire: teamId)
string (wire: versionId)
+ +## `SELECT` examples + + + + +Get the version history for a project's bulk redirects + +```sql +SELECT +case_sensitive, +destination, +permanent, +preserve_query_params, +query, +sensitive, +source, +status_code +FROM vercel.bulk_redirects.redirects +WHERE project_id = '{{ project_id }}' -- required +AND version_id = '{{ version_id }}' +AND q = '{{ q }}' +AND diff = '{{ diff }}' +AND page = '{{ page }}' +AND per_page = '{{ per_page }}' +AND sort_by = '{{ sort_by }}' +AND sort_order = '{{ sort_order }}' +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + + + +## `UPDATE` examples + + + + +Edits a single redirect identified by its source path. Stages a new change with the modified redirect and returns the alias for the new version in the response. + +```sql +UPDATE vercel.bulk_redirects.redirects +SET +name = '{{ name }}', +redirect = '{{ redirect }}', +restore = {{ restore }} +WHERE +project_id = '{{ project_id }}' --required +AND redirect = '{{ redirect }}' --required +AND team_id = '{{ team_id}}' +AND slug = '{{ slug}}' +RETURNING +alias, +version; +``` + + + + +## `REPLACE` examples + + + + +Stages new redirects for a project and returns the new version. + +```sql +REPLACE vercel.bulk_redirects.redirects +SET +project_id = '{{ project_id }}', +team_id = '{{ team_id }}', +overwrite = {{ overwrite }}, +name = '{{ name }}', +redirects = '{{ redirects }}' +WHERE +project_id = '{{ project_id }}' --required +AND team_id = '{{ team_id }}' --required +AND slug = '{{ slug}}' +RETURNING +alias, +version; +``` + + + + +## `DELETE` examples + + + + +Deletes the provided redirects from the latest version of the projects' bulk redirects. Stages a new change with the new redirects and returns the alias for the new version in the response. + +```sql +DELETE FROM vercel.bulk_redirects.redirects +WHERE project_id = '{{ project_id }}' --required +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + + + +## Lifecycle Methods + +EXEC variables use wire (API) names. + + + + +Restores the provided redirects in the staging version to the value in the production version. If no production version exists, removes the redirects from staging. + +```sql +EXEC vercel.bulk_redirects.redirects.restore +@projectId='{{ projectId }}' --required, +@teamId='{{ teamId }}', +@slug='{{ slug }}' +@@json= +'{ +"name": "{{ name }}", +"redirects": "{{ redirects }}" +}' +; +``` + + diff --git a/website/docs/services/bulk_redirects/versions/index.md b/website/docs/services/bulk_redirects/versions/index.md new file mode 100644 index 0000000..8193090 --- /dev/null +++ b/website/docs/services/bulk_redirects/versions/index.md @@ -0,0 +1,236 @@ +--- +title: versions +hide_title: false +hide_table_of_contents: false +keywords: + - versions + - bulk_redirects + - vercel + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a versions resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringThe unique identifier for the version.
stringOptional name for the version. If not provided, defaults to an ISO timestamp string.
stringThe staging link for previewing redirects in this version.
string (wire: createdBy)
booleanWhether this version is currently live in production. (false, true) (wire: isLive)
booleanWhether this version has not been promoted to production yet and is not serving end users. (false, true) (wire: isStaging)
stringThe key of the version. The key may be duplicated across versions if the contents are the same as a different version.
number (wire: lastModified)
numberThe number of redirects in this version. (wire: redirectCount)
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
project_idteam_id, slugGet the version history for a project's bulk redirects
projectId, id, actionteamId, slugUpdate a version by promoting staging to production or restoring a previous production version
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string
string (wire: projectId)
stringThe Team slug to perform the request on behalf of.
stringThe Team identifier to perform the request on behalf of.
stringThe Team identifier to perform the request on behalf of. (wire: teamId)
+ +## `SELECT` examples + + + + +Get the version history for a project's bulk redirects + +```sql +SELECT +id, +name, +alias, +created_by, +is_live, +is_staging, +key, +last_modified, +redirect_count +FROM vercel.bulk_redirects.versions +WHERE project_id = '{{ project_id }}' -- required +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + + + +## Lifecycle Methods + +EXEC variables use wire (API) names. + + + + +Update a version by promoting staging to production or restoring a previous production version + +```sql +EXEC vercel.bulk_redirects.versions.update +@projectId='{{ projectId }}' --required, +@teamId='{{ teamId }}', +@slug='{{ slug }}' +@@json= +'{ +"id": "{{ id }}", +"action": "{{ action }}", +"name": "{{ name }}" +}' +; +``` + + diff --git a/website/docs/services/certs/certs/index.md b/website/docs/services/certs/certs/index.md index 8b19ba8..128da99 100644 --- a/website/docs/services/certs/certs/index.md +++ b/website/docs/services/certs/certs/index.md @@ -15,6 +15,7 @@ image: /img/stackql-vercel-provider-featured-image.png --- import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; @@ -22,7 +23,7 @@ Creates, updates, deletes, gets or lists a certs resource. ## Overview - +
Namecerts
Name
TypeResource
Id
@@ -32,12 +33,13 @@ Creates, updates, deletes, gets or lists a certs resource. The following fields are returned by `SELECT` queries: - + @@ -54,9 +56,9 @@ The following fields are returned by `SELECT` queries: - + - + @@ -64,15 +66,54 @@ The following fields are returned by `SELECT` queries: - + - + - + + + + +
boolean (false, true) (wire: autoRenew)
number (wire: createdAt)
number (wire: expiresAt)
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string
boolean (false, true) (wire: autoRenew)
array
number (wire: createdAt)
number (wire: expiresAt)
@@ -94,31 +135,38 @@ The following methods are available for this resource: - + - id, teamId - + id + team_id, slug Get cert by id - - - id, teamId + + - Remove cert + team_id, slug + Get certs - - - teamId + + + team_id, slug Issue a new cert - + + + id + team_id, slug + Remove cert + + + - teamId, ca, key, cert - + ca, key, cert + teamId, slug Upload a cert @@ -142,10 +190,20 @@ Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](# string The cert id to remove + + + string + The Team slug to perform the request on behalf of. + string - The Team identifier or slug to perform the request on behalf of. + The Team identifier to perform the request on behalf of. + + + + string + The Team identifier to perform the request on behalf of. (wire: teamId) @@ -153,83 +211,147 @@ Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](# ## `SELECT` examples - + Get cert by id ```sql SELECT id, -autoRenew, +auto_renew, cns, -createdAt, -expiresAt +created_at, +expires_at FROM vercel.certs.certs WHERE id = '{{ id }}' -- required -AND teamId = '{{ teamId }}' -- required +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + + +Get certs + +```sql +SELECT +id, +auto_renew, +cns, +created_at, +expires_at +FROM vercel.certs.certs +WHERE team_id = '{{ team_id }}' +AND slug = '{{ slug }}' ; ``` -## `DELETE` examples +## `INSERT` examples - + -Remove cert +Issue a new cert ```sql -DELETE FROM vercel.certs.certs -WHERE id = '{{ id }}' --required -AND teamId = '{{ teamId }}' --required +INSERT INTO vercel.certs.certs ( +cns, +team_id, +slug +) +SELECT +'{{ cns }}', +'{{ team_id }}', +'{{ slug }}' +RETURNING +id, +auto_renew, +cns, +created_at, +expires_at ; ``` + + + +{`# Description fields are for documentation purposes +- name: certs + props: + - name: cns + value: + - "{{ cns }}" + description: | + The common names the cert should be issued for + - name: team_id + value: "{{ team_id }}" + description: The Team identifier to perform the request on behalf of. + description: The Team identifier to perform the request on behalf of. + - name: slug + value: "{{ slug }}" + description: The Team slug to perform the request on behalf of. + description: The Team slug to perform the request on behalf of. +`} + -## Lifecycle Methods +## `DELETE` examples - + -Issue a new cert +Remove cert ```sql -EXEC vercel.certs.certs.issue_cert -@teamId='{{ teamId }}' --required -@@json= -'{ -"cns": "{{ cns }}" -}' +DELETE FROM vercel.certs.certs +WHERE id = '{{ id }}' --required +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' ; ``` - + + + +## Lifecycle Methods + +EXEC variables use wire (API) names. + + + Upload a cert ```sql -EXEC vercel.certs.certs.upload_cert -@teamId='{{ teamId }}' --required +EXEC vercel.certs.certs.upload +@teamId='{{ teamId }}', +@slug='{{ slug }}' @@json= '{ "ca": "{{ ca }}", diff --git a/website/docs/services/checks/check_runs/index.md b/website/docs/services/checks/check_runs/index.md new file mode 100644 index 0000000..58df472 --- /dev/null +++ b/website/docs/services/checks/check_runs/index.md @@ -0,0 +1,487 @@ +--- +title: check_runs +hide_title: false +hide_table_of_contents: false +keywords: + - check_runs + - checks + - vercel + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a check_runs resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + + + + + + + + + + + +
NameDatatypeDescription
+
+ + +Check run backed by a project-level `check` definition. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string
string
string (wire: checkId)
string (wire: deploymentId)
string (wire: externalId)
string (wire: ownerId)
string (wire: projectId)
string (build-start, deployment-alias, deployment-promotion, deployment-start, none)
number (wire: completedAt)
string (canceled, failed, neutral, skipped, succeeded, timeout)
string (wire: conclusionText)
number (wire: createdAt)
string (wire: externalUrl)
object
string (build-ready, deployment-url, none)
string (completed, queued, running)
array
number
number (wire: updatedAt)
+
+ + + + + + + + + + + + +
NameDatatypeDescription
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
project_id_or_name, check_idteam_id, slugList all runs associated with a given check.
deployment_id, check_run_idteam_id, slugReturn a detailed response for a single check run.
deployment_idteam_id, slugList all check runs for a deployment.
deployment_id, check_idteam_id, slugCreates a new check run for a deployment.
deployment_id, check_run_idteam_id, slugUpdate an existing check run for a deployment.
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringThe ID of the resource that will be updated.
string
string
string
stringThe Team slug to perform the request on behalf of.
stringThe Team identifier to perform the request on behalf of. (wire: teamId)
+ +## `SELECT` examples + + + + +List all runs associated with a given check. + +```sql +SELECT +* +FROM vercel.checks.check_runs +WHERE project_id_or_name = '{{ project_id_or_name }}' -- required +AND check_id = '{{ check_id }}' -- required +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + + +Return a detailed response for a single check run. + +```sql +SELECT +id, +name, +check_id, +deployment_id, +external_id, +owner_id, +project_id, +blocks, +completed_at, +conclusion, +conclusion_text, +created_at, +external_url, +output, +requires, +source, +status, +targets, +timeout, +updated_at +FROM vercel.checks.check_runs +WHERE deployment_id = '{{ deployment_id }}' -- required +AND check_run_id = '{{ check_run_id }}' -- required +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + + +List all check runs for a deployment. + +```sql +SELECT +* +FROM vercel.checks.check_runs +WHERE deployment_id = '{{ deployment_id }}' -- required +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + + + +## `INSERT` examples + + + + +Creates a new check run for a deployment. + +```sql +INSERT INTO vercel.checks.check_runs ( +check_id, +deployment_id, +team_id, +slug +) +SELECT +'{{ check_id }}' /* required */, +'{{ deployment_id }}', +'{{ team_id }}', +'{{ slug }}' +RETURNING +id, +name, +check_id, +deployment_id, +external_id, +owner_id, +project_id, +blocks, +completed_at, +conclusion, +conclusion_text, +created_at, +external_url, +output, +requires, +source, +status, +targets, +timeout, +updated_at +; +``` + + + +{`# Description fields are for documentation purposes +- name: check_runs + props: + - name: deployment_id + value: "{{ deployment_id }}" + description: Required parameter for the check_runs resource. + - name: check_id + value: "{{ check_id }}" + - name: team_id + value: "{{ team_id }}" + description: The Team identifier to perform the request on behalf of. + description: The Team identifier to perform the request on behalf of. + - name: slug + value: "{{ slug }}" + description: The Team slug to perform the request on behalf of. + description: The Team slug to perform the request on behalf of. +`} + + + + + +## `UPDATE` examples + + + + +Update an existing check run for a deployment. + +```sql +UPDATE vercel.checks.check_runs +SET +external_id = '{{ external_id }}', +external_url = '{{ external_url }}', +status = '{{ status }}', +output = '{{ output }}', +completed_at = {{ completed_at }}, +conclusion = '{{ conclusion }}', +conclusion_text = '{{ conclusion_text }}' +WHERE +deployment_id = '{{ deployment_id }}' --required +AND check_run_id = '{{ check_run_id }}' --required +AND team_id = '{{ team_id}}' +AND slug = '{{ slug}}' +RETURNING +id, +name, +check_id, +deployment_id, +external_id, +owner_id, +project_id, +blocks, +completed_at, +conclusion, +conclusion_text, +created_at, +external_url, +output, +requires, +source, +status, +targets, +timeout, +updated_at; +``` + + diff --git a/website/docs/services/checks/deployment_checks/index.md b/website/docs/services/checks/deployment_checks/index.md new file mode 100644 index 0000000..b8bc0c2 --- /dev/null +++ b/website/docs/services/checks/deployment_checks/index.md @@ -0,0 +1,564 @@ +--- +title: deployment_checks +hide_title: false +hide_table_of_contents: false +keywords: + - deployment_checks + - checks + - vercel + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a deployment_checks resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string
string
string (wire: deploymentId)
string (wire: externalId)
string (wire: integrationId)
boolean (false, true)
number (wire: completedAt)
string (canceled, failed, neutral, skipped, stale, succeeded)
number (wire: createdAt)
string (wire: detailsUrl)
object
string
boolean (false, true)
number (wire: startedAt)
string (completed, registered, running)
number (wire: updatedAt)
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string
string
string (wire: integrationId)
boolean (false, true)
number (wire: completedAt)
string (canceled, failed, neutral, skipped, stale, succeeded)
number (wire: createdAt)
string (wire: detailsUrl)
object
string
boolean (false, true)
number (wire: startedAt)
string (completed, registered, running)
number (wire: updatedAt)
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
deployment_id, check_idteam_id, slugReturn a detailed response for a single check.
deployment_idteam_id, slugList all of the checks created for a deployment.
deployment_id, name, blockingteam_id, slugCreates a new check. This endpoint must be called with an OAuth2 or it will produce a 400 error.
deployment_id, check_idteam_id, slugUpdate an existing check. This endpoint must be called with an OAuth2 or it will produce a 400 error.
deployment_id, check_idautoUpdate, teamId, slugRerequest a selected check that has failed.
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringThe check to rerun
stringThe deployment to rerun the check for.
booleanMark the check as running
stringThe Team slug to perform the request on behalf of.
stringThe Team identifier to perform the request on behalf of.
stringThe Team identifier to perform the request on behalf of. (wire: teamId)
+ +## `SELECT` examples + + + + +Return a detailed response for a single check. + +```sql +SELECT +id, +name, +deployment_id, +external_id, +integration_id, +blocking, +completed_at, +conclusion, +created_at, +details_url, +output, +path, +rerequestable, +started_at, +status, +updated_at +FROM vercel.checks.deployment_checks +WHERE deployment_id = '{{ deployment_id }}' -- required +AND check_id = '{{ check_id }}' -- required +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + + +List all of the checks created for a deployment. + +```sql +SELECT +id, +name, +integration_id, +blocking, +completed_at, +conclusion, +created_at, +details_url, +output, +path, +rerequestable, +started_at, +status, +updated_at +FROM vercel.checks.deployment_checks +WHERE deployment_id = '{{ deployment_id }}' -- required +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + + + +## `INSERT` examples + + + + +Creates a new check. This endpoint must be called with an OAuth2 or it will produce a 400 error. + +```sql +INSERT INTO vercel.checks.deployment_checks ( +name, +path, +blocking, +details_url, +external_id, +rerequestable, +deployment_id, +team_id, +slug +) +SELECT +'{{ name }}' /* required */, +'{{ path }}', +{{ blocking }} /* required */, +'{{ details_url }}', +'{{ external_id }}', +{{ rerequestable }}, +'{{ deployment_id }}', +'{{ team_id }}', +'{{ slug }}' +RETURNING +id, +name, +deployment_id, +external_id, +integration_id, +blocking, +completed_at, +conclusion, +created_at, +details_url, +output, +path, +rerequestable, +started_at, +status, +updated_at +; +``` + + + +{`# Description fields are for documentation purposes +- name: deployment_checks + props: + - name: deployment_id + value: "{{ deployment_id }}" + description: Required parameter for the deployment_checks resource. + - name: name + value: "{{ name }}" + description: | + The name of the check being created + - name: path + value: "{{ path }}" + description: | + Path of the page that is being checked + - name: blocking + value: {{ blocking }} + description: | + Whether the check should block a deployment from succeeding + - name: details_url + value: "{{ details_url }}" + description: | + URL to display for further details + - name: external_id + value: "{{ external_id }}" + description: | + An identifier that can be used as an external reference + - name: rerequestable + value: {{ rerequestable }} + description: | + Whether a user should be able to request for the check to be rerun if it fails + - name: team_id + value: "{{ team_id }}" + description: The Team identifier to perform the request on behalf of. + description: The Team identifier to perform the request on behalf of. + - name: slug + value: "{{ slug }}" + description: The Team slug to perform the request on behalf of. + description: The Team slug to perform the request on behalf of. +`} + + + + + +## `UPDATE` examples + + + + +Update an existing check. This endpoint must be called with an OAuth2 or it will produce a 400 error. + +```sql +UPDATE vercel.checks.deployment_checks +SET +name = '{{ name }}', +path = '{{ path }}', +status = '{{ status }}', +conclusion = '{{ conclusion }}', +details_url = '{{ details_url }}', +output = '{{ output }}', +external_id = '{{ external_id }}' +WHERE +deployment_id = '{{ deployment_id }}' --required +AND check_id = '{{ check_id }}' --required +AND team_id = '{{ team_id}}' +AND slug = '{{ slug}}' +RETURNING +id, +name, +deployment_id, +external_id, +integration_id, +blocking, +completed_at, +conclusion, +created_at, +details_url, +output, +path, +rerequestable, +started_at, +status, +updated_at; +``` + + + + +## Lifecycle Methods + +EXEC variables use wire (API) names. + + + + +Rerequest a selected check that has failed. + +```sql +EXEC vercel.checks.deployment_checks.rerequest +@deployment_id='{{ deployment_id }}' --required, +@check_id='{{ check_id }}' --required, +@autoUpdate={{ autoUpdate }}, +@teamId='{{ teamId }}', +@slug='{{ slug }}' +; +``` + + diff --git a/website/docs/services/checks/deployments/index.md b/website/docs/services/checks/deployments/index.md deleted file mode 100644 index 41fad5e..0000000 --- a/website/docs/services/checks/deployments/index.md +++ /dev/null @@ -1,522 +0,0 @@ ---- -title: deployments -hide_title: false -hide_table_of_contents: false -keywords: - - deployments - - checks - - vercel - - infrastructure-as-code - - configuration-as-data - - cloud inventory -description: Query, deploy and manage vercel resources using SQL -custom_edit_url: null -image: /img/stackql-vercel-provider-featured-image.png ---- - -import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; - -Creates, updates, deletes, gets or lists a deployments resource. - -## Overview - - - - -
Namedeployments
TypeResource
Id
- -## Fields - -The following fields are returned by `SELECT` queries: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDatatypeDescription
string
string
boolean
number
string
number
string
string
string
string
object
string
boolean
number
string
number
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDatatypeDescription
string
string
number
string
number
string
string
object
string
boolean
number
string
number
-
-
- -## Methods - -The following methods are available for this resource: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameAccessible byRequired ParamsOptional ParamsDescription
deploymentId, checkId, teamIdReturn a detailed response for a single check.
deploymentId, teamIdList all of the checks created for a deployment.
deploymentId, teamId, data__name, data__blockingCreates a new check. This endpoint must be called with an OAuth2 or it will produce a 400 error.
deploymentId, teamIdList all of the checks created for a deployment.
deploymentId, checkId, teamIdUpdate an existing check. This endpoint must be called with an OAuth2 or it will produce a 400 error.
deploymentId, checkId, teamIdRerequest a selected check that has failed.
- -## Parameters - -Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDatatypeDescription
stringThe check to rerun
stringThe deployment to rerun the check for.
stringThe Team identifier or slug to perform the request on behalf of.
- -## `SELECT` examples - - - - -Return a detailed response for a single check. - -```sql -SELECT -id, -name, -blocking, -completedAt, -conclusion, -createdAt, -deploymentId, -detailsUrl, -externalId, -integrationId, -output, -path, -rerequestable, -startedAt, -status, -updatedAt -FROM vercel.checks.deployments -WHERE deploymentId = '{{ deploymentId }}' -- required -AND checkId = '{{ checkId }}' -- required -AND teamId = '{{ teamId }}' -- required -; -``` - - - -List all of the checks created for a deployment. - -```sql -SELECT -id, -name, -completedAt, -conclusion, -createdAt, -detailsUrl, -integrationId, -output, -path, -rerequestable, -startedAt, -status, -updatedAt -FROM vercel.checks.deployments -WHERE deploymentId = '{{ deploymentId }}' -- required -AND teamId = '{{ teamId }}' -- required -; -``` - - - - -## `INSERT` examples - - - - -Creates a new check. This endpoint must be called with an OAuth2 or it will produce a 400 error. - -```sql -INSERT INTO vercel.checks.deployments ( -data__name, -data__path, -data__blocking, -data__detailsUrl, -data__externalId, -data__rerequestable, -deploymentId, -teamId -) -SELECT -'{{ name }}' /* required */, -'{{ path }}', -{{ blocking }} /* required */, -'{{ detailsUrl }}', -'{{ externalId }}', -{{ rerequestable }}, -'{{ deploymentId }}', -'{{ teamId }}' -RETURNING -id, -name, -blocking, -completedAt, -conclusion, -createdAt, -deploymentId, -detailsUrl, -externalId, -integrationId, -output, -path, -rerequestable, -startedAt, -status, -updatedAt -; -``` - - - -```yaml -# Description fields are for documentation purposes -- name: deployments - props: - - name: deploymentId - value: string - description: Required parameter for the deployments resource. - - name: teamId - value: string - description: Required parameter for the deployments resource. - - name: name - value: string - description: | - The name of the check being created - - name: path - value: string - description: | - Path of the page that is being checked - - name: blocking - value: boolean - description: | - Whether the check should block a deployment from succeeding - - name: detailsUrl - value: string - description: | - URL to display for further details - - name: externalId - value: string - description: | - An identifier that can be used as an external reference - - name: rerequestable - value: boolean - description: | - Whether a user should be able to request for the check to be rerun if it fails -``` - - - - -## Lifecycle Methods - - - - -List all of the checks created for a deployment. - -```sql -EXEC vercel.checks.deployments._get_all_checks -@deploymentId='{{ deploymentId }}' --required, -@teamId='{{ teamId }}' --required -; -``` - - - -Update an existing check. This endpoint must be called with an OAuth2 or it will produce a 400 error. - -```sql -EXEC vercel.checks.deployments.update_check -@deploymentId='{{ deploymentId }}' --required, -@checkId='{{ checkId }}' --required, -@teamId='{{ teamId }}' --required -@@json= -'{ -"name": "{{ name }}", -"path": "{{ path }}", -"status": "{{ status }}", -"conclusion": "{{ conclusion }}", -"detailsUrl": "{{ detailsUrl }}", -"output": "{{ output }}", -"externalId": "{{ externalId }}" -}' -; -``` - - - -Rerequest a selected check that has failed. - -```sql -EXEC vercel.checks.deployments.rerequest_check -@deploymentId='{{ deploymentId }}' --required, -@checkId='{{ checkId }}' --required, -@teamId='{{ teamId }}' --required -; -``` - - diff --git a/website/docs/services/checks/index.md b/website/docs/services/checks/index.md index 58f4f28..92533bf 100644 --- a/website/docs/services/checks/index.md +++ b/website/docs/services/checks/index.md @@ -18,16 +18,17 @@ checks service documentation. :::info[Service Summary] -total resources: __1__ +total resources: __3__ ::: ## Resources \ No newline at end of file diff --git a/website/docs/services/checks/project_checks/index.md b/website/docs/services/checks/project_checks/index.md new file mode 100644 index 0000000..01767a8 --- /dev/null +++ b/website/docs/services/checks/project_checks/index.md @@ -0,0 +1,557 @@ +--- +title: project_checks +hide_title: false +hide_table_of_contents: false +keywords: + - project_checks + - checks + - vercel + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a project_checks resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string
string
string (wire: ownerId)
string (wire: projectId)
string (wire: sourceIntegrationConfigurationId)
string (build-start, deployment-alias, deployment-promotion, deployment-start, none)
number (wire: createdAt)
number (wire: deletedAt)
boolean (false, true) (wire: isRerequestable)
string (build-ready, deployment-url, none)
object
string (git-provider, integration, vercel, webhook, integration, webhook, git-provider) (wire: sourceKind)
array
number
number (wire: updatedAt)
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string
string
string (wire: ownerId)
string (wire: projectId)
string (wire: sourceIntegrationConfigurationId)
string (build-start, deployment-alias, deployment-promotion, deployment-start, none)
number (wire: createdAt)
number (wire: deletedAt)
boolean (false, true) (wire: isRerequestable)
string (build-ready, deployment-url, none)
string (git-provider, integration, vercel, webhook, integration, webhook, git-provider) (wire: sourceKind)
array
number
number (wire: updatedAt)
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
project_id_or_name, check_idteam_id, slugReturn a detailed response for a single check.
project_id_or_nameblocks, team_id, slugList all checks for a project, optionally filtered by target.
project_id_or_name, name, requiresteam_id, slugCreates a new check for a project.
project_id_or_name, check_idteam_id, slugUpdate an existing check.
project_id_or_name, check_idteam_id, slugDelete an existing check and all of its runs.
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string
string
string
stringThe Team slug to perform the request on behalf of.
stringThe Team identifier to perform the request on behalf of. (wire: teamId)
+ +## `SELECT` examples + + + + +Return a detailed response for a single check. + +```sql +SELECT +id, +name, +owner_id, +project_id, +source_integration_configuration_id, +blocks, +created_at, +deleted_at, +is_rerequestable, +requires, +source, +source_kind, +targets, +timeout, +updated_at +FROM vercel.checks.project_checks +WHERE project_id_or_name = '{{ project_id_or_name }}' -- required +AND check_id = '{{ check_id }}' -- required +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + + +List all checks for a project, optionally filtered by target. + +```sql +SELECT +id, +name, +owner_id, +project_id, +source_integration_configuration_id, +blocks, +created_at, +deleted_at, +is_rerequestable, +requires, +source, +source_kind, +targets, +timeout, +updated_at +FROM vercel.checks.project_checks +WHERE project_id_or_name = '{{ project_id_or_name }}' -- required +AND blocks = '{{ blocks }}' +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + + + +## `INSERT` examples + + + + +Creates a new check for a project. + +```sql +INSERT INTO vercel.checks.project_checks ( +name, +is_rerequestable, +requires, +targets, +blocks, +source, +timeout, +project_id_or_name, +team_id, +slug +) +SELECT +'{{ name }}' /* required */, +{{ is_rerequestable }}, +'{{ requires }}' /* required */, +'{{ targets }}', +'{{ blocks }}', +'{{ source }}', +{{ timeout }}, +'{{ project_id_or_name }}', +'{{ team_id }}', +'{{ slug }}' +RETURNING +id, +name, +owner_id, +project_id, +source_integration_configuration_id, +blocks, +created_at, +deleted_at, +is_rerequestable, +requires, +source, +source_kind, +targets, +timeout, +updated_at +; +``` + + + +{`# Description fields are for documentation purposes +- name: project_checks + props: + - name: project_id_or_name + value: "{{ project_id_or_name }}" + description: Required parameter for the project_checks resource. + - name: name + value: "{{ name }}" + - name: is_rerequestable + value: {{ is_rerequestable }} + - name: requires + value: "{{ requires }}" + valid_values: ['build-ready', 'deployment-url', 'none'] + default: deployment-url + - name: targets + value: + - "{{ targets }}" + - name: blocks + value: "{{ blocks }}" + valid_values: ['build-start', 'deployment-start', 'deployment-alias', 'deployment-promotion', 'none'] + default: deployment-alias + - name: source + value: + kind: "{{ kind }}" + externalResourceId: "{{ externalResourceId }}" + webhookId: "{{ webhookId }}" + externalCheckName: "{{ externalCheckName }}" + provider: "{{ provider }}" + - name: timeout + value: {{ timeout }} + default: 300 + - name: team_id + value: "{{ team_id }}" + description: The Team identifier to perform the request on behalf of. + description: The Team identifier to perform the request on behalf of. + - name: slug + value: "{{ slug }}" + description: The Team slug to perform the request on behalf of. + description: The Team slug to perform the request on behalf of. +`} + + + + + +## `UPDATE` examples + + + + +Update an existing check. + +```sql +UPDATE vercel.checks.project_checks +SET +name = '{{ name }}', +is_rerequestable = {{ is_rerequestable }}, +requires = '{{ requires }}', +targets = '{{ targets }}', +blocks = '{{ blocks }}', +timeout = {{ timeout }} +WHERE +project_id_or_name = '{{ project_id_or_name }}' --required +AND check_id = '{{ check_id }}' --required +AND team_id = '{{ team_id}}' +AND slug = '{{ slug}}' +RETURNING +id, +name, +owner_id, +project_id, +source_integration_configuration_id, +blocks, +created_at, +deleted_at, +is_rerequestable, +requires, +source, +source_kind, +targets, +timeout, +updated_at; +``` + + + + +## `DELETE` examples + + + + +Delete an existing check and all of its runs. + +```sql +DELETE FROM vercel.checks.project_checks +WHERE project_id_or_name = '{{ project_id_or_name }}' --required +AND check_id = '{{ check_id }}' --required +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + diff --git a/website/docs/services/connect/connector_project_connections/index.md b/website/docs/services/connect/connector_project_connections/index.md new file mode 100644 index 0000000..334681e --- /dev/null +++ b/website/docs/services/connect/connector_project_connections/index.md @@ -0,0 +1,355 @@ +--- +title: connector_project_connections +hide_title: false +hide_table_of_contents: false +keywords: + - connector_project_connections + - connect + - vercel + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a connector_project_connections resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + +The connector project connection. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringStable `scl_` connector ID, even when the request used a UID. (wire: connectorId)
numberTime when the project connection was created, in epoch milliseconds. (wire: createdAt)
arrayEnvironments where the connector is enabled for the project. (wire: enabledEnvironments)
objectVercel project connected to the connector.
numberTime when the project connection was last updated, in epoch milliseconds. (wire: updatedAt)
+
+ + +A page of project connections for the connector. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringStable `scl_` connector ID, even when the request used a UID. (wire: connectorId)
numberTime when the project connection was created, in epoch milliseconds. (wire: createdAt)
arrayEnvironments where the connector is enabled for the project. (wire: enabledEnvironments)
objectVercel project connected to the connector.
numberTime when the project connection was last updated, in epoch milliseconds. (wire: updatedAt)
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
connector, project_idteam_id, slugGet the configuration that connects a connector to a project.
connectorlimit, cursor, team_id, slugList the projects connected to a connector and the environments where each connection is available.
connector, project_id, environmentsteam_id, slugConnect a connector to a project, or replace the environments on an existing project connection.
connector, project_idteam_id, slugDisconnect a connector from a project.
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringStable connector ID or URL-encoded team-scoped UID. Examples: `scl_abc123` or `slack%2Fmy-bot`.
stringVercel project ID.
stringCursor from `pagination.next` on the previous response.
integerMaximum number of project connections to return. Defaults to 50.
stringThe team slug that scopes the request. Do not send it with teamId. If both are omitted, Vercel uses the team associated with the token or the authenticated user's default team. The request returns 401 if no team can be selected.
stringThe team ID that scopes the request. Do not send it with slug. If both are omitted, Vercel uses the team associated with the token or the authenticated user's default team. The request returns 401 if no team can be selected. (wire: teamId)
+ +## `SELECT` examples + + + + +Get the configuration that connects a connector to a project. + +```sql +SELECT +connector_id, +created_at, +enabled_environments, +project, +updated_at +FROM vercel.connect.connector_project_connections +WHERE connector = '{{ connector }}' -- required +AND project_id = '{{ project_id }}' -- required +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + + +List the projects connected to a connector and the environments where each connection is available. + +```sql +SELECT +connector_id, +created_at, +enabled_environments, +project, +updated_at +FROM vercel.connect.connector_project_connections +WHERE connector = '{{ connector }}' -- required +AND limit = '{{ limit }}' +AND cursor = '{{ cursor }}' +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + + + +## `INSERT` examples + + + + +Connect a connector to a project, or replace the environments on an existing project connection. + +```sql +INSERT INTO vercel.connect.connector_project_connections ( +environments, +connector, +project_id, +team_id, +slug +) +SELECT +'{{ environments }}' /* required */, +'{{ connector }}', +'{{ project_id }}', +'{{ team_id }}', +'{{ slug }}' +RETURNING +connector_id, +created_at, +enabled_environments, +project, +updated_at +; +``` + + + +{`# Description fields are for documentation purposes +- name: connector_project_connections + props: + - name: connector + value: "{{ connector }}" + description: Required parameter for the connector_project_connections resource. + - name: project_id + value: "{{ project_id }}" + description: Required parameter for the connector_project_connections resource. + - name: environments + value: "{{ environments }}" + description: | + One or more built-in environment names or stable custom environment IDs that belong to the project. Duplicate values are accepted and removed. + - name: team_id + value: "{{ team_id }}" + description: The team ID that scopes the request. Do not send it with slug. If both are omitted, Vercel uses the team associated with the token or the authenticated user's default team. The request returns 401 if no team can be selected. + description: The team ID that scopes the request. Do not send it with slug. If both are omitted, Vercel uses the team associated with the token or the authenticated user's default team. The request returns 401 if no team can be selected. + - name: slug + value: "{{ slug }}" + description: The team slug that scopes the request. Do not send it with teamId. If both are omitted, Vercel uses the team associated with the token or the authenticated user's default team. The request returns 401 if no team can be selected. + description: The team slug that scopes the request. Do not send it with teamId. If both are omitted, Vercel uses the team associated with the token or the authenticated user's default team. The request returns 401 if no team can be selected. +`} + + + + + +## `DELETE` examples + + + + +Disconnect a connector from a project. + +```sql +DELETE FROM vercel.connect.connector_project_connections +WHERE connector = '{{ connector }}' --required +AND project_id = '{{ project_id }}' --required +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + diff --git a/website/docs/services/connect/connectors/index.md b/website/docs/services/connect/connectors/index.md new file mode 100644 index 0000000..6405f29 --- /dev/null +++ b/website/docs/services/connect/connectors/index.md @@ -0,0 +1,1209 @@ +--- +title: connectors +hide_title: false +hide_table_of_contents: false +keywords: + - connectors + - connect + - vercel + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a connectors resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + +The connector. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringStable `scl_` connector ID. Use this value directly in `{connector}`.
stringConnector name within the owning team.
stringInstallation used when a token request does not specify an installation. (wire: defaultInstallationId)
stringHuman-readable connector name. (wire: displayName)
stringHuman-readable name of the connector type. (wire: typeName)
stringHex accent color (e.g., `#000000`) for branding. (wire: accentColor)
objectApp-token capabilities and known grants for the connector. (wire: appTokens)
stringHex background color (e.g., `#000000`) for branding. (wire: backgroundColor)
stringProvider-side URL for viewing or managing the resource represented by the connector. The destination can be an app, account, phone line, or service instance, depending on the connector type. (wire: clientUrl)
stringThe connection method this connector was created from, when the create request named one. (wire: connectionMethod)
numberCreation time in epoch milliseconds. (wire: createdAt)
objectPrincipal that created the connector. (wire: createdBy)
stringHow the connector row was originally created. New create paths stamp this explicitly; older rows may omit it. (managed, manual) (wire: creationMode)
stringDeveloper website for the connected service.
stringDeveloper documentation for the connected service.
arrayKnown events this connector subscribes to (e.g. Slack bot events, GitHub webhook events). Names are type-specific and validated by the managed-create flow when forwarded to the third-party service.
stringConnector branding icon. SHA-1 hash that resolves to the uploaded icon through the Vercel avatar service. Consumers render this with `https:​//vercel.com/api/www/avatar/{icon}`.
objectManaged connector metadata exposed without leaking the manager connector or installation identifiers.
stringRedirect URI registered with the third-party service for this connector, if any. Used by `startAuthorization`/`startInstallation` to replay the exact URI back to the provider's token endpoint. Absent on connectors created before this field was introduced; those callers fall back to the `https:​//connect.vercel.com/callback` default. (wire: redirectUri)
numberTime when this connector started requiring reinstallation because an installation-affecting app-token grant changed. (wire: reinstallAt)
stringBest-effort identifier of the third-party service this connector represents, independent of `type`. Examples: `'slack'`, `'mcp.linear.app'`, and `'auth.example.com'`. Always present in API responses.
arrayToken subject types supported by the connector. (wire: supportedSubjectTypes)
Whether the connector icon can propagate to the provider. (false, maybe, true) (wire: supportsIcon)
booleanWhether the connector supports an installation flow. (false, true) (wire: supportsInstallation)
booleanWhether Connect can revoke tokens for this connector. (false, true) (wire: supportsRevocation)
booleanWhether this connector type supports trigger webhooks. Derived from the type definition; indicates that `triggers` and `triggerDestinations` may be meaningful for this connector. (false, true) (wire: supportsTriggers)
stringWhich of the service's products/surfaces this connector points at.
arrayDestinations that incoming triggers should be forwarded to. Limited to 3 entries. Set the initial destination with `triggerDestination` during creation. Replace the complete set with `PATCH /v1/connect/connectors/{connector}/trigger-destinations`. (wire: triggerDestinations)
objectIncoming trigger configuration for the connector.
stringConnector implementation type. (api-key, aws-alpha, custom, discord, github, linear, linq, microsoft-entra, microsoft-teams, oauth, photon, salesforce, sendblue, slack, snowflake, snowflake-wif)
stringIcon identifier supplied by the connector type. (wire: typeIcon)
stringTeam-scoped UID. URL-encode this value before using it in `{connector}`.
numberLast update time in epoch milliseconds. (wire: updatedAt)
objectPrincipal that most recently updated the connector. (wire: updatedBy)
objectUser-token capabilities and known grants for the connector. (wire: userTokens)
stringPublic website for the connected service.
+
+ + +A page of connectors. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringStable `scl_` connector ID. Use this value directly in `{connector}`.
stringConnector name within the owning team.
stringInstallation used when a token request does not specify an installation. (wire: defaultInstallationId)
stringHuman-readable connector name. (wire: displayName)
stringHuman-readable name of the connector type. (wire: typeName)
stringHex accent color (e.g., `#000000`) for branding. (wire: accentColor)
objectApp-token capabilities and known grants for the connector. (wire: appTokens)
stringHex background color (e.g., `#000000`) for branding. (wire: backgroundColor)
stringProvider-side URL for viewing or managing the resource represented by the connector. The destination can be an app, account, phone line, or service instance, depending on the connector type. (wire: clientUrl)
stringThe connection method this connector was created from, when the create request named one. (wire: connectionMethod)
numberCreation time in epoch milliseconds. (wire: createdAt)
objectPrincipal that created the connector. (wire: createdBy)
stringHow the connector row was originally created. New create paths stamp this explicitly; older rows may omit it. (managed, manual) (wire: creationMode)
stringDeveloper website for the connected service.
stringDeveloper documentation for the connected service.
arrayKnown events this connector subscribes to (e.g. Slack bot events, GitHub webhook events). Names are type-specific and validated by the managed-create flow when forwarded to the third-party service.
stringConnector branding icon. SHA-1 hash that resolves to the uploaded icon through the Vercel avatar service. Consumers render this with `https:​//vercel.com/api/www/avatar/{icon}`.
objectManaged connector metadata exposed without leaking the manager connector or installation identifiers.
stringRedirect URI registered with the third-party service for this connector, if any. Used by `startAuthorization`/`startInstallation` to replay the exact URI back to the provider's token endpoint. Absent on connectors created before this field was introduced; those callers fall back to the `https:​//connect.vercel.com/callback` default. (wire: redirectUri)
numberTime when this connector started requiring reinstallation because an installation-affecting app-token grant changed. (wire: reinstallAt)
stringBest-effort identifier of the third-party service this connector represents, independent of `type`. Examples: `'slack'`, `'mcp.linear.app'`, and `'auth.example.com'`. Always present in API responses.
arrayToken subject types supported by the connector. (wire: supportedSubjectTypes)
Whether the connector icon can propagate to the provider. (false, maybe, true) (wire: supportsIcon)
booleanWhether the connector supports an installation flow. (false, true) (wire: supportsInstallation)
booleanWhether Connect can revoke tokens for this connector. (false, true) (wire: supportsRevocation)
booleanWhether this connector type supports trigger webhooks. Derived from the type definition; indicates that `triggers` and `triggerDestinations` may be meaningful for this connector. (false, true) (wire: supportsTriggers)
stringWhich of the service's products/surfaces this connector points at.
arrayDestinations that incoming triggers should be forwarded to. Limited to 3 entries. Set the initial destination with `triggerDestination` during creation. Replace the complete set with `PATCH /v1/connect/connectors/{connector}/trigger-destinations`. (wire: triggerDestinations)
objectIncoming trigger configuration for the connector.
stringConnector implementation type. (api-key, aws-alpha, custom, discord, github, linear, linq, microsoft-entra, microsoft-teams, oauth, photon, salesforce, sendblue, slack, snowflake, snowflake-wif)
stringIcon identifier supplied by the connector type. (wire: typeIcon)
stringTeam-scoped UID. URL-encode this value before using it in `{connector}`.
numberLast update time in epoch milliseconds. (wire: updatedAt)
objectPrincipal that most recently updated the connector. (wire: updatedBy)
objectUser-token capabilities and known grants for the connector. (wire: userTokens)
stringPublic website for the connected service.
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
connectorteam_id, slugGet the connector by ID. Accepts a dashboard/team requester or a deployment's project OIDC token; project requesters may only read connectors linked to their project and environment.
limit, cursor, project_id, search, type, service, sort, team_id, slugList connectors that belong to a team.
data, type, service, connection_methodteam_id, slugCreate a connector and optionally link it to a project. Use `type` with complete provider data, or use `service` with `connectionMethod` so Connect can supply the type, endpoints, templates, and defaults.
connectorteam_id, slugUpdate a connector and return the connector with any service-side update signals that the caller must handle.
connectorteam_id, slugDelete a connector, its project connections, and its installation records.
connector, destinationsteamId, slugReplace the full set of destinations that receive trigger requests for a connector.
connectorGet an access token for a connector identified by the path parameter and scoped to the requester.
connectorCreate an authorization request for a connector and return the URL and verifier details needed to complete the flow.
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string
stringCursor from `pagination.next` on the previous response.
integerMaximum number of connectors to return. Defaults to 20.
stringReturn only connectors connected to this project. (wire: projectId)
stringComma-separated provider or service identifiers.
stringThe team slug that scopes the request. Do not send it with teamId. If both are omitted, Vercel uses the team associated with the token or the authenticated user's default team. The request returns 401 if no team can be selected.
stringSort by name in ascending order, or by creation or update time in descending order.
stringThe team ID that scopes the request. Do not send it with slug. If both are omitted, Vercel uses the team associated with the token or the authenticated user's default team. The request returns 401 if no team can be selected.
stringThe team ID that scopes the request. Do not send it with slug. If both are omitted, Vercel uses the team associated with the token or the authenticated user's default team. The request returns 401 if no team can be selected. (wire: teamId)
stringComma-separated connector types: `slack`, `discord`, `github`, `linear`, `linq`, `salesforce`, `sendblue`, `snowflake`, `snowflake-wif`, `microsoft-entra`, `api-key`, `photon`, `oauth`, or `custom`.
+ +## `SELECT` examples + + + + +Get the connector by ID. Accepts a dashboard/team requester or a deployment's project OIDC token; project requesters may only read connectors linked to their project and environment. + +```sql +SELECT +id, +name, +default_installation_id, +display_name, +type_name, +accent_color, +app_tokens, +background_color, +client_url, +connection_method, +created_at, +created_by, +creation_mode, +devsite, +docsite, +events, +icon, +managed, +redirect_uri, +reinstall_at, +service, +supported_subject_types, +supports_icon, +supports_installation, +supports_revocation, +supports_triggers, +target, +trigger_destinations, +triggers, +type, +type_icon, +uid, +updated_at, +updated_by, +user_tokens, +website +FROM vercel.connect.connectors +WHERE connector = '{{ connector }}' -- required +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + + +List connectors that belong to a team. + +```sql +SELECT +id, +name, +default_installation_id, +display_name, +type_name, +accent_color, +app_tokens, +background_color, +client_url, +connection_method, +created_at, +created_by, +creation_mode, +devsite, +docsite, +events, +icon, +managed, +redirect_uri, +reinstall_at, +service, +supported_subject_types, +supports_icon, +supports_installation, +supports_revocation, +supports_triggers, +target, +trigger_destinations, +triggers, +type, +type_icon, +uid, +updated_at, +updated_by, +user_tokens, +website +FROM vercel.connect.connectors +WHERE limit = '{{ limit }}' +AND cursor = '{{ cursor }}' +AND project_id = '{{ project_id }}' +AND search = '{{ search }}' +AND type = '{{ type }}' +AND service = '{{ service }}' +AND sort = '{{ sort }}' +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + + + +## `INSERT` examples + + + + +Create a connector and optionally link it to a project. Use `type` with complete provider data, or use `service` with `connectionMethod` so Connect can supply the type, endpoints, templates, and defaults. + +```sql +INSERT INTO vercel.connect.connectors ( +data, +icon, +background_color, +accent_color, +type, +service, +connection_method, +params, +target, +uid, +name, +project_id, +environments, +triggers, +trigger_destination, +events, +team_id, +slug +) +SELECT +'{{ data }}' /* required */, +'{{ icon }}', +'{{ background_color }}', +'{{ accent_color }}', +'{{ type }}' /* required */, +'{{ service }}' /* required */, +'{{ connection_method }}' /* required */, +'{{ params }}', +'{{ target }}', +'{{ uid }}', +'{{ name }}', +'{{ project_id }}', +'{{ environments }}', +{{ triggers }}, +'{{ trigger_destination }}', +'{{ events }}', +'{{ team_id }}', +'{{ slug }}' +RETURNING +id, +name, +default_installation_id, +display_name, +type_name, +accent_color, +app_tokens, +background_color, +client_url, +connection_method, +created_at, +created_by, +creation_mode, +devsite, +docsite, +events, +icon, +managed, +redirect_uri, +reinstall_at, +service, +supported_subject_types, +supports_icon, +supports_installation, +supports_revocation, +supports_triggers, +target, +trigger_destinations, +triggers, +type, +type_icon, +uid, +updated_at, +updated_by, +user_tokens, +website +; +``` + + + +{`# Description fields are for documentation purposes +- name: connectors + props: + - name: data + description: | + Provider configuration for the selected connector type or connection method. + value: + serverUrl: "{{ serverUrl }}" + serverConfig: + issuer: "{{ issuer }}" + authorization_endpoint: "{{ authorization_endpoint }}" + token_endpoint: "{{ token_endpoint }}" + userinfo_endpoint: "{{ userinfo_endpoint }}" + jwks_uri: "{{ jwks_uri }}" + jwks: + keys: + - kty: "{{ kty }}" + kid: "{{ kid }}" + use: "{{ use }}" + key_ops: "{{ key_ops }}" + alg: "{{ alg }}" + revocation_endpoint: "{{ revocation_endpoint }}" + introspection_endpoint: "{{ introspection_endpoint }}" + end_session_endpoint: "{{ end_session_endpoint }}" + device_authorization_endpoint: "{{ device_authorization_endpoint }}" + registration_endpoint: "{{ registration_endpoint }}" + response_types_supported: + - "{{ response_types_supported }}" + token_endpoint_auth_methods_supported: + - "{{ token_endpoint_auth_methods_supported }}" + token_endpoint_auth_signing_alg_values_supported: + - "{{ token_endpoint_auth_signing_alg_values_supported }}" + scopes_supported: + - "{{ scopes_supported }}" + grant_types_supported: + - "{{ grant_types_supported }}" + response_modes_supported: + - "{{ response_modes_supported }}" + subject_types_supported: + - "{{ subject_types_supported }}" + id_token_signing_alg_values_supported: + - "{{ id_token_signing_alg_values_supported }}" + id_token_encryption_alg_values_supported: + - "{{ id_token_encryption_alg_values_supported }}" + id_token_encryption_enc_values_supported: + - "{{ id_token_encryption_enc_values_supported }}" + claim_types_supported: + - "{{ claim_types_supported }}" + claims_supported: + - "{{ claims_supported }}" + code_challenge_methods_supported: + - "{{ code_challenge_methods_supported }}" + prompt_values_supported: + - "{{ prompt_values_supported }}" + claims_parameter_supported: {{ claims_parameter_supported }} + request_parameter_supported: {{ request_parameter_supported }} + request_uri_parameter_supported: {{ request_uri_parameter_supported }} + require_request_uri_registration: {{ require_request_uri_registration }} + service_documentation: "{{ service_documentation }}" + op_policy_uri: "{{ op_policy_uri }}" + op_tos_uri: "{{ op_tos_uri }}" + logo_uri: "{{ logo_uri }}" + client_id_metadata_document_supported: {{ client_id_metadata_document_supported }} + authorization_details_types_supported: + - "{{ authorization_details_types_supported }}" + clientId: "{{ clientId }}" + clientName: "{{ clientName }}" + clientSecret: "{{ clientSecret }}" + tokenEndpointAuthMethod: "{{ tokenEndpointAuthMethod }}" + responseType: "{{ responseType }}" + pkceRequired: {{ pkceRequired }} + codeChallengeMethod: "{{ codeChallengeMethod }}" + userAuthorization: + enabled: {{ enabled }} + scopes: + - "{{ scopes }}" + refreshTokens: + enabled: {{ enabled }} + clientCredentials: + enabled: {{ enabled }} + scopes: + - "{{ scopes }}" + forwardedClaims: + idToken: + - "{{ idToken }}" + defaultAudience: "{{ defaultAudience }}" + defaultTokenExpiresIn: {{ defaultTokenExpiresIn }} + authorizationUrlParams: "{{ authorizationUrlParams }}" + jwtBearer: + enabled: {{ enabled }} + scopes: + - "{{ scopes }}" + sub: "{{ sub }}" + iss: "{{ iss }}" + aud: "{{ aud }}" + additionalClaims: "{{ additionalClaims }}" + ttl: {{ ttl }} + useClientCredentials: {{ useClientCredentials }} + clientAssertion: + type: "{{ type }}" + ttl: {{ ttl }} + claims: "{{ claims }}" + subjectType: "{{ subjectType }}" + values: + - value: "{{ value }}" + scope: "{{ scope }}" + expiresAt: {{ expiresAt }} + serviceUrls: + - "{{ serviceUrls }}" + instructions: "{{ instructions }}" + appId: {{ appId }} + appSlug: "{{ appSlug }}" + appName: "{{ appName }}" + owner: + type: "{{ type }}" + id: {{ id }} + slug: "{{ slug }}" + name: "{{ name }}" + privateKeyPem: "{{ privateKeyPem }}" + webhookSecret: "{{ webhookSecret }}" + extras: "{{ extras }}" + appScopes: + - "{{ appScopes }}" + userScopes: + - "{{ userScopes }}" + ownerOrganization: + id: "{{ id }}" + slug: "{{ slug }}" + name: "{{ name }}" + logoUrl: "{{ logoUrl }}" + application: + id: "{{ id }}" + clientId: "{{ clientId }}" + name: "{{ name }}" + description: "{{ description }}" + developer: "{{ developer }}" + developerUrl: "{{ developerUrl }}" + imageUrl: "{{ imageUrl }}" + redirectUris: + - "{{ redirectUris }}" + distribution: "{{ distribution }}" + webhookResourceTypes: + - "{{ webhookResourceTypes }}" + webhookUrl: "{{ webhookUrl }}" + webhookEnabled: {{ webhookEnabled }} + createdAt: "{{ createdAt }}" + updatedAt: "{{ updatedAt }}" + apiToken: "{{ apiToken }}" + phoneNumbers: + - "{{ phoneNumbers }}" + consumerKey: "{{ consumerKey }}" + consumerSecret: "{{ consumerSecret }}" + loginHost: "{{ loginHost }}" + apiKeyId: "{{ apiKeyId }}" + apiSecretKey: "{{ apiSecretKey }}" + slackTeam: + id: "{{ id }}" + name: "{{ name }}" + domain: "{{ domain }}" + signingSecret: "{{ signingSecret }}" + verificationToken: "{{ verificationToken }}" + botScopes: + - "{{ botScopes }}" + slashCommands: + - command: "{{ command }}" + description: "{{ description }}" + usageHint: "{{ usageHint }}" + shouldEscape: {{ shouldEscape }} + shortcuts: + - type: "{{ type }}" + name: "{{ name }}" + callbackId: "{{ callbackId }}" + description: "{{ description }}" + accountIdentifier: "{{ accountIdentifier }}" + defaultSessionRole: "{{ defaultSessionRole }}" + projectId: "{{ projectId }}" + projectSecret: "{{ projectSecret }}" + - name: icon + value: "{{ icon }}" + description: | + SHA-1 digest of a PNG or JPEG icon that is at least 640 by 640 pixels. This field does not accept a URL or image bytes. + First compute the digest and upload the raw image with [POST /v2/files](https://vercel.com/docs/rest-api/deployments/upload-deployment-files). Send \`Content-Length\` and the same 40-character digest in \`x-vercel-digest\`. Then set \`icon\` to that digest. + \`\`\`js + import { createHash } from 'node:crypto'; + import { readFile } from 'node:fs/promises'; + const VERCEL_TOKEN = process.env.VERCEL_TOKEN; + const connectorId = 'scl_...'; + const bytes = await readFile('icon.png'); + const digest = createHash('sha1').update(bytes).digest('hex'); + await fetch('https://api.vercel.com/v2/files', { + method: 'POST', + headers: { + Authorization: \`Bearer \${VERCEL_TOKEN}\`, + 'Content-Type': 'application/octet-stream', + 'Content-Length': String(bytes.length), + 'x-vercel-digest': digest, + }, + body: bytes, + }); + await fetch(\`https://api.vercel.com/v2/connect/connectors/\${connectorId}\`, { + method: 'PATCH', + headers: { + Authorization: \`Bearer \${VERCEL_TOKEN}\`, + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ icon: digest }), + }); + \`\`\` + - name: background_color + value: "{{ background_color }}" + description: | + Branding background color (6-digit hex, for example + - name: accent_color + value: "{{ accent_color }}" + description: | + Branding accent color (6-digit hex, for example + - name: type + value: "{{ type }}" + description: | + Connector implementation type for full configuration. Known types: api-key, discord, github, linear, linq, microsoft-entra, oauth, photon, salesforce, sendblue, slack, snowflake, snowflake-wif. Optional when service and connectionMethod select the type. + - name: service + value: "{{ service }}" + description: | + Service slug or URL for which the connector is used. Required when connectionMethod is set. Service alone does not enable preset configuration. + - name: connection_method + value: "{{ connection_method }}" + description: | + Connection method slug of the service. Use it with service to select preset configuration. + - name: params + value: "{{ params }}" + description: | + Values for the selected connection method's template fields. Requires connectionMethod. + - name: target + value: "{{ target }}" + description: | + Which of the service's targets this connector is for. Requires \"connectionMethod\" and must be one that method serves. Optional. + - name: uid + value: "{{ uid }}" + description: | + Optional team-scoped unique identifier for the connector. If omitted or empty, Connect generates a value. + - name: name + value: "{{ name }}" + description: | + Connector name. The value is trimmed and cannot contain control characters. If omitted or empty, the project name is used. A name or projectId is required. API key connectors require name. + - name: project_id + value: "{{ project_id }}" + description: | + Project to connect during creation. If environments is omitted, the connection uses development, preview, and production. + - name: environments + value: "{{ environments }}" + description: | + Environments for the project connection. Requires projectId. Use one or more built-in environment names or stable custom environment IDs that belong to the project. Duplicate values are accepted and removed. + - name: triggers + value: {{ triggers }} + description: | + Whether the triggers are enabled for this connector. + - name: trigger_destination + description: | + Initial trigger destination. Requires triggers to be enabled and a projectId here or at the top level. Connector responses expose the resulting set as triggerDestinations. Replace the complete set with PATCH /v1/connect/connectors/{connector}/trigger-destinations. + value: + projectId: "{{ projectId }}" + path: "{{ path }}" + branch: "{{ branch }}" + customEnvironmentId: "{{ customEnvironmentId }}" + - name: events + value: + - "{{ events }}" + description: | + Default trigger events for this connector. + - name: team_id + value: "{{ team_id }}" + description: The team ID that scopes the request. Do not send it with slug. If both are omitted, Vercel uses the team associated with the token or the authenticated user's default team. The request returns 401 if no team can be selected. + description: The team ID that scopes the request. Do not send it with slug. If both are omitted, Vercel uses the team associated with the token or the authenticated user's default team. The request returns 401 if no team can be selected. + - name: slug + value: "{{ slug }}" + description: The team slug that scopes the request. Do not send it with teamId. If both are omitted, Vercel uses the team associated with the token or the authenticated user's default team. The request returns 401 if no team can be selected. + description: The team slug that scopes the request. Do not send it with teamId. If both are omitted, Vercel uses the team associated with the token or the authenticated user's default team. The request returns 401 if no team can be selected. +`} + + + + + +## `UPDATE` examples + + + + +Update a connector and return the connector with any service-side update signals that the caller must handle. + +```sql +UPDATE vercel.connect.connectors +SET +triggers = {{ triggers }}, +events = '{{ events }}', +data = '{{ data }}', +icon = '{{ icon }}', +background_color = '{{ background_color }}', +accent_color = '{{ accent_color }}', +uid = '{{ uid }}', +name = '{{ name }}' +WHERE +connector = '{{ connector }}' --required +AND team_id = '{{ team_id}}' +AND slug = '{{ slug}}' +RETURNING +connector, +reconsent_needed, +reinstall_needed, +service_sync; +``` + + + + +## `DELETE` examples + + + + +Delete a connector, its project connections, and its installation records. + +```sql +DELETE FROM vercel.connect.connectors +WHERE connector = '{{ connector }}' --required +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + + + +## Lifecycle Methods + +EXEC variables use wire (API) names. + + + + +Replace the full set of destinations that receive trigger requests for a connector. + +```sql +EXEC vercel.connect.connectors.replace_trigger_destinations +@connector='{{ connector }}' --required, +@teamId='{{ teamId }}', +@slug='{{ slug }}' +@@json= +'{ +"destinations": "{{ destinations }}" +}' +; +``` + + + +Get an access token for a connector identified by the path parameter and scoped to the requester. + +```sql +EXEC vercel.connect.connectors.get_token +@connector='{{ connector }}' --required +@@json= +'{ +"subject": "{{ subject }}", +"installationId": "{{ installationId }}", +"audience": "{{ audience }}", +"scopes": "{{ scopes }}", +"resources": "{{ resources }}", +"authorizationDetails": "{{ authorizationDetails }}", +"validityBufferMs": {{ validityBufferMs }} +}' +; +``` + + + +Create an authorization request for a connector and return the URL and verifier details needed to complete the flow. + +```sql +EXEC vercel.connect.connectors.create_authorization_request +@connector='{{ connector }}' --required +@@json= +'{ +"subject": "{{ subject }}", +"installationId": "{{ installationId }}", +"audience": "{{ audience }}", +"scopes": "{{ scopes }}", +"resources": "{{ resources }}", +"authorizationDetails": "{{ authorizationDetails }}", +"validityBufferMs": {{ validityBufferMs }}, +"returnUrl": "{{ returnUrl }}", +"webhook": "{{ webhook }}", +"prompt": "{{ prompt }}", +"deviceCode": {{ deviceCode }}, +"expiresInMs": {{ expiresInMs }}, +"additionalParams": "{{ additionalParams }}" +}' +; +``` + + diff --git a/website/docs/services/connect/index.md b/website/docs/services/connect/index.md new file mode 100644 index 0000000..b48b2b9 --- /dev/null +++ b/website/docs/services/connect/index.md @@ -0,0 +1,34 @@ +--- +title: connect +hide_title: false +hide_table_of_contents: false +keywords: + - connect + - vercel + - stackql + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +connect service documentation. + +:::info[Service Summary] + +total resources: __3__ + +::: + +## Resources + \ No newline at end of file diff --git a/website/docs/services/connect/project_connectors/index.md b/website/docs/services/connect/project_connectors/index.md new file mode 100644 index 0000000..bc12543 --- /dev/null +++ b/website/docs/services/connect/project_connectors/index.md @@ -0,0 +1,178 @@ +--- +title: project_connectors +hide_title: false +hide_table_of_contents: false +keywords: + - project_connectors + - connect + - vercel + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a project_connectors resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + +A page of connector connections for the project. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringStable `scl_` connector ID, even when the request used a UID. (wire: connectorId)
numberTime when the project connection was created, in epoch milliseconds. (wire: createdAt)
arrayEnvironments where the connector is enabled for the project. (wire: enabledEnvironments)
objectVercel project connected to the connector.
numberTime when the project connection was last updated, in epoch milliseconds. (wire: updatedAt)
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
project_idlimit, cursor, team_id, slugList the connectors connected to a project and the environments where each connection is available.
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringVercel project ID.
stringCursor from `pagination.next` on the previous response.
integerMaximum number of connector connections to return. Defaults to 50.
stringThe team slug that scopes the request. Do not send it with teamId. If both are omitted, Vercel uses the team associated with the token or the authenticated user's default team. The request returns 401 if no team can be selected.
stringThe team ID that scopes the request. Do not send it with slug. If both are omitted, Vercel uses the team associated with the token or the authenticated user's default team. The request returns 401 if no team can be selected. (wire: teamId)
+ +## `SELECT` examples + + + + +List the connectors connected to a project and the environments where each connection is available. + +```sql +SELECT +connector_id, +created_at, +enabled_environments, +project, +updated_at +FROM vercel.connect.project_connectors +WHERE project_id = '{{ project_id }}' -- required +AND limit = '{{ limit }}' +AND cursor = '{{ cursor }}' +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + diff --git a/website/docs/services/deployments/builds/index.md b/website/docs/services/deployments/builds/index.md deleted file mode 100644 index 969b49d..0000000 --- a/website/docs/services/deployments/builds/index.md +++ /dev/null @@ -1,235 +0,0 @@ ---- -title: builds -hide_title: false -hide_table_of_contents: false -keywords: - - builds - - deployments - - vercel - - infrastructure-as-code - - configuration-as-data - - cloud inventory -description: Query, deploy and manage vercel resources using SQL -custom_edit_url: null -image: /img/stackql-vercel-provider-featured-image.png ---- - -import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; - -Creates, updates, deletes, gets or lists a builds resource. - -## Overview - - - - -
Namebuilds
TypeResource
Id
- -## Fields - -The following fields are returned by `SELECT` queries: - - - - -An object representing a Build on Vercel - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDatatypeDescription
stringThe unique identifier of the Build
objectAn object that contains the Build's configuration
string
numberThe time at which the Build was created
stringThe region where the Build was first created
numberThe time at which the Build was deployed
stringThe unique identifier of the deployment
stringThe entrypoint of the deployment
stringIf the Build uses the `@vercel/static` Runtime, it contains a hashed string of all outputs
arrayA list of outputs for the Build that can be either Serverless Functions or static files
stringThe state of the deployment depending on the process of deploying, or if it is ready or in an error state
numberThe time at which the Build state was last modified
numberThe time at which the Build was scheduled to be built
stringThe Runtime the Build used to generate the output
-
-
- -## Methods - -The following methods are available for this resource: - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameAccessible byRequired ParamsOptional ParamsDescription
deploymentIdRetrieves the list of builds given their deployment's unique identifier. No longer listed as public API as of May 2023.
deploymentIdRetrieves the list of builds given their deployment's unique identifier. No longer listed as public API as of May 2023.
- -## Parameters - -Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. - - - - - - - - - - - - - - - - -
NameDatatypeDescription
stringThe deployment unique identifier
- -## `SELECT` examples - - - - -Retrieves the list of builds given their deployment's unique identifier. No longer listed as public API as of May 2023. - -```sql -SELECT -id, -config, -copiedFrom, -createdAt, -createdIn, -deployedAt, -deploymentId, -entrypoint, -fingerprint, -output, -readyState, -readyStateAt, -scheduledAt, -use -FROM vercel.deployments.builds -WHERE deploymentId = '{{ deploymentId }}' -- required -; -``` - - - - -## Lifecycle Methods - - - - -Retrieves the list of builds given their deployment's unique identifier. No longer listed as public API as of May 2023. - -```sql -EXEC vercel.deployments.builds._get_builds_for_deployment -@deploymentId='{{ deploymentId }}' --required -; -``` - - diff --git a/website/docs/services/deployments/events/index.md b/website/docs/services/deployments/deployment_events/index.md similarity index 71% rename from website/docs/services/deployments/events/index.md rename to website/docs/services/deployments/deployment_events/index.md index 95ef89a..cad4107 100644 --- a/website/docs/services/deployments/events/index.md +++ b/website/docs/services/deployments/deployment_events/index.md @@ -1,9 +1,9 @@ --- -title: events +title: deployment_events hide_title: false hide_table_of_contents: false keywords: - - events + - deployment_events - deployments - vercel - infrastructure-as-code @@ -15,16 +15,17 @@ image: /img/stackql-vercel-provider-featured-image.png --- import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; -Creates, updates, deletes, gets or lists an events resource. +Creates, updates, deletes, gets or lists a deployment_events resource. ## Overview - + - +
Nameevents
Name
TypeResource
Id
Id
## Fields @@ -32,14 +33,12 @@ Creates, updates, deletes, gets or lists an events resource. The following fields are returned by `SELECT` queries: - - -A stream of jsonlines where each line is a deployment log item.
Array of deployment logs for the provided query. + @@ -71,10 +70,10 @@ The following methods are available for this resource: - + - - + + @@ -93,16 +92,11 @@ Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](# - - + + - - - - - @@ -138,10 +132,20 @@ Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](# - - + + + + + + + - + + + + + + @@ -154,30 +158,31 @@ Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](# ## `SELECT` examples - + Get the build logs of a deployment by deployment ID and build ID. It can work as an infinite stream of logs or as a JSON endpoint depending on the input parameters. ```sql SELECT * -FROM vercel.deployments.events -WHERE idOrUrl = '{{ idOrUrl }}' -- required -AND teamId = '{{ teamId }}' -- required +FROM vercel.deployments.deployment_events +WHERE id_or_url = '{{ id_or_url }}' -- required AND direction = '{{ direction }}' AND follow = '{{ follow }}' AND limit = '{{ limit }}' AND name = '{{ name }}' AND since = '{{ since }}' AND until = '{{ until }}' -AND statusCode = '{{ statusCode }}' +AND status_code = '{{ status_code }}' AND delimiter = '{{ delimiter }}' AND builds = '{{ builds }}' +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' ; ``` diff --git a/website/docs/services/deployments/deployment_files/index.md b/website/docs/services/deployments/deployment_files/index.md new file mode 100644 index 0000000..8c0e2f8 --- /dev/null +++ b/website/docs/services/deployments/deployment_files/index.md @@ -0,0 +1,172 @@ +--- +title: deployment_files +hide_title: false +hide_table_of_contents: false +keywords: + - deployment_files + - deployments + - vercel + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a deployment_files resource. + +## Overview +
idOrUrl, teamIddirection, follow, limit, name, since, until, statusCode, delimiter, buildsid_or_urldirection, follow, limit, name, since, until, status_code, delimiter, builds, team_id, slug Get the build logs of a deployment by deployment ID and build ID. It can work as an infinite stream of logs or as a JSON endpoint depending on the input parameters.
string The unique identifier or hostname of the deployment.
stringThe Team identifier or slug to perform the request on behalf of.
numbernumber Timestamp for when build logs should be pulled from.
stringThe Team slug to perform the request on behalf of.
HTTP status code range to filter events by.HTTP status code range to filter events by. (wire: statusCode)
stringThe Team identifier to perform the request on behalf of. (wire: teamId)
+ + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + +A deployment file tree entry + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringThe name of the file tree entry (example: my-file.json)
arrayThe list of children files of the directory (only valid for the `directory` type)
stringThe content-type of the file (only valid for the `file` type) (example: application/json) (wire: contentType)
numberThe file "mode" indicating file type and permissions.
stringString indicating the type of file tree entry. (directory, file, invalid, lambda, middleware, symlink) (example: file)
stringThe unique identifier of the file (only valid for the `file` type) (example: 2d4aad419917f15b1146e9e03ddc9bb31747e4d0)
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
idteam_id, slugAllows to retrieve the file structure of the source code of a deployment by supplying the deployment unique identifier. If the deployment was created with the Vercel CLI or the API directly with the `files` key, it will have a file tree that can be retrievable.
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringThe unique deployment identifier
stringThe Team slug to perform the request on behalf of.
stringThe Team identifier to perform the request on behalf of. (wire: teamId)
+ +## `SELECT` examples + + + + +Allows to retrieve the file structure of the source code of a deployment by supplying the deployment unique identifier. If the deployment was created with the Vercel CLI or the API directly with the `files` key, it will have a file tree that can be retrievable. + +```sql +SELECT +name, +children, +content_type, +mode, +type, +uid +FROM vercel.deployments.deployment_files +WHERE id = '{{ id }}' -- required +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + diff --git a/website/docs/services/deployments/deployments/index.md b/website/docs/services/deployments/deployments/index.md index 2b9e519..c08336e 100644 --- a/website/docs/services/deployments/deployments/index.md +++ b/website/docs/services/deployments/deployments/index.md @@ -15,6 +15,7 @@ image: /img/stackql-vercel-provider-featured-image.png --- import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; @@ -22,7 +23,7 @@ Creates, updates, deletes, gets or lists a deployments resource. ## Overview - +
Namedeployments
Name
TypeResource
Id
@@ -32,15 +33,15 @@ Creates, updates, deletes, gets or lists a deployments resource. The following fields are returned by `SELECT` queries: - + -The deployment including only public information
The deployment including both public and private information +Returns a reduced view of the deployment with public information only. Private fields are omitted when the requester is not the deployment owner.<br />Returns the deployment object for the authenticated owner, including private fields such as environment variables, build log URLs, and internal metadata.<br />Returns the reduced deployment view for anonymous (`vcn_`) callers. Pool-team details are withheld. @@ -51,10 +52,475 @@ The deployment including only public information
The deployment including b + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
stringA string holding the unique ID of the deployment (example: dpl_89qyp1cskzkLrVicDaZoDbjyHuDJ)
stringThe name of the project associated with the deployment at the time that the deployment was created (example: my-project)
string (wire: connectConfigurationId)
string (wire: ownerId)
stringSince November 2023 this field defines a Secure Compute network that will only be used to deploy passive lambdas to (as in passiveRegions) (wire: passiveConnectConfigurationId)
string (wire: projectId)
stringSince January 2025 User-configured deployment ID for skew protection with pre-built deployments. This is set when users configure a custom deploymentId in their next.config.js file. This allows Next.js to use skew protection even when deployments are pre-built outside of Vercel's build system. (example: abc123) (wire: userConfiguredDeploymentId)
array
boolean (false, true) (wire: aliasAssigned)
(wire: aliasAssignedAt)
objectAn object that will contain a `code` and a `message` when the aliasing fails, otherwise the value will be `null` (wire: aliasError)
string (wire: aliasFinal)
object (wire: aliasWarning)
boolean (false, true) (wire: alwaysRefuseToBuild)
objectAttribution metadata for the deployment, linking commit author to git and Vercel users. Only populated when the `enable-deployment-attribution` flag is enabled.
booleanapplies to custom domains only, defaults to `true` (false, true) (wire: autoAssignCustomDomains)
array (wire: automaticAliases)
number (wire: bootedAt)
object
array (wire: buildArtifactUrls)
numberSince April 2025 it necessary for On-Demand Concurrency Minutes calculation (wire: buildContainerFinishedAt)
number (wire: buildErrorAt)
boolean (false, true) (wire: buildSkipped)
number (wire: buildingAt)
array
number (wire: canceledAt)
object
string (canceled, failed, skipped, succeeded) (wire: checksConclusion)
string (completed, registered, running) (wire: checksState)
objectSince February 2025 the configuration must include snapshot data at the time of deployment creation to capture properties for the /deployments/:id/config endpoint utilized for displaying Deployment Configuration on the frontend This is optional because older deployments may not have this data captured
boolean (false, true) (wire: connectBuildsEnabled)
numberA number containing the date when the deployment was created in milliseconds (wire: createdAt)
string (wire: createdIn)
objectInformation about the deployment creator
array
(wire: customEnvironment)
stringComputed field that is only available for deployments with a microfrontend configuration. (wire: defaultRoute)
numberA number containing the date when the deployment was deleted at milliseconds (wire: deletedAt)
array
string (wire: errorCode)
string (wire: errorLink)
string (wire: errorMessage)
string (wire: errorStep)
object
(wire: gitRepo)
(wire: gitSource)
object
number (wire: initReadyAt)
string (wire: inspectorUrl)
object
boolean (false, true) (wire: isFirstBranchDeployment)
boolean (false, true) (wire: isInConcurrentBuildsQueue)
boolean (false, true) (wire: isInSystemBuildsQueue)
booleanWhether this deployment completed through the instant static fast path. (false, true) (wire: isInstantStatic)
array
objectPresent when deployment was created with manual provisioning enabled, either explicitly or via the experimental BYOC git flow. The deployment stays in INITIALIZING until /continue is called. (wire: manualProvisioning)
object
string (wire: monorepoManager)
stringIf set it overrides the `projectSettings.nodeVersion` for this deployment. (10.x, 12.x, 14.x, 16.x, 18.x, 20.x, 22.x, 24.x, 8.10.x) (wire: nodeVersion)
object (wire: oidcTokenClaims)
string (out-of-memory) (wire: oomReport)
string (wire: originCacheRegion)
arraySince November 2023 this field defines a set of regions that we will deploy the lambda to passively Lambdas will be deployed to these regions but only invoked if all of the primary `regions` are marked as out of service (wire: passiveRegions)
string (enterprise, hobby, pro)
objectMetadata about the source platform that triggered the deployment. Allows us to map a deployment back to a platform (e.g. the chat that created it)
boolean (false, true)
booleanWhether or not preview comments are enabled for the deployment (false, true) (wire: previewCommentsEnabled)
objectThe public project information associated with the deployment.
object (wire: projectSettings)
booleanA boolean representing if the deployment is public or not. By default this is `false` (false, true)
number
stringThe state of the deployment depending on the process of deploying, or if it is ready or in an error state (BLOCKED, BUILDING, CANCELED, ERROR, INITIALIZING, QUEUED, READY) (example: READY) (wire: readyState)
string (wire: readyStateReason)
stringSubstate of deployment when readyState is 'READY' Tracks whether or not deployment has seen production traffic: - STAGED: never seen production traffic - ROLLING: in the process of having production traffic gradually transitioned. - PROMOTED: has seen production traffic (PROMOTED, ROLLING, STAGED) (wire: readySubstate)
arrayThe regions the deployment exists in
object (wire: resourceConfig)
array
objectNSNB Blocked metadata (wire: seatBlock)
arrayServices detected during build from vercel.json experimentalServices or auto-detected from project structure. Used to inject service URLs as environment variables at runtime.
booleanflag to indicate if the deployment was deleted by retention policy (false, true) (example: true) (wire: softDeletedByRetention)
stringWhere was the deployment created from. Best-effort guess for metrics only — not authoritative; do not gate behavior on it. (api-trigger-git-deploy, cli, clone/repo, drop, git, git-deploy-hook, import, import/repo, redeploy, v0-web) (example: cli)
string (BLOCKED, BUILDING, CANCELED, ERROR, INITIALIZING, QUEUED, READY)
stringIf defined, either `staging` if a staging alias in the format `<project>.<team>.now.sh` was assigned upon creation, or `production` if the aliases from `alias` were assigned. `null` value indicates the "preview" deployment. (production, staging, )
objectThe team that owns the deployment if any
boolean (false, true) (wire: ttyBuildLogs)
string (LAMBDAS)
numberA number containing the date when the deployment was undeleted at milliseconds (wire: undeletedAt)
stringA string with the unique URL of the deployment (example: my-instant-deployment-3ij3cxz9qr.now.sh)
arrayAn array of domains that were provided by the user when creating the Deployment. (wire: userAliases)
numberThe platform version that was used to create the deployment. (2)
- + @@ -71,39 +537,59 @@ The deployment including only public information
The deployment including b - + + + + + + + + + + + + + + + + - + - + - + - + + + + + + - + - - - + + + - + - + - - - + + + - - - + + + @@ -111,24 +597,59 @@ The deployment including only public information
The deployment including b - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - + - + + + + + + @@ -136,9 +657,29 @@ The deployment including only public information
The deployment including b - + + + + + + + + + + + + + + + + - + + + + + + @@ -146,40 +687,55 @@ The deployment including only public information
The deployment including b - + - + - + - + + + + + + + + + + + - + - + - + - + + + + + + @@ -206,46 +762,46 @@ The following methods are available for this resource: - + - - + + - + - - + + - + - - - + + + - + - - + + - + - + - + - + - - - + + +
The name of the deployment. (example: docs)
stringThe ID of Secure Compute network used for this deployment (wire: connectConfigurationId)
stringThe ID of Secure Compute network used for this deployment's passive functions (wire: passiveConnectConfigurationId)
stringThe project ID of the deployment (wire: projectId)
(wire: aliasAssigned)
objectAn error object in case aliasing of the deployment failed.An error object in case aliasing of the deployment failed. (wire: aliasError)
objectCommit attribution metadata
numberTimestamp of when the deployment started building at.Timestamp of when the deployment started building at. (wire: buildingAt)
stringConclusion for checksobjectDetailed information about v2 deployment checks. Includes information about blocked workflows in the deployment lifecycle.
stringState of all registered checksConclusion for checks (canceled, failed, skipped, succeeded) (wire: checksConclusion)
booleanThe flag saying if Vercel Connect configuration is used for buildsstringState of all registered checks (completed, registered, running) (wire: checksState)
stringThe ID of Vercel Connect configuration used for this deploymentbooleanThe flag saying if Secure Compute network is used for builds (false, true) (wire: connectBuildsEnabled)
Timestamp of when the deployment got created.
numberTimestamp of when the deployment got created. (wire: createdAt)
objectMetadata information of the user who created the deployment.Metadata information of the deployment creator.
objectThe custom environment used for this deployment, if any (wire: customEnvironment)
stringThe default route that should be used for screenshots and links if configured with microfrontends. (example: /docs) (wire: defaultRoute)
numberTimestamp of when the deployment got deleted.
stringError code when the deployment is in an error state. (example: BUILD_FAILED) (wire: errorCode)
stringError message when the deployment is in an canceled or error state. (example: The Deployment has been canceled because this project was not affected) (wire: errorMessage)
numberThe expiration configured by the project retention policy
stringVercel URL to inspect the deployment. (example: https://vercel.com/acme/nextjs/J1hXN00qjUeoYfpEEf7dnDtpSiVq)Vercel URL to inspect the deployment. (example: https:​//vercel.com/acme/nextjs/J1hXN00qjUeoYfpEEf7dnDtpSiVq) (wire: inspectorUrl)
booleanDeployment can be used for instant rollbackDeployment can be used for instant rollback (false, true, ) (wire: isRollbackCandidate)
object (wire: manualProvisioning)
Metadata information from the Git provider.
stringIndicates if the deployment encountered an out-of-memory error. (out-of-memory) (example: out-of-memory) (wire: oomReport)
objectMetadata about the source platform that triggered the deployment.
boolean (false, true)
objectThe project settings which was used for this deploymentThe project settings which was used for this deployment (wire: projectSettings)
numberThe expiration proposed to replace the existing expiration (wire: proposedExpiration)
Timestamp of when the deployment got ready.
stringIn which state is the deployment. (example: READY) (BLOCKED, BUILDING, CANCELED, DELETED, ERROR, INITIALIZING, QUEUED, READY) (wire: readyState)
stringSince June 2023 Substate of deployment when readyState is 'READY' Tracks whether or not deployment has seen production traffic: - STAGED: never seen production traffic - PROMOTED: has seen production trafficSubstate of deployment when readyState is 'READY' Tracks whether or not deployment has seen production traffic: - STAGED: never seen production traffic - ROLLING: in the process of gradually transitioning production traffic - PROMOTED: has seen production traffic (PROMOTED, ROLLING, STAGED) (wire: readySubstate)
objectNSNB Blocked metadata (wire: seatBlock)
booleanOptional flag to indicate if the deployment was soft deleted by retention policy. (false, true) (wire: softDeletedByRetention)
stringThe source of the deployment. (example: cli)The source of the deployment. (api-trigger-git-deploy, cli, clone/repo, drop, git, git-deploy-hook, import, import/repo, redeploy, v0-web) (example: cli)
stringIn which state is the deployment. (example: READY)In which state is the deployment. (BLOCKED, BUILDING, CANCELED, DELETED, ERROR, INITIALIZING, QUEUED, READY) (example: READY)
stringOn which environment has the deployment been deployed to. (example: production)On which environment has the deployment been deployed to. (production, staging, ) (example: production)
stringThe type of the deployment. (example: LAMBDAS)The type of the deployment. (LAMBDAS) (example: LAMBDAS)
string The unique identifier of the deployment. (example: dpl_2euZBFqxYdDMDG1jTrHFnNZ2eUVa)
numberTimestamp of when the deployment was undeleted.
string
idOrUrl, teamIdwithGitRepoInfoid_or_urlwith_git_repo_info, team_id, slug Retrieves information for a deployment either by supplying its ID (`id` property) or Hostname (`url` property). Additional details will be included when the authenticated user or team is an owner of the deployment.
teamIdapp, from, limit, projectId, target, to, users, since, until, state, rollbackCandidateapp, from, limit, project_id, project_ids, target, to, users, since, until, state, rollback_candidate, branch, sha, team_id, slug List deployments under the authenticated user or team. If a deployment hasn't finished uploading (is incomplete), the `url` property will have a value of `null`.
teamId, data__name, data__project, data__connection_uris, data__roles, data__databases, data__branch, data__endpoints, data__endpoint, data__database, data__role, data__password, data__projects, data__paginationforceNew, skipAutoDetectionConfirmationCreate a new deployment with all the required and intended data. If the deployment is not a git deployment, all files must be provided with the request, either referenced or inlined. Additionally, a deployment id can be specified to redeploy a previous deployment.nameforce_new, skip_auto_detection_confirmation, team_id, slugCreates a new deployment for the authenticated team or user. For non-git deployments, upload files first via the file upload API, then reference them here by SHA — or inline small files directly in the request body. To redeploy an existing deployment, provide its `deploymentId`; all settings are inherited unless explicitly overridden. The deployment begins building immediately and transitions through `QUEUED` → `INITIALIZING` → `BUILDING` before reaching `READY` or `ERROR`.
id, teamIdurlidurl, team_id, slug This API allows you to delete a deployment, either by supplying its `id` in the URL or the `url` of the deployment as a query parameter. You can obtain the ID, for example, by listing all deployments.
id, teamIddeployment_id, integration_configuration_id, resource_id, action This endpoint allows you to cancel a deployment which is currently building, by supplying its `id` in the URL.Updates the deployment integration action for the specified integration installation
teamIdapp, from, limit, projectId, target, to, users, since, until, state, rollbackCandidateList deployments under the authenticated user or team. If a deployment hasn't finished uploading (is incomplete), the `url` property will have a value of `null`.idteamId, slugCancels a deployment that is currently in progress, stopping the build before it completes. Use this to recover quickly from accidental deploys, wrong-branch pushes, or builds with known errors — without waiting for them to finish. Returns 400 if the deployment is no longer cancelable (already `READY`, `ERROR`, or `CANCELED`). Returns the updated deployment object with `readyState: 'CANCELED'` on success.
@@ -263,30 +819,50 @@ Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](# + + + string + + + + + string + + string The unique identifier of the deployment. - - + + string The unique identifier or hostname of the deployment. - - + + + string + + + + string - The Team identifier or slug to perform the request on behalf of. + string Name of the deployment. - - + + + string + Filter deployments based on the branch name + + + - Forces a new deployment even if there is a previous similar deployment + Forces a new deployment even if there is a previous similar deployment. Set to `1` to bypass deployment deduplication and always trigger a fresh build. (wire: forceNew) @@ -298,36 +874,61 @@ Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](# number Maximum number of deployments to list from a request. - - + + string - Filter deployments from the given `projectId`. + Filter deployments from the given ID or name. (wire: projectId) + + + + array + Filter deployments from the given project IDs. Cannot be used when projectId is specified. (wire: projectIds) - - + + boolean - Filter deployments based on their rollback candidacy + Filter deployments based on their rollback candidacy (wire: rollbackCandidate) + + + + string + Filter deployments based on the SHA number Get Deployments created after this JavaScript timestamp. - - + + - Allows to skip framework detection so the API would not fail to ask for confirmation + Set to `1` to skip framework auto-detection and proceed without confirmation. By default, if Vercel detects a framework that differs from the project setting, the API returns a `400` asking you to confirm. Use this to suppress that check in automated pipelines. (wire: skipAutoDetectionConfirmation) + + + + string + The Team slug to perform the request on behalf of. string - Filter deployments based on their state (`BUILDING`, `ERROR`, `INITIALIZING`, `QUEUED`, `READY`, `CANCELED`) + Filter deployments based on their state (`BUILDING`, `ERROR`, `INITIALIZING`, `QUEUED`, `READY`, `CANCELED`, `BLOCKED`) string Filter deployments based on the environment. + + + string + The Team identifier to perform the request on behalf of. + + + + string + The Team identifier to perform the request on behalf of. (wire: teamId) + number @@ -348,10 +949,10 @@ Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](# string Filter out deployments based on users who have created the deployment. - - + + string - Whether to add in gitRepo information. + When `true`, the response includes the `gitSource` object with the commit SHA, branch name, and connected repository metadata. Defaults to `false`. (wire: withGitRepoInfo) @@ -359,69 +960,184 @@ Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](# ## `SELECT` examples - + Retrieves information for a deployment either by supplying its ID (`id` property) or Hostname (`url` property). Additional details will be included when the authenticated user or team is an owner of the deployment. ```sql SELECT -* +id, +name, +connect_configuration_id, +owner_id, +passive_connect_configuration_id, +project_id, +user_configured_deployment_id, +alias, +alias_assigned, +alias_assigned_at, +alias_error, +alias_final, +alias_warning, +always_refuse_to_build, +atproto, +attribution, +auto_assign_custom_domains, +automatic_aliases, +booted_at, +build, +build_artifact_urls, +build_container_finished_at, +build_error_at, +build_skipped, +building_at, +builds, +canceled_at, +checks, +checks_conclusion, +checks_state, +config, +connect_builds_enabled, +created_at, +created_in, +creator, +crons, +custom_environment, +default_route, +deleted_at, +env, +error_code, +error_link, +error_message, +error_step, +flags, +functions, +git_repo, +git_source, +images, +init_ready_at, +inspector_url, +integrations, +is_first_branch_deployment, +is_in_concurrent_builds_queue, +is_in_system_builds_queue, +is_instant_static, +lambdas, +manual_provisioning, +meta, +microfrontends, +monorepo_manager, +node_version, +oidc_token_claims, +oom_report, +origin_cache_region, +passive_regions, +plan, +platform, +prebuilt, +preview_comments_enabled, +project, +project_settings, +public, +ready, +ready_state, +ready_state_reason, +ready_substate, +regions, +resource_config, +routes, +seat_block, +services, +soft_deleted_by_retention, +source, +status, +target, +team, +tty_build_logs, +type, +undeleted_at, +url, +user_aliases, +version FROM vercel.deployments.deployments -WHERE idOrUrl = '{{ idOrUrl }}' -- required -AND teamId = '{{ teamId }}' -- required -AND withGitRepoInfo = '{{ withGitRepoInfo }}' +WHERE id_or_url = '{{ id_or_url }}' -- required +AND with_git_repo_info = '{{ with_git_repo_info }}' +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' ; ``` - + List deployments under the authenticated user or team. If a deployment hasn't finished uploading (is incomplete), the `url` property will have a value of `null`. ```sql SELECT name, -aliasAssigned, -aliasError, -buildingAt, -checksConclusion, -checksState, -connectBuildsEnabled, -connectConfigurationId, +connect_configuration_id, +passive_connect_configuration_id, +project_id, +alias_assigned, +alias_error, +attribution, +building_at, +checks, +checks_conclusion, +checks_state, +connect_builds_enabled, created, -createdAt, +created_at, creator, -inspectorUrl, -isRollbackCandidate, +custom_environment, +default_route, +deleted, +error_code, +error_message, +expiration, +inspector_url, +is_rollback_candidate, +manual_provisioning, meta, -projectSettings, +oom_report, +platform, +prebuilt, +project_settings, +proposed_expiration, ready, -readyState, -readySubstate, +ready_state, +ready_substate, +seat_block, +soft_deleted_by_retention, source, state, target, type, uid, +undeleted, url FROM vercel.deployments.deployments -WHERE teamId = '{{ teamId }}' -- required -AND app = '{{ app }}' +WHERE app = '{{ app }}' AND from = '{{ from }}' AND limit = '{{ limit }}' -AND projectId = '{{ projectId }}' +AND project_id = '{{ project_id }}' +AND project_ids = '{{ project_ids }}' AND target = '{{ target }}' AND to = '{{ to }}' AND users = '{{ users }}' AND since = '{{ since }}' AND until = '{{ until }}' AND state = '{{ state }}' -AND rollbackCandidate = '{{ rollbackCandidate }}' +AND rollback_candidate = '{{ rollback_candidate }}' +AND branch = '{{ branch }}' +AND sha = '{{ sha }}' +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' ; ``` @@ -431,340 +1147,260 @@ AND rollbackCandidate = '{{ rollbackCandidate }}' ## `INSERT` examples - + -Create a new deployment with all the required and intended data. If the deployment is not a git deployment, all files must be provided with the request, either referenced or inlined. Additionally, a deployment id can be specified to redeploy a previous deployment. +Creates a new deployment for the authenticated team or user. For non-git deployments, upload files first via the file upload API, then reference them here by SHA — or inline small files directly in the request body. To redeploy an existing deployment, provide its `deploymentId`; all settings are inherited unless explicitly overridden. The deployment begins building immediately and transitions through `QUEUED` → `INITIALIZING` → `BUILDING` before reaching `READY` or `ERROR`. ```sql INSERT INTO vercel.deployments.deployments ( -data__$schema, -data__alias, -data__build, -data__builds, -data__cleanUrls, -data__env, -data__functions, -data__git, -data__headers, -data__images, -data__name, -data__public, -data__redirects, -data__regions, -data__rewrites, -data__routes, -data__trailingSlash, -data__buildCommand, -data__ignoreCommand, -data__devCommand, -data__framework, -data__installCommand, -data__outputDirectory, -data__crons, -data__deploymentId, -data__files, -data__gitMetadata, -data__gitSource, -data__meta, -data__monorepoManager, -data__project, -data__projectSettings, -data__target, -data__withLatestCommit, -data__connection_uris, -data__roles, -data__databases, -data__branch, -data__endpoints, -data__endpoint, -data__database, -data__role, -data__password, -data__projects, -data__pagination, -teamId, -forceNew, -skipAutoDetectionConfirmation +custom_environment_slug_or_id, +deployment_id, +files, +git_access_token, +git_metadata, +git_source, +meta, +monorepo_manager, +name, +project, +project_settings, +target, +with_latest_commit, +force_new, +skip_auto_detection_confirmation, +team_id, +slug ) SELECT -'{{ $schema }}', -'{{ alias }}', -'{{ build }}', -'{{ builds }}', -{{ cleanUrls }}, -'{{ env }}', -'{{ functions }}', -'{{ git }}', -'{{ headers }}', -'{{ images }}', -'{{ name }}' /* required */, -{{ public }}, -'{{ redirects }}', -'{{ regions }}', -'{{ rewrites }}', -'{{ routes }}', -{{ trailingSlash }}, -'{{ buildCommand }}', -'{{ ignoreCommand }}', -'{{ devCommand }}', -'{{ framework }}', -'{{ installCommand }}', -'{{ outputDirectory }}', -'{{ crons }}', -'{{ deploymentId }}', +'{{ custom_environment_slug_or_id }}', +'{{ deployment_id }}', '{{ files }}', -'{{ gitMetadata }}', -'{{ gitSource }}', +'{{ git_access_token }}', +'{{ git_metadata }}', +'{{ git_source }}', '{{ meta }}', -'{{ monorepoManager }}', -'{{ project }}' /* required */, -'{{ projectSettings }}', +'{{ monorepo_manager }}', +'{{ name }}' /* required */, +'{{ project }}', +'{{ project_settings }}', '{{ target }}', -{{ withLatestCommit }}, -'{{ connection_uris }}' /* required */, -'{{ roles }}' /* required */, -'{{ databases }}' /* required */, -'{{ branch }}' /* required */, -'{{ endpoints }}' /* required */, -'{{ endpoint }}' /* required */, -'{{ database }}' /* required */, -'{{ role }}' /* required */, -'{{ password }}' /* required */, -'{{ projects }}' /* required */, -'{{ pagination }}' /* required */, -'{{ teamId }}', -'{{ forceNew }}', -'{{ skipAutoDetectionConfirmation }}' +{{ with_latest_commit }}, +'{{ force_new }}', +'{{ skip_auto_detection_confirmation }}', +'{{ team_id }}', +'{{ slug }}' RETURNING id, name, +connect_configuration_id, +owner_id, +passive_connect_configuration_id, +project_id, +user_configured_deployment_id, alias, -aliasAssigned, -aliasAssignedAt, -aliasError, -aliasFinal, -aliasWarning, -autoAssignCustomDomains, -automaticAliases, -bootedAt, +alias_assigned, +alias_assigned_at, +alias_error, +alias_final, +alias_warning, +always_refuse_to_build, +atproto, +attribution, +auto_assign_custom_domains, +automatic_aliases, +booted_at, build, -buildErrorAt, -buildingAt, +build_artifact_urls, +build_container_finished_at, +build_error_at, +build_skipped, +building_at, builds, -canceledAt, -checksConclusion, -checksState, -connectBuildsEnabled, -connectConfigurationId, -createdAt, -createdIn, +canceled_at, +checks, +checks_conclusion, +checks_state, +config, +connect_builds_enabled, +created_at, +created_in, creator, +crons, +custom_environment, +default_route, +deleted_at, env, -errorCode, -errorLink, -errorMessage, -errorStep, +error_code, +error_link, +error_message, +error_step, +flags, functions, -gitRepo, -gitSource, -inspectorUrl, -isInConcurrentBuildsQueue, +git_repo, +git_source, +images, +init_ready_at, +inspector_url, +integrations, +is_first_branch_deployment, +is_in_concurrent_builds_queue, +is_in_system_builds_queue, +is_instant_static, lambdas, +manual_provisioning, meta, -monorepoManager, -ownerId, +microfrontends, +monorepo_manager, +node_version, +oidc_token_claims, +oom_report, +origin_cache_region, +passive_regions, plan, -previewCommentsEnabled, -projectId, +platform, +prebuilt, +preview_comments_enabled, +project, +project_settings, public, -readyState, -readySubstate, +ready, +ready_state, +ready_state_reason, +ready_substate, regions, +resource_config, routes, +seat_block, +services, +soft_deleted_by_retention, source, +status, target, team, +tty_build_logs, type, +undeleted_at, url, -userAliases, +user_aliases, version ; ``` -```yaml -# Description fields are for documentation purposes +{`# Description fields are for documentation purposes - name: deployments props: - - name: teamId - value: string - description: Required parameter for the deployments resource. - - name: $schema - value: string + - name: custom_environment_slug_or_id + value: "{{ custom_environment_slug_or_id }}" description: | - Ignored. Can be set to get completions, validations and documentation in some editors. - - name: alias - value: array + The slug or ID of a custom environment to deploy to, overriding the default target environment. When omitted, the deployment targets the environment inferred from the branch (production or preview). + - name: deployment_id + value: "{{ deployment_id }}" description: | - Aliases that will get assigned when the deployment is `READY` and the target is `production`. The client needs to make a `GET` request to its API to ensure the assignment - - name: build - value: object + The ID of an existing deployment to redeploy. All project settings and environment variables are inherited from the original unless explicitly overridden in this request. The redeployment gets a new ID, URL, and build. + - name: files + value: "{{ files }}" description: | - An object containing another object with information to be passed to the Build Process - - name: builds - value: array + The files to include in the deployment. Each entry is either an inlined file (with \`data\` and \`encoding\`) or a reference to a previously uploaded file (with \`sha\` and \`size\`). Required for non-git deployments. Cannot be used together with \`gitSource\`. + - name: git_access_token + value: "{{ git_access_token }}" description: | - A list of build descriptions whose src references valid source files. - - name: cleanUrls - value: boolean + Available only to Vercel platform accounts. A read-only GitHub access token scoped to the requested repository. Use a token with a lifetime of 24 hours or less that remains valid until source retrieval completes. + - name: git_metadata description: | - When set to `true`, all HTML files and Serverless Functions will have their extension removed. When visiting a path that ends with the extension, a 308 response will redirect the client to the extensionless path. - - name: env - value: object + Populates initial git metadata for different git providers. + value: + remoteUrl: "{{ remoteUrl }}" + commitAuthorName: "{{ commitAuthorName }}" + commitAuthorEmail: "{{ commitAuthorEmail }}" + commitMessage: "{{ commitMessage }}" + commitRef: "{{ commitRef }}" + commitSha: "{{ commitSha }}" + dirty: {{ dirty }} + ci: {{ ci }} + ciType: "{{ ciType }}" + ciGitProviderUsername: "{{ ciGitProviderUsername }}" + ciGitRepoVisibility: "{{ ciGitRepoVisibility }}" + rootDirectory: "{{ rootDirectory }}" + - name: git_source description: | - An object containing the deployment's environment variable names and values. Secrets can be referenced by prefixing the value with `@` - - name: functions - value: object + Defines the Git Repository source to be deployed. This property can not be used in combination with \`files\`. + value: + type: "{{ type }}" + sha: "{{ sha }}" + ref: "{{ ref }}" + repoId: "{{ repoId }}" + org: "{{ org }}" + repo: "{{ repo }}" + projectId: "{{ projectId }}" + repoUuid: "{{ repoUuid }}" + workspaceUuid: "{{ workspaceUuid }}" + owner: "{{ owner }}" + slug: "{{ slug }}" + - name: meta + value: "{{ meta }}" description: | - An object describing custom options for your Serverless Functions. Each key must be glob pattern that matches the paths of the Serverless Functions you would like to customize (like `api/*.js` or `api/test.js`). - - name: git - value: object - - name: headers - value: array + An object containing the deployment's metadata. Multiple key-value pairs can be attached to a deployment. For deployments created with a Cursor Origin \`gitSource\`, Vercel automatically adds \`cursorOriginDeployment\`, \`cursorOriginCommitSha\`, \`cursorOriginCommitRef\`, \`cursorOriginCommitMessage\`, \`cursorOriginCommitAuthorName\`, \`cursorOriginCommitAuthorEmail\` when available, \`cursorOriginOwner\`, \`cursorOriginRepo\`, \`cursorOriginRepoId\`, and \`cursorOriginPrId\` for pull request deployments. + - name: monorepo_manager + value: "{{ monorepo_manager }}" description: | - A list of header definitions. - - name: images - value: object + The monorepo manager that is being used for this deployment. When \`null\` is used no monorepo manager is selected - name: name - value: string + value: "{{ name }}" description: | A string with the project name used in the deployment URL - - name: public - value: boolean - description: | - Whether a deployment's source and logs are available publicly - - name: redirects - value: array - description: | - A list of redirect definitions. - - name: regions - value: array - description: | - An array of the regions the deployment's Serverless Functions should be deployed to - - name: rewrites - value: array - description: | - A list of rewrite definitions. - - name: routes - value: array - description: | - A list of routes objects used to rewrite paths to point towards other internal or external paths - - name: trailingSlash - value: boolean - description: | - When `false`, visiting a path that ends with a forward slash will respond with a `308` status code and redirect to the path without the trailing slash. - - name: buildCommand - value: string - description: | - The build command for this project. When `null` is used this value will be automatically detected - - name: ignoreCommand - value: string - - name: devCommand - value: string - description: | - The dev command for this project. When `null` is used this value will be automatically detected - - name: framework - value: string - description: | - The framework that is being used for this project. When `null` is used no framework is selected - valid_values: ['', 'blitzjs', 'nextjs', 'gatsby', 'remix', 'astro', 'hexo', 'eleventy', 'docusaurus-2', 'docusaurus', 'preact', 'solidstart', 'dojo', 'ember', 'vue', 'scully', 'ionic-angular', 'angular', 'polymer', 'svelte', 'sveltekit', 'sveltekit-1', 'ionic-react', 'create-react-app', 'gridsome', 'umijs', 'sapper', 'saber', 'stencil', 'nuxtjs', 'redwoodjs', 'hugo', 'jekyll', 'brunch', 'middleman', 'zola', 'hydrogen', 'vite', 'vitepress', 'vuepress', 'parcel', 'sanity', 'storybook'] - - name: installCommand - value: string - description: | - The install command for this project. When `null` is used this value will be automatically detected - - name: outputDirectory - value: string - description: | - The output directory of the project. When `null` is used this value will be automatically detected - - name: crons - value: array - description: | - An array of cron jobs that should be created for production Deployments. - - name: deploymentId - value: string - description: | - An deployment id for an existing deployment to redeploy - - name: files - value: array - description: | - A list of objects with the files to be deployed - - name: gitMetadata - value: object - description: | - Populates initial git metadata for different git providers. - - name: gitSource - value: string - description: | - Defines the Git Repository source to be deployed. This property can not be used in combination with `files`. - - name: meta - value: object - description: | - An object containing the deployment's metadata. Multiple key-value pairs can be attached to a deployment - - name: monorepoManager - value: string - description: | - The monorepo manager that is being used for this deployment. When `null` is used no monorepo manager is selected - name: project - value: object - - name: projectSettings - value: object + value: "{{ project }}" + description: | + The target project identifier in which the deployment will be created. When defined, this parameter overrides name + - name: project_settings description: | Project settings that will be applied to the deployment. It is required for the first deployment of a project and will be saved for any following deployments + value: + buildCommand: "{{ buildCommand }}" + commandForIgnoringBuildStep: "{{ commandForIgnoringBuildStep }}" + devCommand: "{{ devCommand }}" + framework: "{{ framework }}" + installCommand: "{{ installCommand }}" + nodeVersion: "{{ nodeVersion }}" + outputDirectory: "{{ outputDirectory }}" + rootDirectory: "{{ rootDirectory }}" + serverlessFunctionRegion: "{{ serverlessFunctionRegion }}" + skipGitConnectDuringLink: {{ skipGitConnectDuringLink }} + sourceFilesOutsideRootDirectory: {{ sourceFilesOutsideRootDirectory }} - name: target - value: string + value: "{{ target }}" description: | - Either not defined, `staging`, or `production`. If `staging`, a staging alias in the format `-.vercel.app` will be assigned. If `production`, any aliases defined in `alias` will be assigned. If omitted, the target will be `preview` - valid_values: ['staging', 'production'] - - name: withLatestCommit - value: boolean + Either not defined, \`staging\`, \`production\`, or a custom environment identifier. If \`staging\`, a staging alias in the format \`-.vercel.app\` will be assigned. If \`production\`, any aliases defined in \`alias\` will be assigned. If omitted, the target will be \`preview\`. + - name: with_latest_commit + value: {{ with_latest_commit }} description: | - When `true` and `deploymentId` is passed in, the sha from the previous deployment's `gitSource` is removed forcing the latest commit to be used. - - name: connection_uris - value: array - - name: roles - value: array - - name: databases - value: array - - name: branch - value: object - - name: endpoints - value: array - - name: endpoint - value: object - - name: database - value: object - - name: role - value: object - - name: password - value: string - - name: projects - value: array - - name: pagination - value: object - - name: forceNew - value: string - description: Forces a new deployment even if there is a previous similar deployment - - name: skipAutoDetectionConfirmation - value: string - description: Allows to skip framework detection so the API would not fail to ask for confirmation -``` + When \`true\` and \`deploymentId\` is passed in, the sha from the previous deployment's \`gitSource\` is removed forcing the latest commit to be used. + - name: force_new + value: "{{ force_new }}" + description: Forces a new deployment even if there is a previous similar deployment. Set to \`1\` to bypass deployment deduplication and always trigger a fresh build. + description: Forces a new deployment even if there is a previous similar deployment. Set to \`1\` to bypass deployment deduplication and always trigger a fresh build. + - name: skip_auto_detection_confirmation + value: "{{ skip_auto_detection_confirmation }}" + description: Set to \`1\` to skip framework auto-detection and proceed without confirmation. By default, if Vercel detects a framework that differs from the project setting, the API returns a \`400\` asking you to confirm. Use this to suppress that check in automated pipelines. + description: Set to \`1\` to skip framework auto-detection and proceed without confirmation. By default, if Vercel detects a framework that differs from the project setting, the API returns a \`400\` asking you to confirm. Use this to suppress that check in automated pipelines. + - name: team_id + value: "{{ team_id }}" + description: The Team identifier to perform the request on behalf of. + description: The Team identifier to perform the request on behalf of. + - name: slug + value: "{{ slug }}" + description: The Team slug to perform the request on behalf of. + description: The Team slug to perform the request on behalf of. +`} + @@ -772,20 +1408,21 @@ version ## `DELETE` examples - + This API allows you to delete a deployment, either by supplying its `id` in the URL or the `url` of the deployment as a query parameter. You can obtain the ID, for example, by listing all deployments. ```sql DELETE FROM vercel.deployments.deployments WHERE id = '{{ id }}' --required -AND teamId = '{{ teamId }}' --required AND url = '{{ url }}' +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' ; ``` @@ -794,42 +1431,44 @@ AND url = '{{ url }}' ## Lifecycle Methods +EXEC variables use wire (API) names. + - + -This endpoint allows you to cancel a deployment which is currently building, by supplying its `id` in the URL. +Updates the deployment integration action for the specified integration installation ```sql -EXEC vercel.deployments.deployments.cancel_deployment -@id='{{ id }}' --required, -@teamId='{{ teamId }}' --required +EXEC vercel.deployments.deployments.update_integration_action +@deployment_id='{{ deployment_id }}' --required, +@integration_configuration_id='{{ integration_configuration_id }}' --required, +@resource_id='{{ resource_id }}' --required, +@action='{{ action }}' --required +@@json= +'{ +"status": "{{ status }}", +"statusText": "{{ statusText }}", +"statusUrl": "{{ statusUrl }}", +"outcomes": "{{ outcomes }}" +}' ; ``` - + -List deployments under the authenticated user or team. If a deployment hasn't finished uploading (is incomplete), the `url` property will have a value of `null`. +Cancels a deployment that is currently in progress, stopping the build before it completes. Use this to recover quickly from accidental deploys, wrong-branch pushes, or builds with known errors — without waiting for them to finish. Returns 400 if the deployment is no longer cancelable (already `READY`, `ERROR`, or `CANCELED`). Returns the updated deployment object with `readyState: 'CANCELED'` on success. ```sql -EXEC vercel.deployments.deployments._get_deployments -@teamId='{{ teamId }}' --required, -@app='{{ app }}', -@from='{{ from }}', -@limit='{{ limit }}', -@projectId='{{ projectId }}', -@target='{{ target }}', -@to='{{ to }}', -@users='{{ users }}', -@since='{{ since }}', -@until='{{ until }}', -@state='{{ state }}', -@rollbackCandidate={{ rollbackCandidate }} +EXEC vercel.deployments.deployments.cancel +@id='{{ id }}' --required, +@teamId='{{ teamId }}', +@slug='{{ slug }}' ; ``` diff --git a/website/docs/services/deployments/files/index.md b/website/docs/services/deployments/files/index.md index 0adf659..de81f9e 100644 --- a/website/docs/services/deployments/files/index.md +++ b/website/docs/services/deployments/files/index.md @@ -15,6 +15,7 @@ image: /img/stackql-vercel-provider-featured-image.png --- import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; @@ -22,7 +23,7 @@ Creates, updates, deletes, gets or lists a files resource. ## Overview - +
Namefiles
Name
TypeResource
Id
@@ -31,64 +32,8 @@ Creates, updates, deletes, gets or lists a files resource. The following fields are returned by `SELECT` queries: - - - -Retrieved the file tree successfully +`SELECT` not supported for this resource, use `SHOW METHODS` to view available operations for the resource. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDatatypeDescription
stringThe name of the file tree entry (example: my-file.json)
arrayThe list of children files of the directory (only valid for the `directory` type)
stringThe content-type of the file (only valid for the `file` type) (example: application/json)
numberThe file "mode" indicating file type and permissions.
stringNot currently used. See `file-list-to-tree.ts`.
stringString indicating the type of file tree entry. (example: file)
stringThe unique identifier of the file (only valid for the `file` type) (example: 2d4aad419917f15b1146e9e03ddc9bb31747e4d0)
-
-
## Methods @@ -106,26 +51,12 @@ The following methods are available for this resource: - - - id, teamId - - Allows to retrieve the file structure of a deployment by supplying the deployment unique identifier. - - - + - teamId - Content-Length, x-vercel-digest, x-now-digest, x-now-size + value + Content-Length, x-vercel-digest, x-now-digest, x-now-size, teamId, slug Before you create a deployment you need to upload the required files for that deployment. To do it, you need to first upload each file to this endpoint. Once that's completed, you can create a new deployment with the uploaded files. The file content must be placed inside the body of the request. In the case of a successful response you'll receive a status code 200 with an empty body. - - - - id, fileId, teamId - path - Allows to retrieve the content of a file by supplying the file identifier and the deployment unique identifier. The response body will contain the raw content of the file. - @@ -142,30 +73,20 @@ Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](# - - - string - The unique file identifier - - - - string - The unique deployment identifier - - - - string - The Team identifier or slug to perform the request on behalf of. - number The file size in bytes - - + + string - Path to the file to fetch (only for Git deployments) + The Team slug to perform the request on behalf of. + + + + string + The Team identifier to perform the request on behalf of. @@ -185,69 +106,32 @@ Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](# -## `SELECT` examples - - - - -Allows to retrieve the file structure of a deployment by supplying the deployment unique identifier. - -```sql -SELECT -name, -children, -contentType, -mode, -symlink, -type, -uid -FROM vercel.deployments.files -WHERE id = '{{ id }}' -- required -AND teamId = '{{ teamId }}' -- required -; -``` - - - - ## Lifecycle Methods +EXEC variables use wire (API) names. + - + Before you create a deployment you need to upload the required files for that deployment. To do it, you need to first upload each file to this endpoint. Once that's completed, you can create a new deployment with the uploaded files. The file content must be placed inside the body of the request. In the case of a successful response you'll receive a status code 200 with an empty body. ```sql -EXEC vercel.deployments.files.upload_file -@teamId='{{ teamId }}' --required, +EXEC vercel.deployments.files.upload @Content-Length='{{ Content-Length }}', @x-vercel-digest='{{ x-vercel-digest }}', @x-now-digest='{{ x-now-digest }}', -@x-now-size='{{ x-now-size }}' -; -``` - - - -Allows to retrieve the content of a file by supplying the file identifier and the deployment unique identifier. The response body will contain the raw content of the file. - -```sql -EXEC vercel.deployments.files.get_deployment_file_contents -@id='{{ id }}' --required, -@fileId='{{ fileId }}' --required, -@teamId='{{ teamId }}' --required, -@path='{{ path }}' +@x-now-size='{{ x-now-size }}', +@teamId='{{ teamId }}', +@slug='{{ slug }}' +@@json= +'{ +"value": "{{ value }}" +}' ; ``` diff --git a/website/docs/services/deployments/index.md b/website/docs/services/deployments/index.md index 91748cc..dded41d 100644 --- a/website/docs/services/deployments/index.md +++ b/website/docs/services/deployments/index.md @@ -18,18 +18,19 @@ deployments service documentation. :::info[Service Summary] -total resources: __4__ +total resources: __5__ ::: ## Resources \ No newline at end of file diff --git a/website/docs/services/deployments/runtime_logs/index.md b/website/docs/services/deployments/runtime_logs/index.md new file mode 100644 index 0000000..3ccc3c6 --- /dev/null +++ b/website/docs/services/deployments/runtime_logs/index.md @@ -0,0 +1,148 @@ +--- +title: runtime_logs +hide_title: false +hide_table_of_contents: false +keywords: + - runtime_logs + - deployments + - vercel + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a runtime_logs resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + +Wrapper for non-JSON response bodies (jsonl, ndjson, streamed json, octet-stream): one row carrying the raw body text. + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringRaw response body.
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
project_id, deployment_idteam_id, slugReturns a stream of logs for a given deployment.
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string
string
stringThe Team slug to perform the request on behalf of.
stringThe Team identifier to perform the request on behalf of. (wire: teamId)
+ +## `SELECT` examples + + + + +Returns a stream of logs for a given deployment. + +```sql +SELECT +contents +FROM vercel.deployments.runtime_logs +WHERE project_id = '{{ project_id }}' -- required +AND deployment_id = '{{ deployment_id }}' -- required +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + diff --git a/website/docs/services/dns/domains_records/index.md b/website/docs/services/dns/domains_records/index.md deleted file mode 100644 index 7f00b87..0000000 --- a/website/docs/services/dns/domains_records/index.md +++ /dev/null @@ -1,323 +0,0 @@ ---- -title: domains_records -hide_title: false -hide_table_of_contents: false -keywords: - - domains_records - - dns - - vercel - - infrastructure-as-code - - configuration-as-data - - cloud inventory -description: Query, deploy and manage vercel resources using SQL -custom_edit_url: null -image: /img/stackql-vercel-provider-featured-image.png ---- - -import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; - -Creates, updates, deletes, gets or lists a domains_records resource. - -## Overview - - - - -
Namedomains_records
TypeResource
Id
- -## Fields - -The following fields are returned by `SELECT` queries: - - - - -Successful response retrieving a list of paginated DNS records. - - - - - - - - - - - -
NameDatatypeDescription
-
-
- -## Methods - -The following methods are available for this resource: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameAccessible byRequired ParamsOptional ParamsDescription
domain, teamIdlimit, since, untilRetrieves a list of DNS records created for a domain name. By default it returns 20 records if no limit is provided. The rest can be retrieved using the pagination options.
domain, teamId, data__type, data__value, data__nameCreates a DNS record for a domain.
domain, recordId, teamIdRemoves an existing DNS record from a domain name.
domain, teamIdlimit, since, untilRetrieves a list of DNS records created for a domain name. By default it returns 20 records if no limit is provided. The rest can be retrieved using the pagination options.
recordId, teamIdUpdates an existing DNS record for a domain name.
- -## Parameters - -Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDatatypeDescription
string
stringThe id of the DNS record
stringThe Team identifier or slug to perform the request on behalf of.
stringMaximum number of records to list from a request.
stringGet records created after this JavaScript timestamp.
stringGet records created before this JavaScript timestamp.
- -## `SELECT` examples - - - - -Retrieves a list of DNS records created for a domain name. By default it returns 20 records if no limit is provided. The rest can be retrieved using the pagination options. - -```sql -SELECT -* -FROM vercel.dns.domains_records -WHERE domain = '{{ domain }}' -- required -AND teamId = '{{ teamId }}' -- required -AND limit = '{{ limit }}' -AND since = '{{ since }}' -AND until = '{{ until }}' -; -``` - - - - -## `INSERT` examples - - - - -Creates a DNS record for a domain. - -```sql -INSERT INTO vercel.dns.domains_records ( -data__name, -data__type, -data__ttl, -data__value, -data__comment, -domain, -teamId -) -SELECT -'{{ name }}' /* required */, -'{{ type }}' /* required */, -{{ ttl }}, -'{{ value }}' /* required */, -'{{ comment }}', -'{{ domain }}', -'{{ teamId }}' -; -``` - - - -```yaml -# Description fields are for documentation purposes -- name: domains_records - props: - - name: domain - value: string - description: Required parameter for the domains_records resource. - - name: teamId - value: string - description: Required parameter for the domains_records resource. - - name: name - value: string - description: | - A subdomain name or an empty string for the root domain. - - name: type - value: string - description: | - Must be of type `A`. - valid_values: ['A'] - - name: ttl - value: number - description: | - The TTL value. Must be a number between 60 and 2147483647. Default value is 60. - - name: value - value: string - description: | - The record value must be a valid IPv4 address. - - name: comment - value: string - description: | - A comment to add context on what this DNS record is for -``` - - - - -## `DELETE` examples - - - - -Removes an existing DNS record from a domain name. - -```sql -DELETE FROM vercel.dns.domains_records -WHERE domain = '{{ domain }}' --required -AND recordId = '{{ recordId }}' --required -AND teamId = '{{ teamId }}' --required -; -``` - - - - -## Lifecycle Methods - - - - -Retrieves a list of DNS records created for a domain name. By default it returns 20 records if no limit is provided. The rest can be retrieved using the pagination options. - -```sql -EXEC vercel.dns.domains_records._get_records -@domain='{{ domain }}' --required, -@teamId='{{ teamId }}' --required, -@limit='{{ limit }}', -@since='{{ since }}', -@until='{{ until }}' -; -``` - - - -Updates an existing DNS record for a domain name. - -```sql -EXEC vercel.dns.domains_records.update_record -@recordId='{{ recordId }}' --required, -@teamId='{{ teamId }}' --required -@@json= -'{ -"name": "{{ name }}", -"value": "{{ value }}", -"type": "{{ type }}", -"ttl": {{ ttl }}, -"mxPriority": {{ mxPriority }}, -"srv": "{{ srv }}", -"comment": "{{ comment }}" -}' -; -``` - - diff --git a/website/docs/services/dns/index.md b/website/docs/services/dns/index.md index 42aa47c..fb95326 100644 --- a/website/docs/services/dns/index.md +++ b/website/docs/services/dns/index.md @@ -25,7 +25,7 @@ total resources: __1__ ## Resources
diff --git a/website/docs/services/dns/records/index.md b/website/docs/services/dns/records/index.md new file mode 100644 index 0000000..2c9deee --- /dev/null +++ b/website/docs/services/dns/records/index.md @@ -0,0 +1,558 @@ +--- +title: records +hide_title: false +hide_table_of_contents: false +keywords: + - records + - dns + - vercel + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a records resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + +Successful response retrieving a list of paginated DNS records. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string
string
string
number
number (wire: createdAt)
string
number (wire: mxPriority)
number
string
number
string (A, AAAA, ALIAS, CAA, CNAME, HTTPS, MX, NS, SRV, TXT)
number
number (wire: updatedAt)
string
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string
string
string
number (wire: createdAt)
string
string
string (A, AAAA, ALIAS, CAA, CNAME, HTTPS, MX, NS, SRV, TXT) (wire: recordType)
number
string (A, AAAA, ALIAS, CAA, CNAME, HTTPS, MX, NS, SRV, TXT)
string
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
domainlimit, since, until, team_id, slugRetrieves a list of DNS records created for a domain name. By default it returns 20 records if no limit is provided. The rest can be retrieved using the pagination options.
record_id
domain, type, value, name, mx_priority, srv, httpsteam_id, slugCreates a DNS record for a domain.
record_idteam_id, slugUpdates an existing DNS record for a domain name.
domain
domain, record_idteam_id, slugRemoves an existing DNS record from a domain name.
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string
string
stringMaximum number of records to list from a request.
stringGet records created after this JavaScript timestamp.
stringThe Team slug to perform the request on behalf of.
stringThe Team identifier to perform the request on behalf of. (wire: teamId)
stringGet records created before this JavaScript timestamp.
+ +## `SELECT` examples + + + + +Retrieves a list of DNS records created for a domain name. By default it returns 20 records if no limit is provided. The rest can be retrieved using the pagination options. + +```sql +SELECT +id, +name, +comment, +created, +created_at, +creator, +mx_priority, +priority, +slug, +ttl, +type, +updated, +updated_at, +value +FROM vercel.dns.records +WHERE domain = '{{ domain }}' -- required +AND limit = '{{ limit }}' +AND since = '{{ since }}' +AND until = '{{ until }}' +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + + +No description available. + +```sql +SELECT +id, +name, +comment, +created_at, +creator, +domain, +record_type, +ttl, +type, +value +FROM vercel.dns.records +WHERE record_id = '{{ record_id }}' -- required +; +``` + + + + +## `INSERT` examples + + + + +Creates a DNS record for a domain. + +```sql +INSERT INTO vercel.dns.records ( +type, +name, +ttl, +value, +comment, +mx_priority, +srv, +https, +domain, +team_id, +slug +) +SELECT +'{{ type }}' /* required */, +'{{ name }}' /* required */, +{{ ttl }}, +'{{ value }}' /* required */, +'{{ comment }}', +{{ mx_priority }} /* required */, +'{{ srv }}' /* required */, +'{{ https }}' /* required */, +'{{ domain }}', +'{{ team_id }}', +'{{ slug }}' +RETURNING +uid, +updated +; +``` + + + +{`# Description fields are for documentation purposes +- name: records + props: + - name: domain + value: "{{ domain }}" + description: Required parameter for the records resource. + - name: type + value: "{{ type }}" + description: | + The type of record, it could be one of the valid DNS records. + valid_values: ['A', 'AAAA', 'ALIAS', 'CAA', 'CNAME', 'HTTPS', 'MX', 'SRV', 'TXT', 'NS'] + - name: name + value: "{{ name }}" + description: | + A subdomain name or an empty string for the root domain. + - name: ttl + value: {{ ttl }} + description: | + The TTL value. Must be a number between 60 and 2147483647. Default value is 60. + - name: value + value: "{{ value }}" + description: | + The record value must be a valid IPv4 address. + - name: comment + value: "{{ comment }}" + description: | + A comment to add context on what this DNS record is for + - name: mx_priority + value: {{ mx_priority }} + - name: srv + value: + priority: "{{ priority }}" + weight: "{{ weight }}" + port: "{{ port }}" + target: "{{ target }}" + - name: https + value: + priority: "{{ priority }}" + target: "{{ target }}" + params: "{{ params }}" + - name: team_id + value: "{{ team_id }}" + description: The Team identifier to perform the request on behalf of. + description: The Team identifier to perform the request on behalf of. + - name: slug + value: "{{ slug }}" + description: The Team slug to perform the request on behalf of. + description: The Team slug to perform the request on behalf of. +`} + + + + + +## `UPDATE` examples + + + + +Updates an existing DNS record for a domain name. + +```sql +UPDATE vercel.dns.records +SET +name = '{{ name }}', +value = '{{ value }}', +type = '{{ type }}', +ttl = {{ ttl }}, +mx_priority = {{ mx_priority }}, +srv = '{{ srv }}', +https = '{{ https }}', +comment = '{{ comment }}' +WHERE +record_id = '{{ record_id }}' --required +AND team_id = '{{ team_id}}' +AND slug = '{{ slug}}' +RETURNING +id, +name, +comment, +created_at, +creator, +domain, +record_type, +ttl, +type, +value; +``` + + + + +## `REPLACE` examples + + + + +No description available. + +```sql +REPLACE vercel.dns.records +SET +-- No updatable properties +WHERE +domain = '{{ domain }}' --required +RETURNING +record_ids; +``` + + + + +## `DELETE` examples + + + + +Removes an existing DNS record from a domain name. + +```sql +DELETE FROM vercel.dns.records +WHERE domain = '{{ domain }}' --required +AND record_id = '{{ record_id }}' --required +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + diff --git a/website/docs/services/domains/domain_config/index.md b/website/docs/services/domains/domain_config/index.md new file mode 100644 index 0000000..2541eda --- /dev/null +++ b/website/docs/services/domains/domain_config/index.md @@ -0,0 +1,176 @@ +--- +title: domain_config +hide_title: false +hide_table_of_contents: false +keywords: + - domain_config + - domains + - vercel + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a domain_config resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
arrayWhich challenge types the domain can use for issuing certs. (wire: acceptedChallenges)
stringHow we see the domain's configuration. - `CNAME`: Domain has a CNAME pointing to Vercel. - `A`: Domain's A record is resolving to Vercel. - `http`: Domain is resolving to Vercel but may be behind a Proxy. - `dns-01`: Domain is not resolving to Vercel but dns-01 challenge is enabled. - `null`: Domain is not resolving to Vercel. (A, CNAME, dns-01, http, ) (wire: configuredBy)
booleanWhether or not the domain is configured AND we can automatically generate a TLS certificate. (false, true)
arrayRecommended CNAMEs for the domain. rank=1 is the preferred value to use. (wire: recommendedCNAME)
arrayRecommended IPv4s for the domain. rank=1 is the preferred value(s) to use. Only using 1 ip value is acceptable. (wire: recommendedIPv4)
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
domainproject_id_or_name, strict, team_id, slugGet a Domain's configuration.
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringThe name of the domain.
stringThe project id or name that will be associated with the domain. Use this when the domain is not yet associated with a project. (wire: projectIdOrName)
stringThe Team slug to perform the request on behalf of.
When true, the response will only include the nameservers assigned directly to the specified domain. When false and there are no nameservers assigned directly to the specified domain, the response will include the nameservers of the domain's parent zone.
stringThe Team identifier to perform the request on behalf of. (wire: teamId)
+ +## `SELECT` examples + + + + +Get a Domain's configuration. + +```sql +SELECT +accepted_challenges, +configured_by, +misconfigured, +recommended_cname, +recommended_i_pv_4 +FROM vercel.domains.domain_config +WHERE domain = '{{ domain }}' -- required +AND project_id_or_name = '{{ project_id_or_name }}' +AND strict = '{{ strict }}' +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + diff --git a/website/docs/services/domains/domain_project_domains/index.md b/website/docs/services/domains/domain_project_domains/index.md new file mode 100644 index 0000000..b01e69a --- /dev/null +++ b/website/docs/services/domains/domain_project_domains/index.md @@ -0,0 +1,220 @@ +--- +title: domain_project_domains +hide_title: false +hide_table_of_contents: false +keywords: + - domain_project_domains + - domains + - vercel + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a domain_project_domains resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + +Successful response retrieving project domains for an apex domain. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string
string (wire: customEnvironmentId)
string (wire: projectId)
string (wire: apexName)
number (wire: createdAt)
string (wire: gitBranch)
string
number (301, 302, 307, 308, ) (wire: redirectStatusCode)
number (wire: updatedAt)
arrayA list of verification challenges, one of which must be completed to verify the domain for use on the project. After the challenge is complete `POST /projects/:idOrName/domains/:domain/verify` to verify the domain. Possible challenges: - If `verification.type = TXT` the `verification.domain` will be checked for a TXT record matching `verification.value`.
boolean`true` if the domain is verified for use with the project. If `false` it will not be used as an alias on this project until the challenge in `verification` is completed. (false, true)
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
domainlimit, since, until, team_id, slugList all project domains associated with an apex domain owned by the authenticated account.
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringThe apex domain name.
numberMaximum number of project domains to list from a request.
numberGet project domains created after this JavaScript timestamp.
stringThe Team slug to perform the request on behalf of.
stringThe Team identifier to perform the request on behalf of. (wire: teamId)
numberGet project domains created before this JavaScript timestamp.
+ +## `SELECT` examples + + + + +List all project domains associated with an apex domain owned by the authenticated account. + +```sql +SELECT +name, +custom_environment_id, +project_id, +apex_name, +created_at, +git_branch, +redirect, +redirect_status_code, +updated_at, +verification, +verified +FROM vercel.domains.domain_project_domains +WHERE domain = '{{ domain }}' -- required +AND limit = '{{ limit }}' +AND since = '{{ since }}' +AND until = '{{ until }}' +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + diff --git a/website/docs/services/domains/domain_registry/index.md b/website/docs/services/domains/domain_registry/index.md deleted file mode 100644 index b96cbe7..0000000 --- a/website/docs/services/domains/domain_registry/index.md +++ /dev/null @@ -1,151 +0,0 @@ ---- -title: domain_registry -hide_title: false -hide_table_of_contents: false -keywords: - - domain_registry - - domains - - vercel - - infrastructure-as-code - - configuration-as-data - - cloud inventory -description: Query, deploy and manage vercel resources using SQL -custom_edit_url: null -image: /img/stackql-vercel-provider-featured-image.png ---- - -import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; - -Creates, updates, deletes, gets or lists a domain_registry resource. - -## Overview - - - - -
Namedomain_registry
TypeResource
Id
- -## Fields - -The following fields are returned by `SELECT` queries: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDatatypeDescription
stringDescription associated with transferable state.
stringThe current state of an ongoing transfer. `pending_owner`: Awaiting approval by domain's admin contact (every transfer begins with this status). If approval is not given within five days, the transfer is cancelled. `pending_admin`: Waiting for approval by Vercel Registrar admin. `pending_registry`: Awaiting registry approval (the transfer completes after 7 days unless it is declined by the current registrar). `completed`: The transfer completed successfully. `cancelled`: The transfer was cancelled. `undef`: No transfer exists for this domain. `unknown`: This TLD is not supported by Vercel's Registrar.
stringThe domain's transfer policy (depends on TLD requirements). `charge-and-renew`: transfer will charge for renewal and will renew the existing domain's registration. `no-charge-no-change`: transfer will have no change to registration period and does not require charge. `no-change`: transfer charge is required, but no change in registration period. `new-term`: transfer charge is required and a new registry term is set based on the transfer date. `not-supported`: transfers are not supported for this domain or TLD. `null`: This TLD is not supported by Vercel's Registrar.
booleanWhether or not the domain is transferable
-
-
- -## Methods - -The following methods are available for this resource: - - - - - - - - - - - - - - - - - - - - -
NameAccessible byRequired ParamsOptional ParamsDescription
domain, teamIdFetch domain transfer availability or transfer status if a transfer is in progress.
- -## Parameters - -Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. - - - - - - - - - - - - - - - - - - - - - -
NameDatatypeDescription
stringThe name of the domain.
stringThe Team identifier or slug to perform the request on behalf of.
- -## `SELECT` examples - - - - -Fetch domain transfer availability or transfer status if a transfer is in progress. - -```sql -SELECT -reason, -status, -transferPolicy, -transferable -FROM vercel.domains.domain_registry -WHERE domain = '{{ domain }}' -- required -AND teamId = '{{ teamId }}' -- required -; -``` - - diff --git a/website/docs/services/domains/domain_verification/index.md b/website/docs/services/domains/domain_verification/index.md new file mode 100644 index 0000000..b192c36 --- /dev/null +++ b/website/docs/services/domains/domain_verification/index.md @@ -0,0 +1,148 @@ +--- +title: domain_verification +hide_title: false +hide_table_of_contents: false +keywords: + - domain_verification + - domains + - vercel + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a domain_verification resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + +Returns the TXT record needed to verify domain ownership. + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string (wire: txtRecord)
string (wire: verificationDomain)
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
domainteam_id, slugGet the TXT verification record needed to claim ownership of a domain for the authenticated team. The caller must add this TXT record to `_vercel.{domain}` in their DNS configuration, then call POST /domains/:domain/claim to complete the ownership transfer.
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringThe domain name to get the verification record for
stringThe Team slug to perform the request on behalf of.
stringThe Team identifier to perform the request on behalf of. (wire: teamId)
+ +## `SELECT` examples + + + + +Get the TXT verification record needed to claim ownership of a domain for the authenticated team. The caller must add this TXT record to `_vercel.{domain}` in their DNS configuration, then call POST /domains/:domain/claim to complete the ownership transfer. + +```sql +SELECT +txt_record, +verification_domain +FROM vercel.domains.domain_verification +WHERE domain = '{{ domain }}' -- required +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + diff --git a/website/docs/services/domains/domains/index.md b/website/docs/services/domains/domains/index.md index de6db32..36d0919 100644 --- a/website/docs/services/domains/domains/index.md +++ b/website/docs/services/domains/domains/index.md @@ -15,6 +15,7 @@ image: /img/stackql-vercel-provider-featured-image.png --- import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; @@ -22,7 +23,7 @@ Creates, updates, deletes, gets or lists a domains resource. ## Overview - +
Namedomains
Name
TypeResource
Id
@@ -32,13 +33,13 @@ Creates, updates, deletes, gets or lists a domains resource. The following fields are returned by `SELECT` queries: - + Successful response retrieving an information for a specific domains. @@ -62,14 +63,24 @@ Successful response retrieving an information for a specific domains. The domain name. (example: example.com) - + + string + (wire: teamId) + + + + string + (wire: userId) + + + number - If it was purchased through Vercel, the timestamp in milliseconds when it was purchased. + If it was purchased through Vercel, the timestamp in milliseconds when it was purchased. (wire: boughtAt) - + number - Timestamp in milliseconds when the domain was created in the registry. + Timestamp in milliseconds when the domain was created in the registry. (wire: createdAt) @@ -77,64 +88,64 @@ Successful response retrieving an information for a specific domains. An object containing information of the domain creator, including the user's id, username, and email. - + array - A list of custom nameservers for the domain to point to. Only applies to domains purchased with Vercel. + A list of custom nameservers for the domain to point to. Only applies to domains purchased with Vercel. (wire: customNameservers) - + + string + Whether the domain is enrolled in Encrypted Client Hello. `auto` leaves the decision to Vercel, `enabled` always enrolls, and `disabled` never enrolls and opts out of automatic enrollment. (auto, disabled, enabled) (example: auto) (wire: echMode) + + + number - Timestamp in milliseconds at which the domain is set to expire. `null` if not bought with Vercel. + Timestamp in milliseconds at which the domain is set to expire. null if not bought with Vercel. (wire: expiresAt) - + array - A list of the intended nameservers for the domain to point to Vercel DNS. + A list of the intended nameservers for the domain to point to Vercel DNS. (wire: intendedNameservers) array A list of the current nameservers of the domain. - - - number - Timestamp in milliseconds at which the domain was ordered. - boolean - Indicates whether the domain is set to automatically renew. + Indicates whether the domain is set to automatically renew. (false, true) - + string - The type of service the domain is handled by. `external` if the DNS is externally handled, `zeit.world` if handled with Vercel, or `na` if the service is not available. (example: zeit.world) + The type of service the domain is handled by. `external` if the DNS is externally handled, `zeit.world` if handled with Vercel, or `na` if the service is not available. (external, na, zeit.world) (example: zeit.world) (wire: serviceType) boolean - + (false, true) - + number - If transferred into Vercel, timestamp in milliseconds when the domain transfer was initiated. + If transferred into Vercel, timestamp in milliseconds when the domain transfer was initiated. (wire: transferStartedAt) - + number - Timestamp in milliseconds at which the domain was successfully transferred into Vercel. `null` if the transfer is still processing or was never transferred in. + Timestamp in milliseconds at which the domain was successfully transferred into Vercel. `null` if the transfer is still processing or was never transferred in. (wire: transferredAt) boolean - If the domain has the ownership verified. + If the domain has the ownership verified. (false, true) - + Successful response retrieving a list of domains. @@ -158,14 +169,24 @@ Successful response retrieving a list of domains. The domain name. (example: example.com) - + + string + (wire: teamId) + + + + string + (wire: userId) + + + number - If it was purchased through Vercel, the timestamp in milliseconds when it was purchased. + If it was purchased through Vercel, the timestamp in milliseconds when it was purchased. (wire: boughtAt) - + number - Timestamp in milliseconds when the domain was created in the registry. + Timestamp in milliseconds when the domain was created in the registry. (wire: createdAt) @@ -173,54 +194,54 @@ Successful response retrieving a list of domains. An object containing information of the domain creator, including the user's id, username, and email. - + array - A list of custom nameservers for the domain to point to. Only applies to domains purchased with Vercel. + A list of custom nameservers for the domain to point to. Only applies to domains purchased with Vercel. (wire: customNameservers) + + + + string + Whether the domain is enrolled in Encrypted Client Hello. `auto` leaves the decision to Vercel, `enabled` always enrolls, and `disabled` never enrolls and opts out of automatic enrollment. (auto, disabled, enabled) (example: auto) (wire: echMode) - + number - Timestamp in milliseconds at which the domain is set to expire. `null` if not bought with Vercel. + Timestamp in milliseconds at which the domain is set to expire. null if not bought with Vercel. (wire: expiresAt) - + array - A list of the intended nameservers for the domain to point to Vercel DNS. + A list of the intended nameservers for the domain to point to Vercel DNS. (wire: intendedNameservers) array A list of the current nameservers of the domain. - - - number - Timestamp in milliseconds at which the domain was ordered. - boolean - Indicates whether the domain is set to automatically renew. + Indicates whether the domain is set to automatically renew. (false, true) - + string - The type of service the domain is handled by. `external` if the DNS is externally handled, `zeit.world` if handled with Vercel, or `na` if the service is not available. (example: zeit.world) + The type of service the domain is handled by. `external` if the DNS is externally handled, `zeit.world` if handled with Vercel, or `na` if the service is not available. (external, na, zeit.world) (example: zeit.world) (wire: serviceType) - + number - If transferred into Vercel, timestamp in milliseconds when the domain transfer was initiated. + If transferred into Vercel, timestamp in milliseconds when the domain transfer was initiated. (wire: transferStartedAt) - + number - Timestamp in milliseconds at which the domain was successfully transferred into Vercel. `null` if the transfer is still processing or was never transferred in. + Timestamp in milliseconds at which the domain was successfully transferred into Vercel. `null` if the transfer is still processing or was never transferred in. (wire: transferredAt) boolean - If the domain has the ownership verified. + If the domain has the ownership verified. (false, true) @@ -243,60 +264,46 @@ The following methods are available for this resource: - + - domain, teamId - + domain + team_id, slug Get information for a single domain in an account or team. - + - teamId - limit, since, until + + limit, since, until, team_id, slug Retrieves a list of domains registered for the authenticated user or team. By default it returns the last 20 domains if no limit is provided. - + - teamId, data__name - - This endpoint is used for adding a new apex domain name with Vercel for the authenticating user. Can also be used for initiating a domain transfer request from an external Registrar to Vercel. - - - - - domain, teamId - - Delete a previously registered domain name from Vercel. Deleting a domain will automatically remove any associated aliases. + name, method + team_id, slug + This endpoint is used for adding a new apex domain name with Vercel for the authenticating user. Note: This endpoint is no longer used for initiating domain transfers from external registrars to Vercel. For this, please use the endpoint [Transfer-in a domain](https:​//vercel.com/docs/rest-api/reference/endpoints/domains-registrar/transfer-in-a-domain). - - - teamId, name - - Allows to purchase the specified domain. + + + domain + team_id, slug + Update or move apex domain. Note: This endpoint is no longer used for updating auto-renew or nameservers. For this, please use the endpoints [Update auto-renew for a domain](https:​//vercel.com/docs/rest-api/reference/endpoints/domains-registrar/update-auto-renew-for-a-domain) and [Update nameservers for a domain](https:​//vercel.com/docs/rest-api/reference/endpoints/domains-registrar/update-nameservers-for-a-domain). - - - domain, teamId - - Get information for a single domain in an account or team. - - - - - teamId - limit, since, until - Retrieves a list of domains registered for the authenticated user or team. By default it returns the last 20 domains if no limit is provided. + + + domain + team_id, slug + Delete a previously registered domain name from Vercel. Deleting a domain will automatically remove any associated aliases. - + - domain, teamId - - Update or move apex domain. + domain + teamId, slug + Claim ownership of a domain for the authenticated team by verifying a TXT record. The caller must first add a TXT record to `_vercel.{domain}` (obtained from GET /domains/:domain/verification), then call this endpoint to complete the ownership transfer. If the TXT record is verified, the domain ownership will be transferred to the caller's team, even if the domain is currently owned by another user or team. @@ -317,12 +324,7 @@ Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](# string - The name of the domain. - - - - string - The Team identifier or slug to perform the request on behalf of. + The domain name to claim ownership of @@ -334,6 +336,21 @@ Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](# number Get domains created after this JavaScript timestamp. + + + string + The Team slug to perform the request on behalf of. + + + + string + The Team identifier to perform the request on behalf of. + + + + string + The Team identifier to perform the request on behalf of. (wire: teamId) + number @@ -345,13 +362,13 @@ Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](# ## `SELECT` examples - + Get information for a single domain in an account or team. @@ -359,27 +376,30 @@ Get information for a single domain in an account or team. SELECT id, name, -boughtAt, -createdAt, +team_id, +user_id, +bought_at, +created_at, creator, -customNameservers, -expiresAt, -intendedNameservers, +custom_nameservers, +ech_mode, +expires_at, +intended_nameservers, nameservers, -orderedAt, renew, -serviceType, +service_type, suffix, -transferStartedAt, -transferredAt, +transfer_started_at, +transferred_at, verified FROM vercel.domains.domains WHERE domain = '{{ domain }}' -- required -AND teamId = '{{ teamId }}' -- required +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' ; ``` - + Retrieves a list of domains registered for the authenticated user or team. By default it returns the last 20 domains if no limit is provided. @@ -387,24 +407,27 @@ Retrieves a list of domains registered for the authenticated user or team. By de SELECT id, name, -boughtAt, -createdAt, +team_id, +user_id, +bought_at, +created_at, creator, -customNameservers, -expiresAt, -intendedNameservers, +custom_nameservers, +ech_mode, +expires_at, +intended_nameservers, nameservers, -orderedAt, renew, -serviceType, -transferStartedAt, -transferredAt, +service_type, +transfer_started_at, +transferred_at, verified FROM vercel.domains.domains -WHERE teamId = '{{ teamId }}' -- required -AND limit = '{{ limit }}' +WHERE limit = '{{ limit }}' AND since = '{{ since }}' AND until = '{{ until }}' +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' ; ``` @@ -414,30 +437,34 @@ AND until = '{{ until }}' ## `INSERT` examples - + -This endpoint is used for adding a new apex domain name with Vercel for the authenticating user. Can also be used for initiating a domain transfer request from an external Registrar to Vercel. +This endpoint is used for adding a new apex domain name with Vercel for the authenticating user. Note: This endpoint is no longer used for initiating domain transfers from external registrars to Vercel. For this, please use the endpoint [Transfer-in a domain](https://vercel.com/docs/rest-api/reference/endpoints/domains-registrar/transfer-in-a-domain). ```sql INSERT INTO vercel.domains.domains ( -data__name, -data__cdnEnabled, -data__zone, -data__method, -teamId +method, +name, +cdn_enabled, +zone, +token, +team_id, +slug ) SELECT +'{{ method }}' /* required */, '{{ name }}' /* required */, -{{ cdnEnabled }}, +{{ cdn_enabled }}, {{ zone }}, -'{{ method }}', -'{{ teamId }}' +'{{ token }}', +'{{ team_id }}', +'{{ slug }}' RETURNING domain ; @@ -445,120 +472,122 @@ domain -```yaml -# Description fields are for documentation purposes +{`# Description fields are for documentation purposes - name: domains props: - - name: teamId - value: string - description: Required parameter for the domains resource. + - name: method + value: "{{ method }}" + description: | + The domain operation to perform. It can be either \`add\` or \`move-in\`. - name: name - value: string + value: "{{ name }}" description: | The domain name you want to add. - - name: cdnEnabled - value: boolean + - name: cdn_enabled + value: {{ cdn_enabled }} description: | - Whether the domain has the Vercel Edge Network enabled or not. + Whether the domain has the Vercel CDN enabled or not. - name: zone - value: boolean - - name: method - value: string + value: {{ zone }} description: | - The domain operation to perform. -``` + Whether to create a DNS zone on Vercel. Set \`true\` if using Vercel nameservers. + - name: token + value: "{{ token }}" + description: | + The move-in token from Move Requested email. + - name: team_id + value: "{{ team_id }}" + description: The Team identifier to perform the request on behalf of. + description: The Team identifier to perform the request on behalf of. + - name: slug + value: "{{ slug }}" + description: The Team slug to perform the request on behalf of. + description: The Team slug to perform the request on behalf of. +`} + -## `DELETE` examples +## `UPDATE` examples - + -Delete a previously registered domain name from Vercel. Deleting a domain will automatically remove any associated aliases. +Update or move apex domain. Note: This endpoint is no longer used for updating auto-renew or nameservers. For this, please use the endpoints [Update auto-renew for a domain](https://vercel.com/docs/rest-api/reference/endpoints/domains-registrar/update-auto-renew-for-a-domain) and [Update nameservers for a domain](https://vercel.com/docs/rest-api/reference/endpoints/domains-registrar/update-nameservers-for-a-domain). ```sql -DELETE FROM vercel.domains.domains -WHERE domain = '{{ domain }}' --required -AND teamId = '{{ teamId }}' --required -; +UPDATE vercel.domains.domains +SET +op = '{{ op }}', +renew = {{ renew }}, +custom_nameservers = '{{ custom_nameservers }}', +zone = {{ zone }}, +ech_mode = '{{ ech_mode }}', +destination = '{{ destination }}' +WHERE +domain = '{{ domain }}' --required +AND team_id = '{{ team_id}}' +AND slug = '{{ slug}}' +RETURNING +custom_nameservers, +ech_mode, +moved, +renew, +token, +zone; ``` -## Lifecycle Methods +## `DELETE` examples - + -Allows to purchase the specified domain. +Delete a previously registered domain name from Vercel. Deleting a domain will automatically remove any associated aliases. ```sql -EXEC vercel.domains.domains.buy_domain -@teamId='{{ teamId }}' --required -@@json= -'{ -"name": "{{ name }}", -"expectedPrice": {{ expectedPrice }}, -"renew": {{ renew }} -}' +DELETE FROM vercel.domains.domains +WHERE domain = '{{ domain }}' --required +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' ; ``` - + -Get information for a single domain in an account or team. -```sql -EXEC vercel.domains.domains._get_domain -@domain='{{ domain }}' --required, -@teamId='{{ teamId }}' --required -; -``` - - +## Lifecycle Methods -Retrieves a list of domains registered for the authenticated user or team. By default it returns the last 20 domains if no limit is provided. +EXEC variables use wire (API) names. -```sql -EXEC vercel.domains.domains._get_domains -@teamId='{{ teamId }}' --required, -@limit='{{ limit }}', -@since='{{ since }}', -@until='{{ until }}' -; -``` - - + + -Update or move apex domain. +Claim ownership of a domain for the authenticated team by verifying a TXT record. The caller must first add a TXT record to `_vercel.{domain}` (obtained from GET /domains/:domain/verification), then call this endpoint to complete the ownership transfer. If the TXT record is verified, the domain ownership will be transferred to the caller's team, even if the domain is currently owned by another user or team. ```sql -EXEC vercel.domains.domains.patch_domain +EXEC vercel.domains.domains.claim_ownership @domain='{{ domain }}' --required, -@teamId='{{ teamId }}' --required -@@json= -'{ -"op": "{{ op }}", -"renew": {{ renew }}, -"customNameservers": "{{ customNameservers }}", -"zone": {{ zone }} -}' +@teamId='{{ teamId }}', +@slug='{{ slug }}' ; ``` diff --git a/website/docs/services/domains/index.md b/website/docs/services/domains/index.md index caf09ac..2110045 100644 --- a/website/docs/services/domains/index.md +++ b/website/docs/services/domains/index.md @@ -18,19 +18,18 @@ domains service documentation. :::info[Service Summary] -total resources: __5__ +total resources: __4__ ::: ## Resources \ No newline at end of file diff --git a/website/docs/services/domains/price/index.md b/website/docs/services/domains/price/index.md deleted file mode 100644 index aefda06..0000000 --- a/website/docs/services/domains/price/index.md +++ /dev/null @@ -1,147 +0,0 @@ ---- -title: price -hide_title: false -hide_table_of_contents: false -keywords: - - price - - domains - - vercel - - infrastructure-as-code - - configuration-as-data - - cloud inventory -description: Query, deploy and manage vercel resources using SQL -custom_edit_url: null -image: /img/stackql-vercel-provider-featured-image.png ---- - -import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; - -Creates, updates, deletes, gets or lists a price resource. - -## Overview - - - - -
Nameprice
TypeResource
Id
- -## Fields - -The following fields are returned by `SELECT` queries: - - - - -Successful response which returns the price of the domain and the period. - - - - - - - - - - - - - - - - - - - - - -
NameDatatypeDescription
numberThe number of years the domain could be held before paying again.
numberThe domain price in USD.
-
-
- -## Methods - -The following methods are available for this resource: - - - - - - - - - - - - - - - - - - - - -
NameAccessible byRequired ParamsOptional ParamsDescription
name, teamIdtypeCheck the price to purchase a domain and how long a single purchase period is.
- -## Parameters - -Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDatatypeDescription
stringThe name of the domain for which the price needs to be checked.
stringThe Team identifier or slug to perform the request on behalf of.
stringIn which status of the domain the price needs to be checked.
- -## `SELECT` examples - - - - -Check the price to purchase a domain and how long a single purchase period is. - -```sql -SELECT -period, -price -FROM vercel.domains.price -WHERE name = '{{ name }}' -- required -AND teamId = '{{ teamId }}' -- required -AND type = '{{ type }}' -; -``` - - diff --git a/website/docs/services/domains_registrar/contact_info_schema/index.md b/website/docs/services/domains_registrar/contact_info_schema/index.md new file mode 100644 index 0000000..eb185bf --- /dev/null +++ b/website/docs/services/domains_registrar/contact_info_schema/index.md @@ -0,0 +1,136 @@ +--- +title: contact_info_schema +hide_title: false +hide_table_of_contents: false +keywords: + - contact_info_schema + - domains_registrar + - vercel + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a contact_info_schema resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + +Wrapper for non-JSON response bodies (jsonl, ndjson, streamed json, octet-stream): one row carrying the raw body text. + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringRaw response body.
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
domainteam_idSome TLDs require additional contact information. Use this endpoint to get the schema for the tld-specific contact information for a domain.
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string
string (wire: teamId)
+ +## `SELECT` examples + + + + +Some TLDs require additional contact information. Use this endpoint to get the schema for the tld-specific contact information for a domain. + +```sql +SELECT +contents +FROM vercel.domains_registrar.contact_info_schema +WHERE domain = '{{ domain }}' -- required +AND team_id = '{{ team_id }}' +; +``` + + diff --git a/website/docs/services/domains_registrar/domain_auth_codes/index.md b/website/docs/services/domains_registrar/domain_auth_codes/index.md new file mode 100644 index 0000000..ebd3611 --- /dev/null +++ b/website/docs/services/domains_registrar/domain_auth_codes/index.md @@ -0,0 +1,134 @@ +--- +title: domain_auth_codes +hide_title: false +hide_table_of_contents: false +keywords: + - domain_auth_codes + - domains_registrar + - vercel + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a domain_auth_codes resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string (wire: authCode)
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
domainteam_idGet the auth code for a domain. This is required to transfer a domain from Vercel to another registrar.
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string
string (wire: teamId)
+ +## `SELECT` examples + + + + +Get the auth code for a domain. This is required to transfer a domain from Vercel to another registrar. + +```sql +SELECT +auth_code +FROM vercel.domains_registrar.domain_auth_codes +WHERE domain = '{{ domain }}' -- required +AND team_id = '{{ team_id }}' +; +``` + + diff --git a/website/docs/services/domains_registrar/domain_availability/index.md b/website/docs/services/domains_registrar/domain_availability/index.md new file mode 100644 index 0000000..cb6be27 --- /dev/null +++ b/website/docs/services/domains_registrar/domain_availability/index.md @@ -0,0 +1,173 @@ +--- +title: domain_availability +hide_title: false +hide_table_of_contents: false +keywords: + - domain_availability + - domains_registrar + - vercel + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a domain_availability resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
boolean
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
domainteam_idGet availability for a specific domain. If the domain is available, it can be purchased using the [Buy a domain](https:​//vercel.com/docs/rest-api/reference/endpoints/domains-registrar/buy-a-domain) endpoint or the [Buy multiple domains](https:​//vercel.com/docs/rest-api/reference/endpoints/domains-registrar/buy-multiple-domains) endpoint.
domainsteamIdGet availability for multiple domains. If the domains are available, they can be purchased using the [Buy a domain](https:​//vercel.com/docs/rest-api/reference/endpoints/domains-registrar/buy-a-domain) endpoint or the [Buy multiple domains](https:​//vercel.com/docs/rest-api/reference/endpoints/domains-registrar/buy-multiple-domains) endpoint.
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string
string
string (wire: teamId)
+ +## `SELECT` examples + + + + +Get availability for a specific domain. If the domain is available, it can be purchased using the [Buy a domain](https://vercel.com/docs/rest-api/reference/endpoints/domains-registrar/buy-a-domain) endpoint or the [Buy multiple domains](https://vercel.com/docs/rest-api/reference/endpoints/domains-registrar/buy-multiple-domains) endpoint. + +```sql +SELECT +available +FROM vercel.domains_registrar.domain_availability +WHERE domain = '{{ domain }}' -- required +AND team_id = '{{ team_id }}' +; +``` + + + + +## Lifecycle Methods + +EXEC variables use wire (API) names. + + + + +Get availability for multiple domains. If the domains are available, they can be purchased using the [Buy a domain](https://vercel.com/docs/rest-api/reference/endpoints/domains-registrar/buy-a-domain) endpoint or the [Buy multiple domains](https://vercel.com/docs/rest-api/reference/endpoints/domains-registrar/buy-multiple-domains) endpoint. + +```sql +EXEC vercel.domains_registrar.domain_availability.get_bulk +@teamId='{{ teamId }}' +@@json= +'{ +"domains": "{{ domains }}" +}' +; +``` + + diff --git a/website/docs/services/domains_registrar/domain_contact_verification/index.md b/website/docs/services/domains_registrar/domain_contact_verification/index.md new file mode 100644 index 0000000..2a46567 --- /dev/null +++ b/website/docs/services/domains_registrar/domain_contact_verification/index.md @@ -0,0 +1,148 @@ +--- +title: domain_contact_verification +hide_title: false +hide_table_of_contents: false +keywords: + - domain_contact_verification + - domains_registrar + - vercel + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a domain_contact_verification resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + +The registrant contact has been verified. + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string
boolean (true)
stringa string to be decoded into a Date (wire: verifyBy)
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
domainteam_idGet the registrant contact verification status for a domain. Use this after purchasing a domain to determine whether the contact has been verified. Note that a bought_too_recently error will be returned if the domain was bought less than 30 minutes before the request.
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string
string (wire: teamId)
+ +## `SELECT` examples + + + + +Get the registrant contact verification status for a domain. Use this after purchasing a domain to determine whether the contact has been verified. Note that a bought_too_recently error will be returned if the domain was bought less than 30 minutes before the request. + +```sql +SELECT +email, +verified, +verify_by +FROM vercel.domains_registrar.domain_contact_verification +WHERE domain = '{{ domain }}' -- required +AND team_id = '{{ team_id }}' +; +``` + + diff --git a/website/docs/services/domains/config/index.md b/website/docs/services/domains_registrar/domain_prices/index.md similarity index 50% rename from website/docs/services/domains/config/index.md rename to website/docs/services/domains_registrar/domain_prices/index.md index 29f7cb9..867e0c9 100644 --- a/website/docs/services/domains/config/index.md +++ b/website/docs/services/domains_registrar/domain_prices/index.md @@ -1,10 +1,10 @@ --- -title: config +title: domain_prices hide_title: false hide_table_of_contents: false keywords: - - config - - domains + - domain_prices + - domains_registrar - vercel - infrastructure-as-code - configuration-as-data @@ -15,16 +15,17 @@ image: /img/stackql-vercel-provider-featured-image.png --- import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; -Creates, updates, deletes, gets or lists a config resource. +Creates, updates, deletes, gets or lists a domain_prices resource. ## Overview - + - +
Nameconfig
Name
TypeResource
Id
Id
## Fields @@ -32,12 +33,12 @@ Creates, updates, deletes, gets or lists a config resource. The following fields are returned by `SELECT` queries: - + @@ -49,19 +50,24 @@ The following fields are returned by `SELECT` queries: - - - + + + - - - + + + + + + + + - - - + + +
arrayWhich challenge types the domain can use for issuing certs.number (wire: purchasePrice)
stringHow we see the domain's configuration. - `CNAME`: Domain has a CNAME pointing to Vercel. - `A`: Domain's A record is resolving to Vercel. - `http`: Domain is resolving to Vercel but may be behind a Proxy. - `null`: Domain is not resolving to Vercel.number (wire: renewalPrice)
number (wire: transferPrice)
booleanWhether or not the domain is configured AND we can automatically generate a TLS certificate.number
@@ -84,11 +90,11 @@ The following methods are available for this resource: - + - domain, teamId - - Get a Domain's configuration. + domain + years, team_id + Get price data for a specific domain @@ -109,12 +115,17 @@ Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](# string - The name of the domain. + + + + + string + (wire: teamId) - - + + string - The Team identifier or slug to perform the request on behalf of. + The number of years to get the price for. If not provided, the minimum number of years for the TLD will be used. @@ -122,23 +133,25 @@ Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](# ## `SELECT` examples - + -Get a Domain's configuration. +Get price data for a specific domain ```sql SELECT -acceptedChallenges, -configuredBy, -misconfigured -FROM vercel.domains.config +purchase_price, +renewal_price, +transfer_price, +years +FROM vercel.domains_registrar.domain_prices WHERE domain = '{{ domain }}' -- required -AND teamId = '{{ teamId }}' -- required +AND years = '{{ years }}' +AND team_id = '{{ team_id }}' ; ``` diff --git a/website/docs/services/domains_registrar/domain_transfers/index.md b/website/docs/services/domains_registrar/domain_transfers/index.md new file mode 100644 index 0000000..043f8f7 --- /dev/null +++ b/website/docs/services/domains_registrar/domain_transfers/index.md @@ -0,0 +1,134 @@ +--- +title: domain_transfers +hide_title: false +hide_table_of_contents: false +keywords: + - domain_transfers + - domains_registrar + - vercel + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a domain_transfers resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string (canceled, canceled_pending_refund, completed, created, failed, pending, pending_insert, pending_new_auth_code, pending_transfer, pending_unlock, pending_registry_unlock, rejected, submitting_transfer)
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
domainteam_idGet the transfer status for a domain
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string
string (wire: teamId)
+ +## `SELECT` examples + + + + +Get the transfer status for a domain + +```sql +SELECT +status +FROM vercel.domains_registrar.domain_transfers +WHERE domain = '{{ domain }}' -- required +AND team_id = '{{ team_id }}' +; +``` + + diff --git a/website/docs/services/domains_registrar/domains/index.md b/website/docs/services/domains_registrar/domains/index.md new file mode 100644 index 0000000..5c8bfe6 --- /dev/null +++ b/website/docs/services/domains_registrar/domains/index.md @@ -0,0 +1,137 @@ +--- +title: domains +hide_title: false +hide_table_of_contents: false +keywords: + - domains + - domains_registrar + - vercel + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a domains resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + +`SELECT` not supported for this resource, use `SHOW METHODS` to view available operations for the resource. + + +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
domain, autoRenewteamIdUpdate the auto-renew setting for a domain
domain, nameserversteamIdUpdate the nameservers for a domain. Pass an empty array to use Vercel's default nameservers.
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string
string
+ +## Lifecycle Methods + +EXEC variables use wire (API) names. + + + + +Update the auto-renew setting for a domain + +```sql +EXEC vercel.domains_registrar.domains.update_auto_renew +@domain='{{ domain }}' --required, +@teamId='{{ teamId }}' +@@json= +'{ +"autoRenew": {{ autoRenew }} +}' +; +``` + + + +Update the nameservers for a domain. Pass an empty array to use Vercel's default nameservers. + +```sql +EXEC vercel.domains_registrar.domains.update_nameservers +@domain='{{ domain }}' --required, +@teamId='{{ teamId }}' +@@json= +'{ +"nameservers": "{{ nameservers }}" +}' +; +``` + + diff --git a/website/docs/services/domains_registrar/index.md b/website/docs/services/domains_registrar/index.md new file mode 100644 index 0000000..374aab1 --- /dev/null +++ b/website/docs/services/domains_registrar/index.md @@ -0,0 +1,41 @@ +--- +title: domains_registrar +hide_title: false +hide_table_of_contents: false +keywords: + - domains_registrar + - vercel + - stackql + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +domains_registrar service documentation. + +:::info[Service Summary] + +total resources: __10__ + +::: + +## Resources + \ No newline at end of file diff --git a/website/docs/services/domains_registrar/orders/index.md b/website/docs/services/domains_registrar/orders/index.md new file mode 100644 index 0000000..defe04a --- /dev/null +++ b/website/docs/services/domains_registrar/orders/index.md @@ -0,0 +1,276 @@ +--- +title: orders +hide_title: false +hide_table_of_contents: false +keywords: + - orders + - domains_registrar + - vercel + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists an orders resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringA valid order ID (wire: orderId)
array
object
string (draft, purchasing, completed, failed)
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
order_idteam_idGet information about a domain order by its ID
domain, autoRenew, years, expectedPrice, contactInformationteamIdBuy a domain
domains, contactInformationteamIdBuy multiple domains at once
domain, authCode, autoRenew, years, expectedPrice, contactInformationteamIdTransfer a domain in from another registrar
domain, years, expectedPriceteamIdRenew a domain
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string
string
string
string (wire: teamId)
+ +## `SELECT` examples + + + + +Get information about a domain order by its ID + +```sql +SELECT +order_id, +domains, +error, +status +FROM vercel.domains_registrar.orders +WHERE order_id = '{{ order_id }}' -- required +AND team_id = '{{ team_id }}' +; +``` + + + + +## Lifecycle Methods + +EXEC variables use wire (API) names. + + + + +Buy a domain + +```sql +EXEC vercel.domains_registrar.orders.buy_domain +@domain='{{ domain }}' --required, +@teamId='{{ teamId }}' +@@json= +'{ +"autoRenew": {{ autoRenew }}, +"years": {{ years }}, +"expectedPrice": {{ expectedPrice }}, +"contactInformation": "{{ contactInformation }}", +"languageCode": "{{ languageCode }}" +}' +; +``` + + + +Buy multiple domains at once + +```sql +EXEC vercel.domains_registrar.orders.buy_domains +@teamId='{{ teamId }}' +@@json= +'{ +"domains": "{{ domains }}", +"contactInformation": "{{ contactInformation }}" +}' +; +``` + + + +Transfer a domain in from another registrar + +```sql +EXEC vercel.domains_registrar.orders.transfer_in_domain +@domain='{{ domain }}' --required, +@teamId='{{ teamId }}' +@@json= +'{ +"authCode": "{{ authCode }}", +"autoRenew": {{ autoRenew }}, +"years": {{ years }}, +"expectedPrice": {{ expectedPrice }}, +"contactInformation": "{{ contactInformation }}" +}' +; +``` + + + +Renew a domain + +```sql +EXEC vercel.domains_registrar.orders.renew_domain +@domain='{{ domain }}' --required, +@teamId='{{ teamId }}' +@@json= +'{ +"years": {{ years }}, +"expectedPrice": {{ expectedPrice }}, +"contactInformation": "{{ contactInformation }}" +}' +; +``` + + diff --git a/website/docs/services/domains_registrar/tld_prices/index.md b/website/docs/services/domains_registrar/tld_prices/index.md new file mode 100644 index 0000000..96b6685 --- /dev/null +++ b/website/docs/services/domains_registrar/tld_prices/index.md @@ -0,0 +1,158 @@ +--- +title: tld_prices +hide_title: false +hide_table_of_contents: false +keywords: + - tld_prices + - domains_registrar + - vercel + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a tld_prices resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
number (wire: purchasePrice)
number (wire: renewalPrice)
number (wire: transferPrice)
numberThe number of years the returned price is for.
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
tldyears, team_idGet price data for a specific TLD. This only reflects base prices for the given TLD. Premium domains may have different prices. Use the [Get price data for a domain](https:​//vercel.com/docs/rest-api/reference/endpoints/domains-registrar/get-price-data-for-a-domain) endpoint to get the price data for a specific domain.
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string
string (wire: teamId)
stringThe number of years to get the price for. If not provided, the minimum number of years for the TLD will be used.
+ +## `SELECT` examples + + + + +Get price data for a specific TLD. This only reflects base prices for the given TLD. Premium domains may have different prices. Use the [Get price data for a domain](https://vercel.com/docs/rest-api/reference/endpoints/domains-registrar/get-price-data-for-a-domain) endpoint to get the price data for a specific domain. + +```sql +SELECT +purchase_price, +renewal_price, +transfer_price, +years +FROM vercel.domains_registrar.tld_prices +WHERE tld = '{{ tld }}' -- required +AND years = '{{ years }}' +AND team_id = '{{ team_id }}' +; +``` + + diff --git a/website/docs/services/domains_registrar/tlds/index.md b/website/docs/services/domains_registrar/tlds/index.md new file mode 100644 index 0000000..10a9780 --- /dev/null +++ b/website/docs/services/domains_registrar/tlds/index.md @@ -0,0 +1,171 @@ +--- +title: tlds +hide_title: false +hide_table_of_contents: false +keywords: + - tlds + - domains_registrar + - vercel + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a tlds resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
objectThe language codes that are supported for the TLD. The key is the language code, and the value is the name of the language. (wire: supportedLanguageCodes)
+
+ + +A valid TLD name + + + + + + + + + + + +
NameDatatypeDescription
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
tldteam_idGet the metadata for a specific TLD.
team_idGet a list of TLDs supported by Vercel
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string
string (wire: teamId)
+ +## `SELECT` examples + + + + +Get the metadata for a specific TLD. + +```sql +SELECT +supported_language_codes +FROM vercel.domains_registrar.tlds +WHERE tld = '{{ tld }}' -- required +AND team_id = '{{ team_id }}' +; +``` + + + +Get a list of TLDs supported by Vercel + +```sql +SELECT +* +FROM vercel.domains_registrar.tlds +WHERE team_id = '{{ team_id }}' +; +``` + + diff --git a/website/docs/services/drains/drains/index.md b/website/docs/services/drains/drains/index.md new file mode 100644 index 0000000..2f1d92d --- /dev/null +++ b/website/docs/services/drains/drains/index.md @@ -0,0 +1,696 @@ +--- +title: drains +hide_title: false +hide_table_of_contents: false +keywords: + - drains + - drains + - vercel + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a drains resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string
string
string (wire: ownerId)
string (wire: teamId)
number (wire: createdAt)
number (wire: disabledAt)
string (wire: disabledBy)
string (account-plan-downgrade, disabled-by-admin, disabled-by-owner, feature-not-available, limits-exceeded) (wire: disabledReason)
object (wire: filterV2)
number (wire: firstErrorTimestamp)
string (wire: integrationConfigurationUri)
string (wire: integrationIcon)
string (wire: integrationWebsite)
(wire: projectAccess)
array (wire: projectIds)
array
object
string (disabled, enabled, errored)
number (wire: updatedAt)
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string
string
string (wire: ownerId)
string (wire: teamId)
number (wire: createdAt)
number (wire: disabledAt)
string (wire: disabledBy)
string (account-plan-downgrade, disabled-by-admin, disabled-by-owner, feature-not-available, limits-exceeded) (wire: disabledReason)
object (wire: filterV2)
number (wire: firstErrorTimestamp)
string (wire: integrationConfigurationUri)
string (wire: integrationIcon)
string (wire: integrationWebsite)
(wire: projectAccess)
array (wire: projectIds)
array
object
string (disabled, enabled, errored)
number (wire: updatedAt)
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
idteam_id, slugGet the information for a specific Drain by passing the drain id in the URL.
project_id, include_metadata, team_id, slugAllows to retrieve the list of Drains of the authenticated team.
name, projects, schemasteam_id, slugCreate a new Drain with the provided configuration.
idteam_id, slugUpdate the configuration of an existing drain.
idteam_id, slugDelete a specific Drain by passing the drain id in the URL.
schemas, deliveryteamId, slugValidate the delivery configuration of a Drain using sample events.
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string
boolean (wire: includeMetadata)
string (wire: projectId)
stringThe Team slug to perform the request on behalf of.
stringThe Team identifier to perform the request on behalf of.
stringThe Team identifier to perform the request on behalf of. (wire: teamId)
+ +## `SELECT` examples + + + + +Get the information for a specific Drain by passing the drain id in the URL. + +```sql +SELECT +id, +name, +owner_id, +team_id, +created_at, +delivery, +disabled_at, +disabled_by, +disabled_reason, +filter_v2, +first_error_timestamp, +integration_configuration_uri, +integration_icon, +integration_website, +project_access, +project_ids, +sampling, +schemas, +source, +status, +updated_at +FROM vercel.drains.drains +WHERE id = '{{ id }}' -- required +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + + +Allows to retrieve the list of Drains of the authenticated team. + +```sql +SELECT +id, +name, +owner_id, +team_id, +created_at, +delivery, +disabled_at, +disabled_by, +disabled_reason, +filter_v2, +first_error_timestamp, +integration_configuration_uri, +integration_icon, +integration_website, +project_access, +project_ids, +sampling, +schemas, +source, +status, +updated_at +FROM vercel.drains.drains +WHERE project_id = '{{ project_id }}' +AND include_metadata = '{{ include_metadata }}' +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + + + +## `INSERT` examples + + + + +Create a new Drain with the provided configuration. + +```sql +INSERT INTO vercel.drains.drains ( +name, +projects, +project_ids, +filter, +schemas, +delivery, +sampling, +transforms, +source, +team_id, +slug +) +SELECT +'{{ name }}' /* required */, +'{{ projects }}' /* required */, +'{{ project_ids }}', +'{{ filter }}', +'{{ schemas }}' /* required */, +'{{ delivery }}', +'{{ sampling }}', +'{{ transforms }}', +'{{ source }}', +'{{ team_id }}', +'{{ slug }}' +RETURNING +id, +name, +owner_id, +team_id, +created_at, +delivery, +disabled_at, +disabled_by, +disabled_reason, +filter_v2, +first_error_timestamp, +integration_configuration_uri, +integration_icon, +integration_website, +project_access, +project_ids, +sampling, +schemas, +source, +status, +updated_at +; +``` + + + +{`# Description fields are for documentation purposes +- name: drains + props: + - name: name + value: "{{ name }}" + - name: projects + value: "{{ projects }}" + valid_values: ['some', 'all'] + - name: project_ids + value: + - "{{ project_ids }}" + - name: filter + value: + version: "{{ version }}" + filter: "{{ filter }}" + - name: schemas + value: "{{ schemas }}" + - name: delivery + value: + type: "{{ type }}" + endpoint: "{{ endpoint }}" + compression: "{{ compression }}" + encoding: "{{ encoding }}" + headers: "{{ headers }}" + secret: "{{ secret }}" + fileStructure: "{{ fileStructure }}" + roleArn: "{{ roleArn }}" + region: "{{ region }}" + serverSideEncryption: "{{ serverSideEncryption }}" + objectAcl: "{{ objectAcl }}" + - name: sampling + value: + - type: "{{ type }}" + rate: {{ rate }} + env: "{{ env }}" + requestPath: "{{ requestPath }}" + - name: transforms + value: + - id: "{{ id }}" + - name: source + value: + kind: "{{ kind }}" + - name: team_id + value: "{{ team_id }}" + description: The Team identifier to perform the request on behalf of. + description: The Team identifier to perform the request on behalf of. + - name: slug + value: "{{ slug }}" + description: The Team slug to perform the request on behalf of. + description: The Team slug to perform the request on behalf of. +`} + + + + + +## `UPDATE` examples + + + + +Update the configuration of an existing drain. + +```sql +UPDATE vercel.drains.drains +SET +name = '{{ name }}', +projects = '{{ projects }}', +project_ids = '{{ project_ids }}', +filter = '{{ filter }}', +schemas = '{{ schemas }}', +delivery = '{{ delivery }}', +sampling = '{{ sampling }}', +transforms = '{{ transforms }}', +status = '{{ status }}', +source = '{{ source }}' +WHERE +id = '{{ id }}' --required +AND team_id = '{{ team_id}}' +AND slug = '{{ slug}}' +RETURNING +id, +name, +owner_id, +team_id, +created_at, +delivery, +disabled_at, +disabled_by, +disabled_reason, +filter_v2, +first_error_timestamp, +integration_configuration_uri, +integration_icon, +integration_website, +project_access, +project_ids, +sampling, +schemas, +source, +status, +updated_at; +``` + + + + +## `DELETE` examples + + + + +Delete a specific Drain by passing the drain id in the URL. + +```sql +DELETE FROM vercel.drains.drains +WHERE id = '{{ id }}' --required +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + + + +## Lifecycle Methods + +EXEC variables use wire (API) names. + + + + +Validate the delivery configuration of a Drain using sample events. + +```sql +EXEC vercel.drains.drains.test +@teamId='{{ teamId }}', +@slug='{{ slug }}' +@@json= +'{ +"schemas": "{{ schemas }}", +"delivery": "{{ delivery }}" +}' +; +``` + + diff --git a/website/docs/services/secrets/index.md b/website/docs/services/drains/index.md similarity index 81% rename from website/docs/services/secrets/index.md rename to website/docs/services/drains/index.md index 7f7d5e9..b9dd460 100644 --- a/website/docs/services/secrets/index.md +++ b/website/docs/services/drains/index.md @@ -1,9 +1,9 @@ --- -title: secrets +title: drains hide_title: false hide_table_of_contents: false keywords: - - secrets + - drains - vercel - stackql - infrastructure-as-code @@ -14,7 +14,7 @@ custom_edit_url: null image: /img/stackql-vercel-provider-featured-image.png --- -secrets service documentation. +drains service documentation. :::info[Service Summary] @@ -25,7 +25,7 @@ total resources: __1__ ## Resources
diff --git a/website/docs/services/edge_cache/cache/index.md b/website/docs/services/edge_cache/cache/index.md new file mode 100644 index 0000000..9846d26 --- /dev/null +++ b/website/docs/services/edge_cache/cache/index.md @@ -0,0 +1,196 @@ +--- +title: cache +hide_title: false +hide_table_of_contents: false +keywords: + - cache + - edge_cache + - vercel + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a cache resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + +`SELECT` not supported for this resource, use `SHOW METHODS` to view available operations for the resource. + + +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
projectIdOrName, tagsteamId, slugMarks a cache tag as stale, causing cache entries associated with that tag to be revalidated in the background on the next request.
projectIdOrName, tagsteamId, slugMarks a cache tag as deleted, causing cache entries associated with that tag to be revalidated in the foreground on the next request. Use this method with caution because one tag can be associated with many paths and deleting the cache can cause many concurrent requests to the origin leading to cache stampede problem. This method is for advanced use cases and is not recommended; prefer using `invalidateByTag` instead.
projectIdOrName, srcImagesteamId, slugMarks a source image as stale, causing its corresponding transformed images to be revalidated in the background on the next request.
projectIdOrName, srcImagesteamId, slugMarks a source image as deleted, causing cache entries associated with that source image to be revalidated in the foreground on the next request. Use this method with caution because one source image can be associated with many paths and deleting the cache can cause many concurrent requests to the origin leading to cache stampede problem. This method is for advanced use cases and is not recommended; prefer using `invalidateBySrcImage` instead.
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string
stringThe Team slug to perform the request on behalf of.
stringThe Team identifier to perform the request on behalf of.
+ +## Lifecycle Methods + +EXEC variables use wire (API) names. + + + + +Marks a cache tag as stale, causing cache entries associated with that tag to be revalidated in the background on the next request. + +```sql +EXEC vercel.edge_cache.cache.invalidate_by_tags +@projectIdOrName='{{ projectIdOrName }}' --required, +@teamId='{{ teamId }}', +@slug='{{ slug }}' +@@json= +'{ +"tags": "{{ tags }}", +"target": "{{ target }}" +}' +; +``` + + + +Marks a cache tag as deleted, causing cache entries associated with that tag to be revalidated in the foreground on the next request. Use this method with caution because one tag can be associated with many paths and deleting the cache can cause many concurrent requests to the origin leading to cache stampede problem. This method is for advanced use cases and is not recommended; prefer using `invalidateByTag` instead. + +```sql +EXEC vercel.edge_cache.cache.delete_by_tags +@projectIdOrName='{{ projectIdOrName }}' --required, +@teamId='{{ teamId }}', +@slug='{{ slug }}' +@@json= +'{ +"revalidationDeadlineSeconds": {{ revalidationDeadlineSeconds }}, +"tags": "{{ tags }}", +"target": "{{ target }}" +}' +; +``` + + + +Marks a source image as stale, causing its corresponding transformed images to be revalidated in the background on the next request. + +```sql +EXEC vercel.edge_cache.cache.invalidate_by_src_images +@projectIdOrName='{{ projectIdOrName }}' --required, +@teamId='{{ teamId }}', +@slug='{{ slug }}' +@@json= +'{ +"srcImages": "{{ srcImages }}" +}' +; +``` + + + +Marks a source image as deleted, causing cache entries associated with that source image to be revalidated in the foreground on the next request. Use this method with caution because one source image can be associated with many paths and deleting the cache can cause many concurrent requests to the origin leading to cache stampede problem. This method is for advanced use cases and is not recommended; prefer using `invalidateBySrcImage` instead. + +```sql +EXEC vercel.edge_cache.cache.delete_by_src_images +@projectIdOrName='{{ projectIdOrName }}' --required, +@teamId='{{ teamId }}', +@slug='{{ slug }}' +@@json= +'{ +"revalidationDeadlineSeconds": {{ revalidationDeadlineSeconds }}, +"srcImages": "{{ srcImages }}" +}' +; +``` + + diff --git a/website/docs/services/cache/index.md b/website/docs/services/edge_cache/index.md similarity index 79% rename from website/docs/services/cache/index.md rename to website/docs/services/edge_cache/index.md index 0546cb5..5538ede 100644 --- a/website/docs/services/cache/index.md +++ b/website/docs/services/edge_cache/index.md @@ -1,9 +1,9 @@ --- -title: cache +title: edge_cache hide_title: false hide_table_of_contents: false keywords: - - cache + - edge_cache - vercel - stackql - infrastructure-as-code @@ -14,7 +14,7 @@ custom_edit_url: null image: /img/stackql-vercel-provider-featured-image.png --- -cache service documentation. +edge_cache service documentation. :::info[Service Summary] @@ -25,7 +25,7 @@ total resources: __1__ ## Resources
diff --git a/website/docs/services/edge_config/backups/index.md b/website/docs/services/edge_config/backups/index.md new file mode 100644 index 0000000..5ee2a0a --- /dev/null +++ b/website/docs/services/edge_config/backups/index.md @@ -0,0 +1,282 @@ +--- +title: backups +hide_title: false +hide_table_of_contents: false +keywords: + - backups + - edge_config + - vercel + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a backups resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + +The object the API responds with when requesting a Global Config backup + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string
object
number (wire: lastModified)
object
object
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string
number (wire: lastModified)
object
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
edge_config_id, edge_config_backup_version_idteam_id, slugRetrieves a specific version of a Global Config from backup storage.
edge_config_idnext, limit, metadata, team_id, slugReturns backups of a Global Config.
edge_config_id, edge_config_backup_version_idteamId, slugRestores a Global Config backup.
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string
string
number
string
string
stringThe Team slug to perform the request on behalf of.
stringThe Team identifier to perform the request on behalf of.
stringThe Team identifier to perform the request on behalf of. (wire: teamId)
+ +## `SELECT` examples + + + + +Retrieves a specific version of a Global Config from backup storage. + +```sql +SELECT +id, +backup, +last_modified, +metadata, +user +FROM vercel.edge_config.backups +WHERE edge_config_id = '{{ edge_config_id }}' -- required +AND edge_config_backup_version_id = '{{ edge_config_backup_version_id }}' -- required +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + + +Returns backups of a Global Config. + +```sql +SELECT +id, +last_modified, +metadata +FROM vercel.edge_config.backups +WHERE edge_config_id = '{{ edge_config_id }}' -- required +AND next = '{{ next }}' +AND limit = '{{ limit }}' +AND metadata = '{{ metadata }}' +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + + + +## Lifecycle Methods + +EXEC variables use wire (API) names. + + + + +Restores a Global Config backup. + +```sql +EXEC vercel.edge_config.backups.restore +@edge_config_id='{{ edge_config_id }}' --required, +@edge_config_backup_version_id='{{ edge_config_backup_version_id }}' --required, +@teamId='{{ teamId }}', +@slug='{{ slug }}' +; +``` + + diff --git a/website/docs/services/edge_config/edge_config/index.md b/website/docs/services/edge_config/edge_config/index.md deleted file mode 100644 index 48d53f8..0000000 --- a/website/docs/services/edge_config/edge_config/index.md +++ /dev/null @@ -1,386 +0,0 @@ ---- -title: edge_config -hide_title: false -hide_table_of_contents: false -keywords: - - edge_config - - edge_config - - vercel - - infrastructure-as-code - - configuration-as-data - - cloud inventory -description: Query, deploy and manage vercel resources using SQL -custom_edit_url: null -image: /img/stackql-vercel-provider-featured-image.png ---- - -import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; - -Creates, updates, deletes, gets or lists an edge_config resource. - -## Overview - - - - -
Nameedge_config
TypeResource
Id
- -## Fields - -The following fields are returned by `SELECT` queries: - - - - -The EdgeConfig. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDatatypeDescription
string
number
string
number
string
number
stringName for the Edge Config Names are not unique. Must start with an alphabetic character and can contain only alphanumeric characters and underscores).
objectKeeps track of the current state of the Edge Config while it gets transferred.
number
-
- - -List of all edge configs. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDatatypeDescription
string
number
string
number
string
number
stringName for the Edge Config Names are not unique. Must start with an alphabetic character and can contain only alphanumeric characters and underscores).
objectKeeps track of the current state of the Edge Config while it gets transferred.
number
-
-
- -## Methods - -The following methods are available for this resource: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameAccessible byRequired ParamsOptional ParamsDescription
edgeConfigId, teamIdReturns an Edge Config.
teamIdReturns all Edge Configs.
teamId, data__slugCreates an Edge Config.
edgeConfigId, teamIdDelete an Edge Config by id.
edgeConfigId, teamId, slugUpdates an Edge Config.
- -## Parameters - -Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. - - - - - - - - - - - - - - - - - - - - - -
NameDatatypeDescription
stringEdge config id.
stringThe Team identifier or slug to perform the request on behalf of.
- -## `SELECT` examples - - - - -Returns an Edge Config. - -```sql -SELECT -id, -createdAt, -digest, -itemCount, -ownerId, -sizeInBytes, -slug, -transfer, -updatedAt -FROM vercel.edge_config.edge_config -WHERE edgeConfigId = '{{ edgeConfigId }}' -- required -AND teamId = '{{ teamId }}' -- required -; -``` - - - -Returns all Edge Configs. - -```sql -SELECT -id, -createdAt, -digest, -itemCount, -ownerId, -sizeInBytes, -slug, -transfer, -updatedAt -FROM vercel.edge_config.edge_config -WHERE teamId = '{{ teamId }}' -- required -; -``` - - - - -## `INSERT` examples - - - - -Creates an Edge Config. - -```sql -INSERT INTO vercel.edge_config.edge_config ( -data__slug, -data__items, -teamId -) -SELECT -'{{ slug }}' /* required */, -'{{ items }}', -'{{ teamId }}' -; -``` - - - -```yaml -# Description fields are for documentation purposes -- name: edge_config - props: - - name: teamId - value: string - description: Required parameter for the edge_config resource. - - name: slug - value: string - - name: items - value: object -``` - - - - -## `DELETE` examples - - - - -Delete an Edge Config by id. - -```sql -DELETE FROM vercel.edge_config.edge_config -WHERE edgeConfigId = '{{ edgeConfigId }}' --required -AND teamId = '{{ teamId }}' --required -; -``` - - - - -## Lifecycle Methods - - - - -Updates an Edge Config. - -```sql -EXEC vercel.edge_config.edge_config.update_edge_config -@edgeConfigId='{{ edgeConfigId }}' --required, -@teamId='{{ teamId }}' --required -@@json= -'{ -"slug": "{{ slug }}" -}' -; -``` - - diff --git a/website/docs/services/edge_config/edge_configs/index.md b/website/docs/services/edge_config/edge_configs/index.md new file mode 100644 index 0000000..b04b1df --- /dev/null +++ b/website/docs/services/edge_config/edge_configs/index.md @@ -0,0 +1,485 @@ +--- +title: edge_configs +hide_title: false +hide_table_of_contents: false +keywords: + - edge_configs + - edge_config + - vercel + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists an edge_configs resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + +The Global Config. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string
string (wire: ownerId)
number (wire: createdAt)
stringThe ID of the user who created the Global Config, optional because it is not always set. (wire: createdBy)
number (wire: deletedAt)
string
number (wire: itemCount)
object
string(opaque JSON object)
number (wire: sizeInBytes)
stringName for the Global Config Names are not unique. Must start with an alphabetic character and can contain only alphanumeric characters and underscores).
numberTimestamp of when the Global Config was synced to DynamoDB initially. It is only set when syncing the entire Global Config, not when updating. (wire: syncedToDynamoAt)
objectKeeps track of the current state of the Global Config while it gets transferred.
number (wire: updatedAt)
+
+ + +List of all global configs. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string
string (wire: ownerId)
number (wire: createdAt)
stringThe ID of the user who created the Global Config, optional because it is not always set. (wire: createdBy)
number (wire: deletedAt)
string
number (wire: itemCount)
string(opaque JSON object)
number (wire: sizeInBytes)
stringName for the Global Config Names are not unique. Must start with an alphabetic character and can contain only alphanumeric characters and underscores).
numberTimestamp of when the Global Config was synced to DynamoDB initially. It is only set when syncing the entire Global Config, not when updating. (wire: syncedToDynamoAt)
objectKeeps track of the current state of the Global Config while it gets transferred.
number (wire: updatedAt)
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
edge_config_idteam_id, slugReturns a Global Config.
team_id, slugReturns all Global Configs.
slugteam_idCreates a Global Config.
edge_config_id, slugteam_idUpdates a Global Config.
edge_config_idteam_id, slugDelete a Global Config by id.
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string
stringThe Team slug to perform the request on behalf of.
stringThe Team identifier to perform the request on behalf of. (wire: teamId)
+ +## `SELECT` examples + + + + +Returns a Global Config. + +```sql +SELECT +id, +owner_id, +created_at, +created_by, +deleted_at, +digest, +item_count, +purpose, +schema, +size_in_bytes, +slug, +synced_to_dynamo_at, +transfer, +updated_at +FROM vercel.edge_config.edge_configs +WHERE edge_config_id = '{{ edge_config_id }}' -- required +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + + +Returns all Global Configs. + +```sql +SELECT +id, +owner_id, +created_at, +created_by, +deleted_at, +digest, +item_count, +purpose, +schema, +size_in_bytes, +slug, +synced_to_dynamo_at, +transfer, +updated_at +FROM vercel.edge_config.edge_configs +WHERE team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + + + +## `INSERT` examples + + + + +Creates a Global Config. + +```sql +INSERT INTO vercel.edge_config.edge_configs ( +slug, +items, +team_id +) +SELECT +'{{ slug }}' /* required */, +'{{ items }}', +'{{ team_id }}' +RETURNING +id, +owner_id, +created_at, +created_by, +deleted_at, +digest, +item_count, +purpose, +schema, +size_in_bytes, +slug, +synced_to_dynamo_at, +transfer, +updated_at +; +``` + + + +{`# Description fields are for documentation purposes +- name: edge_configs + props: + - name: slug + value: "{{ slug }}" + - name: items + value: "{{ items }}" + - name: team_id + value: "{{ team_id }}" + description: The Team identifier to perform the request on behalf of. + description: The Team identifier to perform the request on behalf of. +`} + + + + + +## `UPDATE` examples + + + + +Updates a Global Config. + +```sql +UPDATE vercel.edge_config.edge_configs +SET +slug = '{{ slug }}' +WHERE +edge_config_id = '{{ edge_config_id }}' --required +AND slug = '{{ slug }}' --required +AND team_id = '{{ team_id}}' +RETURNING +id, +owner_id, +created_at, +created_by, +deleted_at, +digest, +item_count, +purpose, +schema, +size_in_bytes, +slug, +synced_to_dynamo_at, +transfer, +updated_at; +``` + + + + +## `DELETE` examples + + + + +Delete a Global Config by id. + +```sql +DELETE FROM vercel.edge_config.edge_configs +WHERE edge_config_id = '{{ edge_config_id }}' --required +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + diff --git a/website/docs/services/edge_config/index.md b/website/docs/services/edge_config/index.md index 8eadc15..009a738 100644 --- a/website/docs/services/edge_config/index.md +++ b/website/docs/services/edge_config/index.md @@ -25,12 +25,12 @@ total resources: __5__ ## Resources \ No newline at end of file diff --git a/website/docs/services/edge_config/item/index.md b/website/docs/services/edge_config/item/index.md deleted file mode 100644 index ef671b0..0000000 --- a/website/docs/services/edge_config/item/index.md +++ /dev/null @@ -1,165 +0,0 @@ ---- -title: item -hide_title: false -hide_table_of_contents: false -keywords: - - item - - edge_config - - vercel - - infrastructure-as-code - - configuration-as-data - - cloud inventory -description: Query, deploy and manage vercel resources using SQL -custom_edit_url: null -image: /img/stackql-vercel-provider-featured-image.png ---- - -import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; - -Creates, updates, deletes, gets or lists an item resource. - -## Overview - - - - -
Nameitem
TypeResource
Id
- -## Fields - -The following fields are returned by `SELECT` queries: - - - - -The EdgeConfig. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDatatypeDescription
number
string
string
number
-
-
- -## Methods - -The following methods are available for this resource: - - - - - - - - - - - - - - - - - - - - -
NameAccessible byRequired ParamsOptional ParamsDescription
edgeConfigId, edgeConfigItemKey, teamIdReturns a specific Edge Config Item.
- -## Parameters - -Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDatatypeDescription
stringEdge config id.
stringEdge config id item key.
stringThe Team identifier or slug to perform the request on behalf of.
- -## `SELECT` examples - - - - -Returns a specific Edge Config Item. - -```sql -SELECT -createdAt, -edgeConfigId, -key, -updatedAt, -value -FROM vercel.edge_config.item -WHERE edgeConfigId = '{{ edgeConfigId }}' -- required -AND edgeConfigItemKey = '{{ edgeConfigItemKey }}' -- required -AND teamId = '{{ teamId }}' -- required -; -``` - - diff --git a/website/docs/services/edge_config/items/index.md b/website/docs/services/edge_config/items/index.md index f01f257..c05c8ce 100644 --- a/website/docs/services/edge_config/items/index.md +++ b/website/docs/services/edge_config/items/index.md @@ -15,6 +15,7 @@ image: /img/stackql-vercel-provider-featured-image.png --- import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; @@ -22,7 +23,7 @@ Creates, updates, deletes, gets or lists an items resource. ## Overview - +
Nameitems
Name
TypeResource
Id
@@ -32,14 +33,15 @@ Creates, updates, deletes, gets or lists an items resource. The following fields are returned by `SELECT` queries: - + -The EdgeConfig. +The Global Config. @@ -51,12 +53,17 @@ The EdgeConfig. - + + + + + + - + - + @@ -66,15 +73,61 @@ The EdgeConfig. - + - + - + + + + +
string (wire: edgeConfigId)
number (wire: createdAt)
string
number (wire: updatedAt)
string (false, true)
+
+ + +The Global Config. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string (wire: edgeConfigId)
number (wire: createdAt)
string
string
number (wire: updatedAt)
string (false, true)
@@ -96,18 +149,25 @@ The following methods are available for this resource: - + - edgeConfigId, teamId - - Returns all items of an Edge Config. + edge_config_id, edge_config_item_key + team_id, slug + Returns a specific Global Config Item. - - - edgeConfigId, teamId, items - - Update multiple Edge Config Items in batch. + + + edge_config_id + team_id, slug + Returns all items of a Global Config. + + + + + edge_config_id, items + team_id, slug + Update multiple Global Config Items in batch. @@ -125,15 +185,25 @@ Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](# - - + + string - Edge config id. + - - + + string - The Team identifier or slug to perform the request on behalf of. + + + + + string + The Team slug to perform the request on behalf of. + + + + string + The Team identifier to perform the request on behalf of. (wire: teamId) @@ -141,52 +211,77 @@ Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](# ## `SELECT` examples - + -Returns all items of an Edge Config. +Returns a specific Global Config Item. ```sql SELECT -createdAt, -edgeConfigId, +edge_config_id, +created_at, +description, key, -updatedAt, +updated_at, value FROM vercel.edge_config.items -WHERE edgeConfigId = '{{ edgeConfigId }}' -- required -AND teamId = '{{ teamId }}' -- required +WHERE edge_config_id = '{{ edge_config_id }}' -- required +AND edge_config_item_key = '{{ edge_config_item_key }}' -- required +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + + +Returns all items of a Global Config. + +```sql +SELECT +edge_config_id, +created_at, +description, +key, +updated_at, +value +FROM vercel.edge_config.items +WHERE edge_config_id = '{{ edge_config_id }}' -- required +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' ; ``` -## Lifecycle Methods +## `UPDATE` examples - + -Update multiple Edge Config Items in batch. +Update multiple Global Config Items in batch. ```sql -EXEC vercel.edge_config.items.patcht_edge_config_items -@edgeConfigId='{{ edgeConfigId }}' --required, -@teamId='{{ teamId }}' --required -@@json= -'{ -"items": "{{ items }}" -}' -; +UPDATE vercel.edge_config.items +SET +items = '{{ items }}' +WHERE +edge_config_id = '{{ edge_config_id }}' --required +AND items = '{{ items }}' --required +AND team_id = '{{ team_id}}' +AND slug = '{{ slug}}' +RETURNING +status; ``` diff --git a/website/docs/services/edge_config/schema/index.md b/website/docs/services/edge_config/schema/index.md new file mode 100644 index 0000000..a07e7f0 --- /dev/null +++ b/website/docs/services/edge_config/schema/index.md @@ -0,0 +1,211 @@ +--- +title: schema +hide_title: false +hide_table_of_contents: false +keywords: + - schema + - edge_config + - vercel + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a schema resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + +Wrapper for non-JSON response bodies (jsonl, ndjson, streamed json, octet-stream): one row carrying the raw body text. + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringRaw response body.
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
edge_config_idteam_id, slugReturns the schema of a Global Config.
edge_config_id, definitiondry_run, team_id, slugUpdate a Global Config's schema.
edge_config_idteam_id, slugDeletes the schema of existing Global Config.
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string
string (wire: dryRun)
stringThe Team slug to perform the request on behalf of.
stringThe Team identifier to perform the request on behalf of. (wire: teamId)
+ +## `SELECT` examples + + + + +Returns the schema of a Global Config. + +```sql +SELECT +contents +FROM vercel.edge_config.schema +WHERE edge_config_id = '{{ edge_config_id }}' -- required +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + + + +## `UPDATE` examples + + + + +Update a Global Config's schema. + +```sql +UPDATE vercel.edge_config.schema +SET +definition = '{{ definition }}' +WHERE +edge_config_id = '{{ edge_config_id }}' --required +AND definition = '{{ definition }}' --required +AND dry_run = '{{ dry_run}}' +AND team_id = '{{ team_id}}' +AND slug = '{{ slug}}'; +``` + + + + +## `DELETE` examples + + + + +Deletes the schema of existing Global Config. + +```sql +DELETE FROM vercel.edge_config.schema +WHERE edge_config_id = '{{ edge_config_id }}' --required +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + diff --git a/website/docs/services/edge_config/token/index.md b/website/docs/services/edge_config/token/index.md deleted file mode 100644 index 7d90f5c..0000000 --- a/website/docs/services/edge_config/token/index.md +++ /dev/null @@ -1,217 +0,0 @@ ---- -title: token -hide_title: false -hide_table_of_contents: false -keywords: - - token - - edge_config - - vercel - - infrastructure-as-code - - configuration-as-data - - cloud inventory -description: Query, deploy and manage vercel resources using SQL -custom_edit_url: null -image: /img/stackql-vercel-provider-featured-image.png ---- - -import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; - -Creates, updates, deletes, gets or lists a token resource. - -## Overview - - - - -
Nametoken
TypeResource
Id
- -## Fields - -The following fields are returned by `SELECT` queries: - - - - -The EdgeConfig. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDatatypeDescription
stringThis is not the token itself, but rather an id to identify the token by
number
string
string
string
-
-
- -## Methods - -The following methods are available for this resource: - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameAccessible byRequired ParamsOptional ParamsDescription
edgeConfigId, token, teamIdReturn meta data about an Edge Config token.
edgeConfigId, teamId, data__labelAdds a token to an existing Edge Config.
- -## Parameters - -Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDatatypeDescription
stringEdge config id.
stringThe Team identifier or slug to perform the request on behalf of.
string
- -## `SELECT` examples - - - - -Return meta data about an Edge Config token. - -```sql -SELECT -id, -createdAt, -edgeConfigId, -label, -token -FROM vercel.edge_config.token -WHERE edgeConfigId = '{{ edgeConfigId }}' -- required -AND token = '{{ token }}' -- required -AND teamId = '{{ teamId }}' -- required -; -``` - - - - -## `INSERT` examples - - - - -Adds a token to an existing Edge Config. - -```sql -INSERT INTO vercel.edge_config.token ( -data__label, -edgeConfigId, -teamId -) -SELECT -'{{ label }}' /* required */, -'{{ edgeConfigId }}', -'{{ teamId }}' -; -``` - - - -```yaml -# Description fields are for documentation purposes -- name: token - props: - - name: edgeConfigId - value: string - description: Required parameter for the token resource. - - name: teamId - value: string - description: Required parameter for the token resource. - - name: label - value: string -``` - - diff --git a/website/docs/services/edge_config/tokens/index.md b/website/docs/services/edge_config/tokens/index.md index cc0c08f..c9d642f 100644 --- a/website/docs/services/edge_config/tokens/index.md +++ b/website/docs/services/edge_config/tokens/index.md @@ -15,6 +15,7 @@ image: /img/stackql-vercel-provider-featured-image.png --- import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; @@ -22,7 +23,7 @@ Creates, updates, deletes, gets or lists a tokens resource. ## Overview - +
Nametokens
Name
TypeResource
Id
@@ -32,14 +33,15 @@ Creates, updates, deletes, gets or lists a tokens resource. The following fields are returned by `SELECT` queries: - + -The EdgeConfig. +The Global Config. @@ -56,24 +58,75 @@ The EdgeConfig. - + + + + + + - + - + + + + + + + + + + + + +
This is not the token itself, but rather an id to identify the token by
string (wire: edgeConfigId)
number (wire: createdAt)
string
stringA partially-masked representation of the token, safe to display in UIs. The format is the first 3 characters of the token followed by a fixed 8-character `*` mask (e.g. `550e8400-e29b-41d4-a716-446655440000` → `550********`). The mask length is intentionally fixed (not proportional to the original token length) to avoid leaking the token length. Prefer this field for display/reference in UIs and logs. The full, plaintext token is only disclosed once at creation time via `POST /v1/edge-config/:edgeConfigId/token`; use `id` to reference a token in subsequent calls (e.g. when deleting). (wire: partialToken)
stringDeprecated: the full, plaintext token. - Returned once by `POST /v1/edge-config/:edgeConfigId/token` (create). - Still returned by `GET /v1/edge-config/:edgeConfigId/token/:token` (detail) for backwards compatibility, but scheduled for removal. - **Not** returned by `GET /v1/edge-config/:edgeConfigId/tokens` (list); use `partialToken` for display and `id` to reference tokens. Do not rely on this field being present on read operations. Prefer `partialToken` for display and `id` for references.
+
+ + +The Global Config. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - +
NameDatatypeDescription
stringThis is not the token itself, but rather an id to identify the token by
string (wire: edgeConfigId)
number (wire: createdAt)
string
stringA partially-masked representation of the token, safe to display in UIs. The format is the first 3 characters of the token followed by a fixed 8-character `*` mask (e.g. `550e8400-e29b-41d4-a716-446655440000` → `550********`). The mask length is intentionally fixed (not proportional to the original token length) to avoid leaking the token length. Prefer this field for display/reference in UIs and logs. The full, plaintext token is only disclosed once at creation time via `POST /v1/edge-config/:edgeConfigId/token`; use `id` to reference a token in subsequent calls (e.g. when deleting). (wire: partialToken)
stringDeprecated: the full, plaintext token. - Returned once by `POST /v1/edge-config/:edgeConfigId/token` (create). - Still returned by `GET /v1/edge-config/:edgeConfigId/token/:token` (detail) for backwards compatibility, but scheduled for removal. - **Not** returned by `GET /v1/edge-config/:edgeConfigId/tokens` (list); use `partialToken` for display and `id` to reference tokens. Do not rely on this field being present on read operations. Prefer `partialToken` for display and `id` for references.
@@ -96,18 +149,32 @@ The following methods are available for this resource: - + - edgeConfigId, teamId - - Returns all tokens of an Edge Config. + edge_config_id, token + team_id, slug + Return meta data about a Global Config token. + + + + + edge_config_id + team_id, slug + Returns all tokens of a Global Config. + + + + + edge_config_id, label + team_id, slug + Adds a token to an existing Global Config. - + - edgeConfigId, teamId - - Deletes one or more tokens of an existing Edge Config. + edge_config_id + team_id, slug + Deletes one or more tokens of an existing Global Config. @@ -125,15 +192,25 @@ Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](# - - + + + string + + + + + string + + + + string - Edge config id. + The Team slug to perform the request on behalf of. - - + + string - The Team identifier or slug to perform the request on behalf of. + The Team identifier to perform the request on behalf of. (wire: teamId) @@ -141,27 +218,105 @@ Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](# ## `SELECT` examples - + -Returns all tokens of an Edge Config. +Return meta data about a Global Config token. ```sql SELECT id, -createdAt, -edgeConfigId, +edge_config_id, +created_at, label, +partial_token, token FROM vercel.edge_config.tokens -WHERE edgeConfigId = '{{ edgeConfigId }}' -- required -AND teamId = '{{ teamId }}' -- required +WHERE edge_config_id = '{{ edge_config_id }}' -- required +AND token = '{{ token }}' -- required +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' ; ``` + + + +Returns all tokens of a Global Config. + +```sql +SELECT +id, +edge_config_id, +created_at, +label, +partial_token, +token +FROM vercel.edge_config.tokens +WHERE edge_config_id = '{{ edge_config_id }}' -- required +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + + + +## `INSERT` examples + + + + +Adds a token to an existing Global Config. + +```sql +INSERT INTO vercel.edge_config.tokens ( +label, +edge_config_id, +team_id, +slug +) +SELECT +'{{ label }}' /* required */, +'{{ edge_config_id }}', +'{{ team_id }}', +'{{ slug }}' +RETURNING +id, +token +; +``` + + + +{`# Description fields are for documentation purposes +- name: tokens + props: + - name: edge_config_id + value: "{{ edge_config_id }}" + description: Required parameter for the tokens resource. + - name: label + value: "{{ label }}" + - name: team_id + value: "{{ team_id }}" + description: The Team identifier to perform the request on behalf of. + description: The Team identifier to perform the request on behalf of. + - name: slug + value: "{{ slug }}" + description: The Team slug to perform the request on behalf of. + description: The Team slug to perform the request on behalf of. +`} + @@ -169,19 +324,20 @@ AND teamId = '{{ teamId }}' -- required ## `DELETE` examples - + -Deletes one or more tokens of an existing Edge Config. +Deletes one or more tokens of an existing Global Config. ```sql DELETE FROM vercel.edge_config.tokens -WHERE edgeConfigId = '{{ edgeConfigId }}' --required -AND teamId = '{{ teamId }}' --required +WHERE edge_config_id = '{{ edge_config_id }}' --required +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' ; ``` diff --git a/website/docs/services/environments/custom_environments/index.md b/website/docs/services/environments/custom_environments/index.md new file mode 100644 index 0000000..ee511a0 --- /dev/null +++ b/website/docs/services/environments/custom_environments/index.md @@ -0,0 +1,452 @@ +--- +title: custom_environments +hide_title: false +hide_table_of_contents: false +keywords: + - custom_environments + - environments + - vercel + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a custom_environments resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + +Internal representation of a custom environment with all required properties + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringUnique identifier for the custom environment (format: env_*)
objectConfiguration for matching git branches to this environment (wire: branchMatcher)
numberTimestamp when the environment was created (wire: createdAt)
arrayList of aliases for the current deployment (wire: currentDeploymentAliases)
stringOptional description of the environment's purpose
arrayList of domains associated with this environment
stringURL-friendly name of the environment
stringThe type of environment (production, preview, or development) (development, preview, production)
numberTimestamp when the environment was last updated (wire: updatedAt)
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringUnique identifier for the custom environment (format: env_*)
objectConfiguration for matching git branches to this environment (wire: branchMatcher)
numberTimestamp when the environment was created (wire: createdAt)
arrayList of aliases for the current deployment (wire: currentDeploymentAliases)
stringOptional description of the environment's purpose
arrayList of domains associated with this environment
stringURL-friendly name of the environment
stringThe type of environment (production, preview, or development) (development, preview, production)
numberTimestamp when the environment was last updated (wire: updatedAt)
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
id_or_name, environment_slug_or_idteam_id, slugRetrieve a custom environment for the project. Must not be named 'Production' or 'Preview'.
id_or_namegit_branch, team_id, slugRetrieve custom environments for the project. Must not be named 'Production' or 'Preview'.
id_or_nameteam_idCreates a custom environment for the current project. Cannot be named 'Production' or 'Preview'.
id_or_name, environment_slug_or_idteam_idUpdate a custom environment for the project. Must not be named 'Production' or 'Preview'.
id_or_name, environment_slug_or_idteam_id, slugRemove a custom environment for the project. Must not be named 'Production' or 'Preview'.
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringThe unique custom environment identifier within the project
stringThe unique project identifier or the project name
stringFetch custom environments for a specific git branch (wire: gitBranch)
stringThe Team slug to perform the request on behalf of.
stringThe Team identifier to perform the request on behalf of. (wire: teamId)
+ +## `SELECT` examples + + + + +Retrieve a custom environment for the project. Must not be named 'Production' or 'Preview'. + +```sql +SELECT +id, +branch_matcher, +created_at, +current_deployment_aliases, +description, +domains, +slug, +type, +updated_at +FROM vercel.environments.custom_environments +WHERE id_or_name = '{{ id_or_name }}' -- required +AND environment_slug_or_id = '{{ environment_slug_or_id }}' -- required +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + + +Retrieve custom environments for the project. Must not be named 'Production' or 'Preview'. + +```sql +SELECT +id, +branch_matcher, +created_at, +current_deployment_aliases, +description, +domains, +slug, +type, +updated_at +FROM vercel.environments.custom_environments +WHERE id_or_name = '{{ id_or_name }}' -- required +AND git_branch = '{{ git_branch }}' +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + + + +## `INSERT` examples + + + + +Creates a custom environment for the current project. Cannot be named 'Production' or 'Preview'. + +```sql +INSERT INTO vercel.environments.custom_environments ( +slug, +description, +branch_matcher, +copy_env_vars_from, +id_or_name, +team_id +) +SELECT +'{{ slug }}', +'{{ description }}', +'{{ branch_matcher }}', +'{{ copy_env_vars_from }}', +'{{ id_or_name }}', +'{{ team_id }}' +RETURNING +id, +branch_matcher, +created_at, +current_deployment_aliases, +description, +domains, +slug, +type, +updated_at +; +``` + + + +{`# Description fields are for documentation purposes +- name: custom_environments + props: + - name: id_or_name + value: "{{ id_or_name }}" + description: Required parameter for the custom_environments resource. + - name: slug + value: "{{ slug }}" + description: | + The slug of the custom environment to create. + - name: description + value: "{{ description }}" + description: | + Description of the custom environment. This is optional. + - name: branch_matcher + description: | + How we want to determine a matching branch. This is optional. + value: + type: "{{ type }}" + pattern: "{{ pattern }}" + - name: copy_env_vars_from + value: "{{ copy_env_vars_from }}" + description: | + Where to copy environment variables from. This is optional. + - name: team_id + value: "{{ team_id }}" + description: The Team identifier to perform the request on behalf of. + description: The Team identifier to perform the request on behalf of. +`} + + + + + +## `UPDATE` examples + + + + +Update a custom environment for the project. Must not be named 'Production' or 'Preview'. + +```sql +UPDATE vercel.environments.custom_environments +SET +slug = '{{ slug }}', +description = '{{ description }}', +branch_matcher = '{{ branch_matcher }}' +WHERE +id_or_name = '{{ id_or_name }}' --required +AND environment_slug_or_id = '{{ environment_slug_or_id }}' --required +AND team_id = '{{ team_id}}' +RETURNING +id, +branch_matcher, +created_at, +current_deployment_aliases, +description, +domains, +slug, +type, +updated_at; +``` + + + + +## `DELETE` examples + + + + +Remove a custom environment for the project. Must not be named 'Production' or 'Preview'. + +```sql +DELETE FROM vercel.environments.custom_environments +WHERE id_or_name = '{{ id_or_name }}' --required +AND environment_slug_or_id = '{{ environment_slug_or_id }}' --required +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + diff --git a/website/docs/services/environments/index.md b/website/docs/services/environments/index.md new file mode 100644 index 0000000..0c3c0c1 --- /dev/null +++ b/website/docs/services/environments/index.md @@ -0,0 +1,33 @@ +--- +title: environments +hide_title: false +hide_table_of_contents: false +keywords: + - environments + - vercel + - stackql + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +environments service documentation. + +:::info[Service Summary] + +total resources: __2__ + +::: + +## Resources + \ No newline at end of file diff --git a/website/docs/services/environments/shared_env_variables/index.md b/website/docs/services/environments/shared_env_variables/index.md new file mode 100644 index 0000000..fefe36f --- /dev/null +++ b/website/docs/services/environments/shared_env_variables/index.md @@ -0,0 +1,632 @@ +--- +title: shared_env_variables +hide_title: false +hide_table_of_contents: false +keywords: + - shared_env_variables + - environments + - vercel + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a shared_env_variables resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringThe unique identifier of the Shared Env Var. (example: env_XCG7t7AIHuO2SBA8667zNUiM)
stringThe unique identifier of the owner (team) the Shared Env Var was created for. (example: team_LLHUOMOoDlqOp8wPE4kFo9pE) (wire: ownerId)
arrayThe unique identifiers of the projects which the Shared Env Var is linked to. (wire: projectId)
stringThe last editor full name or username. (wire: lastEditedByDisplayName)
booleanwhether or not this env varible applies to custom environments (false, true) (wire: applyToAllCustomEnvironments)
stringA user provided comment that describes what this Shared Env Var is for.
string (date-time)The date when the Shared Env Var was created. (example: 2021-02-10T13:11:49.180Z)
numberTimestamp for when the Shared Env Var was created. (wire: createdAt)
stringThe unique identifier of the user who created the Shared Env Var. (example: 2qDDuGFTWXBLDNnqZfWPDp1A) (wire: createdBy)
arrayThe custom environment IDs that this Shared Env Var is scoped to. (wire: customEnvironmentIds)
booleanwhether or not this env variable is decrypted (false, true)
numberTimestamp for when the Shared Env Var was (soft) deleted. (wire: deletedAt)
stringThe unique identifier of the user who deleted the Shared Env Var. (example: 2qDDuGFTWXBLDNnqZfWPDp1A) (wire: deletedBy)
stringThe name of the Shared Env Var. (example: my-api-key)
arrayenvironments this env variable targets (example: production)
stringThe type of this cosmos doc instance, if blank, assume secret. (encrypted, plain, sensitive, system) (example: encrypted)
numberTimestamp for when the Shared Env Var was last updated. (wire: updatedAt)
stringThe unique identifier of the user who last updated the Shared Env Var. (example: 2qDDuGFTWXBLDNnqZfWPDp1A) (wire: updatedBy)
stringThe value of the Shared Env Var.
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringThe unique identifier of the Shared Env Var. (example: env_XCG7t7AIHuO2SBA8667zNUiM)
stringThe unique identifier of the owner (team) the Shared Env Var was created for. (example: team_LLHUOMOoDlqOp8wPE4kFo9pE) (wire: ownerId)
arrayThe unique identifiers of the projects which the Shared Env Var is linked to. (wire: projectId)
stringThe last editor full name or username. (wire: lastEditedByDisplayName)
booleanwhether or not this env varible applies to custom environments (false, true) (wire: applyToAllCustomEnvironments)
stringA user provided comment that describes what this Shared Env Var is for.
string (date-time)The date when the Shared Env Var was created. (example: 2021-02-10T13:11:49.180Z)
numberTimestamp for when the Shared Env Var was created. (wire: createdAt)
stringThe unique identifier of the user who created the Shared Env Var. (example: 2qDDuGFTWXBLDNnqZfWPDp1A) (wire: createdBy)
arrayThe custom environment IDs that this Shared Env Var is scoped to. (wire: customEnvironmentIds)
booleanwhether or not this env variable is decrypted (false, true)
numberTimestamp for when the Shared Env Var was (soft) deleted. (wire: deletedAt)
stringThe unique identifier of the user who deleted the Shared Env Var. (example: 2qDDuGFTWXBLDNnqZfWPDp1A) (wire: deletedBy)
stringThe name of the Shared Env Var. (example: my-api-key)
array (wire: securityIssues)
arrayenvironments this env variable targets (example: production)
stringThe type of this cosmos doc instance, if blank, assume secret. (encrypted, plain, sensitive, system) (example: encrypted)
numberTimestamp for when the Shared Env Var was last updated. (wire: updatedAt)
stringThe unique identifier of the user who last updated the Shared Env Var. (example: 2qDDuGFTWXBLDNnqZfWPDp1A) (wire: updatedBy)
stringThe value of the Shared Env Var.
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
idteam_id, slugRetrieve the decrypted value of a Shared Environment Variable by id.
search, project_id, ids, exclude_ids, exclude-ids, exclude_projectId, exclude-project_id, team_id, slugLists all Shared Environment Variables for a team, taking into account optional filters.
evs, target, applyToAllCustomEnvironments, customEnvironmentIdsteam_id, slugCreates shared environment variable(s) for a team.
updatesteam_id, slugUpdates a given Shared Environment Variable for a Team.
team_id, slugDeletes one or many Shared Environment Variables for a given team.
id, project_idteamId, slugDisconnects a shared environment variable for a given project
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringThe unique ID for the Shared Environment Variable to unlink from the project.
string
stringFilter SharedEnvVariables based on comma separated ids
stringFilter SharedEnvVariables that belong to a project (wire: exclude-projectId)
stringFilter SharedEnvVariables based on comma separated ids
stringFilter SharedEnvVariables that belong to a project
stringFilter SharedEnvVariables based on comma separated ids
stringFilter SharedEnvVariables that belong to a project (wire: projectId)
stringThe Team slug to perform the request on behalf of.
stringThe Team identifier to perform the request on behalf of.
stringThe Team identifier to perform the request on behalf of. (wire: teamId)
+ +## `SELECT` examples + + + + +Retrieve the decrypted value of a Shared Environment Variable by id. + +```sql +SELECT +id, +owner_id, +project_id, +last_edited_by_display_name, +apply_to_all_custom_environments, +comment, +created, +created_at, +created_by, +custom_environment_ids, +decrypted, +deleted_at, +deleted_by, +key, +target, +type, +updated_at, +updated_by, +value +FROM vercel.environments.shared_env_variables +WHERE id = '{{ id }}' -- required +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + + +Lists all Shared Environment Variables for a team, taking into account optional filters. + +```sql +SELECT +id, +owner_id, +project_id, +last_edited_by_display_name, +apply_to_all_custom_environments, +comment, +created, +created_at, +created_by, +custom_environment_ids, +decrypted, +deleted_at, +deleted_by, +key, +security_issues, +target, +type, +updated_at, +updated_by, +value +FROM vercel.environments.shared_env_variables +WHERE search = '{{ search }}' +AND project_id = '{{ project_id }}' +AND ids = '{{ ids }}' +AND exclude_ids = '{{ exclude_ids }}' +AND exclude-ids = '{{ exclude-ids }}' +AND exclude_projectId = '{{ exclude_projectId }}' +AND exclude-project_id = '{{ exclude-project_id }}' +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + + + +## `INSERT` examples + + + + +Creates shared environment variable(s) for a team. + +```sql +INSERT INTO vercel.environments.shared_env_variables ( +evs, +type, +target, +project_id, +team_id, +slug +) +SELECT +'{{ evs }}' /* required */, +'{{ type }}', +'{{ target }}' /* required */, +'{{ project_id }}', +'{{ team_id }}', +'{{ slug }}' +RETURNING +created, +failed +; +``` + + + +{`# Description fields are for documentation purposes +- name: shared_env_variables + props: + - name: evs + value: + - key: "{{ key }}" + value: "{{ value }}" + comment: "{{ comment }}" + - name: type + value: "{{ type }}" + description: | + The type of environment variable + valid_values: ['encrypted', 'sensitive'] + - name: target + value: "{{ target }}" + description: | + The target environment of the Shared Environment Variable + - name: project_id + value: + - "{{ project_id }}" + description: | + Associate a Shared Environment Variable to projects. + - name: team_id + value: "{{ team_id }}" + description: The Team identifier to perform the request on behalf of. + description: The Team identifier to perform the request on behalf of. + - name: slug + value: "{{ slug }}" + description: The Team slug to perform the request on behalf of. + description: The Team slug to perform the request on behalf of. +`} + + + + + +## `UPDATE` examples + + + + +Updates a given Shared Environment Variable for a Team. + +```sql +UPDATE vercel.environments.shared_env_variables +SET +updates = '{{ updates }}' +WHERE +updates = '{{ updates }}' --required +AND team_id = '{{ team_id}}' +AND slug = '{{ slug}}' +RETURNING +failed, +updated; +``` + + + + +## `DELETE` examples + + + + +Deletes one or many Shared Environment Variables for a given team. + +```sql +DELETE FROM vercel.environments.shared_env_variables +WHERE team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + + + +## Lifecycle Methods + +EXEC variables use wire (API) names. + + + + +Disconnects a shared environment variable for a given project + +```sql +EXEC vercel.environments.shared_env_variables.unlink +@id='{{ id }}' --required, +@project_id='{{ project_id }}' --required, +@teamId='{{ teamId }}', +@slug='{{ slug }}' +; +``` + + diff --git a/website/docs/services/feature_flags/deployment_flags/index.md b/website/docs/services/feature_flags/deployment_flags/index.md new file mode 100644 index 0000000..73c38b7 --- /dev/null +++ b/website/docs/services/feature_flags/deployment_flags/index.md @@ -0,0 +1,146 @@ +--- +title: deployment_flags +hide_title: false +hide_table_of_contents: false +keywords: + - deployment_flags + - feature_flags + - vercel + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a deployment_flags resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
array
object
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
deployment_idteam_id, slugRetrieve the feature flags of a deployment.
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string
stringThe Team slug to perform the request on behalf of.
stringThe Team identifier to perform the request on behalf of. (wire: teamId)
+ +## `SELECT` examples + + + + +Retrieve the feature flags of a deployment. + +```sql +SELECT +flags, +status +FROM vercel.feature_flags.deployment_flags +WHERE deployment_id = '{{ deployment_id }}' -- required +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + diff --git a/website/docs/services/feature_flags/flag_versions/index.md b/website/docs/services/feature_flags/flag_versions/index.md new file mode 100644 index 0000000..2a1dcae --- /dev/null +++ b/website/docs/services/feature_flags/flag_versions/index.md @@ -0,0 +1,218 @@ +--- +title: flag_versions +hide_title: false +hide_table_of_contents: false +keywords: + - flag_versions + - feature_flags + - vercel + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a flag_versions resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string
string (wire: flagId)
array (wire: changedEnvironments)
number (wire: createdAt)
string (wire: createdBy)
object
string
object
number
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
project_id_or_name, flag_id_or_sluglimit, cursor, environment, with_metadata, team_id, slugLists flag versions for a given flag.
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string
string
stringPagination cursor
stringEnvironment to filter by
number
stringThe Team slug to perform the request on behalf of.
stringThe Team identifier to perform the request on behalf of. (wire: teamId)
booleanWhether to include metadata (wire: withMetadata)
+ +## `SELECT` examples + + + + +Lists flag versions for a given flag. + +```sql +SELECT +id, +flag_id, +changed_environments, +created_at, +created_by, +data, +message, +metadata, +revision +FROM vercel.feature_flags.flag_versions +WHERE project_id_or_name = '{{ project_id_or_name }}' -- required +AND flag_id_or_slug = '{{ flag_id_or_slug }}' -- required +AND limit = '{{ limit }}' +AND cursor = '{{ cursor }}' +AND environment = '{{ environment }}' +AND with_metadata = '{{ with_metadata }}' +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + diff --git a/website/docs/services/feature_flags/flags/index.md b/website/docs/services/feature_flags/flags/index.md new file mode 100644 index 0000000..2a05e0a --- /dev/null +++ b/website/docs/services/feature_flags/flags/index.md @@ -0,0 +1,638 @@ +--- +title: flags +hide_title: false +hide_table_of_contents: false +keywords: + - flags + - feature_flags + - vercel + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a flags resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string
string (wire: ownerId)
string (wire: projectId)
string (flag) (wire: typeName)
number (wire: createdAt)
string (wire: createdBy)
string
object
string (boolean, json, number, string)
array (wire: maintainerIds)
object
boolean (false, true)
number
number
string
string (active, archived)
array
number (wire: updatedAt)
string (wire: updatedBy)
array
+
+ + + + + + + + + + + + +
NameDatatypeDescription
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
project_id_or_name, flag_id_or_slugif_match, with_metadata, team_id, slugRetrieve a specific feature flag by its ID or slug.
project_id_or_namestate, limit, cursor, search, tags, created_by, maintainer_ids, include_marketplace_flags, team_id, slugRetrieve feature flags for a project. Returns an opaque cursor for pagination.
project_id_or_name, slug, kind, environmentsteam_idCreate a new feature flag for a project. The flag must have a unique slug within the project and specify its kind (boolean, string, number, or json).
project_id_or_name, flag_id_or_slugif_match, with_metadata, team_id, slugUpdate an existing feature flag. This endpoint supports partial updates, allowing you to modify specific properties like variants, environments, or state without providing the full flag configuration.
project_id_or_name, flag_id_or_slugif_match, with_metadata, team_id, slugPermanently delete a feature flag from the project. This action cannot be undone. Consider archiving the flag instead if you may need it in the future.
project_id_or_namestate, withMetadata, limit, cursor, search, tags, teamId, slugRetrieve feature flags for a project. The list can be filtered by state and supports pagination.
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringThe flag id or name
stringThe project id or name
stringFilter flags by the id of the entity that created them (a user or team id). (wire: createdBy)
stringPagination cursor to continue from.
stringEtag to match, can be used interchangeably with the `if-match` header (wire: ifMatch)
booleanWhether to include Marketplace experimentation items in the paginated response. Defaults to false. (wire: includeMarketplaceFlags)
integerMaximum number of flags to return. When not set, all flags are returned.
arrayFilter flags by maintainer user id. Repeat the parameter for multiple maintainers (any may match). (wire: maintainerIds)
stringThe Team slug to perform the request on behalf of.
stringThe state of the flags to retrieve. Defaults to `active`.
arrayFilter flags by tag. Repeat the parameter for multiple tags (all must match).
stringThe Team identifier to perform the request on behalf of.
stringThe Team identifier to perform the request on behalf of. (wire: teamId)
booleanDeprecated. Whether to include creator metadata in each flag in the response. Resolve creator identity client-side (e.g. via the team members endpoint) instead; this parameter will be removed in a future release. Use `GET /v1/projects/:id/feature-flags/flags/:flagIdOrSlug?withMetadata=true` for single-flag lookups that need creator metadata.
booleanWhether to include metadata in the response (wire: withMetadata)
+ +## `SELECT` examples + + + + +Retrieve a specific feature flag by its ID or slug. + +```sql +SELECT +id, +owner_id, +project_id, +type_name, +created_at, +created_by, +description, +environments, +kind, +maintainer_ids, +metadata, +permanent, +revision, +seed, +slug, +state, +tags, +updated_at, +updated_by, +variants +FROM vercel.feature_flags.flags +WHERE project_id_or_name = '{{ project_id_or_name }}' -- required +AND flag_id_or_slug = '{{ flag_id_or_slug }}' -- required +AND if_match = '{{ if_match }}' +AND with_metadata = '{{ with_metadata }}' +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + + +Retrieve feature flags for a project. Returns an opaque cursor for pagination. + +```sql +SELECT +* +FROM vercel.feature_flags.flags +WHERE project_id_or_name = '{{ project_id_or_name }}' -- required +AND state = '{{ state }}' +AND limit = '{{ limit }}' +AND cursor = '{{ cursor }}' +AND search = '{{ search }}' +AND tags = '{{ tags }}' +AND created_by = '{{ created_by }}' +AND maintainer_ids = '{{ maintainer_ids }}' +AND include_marketplace_flags = '{{ include_marketplace_flags }}' +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + + + +## `INSERT` examples + + + + +Create a new feature flag for a project. The flag must have a unique slug within the project and specify its kind (boolean, string, number, or json). + +```sql +INSERT INTO vercel.feature_flags.flags ( +slug, +kind, +variants, +environments, +seed, +description, +state, +maintainer_ids, +permanent, +tags, +project_id_or_name, +team_id +) +SELECT +'{{ slug }}' /* required */, +'{{ kind }}' /* required */, +'{{ variants }}', +'{{ environments }}' /* required */, +{{ seed }}, +'{{ description }}', +'{{ state }}', +'{{ maintainer_ids }}', +{{ permanent }}, +'{{ tags }}', +'{{ project_id_or_name }}', +'{{ team_id }}' +RETURNING +id, +owner_id, +project_id, +type_name, +created_at, +created_by, +description, +environments, +kind, +maintainer_ids, +permanent, +revision, +seed, +slug, +state, +tags, +updated_at, +updated_by, +variants +; +``` + + + +{`# Description fields are for documentation purposes +- name: flags + props: + - name: project_id_or_name + value: "{{ project_id_or_name }}" + description: Required parameter for the flags resource. + - name: slug + value: "{{ slug }}" + description: | + A unique (per project) key for the flag, composed of letters, numbers, dashes, and underscores + - name: kind + value: "{{ kind }}" + description: | + The kind of flag + valid_values: ['boolean', 'string', 'number', 'json'] + - name: variants + description: | + The variants of the flag + value: + - id: "{{ id }}" + label: "{{ label }}" + description: "{{ description }}" + value: "{{ value }}" + - name: environments + value: "{{ environments }}" + description: | + The configuration for the flag in different environments + - name: seed + value: {{ seed }} + description: | + A random seed to prevent split points in different flags from having the same targets + - name: description + value: "{{ description }}" + description: | + A description of the flag + - name: state + value: "{{ state }}" + valid_values: ['active', 'archived'] + - name: maintainer_ids + value: + - "{{ maintainer_ids }}" + description: | + The user ids of the maintainers of the flag + - name: permanent + value: {{ permanent }} + description: | + Whether this flag is marked as permanent, indicating it should not be removed + - name: tags + value: + - "{{ tags }}" + description: | + Tags for categorizing the flag + - name: team_id + value: "{{ team_id }}" + description: The Team identifier to perform the request on behalf of. + description: The Team identifier to perform the request on behalf of. +`} + + + + + +## `UPDATE` examples + + + + +Update an existing feature flag. This endpoint supports partial updates, allowing you to modify specific properties like variants, environments, or state without providing the full flag configuration. + +```sql +UPDATE vercel.feature_flags.flags +SET +created_by = '{{ created_by }}', +message = '{{ message }}', +variants = '{{ variants }}', +environments = '{{ environments }}', +seed = {{ seed }}, +description = '{{ description }}', +state = '{{ state }}', +maintainer_ids = '{{ maintainer_ids }}', +permanent = {{ permanent }}, +tags = '{{ tags }}' +WHERE +project_id_or_name = '{{ project_id_or_name }}' --required +AND flag_id_or_slug = '{{ flag_id_or_slug }}' --required +AND if_match = '{{ if_match}}' +AND with_metadata = {{ with_metadata}} +AND team_id = '{{ team_id}}' +AND slug = '{{ slug}}' +RETURNING +id, +owner_id, +project_id, +type_name, +created_at, +created_by, +description, +environments, +kind, +maintainer_ids, +metadata, +permanent, +revision, +seed, +slug, +state, +tags, +updated_at, +updated_by, +variants; +``` + + + + +## `DELETE` examples + + + + +Permanently delete a feature flag from the project. This action cannot be undone. Consider archiving the flag instead if you may need it in the future. + +```sql +DELETE FROM vercel.feature_flags.flags +WHERE project_id_or_name = '{{ project_id_or_name }}' --required +AND flag_id_or_slug = '{{ flag_id_or_slug }}' --required +AND if_match = '{{ if_match }}' +AND with_metadata = '{{ with_metadata }}' +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + + + +## Lifecycle Methods + +EXEC variables use wire (API) names. + + + + +Retrieve feature flags for a project. The list can be filtered by state and supports pagination. + +```sql +EXEC vercel.feature_flags.flags.list_v1 +@project_id_or_name='{{ project_id_or_name }}' --required, +@state='{{ state }}', +@withMetadata={{ withMetadata }}, +@limit='{{ limit }}', +@cursor='{{ cursor }}', +@search='{{ search }}', +@tags='{{ tags }}', +@teamId='{{ teamId }}', +@slug='{{ slug }}' +; +``` + + diff --git a/website/docs/services/feature_flags/index.md b/website/docs/services/feature_flags/index.md new file mode 100644 index 0000000..04b2010 --- /dev/null +++ b/website/docs/services/feature_flags/index.md @@ -0,0 +1,39 @@ +--- +title: feature_flags +hide_title: false +hide_table_of_contents: false +keywords: + - feature_flags + - vercel + - stackql + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +feature_flags service documentation. + +:::info[Service Summary] + +total resources: __8__ + +::: + +## Resources + \ No newline at end of file diff --git a/website/docs/services/feature_flags/sdk_keys/index.md b/website/docs/services/feature_flags/sdk_keys/index.md new file mode 100644 index 0000000..39272be --- /dev/null +++ b/website/docs/services/feature_flags/sdk_keys/index.md @@ -0,0 +1,313 @@ +--- +title: sdk_keys +hide_title: false +hide_table_of_contents: false +keywords: + - sdk_keys + - feature_flags + - vercel + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a sdk_keys resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + +Shared metadata for a Flags SDK key, safe to return on both LIST and CREATE. Never contains cleartext secrets. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string (wire: projectId)
number (wire: createdAt)
string (wire: createdBy)
number (wire: deletedAt)
string
string (wire: hashKey)
string
stringPartially-masked representation of the SDK key value, safe to display in UIs. The value is the `vf_<type>_` prefix followed by the first 3 characters of the secret portion and a fixed 8-character `*` mask (e.g. `vf_server_abc********`). (wire: partialKeyValue)
string (client, mobile, server)
number (wire: updatedAt)
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
project_id_or_nameteam_id, slugGets all SDK keys for a project.
project_id_or_name, sdk_key_type, environmentteam_id, slugCreates an SDK key.
project_id_or_name, hash_keyteam_id, slugDeletes an SDK key.
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringThe SDK key hash key to delete
stringThe project id or name
stringThe Team slug to perform the request on behalf of.
stringThe Team identifier to perform the request on behalf of. (wire: teamId)
+ +## `SELECT` examples + + + + +Gets all SDK keys for a project. + +```sql +SELECT +project_id, +created_at, +created_by, +deleted_at, +environment, +hash_key, +label, +partial_key_value, +type, +updated_at +FROM vercel.feature_flags.sdk_keys +WHERE project_id_or_name = '{{ project_id_or_name }}' -- required +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + + + +## `INSERT` examples + + + + +Creates an SDK key. + +```sql +INSERT INTO vercel.feature_flags.sdk_keys ( +sdk_key_type, +environment, +label, +project_id_or_name, +team_id, +slug +) +SELECT +'{{ sdk_key_type }}' /* required */, +'{{ environment }}' /* required */, +'{{ label }}', +'{{ project_id_or_name }}', +'{{ team_id }}', +'{{ slug }}' +RETURNING +project_id, +created_at, +created_by, +deleted_at, +environment, +hash_key, +key_value, +label, +partial_key_value, +token_value, +type, +updated_at +; +``` + + + +{`# Description fields are for documentation purposes +- name: sdk_keys + props: + - name: project_id_or_name + value: "{{ project_id_or_name }}" + description: Required parameter for the sdk_keys resource. + - name: sdk_key_type + value: "{{ sdk_key_type }}" + valid_values: ['server', 'mobile', 'client'] + - name: environment + value: "{{ environment }}" + - name: label + value: "{{ label }}" + - name: team_id + value: "{{ team_id }}" + description: The Team identifier to perform the request on behalf of. + description: The Team identifier to perform the request on behalf of. + - name: slug + value: "{{ slug }}" + description: The Team slug to perform the request on behalf of. + description: The Team slug to perform the request on behalf of. +`} + + + + + +## `DELETE` examples + + + + +Deletes an SDK key. + +```sql +DELETE FROM vercel.feature_flags.sdk_keys +WHERE project_id_or_name = '{{ project_id_or_name }}' --required +AND hash_key = '{{ hash_key }}' --required +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + diff --git a/website/docs/services/feature_flags/segments/index.md b/website/docs/services/feature_flags/segments/index.md new file mode 100644 index 0000000..b8ea034 --- /dev/null +++ b/website/docs/services/feature_flags/segments/index.md @@ -0,0 +1,533 @@ +--- +title: segments +hide_title: false +hide_table_of_contents: false +keywords: + - segments + - feature_flags + - vercel + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a segments resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string
string (wire: projectId)
string (segment) (wire: typeName)
number (wire: createdAt)
string (wire: createdBy)
object
string
string
string
object
string
number (wire: updatedAt)
array (wire: usedByFlags)
array (wire: usedBySegments)
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string
string (wire: projectId)
string (segment) (wire: typeName)
number (wire: createdAt)
string (wire: createdBy)
object
string
string
string
object
string
number (wire: updatedAt)
array (wire: usedByFlags)
array (wire: usedBySegments)
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
project_id_or_name, segment_id_or_slugwith_metadata, team_id, slugRetrieve a feature flag segment by ID or slug.
project_id_or_namewith_metadata, team_id, slugList all feature flag segments for a project.
project_id_or_name, slug, label, data, hintteam_idCreate a new feature flag segment.
project_id_or_name, segment_id_or_slugwith_metadata, team_id, slugUpdate an existing feature flag segment.
project_id_or_name, segment_id_or_slugwith_metadata, team_id, slugDelete a feature flag segment.
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringThe project id or name
stringThe segment slug
stringThe Team slug to perform the request on behalf of.
stringThe Team identifier to perform the request on behalf of. (wire: teamId)
booleanWhether to include metadata (wire: withMetadata)
+ +## `SELECT` examples + + + + +Retrieve a feature flag segment by ID or slug. + +```sql +SELECT +id, +project_id, +type_name, +created_at, +created_by, +data, +description, +hint, +label, +metadata, +slug, +updated_at, +used_by_flags, +used_by_segments +FROM vercel.feature_flags.segments +WHERE project_id_or_name = '{{ project_id_or_name }}' -- required +AND segment_id_or_slug = '{{ segment_id_or_slug }}' -- required +AND with_metadata = '{{ with_metadata }}' +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + + +List all feature flag segments for a project. + +```sql +SELECT +id, +project_id, +type_name, +created_at, +created_by, +data, +description, +hint, +label, +metadata, +slug, +updated_at, +used_by_flags, +used_by_segments +FROM vercel.feature_flags.segments +WHERE project_id_or_name = '{{ project_id_or_name }}' -- required +AND with_metadata = '{{ with_metadata }}' +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + + + +## `INSERT` examples + + + + +Create a new feature flag segment. + +```sql +INSERT INTO vercel.feature_flags.segments ( +slug, +created_by, +label, +description, +data, +hint, +project_id_or_name, +team_id +) +SELECT +'{{ slug }}' /* required */, +'{{ created_by }}', +'{{ label }}' /* required */, +'{{ description }}', +'{{ data }}' /* required */, +'{{ hint }}' /* required */, +'{{ project_id_or_name }}', +'{{ team_id }}' +RETURNING +id, +project_id, +type_name, +created_at, +created_by, +data, +description, +hint, +label, +slug, +updated_at, +used_by_flags, +used_by_segments +; +``` + + + +{`# Description fields are for documentation purposes +- name: segments + props: + - name: project_id_or_name + value: "{{ project_id_or_name }}" + description: Required parameter for the segments resource. + - name: slug + value: "{{ slug }}" + - name: created_by + value: "{{ created_by }}" + description: | + The entity who created the segment + - name: label + value: "{{ label }}" + - name: description + value: "{{ description }}" + - name: data + description: | + The data of the segment + value: + rules: + - id: "{{ id }}" + conditions: "{{ conditions }}" + outcome: "{{ outcome }}" + include: "{{ include }}" + exclude: "{{ exclude }}" + - name: hint + value: "{{ hint }}" + - name: team_id + value: "{{ team_id }}" + description: The Team identifier to perform the request on behalf of. + description: The Team identifier to perform the request on behalf of. +`} + + + + + +## `UPDATE` examples + + + + +Update an existing feature flag segment. + +```sql +UPDATE vercel.feature_flags.segments +SET +operations = '{{ operations }}', +label = '{{ label }}', +description = '{{ description }}', +data = '{{ data }}', +hint = '{{ hint }}' +WHERE +project_id_or_name = '{{ project_id_or_name }}' --required +AND segment_id_or_slug = '{{ segment_id_or_slug }}' --required +AND with_metadata = {{ with_metadata}} +AND team_id = '{{ team_id}}' +AND slug = '{{ slug}}' +RETURNING +id, +project_id, +type_name, +created_at, +created_by, +data, +description, +hint, +label, +metadata, +slug, +updated_at, +used_by_flags, +used_by_segments; +``` + + + + +## `DELETE` examples + + + + +Delete a feature flag segment. + +```sql +DELETE FROM vercel.feature_flags.segments +WHERE project_id_or_name = '{{ project_id_or_name }}' --required +AND segment_id_or_slug = '{{ segment_id_or_slug }}' --required +AND with_metadata = '{{ with_metadata }}' +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + diff --git a/website/docs/services/feature_flags/settings/index.md b/website/docs/services/feature_flags/settings/index.md new file mode 100644 index 0000000..0dfa549 --- /dev/null +++ b/website/docs/services/feature_flags/settings/index.md @@ -0,0 +1,232 @@ +--- +title: settings +hide_title: false +hide_table_of_contents: false +keywords: + - settings + - feature_flags + - vercel + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a settings resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string (wire: ownerId)
string (wire: projectId)
string (settings) (wire: typeName)
number (wire: createdAt)
boolean (false, true)
array
array
object
number (wire: updatedAt)
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
project_id_or_nameteam_id, slugRetrieve feature flag settings for a project.
project_id_or_nameteam_id, slugUpdate feature flag settings for a project.
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringThe project id or name
stringThe Team slug to perform the request on behalf of.
stringThe Team identifier to perform the request on behalf of. (wire: teamId)
+ +## `SELECT` examples + + + + +Retrieve feature flag settings for a project. + +```sql +SELECT +owner_id, +project_id, +type_name, +created_at, +enabled, +entities, +environments, +metadata, +updated_at +FROM vercel.feature_flags.settings +WHERE project_id_or_name = '{{ project_id_or_name }}' -- required +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + + + +## `UPDATE` examples + + + + +Update feature flag settings for a project. + +```sql +UPDATE vercel.feature_flags.settings +SET +enabled = {{ enabled }}, +entities = '{{ entities }}', +environments = '{{ environments }}' +WHERE +project_id_or_name = '{{ project_id_or_name }}' --required +AND team_id = '{{ team_id}}' +AND slug = '{{ slug}}' +RETURNING +owner_id, +project_id, +type_name, +created_at, +enabled, +entities, +environments, +metadata, +updated_at; +``` + + diff --git a/website/docs/services/feature_flags/team_flags/index.md b/website/docs/services/feature_flags/team_flags/index.md new file mode 100644 index 0000000..33af96a --- /dev/null +++ b/website/docs/services/feature_flags/team_flags/index.md @@ -0,0 +1,226 @@ +--- +title: team_flags +hide_title: false +hide_table_of_contents: false +keywords: + - team_flags + - feature_flags + - vercel + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a team_flags resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + + + + + + + + + + + +
NameDatatypeDescription
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
team_idstate, limit, cursor, search, kind, tags, created_by, maintainer_ids, include_marketplace_flags, slugRetrieve all feature flags for a team across all projects. Returns an opaque cursor for pagination.
team_idstate, withMetadata, limit, cursor, search, kind, tags, slugRetrieve all feature flags for a team across all projects. The list can be filtered by state and supports pagination.
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringThe Team identifier to perform the request on behalf of.
stringFilter flags by the id of the entity that created them (a user or team id). (wire: createdBy)
stringPagination cursor to continue from.
booleanWhether to include Marketplace experimentation items in the paginated response. Defaults to false. (wire: includeMarketplaceFlags)
stringThe kind of flags to retrieve.
integerMaximum number of flags to return.
arrayFilter flags by maintainer user id. Repeat the parameter for multiple maintainers (any may match). (wire: maintainerIds)
stringThe Team slug to perform the request on behalf of.
stringThe state of the flags to retrieve. Defaults to `active`.
arrayFilter flags by tag. Repeat the parameter for multiple tags (all must match).
booleanDeprecated. Whether to include creator metadata in each flag in the response. Resolve creator identity client-side (e.g. via the team members endpoint) instead; this parameter will be removed in a future release.
+ +## `SELECT` examples + + + + +Retrieve all feature flags for a team across all projects. Returns an opaque cursor for pagination. + +```sql +SELECT +* +FROM vercel.feature_flags.team_flags +WHERE team_id = '{{ team_id }}' -- required +AND state = '{{ state }}' +AND limit = '{{ limit }}' +AND cursor = '{{ cursor }}' +AND search = '{{ search }}' +AND kind = '{{ kind }}' +AND tags = '{{ tags }}' +AND created_by = '{{ created_by }}' +AND maintainer_ids = '{{ maintainer_ids }}' +AND include_marketplace_flags = '{{ include_marketplace_flags }}' +AND slug = '{{ slug }}' +; +``` + + + + +## Lifecycle Methods + +EXEC variables use wire (API) names. + + + + +Retrieve all feature flags for a team across all projects. The list can be filtered by state and supports pagination. + +```sql +EXEC vercel.feature_flags.team_flags.list_v1 +@team_id='{{ team_id }}' --required, +@state='{{ state }}', +@withMetadata={{ withMetadata }}, +@limit='{{ limit }}', +@cursor='{{ cursor }}', +@search='{{ search }}', +@kind='{{ kind }}', +@tags='{{ tags }}', +@slug='{{ slug }}' +; +``` + + diff --git a/website/docs/services/feature_flags/team_settings/index.md b/website/docs/services/feature_flags/team_settings/index.md new file mode 100644 index 0000000..38c2a09 --- /dev/null +++ b/website/docs/services/feature_flags/team_settings/index.md @@ -0,0 +1,194 @@ +--- +title: team_settings +hide_title: false +hide_table_of_contents: false +keywords: + - team_settings + - feature_flags + - vercel + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a team_settings resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string (wire: ownerId)
string (wire: projectId)
string (settings) (wire: typeName)
number (wire: createdAt)
boolean (false, true)
array
array
object
number (wire: updatedAt)
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
team_idlimit, cursor, slugRetrieve feature flag settings for projects in a team.
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringThe Team identifier to perform the request on behalf of.
stringPagination cursor to continue from.
integerMaximum number of settings to return.
stringThe Team slug to perform the request on behalf of.
+ +## `SELECT` examples + + + + +Retrieve feature flag settings for projects in a team. + +```sql +SELECT +owner_id, +project_id, +type_name, +created_at, +enabled, +entities, +environments, +metadata, +updated_at +FROM vercel.feature_flags.team_settings +WHERE team_id = '{{ team_id }}' -- required +AND limit = '{{ limit }}' +AND cursor = '{{ cursor }}' +AND slug = '{{ slug }}' +; +``` + + diff --git a/website/docs/services/integrations/billing_plans/index.md b/website/docs/services/integrations/billing_plans/index.md new file mode 100644 index 0000000..e1e1d47 --- /dev/null +++ b/website/docs/services/integrations/billing_plans/index.md @@ -0,0 +1,260 @@ +--- +title: billing_plans +hide_title: false +hide_table_of_contents: false +keywords: + - billing_plans + - integrations + - vercel + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a billing_plans resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string
string
string
string
array
boolean (false, true)
string (wire: effectiveDate)
array (wire: highlightedDetails)
string (wire: initialCharge)
string (wire: maximumAmount)
string (wire: maximumAmountAutoPurchasePerPeriod)
string (wire: minimumAmount)
boolean (false, true) (wire: paymentMethodRequired)
number (wire: preauthorizationAmount)
array
string (installation, resource)
string (prepayment, subscription)
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
integration_id_or_slug, product_id_or_slugintegration_configuration_id, metadata, source, team_id, slugGet a list of billing plans for an integration and product.
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string
string
string (wire: integrationConfigurationId)
string
stringThe Team slug to perform the request on behalf of.
string
stringThe Team identifier to perform the request on behalf of. (wire: teamId)
+ +## `SELECT` examples + + + + +Get a list of billing plans for an integration and product. + +```sql +SELECT +id, +name, +cost, +description, +details, +disabled, +effective_date, +highlighted_details, +initial_charge, +maximum_amount, +maximum_amount_auto_purchase_per_period, +minimum_amount, +payment_method_required, +preauthorization_amount, +quote, +scope, +type +FROM vercel.integrations.billing_plans +WHERE integration_id_or_slug = '{{ integration_id_or_slug }}' -- required +AND product_id_or_slug = '{{ product_id_or_slug }}' -- required +AND integration_configuration_id = '{{ integration_configuration_id }}' +AND metadata = '{{ metadata }}' +AND source = '{{ source }}' +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + diff --git a/website/docs/services/integrations/configuration/index.md b/website/docs/services/integrations/configuration/index.md deleted file mode 100644 index dfe46fa..0000000 --- a/website/docs/services/integrations/configuration/index.md +++ /dev/null @@ -1,200 +0,0 @@ ---- -title: configuration -hide_title: false -hide_table_of_contents: false -keywords: - - configuration - - integrations - - vercel - - infrastructure-as-code - - configuration-as-data - - cloud inventory -description: Query, deploy and manage vercel resources using SQL -custom_edit_url: null -image: /img/stackql-vercel-provider-featured-image.png ---- - -import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; - -Creates, updates, deletes, gets or lists a configuration resource. - -## Overview - - - - -
Nameconfiguration
TypeResource
Id
- -## Fields - -The following fields are returned by `SELECT` queries: - - - - - - - - - - - - - - -
NameDatatypeDescription
-
- - -The list of configurations for the authenticated user - - - - - - - - - - - -
NameDatatypeDescription
-
-
- -## Methods - -The following methods are available for this resource: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameAccessible byRequired ParamsOptional ParamsDescription
id, teamIdAllows to retrieve a the configuration with the provided id in case it exists. The authenticated user or team must be the owner of the config in order to access it.
view, teamIdAllows to retrieve all configurations for an authenticated integration. When the `project` view is used, configurations generated for the authorization flow will be filtered out of the results.
id, teamIdAllows to remove the configuration with the `id` provided in the parameters. The configuration and all of its resources will be removed. This includes Webhooks, LogDrains and Project Env variables.
- -## Parameters - -Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDatatypeDescription
stringID of the configuration to delete
stringThe Team identifier or slug to perform the request on behalf of.
string
- -## `SELECT` examples - - - - -Allows to retrieve a the configuration with the provided id in case it exists. The authenticated user or team must be the owner of the config in order to access it. - -```sql -SELECT -* -FROM vercel.integrations.configuration -WHERE id = '{{ id }}' -- required -AND teamId = '{{ teamId }}' -- required -; -``` - - - -Allows to retrieve all configurations for an authenticated integration. When the `project` view is used, configurations generated for the authorization flow will be filtered out of the results. - -```sql -SELECT -* -FROM vercel.integrations.configuration -WHERE view = '{{ view }}' -- required -AND teamId = '{{ teamId }}' -- required -; -``` - - - - -## `DELETE` examples - - - - -Allows to remove the configuration with the `id` provided in the parameters. The configuration and all of its resources will be removed. This includes Webhooks, LogDrains and Project Env variables. - -```sql -DELETE FROM vercel.integrations.configuration -WHERE id = '{{ id }}' --required -AND teamId = '{{ teamId }}' --required -; -``` - - diff --git a/website/docs/services/integrations/configuration_products/index.md b/website/docs/services/integrations/configuration_products/index.md new file mode 100644 index 0000000..2df46fe --- /dev/null +++ b/website/docs/services/integrations/configuration_products/index.md @@ -0,0 +1,172 @@ +--- +title: configuration_products +hide_title: false +hide_table_of_contents: false +keywords: + - configuration_products + - integrations + - vercel + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a configuration_products resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + +List of products available for this integration configuration + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string
string
object (wire: metadataSchema)
string (ai, authentication, checks, experimentation, logDrain, messaging, observability, other, storage, traceDrain, video, workflow) (wire: primaryProtocol)
object
string
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
idteam_id, slugReturns products available for an integration configuration. Each product includes a `metadataSchema` field with the JSON Schema for required and optional metadata fields.
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringID of the integration configuration
stringThe Team slug to perform the request on behalf of.
stringThe Team identifier to perform the request on behalf of. (wire: teamId)
+ +## `SELECT` examples + + + + +Returns products available for an integration configuration. Each product includes a `metadataSchema` field with the JSON Schema for required and optional metadata fields. + +```sql +SELECT +id, +name, +metadata_schema, +primary_protocol, +protocols, +slug +FROM vercel.integrations.configuration_products +WHERE id = '{{ id }}' -- required +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + diff --git a/website/docs/services/integrations/configurations/index.md b/website/docs/services/integrations/configurations/index.md new file mode 100644 index 0000000..7dfeb9b --- /dev/null +++ b/website/docs/services/integrations/configurations/index.md @@ -0,0 +1,563 @@ +--- +title: configurations +hide_title: false +hide_table_of_contents: false +keywords: + - configurations + - integrations + - vercel + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a configurations resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + +The configuration with the provided id + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringThe unique identifier of the configuration (example: icfg_3bwCLgxL8qt5kjRLcv2Dit7F)
stringHistorical parent installation from which acceptedPolicies were inherited. This is immutable provenance, not current authorization or relationship truth. (wire: acceptedPoliciesInheritedFromInstallationId)
stringAn external identifier defined by the integration vendor. (wire: externalId)
stringThe unique identifier of the app the configuration was created for (example: oac_xzpVzcUOgcB1nrVlirtKhbWV) (wire: integrationId)
stringThe user or team ID that owns the configuration (example: kr1PsOIzqEL5Xg6M4VZcZosf) (wire: ownerId)
stringWhen the configuration was created for a team, this will show the ID of the team. (example: team_nLlpyC6RE1qxydlFKbrxDlud) (wire: teamId)
stringThe ID of the user that created the configuration. (example: kr1PsOIzqEL5Xg6M4VZcZosf) (wire: userId)
boolean (false, true) (wire: canConfigureOpenTelemetry)
numberA timestamp that tells you when the configuration was installed successfully (wire: completedAt)
numberA timestamp that tells you when the configuration was created (wire: createdAt)
numberRecord when the customer initited deletion, independent of whether `deleteRequestedAt` gets set. (wire: customerDeleteRequestedAt)
numberA timestamp that tells you when the configuration deletion has been started for cases when the deletion needs to be settled/approved by partners, such as when marketplace invoices have been paid. (wire: deleteRequestedAt)
numberA timestamp that tells you when the configuration was deleted. (wire: deletedAt)
numberA timestamp that tells you when the configuration was disabled. Note: Configurations can be disabled when the associated user loses access to a team. They do not function during this time until the configuration is 'transferred', meaning the associated user is changed to one with access to the team. (wire: disabledAt)
string (account-plan-downgrade, disabled-by-admin, disabled-by-owner, feature-not-available, original-owner-left-the-team, original-owner-role-downgraded) (wire: disabledReason)
stringDefines the installation type. - 'external' integrations are installed via the existing integrations flow - 'marketplace' integrations are natively installed: - when accepting the TOS of a partner during the store creation process - if undefined, assume 'external' (external, marketplace) (wire: installationType)
object
stringA string representing the permission for projects. Possible values are `all` or `selected`. (all, selected) (example: all) (wire: projectSelection)
arrayWhen a configuration is limited to access certain projects, this will contain each of the project ID it is allowed to access. If it is not defined, the configuration has full access.
arrayThe resources that are allowed to be accessed by the configuration.
stringThe slug of the integration the configuration is created for. (example: slack)
stringSource defines where the configuration was installed from. It is used to analyze user engagement for integration installations in product metrics. (backoffice, cli, deploy-button, external, import-recommended-integrations, marketplace, oauth, organization, resource-claims, v0) (example: marketplace)
stringThe configuration status. Optional. If not defined, assume 'ready'. (error, onboarding, pending, ready, resumed, suspended, uninstalled)
(wire: transferRequest)
string (integration-configuration)
numberA timestamp that tells you when the configuration was updated. (wire: updatedAt)
+
+ + +The list of configurations for the authenticated user + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringThe unique identifier of the configuration (example: icfg_3bwCLgxL8qt5kjRLcv2Dit7F)
stringHistorical parent installation from which acceptedPolicies were inherited. This is immutable provenance, not current authorization or relationship truth. (wire: acceptedPoliciesInheritedFromInstallationId)
stringAn external identifier defined by the integration vendor. (wire: externalId)
stringThe unique identifier of the app the configuration was created for (example: oac_xzpVzcUOgcB1nrVlirtKhbWV) (wire: integrationId)
stringThe user or team ID that owns the configuration (example: kr1PsOIzqEL5Xg6M4VZcZosf) (wire: ownerId)
stringWhen the configuration was created for a team, this will show the ID of the team. (example: team_nLlpyC6RE1qxydlFKbrxDlud) (wire: teamId)
stringThe ID of the user that created the configuration. (example: kr1PsOIzqEL5Xg6M4VZcZosf) (wire: userId)
numberA timestamp that tells you when the configuration was installed successfully (wire: completedAt)
numberA timestamp that tells you when the configuration was created (wire: createdAt)
numberRecord when the customer initited deletion, independent of whether `deleteRequestedAt` gets set. (wire: customerDeleteRequestedAt)
numberA timestamp that tells you when the configuration deletion has been started for cases when the deletion needs to be settled/approved by partners, such as when marketplace invoices have been paid. (wire: deleteRequestedAt)
numberA timestamp that tells you when the configuration was deleted. (wire: deletedAt)
numberA timestamp that tells you when the configuration was disabled. Note: Configurations can be disabled when the associated user loses access to a team. They do not function during this time until the configuration is 'transferred', meaning the associated user is changed to one with access to the team. (wire: disabledAt)
string (account-plan-downgrade, disabled-by-admin, disabled-by-owner, feature-not-available, original-owner-left-the-team, original-owner-role-downgraded) (wire: disabledReason)
stringDefines the installation type. - 'external' integrations are installed via the existing integrations flow - 'marketplace' integrations are natively installed: - when accepting the TOS of a partner during the store creation process - if undefined, assume 'external' (external, marketplace) (wire: installationType)
arrayWhen a configuration is limited to access certain projects, this will contain each of the project ID it is allowed to access. If it is not defined, the configuration has full access.
arrayThe resources that are allowed to be accessed by the configuration.
stringThe slug of the integration the configuration is created for. (example: slack)
stringSource defines where the configuration was installed from. It is used to analyze user engagement for integration installations in product metrics. (backoffice, cli, deploy-button, external, import-recommended-integrations, marketplace, oauth, organization, resource-claims, v0) (example: marketplace)
stringThe configuration status. Optional. If not defined, assume 'ready'. (error, onboarding, pending, ready, resumed, suspended, uninstalled)
string (integration-configuration)
numberA timestamp that tells you when the configuration was updated. (wire: updatedAt)
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
idteam_id, slugAllows to retrieve a the configuration with the provided id in case it exists. The authenticated user or team must be the owner of the config in order to access it.
viewinstallation_type, integration_id_or_slug, team_id, slugAllows to retrieve all configurations for an authenticated integration. When the `project` view is used, configurations generated for the authorization flow will be filtered out of the results.
idteam_id, slugAllows to remove the configuration with the `id` provided in the parameters. The configuration and all of its resources will be removed. This includes Webhooks, LogDrains and Project Env variables.
integration_configuration_id, resource_id, projectIdteamId, slugConnects an integration resource to a Vercel project. This endpoint establishes a connection between a provisioned integration resource (from storage APIs like `POST /v1/storage/stores/integration/direct`) and a specific Vercel project.
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string
string
string
string
string (wire: installationType)
stringID of the integration (wire: integrationIdOrSlug)
stringThe Team slug to perform the request on behalf of.
stringThe Team identifier to perform the request on behalf of.
stringThe Team identifier to perform the request on behalf of. (wire: teamId)
+ +## `SELECT` examples + + + + +Allows to retrieve a the configuration with the provided id in case it exists. The authenticated user or team must be the owner of the config in order to access it. + +```sql +SELECT +id, +accepted_policies_inherited_from_installation_id, +external_id, +integration_id, +owner_id, +team_id, +user_id, +can_configure_open_telemetry, +completed_at, +created_at, +customer_delete_requested_at, +delete_requested_at, +deleted_at, +disabled_at, +disabled_reason, +installation_type, +notification, +project_selection, +projects, +scopes, +slug, +source, +status, +transfer_request, +type, +updated_at +FROM vercel.integrations.configurations +WHERE id = '{{ id }}' -- required +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + + +Allows to retrieve all configurations for an authenticated integration. When the `project` view is used, configurations generated for the authorization flow will be filtered out of the results. + +```sql +SELECT +id, +accepted_policies_inherited_from_installation_id, +external_id, +integration_id, +owner_id, +team_id, +user_id, +completed_at, +created_at, +customer_delete_requested_at, +delete_requested_at, +deleted_at, +disabled_at, +disabled_reason, +installation_type, +projects, +scopes, +slug, +source, +status, +type, +updated_at +FROM vercel.integrations.configurations +WHERE view = '{{ view }}' -- required +AND installation_type = '{{ installation_type }}' +AND integration_id_or_slug = '{{ integration_id_or_slug }}' +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + + + +## `DELETE` examples + + + + +Allows to remove the configuration with the `id` provided in the parameters. The configuration and all of its resources will be removed. This includes Webhooks, LogDrains and Project Env variables. + +```sql +DELETE FROM vercel.integrations.configurations +WHERE id = '{{ id }}' --required +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + + + +## Lifecycle Methods + +EXEC variables use wire (API) names. + + + + +Connects an integration resource to a Vercel project. This endpoint establishes a connection between a provisioned integration resource (from storage APIs like `POST /v1/storage/stores/integration/direct`) and a specific Vercel project. + +```sql +EXEC vercel.integrations.configurations.connect_resource_to_project +@integration_configuration_id='{{ integration_configuration_id }}' --required, +@resource_id='{{ resource_id }}' --required, +@teamId='{{ teamId }}', +@slug='{{ slug }}' +@@json= +'{ +"projectId": "{{ projectId }}", +"envVarEnvironments": "{{ envVarEnvironments }}", +"makeEnvVarsSensitive": {{ makeEnvVarsSensitive }} +}' +; +``` + + diff --git a/website/docs/services/integrations/git_namespaces/index.md b/website/docs/services/integrations/git_namespaces/index.md index 7bdd67d..e41536a 100644 --- a/website/docs/services/integrations/git_namespaces/index.md +++ b/website/docs/services/integrations/git_namespaces/index.md @@ -15,6 +15,7 @@ image: /img/stackql-vercel-provider-featured-image.png --- import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; @@ -22,7 +23,7 @@ Creates, updates, deletes, gets or lists a git_namespaces resource. ## Overview - +
Namegit_namespaces
Name
TypeResource
Id
@@ -32,12 +33,12 @@ Creates, updates, deletes, gets or lists a git_namespaces resource. The following fields are returned by `SELECT` queries: - + @@ -59,19 +60,19 @@ The following fields are returned by `SELECT` queries: - + - + - + - + - + - + @@ -79,15 +80,20 @@ The following fields are returned by `SELECT` queries: - + - + + + + + +
number (wire: installationId)
boolean (false, true) (wire: isAccessRestricted)
string (wire: ownerType)
boolean (false, true) (wire: requireReauth)
string
object
@@ -109,10 +115,10 @@ The following methods are available for this resource: - + - teamId - host, provider + + host, provider, viewer_metadata Lists git namespaces for a supported provider. Supported providers are `github`, `gitlab` and `bitbucket`. If the provider is not provided, it will try to obtain it from the user that authenticated the request. @@ -131,11 +137,6 @@ Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](# - - - string - The Team identifier or slug to perform the request on behalf of. - string @@ -143,21 +144,26 @@ Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](# - string + + + + boolean + When true, includes the viewer object for each namespace. (wire: viewerMetadata) + ## `SELECT` examples - + Lists git namespaces for a supported provider. Supported providers are `github`, `gitlab` and `bitbucket`. If the provider is not provided, it will try to obtain it from the user that authenticated the request. @@ -165,16 +171,17 @@ Lists git namespaces for a supported provider. Supported providers are `github`, SELECT id, name, -installationId, -isAccessRestricted, -ownerType, +installation_id, +is_access_restricted, +owner_type, provider, -requireReauth, -slug +require_reauth, +slug, +viewer FROM vercel.integrations.git_namespaces -WHERE teamId = '{{ teamId }}' -- required -AND host = '{{ host }}' +WHERE host = '{{ host }}' AND provider = '{{ provider }}' +AND viewer_metadata = '{{ viewer_metadata }}' ; ``` diff --git a/website/docs/services/integrations/index.md b/website/docs/services/integrations/index.md index a174865..eb12e1b 100644 --- a/website/docs/services/integrations/index.md +++ b/website/docs/services/integrations/index.md @@ -18,17 +18,20 @@ integrations service documentation. :::info[Service Summary] -total resources: __3__ +total resources: __6__ ::: ## Resources \ No newline at end of file diff --git a/website/docs/services/integrations/search_repo/index.md b/website/docs/services/integrations/repos/index.md similarity index 52% rename from website/docs/services/integrations/search_repo/index.md rename to website/docs/services/integrations/repos/index.md index a8ad129..287cdef 100644 --- a/website/docs/services/integrations/search_repo/index.md +++ b/website/docs/services/integrations/repos/index.md @@ -1,9 +1,9 @@ --- -title: search_repo +title: repos hide_title: false hide_table_of_contents: false keywords: - - search_repo + - repos - integrations - vercel - infrastructure-as-code @@ -15,16 +15,17 @@ image: /img/stackql-vercel-provider-featured-image.png --- import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; -Creates, updates, deletes, gets or lists a search_repo resource. +Creates, updates, deletes, gets or lists a repos resource. ## Overview - + - +
Namesearch_repo
Name
TypeResource
Id
Id
## Fields @@ -32,12 +33,12 @@ Creates, updates, deletes, gets or lists a search_repo resource. The following fields are returned by `SELECT` queries: - + @@ -49,13 +50,58 @@ The following fields are returned by `SELECT` queries: - + + + + + + + + + + + + + + + + + + + + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -79,10 +125,10 @@ The following methods are available for this resource: - + - - + + @@ -101,25 +147,20 @@ Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](# - - - - - - - + + - + - - - - + + + + @@ -131,32 +172,52 @@ Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](# + + + + + + + + + +
string
string
string (wire: defaultBranch)
string
object
arraystring (team, user) (wire: ownerType)
boolean (false, true)
string (cursor-origin)
string
number (wire: updatedAt)
string
teamIdquery, namespaceId, provider, installationId, hostquery, namespace_id, provider, installation_id, host, team_id, slug Lists git repositories linked to a namespace `id` for a supported provider. A specific namespace `id` can be obtained via the `git-namespaces` endpoint. Supported providers are `github`, `gitlab` and `bitbucket`. If the provider or namespace is not provided, it will try to obtain it from the user that authenticated the request.
stringThe Team identifier or slug to perform the request on behalf of.
string The custom Git host if using a custom Git provider, like GitHub Enterprise Server
string (wire: installationId)
string
(wire: namespaceId)
string
stringThe Team slug to perform the request on behalf of.
stringThe Team identifier to perform the request on behalf of. (wire: teamId)
## `SELECT` examples - + Lists git repositories linked to a namespace `id` for a supported provider. A specific namespace `id` can be obtained via the `git-namespaces` endpoint. Supported providers are `github`, `gitlab` and `bitbucket`. If the provider or namespace is not provided, it will try to obtain it from the user that authenticated the request. ```sql SELECT -gitAccount, -repos -FROM vercel.integrations.search_repo -WHERE teamId = '{{ teamId }}' -- required -AND query = '{{ query }}' -AND namespaceId = '{{ namespaceId }}' +id, +name, +default_branch, +namespace, +owner, +owner_type, +private, +provider, +slug, +updated_at, +url +FROM vercel.integrations.repos +WHERE query = '{{ query }}' +AND namespace_id = '{{ namespace_id }}' AND provider = '{{ provider }}' -AND installationId = '{{ installationId }}' +AND installation_id = '{{ installation_id }}' AND host = '{{ host }}' +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' ; ``` diff --git a/website/docs/services/integrations/stores/index.md b/website/docs/services/integrations/stores/index.md new file mode 100644 index 0000000..1a9b420 --- /dev/null +++ b/website/docs/services/integrations/stores/index.md @@ -0,0 +1,193 @@ +--- +title: stores +hide_title: false +hide_table_of_contents: false +keywords: + - stores + - integrations + - vercel + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a stores resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + +`SELECT` not supported for this resource, use `SHOW METHODS` to view available operations for the resource. + + +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
name, integration_configuration_id, integration_product_id_or_slugteam_id, slugCreates an integration store with automatic billing plan handling. For free resources, omit `billingPlanId` to auto-discover free plans. For paid resources, provide a `billingPlanId` from the billing plans endpoint.
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringThe Team slug to perform the request on behalf of.
stringThe Team identifier to perform the request on behalf of. (wire: teamId)
+ +## `INSERT` examples + + + + +Creates an integration store with automatic billing plan handling. For free resources, omit `billingPlanId` to auto-discover free plans. For paid resources, provide a `billingPlanId` from the billing plans endpoint. + +```sql +INSERT INTO vercel.integrations.stores ( +name, +integration_configuration_id, +integration_product_id_or_slug, +metadata, +external_id, +protocol_settings, +source, +billing_plan_id, +payment_method_id, +prepayment_amount_cents, +team_id, +slug +) +SELECT +'{{ name }}' /* required */, +'{{ integration_configuration_id }}' /* required */, +'{{ integration_product_id_or_slug }}' /* required */, +'{{ metadata }}', +'{{ external_id }}', +'{{ protocol_settings }}', +'{{ source }}', +'{{ billing_plan_id }}', +'{{ payment_method_id }}', +{{ prepayment_amount_cents }}, +'{{ team_id }}', +'{{ slug }}' +RETURNING +store +; +``` + + + +{`# Description fields are for documentation purposes +- name: stores + props: + - name: name + value: "{{ name }}" + description: | + Human-readable name for the storage resource + - name: integration_configuration_id + value: "{{ integration_configuration_id }}" + description: | + ID of your integration configuration. Get this from GET /v1/integrations/configurations + - name: integration_product_id_or_slug + value: "{{ integration_product_id_or_slug }}" + description: | + ID or slug of the integration product. Get available products from GET /v1/integrations/configuration/{id}/products + - name: metadata + value: "{{ metadata }}" + description: | + Optional key-value pairs for resource metadata + - name: external_id + value: "{{ external_id }}" + description: | + Optional external identifier for tracking purposes + - name: protocol_settings + value: "{{ protocol_settings }}" + description: | + Protocol-specific configuration settings + - name: source + value: "{{ source }}" + description: | + Source of the store creation request + valid_values: ['marketplace', 'deploy-button', 'external', 'v0', 'resource-claims', 'cli', 'oauth', 'backoffice', 'import-recommended-integrations', 'organization'] + default: marketplace + - name: billing_plan_id + value: "{{ billing_plan_id }}" + description: | + ID of the billing plan for paid resources. Get available plans from GET /integrations/integration/{id}/products/{productId}/plans. If not provided, automatically discovers free billing plans. + - name: payment_method_id + value: "{{ payment_method_id }}" + description: | + Payment method ID for paid resources. Optional - uses default payment method if not provided. + - name: prepayment_amount_cents + value: {{ prepayment_amount_cents }} + description: | + Amount in cents for prepayment billing plans. Required only for prepayment plans with variable amounts. + - name: team_id + value: "{{ team_id }}" + description: The Team identifier to perform the request on behalf of. + description: The Team identifier to perform the request on behalf of. + - name: slug + value: "{{ slug }}" + description: The Team slug to perform the request on behalf of. + description: The Team slug to perform the request on behalf of. +`} + + + diff --git a/website/docs/services/kms/index.md b/website/docs/services/kms/index.md new file mode 100644 index 0000000..9fa9dc2 --- /dev/null +++ b/website/docs/services/kms/index.md @@ -0,0 +1,34 @@ +--- +title: kms +hide_title: false +hide_table_of_contents: false +keywords: + - kms + - vercel + - stackql + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +kms service documentation. + +:::info[Service Summary] + +total resources: __3__ + +::: + +## Resources + \ No newline at end of file diff --git a/website/docs/services/kms/issuer_policies/index.md b/website/docs/services/kms/issuer_policies/index.md new file mode 100644 index 0000000..7cb3eec --- /dev/null +++ b/website/docs/services/kms/issuer_policies/index.md @@ -0,0 +1,258 @@ +--- +title: issuer_policies +hide_title: false +hide_table_of_contents: false +keywords: + - issuer_policies + - kms + - vercel + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists an issuer_policies resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + +`SELECT` not supported for this resource, use `SHOW METHODS` to view available operations for the resource. + + +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
issuer_id, kind, project_id, environmentsteam_id, slugAttach a policy to a KMS issuer that grants a project's deployments permission to sign with it.
issuer_id, kind, policy_keyteam_id, slugUpdate an existing KMS issuer policy's environments or token claims.
issuer_id, kind, policy_keyteam_id, slugRemove a policy from a KMS issuer.
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringThe ID of the issuer.
stringThe issuer policy kind.
stringThe policy identifier.
stringThe Team slug to perform the request on behalf of.
stringThe Team identifier to perform the request on behalf of. (wire: teamId)
+ +## `INSERT` examples + + + + +Attach a policy to a KMS issuer that grants a project's deployments permission to sign with it. + +```sql +INSERT INTO vercel.kms.issuer_policies ( +kind, +project_id, +environments, +token_claims, +issuer_id, +team_id, +slug +) +SELECT +'{{ kind }}' /* required */, +'{{ project_id }}' /* required */, +'{{ environments }}' /* required */, +'{{ token_claims }}', +'{{ issuer_id }}', +'{{ team_id }}', +'{{ slug }}' +RETURNING +client_id, +project_id, +team_id, +created_at, +environments, +kind, +token_claims, +updated_at +; +``` + + + +{`# Description fields are for documentation purposes +- name: issuer_policies + props: + - name: issuer_id + value: "{{ issuer_id }}" + description: Required parameter for the issuer_policies resource. + - name: kind + value: "{{ kind }}" + valid_values: ['project-grant'] + - name: project_id + value: "{{ project_id }}" + description: | + The project ID for the project grant policy. + - name: environments + value: + - "{{ environments }}" + description: | + The environments for the project grant policy. Each entry is a system environment (production, preview, development) or a custom environment ID (env_...). + - name: token_claims + value: "{{ token_claims }}" + description: | + The claims that KMS should include in signed JWTs for this policy. + - name: team_id + value: "{{ team_id }}" + description: The Team identifier to perform the request on behalf of. + description: The Team identifier to perform the request on behalf of. + - name: slug + value: "{{ slug }}" + description: The Team slug to perform the request on behalf of. + description: The Team slug to perform the request on behalf of. +`} + + + + + +## `UPDATE` examples + + + + +Update an existing KMS issuer policy's environments or token claims. + +```sql +UPDATE vercel.kms.issuer_policies +SET +environments = '{{ environments }}', +token_claims = '{{ token_claims }}' +WHERE +issuer_id = '{{ issuer_id }}' --required +AND kind = '{{ kind }}' --required +AND policy_key = '{{ policy_key }}' --required +AND team_id = '{{ team_id}}' +AND slug = '{{ slug}}' +RETURNING +client_id, +project_id, +team_id, +created_at, +environments, +kind, +token_claims, +updated_at; +``` + + + + +## `DELETE` examples + + + + +Remove a policy from a KMS issuer. + +```sql +DELETE FROM vercel.kms.issuer_policies +WHERE issuer_id = '{{ issuer_id }}' --required +AND kind = '{{ kind }}' --required +AND policy_key = '{{ policy_key }}' --required +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + diff --git a/website/docs/services/kms/issuers/index.md b/website/docs/services/kms/issuers/index.md new file mode 100644 index 0000000..8584f06 --- /dev/null +++ b/website/docs/services/kms/issuers/index.md @@ -0,0 +1,551 @@ +--- +title: issuers +hide_title: false +hide_table_of_contents: false +keywords: + - issuers + - kms + - vercel + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists an issuers resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string
string
string (wire: ownerId)
string (ES256, ES384, ES512, EdDSA, PS256, PS384, PS512, RS256, RS384, RS512)
object (wire: claimsSchema)
string (wire: createdAt)
string (wire: managedBy)
string (external, vercel)
array
array (wire: signingKeys)
string (wire: updatedAt)
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string
string
string (wire: ownerId)
string (ES256, ES384, ES512, EdDSA, PS256, PS384, PS512, RS256, RS384, RS512)
object (wire: claimsSchema)
string (wire: createdAt)
string (wire: managedBy)
string (external, vercel)
array
array (wire: signingKeys)
string (wire: updatedAt)
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
issuer_idteam_id, slugRetrieve a single KMS issuer by its ID. Accepts either a team bearer token (existing path) or an OIDC token authorized by one of the issuer's policies (e.g. a connex-grant token). The OIDC path returns the issuer without policies, since a policy token only proves signing access, not management access.
limit, next, team_id, slugRetrieve the list of KMS issuers that belong to the authenticated team. The results are paginated.
nameteam_id, slugCreate a new KMS issuer for the authenticated team. An issuer owns the asymmetric signing keys that are used to sign tokens and messages.
issuer_idteam_id, slugUpdate a KMS issuer's name or claims schema.
issuer_idteam_id, slugDelete a KMS issuer and its signing keys.
issuer_id, messageSign a raw message with a KMS issuer's active signing key. Authenticate the request with a Vercel OIDC token in the `Authorization: Bearer` header; the issuer's policies decide which workloads are allowed to sign.
issuer_idSign a JWT with a KMS issuer's active signing key. Authenticate the request with a Vercel OIDC token in the `Authorization: Bearer` header; the issuer's policies decide which workloads are allowed to sign.
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringThe ID of the issuer.
integerMaximum number of issuers to return.
stringContinuation cursor to retrieve the next page of results.
stringThe Team slug to perform the request on behalf of.
stringThe Team identifier to perform the request on behalf of. (wire: teamId)
+ +## `SELECT` examples + + + + +Retrieve a single KMS issuer by its ID. Accepts either a team bearer token (existing path) or an OIDC token authorized by one of the issuer's policies (e.g. a connex-grant token). The OIDC path returns the issuer without policies, since a policy token only proves signing access, not management access. + +```sql +SELECT +id, +name, +owner_id, +algorithm, +claims_schema, +created_at, +managed_by, +origin, +policies, +signing_keys, +updated_at +FROM vercel.kms.issuers +WHERE issuer_id = '{{ issuer_id }}' -- required +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + + +Retrieve the list of KMS issuers that belong to the authenticated team. The results are paginated. + +```sql +SELECT +id, +name, +owner_id, +algorithm, +claims_schema, +created_at, +managed_by, +origin, +policies, +signing_keys, +updated_at +FROM vercel.kms.issuers +WHERE limit = '{{ limit }}' +AND next = '{{ next }}' +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + + + +## `INSERT` examples + + + + +Create a new KMS issuer for the authenticated team. An issuer owns the asymmetric signing keys that are used to sign tokens and messages. + +```sql +INSERT INTO vercel.kms.issuers ( +name, +algorithm, +claims_schema, +policy, +import_key, +import_key_id, +team_id, +slug +) +SELECT +'{{ name }}' /* required */, +'{{ algorithm }}', +'{{ claims_schema }}', +'{{ policy }}', +'{{ import_key }}', +'{{ import_key_id }}', +'{{ team_id }}', +'{{ slug }}' +RETURNING +id, +name, +owner_id, +algorithm, +claims_schema, +created_at, +managed_by, +origin, +policies, +signing_keys, +updated_at +; +``` + + + +{`# Description fields are for documentation purposes +- name: issuers + props: + - name: name + value: "{{ name }}" + description: | + The name of the issuer. + - name: algorithm + value: "{{ algorithm }}" + description: | + The signing algorithm to use for the issuer. EdDSA is not accepted for new issuers. + valid_values: ['RS256', 'RS384', 'RS512', 'PS256', 'PS384', 'PS512', 'ES256', 'ES384', 'ES512'] + default: RS512 + - name: claims_schema + value: "{{ claims_schema }}" + description: | + A JSON Schema used to validate the resolved token claims when signing tokens for this issuer. + - name: policy + value: + kind: "{{ kind }}" + teamId: "{{ teamId }}" + projectId: "{{ projectId }}" + environments: + - "{{ environments }}" + tokenClaims: "{{ tokenClaims }}" + clientId: "{{ clientId }}" + - name: import_key + value: "{{ import_key }}" + description: | + The PEM-encoded private key to use for the issuer. + - name: import_key_id + value: "{{ import_key_id }}" + description: | + The key id to use as the imported key's JWT/JWKS \`kid\`. Only allowed when \`importKey\` is provided. Not required to be unique; the addressable key id is the server-minted \`keyId\` returned in the response. + - name: team_id + value: "{{ team_id }}" + description: The Team identifier to perform the request on behalf of. + description: The Team identifier to perform the request on behalf of. + - name: slug + value: "{{ slug }}" + description: The Team slug to perform the request on behalf of. + description: The Team slug to perform the request on behalf of. +`} + + + + + +## `UPDATE` examples + + + + +Update a KMS issuer's name or claims schema. + +```sql +UPDATE vercel.kms.issuers +SET +name = '{{ name }}', +claims_schema = '{{ claims_schema }}' +WHERE +issuer_id = '{{ issuer_id }}' --required +AND team_id = '{{ team_id}}' +AND slug = '{{ slug}}' +RETURNING +id, +name, +owner_id, +algorithm, +claims_schema, +created_at, +managed_by, +origin, +policies, +signing_keys, +updated_at; +``` + + + + +## `DELETE` examples + + + + +Delete a KMS issuer and its signing keys. + +```sql +DELETE FROM vercel.kms.issuers +WHERE issuer_id = '{{ issuer_id }}' --required +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + + + +## Lifecycle Methods + +EXEC variables use wire (API) names. + + + + +Sign a raw message with a KMS issuer's active signing key. Authenticate the request with a Vercel OIDC token in the `Authorization: Bearer` header; the issuer's policies decide which workloads are allowed to sign. + +```sql +EXEC vercel.kms.issuers.sign_message +@issuer_id='{{ issuer_id }}' --required +@@json= +'{ +"message": "{{ message }}" +}' +; +``` + + + +Sign a JWT with a KMS issuer's active signing key. Authenticate the request with a Vercel OIDC token in the `Authorization: Bearer` header; the issuer's policies decide which workloads are allowed to sign. + +```sql +EXEC vercel.kms.issuers.sign_token +@issuer_id='{{ issuer_id }}' --required +@@json= +'{ +"claims": "{{ claims }}", +"headers": "{{ headers }}", +"ttl": {{ ttl }} +}' +; +``` + + diff --git a/website/docs/services/kms/signing_keys/index.md b/website/docs/services/kms/signing_keys/index.md new file mode 100644 index 0000000..223a8fb --- /dev/null +++ b/website/docs/services/kms/signing_keys/index.md @@ -0,0 +1,253 @@ +--- +title: signing_keys +hide_title: false +hide_table_of_contents: false +keywords: + - signing_keys + - kms + - vercel + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a signing_keys resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + +`SELECT` not supported for this resource, use `SHOW METHODS` to view available operations for the resource. + + +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
issuer_idteam_id, slugCreate a new signing key for a KMS issuer. Depending on the activation mode, the key is activated automatically once its public key has propagated, or manually via the activate endpoint.
issuer_id, key_idteamId, slugActivate a pending signing key so the issuer starts signing with it.
issuer_id, key_idteamId, slugImmediately revoke a signing key that is already scheduled for revocation.
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringThe ID of the issuer.
stringThe ID of the signing key to revoke immediately. The key must already be scheduled for revocation.
stringThe Team slug to perform the request on behalf of.
stringThe Team identifier to perform the request on behalf of.
stringThe Team identifier to perform the request on behalf of. (wire: teamId)
+ +## `INSERT` examples + + + + +Create a new signing key for a KMS issuer. Depending on the activation mode, the key is activated automatically once its public key has propagated, or manually via the activate endpoint. + +```sql +INSERT INTO vercel.kms.signing_keys ( +activation, +revoke_previous_after_hours, +revoke_previous_at, +import_key, +import_key_id, +issuer_id, +team_id, +slug +) +SELECT +'{{ activation }}', +{{ revoke_previous_after_hours }}, +'{{ revoke_previous_at }}', +'{{ import_key }}', +'{{ import_key_id }}', +'{{ issuer_id }}', +'{{ team_id }}', +'{{ slug }}' +RETURNING +import_key_id, +issuer_id, +key_id, +activate_at, +activated_at, +algorithm, +certificate_pem, +created_at, +public_key, +public_key_fingerprint, +public_key_pem, +revoke_at, +status, +updated_at +; +``` + + + +{`# Description fields are for documentation purposes +- name: signing_keys + props: + - name: issuer_id + value: "{{ issuer_id }}" + description: Required parameter for the signing_keys resource. + - name: activation + value: "{{ activation }}" + description: | + Whether the new key is activated automatically after its public key has propagated, or manually via the activate endpoint. Defaults to \`automatic\`. + valid_values: ['automatic', 'manual'] + - name: revoke_previous_after_hours + value: {{ revoke_previous_after_hours }} + description: | + For automatic activation, how many hours after activation the previous signing key should stop being used. Defaults to a 1 hour grace period so already-issued tokens keep verifying. + - name: revoke_previous_at + value: "{{ revoke_previous_at }}" + description: | + Deprecated. The ISO date string or timestamp when the previous signing key should stop being used. Converted to a relative grace and applied at activation, not creation. Prefer revokePreviousAfterHours. + - name: import_key + value: "{{ import_key }}" + description: | + The PEM-encoded private key to use for the issuer. + - name: import_key_id + value: "{{ import_key_id }}" + description: | + The key id to use as the imported key's JWT/JWKS \`kid\`. Only allowed when \`importKey\` is provided. Not required to be unique; the addressable key id is the server-minted \`keyId\` returned in the response. + - name: team_id + value: "{{ team_id }}" + description: The Team identifier to perform the request on behalf of. + description: The Team identifier to perform the request on behalf of. + - name: slug + value: "{{ slug }}" + description: The Team slug to perform the request on behalf of. + description: The Team slug to perform the request on behalf of. +`} + + + + + +## Lifecycle Methods + +EXEC variables use wire (API) names. + + + + +Activate a pending signing key so the issuer starts signing with it. + +```sql +EXEC vercel.kms.signing_keys.activate +@issuer_id='{{ issuer_id }}' --required, +@key_id='{{ key_id }}' --required, +@teamId='{{ teamId }}', +@slug='{{ slug }}' +@@json= +'{ +"revokePreviousAfterHours": {{ revokePreviousAfterHours }} +}' +; +``` + + + +Immediately revoke a signing key that is already scheduled for revocation. + +```sql +EXEC vercel.kms.signing_keys.revoke +@issuer_id='{{ issuer_id }}' --required, +@key_id='{{ key_id }}' --required, +@teamId='{{ teamId }}', +@slug='{{ slug }}' +; +``` + + diff --git a/website/docs/services/log_drains/index.md b/website/docs/services/log_drains/index.md index 6c23ce2..05c2ba8 100644 --- a/website/docs/services/log_drains/index.md +++ b/website/docs/services/log_drains/index.md @@ -25,7 +25,7 @@ total resources: __2__ ## Resources
log_drains diff --git a/website/docs/services/log_drains/integrations/index.md b/website/docs/services/log_drains/integration_log_drains/index.md similarity index 56% rename from website/docs/services/log_drains/integrations/index.md rename to website/docs/services/log_drains/integration_log_drains/index.md index a70aa7a..8ab7fed 100644 --- a/website/docs/services/log_drains/integrations/index.md +++ b/website/docs/services/log_drains/integration_log_drains/index.md @@ -1,9 +1,9 @@ --- -title: integrations +title: integration_log_drains hide_title: false hide_table_of_contents: false keywords: - - integrations + - integration_log_drains - log_drains - vercel - infrastructure-as-code @@ -15,16 +15,17 @@ image: /img/stackql-vercel-provider-featured-image.png --- import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; -Creates, updates, deletes, gets or lists an integrations resource. +Creates, updates, deletes, gets or lists an integration_log_drains resource. ## Overview - + - +
Nameintegrations
Name
TypeResource
Id
Id
## Fields @@ -32,14 +33,12 @@ Creates, updates, deletes, gets or lists an integrations resource. The following fields are returned by `SELECT` queries: - - -A list of log drains + @@ -61,39 +60,49 @@ A list of log drains - + - + - + - + - + - + - - - + + + - + - + - + + + + + + - + - + - + + + + + + @@ -101,19 +110,19 @@ A list of log drains - - - + + + - - - + + + - - - + + + @@ -123,7 +132,7 @@ A list of log drains - +
The name of the log drain (example: My first log drain)
stringThe branch regexp of log drain (example: feature/*)The oauth2 client application id that created this log drain (example: oac_xRhY4LAB7yLhUADD69EvV7ct) (wire: clientId)
stringThe oauth2 client application id that created this log drain (example: oac_xRhY4LAB7yLhUADD69EvV7ct)The client configuration this log drain was created with (example: icfg_3bwCLgxL8qt5kjRLcv2Dit7F) (wire: configurationId)
stringThe client configuration this log drain was created with (example: icfg_cuwj0AdCdH3BwWT4LPijCC7t)The identifier of the team or user whose events will trigger the log drain (example: kr1PsOIzqEL5Xg6M4VZcZosf) (wire: ownerId)
numberA timestamp that tells you when the log drain was createdstring (example: AbCgVkqoxXeXCDWehVir51LHGrrcWL4mkYm14W6UBPWQeb) (wire: projectId)
stringWhether the log drain was created by an integration or by a user (example: integration)The branch regexp of log drain (example: feature/*)
numberA timestamp that tells you when the log drain was created (wire: createdAt)
stringThe delivery log format (example: json)Whether the log drain was created by an integration or by a user (integration, self-served) (example: integration) (wire: createdFrom)
stringThe environment of log drain (example: production)The delivery log format (json, ndjson, protobuf) (example: json) (wire: deliveryFormat)
arrayThe environment of log drain
The headers to send with the request (example: {"Authorization": "Bearer 123"})
stringThe identifier of the team or user whose events will trigger the log drain (example: kr1PsOIzqEL5Xg6M4VZcZosf)arrayThe identifier of the projects this log drain is associated with (example: AbCgVkqoxXeXCDWehVir51LHGrrcWL4mkYm14W6UBPWQeb) (wire: projectIds)
string (example: AbCgVkqoxXeXCDWehVir51LHGrrcWL4mkYm14W6UBPWQeb)numberThe sampling rate of log drain (wire: samplingRate)
arrayThe identifier of the projects this log drain is associated with (example: AbCgVkqoxXeXCDWehVir51LHGrrcWL4mkYm14W6UBPWQeb)
stringThe URL to call when logs are generated (example: https://example.com/log-drain)The URL to call when logs are generated (example: https:​//example.com/log-drain)
@@ -146,24 +155,24 @@ The following methods are available for this resource: - + - teamId + team_id, slug Retrieves a list of all Integration log drains that are defined for the authenticated user or team. When using an OAuth2 token, the list is limited to log drains created by the authenticated integration. - + - teamId, data__name, data__url - + name, url + team_id, slug Creates an Integration log drain. This endpoint must be called with an OAuth2 client (integration), since log drains are tied to integrations. If it is called with a different token type it will produce a 400 error. - + - id, teamId - updateFlow + id + team_id, slug Deletes the Integration log drain with the provided `id`. When using an OAuth2 Token, the log drain can be deleted only if the integration owns it. @@ -187,15 +196,15 @@ Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](# string ID of the log drain to be deleted - - + + string - The Team identifier or slug to perform the request on behalf of. + The Team slug to perform the request on behalf of. - - - boolean - If this API is being called as part of an update flow, this should be set to true + + + string + The Team identifier to perform the request on behalf of. (wire: teamId) @@ -203,12 +212,12 @@ Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](# ## `SELECT` examples - + Retrieves a list of all Integration log drains that are defined for the authenticated user or team. When using an OAuth2 token, the list is limited to log drains created by the authenticated integration. @@ -216,21 +225,24 @@ Retrieves a list of all Integration log drains that are defined for the authenti SELECT id, name, +client_id, +configuration_id, +owner_id, +project_id, branch, -clientId, -configurationId, -createdAt, -createdFrom, -deliveryFormat, -environment, +created_at, +created_from, +delivery_format, +environments, headers, -ownerId, -projectId, -projectIds, +project_ids, +sampling_rate, +source, sources, url -FROM vercel.log_drains.integrations -WHERE teamId = '{{ teamId }}' -- required +FROM vercel.log_drains.integration_log_drains +WHERE team_id = '{{ team_id }}' +AND slug = '{{ slug }}' ; ``` @@ -240,56 +252,56 @@ WHERE teamId = '{{ teamId }}' -- required ## `INSERT` examples - + Creates an Integration log drain. This endpoint must be called with an OAuth2 client (integration), since log drains are tied to integrations. If it is called with a different token type it will produce a 400 error. ```sql -INSERT INTO vercel.log_drains.integrations ( -data__name, -data__projectIds, -data__secret, -data__deliveryFormat, -data__url, -data__sources, -data__headers, -data__environment, -data__branch, -data__previousLogDrainId, -teamId +INSERT INTO vercel.log_drains.integration_log_drains ( +name, +project_ids, +secret, +delivery_format, +url, +sources, +headers, +environments, +team_id, +slug ) SELECT '{{ name }}' /* required */, -'{{ projectIds }}', +'{{ project_ids }}', '{{ secret }}', -'{{ deliveryFormat }}', +'{{ delivery_format }}', '{{ url }}' /* required */, '{{ sources }}', '{{ headers }}', -'{{ environment }}', -'{{ branch }}', -'{{ previousLogDrainId }}', -'{{ teamId }}' +'{{ environments }}', +'{{ team_id }}', +'{{ slug }}' RETURNING id, name, +client_id, +configuration_id, +owner_id, +project_id, branch, -clientId, -configurationId, -createdAt, -createdFrom, -deliveryFormat, -environment, +created_at, +created_from, +delivery_format, +environments, headers, -ownerId, -projectId, -projectIds, +project_ids, +sampling_rate, +source, sources, url ; @@ -297,52 +309,49 @@ url -```yaml -# Description fields are for documentation purposes -- name: integrations +{`# Description fields are for documentation purposes +- name: integration_log_drains props: - - name: teamId - value: string - description: Required parameter for the integrations resource. - name: name - value: string + value: "{{ name }}" description: | The name of the log drain - - name: projectIds - value: array + - name: project_ids + value: + - "{{ project_ids }}" - name: secret - value: string + value: "{{ secret }}" description: | A secret to sign log drain notification headers so a consumer can verify their authenticity - - name: deliveryFormat - value: string + - name: delivery_format + value: "{{ delivery_format }}" description: | The delivery log format - valid_values: ['json', 'ndjson', 'syslog'] + valid_values: ['json', 'ndjson'] - name: url - value: string + value: "{{ url }}" description: | - The url where you will receive logs. The protocol must be `https://` or `http://` when type is `json` and `ndjson`, and `syslog+tls:` or `syslog:` when the type is `syslog`. + The url where you will receive logs. The protocol must be \`https://\` or \`http://\` when type is \`json\` and \`ndjson\`. - name: sources - value: array + value: + - "{{ sources }}" - name: headers - value: object + value: "{{ headers }}" description: | Headers to be sent together with the request - - name: environment - value: string - description: | - The environment of log drain - valid_values: ['preview', 'production'] - - name: branch - value: string - description: | - The branch regexp of log drain - - name: previousLogDrainId - value: string - description: | - The id of the log drain that was previously created and deleted -``` + - name: environments + value: + - "{{ environments }}" + - name: team_id + value: "{{ team_id }}" + description: The Team identifier to perform the request on behalf of. + description: The Team identifier to perform the request on behalf of. + - name: slug + value: "{{ slug }}" + description: The Team slug to perform the request on behalf of. + description: The Team slug to perform the request on behalf of. +`} + @@ -350,20 +359,20 @@ url ## `DELETE` examples - + Deletes the Integration log drain with the provided `id`. When using an OAuth2 Token, the log drain can be deleted only if the integration owns it. ```sql -DELETE FROM vercel.log_drains.integrations +DELETE FROM vercel.log_drains.integration_log_drains WHERE id = '{{ id }}' --required -AND teamId = '{{ teamId }}' --required -AND updateFlow = '{{ updateFlow }}' +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' ; ``` diff --git a/website/docs/services/log_drains/log_drains/index.md b/website/docs/services/log_drains/log_drains/index.md index bd701bf..eb04d09 100644 --- a/website/docs/services/log_drains/log_drains/index.md +++ b/website/docs/services/log_drains/log_drains/index.md @@ -15,6 +15,7 @@ image: /img/stackql-vercel-provider-featured-image.png --- import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; @@ -22,7 +23,7 @@ Creates, updates, deletes, gets or lists a log_drains resource. ## Overview - +
Namelog_drains
Name
TypeResource
Id
@@ -32,13 +33,13 @@ Creates, updates, deletes, gets or lists a log_drains resource. The following fields are returned by `SELECT` queries: - + @@ -50,114 +51,44 @@ The following fields are returned by `SELECT` queries: - - - - - - + - - - - - - + - + - + - + - - - - - - + - + - + - + - - - - - - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - +
string
string
string (wire: clientId)
string (wire: configurationId)
string
number (wire: createdFrom)
string (wire: integrationConfigurationUri)
string
number (wire: integrationIcon)
string
string
string
number
object
string (wire: integrationWebsite)
array
string
array
string
string
string (wire: projectsMetadata)
- + @@ -169,109 +100,39 @@ The following fields are returned by `SELECT` queries: - + - + - + - + - + - + - + - + - + - + - - - - - - - - - - - + - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - +
string (wire: clientId)
string (wire: configurationId)
string (wire: createdFrom)
string (wire: integrationConfigurationUri)
string (wire: integrationIcon)
number
string
string
number (wire: integrationWebsite)
string
string
string
number
object
string
array
string
array
string
string
string (wire: projectsMetadata)
@@ -294,31 +155,31 @@ The following methods are available for this resource: - + - id, teamId - + id + team_id, slug Retrieves a Configurable Log Drain. This endpoint must be called with a team AccessToken (integration OAuth2 clients are not allowed). Only log drains owned by the authenticated team can be accessed. - + - teamId - projectId - Retrieves a list of Configurable Log Drains. This endpoint must be called with a team AccessToken (integration OAuth2 clients are not allowed). Only log drains owned by the authenticated team can be accessed. + + project_id, project_id_or_name, include_metadata, team_id, slug + Retrieves a list of all the Log Drains owned by the account. This endpoint must be called with an account AccessToken (integration OAuth2 clients are not allowed). Only log drains owned by the authenticated account can be accessed. - + - teamId, data__deliveryFormat, data__url, data__sources - + delivery_format, url, sources + team_id, slug Creates a configurable log drain. This endpoint must be called with a team AccessToken (integration OAuth2 clients are not allowed) - + - id, teamId - + id + team_id, slug Deletes a Configurable Log Drain. This endpoint must be called with a team AccessToken (integration OAuth2 clients are not allowed). Only log drains owned by the authenticated team can be deleted. @@ -340,17 +201,32 @@ Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](# string - ID of the log drain to be deleted. + - - + + + boolean + (wire: includeMetadata) + + + string - The Team identifier or slug to perform the request on behalf of. + (wire: projectId) - - + + string - + (wire: projectIdOrName) + + + + string + The Team slug to perform the request on behalf of. + + + + string + The Team identifier to perform the request on behalf of. (wire: teamId) @@ -358,75 +234,51 @@ Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](# ## `SELECT` examples - + Retrieves a Configurable Log Drain. This endpoint must be called with a team AccessToken (integration OAuth2 clients are not allowed). Only log drains owned by the authenticated team can be accessed. ```sql SELECT -id, -name, -branch, -clientId, -configurationId, -createdAt, -createdFrom, -deliveryFormat, -disabledAt, -disabledBy, -disabledReason, -environment, -firstErrorTimestamp, -headers, -ownerId, -projectIds, -secret, -sources, -status, -teamId, -url +client_id, +configuration_id, +created_from, +integration_configuration_uri, +integration_icon, +integration_website, +projects_metadata FROM vercel.log_drains.log_drains WHERE id = '{{ id }}' -- required -AND teamId = '{{ teamId }}' -- required +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' ; ``` - + -Retrieves a list of Configurable Log Drains. This endpoint must be called with a team AccessToken (integration OAuth2 clients are not allowed). Only log drains owned by the authenticated team can be accessed. +Retrieves a list of all the Log Drains owned by the account. This endpoint must be called with an account AccessToken (integration OAuth2 clients are not allowed). Only log drains owned by the authenticated account can be accessed. ```sql SELECT -id, -name, -branch, -clientId, -configurationId, -createdAt, -createdFrom, -deliveryFormat, -disabledAt, -disabledBy, -disabledReason, -environment, -firstErrorTimestamp, -headers, -ownerId, -projectIds, -secret, -sources, -status, -teamId, -url +client_id, +configuration_id, +created_from, +integration_configuration_uri, +integration_icon, +integration_website, +projects_metadata FROM vercel.log_drains.log_drains -WHERE teamId = '{{ teamId }}' -- required -AND projectId = '{{ projectId }}' +WHERE project_id = '{{ project_id }}' +AND project_id_or_name = '{{ project_id_or_name }}' +AND include_metadata = '{{ include_metadata }}' +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' ; ``` @@ -436,103 +288,94 @@ AND projectId = '{{ projectId }}' ## `INSERT` examples - + Creates a configurable log drain. This endpoint must be called with a team AccessToken (integration OAuth2 clients are not allowed) ```sql INSERT INTO vercel.log_drains.log_drains ( -data__deliveryFormat, -data__url, -data__headers, -data__projectIds, -data__sources, -data__environment, -data__branch, -data__secret, -teamId +delivery_format, +url, +headers, +project_ids, +sources, +environments, +secret, +sampling_rate, +name, +team_id, +slug ) SELECT -'{{ deliveryFormat }}' /* required */, +'{{ delivery_format }}' /* required */, '{{ url }}' /* required */, '{{ headers }}', -'{{ projectIds }}', +'{{ project_ids }}', '{{ sources }}' /* required */, -'{{ environment }}', -'{{ branch }}', +'{{ environments }}', '{{ secret }}', -'{{ teamId }}' -RETURNING -id, -name, -branch, -clientId, -configurationId, -createdAt, -createdFrom, -deliveryFormat, -disabledAt, -disabledBy, -disabledReason, -environment, -firstErrorTimestamp, -headers, -ownerId, -projectIds, -secret, -sources, -status, -teamId, -url +{{ sampling_rate }}, +'{{ name }}', +'{{ team_id }}', +'{{ slug }}' ; ``` -```yaml -# Description fields are for documentation purposes +{`# Description fields are for documentation purposes - name: log_drains props: - - name: teamId - value: string - description: Required parameter for the log_drains resource. - - name: deliveryFormat - value: string + - name: delivery_format + value: "{{ delivery_format }}" description: | The delivery log format valid_values: ['json', 'ndjson'] - name: url - value: string + value: "{{ url }}" description: | The log drain url - name: headers - value: object + value: "{{ headers }}" description: | Headers to be sent together with the request - - name: projectIds - value: array + - name: project_ids + value: + - "{{ project_ids }}" - name: sources - value: array - - name: environment - value: string - description: | - The environment of log drain - valid_values: ['preview', 'production'] - - name: branch - value: string - description: | - The branch regexp of log drain + value: + - "{{ sources }}" + - name: environments + value: + - "{{ environments }}" - name: secret - value: string + value: "{{ secret }}" description: | Custom secret of log drain -``` + - name: sampling_rate + value: {{ sampling_rate }} + description: | + The sampling rate for this log drain. It should be a percentage rate between 0 and 100. With max 2 decimal points + - name: name + value: "{{ name }}" + description: | + The custom name of this log drain. + - name: team_id + value: "{{ team_id }}" + description: The Team identifier to perform the request on behalf of. + description: The Team identifier to perform the request on behalf of. + - name: slug + value: "{{ slug }}" + description: The Team slug to perform the request on behalf of. + description: The Team slug to perform the request on behalf of. +`} + @@ -540,19 +383,20 @@ url ## `DELETE` examples - + Deletes a Configurable Log Drain. This endpoint must be called with a team AccessToken (integration OAuth2 clients are not allowed). Only log drains owned by the authenticated team can be deleted. ```sql DELETE FROM vercel.log_drains.log_drains WHERE id = '{{ id }}' --required -AND teamId = '{{ teamId }}' --required +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' ; ``` diff --git a/website/docs/services/domains/status/index.md b/website/docs/services/marketplace/account_info/index.md similarity index 53% rename from website/docs/services/domains/status/index.md rename to website/docs/services/marketplace/account_info/index.md index 3009b38..9f6d69e 100644 --- a/website/docs/services/domains/status/index.md +++ b/website/docs/services/marketplace/account_info/index.md @@ -1,10 +1,10 @@ --- -title: status +title: account_info hide_title: false hide_table_of_contents: false keywords: - - status - - domains + - account_info + - marketplace - vercel - infrastructure-as-code - configuration-as-data @@ -15,16 +15,17 @@ image: /img/stackql-vercel-provider-featured-image.png --- import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; -Creates, updates, deletes, gets or lists a status resource. +Creates, updates, deletes, gets or lists an account_info resource. ## Overview - + - +
Namestatus
Name
TypeResource
Id
Id
## Fields @@ -32,14 +33,12 @@ Creates, updates, deletes, gets or lists a status resource. The following fields are returned by `SELECT` queries: - - -Successful response checking if a Domain's name is available. + @@ -51,9 +50,19 @@ Successful response checking if a Domain's name is available. - - - + + + + + + + + + + + + +
booleanstringThe name of the team the installation is tied to.
objectThe best contact for the integration, which can change as team members and their roles change.
stringA URL linking to the installation in the Vercel Dashboard.
@@ -76,11 +85,11 @@ The following methods are available for this resource: - + - name, teamId + integration_configuration_id - Check if a domain name is available for purchase. + Fetches the best account or user’s contact info @@ -98,15 +107,10 @@ Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](# - - + + string - The name of the domain for which we would like to check the status. - - - - string - The Team identifier or slug to perform the request on behalf of. + @@ -114,21 +118,22 @@ Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](# ## `SELECT` examples - + -Check if a domain name is available for purchase. +Fetches the best account or user’s contact info ```sql SELECT -available -FROM vercel.domains.status -WHERE name = '{{ name }}' -- required -AND teamId = '{{ teamId }}' -- required +name, +contact, +url +FROM vercel.marketplace.account_info +WHERE integration_configuration_id = '{{ integration_configuration_id }}' -- required ; ``` diff --git a/website/docs/services/marketplace/billing/index.md b/website/docs/services/marketplace/billing/index.md new file mode 100644 index 0000000..176e02b --- /dev/null +++ b/website/docs/services/marketplace/billing/index.md @@ -0,0 +1,135 @@ +--- +title: billing +hide_title: false +hide_table_of_contents: false +keywords: + - billing + - marketplace + - vercel + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a billing resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + +`SELECT` not supported for this resource, use `SHOW METHODS` to view available operations for the resource. + + +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
integration_configuration_id, timestamp, eod, period, billing, usageSends the billing and usage data. The partner should do this at least once a day and ideally once per hour. <br /> Use the `credentials.access_token` we provided in the [Upsert Installation](#upsert-installation) body to authorize this request.
integration_configuration_id, timestamp, balancesSends the prepayment balances. The partner should do this at least once a day and ideally once per hour. <br /> Use the `credentials.access_token` we provided in the [Upsert Installation](#upsert-installation) body to authorize this request.
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string
+ +## Lifecycle Methods + +EXEC variables use wire (API) names. + + + + +Sends the billing and usage data. The partner should do this at least once a day and ideally once per hour. <br /> Use the `credentials.access_token` we provided in the [Upsert Installation](#upsert-installation) body to authorize this request. + +```sql +EXEC vercel.marketplace.billing.submit +@integration_configuration_id='{{ integration_configuration_id }}' --required +@@json= +'{ +"timestamp": "{{ timestamp }}", +"eod": "{{ eod }}", +"period": "{{ period }}", +"billing": "{{ billing }}", +"usage": "{{ usage }}" +}' +; +``` + + + +Sends the prepayment balances. The partner should do this at least once a day and ideally once per hour. <br /> Use the `credentials.access_token` we provided in the [Upsert Installation](#upsert-installation) body to authorize this request. + +```sql +EXEC vercel.marketplace.billing.submit_prepayment_balances +@integration_configuration_id='{{ integration_configuration_id }}' --required +@@json= +'{ +"timestamp": "{{ timestamp }}", +"balances": "{{ balances }}" +}' +; +``` + + diff --git a/website/docs/services/marketplace/events/index.md b/website/docs/services/marketplace/events/index.md new file mode 100644 index 0000000..81d35ed --- /dev/null +++ b/website/docs/services/marketplace/events/index.md @@ -0,0 +1,125 @@ +--- +title: events +hide_title: false +hide_table_of_contents: false +keywords: + - events + - marketplace + - vercel + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists an events resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + +`SELECT` not supported for this resource, use `SHOW METHODS` to view available operations for the resource. + + +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
integration_configuration_id, eventPartner notifies Vercel of any changes made to an Installation or a Resource. Vercel is expected to use `list-resources` and other read APIs to get the new state.<br /> <br /> `resource.updated` event should be dispatched when any state of a resource linked to Vercel is modified by the partner.<br /> `installation.updated` event should be dispatched when an installation's billing plan is changed via the provider instead of Vercel.<br /> <br /> Resource update use cases: <br /> <br /> - The user renames a database in the partner’s application. The partner should dispatch a `resource.updated` event to notify Vercel to update the resource in Vercel’s datastores.<br /> - A resource has been suspended due to a lack of use. The partner should dispatch a `resource.updated` event to notify Vercel to update the resource's status in Vercel's datastores.<br />
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string
+ +## `INSERT` examples + + + + +Partner notifies Vercel of any changes made to an Installation or a Resource. Vercel is expected to use `list-resources` and other read APIs to get the new state.<br /> <br /> `resource.updated` event should be dispatched when any state of a resource linked to Vercel is modified by the partner.<br /> `installation.updated` event should be dispatched when an installation's billing plan is changed via the provider instead of Vercel.<br /> <br /> Resource update use cases: <br /> <br /> - The user renames a database in the partner’s application. The partner should dispatch a `resource.updated` event to notify Vercel to update the resource in Vercel’s datastores.<br /> - A resource has been suspended due to a lack of use. The partner should dispatch a `resource.updated` event to notify Vercel to update the resource's status in Vercel's datastores.<br /> + +```sql +INSERT INTO vercel.marketplace.events ( +event, +integration_configuration_id +) +SELECT +'{{ event }}' /* required */, +'{{ integration_configuration_id }}' +; +``` + + + +{`# Description fields are for documentation purposes +- name: events + props: + - name: integration_configuration_id + value: "{{ integration_configuration_id }}" + description: Required parameter for the events resource. + - name: event + value: + type: "{{ type }}" + billingPlanId: "{{ billingPlanId }}" + productId: "{{ productId }}" + resourceId: "{{ resourceId }}" +`} + + + diff --git a/website/docs/services/marketplace/experimentation_edge_config/index.md b/website/docs/services/marketplace/experimentation_edge_config/index.md new file mode 100644 index 0000000..c5ddd9a --- /dev/null +++ b/website/docs/services/marketplace/experimentation_edge_config/index.md @@ -0,0 +1,168 @@ +--- +title: experimentation_edge_config +hide_title: false +hide_table_of_contents: false +keywords: + - experimentation_edge_config + - marketplace + - vercel + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists an experimentation_edge_config resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + +The Global Config data + + + + + + + + + + + +
NameDatatypeDescription
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
integration_configuration_id, resource_idWhen the user enabled Global Config syncing, then this endpoint can be used by the partner to fetch the contents of the Global Config.
integration_configuration_id, resource_id, dataWhen the user enabled Global Config syncing, then this endpoint can be used by the partner to push their configuration data into the relevant Global Config.
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string
string
+ +## `SELECT` examples + + + + +When the user enabled Global Config syncing, then this endpoint can be used by the partner to fetch the contents of the Global Config. + +```sql +SELECT +* +FROM vercel.marketplace.experimentation_edge_config +WHERE integration_configuration_id = '{{ integration_configuration_id }}' -- required +AND resource_id = '{{ resource_id }}' -- required +; +``` + + + + +## `REPLACE` examples + + + + +When the user enabled Global Config syncing, then this endpoint can be used by the partner to push their configuration data into the relevant Global Config. + +```sql +REPLACE vercel.marketplace.experimentation_edge_config +SET +data = '{{ data }}' +WHERE +integration_configuration_id = '{{ integration_configuration_id }}' --required +AND resource_id = '{{ resource_id }}' --required +AND data = '{{ data }}' --required +RETURNING +digest, +items, +purpose, +updated_at; +``` + + diff --git a/website/docs/services/marketplace/experimentation_items/index.md b/website/docs/services/marketplace/experimentation_items/index.md new file mode 100644 index 0000000..d73ae08 --- /dev/null +++ b/website/docs/services/marketplace/experimentation_items/index.md @@ -0,0 +1,216 @@ +--- +title: experimentation_items +hide_title: false +hide_table_of_contents: false +keywords: + - experimentation_items + - marketplace + - vercel + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists an experimentation_items resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + +`SELECT` not supported for this resource, use `SHOW METHODS` to view available operations for the resource. + + +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
integration_configuration_id, resource_id, itemsCreate one or multiple experimentation items
integration_configuration_id, resource_id, item_id, slug, originPatch an existing experimentation item
integration_configuration_id, resource_id, item_idDelete an existing experimentation item
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string
string
string
+ +## `INSERT` examples + + + + +Create one or multiple experimentation items + +```sql +INSERT INTO vercel.marketplace.experimentation_items ( +items, +integration_configuration_id, +resource_id +) +SELECT +'{{ items }}' /* required */, +'{{ integration_configuration_id }}', +'{{ resource_id }}' +; +``` + + + +{`# Description fields are for documentation purposes +- name: experimentation_items + props: + - name: integration_configuration_id + value: "{{ integration_configuration_id }}" + description: Required parameter for the experimentation_items resource. + - name: resource_id + value: "{{ resource_id }}" + description: Required parameter for the experimentation_items resource. + - name: items + value: + - id: "{{ id }}" + slug: "{{ slug }}" + origin: "{{ origin }}" + category: "{{ category }}" + name: "{{ name }}" + description: "{{ description }}" + isArchived: {{ isArchived }} + createdAt: {{ createdAt }} + updatedAt: {{ updatedAt }} +`} + + + + + +## `UPDATE` examples + + + + +Patch an existing experimentation item + +```sql +UPDATE vercel.marketplace.experimentation_items +SET +slug = '{{ slug }}', +origin = '{{ origin }}', +name = '{{ name }}', +category = '{{ category }}', +description = '{{ description }}', +is_archived = {{ is_archived }}, +created_at = {{ created_at }}, +updated_at = {{ updated_at }} +WHERE +integration_configuration_id = '{{ integration_configuration_id }}' --required +AND resource_id = '{{ resource_id }}' --required +AND item_id = '{{ item_id }}' --required +AND slug = '{{ slug }}' --required +AND origin = '{{ origin }}' --required; +``` + + + + +## `DELETE` examples + + + + +Delete an existing experimentation item + +```sql +DELETE FROM vercel.marketplace.experimentation_items +WHERE integration_configuration_id = '{{ integration_configuration_id }}' --required +AND resource_id = '{{ resource_id }}' --required +AND item_id = '{{ item_id }}' --required +; +``` + + diff --git a/website/docs/services/marketplace/index.md b/website/docs/services/marketplace/index.md new file mode 100644 index 0000000..043bc38 --- /dev/null +++ b/website/docs/services/marketplace/index.md @@ -0,0 +1,41 @@ +--- +title: marketplace +hide_title: false +hide_table_of_contents: false +keywords: + - marketplace + - vercel + - stackql + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +marketplace service documentation. + +:::info[Service Summary] + +total resources: __10__ + +::: + +## Resources + \ No newline at end of file diff --git a/website/docs/services/marketplace/installations/index.md b/website/docs/services/marketplace/installations/index.md new file mode 100644 index 0000000..2abf822 --- /dev/null +++ b/website/docs/services/marketplace/installations/index.md @@ -0,0 +1,184 @@ +--- +title: installations +hide_title: false +hide_table_of_contents: false +keywords: + - installations + - marketplace + - vercel + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists an installations resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + +`SELECT` not supported for this resource, use `SHOW METHODS` to view available operations for the resource. + + +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
integration_configuration_idThis endpoint updates an integration installation.
integration_configuration_id, client_secretIssues a replacement access token for an installation, so a partner can rotate a credential it believes is compromised without the customer having to reinstall. Authenticated by the credential being replaced plus the integration's client secret: a leaked access token on its own cannot rotate itself, which would otherwise let an attacker take over the installation and lock the partner out. The previous credential intentionally stays valid so in-flight requests keep working. Retiring it is a separate, explicit operation — a partner is never left mid-rotation without a working credential.
integration_configuration_id, token, client_secretRetires a superseded installation credential, so a partner can complete a rotation it started with `POST /credentials/rotate` — the leaked credential stops working without the customer having to reinstall. Authenticated by a live installation credential plus the integration's client secret. The credential to retire is named in the body rather than being the one that authenticates, so the ordinary flow is: rotate, store the replacement, then authenticate with the replacement and revoke the old one. Refuses to retire an installation's last live credential. Rotation exists so remediation is not customer-visible; revoking the only credential would undo that and leave the install needing a reinstall.
integration_configuration_idThis endpoint allows the partner to mark an installation as finalized. This means you will not send any more invoices for the installation. Use this after a customer has requested uninstall and you have sent any remaining invoices. This will allow the uninstall process to proceed immediately after all invoices have been paid. <br /> Use the `credentials.access_token` we provided in the [Upsert Installation](#upsert-installation) body to authorize this request.
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string
+ +## `UPDATE` examples + + + + +This endpoint updates an integration installation. + +```sql +UPDATE vercel.marketplace.installations +SET +status = '{{ status }}', +external_id = '{{ external_id }}', +billing_plan = '{{ billing_plan }}', +notification = '{{ notification }}' +WHERE +integration_configuration_id = '{{ integration_configuration_id }}' --required; +``` + + + + +## Lifecycle Methods + +EXEC variables use wire (API) names. + + + + +Issues a replacement access token for an installation, so a partner can rotate a credential it believes is compromised without the customer having to reinstall. Authenticated by the credential being replaced plus the integration's client secret: a leaked access token on its own cannot rotate itself, which would otherwise let an attacker take over the installation and lock the partner out. The previous credential intentionally stays valid so in-flight requests keep working. Retiring it is a separate, explicit operation — a partner is never left mid-rotation without a working credential. + +```sql +EXEC vercel.marketplace.installations.rotate_credential +@integration_configuration_id='{{ integration_configuration_id }}' --required +@@json= +'{ +"client_secret": "{{ client_secret }}", +"client_id": "{{ client_id }}" +}' +; +``` + + + +Retires a superseded installation credential, so a partner can complete a rotation it started with `POST /credentials/rotate` — the leaked credential stops working without the customer having to reinstall. Authenticated by a live installation credential plus the integration's client secret. The credential to retire is named in the body rather than being the one that authenticates, so the ordinary flow is: rotate, store the replacement, then authenticate with the replacement and revoke the old one. Refuses to retire an installation's last live credential. Rotation exists so remediation is not customer-visible; revoking the only credential would undo that and leave the install needing a reinstall. + +```sql +EXEC vercel.marketplace.installations.revoke_credential +@integration_configuration_id='{{ integration_configuration_id }}' --required +@@json= +'{ +"token": "{{ token }}", +"client_secret": "{{ client_secret }}", +"client_id": "{{ client_id }}" +}' +; +``` + + + +This endpoint allows the partner to mark an installation as finalized. This means you will not send any more invoices for the installation. Use this after a customer has requested uninstall and you have sent any remaining invoices. This will allow the uninstall process to proceed immediately after all invoices have been paid. <br /> Use the `credentials.access_token` we provided in the [Upsert Installation](#upsert-installation) body to authorize this request. + +```sql +EXEC vercel.marketplace.installations.finalize +@integration_configuration_id='{{ integration_configuration_id }}' --required +; +``` + + diff --git a/website/docs/services/marketplace/invoices/index.md b/website/docs/services/marketplace/invoices/index.md new file mode 100644 index 0000000..0703194 --- /dev/null +++ b/website/docs/services/marketplace/invoices/index.md @@ -0,0 +1,379 @@ +--- +title: invoices +hide_title: false +hide_table_of_contents: false +keywords: + - invoices + - marketplace + - vercel + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists an invoices resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringPartner-supplied Invoice ID, if applicable. (wire: externalId)
stringVercel Marketplace Invoice ID. (wire: invoiceId)
stringSystem creation date. ISO 8601 timestamp.
arrayInvoice discounts.
stringInvoice date. ISO 8601 timestamp. (wire: invoiceDate)
stringUser-readable invoice number. (wire: invoiceNumber)
arrayInvoice items.
stringAdditional memo for the invoice.
stringMoment the invoice was paid. ISO 8601 timestamp. (wire: paidAt)
objectSubscription period for this billing cycle. ISO 8601 timestamps.
stringThe reason for refund. Only applicable for states "refunded" or "refund_request". (wire: refundReason)
stringRefund amount. Only applicable for states "refunded" or "refund_request". A dollar-based decimal string. (wire: refundTotal)
stringMost recent moment the invoice was refunded. ISO 8601 timestamp. (wire: refundedAt)
stringInvoice state. (draft, invoiced, notpaid, overdue, paid, pending, refund_requested, refunded, scheduled)
booleanWhether the invoice is in the testmode (no real transaction created). (false, true)
stringInvoice total amount. A dollar-based decimal string.
stringSystem update date. ISO 8601 timestamp.
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
integration_configuration_id, invoice_idGet Invoice details and status for a given invoice ID.<br /> <br /> See [Billing Events with Webhooks documentation](https:​//vercel.com/docs/integrations/create-integration/marketplace-api#working-with-billing-events-through-webhooks) on how to receive invoice events. This endpoint is used to retrieve the invoice details.
integration_configuration_id, invoice_date, period, itemsThis endpoint allows the partner to submit an invoice to Vercel. The invoice is created in Vercel's billing system and sent to the customer. Depending on the type of billing plan, the invoice can be sent at a time of signup, at the start of the billing period, or at the end of the billing period.<br /> <br /> Use the `credentials.access_token` we provided in the [Upsert Installation](#upsert-installation) body to authorize this request. <br /> There are several limitations to the invoice submission:<br /> <br /> 1. A resource can only be billed once per the billing period and the billing plan.<br /> 2. The billing plan used to bill the resource must have been active for this resource during the billing period.<br /> 3. The billing plan used must be a subscription plan.<br /> 4. The interim usage data must be sent hourly for all types of subscriptions. See [Send subscription billing and usage data](#send-subscription-billing-and-usage-data) API on how to send interim billing and usage data.<br /> 5. If provided, `externalId` must be unique for the installation.<br />
integration_configuration_id, invoice_id, action, reason, totalThis endpoint allows the partner to request a refund for an invoice to Vercel. The invoice is created using the [Submit Invoice API](#submit-invoice-api).
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string
string
+ +## `SELECT` examples + + + + +Get Invoice details and status for a given invoice ID.<br /> <br /> See [Billing Events with Webhooks documentation](https:​//vercel.com/docs/integrations/create-integration/marketplace-api#working-with-billing-events-through-webhooks) on how to receive invoice events. This endpoint is used to retrieve the invoice details. + +```sql +SELECT +external_id, +invoice_id, +created, +discounts, +invoice_date, +invoice_number, +items, +memo, +paid_at, +period, +refund_reason, +refund_total, +refunded_at, +state, +test, +total, +updated +FROM vercel.marketplace.invoices +WHERE integration_configuration_id = '{{ integration_configuration_id }}' -- required +AND invoice_id = '{{ invoice_id }}' -- required +; +``` + + + + +## `INSERT` examples + + + + +This endpoint allows the partner to submit an invoice to Vercel. The invoice is created in Vercel's billing system and sent to the customer. Depending on the type of billing plan, the invoice can be sent at a time of signup, at the start of the billing period, or at the end of the billing period.<br /> <br /> Use the `credentials.access_token` we provided in the [Upsert Installation](#upsert-installation) body to authorize this request. <br /> There are several limitations to the invoice submission:<br /> <br /> 1. A resource can only be billed once per the billing period and the billing plan.<br /> 2. The billing plan used to bill the resource must have been active for this resource during the billing period.<br /> 3. The billing plan used must be a subscription plan.<br /> 4. The interim usage data must be sent hourly for all types of subscriptions. See [Send subscription billing and usage data](#send-subscription-billing-and-usage-data) API on how to send interim billing and usage data.<br /> 5. If provided, `externalId` must be unique for the installation.<br /> + +```sql +INSERT INTO vercel.marketplace.invoices ( +external_id, +invoice_date, +memo, +period, +items, +discounts, +final, +test, +integration_configuration_id +) +SELECT +'{{ external_id }}', +'{{ invoice_date }}' /* required */, +'{{ memo }}', +'{{ period }}' /* required */, +'{{ items }}' /* required */, +'{{ discounts }}', +{{ final }}, +'{{ test }}', +'{{ integration_configuration_id }}' +RETURNING +invoice_id, +test, +validation_errors +; +``` + + + +{`# Description fields are for documentation purposes +- name: invoices + props: + - name: integration_configuration_id + value: "{{ integration_configuration_id }}" + description: Required parameter for the invoices resource. + - name: external_id + value: "{{ external_id }}" + description: | + Partner-provided invoice identifier. If provided, it must be unique for this installation. + - name: invoice_date + value: "{{ invoice_date }}" + description: | + Invoice date. Must be within the period's start and end. + - name: memo + value: "{{ memo }}" + description: | + Additional memo for the invoice. + - name: period + description: | + Subscription period for this billing cycle. + value: + start: "{{ start }}" + end: "{{ end }}" + - name: items + value: + - resourceId: "{{ resourceId }}" + billingPlanId: "{{ billingPlanId }}" + start: "{{ start }}" + end: "{{ end }}" + name: "{{ name }}" + details: "{{ details }}" + price: "{{ price }}" + quantity: {{ quantity }} + units: "{{ units }}" + total: "{{ total }}" + - name: discounts + value: + - resourceId: "{{ resourceId }}" + billingPlanId: "{{ billingPlanId }}" + start: "{{ start }}" + end: "{{ end }}" + name: "{{ name }}" + details: "{{ details }}" + amount: "{{ amount }}" + - name: final + value: {{ final }} + description: | + Set this to \`true\` if this is the final invoice for the installation. Can only be set when the installation is pending deletion. + - name: test + description: | + Test mode + value: + validate: {{ validate }} + result: "{{ result }}" +`} + + + + + +## Lifecycle Methods + +EXEC variables use wire (API) names. + + + + +This endpoint allows the partner to request a refund for an invoice to Vercel. The invoice is created using the [Submit Invoice API](#submit-invoice-api). + +```sql +EXEC vercel.marketplace.invoices.update +@integration_configuration_id='{{ integration_configuration_id }}' --required, +@invoice_id='{{ invoice_id }}' --required +@@json= +'{ +"action": "{{ action }}", +"reason": "{{ reason }}", +"total": "{{ total }}" +}' +; +``` + + diff --git a/website/docs/services/marketplace/members/index.md b/website/docs/services/marketplace/members/index.md new file mode 100644 index 0000000..04b56fc --- /dev/null +++ b/website/docs/services/marketplace/members/index.md @@ -0,0 +1,152 @@ +--- +title: members +hide_title: false +hide_table_of_contents: false +keywords: + - members + - marketplace + - vercel + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a members resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string
string (wire: globalUserId)
string"The `ADMIN` role, by default, is provided to users capable of installing integrations, while the `USER` role can be granted to Vercel users with the Vercel `Billing` or Vercel `Viewer` role, which are considered to be Read-Only roles." (ADMIN, USER)
string (wire: userEmail)
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
integration_configuration_id, member_idReturns the member role and other information for a given member ID ("user_id" claim in the SSO OIDC token).
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string
string
+ +## `SELECT` examples + + + + +Returns the member role and other information for a given member ID ("user_id" claim in the SSO OIDC token). + +```sql +SELECT +id, +global_user_id, +role, +user_email +FROM vercel.marketplace.members +WHERE integration_configuration_id = '{{ integration_configuration_id }}' -- required +AND member_id = '{{ member_id }}' -- required +; +``` + + diff --git a/website/docs/services/marketplace/resources/index.md b/website/docs/services/marketplace/resources/index.md new file mode 100644 index 0000000..baeb2c4 --- /dev/null +++ b/website/docs/services/marketplace/resources/index.md @@ -0,0 +1,449 @@ +--- +title: resources +hide_title: false +hide_table_of_contents: false +keywords: + - resources + - marketplace + - vercel + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a resources resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringThe ID provided by the 3rd party provider for the given resource
stringThe name of the resource as it is recorded in Vercel
stringThe ID of the billing plan the resource is subscribed to, if applicable (wire: billingPlanId)
stringThe ID assigned by Vercel for the given resource (wire: internalId)
stringThe ID of the product the resource is derived from (wire: productId)
objectThe configured metadata for the resource as defined by its product's Metadata Schema
objectThe notification, if set, displayed to the user when viewing the resource in Vercel
objectAny settings provided for the resource to support its product's protocols (wire: protocolSettings)
stringThe current status of the resource (error, onboarding, pending, ready, resumed, suspended, uninstalled)
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringThe name of the resource as it is recorded in Vercel
stringThe ID of the billing plan the resource is subscribed to, if applicable (wire: billingPlanId)
stringThe ID assigned by Vercel for the given resource (wire: internalId)
stringThe ID provided by the partner for the given resource (wire: partnerId)
stringThe ID of the product the resource is derived from (wire: productId)
objectThe configured metadata for the resource as defined by its product's Metadata Schema
objectThe notification, if set, displayed to the user when viewing the resource in Vercel
objectAny settings provided for the resource to support its product's protocols (wire: protocolSettings)
stringThe current status of the resource (error, onboarding, pending, ready, resumed, suspended, uninstalled)
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
integration_configuration_id, resource_idGet a resource by its partner ID.
integration_configuration_idGet all resources for a given installation ID.
integration_configuration_id, resource_idThis endpoint updates an existing resource in the installation. All parameters are optional, allowing partial updates.
integration_configuration_id, resource_id, product_id, name, statusThis endpoint imports (upserts) a resource to Vercel's installation. This may be needed if resources can be independently created on the partner's side and need to be synchronized to Vercel. When importing as part of the user-initiated import flow, call this endpoint before redirecting the user back to Vercel. See the [Import existing resources flow](https:​//vercel.com/docs/integrations/create-integration/marketplace-flows#import-existing-resources-flow) for the full contract.
integration_configuration_id, resource_idDelete a resource owned by the selected installation ID.
integration_configuration_id, integration_product_id_or_slug, resource_id, secretsThis endpoint is deprecated and replaced with the endpoint [Update Resource Secrets](#update-resource-secrets). <br /> This endpoint updates the secrets of a resource. If a resource has projects connected, the connected secrets are updated with the new secrets. The old secrets may still be used by existing connected projects because they are not automatically redeployed. Redeployment is a manual action and must be completed by the user. All new project connections will use the new secrets.<br /> <br /> Use cases for this endpoint:<br /> <br /> - Resetting the credentials of a database in the partner. If the user requests the credentials to be updated in the partner’s application, the partner post the new set of secrets to Vercel, the user should redeploy their application and the expire the old credentials.<br />
integration_configuration_id, resource_id, secretsThis endpoint updates the secrets of a resource. If a resource has projects connected, the connected secrets are updated with the new secrets. The old secrets may still be used by existing connected projects because they are not automatically redeployed. Redeployment is a manual action and must be completed by the user. All new project connections will use the new secrets.<br /> <br /> Use cases for this endpoint:<br /> <br /> - Resetting the credentials of a database in the partner. If the user requests the credentials to be updated in the partner’s application, the partner post the new set of secrets to Vercel, the user should redeploy their application and the expire the old credentials.<br />
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string
string
string
+ +## `SELECT` examples + + + + +Get a resource by its partner ID. + +```sql +SELECT +id, +name, +billing_plan_id, +internal_id, +product_id, +metadata, +notification, +protocol_settings, +status +FROM vercel.marketplace.resources +WHERE integration_configuration_id = '{{ integration_configuration_id }}' -- required +AND resource_id = '{{ resource_id }}' -- required +; +``` + + + +Get all resources for a given installation ID. + +```sql +SELECT +name, +billing_plan_id, +internal_id, +partner_id, +product_id, +metadata, +notification, +protocol_settings, +status +FROM vercel.marketplace.resources +WHERE integration_configuration_id = '{{ integration_configuration_id }}' -- required +; +``` + + + + +## `UPDATE` examples + + + + +This endpoint updates an existing resource in the installation. All parameters are optional, allowing partial updates. + +```sql +UPDATE vercel.marketplace.resources +SET +ownership = '{{ ownership }}', +name = '{{ name }}', +status = '{{ status }}', +metadata = '{{ metadata }}', +billing_plan = '{{ billing_plan }}', +notification = '{{ notification }}', +extras = '{{ extras }}', +secrets = '{{ secrets }}' +WHERE +integration_configuration_id = '{{ integration_configuration_id }}' --required +AND resource_id = '{{ resource_id }}' --required +RETURNING +name; +``` + + + + +## `REPLACE` examples + + + + +This endpoint imports (upserts) a resource to Vercel's installation. This may be needed if resources can be independently created on the partner's side and need to be synchronized to Vercel. When importing as part of the user-initiated import flow, call this endpoint before redirecting the user back to Vercel. See the [Import existing resources flow](https://vercel.com/docs/integrations/create-integration/marketplace-flows#import-existing-resources-flow) for the full contract. + +```sql +REPLACE vercel.marketplace.resources +SET +ownership = '{{ ownership }}', +product_id = '{{ product_id }}', +name = '{{ name }}', +status = '{{ status }}', +metadata = '{{ metadata }}', +billing_plan = '{{ billing_plan }}', +notification = '{{ notification }}', +extras = '{{ extras }}', +secrets = '{{ secrets }}' +WHERE +integration_configuration_id = '{{ integration_configuration_id }}' --required +AND resource_id = '{{ resource_id }}' --required +AND product_id = '{{ product_id }}' --required +AND name = '{{ name }}' --required +AND status = '{{ status }}' --required +RETURNING +name; +``` + + + + +## `DELETE` examples + + + + +Delete a resource owned by the selected installation ID. + +```sql +DELETE FROM vercel.marketplace.resources +WHERE integration_configuration_id = '{{ integration_configuration_id }}' --required +AND resource_id = '{{ resource_id }}' --required +; +``` + + + + +## Lifecycle Methods + +EXEC variables use wire (API) names. + + + + +This endpoint is deprecated and replaced with the endpoint [Update Resource Secrets](#update-resource-secrets). <br /> This endpoint updates the secrets of a resource. If a resource has projects connected, the connected secrets are updated with the new secrets. The old secrets may still be used by existing connected projects because they are not automatically redeployed. Redeployment is a manual action and must be completed by the user. All new project connections will use the new secrets.<br /> <br /> Use cases for this endpoint:<br /> <br /> - Resetting the credentials of a database in the partner. If the user requests the credentials to be updated in the partner’s application, the partner post the new set of secrets to Vercel, the user should redeploy their application and the expire the old credentials.<br /> + +```sql +EXEC vercel.marketplace.resources.update_secrets +@integration_configuration_id='{{ integration_configuration_id }}' --required, +@integration_product_id_or_slug='{{ integration_product_id_or_slug }}' --required, +@resource_id='{{ resource_id }}' --required +@@json= +'{ +"secrets": "{{ secrets }}", +"partial": {{ partial }} +}' +; +``` + + + +This endpoint updates the secrets of a resource. If a resource has projects connected, the connected secrets are updated with the new secrets. The old secrets may still be used by existing connected projects because they are not automatically redeployed. Redeployment is a manual action and must be completed by the user. All new project connections will use the new secrets.<br /> <br /> Use cases for this endpoint:<br /> <br /> - Resetting the credentials of a database in the partner. If the user requests the credentials to be updated in the partner’s application, the partner post the new set of secrets to Vercel, the user should redeploy their application and the expire the old credentials.<br /> + +```sql +EXEC vercel.marketplace.resources.update_secrets_by_id +@integration_configuration_id='{{ integration_configuration_id }}' --required, +@resource_id='{{ resource_id }}' --required +@@json= +'{ +"secrets": "{{ secrets }}", +"partial": {{ partial }} +}' +; +``` + + diff --git a/website/docs/services/marketplace/sso_tokens/index.md b/website/docs/services/marketplace/sso_tokens/index.md new file mode 100644 index 0000000..33cb197 --- /dev/null +++ b/website/docs/services/marketplace/sso_tokens/index.md @@ -0,0 +1,108 @@ +--- +title: sso_tokens +hide_title: false +hide_table_of_contents: false +keywords: + - sso_tokens + - marketplace + - vercel + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a sso_tokens resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + +`SELECT` not supported for this resource, use `SHOW METHODS` to view available operations for the resource. + + +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
code, client_id, client_secret, grant_type, refresh_tokenDuring the autorization process, Vercel sends the user to the provider [redirectLoginUrl](https:​//vercel.com/docs/integrations/create-integration/submit-integration#redirect-login-url), that includes the OAuth authorization `code` parameter. The provider then calls the SSO Token Exchange endpoint with the sent code and receives the OIDC token. They log the user in based on this token and redirects the user back to the Vercel account using deep-link parameters included the redirectLoginUrl. Providers should not persist the returned `id_token` in a database since the token will expire. See [**Authentication with SSO**](https:​//vercel.com/docs/integrations/create-integration/marketplace-api#authentication-with-sso) for more details.
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + +
NameDatatypeDescription
+ +## Lifecycle Methods + +EXEC variables use wire (API) names. + + + + +During the autorization process, Vercel sends the user to the provider [redirectLoginUrl](https://vercel.com/docs/integrations/create-integration/submit-integration#redirect-login-url), that includes the OAuth authorization `code` parameter. The provider then calls the SSO Token Exchange endpoint with the sent code and receives the OIDC token. They log the user in based on this token and redirects the user back to the Vercel account using deep-link parameters included the redirectLoginUrl. Providers should not persist the returned `id_token` in a database since the token will expire. See [**Authentication with SSO**](https://vercel.com/docs/integrations/create-integration/marketplace-api#authentication-with-sso) for more details. + +```sql +EXEC vercel.marketplace.sso_tokens.exchange +@@json= +'{ +"code": "{{ code }}", +"state": "{{ state }}", +"client_id": "{{ client_id }}", +"client_secret": "{{ client_secret }}", +"redirect_uri": "{{ redirect_uri }}", +"grant_type": "{{ grant_type }}", +"refresh_token": "{{ refresh_token }}" +}' +; +``` + + diff --git a/website/docs/services/microfrontends/deployment_config/index.md b/website/docs/services/microfrontends/deployment_config/index.md new file mode 100644 index 0000000..3695a7e --- /dev/null +++ b/website/docs/services/microfrontends/deployment_config/index.md @@ -0,0 +1,160 @@ +--- +title: deployment_config +hide_title: false +hide_table_of_contents: false +keywords: + - deployment_config + - microfrontends + - vercel + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a deployment_config resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + +projectIds are added when the config is uploaded to s3 deployment assets. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringSee https:​//openapi.vercel.sh/microfrontends.json.
object
objectOptional configuration options for the microfrontend.
stringThe version of the microfrontends config schema. (1)
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
deployment_idteam_id, slugGet the microfrontends config for a deployment.
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringThe unique deployment identifier
stringThe Team slug to perform the request on behalf of.
stringThe Team identifier to perform the request on behalf of. (wire: teamId)
+ +## `SELECT` examples + + + + +Get the microfrontends config for a deployment. + +```sql +SELECT +$schema, +applications, +options, +version +FROM vercel.microfrontends.deployment_config +WHERE deployment_id = '{{ deployment_id }}' -- required +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + diff --git a/website/docs/services/microfrontends/group_projects/index.md b/website/docs/services/microfrontends/group_projects/index.md new file mode 100644 index 0000000..9f251c5 --- /dev/null +++ b/website/docs/services/microfrontends/group_projects/index.md @@ -0,0 +1,716 @@ +--- +title: group_projects +hide_title: false +hide_table_of_contents: false +keywords: + - group_projects + - microfrontends + - vercel + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a group_projects resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string
string
string (wire: accountId)
string (wire: connectConfigurationId)
string (wire: passiveConnectConfigurationId)
string (wire: transferToAccountId)
string (wire: transferredFromAccountId)
string (wire: concurrencyBucketName)
object
array
object
boolean (false, true) (wire: appliedCve55182Migration)
boolean (false, true) (wire: autoAssignCustomDomains)
string (wire: autoAssignCustomDomainsUpdatedBy)
boolean (false, true) (wire: autoExposeSystemEnvs)
string
object
string (wire: buildCommand)
string (wire: commandForIgnoringBuildStep)
boolean (false, true) (wire: connectBuildsEnabled)
array (wire: connectConfigurations)
number (wire: createdAt)
object
array (wire: customEnvironments)
boolean (false, true) (wire: customerSupportCodeVisibility)
object (wire: dataCache)
object (wire: defaultResourceConfig)
objectRetention policies for deployments. These are enforced at the project level, but we also maintain an instance of this at the team level as a default policy that gets applied to new projects. (wire: deploymentExpiration)
objectProject shape. `null` on a rule list clears the project's override for that rule type (fall back to team for every env); omitting is equivalent. Setting `deploymentPolicy` itself to `null` clears every override at once. Kept structurally distinct from {@link TeamDeploymentPolicy} so the two storage locations don't share a type by accident. (wire: deploymentPolicy)
string (wire: devCommand)
boolean (false, true) (wire: directoryListing)
array (wire: dismissedToasts)
boolean (false, true) (wire: enableAffectedProjectsDeployments)
boolean (false, true) (wire: enableExternalRewriteCaching)
boolean (false, true, ) (wire: enablePreviewFeedback)
boolean (false, true, ) (wire: enableProductionFeedback)
array
object
string (actix-web, angular, ash, astro, axum, blitzjs, brunch, bun, container, create-react-app, django, docusaurus, docusaurus-2, dojo, eleventy, elysia, ember, eve, express, factory-eve, fastapi, fasthtml, fastify, flask, gatsby, go, gridsome, h3, hexo, hono, hugo, hydrogen, ionic-angular, ionic-react, jekyll, koa, mastra, middleman, nestjs, nextjs, nitro, node, nuxtjs, parcel, polymer, preact, python, react-router, redwoodjs, remix, ruby, rust, saber, sanity, sanity-v2, sapper, scully, services, solidstart, solidstart-1, stencil, storybook, svelte, sveltekit, sveltekit-1, tanstack-start, tanstack-start-lovable, umijs, vite, vitepress, vue, vuepress, xmcp, zola, )
object (wire: gitComments)
boolean (false, true) (wire: gitForkProtection)
boolean (false, true) (wire: gitLFS)
object (wire: gitProviderOptions)
boolean (false, true) (wire: hasActiveBranches)
boolean (false, true) (wire: hasDeployments)
string (wire: installCommand)
array (wire: internalRoutes)
array (wire: ipBuckets)
object
object (wire: lastAliasRequest)
string(opaque JSON object) (wire: lastRollbackTarget)
array (wire: latestDeployments)
boolean (false, true)
string (10.x, 12.x, 14.x, 16.x, 18.x, 20.x, 22.x, 24.x, 8.10.x) (wire: nodeVersion)
object (wire: oidcTokenConfig)
object (wire: optionsAllowlist)
string (wire: outputDirectory)
object
string(opaque JSON object) (wire: passwordProtection)
boolean (false, true)
object
boolean (false, true) (wire: productionDeploymentsFastLane)
boolean (false, true) (wire: protectedSourcemaps)
object (wire: protectionBypass)
object (wire: protectionConfig)
object (wire: resourceConfig)
objectDescription of why a project was rolled back, and by whom. Note that lastAliasRequest contains the from/to details of the rollback. (wire: rollbackDescription)
objectProject-level rolling release configuration that defines how deployments should be gradually rolled out (wire: rollingRelease)
string (wire: rootDirectory)
object
object
boolean (false, true) (wire: serverlessFunctionZeroConfigFailover)
array
array (wire: skewProtectionAllowedDomains)
number (wire: skewProtectionBoundaryAt)
number (wire: skewProtectionMaxAge)
boolean (false, true) (wire: skipGitConnectDuringLink)
boolean (false, true) (wire: sourceFilesOutsideRootDirectory)
object (wire: speedInsights)
object (wire: ssoProtection)
object (wire: staticIps)
object
string (advanced, critical, priority)
object
number (wire: transferCompletedAt)
number (wire: transferStartedAt)
(wire: trustedIps)
object (wire: trustedSources)
number (wire: updatedAt)
object (wire: usageStatus)
boolean (false, true) (wire: v0)
boolean (false, true) (wire: v0Created)
object (wire: webAnalytics)
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
group_idteam_id, slugGet the microfrontends for a given group ID.
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string
stringThe Team slug to perform the request on behalf of.
stringThe Team identifier to perform the request on behalf of. (wire: teamId)
+ +## `SELECT` examples + + + + +Get the microfrontends for a given group ID. + +```sql +SELECT +id, +name, +account_id, +connect_configuration_id, +passive_connect_configuration_id, +transfer_to_account_id, +transferred_from_account_id, +concurrency_bucket_name, +abuse, +alias, +analytics, +applied_cve_55182_migration, +auto_assign_custom_domains, +auto_assign_custom_domains_updated_by, +auto_expose_system_envs, +avatar, +blobs, +build_command, +command_for_ignoring_build_step, +connect_builds_enabled, +connect_configurations, +created_at, +creator, +crons, +custom_environments, +customer_support_code_visibility, +data_cache, +default_resource_config, +deployment_expiration, +deployment_policy, +dev_command, +directory_listing, +dismissed_toasts, +enable_affected_projects_deployments, +enable_external_rewrite_caching, +enable_preview_feedback, +enable_production_feedback, +env, +expiration, +features, +framework, +git_comments, +git_fork_protection, +git_lfs, +git_provider_options, +has_active_branches, +has_deployments, +install_command, +internal_routes, +ip_buckets, +jobs, +last_alias_request, +last_rollback_target, +latest_deployments, +link, +live, +microfrontends, +node_version, +oidc_token_config, +options_allowlist, +output_directory, +passport, +password_protection, +paused, +permissions, +production_deployments_fast_lane, +protected_sourcemaps, +protection_bypass, +protection_config, +resource_config, +rollback_description, +rolling_release, +root_directory, +sandbox, +security, +serverless_function_zero_config_failover, +services, +skew_protection_allowed_domains, +skew_protection_boundary_at, +skew_protection_max_age, +skip_git_connect_during_link, +source_files_outside_root_directory, +speed_insights, +sso_protection, +static_ips, +targets, +tier, +tracing, +transfer_completed_at, +transfer_started_at, +trusted_ips, +trusted_sources, +updated_at, +usage_status, +v_0, +v_0_created, +web_analytics +FROM vercel.microfrontends.group_projects +WHERE group_id = '{{ group_id }}' -- required +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + diff --git a/website/docs/services/microfrontends/groups/index.md b/website/docs/services/microfrontends/groups/index.md new file mode 100644 index 0000000..4938f80 --- /dev/null +++ b/website/docs/services/microfrontends/groups/index.md @@ -0,0 +1,220 @@ +--- +title: groups +hide_title: false +hide_table_of_contents: false +keywords: + - groups + - microfrontends + - vercel + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a groups resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
array
number (wire: maxMicrofrontendsGroupsPerTeam)
number (wire: maxMicrofrontendsPerGroup)
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
team_id, slugGet the microfrontends group IDs for a team.
group_name, default_app, other_applicationsteam_id, slugCreates a microfrontends group and attaches multiple projects in a single request.
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringThe Team slug to perform the request on behalf of.
stringThe Team identifier to perform the request on behalf of. (wire: teamId)
+ +## `SELECT` examples + + + + +Get the microfrontends group IDs for a team. + +```sql +SELECT +groups, +max_microfrontends_groups_per_team, +max_microfrontends_per_group +FROM vercel.microfrontends.groups +WHERE team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + + + +## `INSERT` examples + + + + +Creates a microfrontends group and attaches multiple projects in a single request. + +```sql +INSERT INTO vercel.microfrontends.groups ( +group_name, +default_app, +other_applications, +team_id, +slug +) +SELECT +'{{ group_name }}' /* required */, +'{{ default_app }}' /* required */, +'{{ other_applications }}' /* required */, +'{{ team_id }}', +'{{ slug }}' +RETURNING +new_microfrontends_group +; +``` + + + +{`# Description fields are for documentation purposes +- name: groups + props: + - name: group_name + value: "{{ group_name }}" + description: | + The name of the microfrontends group that will be used to identify the group + - name: default_app + description: | + The default app for the new microfrontend group + value: + projectId: "{{ projectId }}" + defaultRoute: "{{ defaultRoute }}" + - name: other_applications + description: | + The list of other applications that will be used in the new microfrontend group + value: + - projectId: "{{ projectId }}" + defaultRoute: "{{ defaultRoute }}" + - name: team_id + value: "{{ team_id }}" + description: The Team identifier to perform the request on behalf of. + description: The Team identifier to perform the request on behalf of. + - name: slug + value: "{{ slug }}" + description: The Team slug to perform the request on behalf of. + description: The Team slug to perform the request on behalf of. +`} + + + diff --git a/website/docs/services/microfrontends/index.md b/website/docs/services/microfrontends/index.md new file mode 100644 index 0000000..aaf0c42 --- /dev/null +++ b/website/docs/services/microfrontends/index.md @@ -0,0 +1,35 @@ +--- +title: microfrontends +hide_title: false +hide_table_of_contents: false +keywords: + - microfrontends + - vercel + - stackql + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +microfrontends service documentation. + +:::info[Service Summary] + +total resources: __4__ + +::: + +## Resources + \ No newline at end of file diff --git a/website/docs/services/microfrontends/project_config/index.md b/website/docs/services/microfrontends/project_config/index.md new file mode 100644 index 0000000..f695d4f --- /dev/null +++ b/website/docs/services/microfrontends/project_config/index.md @@ -0,0 +1,160 @@ +--- +title: project_config +hide_title: false +hide_table_of_contents: false +keywords: + - project_config + - microfrontends + - vercel + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a project_config resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + +projectIds are added when the config is uploaded to s3 deployment assets. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringSee https:​//openapi.vercel.sh/microfrontends.json.
object
objectOptional configuration options for the microfrontend.
stringThe version of the microfrontends config schema. (1)
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
project_id_or_nameteam_id, slugGet the microfrontends config for a project by ID or name.
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringThe name or ID of the project
stringThe Team slug to perform the request on behalf of.
stringThe Team identifier to perform the request on behalf of. (wire: teamId)
+ +## `SELECT` examples + + + + +Get the microfrontends config for a project by ID or name. + +```sql +SELECT +$schema, +applications, +options, +version +FROM vercel.microfrontends.project_config +WHERE project_id_or_name = '{{ project_id_or_name }}' -- required +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + diff --git a/website/docs/services/networking/index.md b/website/docs/services/networking/index.md new file mode 100644 index 0000000..c68f928 --- /dev/null +++ b/website/docs/services/networking/index.md @@ -0,0 +1,34 @@ +--- +title: networking +hide_title: false +hide_table_of_contents: false +keywords: + - networking + - vercel + - stackql + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +networking service documentation. + +:::info[Service Summary] + +total resources: __3__ + +::: + +## Resources + \ No newline at end of file diff --git a/website/docs/services/networking/networks/index.md b/website/docs/services/networking/networks/index.md new file mode 100644 index 0000000..b3035fc --- /dev/null +++ b/website/docs/services/networking/networks/index.md @@ -0,0 +1,541 @@ +--- +title: networks +hide_title: false +hide_table_of_contents: false +keywords: + - networks + - networking + - vercel + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a networks resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringThe unique identifier of the Network.
stringThe name of the network.
stringThe ID of the AWS Account in which the network exists. (wire: awsAccountId)
stringThe unique identifier of the Team that owns the Network. (wire: teamId)
stringThe ID of the VPC which hosts the network. (wire: vpcId)
arrayThe IDs of the AWS Availability Zones in which the network exists, if specified during creation. (wire: awsAvailabilityZoneIds)
stringThe AWS Region in which the network exists. (wire: awsRegion)
stringThe CIDR range of the Network.
numberThe date at which the Network was created, represented as a UNIX timestamp since EPOCH. (wire: createdAt)
array (wire: egressIpAddresses)
objectMetadata about any AWS Route53 Hosted Zones associated with the Network. (wire: hostedZones)
objectMetadata about any AWS Route53 Hosted Zones associated with the Network. (wire: peeringConnections)
objectMetadata about any projects associated with the Network.
stringThe Vercel region in which the Network exists.
stringThe status of the Network. (create_in_progress, delete_in_progress, error, ready)
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringThe unique identifier of the Network.
stringThe name of the network.
stringThe ID of the AWS Account in which the network exists. (wire: awsAccountId)
stringThe unique identifier of the Team that owns the Network. (wire: teamId)
stringThe ID of the VPC which hosts the network. (wire: vpcId)
arrayThe IDs of the AWS Availability Zones in which the network exists, if specified during creation. (wire: awsAvailabilityZoneIds)
stringThe AWS Region in which the network exists. (wire: awsRegion)
stringThe CIDR range of the Network.
numberThe date at which the Network was created, represented as a UNIX timestamp since EPOCH. (wire: createdAt)
array (wire: egressIpAddresses)
objectMetadata about any AWS Route53 Hosted Zones associated with the Network. (wire: hostedZones)
objectMetadata about any AWS Route53 Hosted Zones associated with the Network. (wire: peeringConnections)
objectMetadata about any projects associated with the Network.
stringThe Vercel region in which the Network exists.
stringThe status of the Network. (create_in_progress, delete_in_progress, error, ready)
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
network_idteam_id, slugAllows to read a Secure Compute network.
include_hosted_zones, include_peering_connections, include_projects, search, team_id, slugAllows to list Secure Compute networks.
cidr, name, regionteam_id, slugAllows to create a Secure Compute network.
network_id, nameteam_id, slugAllows to update a Secure Compute network.
network_idteam_id, slugAllows to delete a Secure Compute network.
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringThe ID of the network to delete
booleanWhether to include Hosted Zones in the response (wire: includeHostedZones)
booleanWhether to include VPC Peering connections in the response (wire: includePeeringConnections)
booleanWhether to include projects in the response (wire: includeProjects)
stringThe Team slug to perform the request on behalf of.
stringThe Team identifier to perform the request on behalf of. (wire: teamId)
+ +## `SELECT` examples + + + + +Allows to read a Secure Compute network. + +```sql +SELECT +id, +name, +aws_account_id, +team_id, +vpc_id, +aws_availability_zone_ids, +aws_region, +cidr, +created_at, +egress_ip_addresses, +hosted_zones, +peering_connections, +projects, +region, +status +FROM vercel.networking.networks +WHERE network_id = '{{ network_id }}' -- required +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + + +Allows to list Secure Compute networks. + +```sql +SELECT +id, +name, +aws_account_id, +team_id, +vpc_id, +aws_availability_zone_ids, +aws_region, +cidr, +created_at, +egress_ip_addresses, +hosted_zones, +peering_connections, +projects, +region, +status +FROM vercel.networking.networks +WHERE include_hosted_zones = '{{ include_hosted_zones }}' +AND include_peering_connections = '{{ include_peering_connections }}' +AND include_projects = '{{ include_projects }}' +AND search = '{{ search }}' +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + + + +## `INSERT` examples + + + + +Allows to create a Secure Compute network. + +```sql +INSERT INTO vercel.networking.networks ( +aws_availability_zone_ids, +cidr, +name, +region, +team_id, +slug +) +SELECT +'{{ aws_availability_zone_ids }}', +'{{ cidr }}' /* required */, +'{{ name }}' /* required */, +'{{ region }}' /* required */, +'{{ team_id }}', +'{{ slug }}' +RETURNING +id, +name, +aws_account_id, +team_id, +vpc_id, +aws_availability_zone_ids, +aws_region, +cidr, +created_at, +egress_ip_addresses, +hosted_zones, +peering_connections, +projects, +region, +status +; +``` + + + +{`# Description fields are for documentation purposes +- name: networks + props: + - name: aws_availability_zone_ids + value: + - "{{ aws_availability_zone_ids }}" + - name: cidr + value: "{{ cidr }}" + description: | + The CIDR block of the network + - name: name + value: "{{ name }}" + description: | + The name of the network + - name: region + value: "{{ region }}" + description: | + The region where the network will be created + - name: team_id + value: "{{ team_id }}" + description: The Team identifier to perform the request on behalf of. + description: The Team identifier to perform the request on behalf of. + - name: slug + value: "{{ slug }}" + description: The Team slug to perform the request on behalf of. + description: The Team slug to perform the request on behalf of. +`} + + + + + +## `UPDATE` examples + + + + +Allows to update a Secure Compute network. + +```sql +UPDATE vercel.networking.networks +SET +name = '{{ name }}' +WHERE +network_id = '{{ network_id }}' --required +AND name = '{{ name }}' --required +AND team_id = '{{ team_id}}' +AND slug = '{{ slug}}' +RETURNING +id, +name, +aws_account_id, +team_id, +vpc_id, +aws_availability_zone_ids, +aws_region, +cidr, +created_at, +egress_ip_addresses, +hosted_zones, +peering_connections, +projects, +region, +status; +``` + + + + +## `DELETE` examples + + + + +Allows to delete a Secure Compute network. + +```sql +DELETE FROM vercel.networking.networks +WHERE network_id = '{{ network_id }}' --required +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + diff --git a/website/docs/services/networking/privatelink_endpoints/index.md b/website/docs/services/networking/privatelink_endpoints/index.md new file mode 100644 index 0000000..c5fdd4e --- /dev/null +++ b/website/docs/services/networking/privatelink_endpoints/index.md @@ -0,0 +1,509 @@ +--- +title: privatelink_endpoints +hide_title: false +hide_table_of_contents: false +keywords: + - privatelink_endpoints + - networking + - vercel + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a privatelink_endpoints resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + +The requested PrivateLink endpoint. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringThe name of the PrivateLink endpoint, shown in the Vercel dashboard. (example: payments-db)
stringThe unique identifier of the PrivateLink endpoint. (example: ple_a1b2c3d4e5f6g7h8) (wire: endpointId)
stringThe identifier of the project the PrivateLink endpoint belongs to. (example: prj_a1b2c3d4e5f6g7h8) (wire: projectId)
stringThe identifier of the team that owns the PrivateLink endpoint. (example: team_a1b2c3d4e5f6g7h8) (wire: teamId)
stringThe identifier of the underlying AWS VPC endpoint. Absent until AWS has created the endpoint. (example: vpce-0123456789abcdef0) (wire: vpcEndpointId)
stringThe AWS VPC endpoint service the endpoint connects to. (example: com.amazonaws.vpce.us-east-1.vpce-svc-0123456789abcdef0) (wire: awsServiceName)
arrayThe regional DNS names assigned to the endpoint by AWS. Use these to reach the service when private DNS is not enabled. (wire: awsDnsEntries)
numberTimestamp in milliseconds since the UNIX epoch for when the endpoint was created. (wire: createdAt)
arrayThe private DNS names of the endpoint service, populated when private DNS is enabled for the endpoint. (wire: privateDnsNames)
stringThe current state of the endpoint. - `creating`: the endpoint is being created. - `pending-acceptance`: waiting for the endpoint service owner to accept the connection. Only occurs for services that require manual acceptance. - `provisioning`: the connection was accepted and AWS is finishing setup. - `available`: the endpoint is fully provisioned and ready to use. - `rejected`: the endpoint service owner rejected the connection. - `failed`: the endpoint could not be provisioned. - `deleting`: the endpoint is being deleted. (available, creating, deleting, failed, pending-acceptance, provisioning, rejected) (example: available)
stringA human-readable explanation of why the endpoint could not be provisioned. Only set when `status` is `failed`, and absent for every other status including `rejected`, since AWS does not report a rejection reason. (example: Endpoint did not become available in time. Try deleting and recreating, or visit https:​//vercel.com/help if the issue persists.) (wire: statusMessage)
numberTimestamp in milliseconds since the UNIX epoch for when the endpoint was last updated. (wire: updatedAt)
stringThe Vercel region the endpoint is provisioned in. (example: iad1) (wire: vercelRegion)
+
+ + +A PrivateLink endpoint, which connects a project to an AWS VPC endpoint service in a single region so that traffic reaches the service over AWS PrivateLink rather than the public internet. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringThe name of the PrivateLink endpoint, shown in the Vercel dashboard. (example: payments-db)
stringThe unique identifier of the PrivateLink endpoint. (example: ple_a1b2c3d4e5f6g7h8) (wire: endpointId)
stringThe identifier of the project the PrivateLink endpoint belongs to. (example: prj_a1b2c3d4e5f6g7h8) (wire: projectId)
stringThe identifier of the team that owns the PrivateLink endpoint. (example: team_a1b2c3d4e5f6g7h8) (wire: teamId)
stringThe identifier of the underlying AWS VPC endpoint. Absent until AWS has created the endpoint. (example: vpce-0123456789abcdef0) (wire: vpcEndpointId)
stringThe AWS VPC endpoint service the endpoint connects to. (example: com.amazonaws.vpce.us-east-1.vpce-svc-0123456789abcdef0) (wire: awsServiceName)
arrayThe regional DNS names assigned to the endpoint by AWS. Use these to reach the service when private DNS is not enabled. (wire: awsDnsEntries)
numberTimestamp in milliseconds since the UNIX epoch for when the endpoint was created. (wire: createdAt)
arrayThe private DNS names of the endpoint service, populated when private DNS is enabled for the endpoint. (wire: privateDnsNames)
stringThe current state of the endpoint. - `creating`: the endpoint is being created. - `pending-acceptance`: waiting for the endpoint service owner to accept the connection. Only occurs for services that require manual acceptance. - `provisioning`: the connection was accepted and AWS is finishing setup. - `available`: the endpoint is fully provisioned and ready to use. - `rejected`: the endpoint service owner rejected the connection. - `failed`: the endpoint could not be provisioned. - `deleting`: the endpoint is being deleted. (available, creating, deleting, failed, pending-acceptance, provisioning, rejected) (example: available)
stringA human-readable explanation of why the endpoint could not be provisioned. Only set when `status` is `failed`, and absent for every other status including `rejected`, since AWS does not report a rejection reason. (example: Endpoint did not become available in time. Try deleting and recreating, or visit https:​//vercel.com/help if the issue persists.) (wire: statusMessage)
numberTimestamp in milliseconds since the UNIX epoch for when the endpoint was last updated. (wire: updatedAt)
stringThe Vercel region the endpoint is provisioned in. (example: iad1) (wire: vercelRegion)
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
project_id, endpoint_idteam_id, slugReads a single PrivateLink endpoint.
project_idteam_id, slugLists all PrivateLink endpoints for a project.
project_id, name, vercel_region, aws_service_nameteam_id, slugCreates a PrivateLink endpoint for a project.
project_id, endpoint_idteam_id, slugUpdates a PrivateLink endpoint (name, privateDns).
project_id, endpoint_idteam_id, slugDeletes a PrivateLink endpoint.
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringThe unique identifier of the PrivateLink endpoint.
stringThe project ID the PrivateLink endpoint belongs to. (wire: projectId)
stringThe Team slug to perform the request on behalf of.
stringThe Team identifier to perform the request on behalf of. (wire: teamId)
+ +## `SELECT` examples + + + + +Reads a single PrivateLink endpoint. + +```sql +SELECT +name, +endpoint_id, +project_id, +team_id, +vpc_endpoint_id, +aws_service_name, +aws_dns_entries, +created_at, +private_dns_names, +status, +status_message, +updated_at, +vercel_region +FROM vercel.networking.privatelink_endpoints +WHERE project_id = '{{ project_id }}' -- required +AND endpoint_id = '{{ endpoint_id }}' -- required +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + + +Lists all PrivateLink endpoints for a project. + +```sql +SELECT +name, +endpoint_id, +project_id, +team_id, +vpc_endpoint_id, +aws_service_name, +aws_dns_entries, +created_at, +private_dns_names, +status, +status_message, +updated_at, +vercel_region +FROM vercel.networking.privatelink_endpoints +WHERE project_id = '{{ project_id }}' -- required +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + + + +## `INSERT` examples + + + + +Creates a PrivateLink endpoint for a project. + +```sql +INSERT INTO vercel.networking.privatelink_endpoints ( +project_id, +name, +vercel_region, +aws_service_name, +enable_private_dns, +team_id, +slug +) +SELECT +'{{ project_id }}' /* required */, +'{{ name }}' /* required */, +'{{ vercel_region }}' /* required */, +'{{ aws_service_name }}' /* required */, +{{ enable_private_dns }}, +'{{ team_id }}', +'{{ slug }}' +RETURNING +name, +endpoint_id, +project_id, +team_id, +vpc_endpoint_id, +aws_service_name, +aws_dns_entries, +created_at, +private_dns_names, +status, +status_message, +updated_at, +vercel_region +; +``` + + + +{`# Description fields are for documentation purposes +- name: privatelink_endpoints + props: + - name: project_id + value: "{{ project_id }}" + description: | + The project ID to create the PrivateLink endpoint for. + - name: name + value: "{{ name }}" + description: | + The name of the PrivateLink endpoint, used as its label in the Vercel dashboard. + - name: vercel_region + value: "{{ vercel_region }}" + description: | + The Vercel region to provision the endpoint in. Advanced Networking must be enabled for the project in that region. The endpoint service itself may live in another AWS region. + - name: aws_service_name + value: "{{ aws_service_name }}" + description: | + The name of the AWS VPC endpoint service to connect to. Its AWS region is read from the name; when that region differs from the one behind \`vercelRegion\`, the service must allow cross-region access. + - name: enable_private_dns + value: {{ enable_private_dns }} + description: | + Whether to resolve the endpoint service through its private DNS names, which are then returned in \`privateDnsNames\`. Defaults to \`false\`, in which case the endpoint is reachable through the DNS names in \`awsDnsEntries\`. + - name: team_id + value: "{{ team_id }}" + description: The Team identifier to perform the request on behalf of. + description: The Team identifier to perform the request on behalf of. + - name: slug + value: "{{ slug }}" + description: The Team slug to perform the request on behalf of. + description: The Team slug to perform the request on behalf of. +`} + + + + + +## `UPDATE` examples + + + + +Updates a PrivateLink endpoint (name, privateDns). + +```sql +UPDATE vercel.networking.privatelink_endpoints +SET +name = '{{ name }}', +enable_private_dns = {{ enable_private_dns }} +WHERE +project_id = '{{ project_id }}' --required +AND endpoint_id = '{{ endpoint_id }}' --required +AND team_id = '{{ team_id}}' +AND slug = '{{ slug}}' +RETURNING +name, +endpoint_id, +project_id, +team_id, +vpc_endpoint_id, +aws_service_name, +aws_dns_entries, +created_at, +private_dns_names, +status, +status_message, +updated_at, +vercel_region; +``` + + + + +## `DELETE` examples + + + + +Deletes a PrivateLink endpoint. + +```sql +DELETE FROM vercel.networking.privatelink_endpoints +WHERE project_id = '{{ project_id }}' --required +AND endpoint_id = '{{ endpoint_id }}' --required +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + diff --git a/website/docs/services/networking/static_ips/index.md b/website/docs/services/networking/static_ips/index.md new file mode 100644 index 0000000..ceeabca --- /dev/null +++ b/website/docs/services/networking/static_ips/index.md @@ -0,0 +1,128 @@ +--- +title: static_ips +hide_title: false +hide_table_of_contents: false +keywords: + - static_ips + - networking + - vercel + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a static_ips resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + +`SELECT` not supported for this resource, use `SHOW METHODS` to view available operations for the resource. + + +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
id_or_name, builds, regionsteam_id, slugAllows configuring Static IPs for a project
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringThe unique project identifier or the project name
stringThe Team slug to perform the request on behalf of.
stringThe Team identifier to perform the request on behalf of. (wire: teamId)
+ +## `UPDATE` examples + + + + +Allows configuring Static IPs for a project + +```sql +UPDATE vercel.networking.static_ips +SET +builds = {{ builds }}, +regions = '{{ regions }}' +WHERE +id_or_name = '{{ id_or_name }}' --required +AND builds = {{ builds }} --required +AND regions = '{{ regions }}' --required +AND team_id = '{{ team_id}}' +AND slug = '{{ slug}}' +RETURNING +connect_configuration_id, +env_id, +aws, +builds_enabled, +created_at, +dc, +passive, +updated_at; +``` + + diff --git a/website/docs/services/observability/configuration_projects/index.md b/website/docs/services/observability/configuration_projects/index.md new file mode 100644 index 0000000..fdce8ec --- /dev/null +++ b/website/docs/services/observability/configuration_projects/index.md @@ -0,0 +1,187 @@ +--- +title: configuration_projects +hide_title: false +hide_table_of_contents: false +keywords: + - configuration_projects + - observability + - vercel + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a configuration_projects resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string
string
number (wire: disabledAt)
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
team_id, slugLists the projects that are currently configured as disabled for Observability Plus on a team.
project_id_or_name, disabledteam_id, slugUpdates whether Observability Plus is disabled for a single project.
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringThe ID or name of the project to update
stringThe Team slug to perform the request on behalf of.
stringThe Team identifier to perform the request on behalf of. (wire: teamId)
+ +## `SELECT` examples + + + + +Lists the projects that are currently configured as disabled for Observability Plus on a team. + +```sql +SELECT +id, +name, +disabled_at +FROM vercel.observability.configuration_projects +WHERE team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + + + +## `UPDATE` examples + + + + +Updates whether Observability Plus is disabled for a single project. + +```sql +UPDATE vercel.observability.configuration_projects +SET +disabled = {{ disabled }} +WHERE +project_id_or_name = '{{ project_id_or_name }}' --required +AND disabled = {{ disabled }} --required +AND team_id = '{{ team_id}}' +AND slug = '{{ slug}}' +RETURNING +id, +disabled_at; +``` + + diff --git a/website/docs/services/observability/index.md b/website/docs/services/observability/index.md new file mode 100644 index 0000000..6757f61 --- /dev/null +++ b/website/docs/services/observability/index.md @@ -0,0 +1,34 @@ +--- +title: observability +hide_title: false +hide_table_of_contents: false +keywords: + - observability + - vercel + - stackql + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +observability service documentation. + +:::info[Service Summary] + +total resources: __3__ + +::: + +## Resources + \ No newline at end of file diff --git a/website/docs/services/teams/invites/index.md b/website/docs/services/observability/queries/index.md similarity index 52% rename from website/docs/services/teams/invites/index.md rename to website/docs/services/observability/queries/index.md index efa4979..a9ff0e4 100644 --- a/website/docs/services/teams/invites/index.md +++ b/website/docs/services/observability/queries/index.md @@ -1,10 +1,10 @@ --- -title: invites +title: queries hide_title: false hide_table_of_contents: false keywords: - - invites - - teams + - queries + - observability - vercel - infrastructure-as-code - configuration-as-data @@ -15,16 +15,17 @@ image: /img/stackql-vercel-provider-featured-image.png --- import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; -Creates, updates, deletes, gets or lists an invites resource. +Creates, updates, deletes, gets or lists a queries resource. ## Overview - + - +
Nameinvites
Name
TypeResource
Id
Id
## Fields @@ -50,11 +51,11 @@ The following methods are available for this resource: - - - teamId, inviteId + + + metric, scope + - Delete an active Team invite code. @@ -72,35 +73,40 @@ Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](# - - - string - The Team invite code ID. - - - - string - The Team identifier or slug to perform the request on behalf of. - -## `DELETE` examples +## Lifecycle Methods + +EXEC variables use wire (API) names. - + -Delete an active Team invite code. +No description available. ```sql -DELETE FROM vercel.teams.invites -WHERE teamId = '{{ teamId }}' --required -AND inviteId = '{{ inviteId }}' --required +EXEC vercel.observability.queries.run +@@json= +'{ +"metric": "{{ metric }}", +"scope": "{{ scope }}", +"aggregation": "{{ aggregation }}", +"groupBy": "{{ groupBy }}", +"filter": "{{ filter }}", +"limit": {{ limit }}, +"orderBy": "{{ orderBy }}", +"orderDirection": "{{ orderDirection }}", +"granularity": "{{ granularity }}", +"startTime": "{{ startTime }}", +"endTime": "{{ endTime }}", +"bucketTimezone": "{{ bucketTimezone }}" +}' ; ``` diff --git a/website/docs/services/observability/schema/index.md b/website/docs/services/observability/schema/index.md new file mode 100644 index 0000000..d757a4e --- /dev/null +++ b/website/docs/services/observability/schema/index.md @@ -0,0 +1,197 @@ +--- +title: schema +hide_title: false +hide_table_of_contents: false +keywords: + - schema + - observability + - vercel + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a schema resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string
array
string (wire: defaultAggregation)
string
array
string
+
+ + + + + + + + + + + + + + + + + +
NameDatatypeDescription
array
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
metric_id
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string
+ +## `SELECT` examples + + + + +No description available. + +```sql +SELECT +id, +aggregations, +default_aggregation, +description, +dimensions, +unit +FROM vercel.observability.schema +WHERE metric_id = '{{ metric_id }}' -- required +; +``` + + + +No description available. + +```sql +SELECT +metrics +FROM vercel.observability.schema +; +``` + + diff --git a/website/docs/services/project_members/index.md b/website/docs/services/project_members/index.md index 96bcd4c..17774b7 100644 --- a/website/docs/services/project_members/index.md +++ b/website/docs/services/project_members/index.md @@ -25,7 +25,7 @@ total resources: __1__ ## Resources
diff --git a/website/docs/services/project_members/members/index.md b/website/docs/services/project_members/members/index.md new file mode 100644 index 0000000..96304a5 --- /dev/null +++ b/website/docs/services/project_members/members/index.md @@ -0,0 +1,332 @@ +--- +title: members +hide_title: false +hide_table_of_contents: false +keywords: + - members + - project_members + - vercel + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a members resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + +Paginated list of members for the project. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringThe name of this user. (example: Jane Doe)
stringID of the file for the Avatar of this member. (example: 123a6c5209bc3778245d011443644c8d27dc2c50)
stringRole of this user in the project. (ADMIN, PROJECT_DEVELOPER, PROJECT_GUEST, PROJECT_VIEWER) (example: ADMIN) (wire: computedProjectRole)
numberTimestamp in milliseconds when this member was added. (wire: createdAt)
stringThe email of this member. (example: jane.doe@example.com)
stringRole of this user in the project. (ADMIN, PROJECT_DEVELOPER, PROJECT_GUEST, PROJECT_VIEWER) (example: ADMIN)
stringThe role of this user in the team. (BILLING, CONTRIBUTOR, DEVELOPER, MEMBER, OWNER, SECURITY, VIEWER, VIEWER_FOR_PLUS) (example: CONTRIBUTOR) (wire: teamRole)
stringThe ID of this user. (example: zTuNVUXEAvvnNN3IaqinkyMw)
stringThe unique username of this user. (example: jane-doe)
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
id_or_namelimit, since, until, search, team_id, slugLists all members of a project.
id_or_name, role, uid, username, emailteam_id, slugAdds a new member to the project.
id_or_name, uidteam_id, slugRemove a member from a specific project
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringThe ID or name of the Project.
stringThe user ID of the member.
integerLimit how many project members should be returned
integerTimestamp in milliseconds to only include members added since then.
stringThe Team slug to perform the request on behalf of.
stringThe Team identifier to perform the request on behalf of. (wire: teamId)
integerTimestamp in milliseconds to only include members added until then.
+ +## `SELECT` examples + + + + +Lists all members of a project. + +```sql +SELECT +name, +avatar, +computed_project_role, +created_at, +email, +role, +team_role, +uid, +username +FROM vercel.project_members.members +WHERE id_or_name = '{{ id_or_name }}' -- required +AND limit = '{{ limit }}' +AND since = '{{ since }}' +AND until = '{{ until }}' +AND search = '{{ search }}' +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + + + +## `INSERT` examples + + + + +Adds a new member to the project. + +```sql +INSERT INTO vercel.project_members.members ( +uid, +username, +email, +role, +id_or_name, +team_id, +slug +) +SELECT +'{{ uid }}' /* required */, +'{{ username }}' /* required */, +'{{ email }}' /* required */, +'{{ role }}' /* required */, +'{{ id_or_name }}', +'{{ team_id }}', +'{{ slug }}' +RETURNING +id +; +``` + + + +{`# Description fields are for documentation purposes +- name: members + props: + - name: id_or_name + value: "{{ id_or_name }}" + description: Required parameter for the members resource. + - name: uid + value: "{{ uid }}" + description: | + The ID of the team member that should be added to this project. + - name: username + value: "{{ username }}" + description: | + The username of the team member that should be added to this project. + - name: email + value: "{{ email }}" + description: | + The email of the team member that should be added to this project. + - name: role + value: "{{ role }}" + description: | + The project role of the member that will be added. + valid_values: ['ADMIN', 'PROJECT_VIEWER', 'PROJECT_DEVELOPER'] + - name: team_id + value: "{{ team_id }}" + description: The Team identifier to perform the request on behalf of. + description: The Team identifier to perform the request on behalf of. + - name: slug + value: "{{ slug }}" + description: The Team slug to perform the request on behalf of. + description: The Team slug to perform the request on behalf of. +`} + + + + + +## `DELETE` examples + + + + +Remove a member from a specific project + +```sql +DELETE FROM vercel.project_members.members +WHERE id_or_name = '{{ id_or_name }}' --required +AND uid = '{{ uid }}' --required +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + diff --git a/website/docs/services/project_members/projects_members/index.md b/website/docs/services/project_members/projects_members/index.md deleted file mode 100644 index 65432eb..0000000 --- a/website/docs/services/project_members/projects_members/index.md +++ /dev/null @@ -1,248 +0,0 @@ ---- -title: projects_members -hide_title: false -hide_table_of_contents: false -keywords: - - projects_members - - project_members - - vercel - - infrastructure-as-code - - configuration-as-data - - cloud inventory -description: Query, deploy and manage vercel resources using SQL -custom_edit_url: null -image: /img/stackql-vercel-provider-featured-image.png ---- - -import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; - -Creates, updates, deletes, gets or lists a projects_members resource. - -## Overview - - - - -
Nameprojects_members
TypeResource
Id
- -## Fields - -The following fields are returned by `SELECT` queries: - - - - -Paginated list of members for the project. - - - - - - - - - - - -
NameDatatypeDescription
-
-
- -## Methods - -The following methods are available for this resource: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameAccessible byRequired ParamsOptional ParamsDescription
idOrName, teamIdlimit, since, until, searchLists all members of a project.
idOrName, uid, teamIdRemove a member from a specific project
idOrName, teamIdlimit, since, until, searchLists all members of a project.
idOrName, teamId, uidAdds a new member to the project.
- -## Parameters - -Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDatatypeDescription
stringThe ID or name of the Project.
stringThe Team identifier or slug to perform the request on behalf of.
stringThe user ID of the member.
integerLimit how many project members should be returned
integerTimestamp in milliseconds to only include members added since then.
integerTimestamp in milliseconds to only include members added until then.
- -## `SELECT` examples - - - - -Lists all members of a project. - -```sql -SELECT -* -FROM vercel.project_members.projects_members -WHERE idOrName = '{{ idOrName }}' -- required -AND teamId = '{{ teamId }}' -- required -AND limit = '{{ limit }}' -AND since = '{{ since }}' -AND until = '{{ until }}' -AND search = '{{ search }}' -; -``` - - - - -## `DELETE` examples - - - - -Remove a member from a specific project - -```sql -DELETE FROM vercel.project_members.projects_members -WHERE idOrName = '{{ idOrName }}' --required -AND uid = '{{ uid }}' --required -AND teamId = '{{ teamId }}' --required -; -``` - - - - -## Lifecycle Methods - - - - -Lists all members of a project. - -```sql -EXEC vercel.project_members.projects_members._get_project_members -@idOrName='{{ idOrName }}' --required, -@teamId='{{ teamId }}' --required, -@limit='{{ limit }}', -@since='{{ since }}', -@until='{{ until }}', -@search='{{ search }}' -; -``` - - - -Adds a new member to the project. - -```sql -EXEC vercel.project_members.projects_members.add_project_member -@idOrName='{{ idOrName }}' --required, -@teamId='{{ teamId }}' --required -@@json= -'{ -"uid": "{{ uid }}", -"username": "{{ username }}", -"email": "{{ email }}", -"role": "{{ role }}" -}' -; -``` - - diff --git a/website/docs/services/project_routes/index.md b/website/docs/services/project_routes/index.md new file mode 100644 index 0000000..0ec0a9f --- /dev/null +++ b/website/docs/services/project_routes/index.md @@ -0,0 +1,33 @@ +--- +title: project_routes +hide_title: false +hide_table_of_contents: false +keywords: + - project_routes + - vercel + - stackql + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +project_routes service documentation. + +:::info[Service Summary] + +total resources: __2__ + +::: + +## Resources +
+
+routes +
+ +
\ No newline at end of file diff --git a/website/docs/services/project_routes/routes/index.md b/website/docs/services/project_routes/routes/index.md new file mode 100644 index 0000000..e8909cd --- /dev/null +++ b/website/docs/services/project_routes/routes/index.md @@ -0,0 +1,464 @@ +--- +title: routes +hide_title: false +hide_table_of_contents: false +keywords: + - routes + - project_routes + - vercel + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a routes resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + +A routing rule with metadata for project-level routing. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringUnique identifier for the routing rule.
stringHuman-readable name for the routing rule.
stringOptional description of what the routing rule does.
booleanWhether the routing rule is enabled. Defaults to true. (false, true)
stringOriginal destination provided by user. (wire: rawDest)
stringOriginal source pattern provided by user (path-to-regexp or regex). Used to display the user's input in API responses. (wire: rawSrc)
objectThe route definition from @vercel/routing-utils.
stringComputed route type based on the route configuration. Only present in API responses, not stored in S3. (redirect, rewrite, set_status, transform) (wire: routeType)
stringThe syntax type of the source pattern. Determines how the pattern is compiled to regex. (equals, path-to-regexp, regex) (wire: srcSyntax)
booleanWhether this route is new and not yet published to production. Set to true only when a route is first created via add-route. Cleared (set to false) when a version is promoted to production. (false, true)
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
project_idversion_id, q, filter, diff, team_id, slugGet the routing rules for a project. Supports searching by name/ID/pattern, filtering by route type, and diffing staged changes against production.
project_id, routeteam_id, slugAdd a single routing rule to a project at a specified position. Defaults to the end of the list if no position is provided. The route is enabled by default. Stages a new version with the added route.
project_id, route_idteam_id, slugReplace a routing rule identified by its ID, or restore it from the current production version. Stages a new version with the modified route.
project_idteam_id, slugStage routing rules for a project. Set `overwrite` to true to replace all existing rules, or omit it to merge with existing rules by ID. Returns the new staged version.
project_idteam_id, slugDelete one or more routing rules from a project by ID. Stages a new version with the routes removed.
project_id, promptteamId, slugGenerate a routing rule configuration from a natural language description. Returns a suggested route configuration that can be reviewed and saved.
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string
string
string
string
stringThe Team slug to perform the request on behalf of.
stringThe Team identifier to perform the request on behalf of.
stringThe Team identifier to perform the request on behalf of. (wire: teamId)
string (wire: versionId)
+ +## `SELECT` examples + + + + +Get the routing rules for a project. Supports searching by name/ID/pattern, filtering by route type, and diffing staged changes against production. + +```sql +SELECT +id, +name, +description, +enabled, +raw_dest, +raw_src, +route, +route_type, +src_syntax, +staged +FROM vercel.project_routes.routes +WHERE project_id = '{{ project_id }}' -- required +AND version_id = '{{ version_id }}' +AND q = '{{ q }}' +AND filter = '{{ filter }}' +AND diff = '{{ diff }}' +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + + + +## `INSERT` examples + + + + +Add a single routing rule to a project at a specified position. Defaults to the end of the list if no position is provided. The route is enabled by default. Stages a new version with the added route. + +```sql +INSERT INTO vercel.project_routes.routes ( +route, +position, +project_id, +team_id, +slug +) +SELECT +'{{ route }}' /* required */, +'{{ position }}', +'{{ project_id }}', +'{{ team_id }}', +'{{ slug }}' +RETURNING +route, +version +; +``` + + + +{`# Description fields are for documentation purposes +- name: routes + props: + - name: project_id + value: "{{ project_id }}" + description: Required parameter for the routes resource. + - name: route + value: + name: "{{ name }}" + description: "{{ description }}" + enabled: {{ enabled }} + srcSyntax: "{{ srcSyntax }}" + route: + src: "{{ src }}" + dest: "{{ dest }}" + headers: "{{ headers }}" + caseSensitive: {{ caseSensitive }} + status: {{ status }} + has: + - type: "{{ type }}" + key: "{{ key }}" + value: "{{ value }}" + missing: + - type: "{{ type }}" + key: "{{ key }}" + value: "{{ value }}" + transforms: + - type: "{{ type }}" + op: "{{ op }}" + target: "{{ target }}" + args: "{{ args }}" + env: "{{ env }}" + respectOriginCacheControl: {{ respectOriginCacheControl }} + - name: position + description: | + Controls where the route is inserted. Defaults to "end" if omitted. + value: + placement: "{{ placement }}" + referenceId: "{{ referenceId }}" + - name: team_id + value: "{{ team_id }}" + description: The Team identifier to perform the request on behalf of. + description: The Team identifier to perform the request on behalf of. + - name: slug + value: "{{ slug }}" + description: The Team slug to perform the request on behalf of. + description: The Team slug to perform the request on behalf of. +`} + + + + + +## `UPDATE` examples + + + + +Replace a routing rule identified by its ID, or restore it from the current production version. Stages a new version with the modified route. + +```sql +UPDATE vercel.project_routes.routes +SET +route = '{{ route }}', +restore = {{ restore }} +WHERE +project_id = '{{ project_id }}' --required +AND route_id = '{{ route_id }}' --required +AND team_id = '{{ team_id}}' +AND slug = '{{ slug}}' +RETURNING +route, +version; +``` + + + + +## `REPLACE` examples + + + + +Stage routing rules for a project. Set `overwrite` to true to replace all existing rules, or omit it to merge with existing rules by ID. Returns the new staged version. + +```sql +REPLACE vercel.project_routes.routes +SET +overwrite = {{ overwrite }}, +routes = '{{ routes }}' +WHERE +project_id = '{{ project_id }}' --required +AND team_id = '{{ team_id}}' +AND slug = '{{ slug}}' +RETURNING +version; +``` + + + + +## `DELETE` examples + + + + +Delete one or more routing rules from a project by ID. Stages a new version with the routes removed. + +```sql +DELETE FROM vercel.project_routes.routes +WHERE project_id = '{{ project_id }}' --required +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + + + +## Lifecycle Methods + +EXEC variables use wire (API) names. + + + + +Generate a routing rule configuration from a natural language description. Returns a suggested route configuration that can be reviewed and saved. + +```sql +EXEC vercel.project_routes.routes.generate +@project_id='{{ project_id }}' --required, +@teamId='{{ teamId }}', +@slug='{{ slug }}' +@@json= +'{ +"prompt": "{{ prompt }}", +"currentRoute": "{{ currentRoute }}" +}' +; +``` + + diff --git a/website/docs/services/project_routes/versions/index.md b/website/docs/services/project_routes/versions/index.md new file mode 100644 index 0000000..2dee2b5 --- /dev/null +++ b/website/docs/services/project_routes/versions/index.md @@ -0,0 +1,226 @@ +--- +title: versions +hide_title: false +hide_table_of_contents: false +keywords: + - versions + - project_routes + - vercel + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a versions resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + +A version of routing rules stored in S3. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringUnique identifier for the version.
stringThe staging alias for previewing this version.
stringThe user who created this version. (wire: createdBy)
booleanWhether this version is currently live in production. (false, true) (wire: isLive)
booleanWhether this version is staged and not yet promoted to production. (false, true) (wire: isStaging)
numberTimestamp of when this version was last modified. (wire: lastModified)
numberThe number of routing rules in this version. (wire: ruleCount)
stringThe S3 key where the routing rules are stored. (wire: s3Key)
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
project_idteam_id, slugGet the version history for a project's routing rules. Returns the staging version (if one exists) followed by production versions, most recent first. The staging version has `isStaging: true` and the current production version has `isLive: true`.
project_id, id, actionteamId, slugPromote staged routing rules to production, restore a previous production version, or discard staged changes. - `promote`: Publishes the staging version to production. - `restore`: Rolls back to a previous production version. - `discard`: Removes the staging version without publishing.
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string
stringThe Team slug to perform the request on behalf of.
stringThe Team identifier to perform the request on behalf of.
stringThe Team identifier to perform the request on behalf of. (wire: teamId)
+ +## `SELECT` examples + + + + +Get the version history for a project's routing rules. Returns the staging version (if one exists) followed by production versions, most recent first. The staging version has `isStaging: true` and the current production version has `isLive: true`. + +```sql +SELECT +id, +alias, +created_by, +is_live, +is_staging, +last_modified, +rule_count, +s_3_key +FROM vercel.project_routes.versions +WHERE project_id = '{{ project_id }}' -- required +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + + + +## Lifecycle Methods + +EXEC variables use wire (API) names. + + + + +Promote staged routing rules to production, restore a previous production version, or discard staged changes. - `promote`: Publishes the staging version to production. - `restore`: Rolls back to a previous production version. - `discard`: Removes the staging version without publishing. + +```sql +EXEC vercel.project_routes.versions.update +@project_id='{{ project_id }}' --required, +@teamId='{{ teamId }}', +@slug='{{ slug }}' +@@json= +'{ +"id": "{{ id }}", +"action": "{{ action }}" +}' +; +``` + + diff --git a/website/docs/services/projects/domains/index.md b/website/docs/services/projects/domains/index.md index 2db62d7..5a8553c 100644 --- a/website/docs/services/projects/domains/index.md +++ b/website/docs/services/projects/domains/index.md @@ -15,6 +15,7 @@ image: /img/stackql-vercel-provider-featured-image.png --- import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; @@ -22,7 +23,7 @@ Creates, updates, deletes, gets or lists a domains resource. ## Overview - +
Namedomains
Name
TypeResource
Id
@@ -32,13 +33,13 @@ Creates, updates, deletes, gets or lists a domains resource. The following fields are returned by `SELECT` queries: - + @@ -55,24 +56,29 @@ The following fields are returned by `SELECT` queries: - + - + - - - + + + - + - + - + + + + + + - + @@ -80,14 +86,14 @@ The following fields are returned by `SELECT` queries: - + - + - + - + @@ -97,12 +103,12 @@ The following fields are returned by `SELECT` queries: - +
string (wire: customEnvironmentId)
numberstring (wire: projectId)
string (wire: apexName)
number (wire: createdAt)
string (wire: gitBranch)
number (301, 302, 307, 308, ) (wire: redirectStatusCode)
number (wire: updatedAt)
boolean`true` if the domain is verified for use with the project. If `false` it will not be used as an alias on this project until the challenge in `verification` is completed.`true` if the domain is verified for use with the project. If `false` it will not be used as an alias on this project until the challenge in `verification` is completed. (false, true)
- + Successful response retrieving a list of domains @@ -121,24 +127,29 @@ Successful response retrieving a list of domains - + string - + (wire: customEnvironmentId) - - number - + + string + (wire: projectId) - + string - + (wire: apexName) - + + number + (wire: createdAt) + + + string - + (wire: gitBranch) @@ -146,14 +157,14 @@ Successful response retrieving a list of domains - + number - + (301, 302, 307, 308, ) (wire: redirectStatusCode) - + number - + (wire: updatedAt) @@ -163,7 +174,7 @@ Successful response retrieving a list of domains boolean - `true` if the domain is verified for use with the project. If `false` it will not be used as an alias on this project until the challenge in `verification` is completed. + `true` if the domain is verified for use with the project. If `false` it will not be used as an alias on this project until the challenge in `verification` is completed. (false, true) @@ -186,52 +197,52 @@ The following methods are available for this resource: - + - idOrName, domain, teamId - + id_or_name, domain + team_id, slug Get project domain by project id/name and domain name. - + - idOrName, teamId - production, gitBranch, redirects, redirect, verified, limit, since, until, order + id_or_name + production, target, custom_environment_id, git_branch, redirects, redirect, verified, limit, since, until, order, team_id, slug Retrieve the domains associated with a given project by passing either the project `id` or `name` in the URL. - - - idOrName, domain, teamId - - Remove a domain from a project by passing the domain name and by specifying the project by either passing the project `id` or `name` in the URL. + + + id_or_name, name + team_id, slug + Add a domain to the project by passing its domain name and by specifying the project by either passing the project `id` or `name` in the URL. If the domain is not yet verified to be used on this project, the request will return `verified = false`, and the domain will need to be verified according to the `verification` challenge via `POST /projects/:idOrName/domains/:domain/verify`. If the domain already exists on the project, the request will fail with a `400` status code. - - - idOrName, teamId - production, gitBranch, redirects, redirect, verified, limit, since, until, order - Retrieve the domains associated with a given project by passing either the project `id` or `name` in the URL. + + + id_or_name, domain + team_id, slug + Update a project domain's configuration, including the name, git branch and redirect of the domain. - - - idOrName, domain, teamId - - Update a project domain's configuration, including the name, git branch and redirect of the domain. + + + id_or_name, domain + team_id, slug + Remove a domain from a project by passing the domain name and by specifying the project by either passing the project `id` or `name` in the URL. - + - idOrName, teamId, name - - Add a domain to the project by passing its domain name and by specifying the project by either passing the project `id` or `name` in the URL. If the domain is not yet verified to be used on this project, the request will return `verified = false`, and the domain will need to be verified according to the `verification` challenge via `POST /projects/:idOrName/domains/:domain/verify`. If the domain already exists on the project, the request will fail with a `400` status code. + id_or_name, domain, projectId + teamId, slug + Move one project's domain to another project. Also allows the move of all redirects pointed to that domain in the same project. - + - idOrName, domain, teamId - + id_or_name, domain + teamId, slug Attempts to verify a project domain with `verified = false` by checking the correctness of the project domain's `verification` challenge. @@ -255,20 +266,20 @@ Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](# string The domain name you want to verify - - + + string The unique project identifier or the project name - - + + string - The Team identifier or slug to perform the request on behalf of. + The unique custom environment identifier within the project (wire: customEnvironmentId) - - + + string - Filters domains based on specific branch. + Filters domains based on specific branch. (wire: gitBranch) @@ -293,13 +304,33 @@ Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](# - Excludes redirect project domains when \"false\". Includes redirect project domains when \"true\" (default). + Excludes redirect project domains when "false". Includes redirect project domains when "true" (default). number Get domains created after this JavaScript timestamp. + + + string + The Team slug to perform the request on behalf of. + + + + string + Filters on the target of the domain. Can be either "production", "preview" + + + + string + The Team identifier to perform the request on behalf of. + + + + string + The Team identifier to perform the request on behalf of. (wire: teamId) + number @@ -316,56 +347,60 @@ Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](# ## `SELECT` examples - + Get project domain by project id/name and domain name. ```sql SELECT name, -apexName, -createdAt, -gitBranch, -projectId, +custom_environment_id, +project_id, +apex_name, +created_at, +git_branch, redirect, -redirectStatusCode, -updatedAt, +redirect_status_code, +updated_at, verification, verified FROM vercel.projects.domains -WHERE idOrName = '{{ idOrName }}' -- required +WHERE id_or_name = '{{ id_or_name }}' -- required AND domain = '{{ domain }}' -- required -AND teamId = '{{ teamId }}' -- required +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' ; ``` - + Retrieve the domains associated with a given project by passing either the project `id` or `name` in the URL. ```sql SELECT name, -apexName, -createdAt, -gitBranch, -projectId, +custom_environment_id, +project_id, +apex_name, +created_at, +git_branch, redirect, -redirectStatusCode, -updatedAt, +redirect_status_code, +updated_at, verification, verified FROM vercel.projects.domains -WHERE idOrName = '{{ idOrName }}' -- required -AND teamId = '{{ teamId }}' -- required +WHERE id_or_name = '{{ id_or_name }}' -- required AND production = '{{ production }}' -AND gitBranch = '{{ gitBranch }}' +AND target = '{{ target }}' +AND custom_environment_id = '{{ custom_environment_id }}' +AND git_branch = '{{ git_branch }}' AND redirects = '{{ redirects }}' AND redirect = '{{ redirect }}' AND verified = '{{ verified }}' @@ -373,95 +408,193 @@ AND limit = '{{ limit }}' AND since = '{{ since }}' AND until = '{{ until }}' AND order = '{{ order }}' +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' ; ``` -## `DELETE` examples +## `INSERT` examples - + -Remove a domain from a project by passing the domain name and by specifying the project by either passing the project `id` or `name` in the URL. +Add a domain to the project by passing its domain name and by specifying the project by either passing the project `id` or `name` in the URL. If the domain is not yet verified to be used on this project, the request will return `verified = false`, and the domain will need to be verified according to the `verification` challenge via `POST /projects/:idOrName/domains/:domain/verify`. If the domain already exists on the project, the request will fail with a `400` status code. ```sql -DELETE FROM vercel.projects.domains -WHERE idOrName = '{{ idOrName }}' --required -AND domain = '{{ domain }}' --required -AND teamId = '{{ teamId }}' --required +INSERT INTO vercel.projects.domains ( +name, +git_branch, +custom_environment_id, +redirect, +redirect_status_code, +id_or_name, +team_id, +slug +) +SELECT +'{{ name }}' /* required */, +'{{ git_branch }}', +'{{ custom_environment_id }}', +'{{ redirect }}', +{{ redirect_status_code }}, +'{{ id_or_name }}', +'{{ team_id }}', +'{{ slug }}' +RETURNING +name, +custom_environment_id, +project_id, +apex_name, +created_at, +git_branch, +redirect, +redirect_status_code, +updated_at, +verification, +verified ; ``` + + + +{`# Description fields are for documentation purposes +- name: domains + props: + - name: id_or_name + value: "{{ id_or_name }}" + description: Required parameter for the domains resource. + - name: name + value: "{{ name }}" + description: | + The project domain name + - name: git_branch + value: "{{ git_branch }}" + description: | + Git branch to link the project domain + - name: custom_environment_id + value: "{{ custom_environment_id }}" + description: | + The unique custom environment identifier within the project + - name: redirect + value: "{{ redirect }}" + description: | + Target destination domain for redirect + - name: redirect_status_code + value: {{ redirect_status_code }} + description: | + Status code for domain redirect + valid_values: ['', '301', '302', '307', '308'] + - name: team_id + value: "{{ team_id }}" + description: The Team identifier to perform the request on behalf of. + description: The Team identifier to perform the request on behalf of. + - name: slug + value: "{{ slug }}" + description: The Team slug to perform the request on behalf of. + description: The Team slug to perform the request on behalf of. +`} + -## Lifecycle Methods +## `UPDATE` examples - + -Retrieve the domains associated with a given project by passing either the project `id` or `name` in the URL. +Update a project domain's configuration, including the name, git branch and redirect of the domain. ```sql -EXEC vercel.projects.domains._get_project_domains -@idOrName='{{ idOrName }}' --required, -@teamId='{{ teamId }}' --required, -@production='{{ production }}', -@gitBranch='{{ gitBranch }}', -@redirects='{{ redirects }}', -@redirect='{{ redirect }}', -@verified='{{ verified }}', -@limit='{{ limit }}', -@since='{{ since }}', -@until='{{ until }}', -@order='{{ order }}' -; +UPDATE vercel.projects.domains +SET +git_branch = '{{ git_branch }}', +redirect = '{{ redirect }}', +redirect_status_code = {{ redirect_status_code }} +WHERE +id_or_name = '{{ id_or_name }}' --required +AND domain = '{{ domain }}' --required +AND team_id = '{{ team_id}}' +AND slug = '{{ slug}}' +RETURNING +name, +custom_environment_id, +project_id, +apex_name, +created_at, +git_branch, +redirect, +redirect_status_code, +updated_at, +verification, +verified; ``` - + -Update a project domain's configuration, including the name, git branch and redirect of the domain. + +## `DELETE` examples + + + + +Remove a domain from a project by passing the domain name and by specifying the project by either passing the project `id` or `name` in the URL. ```sql -EXEC vercel.projects.domains.update_project_domain -@idOrName='{{ idOrName }}' --required, -@domain='{{ domain }}' --required, -@teamId='{{ teamId }}' --required -@@json= -'{ -"gitBranch": "{{ gitBranch }}", -"redirect": "{{ redirect }}", -"redirectStatusCode": {{ redirectStatusCode }} -}' +DELETE FROM vercel.projects.domains +WHERE id_or_name = '{{ id_or_name }}' --required +AND domain = '{{ domain }}' --required +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' ; ``` - + -Add a domain to the project by passing its domain name and by specifying the project by either passing the project `id` or `name` in the URL. If the domain is not yet verified to be used on this project, the request will return `verified = false`, and the domain will need to be verified according to the `verification` challenge via `POST /projects/:idOrName/domains/:domain/verify`. If the domain already exists on the project, the request will fail with a `400` status code. + +## Lifecycle Methods + +EXEC variables use wire (API) names. + + + + +Move one project's domain to another project. Also allows the move of all redirects pointed to that domain in the same project. ```sql -EXEC vercel.projects.domains.add_project_domain -@idOrName='{{ idOrName }}' --required, -@teamId='{{ teamId }}' --required +EXEC vercel.projects.domains.move +@id_or_name='{{ id_or_name }}' --required, +@domain='{{ domain }}' --required, +@teamId='{{ teamId }}', +@slug='{{ slug }}' @@json= '{ -"name": "{{ name }}", +"projectId": "{{ projectId }}", "gitBranch": "{{ gitBranch }}", "redirect": "{{ redirect }}", "redirectStatusCode": {{ redirectStatusCode }} @@ -469,15 +602,16 @@ EXEC vercel.projects.domains.add_project_domain ; ``` - + Attempts to verify a project domain with `verified = false` by checking the correctness of the project domain's `verification` challenge. ```sql -EXEC vercel.projects.domains.verify_project_domain -@idOrName='{{ idOrName }}' --required, +EXEC vercel.projects.domains.verify +@id_or_name='{{ id_or_name }}' --required, @domain='{{ domain }}' --required, -@teamId='{{ teamId }}' --required +@teamId='{{ teamId }}', +@slug='{{ slug }}' ; ``` diff --git a/website/docs/services/projects/env_vars/index.md b/website/docs/services/projects/env_vars/index.md new file mode 100644 index 0000000..ebdcdb0 --- /dev/null +++ b/website/docs/services/projects/env_vars/index.md @@ -0,0 +1,698 @@ +--- +title: env_vars +hide_title: false +hide_table_of_contents: false +keywords: + - env_vars + - projects + - vercel + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists an env_vars resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string
string (wire: configurationId)
string (wire: edgeConfigId)
string (wire: edgeConfigTokenId)
stringThis is used to identify variables that have been migrated from type secret to sensitive. (wire: sunsetSecretId)
string
(wire: contentHint)
number (wire: createdAt)
string (wire: createdBy)
array (wire: customEnvironmentIds)
boolean (false, true)
string (wire: gitBranch)
objectSimilar to `contentHints`, but should not be exposed to the user. (wire: internalContentHint)
string
stringLegacy now-encryption ciphertext, present after migration swaps value/vsmValue (wire: legacyValue)
string (encrypted, plain, secret, sensitive, system)
number (wire: updatedAt)
string (wire: updatedBy)
string
stringUser-facing config/secret model. When set, authoritative for new code paths when the env-var-config-secret-ui flag is enabled. Legacy rows omit this field; legacy rows omit it and callers fall back to existing `type` behavior. (config, secret)
+
+ + +The list of environment variables for the given project + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string
string (wire: configurationId)
string (wire: edgeConfigId)
string (wire: edgeConfigTokenId)
stringThis is used to identify variables that have been migrated from type secret to sensitive. (wire: sunsetSecretId)
string
(wire: contentHint)
number (wire: createdAt)
string (wire: createdBy)
array (wire: customEnvironmentIds)
boolean (false, true)
string (wire: gitBranch)
objectSimilar to `contentHints`, but should not be exposed to the user. (wire: internalContentHint)
string
stringLegacy now-encryption ciphertext, present after migration swaps value/vsmValue (wire: legacyValue)
array (wire: securityIssues)
boolean (false, true)
string (encrypted, plain, secret, sensitive, system)
number (wire: updatedAt)
string (wire: updatedBy)
string
stringUser-facing config/secret model. When set, authoritative for new code paths when the env-var-config-secret-ui flag is enabled. Legacy rows omit this field; legacy rows omit it and callers fall back to existing `type` behavior. (config, secret)
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
id_or_name, idteam_id, slugRetrieve the environment variable for a given project.
id_or_namegit_branch, decrypt, source, custom_environment_id, custom_environment_slug, team_id, slugRetrieve the environment variables for a given project by passing either the project `id` or `name` in the URL.
id_or_name, targetupsert, team_id, slugCreate one or more environment variables for a project by passing its `key`, `value`, `type` and `target` and by specifying the project by either passing the project `id` or `name` in the URL. If you include `upsert=true` as a query parameter, a new environment variable will not be created if it already exists but, the existing variable's value will be updated.
id_or_name, idteam_id, slugEdit a specific environment variable for a given project by passing the environment variable identifier and either passing the project `id` or `name` in the URL.
id_or_name, idcustom_environment_id, team_id, slugDelete a specific environment variable for a given project by passing the environment variable identifier and either passing the project `id` or `name` in the URL.
id_or_nameteam_id, slugDelete multiple environment variables for a given project in a single batch operation.
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringThe unique environment variable identifier
stringThe unique project identifier or the project name
stringThe unique custom environment identifier within the project (wire: customEnvironmentId)
stringThe custom environment slug (name) within the project (wire: customEnvironmentSlug)
stringIf true, the environment variable value will be decrypted
stringIf defined, the git branch of the environment variable to filter the results (must have target=preview) (wire: gitBranch)
stringThe Team slug to perform the request on behalf of.
stringThe source that is calling the endpoint.
stringThe Team identifier to perform the request on behalf of. (wire: teamId)
stringAllow override of environment variable if it already exists
+ +## `SELECT` examples + + + + +Retrieve the environment variable for a given project. + +```sql +SELECT +id, +configuration_id, +edge_config_id, +edge_config_token_id, +sunset_secret_id, +comment, +content_hint, +created_at, +created_by, +custom_environment_ids, +decrypted, +git_branch, +internal_content_hint, +key, +legacy_value, +target, +type, +updated_at, +updated_by, +value, +visibility +FROM vercel.projects.env_vars +WHERE id_or_name = '{{ id_or_name }}' -- required +AND id = '{{ id }}' -- required +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + + +Retrieve the environment variables for a given project by passing either the project `id` or `name` in the URL. + +```sql +SELECT +id, +configuration_id, +edge_config_id, +edge_config_token_id, +sunset_secret_id, +comment, +content_hint, +created_at, +created_by, +custom_environment_ids, +decrypted, +git_branch, +internal_content_hint, +key, +legacy_value, +security_issues, +system, +target, +type, +updated_at, +updated_by, +value, +visibility +FROM vercel.projects.env_vars +WHERE id_or_name = '{{ id_or_name }}' -- required +AND git_branch = '{{ git_branch }}' +AND decrypt = '{{ decrypt }}' +AND source = '{{ source }}' +AND custom_environment_id = '{{ custom_environment_id }}' +AND custom_environment_slug = '{{ custom_environment_slug }}' +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + + + +## `INSERT` examples + + + + +Create one or more environment variables for a project by passing its `key`, `value`, `type` and `target` and by specifying the project by either passing the project `id` or `name` in the URL. If you include `upsert=true` as a query parameter, a new environment variable will not be created if it already exists but, the existing variable's value will be updated. + +```sql +INSERT INTO vercel.projects.env_vars ( +key, +value, +type, +target, +git_branch, +comment, +custom_environment_ids, +id_or_name, +upsert, +team_id, +slug +) +SELECT +'{{ key }}', +'{{ value }}', +'{{ type }}', +'{{ target }}' /* required */, +'{{ git_branch }}', +'{{ comment }}', +'{{ custom_environment_ids }}', +'{{ id_or_name }}', +'{{ upsert }}', +'{{ team_id }}', +'{{ slug }}' +RETURNING +created, +failed +; +``` + + + +{`# Description fields are for documentation purposes +- name: env_vars + props: + - name: id_or_name + value: "{{ id_or_name }}" + description: Required parameter for the env_vars resource. + - name: key + value: "{{ key }}" + description: | + The name of the environment variable + - name: value + value: "{{ value }}" + description: | + The value of the environment variable + - name: type + value: "{{ type }}" + description: | + The type of environment variable + valid_values: ['system', 'encrypted', 'plain', 'sensitive'] + - name: target + value: "{{ target }}" + description: | + The target environment of the environment variable + - name: git_branch + value: "{{ git_branch }}" + description: | + If defined, the git branch of the environment variable (must have target=preview) + - name: comment + value: "{{ comment }}" + description: | + A comment to add context on what this environment variable is for + - name: custom_environment_ids + value: + - "{{ custom_environment_ids }}" + description: | + The custom environment IDs associated with the environment variable + - name: upsert + value: "{{ upsert }}" + description: Allow override of environment variable if it already exists + description: Allow override of environment variable if it already exists + - name: team_id + value: "{{ team_id }}" + description: The Team identifier to perform the request on behalf of. + description: The Team identifier to perform the request on behalf of. + - name: slug + value: "{{ slug }}" + description: The Team slug to perform the request on behalf of. + description: The Team slug to perform the request on behalf of. +`} + + + + + +## `UPDATE` examples + + + + +Edit a specific environment variable for a given project by passing the environment variable identifier and either passing the project `id` or `name` in the URL. + +```sql +UPDATE vercel.projects.env_vars +SET +key = '{{ key }}', +target = '{{ target }}', +git_branch = '{{ git_branch }}', +type = '{{ type }}', +value = '{{ value }}', +custom_environment_ids = '{{ custom_environment_ids }}', +comment = '{{ comment }}' +WHERE +id_or_name = '{{ id_or_name }}' --required +AND id = '{{ id }}' --required +AND team_id = '{{ team_id}}' +AND slug = '{{ slug}}' +RETURNING +id, +configuration_id, +edge_config_id, +edge_config_token_id, +sunset_secret_id, +comment, +content_hint, +created_at, +created_by, +custom_environment_ids, +decrypted, +git_branch, +internal_content_hint, +key, +legacy_value, +target, +type, +updated_at, +updated_by, +value, +visibility; +``` + + + + +## `DELETE` examples + + + + +Delete a specific environment variable for a given project by passing the environment variable identifier and either passing the project `id` or `name` in the URL. + +```sql +DELETE FROM vercel.projects.env_vars +WHERE id_or_name = '{{ id_or_name }}' --required +AND id = '{{ id }}' --required +AND custom_environment_id = '{{ custom_environment_id }}' +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + + +Delete multiple environment variables for a given project in a single batch operation. + +```sql +DELETE FROM vercel.projects.env_vars +WHERE id_or_name = '{{ id_or_name }}' --required +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + diff --git a/website/docs/services/projects/index.md b/website/docs/services/projects/index.md index 694dfe6..3b2f0a0 100644 --- a/website/docs/services/projects/index.md +++ b/website/docs/services/projects/index.md @@ -18,7 +18,7 @@ projects service documentation. :::info[Service Summary] -total resources: __3__ +total resources: __6__ ::: @@ -26,9 +26,12 @@ total resources: __3__ \ No newline at end of file diff --git a/website/docs/services/projects/projects/index.md b/website/docs/services/projects/projects/index.md index 6a6fb7e..9af5248 100644 --- a/website/docs/services/projects/projects/index.md +++ b/website/docs/services/projects/projects/index.md @@ -15,6 +15,7 @@ image: /img/stackql-vercel-provider-featured-image.png --- import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; @@ -22,7 +23,7 @@ Creates, updates, deletes, gets or lists a projects resource. ## Overview - +
Nameprojects
Name
TypeResource
Id
@@ -32,13 +33,13 @@ Creates, updates, deletes, gets or lists a projects resource. The following fields are returned by `SELECT` queries: - + The project information @@ -62,8 +63,43 @@ The project information - + string + (wire: accountId) + + + + string + (wire: connectConfigurationId) + + + + string + (wire: passiveConnectConfigurationId) + + + + string + (wire: transferToAccountId) + + + + string + (wire: transferredFromAccountId) + + + + string + (wire: concurrencyBucketName) + + + + object + + + + + array @@ -72,43 +108,63 @@ The project information - + boolean - + (false, true) (wire: appliedCve55182Migration) - + + boolean + (false, true) (wire: autoAssignCustomDomains) + + + string - + (wire: autoAssignCustomDomainsUpdatedBy) - + boolean - + (false, true) (wire: autoExposeSystemEnvs) - + string - - string + + object - - boolean - + + string + (wire: buildCommand) - + string - + (wire: commandForIgnoringBuildStep) + + + + boolean + (false, true) (wire: connectBuildsEnabled) - + + array + (wire: connectConfigurations) + + + number + (wire: createdAt) + + + + object @@ -117,29 +173,69 @@ The project information - + + array + (wire: customEnvironments) + + + boolean - + (false, true) (wire: customerSupportCodeVisibility) - + object - + (wire: dataCache) - + + object + (wire: defaultResourceConfig) + + + + object + Retention policies for deployments. These are enforced at the project level, but we also maintain an instance of this at the team level as a default policy that gets applied to new projects. (wire: deploymentExpiration) + + + + object + Project shape. `null` on a rule list clears the project's override for that rule type (fall back to team for every env); omitting is equivalent. Setting `deploymentPolicy` itself to `null` clears every override at once. Kept structurally distinct from {@link TeamDeploymentPolicy} so the two storage locations don't share a type by accident. (wire: deploymentPolicy) + + + string - + (wire: devCommand) - + boolean - + (false, true) (wire: directoryListing) + + + + array + (wire: dismissedToasts) - + boolean - + (false, true) (wire: enableAffectedProjectsDeployments) + + + + boolean + (false, true) (wire: enableExternalRewriteCaching) + + + + boolean + (false, true, ) (wire: enablePreviewFeedback) + + + + boolean + (false, true, ) (wire: enableProductionFeedback) @@ -147,84 +243,139 @@ The project information - - string + + object - + object - + + string + (actix-web, angular, ash, astro, axum, blitzjs, brunch, bun, container, create-react-app, django, docusaurus, docusaurus-2, dojo, eleventy, elysia, ember, eve, express, factory-eve, fastapi, fasthtml, fastify, flask, gatsby, go, gridsome, h3, hexo, hono, hugo, hydrogen, ionic-angular, ionic-react, jekyll, koa, mastra, middleman, nestjs, nextjs, nitro, node, nuxtjs, parcel, polymer, preact, python, react-router, redwoodjs, remix, ruby, rust, saber, sanity, sanity-v2, sapper, scully, services, solidstart, solidstart-1, stencil, storybook, svelte, sveltekit, sveltekit-1, tanstack-start, tanstack-start-lovable, umijs, vite, vitepress, vue, vuepress, xmcp, zola, ) + + + + object + (wire: gitComments) + + + boolean - + (false, true) (wire: gitForkProtection) - + boolean - + (false, true) (wire: gitLFS) - + + object + (wire: gitProviderOptions) + + + boolean - + (false, true) (wire: hasActiveBranches) - + boolean - + (false, true) (wire: hasDeployments) - + string + (wire: installCommand) + + + + array - + + array + (wire: internalRoutes) + + + + array + (wire: ipBuckets) + + + object - + object - + (wire: lastAliasRequest) - + + string + (opaque JSON object) (wire: lastRollbackTarget) + + + array - + (wire: latestDeployments) - + object boolean + (false, true) + + + + object - + string - + (10.x, 12.x, 14.x, 16.x, 18.x, 20.x, 22.x, 24.x, 8.10.x) (wire: nodeVersion) - + + object + (wire: oidcTokenConfig) + + + + object + (wire: optionsAllowlist) + + + string - + (wire: outputDirectory) - + object + + + string + (opaque JSON object) (wire: passwordProtection) + boolean - + (false, true) @@ -232,44 +383,104 @@ The project information - + boolean - + (false, true) (wire: productionDeploymentsFastLane) - + + boolean + (false, true) (wire: protectedSourcemaps) + + + object - + (wire: protectionBypass) - - boolean - + + object + (wire: protectionConfig) + + + + object + (wire: resourceConfig) + + + + object + Description of why a project was rolled back, and by whom. Note that lastAliasRequest contains the from/to details of the rollback. (wire: rollbackDescription) + + + + object + Project-level rolling release configuration that defines how deployments should be gradually rolled out (wire: rollingRelease) - + string + (wire: rootDirectory) + + + + object - - string + + object - + boolean + (false, true) (wire: serverlessFunctionZeroConfigFailover) + + + + array - + + array + (wire: skewProtectionAllowedDomains) + + + + number + (wire: skewProtectionBoundaryAt) + + + + number + (wire: skewProtectionMaxAge) + + + boolean - + (false, true) (wire: skipGitConnectDuringLink) - + + boolean + (false, true) (wire: sourceFilesOutsideRootDirectory) + + + object - + (wire: speedInsights) + + + + object + (wire: ssoProtection) + + + + object + (wire: staticIps) @@ -277,41 +488,64 @@ The project information - - number + + string + (advanced, critical, priority) + + + + object - + number - + (wire: transferCompletedAt) - - string - + + number + (wire: transferStartedAt) - - string - + + object + (wire: trustedIps) - - - + + object + (wire: trustedSources) - + number - + (wire: updatedAt) + + + + object + (wire: usageStatus) + + + + boolean + (false, true) (wire: v0) + + + + boolean + (false, true) (wire: v0Created) + + + + object + (wire: webAnalytics) - - -The paginated list of projects + @@ -333,84 +567,94 @@ The paginated list of projects - + - + - + + + + + + + + + + + - - + + - - + + - + - + - - - + + + - + - + - + - + - + - + + + + + + - + - + - - + + - + - + - + - + - + - + - + - - - - - - + @@ -420,52 +664,47 @@ The paginated list of projects - + - + - + - + - + - - - - - - - - + + + - + - + - + - + - - - + + + - - - + + + - + - + @@ -475,72 +714,87 @@ The paginated list of projects - + - + - + + + + + + - + - + - + + + + + + - + - + - + - - - + + + - - - + + + - - + + - + - + - - - + + + - + - + - + - + - + - + + + + + + @@ -548,34 +802,34 @@ The paginated list of projects - - - + + + - + - + - - - + + + - - - + + + - - - + + + - - - + + +
string (wire: accountId)
string (wire: transferToAccountId)
string (wire: transferredFromAccountId)
object
booleanarray
stringobject
boolean (false, true) (wire: appliedCve55182Migration)
stringboolean (false, true) (wire: autoAssignCustomDomains)
string (wire: autoAssignCustomDomainsUpdatedBy)
boolean (false, true) (wire: autoExposeSystemEnvs)
string (wire: buildCommand)
string (wire: commandForIgnoringBuildStep)
number (wire: createdAt)
object
boolean (false, true) (wire: customerSupportCodeVisibility)
objectRetention policies for deployments. These are enforced at the project level, but we also maintain an instance of this at the team level as a default policy that gets applied to new projects. (wire: deploymentExpiration)
string (wire: devCommand)
boolean
boolean (false, true) (wire: directoryListing)
string (actix-web, angular, ash, astro, axum, blitzjs, brunch, bun, container, create-react-app, django, docusaurus, docusaurus-2, dojo, eleventy, elysia, ember, eve, express, factory-eve, fastapi, fasthtml, fastify, flask, gatsby, go, gridsome, h3, hexo, hono, hugo, hydrogen, ionic-angular, ionic-react, jekyll, koa, mastra, middleman, nestjs, nextjs, nitro, node, nuxtjs, parcel, polymer, preact, python, react-router, redwoodjs, remix, ruby, rust, saber, sanity, sanity-v2, sapper, scully, services, solidstart, solidstart-1, stencil, storybook, svelte, sveltekit, sveltekit-1, tanstack-start, tanstack-start-lovable, umijs, vite, vitepress, vue, vuepress, xmcp, zola, )
object (wire: gitComments)
boolean (false, true) (wire: gitForkProtection)
boolean
booleanobject (wire: gitProviderOptions)
boolean (false, true) (wire: hasActiveBranches)
string (wire: installCommand)
objectarray (wire: internalRoutes)
objectarray (wire: ipBuckets)
array (wire: latestDeployments)
boolean (false, true)
string (10.x, 12.x, 14.x, 16.x, 18.x, 20.x, 22.x, 24.x, 8.10.x) (wire: nodeVersion)
object (wire: oidcTokenConfig)
string (wire: outputDirectory)
object
string(opaque JSON object) (wire: passwordProtection)
boolean (false, true)
object (wire: resourceConfig)
booleanobjectProject-level rolling release configuration that defines how deployments should be gradually rolled out (wire: rollingRelease)
objectstring (wire: rootDirectory)
booleanobject
string (wire: serverlessFunctionRegion)
stringboolean (false, true) (wire: serverlessFunctionZeroConfigFailover)
boolean (false, true) (wire: skipGitConnectDuringLink)
boolean (false, true) (wire: sourceFilesOutsideRootDirectory)
object (wire: speedInsights)
object (wire: ssoProtection)
numberstring (advanced, critical, priority)
number (wire: transferCompletedAt)
stringnumber (wire: transferStartedAt)
stringobject (wire: trustedSources)
number (wire: updatedAt)
numberobject (wire: webAnalytics)
@@ -598,53 +852,102 @@ The following methods are available for this resource: - + - idOrName, teamId - + id_or_name + team_id, slug Get the information for a specific project by passing either the project `id` or `name` in the URL. - + - teamId - from, gitForkProtection, limit, search, repo, repoId, repoUrl, excludeRepos, edgeConfigId, edgeConfigTokenId + + from, git_fork_protection, limit, search, repo, repo_id, repo_url, exclude_repos, edge_config_id, edge_config_token_id, deprecated, elastic_concurrency_enabled, static_ips_enabled, build_machine_types, build_queue_configuration, team_id, slug Allows to retrieve the list of projects of the authenticated user or team. The list will be paginated and the provided query parameters allow filtering the returned projects. - + - teamId, data__name - + name + team_id, slug Allows to create a new project with the provided configuration. It only requires the project `name` but more configuration can be provided to override the defaults. - + + + id_or_name + team_id, slug + Update the fields of a project using either its `name` or `id`. + + + - idOrName, teamId - + id_or_name + team_id, slug Delete a specific project by passing either the project `id` or `name` in the URL. - + - projectId, teamId - - Update the data cache feature on a project. + id_or_name + teamId, slug + Generates an OIDC token for the project and returns it. - + - teamId - from, gitForkProtection, limit, search, repo, repoId, repoUrl, excludeRepos, edgeConfigId, edgeConfigTokenId - Allows to retrieve the list of projects of the authenticated user or team. The list will be paginated and the provided query parameters allow filtering the returned projects. + id_or_name, value + teamId, slug + Upload an image as the avatar of the project identified by `idOrName`. The request body is the raw bytes of a JPG, PNG, or SVG image; the `Content-Type` header must declare which. SVG payloads are sanitized and optimized server-side before storage. The final SHA-1 of the stored bytes becomes the project's `avatar` value. The actual upload pipeline (validation, sanitization, S3 write, conditional `updateProject`, and event emission) lives in the shared `@api/project-avatar-upload` helper so it can be reused by background workers. + + + + + id_or_name + teamId, slug + Update the deployment protection automation bypass for a project - + - idOrName, teamId + project_id, deployment_id + description, teamId, slug + Allows users to rollback to a deployment. + + + + + project_id, deployment_id - Update the fields of a project using either its `name` or `id`. + Updates the reason for a rollback, without changing the rollback status itself. + + + + + project_id + teamId, slug + Update the microfrontends settings for a project. + + + + + project_id, deployment_id + teamId, slug + Allows users to promote a deployment to production. Note: This does NOT rebuild the deployment. If you need that, then call create-deployments endpoint. + + + + + project_id + teamId, slug + Pause a project by passing its project `id` in the URL. If the project does not exist given the id then the request will fail with 400 status code. If the project disables auto assigning custom production domains and blocks the active Production Deployment then the request will return with 200 status code. + + + + + project_id + teamId, slug + Unpause a project by passing its project `id` in the URL. If the project does not exist given the id then the request will fail with 400 status code. If the project enables auto assigning custom production domains and unblocks the active Production Deployment then the request will return with 200 status code. @@ -662,45 +965,70 @@ Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](# - - + + + string + + + + string The unique project identifier or the project name - - + + string The unique project identifier - - + + + string + Filter results by effective build machine types. Accepts comma-separated values. Use "elastic" for projects with elastic selection and "default" for projects without a build machine type set. (wire: buildMachineTypes) + + + + string + Filter results by build queue configuration. SKIP_NAMESPACE_QUEUE includes projects without a configuration set. (wire: buildQueueConfiguration) + + + + boolean + + + + + string + The reason for the rollback + + + string - The Team identifier or slug to perform the request on behalf of. + Filter results by connected Global Config ID (wire: edgeConfigId) - - + + string - Filter results by connected Edge Config ID + Filter results by connected Global Config Token ID (wire: edgeConfigTokenId) - - + + string - Filter results by connected Edge Config Token ID + Filter results by projects with elastic concurrency enabled (wire: elasticConcurrencyEnabled) - - + + string - Filter results by excluding those projects that belong to a repo + Filter results by excluding those projects that belong to a repo (wire: excludeRepos) string - Query only projects updated after the given timestamp + Query only projects updated after the given timestamp or continuation token. - - + + string - Specifies whether PRs from Git forks should require a team member's authorization before it can be deployed + Specifies whether PRs from Git forks should require a team member's authorization before it can be deployed (wire: gitForkProtection) @@ -712,34 +1040,54 @@ Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](# string Filter results by repo. Also used for project count - - + + string - Filter results by Repository ID. + Filter results by Repository ID. (wire: repoId) - - + + string - Filter results by Repository URL. + Filter results by Repository URL. (wire: repoUrl) string Search projects by the name field + + + string + The Team slug to perform the request on behalf of. + + + + string + Filter results by projects with Static IPs enabled (wire: staticIpsEnabled) + + + + string + The Team identifier to perform the request on behalf of. + + + + string + The Team identifier to perform the request on behalf of. (wire: teamId) + ## `SELECT` examples - + Get the information for a specific project by passing either the project `id` or `name` in the URL. @@ -747,62 +1095,110 @@ Get the information for a specific project by passing either the project `id` or SELECT id, name, -accountId, +account_id, +connect_configuration_id, +passive_connect_configuration_id, +transfer_to_account_id, +transferred_from_account_id, +concurrency_bucket_name, +abuse, +alias, analytics, -autoAssignCustomDomains, -autoAssignCustomDomainsUpdatedBy, -autoExposeSystemEnvs, -buildCommand, -commandForIgnoringBuildStep, -connectBuildsEnabled, -connectConfigurationId, -createdAt, +applied_cve_55182_migration, +auto_assign_custom_domains, +auto_assign_custom_domains_updated_by, +auto_expose_system_envs, +avatar, +blobs, +build_command, +command_for_ignoring_build_step, +connect_builds_enabled, +connect_configurations, +created_at, +creator, crons, -customerSupportCodeVisibility, -dataCache, -devCommand, -directoryListing, -enablePreviewFeedback, +custom_environments, +customer_support_code_visibility, +data_cache, +default_resource_config, +deployment_expiration, +deployment_policy, +dev_command, +directory_listing, +dismissed_toasts, +enable_affected_projects_deployments, +enable_external_rewrite_caching, +enable_preview_feedback, +enable_production_feedback, env, +expiration, +features, framework, -gitComments, -gitForkProtection, -gitLFS, -hasActiveBranches, -hasFloatingAliases, -installCommand, -lastAliasRequest, -lastRollbackTarget, -latestDeployments, +git_comments, +git_fork_protection, +git_lfs, +git_provider_options, +has_active_branches, +has_deployments, +install_command, +integrations, +internal_routes, +ip_buckets, +jobs, +last_alias_request, +last_rollback_target, +latest_deployments, link, live, -nodeVersion, -outputDirectory, -passwordProtection, +microfrontends, +node_version, +oidc_token_config, +options_allowlist, +output_directory, +passport, +password_protection, paused, permissions, -productionDeploymentsFastLane, -protectionBypass, -publicSource, -rootDirectory, -serverlessFunctionRegion, -skipGitConnectDuringLink, -sourceFilesOutsideRootDirectory, -ssoProtection, +production_deployments_fast_lane, +protected_sourcemaps, +protection_bypass, +protection_config, +resource_config, +rollback_description, +rolling_release, +root_directory, +sandbox, +security, +serverless_function_zero_config_failover, +services, +skew_protection_allowed_domains, +skew_protection_boundary_at, +skew_protection_max_age, +skip_git_connect_during_link, +source_files_outside_root_directory, +speed_insights, +sso_protection, +static_ips, targets, -transferCompletedAt, -transferStartedAt, -transferToAccountId, -transferredFromAccountId, -trustedIps, -updatedAt +tier, +tracing, +transfer_completed_at, +transfer_started_at, +trusted_ips, +trusted_sources, +updated_at, +usage_status, +v_0, +v_0_created, +web_analytics FROM vercel.projects.projects -WHERE idOrName = '{{ idOrName }}' -- required -AND teamId = '{{ teamId }}' -- required +WHERE id_or_name = '{{ id_or_name }}' -- required +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' ; ``` - + Allows to retrieve the list of projects of the authenticated user or team. The list will be paginated and the provided query parameters allow filtering the returned projects. @@ -810,67 +1206,77 @@ Allows to retrieve the list of projects of the authenticated user or team. The l SELECT id, name, -accountId, +account_id, +transfer_to_account_id, +transferred_from_account_id, +abuse, +alias, analytics, -autoAssignCustomDomains, -autoAssignCustomDomainsUpdatedBy, -autoExposeSystemEnvs, -buildCommand, -commandForIgnoringBuildStep, -connectBuildsEnabled, -connectConfigurationId, -createdAt, -crons, -customerSupportCodeVisibility, -dataCache, -devCommand, -directoryListing, -enablePreviewFeedback, +applied_cve_55182_migration, +auto_assign_custom_domains, +auto_assign_custom_domains_updated_by, +auto_expose_system_envs, +build_command, +command_for_ignoring_build_step, +created_at, +creator, +customer_support_code_visibility, +deployment_expiration, +dev_command, +directory_listing, env, framework, -gitComments, -gitForkProtection, -gitLFS, -hasActiveBranches, -hasFloatingAliases, -installCommand, -lastAliasRequest, -lastRollbackTarget, -latestDeployments, +git_comments, +git_fork_protection, +git_provider_options, +has_active_branches, +install_command, +internal_routes, +ip_buckets, +latest_deployments, link, live, -nodeVersion, -outputDirectory, -passwordProtection, +node_version, +oidc_token_config, +output_directory, +passport, +password_protection, paused, -permissions, -productionDeploymentsFastLane, -protectionBypass, -publicSource, -rootDirectory, -serverlessFunctionRegion, -skipGitConnectDuringLink, -sourceFilesOutsideRootDirectory, -ssoProtection, +resource_config, +rolling_release, +root_directory, +security, +serverless_function_region, +serverless_function_zero_config_failover, +skip_git_connect_during_link, +source_files_outside_root_directory, +speed_insights, +sso_protection, targets, -transferCompletedAt, -transferStartedAt, -transferToAccountId, -transferredFromAccountId, -trustedIps, -updatedAt +tier, +transfer_completed_at, +transfer_started_at, +trusted_sources, +updated_at, +web_analytics FROM vercel.projects.projects -WHERE teamId = '{{ teamId }}' -- required -AND from = '{{ from }}' -AND gitForkProtection = '{{ gitForkProtection }}' +WHERE from = '{{ from }}' +AND git_fork_protection = '{{ git_fork_protection }}' AND limit = '{{ limit }}' AND search = '{{ search }}' AND repo = '{{ repo }}' -AND repoId = '{{ repoId }}' -AND repoUrl = '{{ repoUrl }}' -AND excludeRepos = '{{ excludeRepos }}' -AND edgeConfigId = '{{ edgeConfigId }}' -AND edgeConfigTokenId = '{{ edgeConfigTokenId }}' +AND repo_id = '{{ repo_id }}' +AND repo_url = '{{ repo_url }}' +AND exclude_repos = '{{ exclude_repos }}' +AND edge_config_id = '{{ edge_config_id }}' +AND edge_config_token_id = '{{ edge_config_token_id }}' +AND deprecated = '{{ deprecated }}' +AND elastic_concurrency_enabled = '{{ elastic_concurrency_enabled }}' +AND static_ips_enabled = '{{ static_ips_enabled }}' +AND build_machine_types = '{{ build_machine_types }}' +AND build_queue_configuration = '{{ build_queue_configuration }}' +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' ; ``` @@ -880,163 +1286,470 @@ AND edgeConfigTokenId = '{{ edgeConfigTokenId }}' ## `INSERT` examples - + Allows to create a new project with the provided configuration. It only requires the project `name` but more configuration can be provided to override the defaults. ```sql INSERT INTO vercel.projects.projects ( -data__buildCommand, -data__commandForIgnoringBuildStep, -data__devCommand, -data__environmentVariables, -data__framework, -data__gitRepository, -data__installCommand, -data__name, -data__skipGitConnectDuringLink, -data__outputDirectory, -data__publicSource, -data__rootDirectory, -data__serverlessFunctionRegion, -teamId +enable_preview_feedback, +enable_production_feedback, +preview_deployments_disabled, +preview_deployment_suffix, +build_command, +command_for_ignoring_build_step, +dev_command, +environment_variables, +framework, +git_repository, +install_command, +name, +skip_git_connect_during_link, +sso_protection, +sandbox, +output_directory, +public_source, +root_directory, +serverless_function_region, +serverless_function_zero_config_failover, +oidc_token_config, +enable_affected_projects_deployments, +resource_config, +team_id, +slug ) SELECT -'{{ buildCommand }}', -'{{ commandForIgnoringBuildStep }}', -'{{ devCommand }}', -'{{ environmentVariables }}', +{{ enable_preview_feedback }}, +{{ enable_production_feedback }}, +{{ preview_deployments_disabled }}, +'{{ preview_deployment_suffix }}', +'{{ build_command }}', +'{{ command_for_ignoring_build_step }}', +'{{ dev_command }}', +'{{ environment_variables }}', '{{ framework }}', -'{{ gitRepository }}', -'{{ installCommand }}', +'{{ git_repository }}', +'{{ install_command }}', '{{ name }}' /* required */, -{{ skipGitConnectDuringLink }}, -'{{ outputDirectory }}', -{{ publicSource }}, -'{{ rootDirectory }}', -'{{ serverlessFunctionRegion }}', -'{{ teamId }}' +{{ skip_git_connect_during_link }}, +'{{ sso_protection }}', +'{{ sandbox }}', +'{{ output_directory }}', +{{ public_source }}, +'{{ root_directory }}', +'{{ serverless_function_region }}', +{{ serverless_function_zero_config_failover }}, +'{{ oidc_token_config }}', +{{ enable_affected_projects_deployments }}, +'{{ resource_config }}', +'{{ team_id }}', +'{{ slug }}' RETURNING id, name, -accountId, +account_id, +connect_configuration_id, +passive_connect_configuration_id, +transfer_to_account_id, +transferred_from_account_id, +concurrency_bucket_name, +abuse, +alias, analytics, -autoAssignCustomDomains, -autoAssignCustomDomainsUpdatedBy, -autoExposeSystemEnvs, -buildCommand, -commandForIgnoringBuildStep, -connectBuildsEnabled, -connectConfigurationId, -createdAt, +applied_cve_55182_migration, +auto_assign_custom_domains, +auto_assign_custom_domains_updated_by, +auto_expose_system_envs, +avatar, +blobs, +build_command, +command_for_ignoring_build_step, +connect_builds_enabled, +connect_configurations, +created_at, +creator, crons, -customerSupportCodeVisibility, -dataCache, -devCommand, -directoryListing, -enablePreviewFeedback, +custom_environments, +customer_support_code_visibility, +data_cache, +default_resource_config, +deployment_expiration, +deployment_policy, +dev_command, +directory_listing, +dismissed_toasts, +enable_affected_projects_deployments, +enable_external_rewrite_caching, +enable_preview_feedback, +enable_production_feedback, env, +expiration, +features, framework, -gitComments, -gitForkProtection, -gitLFS, -hasActiveBranches, -hasFloatingAliases, -installCommand, -lastAliasRequest, -lastRollbackTarget, -latestDeployments, +git_comments, +git_fork_protection, +git_lfs, +git_provider_options, +has_active_branches, +has_deployments, +install_command, +internal_routes, +ip_buckets, +jobs, +last_alias_request, +last_rollback_target, +latest_deployments, link, live, -nodeVersion, -outputDirectory, -passwordProtection, +microfrontends, +node_version, +oidc_token_config, +options_allowlist, +output_directory, +passport, +password_protection, paused, permissions, -productionDeploymentsFastLane, -protectionBypass, -publicSource, -rootDirectory, -serverlessFunctionRegion, -skipGitConnectDuringLink, -sourceFilesOutsideRootDirectory, -ssoProtection, +production_deployments_fast_lane, +protected_sourcemaps, +protection_bypass, +protection_config, +resource_config, +rollback_description, +rolling_release, +root_directory, +sandbox, +security, +serverless_function_zero_config_failover, +services, +skew_protection_allowed_domains, +skew_protection_boundary_at, +skew_protection_max_age, +skip_git_connect_during_link, +source_files_outside_root_directory, +speed_insights, +sso_protection, +static_ips, targets, -transferCompletedAt, -transferStartedAt, -transferToAccountId, -transferredFromAccountId, -trustedIps, -updatedAt +tier, +tracing, +transfer_completed_at, +transfer_started_at, +trusted_ips, +trusted_sources, +updated_at, +usage_status, +v_0, +v_0_created, +web_analytics ; ``` -```yaml -# Description fields are for documentation purposes +{`# Description fields are for documentation purposes - name: projects props: - - name: teamId - value: string - description: Required parameter for the projects resource. - - name: buildCommand - value: string + - name: enable_preview_feedback + value: {{ enable_preview_feedback }} + description: | + Opt-in to preview toolbar on the project level + - name: enable_production_feedback + value: {{ enable_production_feedback }} + description: | + Opt-in to production toolbar on the project level + - name: preview_deployments_disabled + value: {{ preview_deployments_disabled }} + description: | + Specifies whether preview deployments are disabled for this project. + - name: preview_deployment_suffix + value: "{{ preview_deployment_suffix }}" description: | - The build command for this project. When `null` is used this value will be automatically detected - - name: commandForIgnoringBuildStep - value: string - - name: devCommand - value: string + Custom domain suffix for preview deployments. Takes precedence over team-level suffix. Must be a domain owned by the team. + - name: build_command + value: "{{ build_command }}" description: | - The dev command for this project. When `null` is used this value will be automatically detected - - name: environmentVariables - value: array + The build command for this project. When \`null\` is used this value will be automatically detected + - name: command_for_ignoring_build_step + value: "{{ command_for_ignoring_build_step }}" + - name: dev_command + value: "{{ dev_command }}" + description: | + The dev command for this project. When \`null\` is used this value will be automatically detected + - name: environment_variables description: | Collection of ENV Variables the Project will use + value: + - key: "{{ key }}" + target: "{{ target }}" + gitBranch: "{{ gitBranch }}" + type: "{{ type }}" + value: "{{ value }}" - name: framework - value: string + value: "{{ framework }}" description: | - The framework that is being used for this project. When `null` is used no framework is selected - valid_values: ['', 'blitzjs', 'nextjs', 'gatsby', 'remix', 'astro', 'hexo', 'eleventy', 'docusaurus-2', 'docusaurus', 'preact', 'solidstart', 'dojo', 'ember', 'vue', 'scully', 'ionic-angular', 'angular', 'polymer', 'svelte', 'sveltekit', 'sveltekit-1', 'ionic-react', 'create-react-app', 'gridsome', 'umijs', 'sapper', 'saber', 'stencil', 'nuxtjs', 'redwoodjs', 'hugo', 'jekyll', 'brunch', 'middleman', 'zola', 'hydrogen', 'vite', 'vitepress', 'vuepress', 'parcel', 'sanity', 'storybook'] - - name: gitRepository - value: object + The framework that is being used for this project. When \`null\` is used no framework is selected + valid_values: ['', 'container', 'blitzjs', 'nextjs', 'gatsby', 'remix', 'react-router', 'astro', 'hexo', 'eleventy', 'docusaurus-2', 'docusaurus', 'preact', 'solidstart-1', 'solidstart', 'dojo', 'ember', 'vue', 'scully', 'ionic-angular', 'angular', 'polymer', 'svelte', 'sveltekit', 'sveltekit-1', 'ionic-react', 'create-react-app', 'gridsome', 'umijs', 'sapper', 'saber', 'stencil', 'nuxtjs', 'redwoodjs', 'hugo', 'jekyll', 'brunch', 'middleman', 'zola', 'hydrogen', 'vite', 'tanstack-start', 'tanstack-start-lovable', 'vitepress', 'vuepress', 'parcel', 'fastapi', 'flask', 'fasthtml', 'django', 'ash', 'factory-eve', 'eve', 'sanity', 'sanity-v2', 'storybook', 'nitro', 'hono', 'express', 'h3', 'koa', 'nestjs', 'elysia', 'fastify', 'xmcp', 'python', 'ruby', 'rust', 'axum', 'actix-web', 'bun', 'node', 'go', 'services', 'mastra'] + - name: git_repository description: | The Git Repository that will be connected to the project. When this is defined, any pushes to the specified connected Git Repository will be automatically deployed - - name: installCommand - value: string + value: + repo: "{{ repo }}" + type: "{{ type }}" + - name: install_command + value: "{{ install_command }}" description: | - The install command for this project. When `null` is used this value will be automatically detected + The install command for this project. When \`null\` is used this value will be automatically detected - name: name - value: string + value: "{{ name }}" description: | The desired name for the project - - name: skipGitConnectDuringLink - value: boolean + - name: skip_git_connect_during_link + value: {{ skip_git_connect_during_link }} + description: | + Opts-out of the message prompting a CLI user to connect a Git repository in \`vercel link\`. + - name: sso_protection description: | - Opts-out of the message prompting a CLI user to connect a Git repository in `vercel link`. - - name: outputDirectory - value: string + The Vercel Auth setting for the project (historically named \"SSO Protection\") + value: + deploymentType: "{{ deploymentType }}" + - name: sandbox description: | - The output directory of the project. When `null` is used this value will be automatically detected - - name: publicSource - value: boolean + Specifies the default region and failover regions for sandboxes created in the project + value: + region: "{{ region }}" + failoverRegions: "{{ failoverRegions }}" + - name: output_directory + value: "{{ output_directory }}" description: | - Specifies whether the source code and logs of the deployments for this project should be public or not - - name: rootDirectory - value: string + The output directory of the project. When \`null\` is used this value will be automatically detected + - name: public_source + value: {{ public_source }} description: | - The name of a directory or relative path to the source code of your project. When `null` is used it will default to the project root - - name: serverlessFunctionRegion - value: string + Deprecated. Accepted for backwards compatibility but ignored. + - name: root_directory + value: "{{ root_directory }}" + description: | + The name of a directory or relative path to the source code of your project. When \`null\` is used it will default to the project root + - name: serverless_function_region + value: "{{ serverless_function_region }}" description: | The region to deploy Serverless Functions in this project + - name: serverless_function_zero_config_failover + value: {{ serverless_function_zero_config_failover }} + description: | + Specifies whether Zero Config Failover is enabled for this project. + - name: oidc_token_config + description: | + OpenID Connect JSON Web Token generation configuration. + value: + enabled: {{ enabled }} + issuerMode: "{{ issuerMode }}" + - name: enable_affected_projects_deployments + value: {{ enable_affected_projects_deployments }} + description: | + Opt-in to skip deployments when there are no changes to the root directory and its dependencies + - name: resource_config + description: | + Specifies resource override configuration for the project + value: + buildMachineType: "{{ buildMachineType }}" + fluid: {{ fluid }} + functionDefaultRegions: + - "{{ functionDefaultRegions }}" + functionDefaultTimeout: {{ functionDefaultTimeout }} + functionDefaultMemoryType: "{{ functionDefaultMemoryType }}" + functionZeroConfigFailover: "{{ functionZeroConfigFailover }}" + elasticConcurrencyEnabled: {{ elasticConcurrencyEnabled }} + buildMachineSelection: "{{ buildMachineSelection }}" + buildMachineElasticLastUpdated: {{ buildMachineElasticLastUpdated }} + buildMachineElasticReason: "{{ buildMachineElasticReason }}" + isNSNBDisabled: {{ isNSNBDisabled }} + buildQueue: + configuration: "{{ configuration }}" + enableFunctionsBeta: {{ enableFunctionsBeta }} + - name: team_id + value: "{{ team_id }}" + description: The Team identifier to perform the request on behalf of. + description: The Team identifier to perform the request on behalf of. + - name: slug + value: "{{ slug }}" + description: The Team slug to perform the request on behalf of. + description: The Team slug to perform the request on behalf of. +`} + + + + + +## `UPDATE` examples + + + + +Update the fields of a project using either its `name` or `id`. + +```sql +UPDATE vercel.projects.projects +SET +auto_expose_system_envs = {{ auto_expose_system_envs }}, +auto_assign_custom_domains = {{ auto_assign_custom_domains }}, +auto_assign_custom_domains_updated_by = '{{ auto_assign_custom_domains_updated_by }}', +build_command = '{{ build_command }}', +command_for_ignoring_build_step = '{{ command_for_ignoring_build_step }}', +customer_support_code_visibility = {{ customer_support_code_visibility }}, +dev_command = '{{ dev_command }}', +directory_listing = {{ directory_listing }}, +framework = '{{ framework }}', +git_fork_protection = {{ git_fork_protection }}, +git_lfs = {{ git_lfs }}, +protected_sourcemaps = {{ protected_sourcemaps }}, +install_command = '{{ install_command }}', +name = '{{ name }}', +node_version = '{{ node_version }}', +output_directory = '{{ output_directory }}', +preview_deployments_disabled = {{ preview_deployments_disabled }}, +preview_deployment_suffix = '{{ preview_deployment_suffix }}', +resource_config = '{{ resource_config }}', +public_source = {{ public_source }}, +root_directory = '{{ root_directory }}', +serverless_function_region = '{{ serverless_function_region }}', +serverless_function_zero_config_failover = {{ serverless_function_zero_config_failover }}, +skew_protection_boundary_at = {{ skew_protection_boundary_at }}, +skew_protection_max_age = {{ skew_protection_max_age }}, +skew_protection_allowed_domains = '{{ skew_protection_allowed_domains }}', +skip_git_connect_during_link = {{ skip_git_connect_during_link }}, +source_files_outside_root_directory = {{ source_files_outside_root_directory }}, +enable_preview_feedback = {{ enable_preview_feedback }}, +enable_production_feedback = {{ enable_production_feedback }}, +enable_affected_projects_deployments = {{ enable_affected_projects_deployments }}, +enable_external_rewrite_caching = {{ enable_external_rewrite_caching }}, +static_ips = '{{ static_ips }}', +tracing = '{{ tracing }}', +oidc_token_config = '{{ oidc_token_config }}', +password_protection = '{{ password_protection }}', +passport = '{{ passport }}', +sandbox = '{{ sandbox }}', +sso_protection = '{{ sso_protection }}', +trusted_ips = '{{ trusted_ips }}', +trusted_sources = '{{ trusted_sources }}', +deployment_policy = '{{ deployment_policy }}', +options_allowlist = '{{ options_allowlist }}', +connect_configurations = '{{ connect_configurations }}', +dismissed_toasts = '{{ dismissed_toasts }}' +WHERE +id_or_name = '{{ id_or_name }}' --required +AND team_id = '{{ team_id}}' +AND slug = '{{ slug}}' +RETURNING +id, +name, +account_id, +connect_configuration_id, +passive_connect_configuration_id, +transfer_to_account_id, +transferred_from_account_id, +concurrency_bucket_name, +abuse, +alias, +analytics, +applied_cve_55182_migration, +auto_assign_custom_domains, +auto_assign_custom_domains_updated_by, +auto_expose_system_envs, +avatar, +blobs, +build_command, +command_for_ignoring_build_step, +connect_builds_enabled, +connect_configurations, +created_at, +creator, +crons, +custom_environments, +customer_support_code_visibility, +data_cache, +default_resource_config, +deployment_expiration, +deployment_policy, +dev_command, +directory_listing, +dismissed_toasts, +enable_affected_projects_deployments, +enable_external_rewrite_caching, +enable_preview_feedback, +enable_production_feedback, +env, +expiration, +features, +framework, +git_comments, +git_fork_protection, +git_lfs, +git_provider_options, +has_active_branches, +has_deployments, +install_command, +internal_routes, +ip_buckets, +jobs, +last_alias_request, +last_rollback_target, +latest_deployments, +link, +live, +microfrontends, +node_version, +oidc_token_config, +options_allowlist, +output_directory, +passport, +password_protection, +paused, +permissions, +production_deployments_fast_lane, +protected_sourcemaps, +protection_bypass, +protection_config, +resource_config, +rollback_description, +rolling_release, +root_directory, +sandbox, +security, +serverless_function_zero_config_failover, +services, +skew_protection_allowed_domains, +skew_protection_boundary_at, +skew_protection_max_age, +skip_git_connect_during_link, +source_files_outside_root_directory, +speed_insights, +sso_protection, +static_ips, +targets, +tier, +tracing, +transfer_completed_at, +transfer_started_at, +trusted_ips, +trusted_sources, +updated_at, +usage_status, +v_0, +v_0_created, +web_analytics; ``` @@ -1045,19 +1758,20 @@ updatedAt ## `DELETE` examples - + Delete a specific project by passing either the project `id` or `name` in the URL. ```sql DELETE FROM vercel.projects.projects -WHERE idOrName = '{{ idOrName }}' --required -AND teamId = '{{ teamId }}' --required +WHERE id_or_name = '{{ id_or_name }}' --required +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' ; ``` @@ -1066,85 +1780,157 @@ AND teamId = '{{ teamId }}' --required ## Lifecycle Methods +EXEC variables use wire (API) names. + - + -Update the data cache feature on a project. +Generates an OIDC token for the project and returns it. ```sql -EXEC vercel.projects.projects.update_project_data_cache -@projectId='{{ projectId }}' --required, -@teamId='{{ teamId }}' --required +EXEC vercel.projects.projects.get_token +@id_or_name='{{ id_or_name }}' --required, +@teamId='{{ teamId }}', +@slug='{{ slug }}' @@json= '{ -"disabled": {{ disabled }} +"source": "{{ source }}" }' ; ``` - + -Allows to retrieve the list of projects of the authenticated user or team. The list will be paginated and the provided query parameters allow filtering the returned projects. +Upload an image as the avatar of the project identified by `idOrName`. The request body is the raw bytes of a JPG, PNG, or SVG image; the `Content-Type` header must declare which. SVG payloads are sanitized and optimized server-side before storage. The final SHA-1 of the stored bytes becomes the project's `avatar` value. The actual upload pipeline (validation, sanitization, S3 write, conditional `updateProject`, and event emission) lives in the shared `@api/project-avatar-upload` helper so it can be reused by background workers. ```sql -EXEC vercel.projects.projects._get_projects -@teamId='{{ teamId }}' --required, -@from='{{ from }}', -@gitForkProtection='{{ gitForkProtection }}', -@limit='{{ limit }}', -@search='{{ search }}', -@repo='{{ repo }}', -@repoId='{{ repoId }}', -@repoUrl='{{ repoUrl }}', -@excludeRepos='{{ excludeRepos }}', -@edgeConfigId='{{ edgeConfigId }}', -@edgeConfigTokenId='{{ edgeConfigTokenId }}' +EXEC vercel.projects.projects.upload_avatar +@id_or_name='{{ id_or_name }}' --required, +@teamId='{{ teamId }}', +@slug='{{ slug }}' +@@json= +'{ +"value": "{{ value }}" +}' ; ``` - + -Update the fields of a project using either its `name` or `id`. +Update the deployment protection automation bypass for a project + +```sql +EXEC vercel.projects.projects.update_protection_bypass +@id_or_name='{{ id_or_name }}' --required, +@teamId='{{ teamId }}', +@slug='{{ slug }}' +@@json= +'{ +"revoke": "{{ revoke }}", +"generate": "{{ generate }}", +"update": "{{ update }}" +}' +; +``` + + + +Allows users to rollback to a deployment. + +```sql +EXEC vercel.projects.projects.rollback +@project_id='{{ project_id }}' --required, +@deployment_id='{{ deployment_id }}' --required, +@description='{{ description }}', +@teamId='{{ teamId }}', +@slug='{{ slug }}' +; +``` + + + +Updates the reason for a rollback, without changing the rollback status itself. ```sql -EXEC vercel.projects.projects.update_project -@idOrName='{{ idOrName }}' --required, -@teamId='{{ teamId }}' --required +EXEC vercel.projects.projects.update_rollback_description +@project_id='{{ project_id }}' --required, +@deployment_id='{{ deployment_id }}' --required @@json= '{ -"autoExposeSystemEnvs": {{ autoExposeSystemEnvs }}, -"autoAssignCustomDomains": {{ autoAssignCustomDomains }}, -"autoAssignCustomDomainsUpdatedBy": "{{ autoAssignCustomDomainsUpdatedBy }}", -"buildCommand": "{{ buildCommand }}", -"commandForIgnoringBuildStep": "{{ commandForIgnoringBuildStep }}", -"customerSupportCodeVisibility": {{ customerSupportCodeVisibility }}, -"devCommand": "{{ devCommand }}", -"directoryListing": {{ directoryListing }}, -"framework": "{{ framework }}", -"gitForkProtection": {{ gitForkProtection }}, -"gitLFS": {{ gitLFS }}, -"installCommand": "{{ installCommand }}", -"name": "{{ name }}", -"nodeVersion": "{{ nodeVersion }}", -"outputDirectory": "{{ outputDirectory }}", -"passwordProtection": "{{ passwordProtection }}", -"publicSource": {{ publicSource }}, -"rootDirectory": "{{ rootDirectory }}", -"serverlessFunctionRegion": "{{ serverlessFunctionRegion }}", -"skipGitConnectDuringLink": {{ skipGitConnectDuringLink }}, -"sourceFilesOutsideRootDirectory": {{ sourceFilesOutsideRootDirectory }}, -"ssoProtection": "{{ ssoProtection }}", -"trustedIps": "{{ trustedIps }}", -"enablePreviewFeedback": {{ enablePreviewFeedback }} +"description": "{{ description }}" }' ; ``` + + +Update the microfrontends settings for a project. + +```sql +EXEC vercel.projects.projects.update_microfrontends +@project_id='{{ project_id }}' --required, +@teamId='{{ teamId }}', +@slug='{{ slug }}' +@@json= +'{ +"microfrontendsGroupId": "{{ microfrontendsGroupId }}", +"enabled": {{ enabled }}, +"isDefaultApp": {{ isDefaultApp }}, +"defaultRoute": "{{ defaultRoute }}", +"routeObservabilityToThisProject": {{ routeObservabilityToThisProject }}, +"doNotRouteWithMicrofrontendsRouting": {{ doNotRouteWithMicrofrontendsRouting }} +}' +; +``` + + + +Allows users to promote a deployment to production. Note: This does NOT rebuild the deployment. If you need that, then call create-deployments endpoint. + +```sql +EXEC vercel.projects.projects.promote +@project_id='{{ project_id }}' --required, +@deployment_id='{{ deployment_id }}' --required, +@teamId='{{ teamId }}', +@slug='{{ slug }}' +; +``` + + + +Pause a project by passing its project `id` in the URL. If the project does not exist given the id then the request will fail with 400 status code. If the project disables auto assigning custom production domains and blocks the active Production Deployment then the request will return with 200 status code. + +```sql +EXEC vercel.projects.projects.pause +@project_id='{{ project_id }}' --required, +@teamId='{{ teamId }}', +@slug='{{ slug }}' +; +``` + + + +Unpause a project by passing its project `id` in the URL. If the project does not exist given the id then the request will fail with 400 status code. If the project enables auto assigning custom production domains and unblocks the active Production Deployment then the request will return with 200 status code. + +```sql +EXEC vercel.projects.projects.unpause +@project_id='{{ project_id }}' --required, +@teamId='{{ teamId }}', +@slug='{{ slug }}' +; +``` + diff --git a/website/docs/services/projects/promote_aliases/index.md b/website/docs/services/projects/promote_aliases/index.md new file mode 100644 index 0000000..037cc06 --- /dev/null +++ b/website/docs/services/projects/promote_aliases/index.md @@ -0,0 +1,176 @@ +--- +title: promote_aliases +hide_title: false +hide_table_of_contents: false +keywords: + - promote_aliases + - projects + - vercel + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a promote_aliases resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string
string
string
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
project_idlimit, since, until, failed_only, team_id, slugGet a list of aliases related to the last promote request with their mapping status
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string
booleanFilter results down to aliases that failed to map to the requested deployment (wire: failedOnly)
numberMaximum number of aliases to list from a request (max 100).
numberGet aliases created after this epoch timestamp.
stringThe Team slug to perform the request on behalf of.
stringThe Team identifier to perform the request on behalf of. (wire: teamId)
numberGet aliases created before this epoch timestamp.
+ +## `SELECT` examples + + + + +Get a list of aliases related to the last promote request with their mapping status + +```sql +SELECT +id, +alias, +status +FROM vercel.projects.promote_aliases +WHERE project_id = '{{ project_id }}' -- required +AND limit = '{{ limit }}' +AND since = '{{ since }}' +AND until = '{{ until }}' +AND failed_only = '{{ failed_only }}' +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + diff --git a/website/docs/services/projects/traces/index.md b/website/docs/services/projects/traces/index.md new file mode 100644 index 0000000..4e91eb4 --- /dev/null +++ b/website/docs/services/projects/traces/index.md @@ -0,0 +1,205 @@ +--- +title: traces +hide_title: false +hide_table_of_contents: false +keywords: + - traces + - projects + - vercel + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a traces resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string (wire: rootSpanId)
string (wire: traceId)
array
array
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
project_id, request_idteam_id, slugReturns the OTEL trace for a given Vercel CLI request.
projectId, hostnameteamId, slugMints a short-lived HS256 JWT scoped to a deployment hostname. The Vercel CLI presents this JWT to the Vercel proxy on requests it wants traced.
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringThe project ID (wire: projectId)
stringThe Vercel CLI request ID associated with the trace (wire: requestId)
stringThe Team slug to perform the request on behalf of.
stringThe Team identifier to perform the request on behalf of.
stringThe Team identifier to perform the request on behalf of. (wire: teamId)
+ +## `SELECT` examples + + + + +Returns the OTEL trace for a given Vercel CLI request. + +```sql +SELECT +root_span_id, +trace_id, +resources, +spans +FROM vercel.projects.traces +WHERE project_id = '{{ project_id }}' -- required +AND request_id = '{{ request_id }}' -- required +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + + + +## Lifecycle Methods + +EXEC variables use wire (API) names. + + + + +Mints a short-lived HS256 JWT scoped to a deployment hostname. The Vercel CLI presents this JWT to the Vercel proxy on requests it wants traced. + +```sql +EXEC vercel.projects.traces.create_session +@teamId='{{ teamId }}', +@slug='{{ slug }}' +@@json= +'{ +"projectId": "{{ projectId }}", +"hostname": "{{ hostname }}" +}' +; +``` + + diff --git a/website/docs/services/projects/transfer_requests/index.md b/website/docs/services/projects/transfer_requests/index.md new file mode 100644 index 0000000..554a312 --- /dev/null +++ b/website/docs/services/projects/transfer_requests/index.md @@ -0,0 +1,201 @@ +--- +title: transfer_requests +hide_title: false +hide_table_of_contents: false +keywords: + - transfer_requests + - projects + - vercel + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a transfer_requests resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + +`SELECT` not supported for this resource, use `SHOW METHODS` to view available operations for the resource. + + +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
id_or_nameteam_id, slugInitiates a project transfer request from one team to another. <br /> Returns a `code` that remains valid for 24 hours and can be used to accept the transfer request by another team using the `PUT /projects/transfer-request/:code` endpoint. <br /> Users can also accept the project transfer request using the claim URL: `https:​//vercel.com/claim-deployment?code=<code>&returnUrl=<returnUrl>`. <br /> The `code` parameter specifies the project transfer request code generated using this endpoint. <br /> The `returnUrl` parameter redirects users to a specific page of the application if the claim URL is invalid or expired.
codeteamId, slugAccept a project transfer request initated by another team. <br /> The `code` is generated using the `POST /projects/:idOrName/transfer-request` endpoint.
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringThe code of the project transfer request.
stringThe ID or name of the project to transfer.
stringThe Team slug to perform the request on behalf of.
stringThe Team identifier to perform the request on behalf of.
stringThe Team identifier to perform the request on behalf of. (wire: teamId)
+ +## `INSERT` examples + + + + +Initiates a project transfer request from one team to another. <br /> Returns a `code` that remains valid for 24 hours and can be used to accept the transfer request by another team using the `PUT /projects/transfer-request/:code` endpoint. <br /> Users can also accept the project transfer request using the claim URL: `https:​//vercel.com/claim-deployment?code=<code>&returnUrl=<returnUrl>`. <br /> The `code` parameter specifies the project transfer request code generated using this endpoint. <br /> The `returnUrl` parameter redirects users to a specific page of the application if the claim URL is invalid or expired. + +```sql +INSERT INTO vercel.projects.transfer_requests ( +callback_url, +callback_secret, +id_or_name, +team_id, +slug +) +SELECT +'{{ callback_url }}', +'{{ callback_secret }}', +'{{ id_or_name }}', +'{{ team_id }}', +'{{ slug }}' +RETURNING +code +; +``` + + + +{`# Description fields are for documentation purposes +- name: transfer_requests + props: + - name: id_or_name + value: "{{ id_or_name }}" + description: Required parameter for the transfer_requests resource. + - name: callback_url + value: "{{ callback_url }}" + description: | + The URL to send a webhook to when the transfer is accepted. + - name: callback_secret + value: "{{ callback_secret }}" + description: | + The secret to use to sign the webhook payload with HMAC-SHA256. + - name: team_id + value: "{{ team_id }}" + description: The Team identifier to perform the request on behalf of. + description: The Team identifier to perform the request on behalf of. + - name: slug + value: "{{ slug }}" + description: The Team slug to perform the request on behalf of. + description: The Team slug to perform the request on behalf of. +`} + + + + + +## Lifecycle Methods + +EXEC variables use wire (API) names. + + + + +Accept a project transfer request initated by another team. <br /> The `code` is generated using the `POST /projects/:idOrName/transfer-request` endpoint. + +```sql +EXEC vercel.projects.transfer_requests.accept +@code='{{ code }}' --required, +@teamId='{{ teamId }}', +@slug='{{ slug }}' +@@json= +'{ +"newProjectName": "{{ newProjectName }}", +"paidFeatures": "{{ paidFeatures }}", +"acceptedPolicies": "{{ acceptedPolicies }}" +}' +; +``` + + diff --git a/website/docs/services/rolling_release/billing_status/index.md b/website/docs/services/rolling_release/billing_status/index.md new file mode 100644 index 0000000..a457eb7 --- /dev/null +++ b/website/docs/services/rolling_release/billing_status/index.md @@ -0,0 +1,158 @@ +--- +title: billing_status +hide_title: false +hide_table_of_contents: false +keywords: + - billing_status + - rolling_release + - vercel + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a billing_status resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
number (0) (wire: availableSlots)
array (wire: enabledProjects)
string
string (plan_not_supported)
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
id_or_nameteam_id, slugGet the Rolling Releases billing status for a project. The team level billing status is used to determine if the project can be configured for rolling releases.
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringProject ID or project name (URL-encoded)
stringThe Team slug to perform the request on behalf of.
stringThe Team identifier to perform the request on behalf of. (wire: teamId)
+ +## `SELECT` examples + + + + +Get the Rolling Releases billing status for a project. The team level billing status is used to determine if the project can be configured for rolling releases. + +```sql +SELECT +available_slots, +enabled_projects, +message, +reason +FROM vercel.rolling_release.billing_status +WHERE id_or_name = '{{ id_or_name }}' -- required +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + diff --git a/website/docs/services/rolling_release/config/index.md b/website/docs/services/rolling_release/config/index.md new file mode 100644 index 0000000..69cf131 --- /dev/null +++ b/website/docs/services/rolling_release/config/index.md @@ -0,0 +1,224 @@ +--- +title: config +hide_title: false +hide_table_of_contents: false +keywords: + - config + - rolling_release + - vercel + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a config resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + +Project-level rolling release configuration that defines how deployments should be gradually rolled out + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
booleanWhether the request served by a canary deployment should return a header indicating a canary was served. Defaults to `false` when omitted. (false, true) (wire: canaryResponseHeader)
objectAutomated gating configuration. Omitted (the default) means no gating is configured, which is equivalent to `enabled: false`.
arrayAn array of all the stages required during a deployment release. Each stage defines a target percentage and advancement rules. The final stage must always have targetPercentage: 100.
stringThe environment that the release targets, currently only supports production. Adding in case we want to configure with alias groups or custom environments. (example: production)
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
id_or_nameteam_id, slugGet the Rolling Releases configuration for a project. The project-level config is simply a template that will be used for any future rolling release, and not the configuration for any active rolling release.
id_or_nameteam_id, slugUpdate (or disable) Rolling Releases for a project. When disabling with the resolve-on-disable feature flag enabled, any active rolling release document is resolved using the disableRolloutAction parameter: "abort" to roll back (default), or "complete" to promote the canary to production. When enabling or updating config, changes only affect the next production deployment and do not alter a rollout that's already in-flight. Note: Enabling Rolling Releases automatically enables skew protection on the project with the default value if it wasn't configured already.
id_or_nameteam_id, slugDisable Rolling Releases for a project means that future deployments will not undergo a rolling release. Changing the config never alters a rollout that's already in-flight—it only affects the next production deployment. If you want to also stop the current rollout, call this endpoint to disable the feature, and then call either the /complete or /abort endpoint.
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringProject ID or project name (URL-encoded)
stringThe Team slug to perform the request on behalf of.
stringThe Team identifier to perform the request on behalf of. (wire: teamId)
+ +## `SELECT` examples + + + + +Get the Rolling Releases configuration for a project. The project-level config is simply a template that will be used for any future rolling release, and not the configuration for any active rolling release. + +```sql +SELECT +canary_response_header, +gate, +stages, +target +FROM vercel.rolling_release.config +WHERE id_or_name = '{{ id_or_name }}' -- required +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + + + +## `UPDATE` examples + + + + +Update (or disable) Rolling Releases for a project. When disabling with the resolve-on-disable feature flag enabled, any active rolling release document is resolved using the disableRolloutAction parameter: "abort" to roll back (default), or "complete" to promote the canary to production. When enabling or updating config, changes only affect the next production deployment and do not alter a rollout that's already in-flight. Note: Enabling Rolling Releases automatically enables skew protection on the project with the default value if it wasn't configured already. + +```sql +UPDATE vercel.rolling_release.config +SET +-- No updatable properties +WHERE +id_or_name = '{{ id_or_name }}' --required +AND team_id = '{{ team_id}}' +AND slug = '{{ slug}}' +RETURNING +rolling_release; +``` + + + + +## `DELETE` examples + + + + +Disable Rolling Releases for a project means that future deployments will not undergo a rolling release. Changing the config never alters a rollout that's already in-flight—it only affects the next production deployment. If you want to also stop the current rollout, call this endpoint to disable the feature, and then call either the /complete or /abort endpoint. + +```sql +DELETE FROM vercel.rolling_release.config +WHERE id_or_name = '{{ id_or_name }}' --required +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + diff --git a/website/docs/services/rolling_release/index.md b/website/docs/services/rolling_release/index.md new file mode 100644 index 0000000..aad1f6d --- /dev/null +++ b/website/docs/services/rolling_release/index.md @@ -0,0 +1,34 @@ +--- +title: rolling_release +hide_title: false +hide_table_of_contents: false +keywords: + - rolling_release + - vercel + - stackql + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +rolling_release service documentation. + +:::info[Service Summary] + +total resources: __3__ + +::: + +## Resources + \ No newline at end of file diff --git a/website/docs/services/rolling_release/rolling_releases/index.md b/website/docs/services/rolling_release/rolling_releases/index.md new file mode 100644 index 0000000..cea1f0d --- /dev/null +++ b/website/docs/services/rolling_release/rolling_releases/index.md @@ -0,0 +1,304 @@ +--- +title: rolling_releases +hide_title: false +hide_table_of_contents: false +keywords: + - rolling_releases + - rolling_release + - vercel + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a rolling_releases resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + +Rolling release information including configuration and document details, or null if no rolling release exists + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringThe ID of a deployment queued for the next rolling release (example: dpl_ghi789) (wire: queuedDeploymentId)
objectThe currently active stage, null if the rollout is aborted (wire: activeStage)
stringThe advancement type of the rolling release (automatic, manual-approval) (example: manual-approval) (wire: advancementType)
objectThe canary deployment being rolled out (wire: canaryDeployment)
numberWhen set (for example while {@link substate} is `PAUSED`), the canary traffic percentage persisted on the rollout document — use for dashboard display when linear shift is active. (wire: currentCanaryPercentage)
objectThe current deployment receiving production traffic (wire: currentDeployment)
objectThe next stage to be activated, null if not in ACTIVE state (wire: nextStage)
arrayAll stages configured for this rolling release
numberUnix timestamp in milliseconds when the rolling release started (wire: startedAt)
stringThe current state of the rolling release (ABORTED, ACTIVE, COMPLETE) (example: ACTIVE)
stringWhen set to `PAUSED`, the rollout is frozen at the current percentage until continued. (PAUSED, )
numberUnix timestamp in milliseconds when the rolling release was last updated (wire: updatedAt)
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
id_or_namestate, team_id, slugReturn the Rolling Release for a project, regardless of whether the rollout is active, aborted, or completed. If the feature is enabled but no deployment has occurred yet, null will be returned.
id_or_name, nextStageIndex, canaryDeploymentIdteamId, slugAdvance a rollout to the next stage. This is only needed when rolling releases is configured to require manual approval.
id_or_name, canaryDeploymentIdteamId, slugStart a rolling release for a deployment. If a rolling release is already active for the same canary deployment, returns the current state without side effects.
id_or_name, canaryDeploymentIdteamId, slugForce-complete a Rolling Release. The canary deployment will begin serving 100% of the traffic.
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringProject ID or project name (URL-encoded)
stringThe Team slug to perform the request on behalf of.
stringFilter by rolling release state
stringThe Team identifier to perform the request on behalf of.
stringThe Team identifier to perform the request on behalf of. (wire: teamId)
+ +## `SELECT` examples + + + + +Return the Rolling Release for a project, regardless of whether the rollout is active, aborted, or completed. If the feature is enabled but no deployment has occurred yet, null will be returned. + +```sql +SELECT +queued_deployment_id, +active_stage, +advancement_type, +canary_deployment, +current_canary_percentage, +current_deployment, +next_stage, +stages, +started_at, +state, +substate, +updated_at +FROM vercel.rolling_release.rolling_releases +WHERE id_or_name = '{{ id_or_name }}' -- required +AND state = '{{ state }}' +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + + + +## Lifecycle Methods + +EXEC variables use wire (API) names. + + + + +Advance a rollout to the next stage. This is only needed when rolling releases is configured to require manual approval. + +```sql +EXEC vercel.rolling_release.rolling_releases.approve_stage +@id_or_name='{{ id_or_name }}' --required, +@teamId='{{ teamId }}', +@slug='{{ slug }}' +@@json= +'{ +"nextStageIndex": {{ nextStageIndex }}, +"canaryDeploymentId": "{{ canaryDeploymentId }}" +}' +; +``` + + + +Start a rolling release for a deployment. If a rolling release is already active for the same canary deployment, returns the current state without side effects. + +```sql +EXEC vercel.rolling_release.rolling_releases.start +@id_or_name='{{ id_or_name }}' --required, +@teamId='{{ teamId }}', +@slug='{{ slug }}' +@@json= +'{ +"canaryDeploymentId": "{{ canaryDeploymentId }}" +}' +; +``` + + + +Force-complete a Rolling Release. The canary deployment will begin serving 100% of the traffic. + +```sql +EXEC vercel.rolling_release.rolling_releases.complete +@id_or_name='{{ id_or_name }}' --required, +@teamId='{{ teamId }}', +@slug='{{ slug }}' +@@json= +'{ +"canaryDeploymentId": "{{ canaryDeploymentId }}" +}' +; +``` + + diff --git a/website/docs/services/sandboxes/commands/index.md b/website/docs/services/sandboxes/commands/index.md new file mode 100644 index 0000000..6220c59 --- /dev/null +++ b/website/docs/services/sandboxes/commands/index.md @@ -0,0 +1,382 @@ +--- +title: commands +hide_title: false +hide_table_of_contents: false +keywords: + - commands + - sandboxes + - vercel + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a commands resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + +The command data along with the exit code if the command did finish. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringThe ID of the command. (example: cmd_123a6c5209bc3778245d011443644c8d27dc2c50)
stringThe name of the command. (example: npm)
stringThe ID of the session associated with the command. (example: sbx_123a6c5209bc3778245d011443644c8d27dc2c50) (wire: sessionId)
arrayThe arguments of the command.
stringThe current working directory of the command. (example: /vercel/sandbox)
numberDuration of the command execution in milliseconds. (wire: durationMs)
numberIf the command did finish, the exit code. (wire: exitCode)
numberWhen the command was started, in milliseconds since the epoch. (wire: startedAt)
+
+ + +The list of commands executed in the session. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringThe ID of the command. (example: cmd_123a6c5209bc3778245d011443644c8d27dc2c50)
stringThe name of the command. (example: npm)
stringThe ID of the session associated with the command. (example: sbx_123a6c5209bc3778245d011443644c8d27dc2c50) (wire: sessionId)
arrayThe arguments of the command.
stringThe current working directory of the command. (example: /vercel/sandbox)
numberDuration of the command execution in milliseconds. (wire: durationMs)
numberIf the command did finish, the exit code. (wire: exitCode)
numberWhen the command was started, in milliseconds since the epoch. (wire: startedAt)
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
session_id, cmd_idwait, team_id, slugRetrieves the current status and details of a command executed in a session. Use the `wait` parameter to block until the command finishes execution.
session_idteam_id, slugRetrieves a list of all commands that have been executed in a session, including their current status, exit codes, and execution times, ordered from the most recent to the oldest.
session_id, cmdId, commandteamId, slugExecutes a shell command inside a running session. The command runs asynchronously and returns immediately with a command ID that can be used to track its progress and retrieve its output. Optionally, use the `wait` parameter to stream the command status until completion.
cmd_id, session_id, signalteamId, slugSends a signal to terminate a running command in a session. The signal can be used to gracefully stop (SIGTERM) or forcefully kill (SIGKILL) the process. The command must still be running for this operation to succeed.
session_id, cmd_idteamId, slugStreams the output of a command in real-time using newline-delimited JSON (ND-JSON). Each entry includes the output data and stream type. Stream types include `stdout`, `stderr`, and `error` (for stream failures).
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringThe unique identifier of the command to stream logs for.
stringThe unique identifier of the command to stream logs for.
stringThe unique identifier of the session containing the command.
stringThe Team slug to perform the request on behalf of.
stringThe Team identifier to perform the request on behalf of.
stringThe Team identifier to perform the request on behalf of. (wire: teamId)
stringIf set to "true", the request will block until the command finishes execution. Useful for synchronously waiting for command completion.
+ +## `SELECT` examples + + + + +Retrieves the current status and details of a command executed in a session. Use the `wait` parameter to block until the command finishes execution. + +```sql +SELECT +id, +name, +session_id, +args, +cwd, +duration_ms, +exit_code, +started_at +FROM vercel.sandboxes.commands +WHERE session_id = '{{ session_id }}' -- required +AND cmd_id = '{{ cmd_id }}' -- required +AND wait = '{{ wait }}' +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + + +Retrieves a list of all commands that have been executed in a session, including their current status, exit codes, and execution times, ordered from the most recent to the oldest. + +```sql +SELECT +id, +name, +session_id, +args, +cwd, +duration_ms, +exit_code, +started_at +FROM vercel.sandboxes.commands +WHERE session_id = '{{ session_id }}' -- required +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + + + +## Lifecycle Methods + +EXEC variables use wire (API) names. + + + + +Executes a shell command inside a running session. The command runs asynchronously and returns immediately with a command ID that can be used to track its progress and retrieve its output. Optionally, use the `wait` parameter to stream the command status until completion. + +```sql +EXEC vercel.sandboxes.commands.run +@session_id='{{ session_id }}' --required, +@cmdId='{{ cmdId }}' --required, +@teamId='{{ teamId }}', +@slug='{{ slug }}' +@@json= +'{ +"command": "{{ command }}", +"args": "{{ args }}", +"cwd": "{{ cwd }}", +"env": "{{ env }}", +"sudo": {{ sudo }}, +"wait": {{ wait }}, +"logs": {{ logs }}, +"timeout": {{ timeout }} +}' +; +``` + + + +Sends a signal to terminate a running command in a session. The signal can be used to gracefully stop (SIGTERM) or forcefully kill (SIGKILL) the process. The command must still be running for this operation to succeed. + +```sql +EXEC vercel.sandboxes.commands.kill +@cmd_id='{{ cmd_id }}' --required, +@session_id='{{ session_id }}' --required, +@teamId='{{ teamId }}', +@slug='{{ slug }}' +@@json= +'{ +"signal": {{ signal }} +}' +; +``` + + + +Streams the output of a command in real-time using newline-delimited JSON (ND-JSON). Each entry includes the output data and stream type. Stream types include `stdout`, `stderr`, and `error` (for stream failures). + +```sql +EXEC vercel.sandboxes.commands.get_logs +@session_id='{{ session_id }}' --required, +@cmd_id='{{ cmd_id }}' --required, +@teamId='{{ teamId }}', +@slug='{{ slug }}' +; +``` + + diff --git a/website/docs/services/sandboxes/drives/index.md b/website/docs/services/sandboxes/drives/index.md new file mode 100644 index 0000000..e7a54b7 --- /dev/null +++ b/website/docs/services/sandboxes/drives/index.md @@ -0,0 +1,333 @@ +--- +title: drives +hide_title: false +hide_table_of_contents: false +keywords: + - drives + - sandboxes + - vercel + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a drives resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + +This object contains information related to a Vercel Sandbox Drive. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringThe unique drive ID. (example: drive_abc123)
stringThe unique drive name within the project. (example: workspace)
stringCurrent session ID the drive is attached to, if any. (example: sbx_123) (wire: currentSessionId)
stringThe project that owns the drive. (example: prj_abc123) (wire: projectId)
stringCurrent sandbox name the drive is attached to, if any. (example: my-sandbox) (wire: currentSandboxName)
numberThe time when the drive was created, in milliseconds since the epoch. (wire: createdAt)
numberThe maximum drive size in bytes. (wire: maxSizeBytes)
stringThe region where the drive is stored. (example: iad1)
numberThe last time the drive was updated, in milliseconds since the epoch. (wire: updatedAt)
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
project_id, limit, cursor, sort_by, name_prefix, sort_order, team_id, slugRetrieves a paginated list of drives belonging to a specific project. Drives are in private beta. Register your interest to get access: https:​//vercel.com/changelog/drives-for-vercel-sandbox-in-private-beta
nameteam_id, slugGets an existing drive by project and name, or creates it when it does not exist. Drives are in private beta. Register your interest to get access: https:​//vercel.com/changelog/drives-for-vercel-sandbox-in-private-beta
nameproject_id, team_id, slugDeletes a drive by project and name. Attached drives cannot be deleted. Stop or replace the session currently using the drive before retrying deletion. Drives are in private beta. Register your interest to get access: https:​//vercel.com/changelog/drives-for-vercel-sandbox-in-private-beta
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringName for the drive. Must be unique per project and URL-safe (alphanumeric, hyphens, underscores).
stringOpaque pagination cursor from a previous response.
numberMaximum number of drives to return in the response. Used for pagination.
stringFilter drives whose name starts with this prefix. Only valid when sortBy=name. (wire: namePrefix)
stringThe project ID or name associated with the drive. Required unless using a Vercel OIDC token scoped to a project. (wire: projectId)
stringThe Team slug to perform the request on behalf of.
stringField to sort drives by. (wire: sortBy)
stringSort direction for results. (wire: sortOrder)
stringThe Team identifier to perform the request on behalf of. (wire: teamId)
+ +## `SELECT` examples + + + + +Retrieves a paginated list of drives belonging to a specific project. Drives are in private beta. Register your interest to get access: https://vercel.com/changelog/drives-for-vercel-sandbox-in-private-beta + +```sql +SELECT +id, +name, +current_session_id, +project_id, +current_sandbox_name, +created_at, +max_size_bytes, +region, +updated_at +FROM vercel.sandboxes.drives +WHERE project_id = '{{ project_id }}' +AND limit = '{{ limit }}' +AND cursor = '{{ cursor }}' +AND sort_by = '{{ sort_by }}' +AND name_prefix = '{{ name_prefix }}' +AND sort_order = '{{ sort_order }}' +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + + + +## `INSERT` examples + + + + +Gets an existing drive by project and name, or creates it when it does not exist. Drives are in private beta. Register your interest to get access: https://vercel.com/changelog/drives-for-vercel-sandbox-in-private-beta + +```sql +INSERT INTO vercel.sandboxes.drives ( +project_id, +max_size_bytes, +region, +name, +team_id, +slug +) +SELECT +'{{ project_id }}', +{{ max_size_bytes }}, +'{{ region }}', +'{{ name }}', +'{{ team_id }}', +'{{ slug }}' +RETURNING +drive +; +``` + + + +{`# Description fields are for documentation purposes +- name: drives + props: + - name: name + value: "{{ name }}" + description: Required parameter for the drives resource. + - name: project_id + value: "{{ project_id }}" + description: | + The project ID or name to associate the drive with. Required unless using a Vercel OIDC token scoped to a project. + - name: max_size_bytes + value: {{ max_size_bytes }} + description: | + Maximum drive size in bytes. Defaults to 1 TiB when omitted (1 GiB for Hobby). The maximum quota is 16 TiB. Request a quota above 16 TiB at https://vercel.com/help. + - name: region + value: "{{ region }}" + description: | + Region where the drive is stored. Defaults to iad1. + valid_values: ['iad1', 'sfo1', 'cle1', 'cdg1', 'fra1', 'arn1', 'sin1', 'pdx1', 'lhr1', 'icn1', 'bom1', 'cpt1', 'dub1', 'gru1', 'hkg1', 'syd1', 'yul1', 'hnd1', 'kix1'] + default: iad1 + - name: team_id + value: "{{ team_id }}" + description: The Team identifier to perform the request on behalf of. + description: The Team identifier to perform the request on behalf of. + - name: slug + value: "{{ slug }}" + description: The Team slug to perform the request on behalf of. + description: The Team slug to perform the request on behalf of. +`} + + + + + +## `DELETE` examples + + + + +Deletes a drive by project and name. Attached drives cannot be deleted. Stop or replace the session currently using the drive before retrying deletion. Drives are in private beta. Register your interest to get access: https://vercel.com/changelog/drives-for-vercel-sandbox-in-private-beta + +```sql +DELETE FROM vercel.sandboxes.drives +WHERE name = '{{ name }}' --required +AND project_id = '{{ project_id }}' +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + diff --git a/website/docs/services/sandboxes/index.md b/website/docs/services/sandboxes/index.md new file mode 100644 index 0000000..966ad82 --- /dev/null +++ b/website/docs/services/sandboxes/index.md @@ -0,0 +1,37 @@ +--- +title: sandboxes +hide_title: false +hide_table_of_contents: false +keywords: + - sandboxes + - vercel + - stackql + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +sandboxes service documentation. + +:::info[Service Summary] + +total resources: __6__ + +::: + +## Resources + \ No newline at end of file diff --git a/website/docs/services/sandboxes/sandboxes/index.md b/website/docs/services/sandboxes/sandboxes/index.md new file mode 100644 index 0000000..9c459a9 --- /dev/null +++ b/website/docs/services/sandboxes/sandboxes/index.md @@ -0,0 +1,1033 @@ +--- +title: sandboxes +hide_title: false +hide_table_of_contents: false +keywords: + - sandboxes + - sandboxes + - vercel + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a sandboxes resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + +This object contains information related to a Vercel NamedSandbox. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringThe unique identifier of the sandbox. (example: my-sandbox)
stringCurrent session ID the sandbox is pointing to. (wire: currentSessionId)
stringCurrent snapshot ID that the named sandbox is pointing to. (wire: currentSnapshotId)
stringThe Connect network id for the target Secure Compute private network. (wire: networkId)
numberThe time when the named sandbox was created, in milliseconds since the epoch. (wire: createdAt)
stringThe working directory of the sandbox. (example: /vercel/sandbox)
numberThe time at which the currently running sandbox will time out, in milliseconds since the epoch. Only present while a session is running. (wire: expiresAt)
arrayThe regions the sandbox fails over to. Empty when it does not fail over. (wire: failoverRegions)
stringDigest-pinned reference of the container image the sandbox was created from, when it was created from an image ("{repository}@{manifestDigest}"). (example: my-repo@sha256:2c4e8f9a1b3d5e7f091a2b3c4d5e6f708192a3b4c5d6e7f8091a2b3c4d5e6f708)
objectKeep-last snapshot configuration. (wire: keepLastSnapshots)
numberMemory allocated in MB.
objectKey-value pairs of mount path and drive.
objectNetwork policy configuration. (wire: networkPolicy)
booleanWhether the sandbox persists its state across restarts via automatic snapshots. (false, true)
stringThe region the sandbox is pinned to: the region stored on the sandbox, otherwise the platform default. Where a running session actually landed is reported by `session.region`. (example: iad1)
stringRuntime identifier. (example: node22)
numberDefault snapshot expiration time in milliseconds. 0 means no expiration. (wire: snapshotExpiration)
stringThe status of the current sandbox. (running, stopped, stopping) (example: running)
numberThe time when the sandbox status was last updated, in milliseconds since the epoch. (wire: statusUpdatedAt)
objectKey-value tags attached to the named sandbox.
numberTimeout in milliseconds.
numberCumulative active CPU duration in milliseconds across all sandbox runs. (wire: totalActiveCpuDurationMs)
numberCumulative wall-clock duration in milliseconds across all sandbox runs. (wire: totalDurationMs)
numberCumulative egress bytes across all sandbox runs. (wire: totalEgressBytes)
numberCumulative ingress bytes across all sandbox runs. (wire: totalIngressBytes)
numberThe time when the named sandbox was last updated, in milliseconds since the epoch. (wire: updatedAt)
numberNumber of virtual CPUs allocated.
+
+ + +This object contains information related to a Vercel NamedSandbox. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringThe unique identifier of the sandbox. (example: my-sandbox)
stringCurrent session ID the sandbox is pointing to. (wire: currentSessionId)
stringCurrent snapshot ID that the named sandbox is pointing to. (wire: currentSnapshotId)
stringThe Connect network id for the target Secure Compute private network. (wire: networkId)
numberThe time when the named sandbox was created, in milliseconds since the epoch. (wire: createdAt)
stringThe working directory of the sandbox. (example: /vercel/sandbox)
numberThe time at which the currently running sandbox will time out, in milliseconds since the epoch. Only present while a session is running. (wire: expiresAt)
arrayThe regions the sandbox fails over to. Empty when it does not fail over. (wire: failoverRegions)
stringDigest-pinned reference of the container image the sandbox was created from, when it was created from an image ("{repository}@{manifestDigest}"). (example: my-repo@sha256:2c4e8f9a1b3d5e7f091a2b3c4d5e6f708192a3b4c5d6e7f8091a2b3c4d5e6f708)
objectKeep-last snapshot configuration. (wire: keepLastSnapshots)
numberMemory allocated in MB.
objectKey-value pairs of mount path and drive.
objectNetwork policy configuration. (wire: networkPolicy)
booleanWhether the sandbox persists its state across restarts via automatic snapshots. (false, true)
stringThe region the sandbox is pinned to: the region stored on the sandbox, otherwise the platform default. Where a running session actually landed is reported by `session.region`. (example: iad1)
stringRuntime identifier. (example: node22)
numberDefault snapshot expiration time in milliseconds. 0 means no expiration. (wire: snapshotExpiration)
stringThe status of the current sandbox. (running, stopped, stopping) (example: running)
numberThe time when the sandbox status was last updated, in milliseconds since the epoch. (wire: statusUpdatedAt)
objectKey-value tags attached to the named sandbox.
numberTimeout in milliseconds.
numberCumulative active CPU duration in milliseconds across all sandbox runs. (wire: totalActiveCpuDurationMs)
numberCumulative wall-clock duration in milliseconds across all sandbox runs. (wire: totalDurationMs)
numberCumulative egress bytes across all sandbox runs. (wire: totalEgressBytes)
numberCumulative ingress bytes across all sandbox runs. (wire: totalIngressBytes)
numberThe time when the named sandbox was last updated, in milliseconds since the epoch. (wire: updatedAt)
numberNumber of virtual CPUs allocated.
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
nameproject_id, resume, team_id, slugRetrieves a named sandbox by name, including its current sandbox and routes. If the sandbox is stopped and resume is true, a new sandbox will be created from the most recent snapshot.
project, limit, sort_by, name_prefix, cursor, sort_order, status, tags, team_id, slugRetrieves a paginated list of named sandboxes belonging to a specific project. Results can be sorted by creation time or name, and optionally filtered by name prefix or status.
team_id, slugCreates a named sandbox environment. Named sandboxes have a unique name within a project and support automatic snapshotting on shutdown. When no `image` is provided (and the sandbox is not restored from a snapshot), the sandbox is created from the default universal image. Unlike v3, snapshots expire after 7 days by default and persistent sandboxes keep only their most recent snapshot unless `keepLastSnapshots` is configured otherwise (or set to `null` to disable the limit).
nameproject_id, resume, team_id, slugUpdates the configuration of a sandbox. Only the provided fields will be modified; omitted fields remain unchanged.
nameproject_id, delete_orphan_snapshots, team_id, slugDeletes a sandbox by name. If sandboxes are currently running, they will be stopped first. This operation deletes all sandbox entities with the given name and the named sandbox metadata.
teamId, slugCreates a named sandbox environment. Named sandboxes have a unique name within a project and support automatic snapshotting on shutdown.
nameprojectId, teamId, slugForks a named sandbox, creating a new named sandbox from the source's configuration. Resources, timeout, ports, tags, network policy, mounts, Connect network, image, persistence, snapshot settings and — unlike the SDK-side fork — environment variables are copied from the source automatically (`interactive` is not). When the source has a snapshot the fork starts from it; otherwise it starts from the source's runtime/image. Any field provided in the request body overrides the value copied from the source.
teamId, slugCreates a named sandbox environment. Named sandboxes have a unique name within a project and support automatic snapshotting on shutdown. Unlike v2, this version has no `runtime` parameter: when no `image` is provided (and the sandbox is not restored from a snapshot), the sandbox is created from the default universal image.
nameprojectId, teamId, slugForks a named sandbox, creating a new named sandbox from the source's configuration. Resources, timeout, ports, tags, network policy, mounts, Connect network, image, persistence, snapshot settings and — unlike the SDK-side fork — environment variables are copied from the source automatically (`interactive` is not). When the source has a snapshot the fork starts from it; otherwise it starts from the source's runtime/image. Any field provided in the request body overrides the value copied from the source. Unlike v2, when neither the body nor the source provides a value, snapshots expire after 7 days by default and persistent sandboxes keep only their most recent snapshot (`keepLastSnapshots: null` disables the limit).
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringName of the source sandbox to fork.
stringOpaque pagination cursor from a previous response.
booleanWhen true, snapshots of the deleted sandbox that are not referenced by any other sandbox are also deleted asynchronously. Defaults to false. (wire: deleteOrphanSnapshots)
numberMaximum number of named sandboxes to return in the response. Used for pagination.
stringFilter named sandboxes whose name starts with this prefix. Only valid when sortBy=name. (wire: namePrefix)
stringThe unique identifier or name of the project to list named sandboxes for.
stringThe ID of the project the source sandbox belongs to. Required unless authenticating with an OIDC token.
stringThe project ID that owns the named sandbox. When provided, takes precedence over OIDC project context. (wire: projectId)
booleanWhether to automatically resume a stopped named sandbox by creating a new instance from its snapshot. Defaults to false.
stringThe Team slug to perform the request on behalf of.
stringField to sort by. (wire: sortBy)
stringSort direction. Defaults to desc. (wire: sortOrder)
stringFilter named sandboxes by status. Only valid when sortBy is createdAt.
Filter sandboxes by tag. Format: \"key:value\". Only one tag filter is supported at a time.
stringThe Team identifier to perform the request on behalf of.
stringThe Team identifier to perform the request on behalf of. (wire: teamId)
+ +## `SELECT` examples + + + + +Retrieves a named sandbox by name, including its current sandbox and routes. If the sandbox is stopped and resume is true, a new sandbox will be created from the most recent snapshot. + +```sql +SELECT +name, +current_session_id, +current_snapshot_id, +network_id, +created_at, +cwd, +expires_at, +failover_regions, +image, +keep_last_snapshots, +memory, +mounts, +network_policy, +persistent, +region, +runtime, +snapshot_expiration, +status, +status_updated_at, +tags, +timeout, +total_active_cpu_duration_ms, +total_duration_ms, +total_egress_bytes, +total_ingress_bytes, +updated_at, +vcpus +FROM vercel.sandboxes.sandboxes +WHERE name = '{{ name }}' -- required +AND project_id = '{{ project_id }}' +AND resume = '{{ resume }}' +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + + +Retrieves a paginated list of named sandboxes belonging to a specific project. Results can be sorted by creation time or name, and optionally filtered by name prefix or status. + +```sql +SELECT +name, +current_session_id, +current_snapshot_id, +network_id, +created_at, +cwd, +expires_at, +failover_regions, +image, +keep_last_snapshots, +memory, +mounts, +network_policy, +persistent, +region, +runtime, +snapshot_expiration, +status, +status_updated_at, +tags, +timeout, +total_active_cpu_duration_ms, +total_duration_ms, +total_egress_bytes, +total_ingress_bytes, +updated_at, +vcpus +FROM vercel.sandboxes.sandboxes +WHERE project = '{{ project }}' +AND limit = '{{ limit }}' +AND sort_by = '{{ sort_by }}' +AND name_prefix = '{{ name_prefix }}' +AND cursor = '{{ cursor }}' +AND sort_order = '{{ sort_order }}' +AND status = '{{ status }}' +AND tags = '{{ tags }}' +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + + + +## `INSERT` examples + + + + +Creates a named sandbox environment. Named sandboxes have a unique name within a project and support automatic snapshotting on shutdown. When no `image` is provided (and the sandbox is not restored from a snapshot), the sandbox is created from the default universal image. Unlike v3, snapshots expire after 7 days by default and persistent sandboxes keep only their most recent snapshot unless `keepLastSnapshots` is configured otherwise (or set to `null` to disable the limit). + +```sql +INSERT INTO vercel.sandboxes.sandboxes ( +network_policy, +resources, +source, +project_id, +ports, +image, +timeout, +env, +mounts, +region, +failover_regions, +network_id, +name, +persistent, +snapshot_expiration, +keep_last_snapshots, +tags, +team_id, +slug +) +SELECT +'{{ network_policy }}', +'{{ resources }}', +'{{ source }}', +'{{ project_id }}', +'{{ ports }}', +'{{ image }}', +{{ timeout }}, +'{{ env }}', +'{{ mounts }}', +'{{ region }}', +'{{ failover_regions }}', +'{{ network_id }}', +'{{ name }}', +{{ persistent }}, +{{ snapshot_expiration }}, +'{{ keep_last_snapshots }}', +'{{ tags }}', +'{{ team_id }}', +'{{ slug }}' +RETURNING +routes, +sandbox, +session +; +``` + + + +{`# Description fields are for documentation purposes +- name: sandboxes + props: + - name: network_policy + description: | + Network access policy for the sandbox.\n Controls which external hosts the sandbox can communicate with.\n Use \"allow-all\" mode to allow all traffic, \"deny-all\" to block all traffic or \"custom\" to provide specific rules. + value: + mode: "{{ mode }}" + allowedDomains: + - "{{ allowedDomains }}" + allowedCIDRs: + - "{{ allowedCIDRs }}" + deniedCIDRs: + - "{{ deniedCIDRs }}" + injectionRules: + - domain: "{{ domain }}" + headers: "{{ headers }}" + match: + path: + exact: "{{ exact }}" + startsWith: "{{ startsWith }}" + method: + - "{{ method }}" + queryString: + - key: + exact: "{{ exact }}" + startsWith: "{{ startsWith }}" + value: + exact: "{{ exact }}" + startsWith: "{{ startsWith }}" + headers: + - key: + exact: "{{ exact }}" + startsWith: "{{ startsWith }}" + value: + exact: "{{ exact }}" + startsWith: "{{ startsWith }}" + allow: "{{ allow }}" + subnets: + allow: + - "{{ allow }}" + deny: + - "{{ deny }}" + - name: resources + description: | + Resources to define the VM + value: + vcpus: {{ vcpus }} + memory: {{ memory }} + - name: source + description: | + The source from which to initialize the sandbox filesystem. Can be a Git repository, a tarball URL, or an existing snapshot. + value: + type: "{{ type }}" + url: "{{ url }}" + username: "{{ username }}" + password: "{{ password }}" + depth: {{ depth }} + revision: "{{ revision }}" + snapshotId: "{{ snapshotId }}" + - name: project_id + value: "{{ project_id }}" + description: | + The target project slug or ID in which the sandbox will be assigned to. + - name: ports + value: + - {{ ports }} + description: | + List of ports to expose from the sandbox. Each port will be accessible via a unique URL. Maximum of 15 ports can be exposed. + - name: image + value: "{{ image }}" + description: | + Image to use for the sandbox. + - name: timeout + value: {{ timeout }} + description: | + Maximum duration in milliseconds that the sandbox can run before being automatically stopped. + - name: env + value: "{{ env }}" + description: | + Default environment variables for the sandbox. These are inherited by all commands unless overridden. + default: [object Object] + - name: mounts + value: "{{ mounts }}" + description: | + List of drives to mount to the sandbox at the provided path. + - name: region + value: "{{ region }}" + description: | + The Vercel region in which to create the sandbox. + valid_values: ['iad1', 'sfo1', 'cle1', 'cdg1', 'fra1', 'arn1', 'sin1', 'pdx1', 'lhr1', 'icn1', 'bom1', 'cpt1', 'dub1', 'gru1', 'hkg1', 'syd1', 'yul1', 'hnd1', 'kix1'] + default: iad1,sfo1,cle1,cdg1,fra1,arn1,sin1,pdx1,lhr1,icn1,bom1,cpt1,dub1,gru1,hkg1,syd1,yul1,hnd1,kix1 + - name: failover_regions + value: + - "{{ failover_regions }}" + description: | + The regions the sandbox falls back to when it cannot be created in \`region\`. + - name: network_id + value: "{{ network_id }}" + description: | + The Connect network id for the target Secure Compute private network. + - name: name + value: "{{ name }}" + description: | + Name for the sandbox. Must be unique per project and URL-safe (alphanumeric, hyphens, underscores). + - name: persistent + value: {{ persistent }} + description: | + Whether the sandbox persists its state across restarts via automatic snapshots. Defaults to true. + default: true + - name: snapshot_expiration + value: {{ snapshot_expiration }} + description: | + Default snapshot expiration time in milliseconds. Defaults to 7 days. Set to 0 to disable expiration. When set, this value is used as the default expiration for all snapshots created for this sandbox. + - name: keep_last_snapshots + value: "{{ keep_last_snapshots }}" + description: | + Protect the N most recent snapshots with different expiration/deletion behavior. Persistent sandboxes default to keeping only the last snapshot (evicted snapshots are deleted). Set to null to disable the limit. + - name: tags + value: "{{ tags }}" + description: | + Key-value tags to associate with the sandbox. Maximum 5 tags. + - name: team_id + value: "{{ team_id }}" + description: The Team identifier to perform the request on behalf of. + description: The Team identifier to perform the request on behalf of. + - name: slug + value: "{{ slug }}" + description: The Team slug to perform the request on behalf of. + description: The Team slug to perform the request on behalf of. +`} + + + + + +## `UPDATE` examples + + + + +Updates the configuration of a sandbox. Only the provided fields will be modified; omitted fields remain unchanged. + +```sql +UPDATE vercel.sandboxes.sandboxes +SET +resources = '{{ resources }}', +runtime = '{{ runtime }}', +timeout = {{ timeout }}, +persistent = {{ persistent }}, +snapshot_expiration = {{ snapshot_expiration }}, +keep_last_snapshots = '{{ keep_last_snapshots }}', +network_policy = '{{ network_policy }}', +region = '{{ region }}', +failover_regions = '{{ failover_regions }}', +mounts = '{{ mounts }}', +network_id = '{{ network_id }}', +env = '{{ env }}', +ports = '{{ ports }}', +current_snapshot_id = '{{ current_snapshot_id }}', +tags = '{{ tags }}' +WHERE +name = '{{ name }}' --required +AND project_id = '{{ project_id}}' +AND resume = {{ resume}} +AND team_id = '{{ team_id}}' +AND slug = '{{ slug}}' +RETURNING +resumed, +routes, +sandbox, +session; +``` + + + + +## `DELETE` examples + + + + +Deletes a sandbox by name. If sandboxes are currently running, they will be stopped first. This operation deletes all sandbox entities with the given name and the named sandbox metadata. + +```sql +DELETE FROM vercel.sandboxes.sandboxes +WHERE name = '{{ name }}' --required +AND project_id = '{{ project_id }}' +AND delete_orphan_snapshots = '{{ delete_orphan_snapshots }}' +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + + + +## Lifecycle Methods + +EXEC variables use wire (API) names. + + + + +Creates a named sandbox environment. Named sandboxes have a unique name within a project and support automatic snapshotting on shutdown. + +```sql +EXEC vercel.sandboxes.sandboxes.create_v2 +@teamId='{{ teamId }}', +@slug='{{ slug }}' +@@json= +'{ +"networkPolicy": "{{ networkPolicy }}", +"runtime": "{{ runtime }}", +"resources": "{{ resources }}", +"source": "{{ source }}", +"projectId": "{{ projectId }}", +"ports": "{{ ports }}", +"image": "{{ image }}", +"timeout": {{ timeout }}, +"env": "{{ env }}", +"mounts": "{{ mounts }}", +"region": "{{ region }}", +"failoverRegions": "{{ failoverRegions }}", +"networkId": "{{ networkId }}", +"name": "{{ name }}", +"persistent": {{ persistent }}, +"snapshotExpiration": {{ snapshotExpiration }}, +"keepLastSnapshots": "{{ keepLastSnapshots }}", +"tags": "{{ tags }}" +}' +; +``` + + + +Forks a named sandbox, creating a new named sandbox from the source's configuration. Resources, timeout, ports, tags, network policy, mounts, Connect network, image, persistence, snapshot settings and — unlike the SDK-side fork — environment variables are copied from the source automatically (`interactive` is not). When the source has a snapshot the fork starts from it; otherwise it starts from the source's runtime/image. Any field provided in the request body overrides the value copied from the source. + +```sql +EXEC vercel.sandboxes.sandboxes.fork_v2 +@name='{{ name }}' --required, +@projectId='{{ projectId }}', +@teamId='{{ teamId }}', +@slug='{{ slug }}' +@@json= +'{ +"networkPolicy": "{{ networkPolicy }}", +"resources": "{{ resources }}", +"ports": "{{ ports }}", +"image": "{{ image }}", +"timeout": {{ timeout }}, +"env": "{{ env }}", +"mounts": "{{ mounts }}", +"region": "{{ region }}", +"failoverRegions": "{{ failoverRegions }}", +"networkId": "{{ networkId }}", +"name": "{{ name }}", +"persistent": {{ persistent }}, +"snapshotExpiration": {{ snapshotExpiration }}, +"keepLastSnapshots": "{{ keepLastSnapshots }}", +"tags": "{{ tags }}" +}' +; +``` + + + +Creates a named sandbox environment. Named sandboxes have a unique name within a project and support automatic snapshotting on shutdown. Unlike v2, this version has no `runtime` parameter: when no `image` is provided (and the sandbox is not restored from a snapshot), the sandbox is created from the default universal image. + +```sql +EXEC vercel.sandboxes.sandboxes.create_v3 +@teamId='{{ teamId }}', +@slug='{{ slug }}' +@@json= +'{ +"networkPolicy": "{{ networkPolicy }}", +"resources": "{{ resources }}", +"source": "{{ source }}", +"projectId": "{{ projectId }}", +"ports": "{{ ports }}", +"image": "{{ image }}", +"timeout": {{ timeout }}, +"env": "{{ env }}", +"mounts": "{{ mounts }}", +"region": "{{ region }}", +"failoverRegions": "{{ failoverRegions }}", +"networkId": "{{ networkId }}", +"name": "{{ name }}", +"persistent": {{ persistent }}, +"snapshotExpiration": {{ snapshotExpiration }}, +"keepLastSnapshots": "{{ keepLastSnapshots }}", +"tags": "{{ tags }}" +}' +; +``` + + + +Forks a named sandbox, creating a new named sandbox from the source's configuration. Resources, timeout, ports, tags, network policy, mounts, Connect network, image, persistence, snapshot settings and — unlike the SDK-side fork — environment variables are copied from the source automatically (`interactive` is not). When the source has a snapshot the fork starts from it; otherwise it starts from the source's runtime/image. Any field provided in the request body overrides the value copied from the source. Unlike v2, when neither the body nor the source provides a value, snapshots expire after 7 days by default and persistent sandboxes keep only their most recent snapshot (`keepLastSnapshots: null` disables the limit). + +```sql +EXEC vercel.sandboxes.sandboxes.fork +@name='{{ name }}' --required, +@projectId='{{ projectId }}', +@teamId='{{ teamId }}', +@slug='{{ slug }}' +@@json= +'{ +"networkPolicy": "{{ networkPolicy }}", +"resources": "{{ resources }}", +"ports": "{{ ports }}", +"image": "{{ image }}", +"timeout": {{ timeout }}, +"env": "{{ env }}", +"mounts": "{{ mounts }}", +"region": "{{ region }}", +"failoverRegions": "{{ failoverRegions }}", +"networkId": "{{ networkId }}", +"name": "{{ name }}", +"persistent": {{ persistent }}, +"snapshotExpiration": {{ snapshotExpiration }}, +"keepLastSnapshots": "{{ keepLastSnapshots }}", +"tags": "{{ tags }}" +}' +; +``` + + diff --git a/website/docs/services/sandboxes/session_files/index.md b/website/docs/services/sandboxes/session_files/index.md new file mode 100644 index 0000000..b01b12c --- /dev/null +++ b/website/docs/services/sandboxes/session_files/index.md @@ -0,0 +1,173 @@ +--- +title: session_files +hide_title: false +hide_table_of_contents: false +keywords: + - session_files + - sandboxes + - vercel + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a session_files resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + +`SELECT` not supported for this resource, use `SHOW METHODS` to view available operations for the resource. + + +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
session_id, pathteamId, slugDownloads the contents of a file from a session's filesystem. The file content is returned as a binary stream with appropriate Content-Disposition headers for file download.
session_id, pathteamId, slugCreates a new directory in a session's filesystem. By default, parent directories are created recursively if they don't exist (similar to `mkdir -p`).
session_idx-cwd, teamId, slugUploads and extracts files to a session's filesystem. Files must be uploaded as a gzipped tarball (`.tar.gz`) with the `Content-Type` header set to `application/gzip`. The tarball contents are extracted to the session's working directory, or to a custom directory specified via the `x-cwd` header.
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringThe unique identifier of the session to write files to.
stringThe Team slug to perform the request on behalf of.
stringThe Team identifier to perform the request on behalf of.
stringThe target directory where the tarball contents will be extracted. If not specified, files are extracted to the sandbox home directory.
+ +## Lifecycle Methods + +EXEC variables use wire (API) names. + + + + +Downloads the contents of a file from a session's filesystem. The file content is returned as a binary stream with appropriate Content-Disposition headers for file download. + +```sql +EXEC vercel.sandboxes.session_files.read +@session_id='{{ session_id }}' --required, +@teamId='{{ teamId }}', +@slug='{{ slug }}' +@@json= +'{ +"cwd": "{{ cwd }}", +"path": "{{ path }}" +}' +; +``` + + + +Creates a new directory in a session's filesystem. By default, parent directories are created recursively if they don't exist (similar to `mkdir -p`). + +```sql +EXEC vercel.sandboxes.session_files.mkdir +@session_id='{{ session_id }}' --required, +@teamId='{{ teamId }}', +@slug='{{ slug }}' +@@json= +'{ +"cwd": "{{ cwd }}", +"path": "{{ path }}", +"recursive": {{ recursive }} +}' +; +``` + + + +Uploads and extracts files to a session's filesystem. Files must be uploaded as a gzipped tarball (`.tar.gz`) with the `Content-Type` header set to `application/gzip`. The tarball contents are extracted to the session's working directory, or to a custom directory specified via the `x-cwd` header. + +```sql +EXEC vercel.sandboxes.session_files.write +@session_id='{{ session_id }}' --required, +@x-cwd='{{ x-cwd }}', +@teamId='{{ teamId }}', +@slug='{{ slug }}' +; +``` + + diff --git a/website/docs/services/sandboxes/sessions/index.md b/website/docs/services/sandboxes/sessions/index.md new file mode 100644 index 0000000..e7b4c7b --- /dev/null +++ b/website/docs/services/sandboxes/sessions/index.md @@ -0,0 +1,570 @@ +--- +title: sessions +hide_title: false +hide_table_of_contents: false +keywords: + - sessions + - sandboxes + - vercel + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a sessions resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + +The session was retrieved successfully. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringThe unique identifier of the sandbox. (example: sbx_123a6c5209bc3778245d011443644c8d27dc2c50)
stringThe unique identifier of the project associated with this session. (example: prj_123a6c5209bc3778245d011443644c8d27dc2c50) (wire: projectId)
stringThe unique identifier of the snapshot associated with this sandbox, if any. (example: snap_123a6c5209bc3778245d011443644c8d27dc2c50) (wire: sourceSnapshotId)
stringThe name of the source sandbox. (example: my-sandbox) (wire: sourceSandboxName)
numberThe time when the sandbox was aborted, in milliseconds since the epoch. (wire: abortedAt)
numberThe amount of CPU time the sandbox consumed, if available, in milliseconds. This value is only available once the sandbox is stopped, and only if it stopped successfully. (wire: activeCpuDurationMs)
numberThe time when the sandbox was created, in milliseconds since the epoch. (wire: createdAt)
stringThe working directory of the sandbox. (example: /vercel/sandbox)
numberThe duration of the sandbox in milliseconds.
numberMemory allocated to this sandbox in MB.
objectThe network policy applied to this sandbox, if any. (wire: networkPolicy)
objectThe quantity of data transfered to and from the sandbox, in bytes. This value is only available once the sandbox is stopped, and only if it stopped successfully. (wire: networkTransfer)
stringThe region where the sandbox is hosted. (example: iad1)
numberThe time when the sandbox was requested, in milliseconds since the epoch. (wire: requestedAt)
numberThe time when the sandbox was requested to stop, in milliseconds since the epoch. (wire: requestedStopAt)
stringThe runtime of the sandbox. (example: node22)
numberThe time when a snapshot was requested, in milliseconds since the epoch. (wire: snapshottedAt)
numberThe time when the sandbox was started, in milliseconds since the epoch. (wire: startedAt)
stringThe status of the sandbox. (aborted, failed, pending, running, snapshotting, stopped, stopping) (example: running)
numberThe time when the sandbox was stopped, in milliseconds since the epoch. (wire: stoppedAt)
numberThe maximum amount of time the sandbox will run for in milliseconds.
numberThe last time the sandbox was updated, in milliseconds since the epoch. (wire: updatedAt)
numberNumber of vCPUs allocated to this sandbox.
+
+ + +The list of sessions matching the request filters. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringThe unique identifier of the sandbox. (example: sbx_123a6c5209bc3778245d011443644c8d27dc2c50)
stringThe unique identifier of the project associated with this session. (example: prj_123a6c5209bc3778245d011443644c8d27dc2c50) (wire: projectId)
stringThe unique identifier of the snapshot associated with this sandbox, if any. (example: snap_123a6c5209bc3778245d011443644c8d27dc2c50) (wire: sourceSnapshotId)
stringThe name of the source sandbox. (example: my-sandbox) (wire: sourceSandboxName)
numberThe time when the sandbox was aborted, in milliseconds since the epoch. (wire: abortedAt)
numberThe amount of CPU time the sandbox consumed, if available, in milliseconds. This value is only available once the sandbox is stopped, and only if it stopped successfully. (wire: activeCpuDurationMs)
numberThe time when the sandbox was created, in milliseconds since the epoch. (wire: createdAt)
stringThe working directory of the sandbox. (example: /vercel/sandbox)
numberThe duration of the sandbox in milliseconds.
numberMemory allocated to this sandbox in MB.
objectThe network policy applied to this sandbox, if any. (wire: networkPolicy)
objectThe quantity of data transfered to and from the sandbox, in bytes. This value is only available once the sandbox is stopped, and only if it stopped successfully. (wire: networkTransfer)
stringThe region where the sandbox is hosted. (example: iad1)
numberThe time when the sandbox was requested, in milliseconds since the epoch. (wire: requestedAt)
numberThe time when the sandbox was requested to stop, in milliseconds since the epoch. (wire: requestedStopAt)
stringThe runtime of the sandbox. (example: node22)
numberThe time when a snapshot was requested, in milliseconds since the epoch. (wire: snapshottedAt)
numberThe time when the sandbox was started, in milliseconds since the epoch. (wire: startedAt)
stringThe status of the sandbox. (aborted, failed, pending, running, snapshotting, stopped, stopping) (example: running)
numberThe time when the sandbox was stopped, in milliseconds since the epoch. (wire: stoppedAt)
numberThe maximum amount of time the sandbox will run for in milliseconds.
numberThe last time the sandbox was updated, in milliseconds since the epoch. (wire: updatedAt)
numberNumber of vCPUs allocated to this sandbox.
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
session_idteam_id, slugRetrieves detailed information about a specific session, including its current status, resource configuration, and exposed routes.
project, name, limit, cursor, sort_order, team_id, slugRetrieves a paginated list of sessions belonging to a specific sandbox. Results are sorted by creation time and paginated using an opaque cursor.
session_idteamId, slugStops a running session and releases its allocated resources. All running processes within the session will be terminated. This action cannot be undone. A stopped session cannot be restarted.
session_id, durationteamId, slugExtends the maximum execution time of a running session. The session must be active and able to accept commands. The total timeout cannot exceed the maximum allowed limit for your account.
session_id, modeteamId, slugReplaces the network access policy of a running session. Use this to control which external hosts the session can communicate with. This is a full replacement. Any previously configured network rules will be overwritten.
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringThe unique identifier of the session to update the network policy for.
stringOpaque pagination cursor from a previous response.
numberMaximum number of sessions to return in the response. Used for pagination.
stringFilter sessions by sandbox name. Only sessions belonging to the specified sandbox are returned.
stringThe unique identifier or name of the project to list sessions for.
stringThe Team slug to perform the request on behalf of.
stringSort direction for results by creation time. (wire: sortOrder)
stringThe Team identifier to perform the request on behalf of.
stringThe Team identifier to perform the request on behalf of. (wire: teamId)
+ +## `SELECT` examples + + + + +Retrieves detailed information about a specific session, including its current status, resource configuration, and exposed routes. + +```sql +SELECT +id, +project_id, +source_snapshot_id, +source_sandbox_name, +aborted_at, +active_cpu_duration_ms, +created_at, +cwd, +duration, +memory, +network_policy, +network_transfer, +region, +requested_at, +requested_stop_at, +runtime, +snapshotted_at, +started_at, +status, +stopped_at, +timeout, +updated_at, +vcpus +FROM vercel.sandboxes.sessions +WHERE session_id = '{{ session_id }}' -- required +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + + +Retrieves a paginated list of sessions belonging to a specific sandbox. Results are sorted by creation time and paginated using an opaque cursor. + +```sql +SELECT +id, +project_id, +source_snapshot_id, +source_sandbox_name, +aborted_at, +active_cpu_duration_ms, +created_at, +cwd, +duration, +memory, +network_policy, +network_transfer, +region, +requested_at, +requested_stop_at, +runtime, +snapshotted_at, +started_at, +status, +stopped_at, +timeout, +updated_at, +vcpus +FROM vercel.sandboxes.sessions +WHERE project = '{{ project }}' +AND name = '{{ name }}' +AND limit = '{{ limit }}' +AND cursor = '{{ cursor }}' +AND sort_order = '{{ sort_order }}' +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + + + +## Lifecycle Methods + +EXEC variables use wire (API) names. + + + + +Stops a running session and releases its allocated resources. All running processes within the session will be terminated. This action cannot be undone. A stopped session cannot be restarted. + +```sql +EXEC vercel.sandboxes.sessions.stop +@session_id='{{ session_id }}' --required, +@teamId='{{ teamId }}', +@slug='{{ slug }}' +; +``` + + + +Extends the maximum execution time of a running session. The session must be active and able to accept commands. The total timeout cannot exceed the maximum allowed limit for your account. + +```sql +EXEC vercel.sandboxes.sessions.extend_timeout +@session_id='{{ session_id }}' --required, +@teamId='{{ teamId }}', +@slug='{{ slug }}' +@@json= +'{ +"duration": {{ duration }} +}' +; +``` + + + +Replaces the network access policy of a running session. Use this to control which external hosts the session can communicate with. This is a full replacement. Any previously configured network rules will be overwritten. + +```sql +EXEC vercel.sandboxes.sessions.update_network_policy +@session_id='{{ session_id }}' --required, +@teamId='{{ teamId }}', +@slug='{{ slug }}' +@@json= +'{ +"mode": "{{ mode }}", +"allowedDomains": "{{ allowedDomains }}", +"allowedCIDRs": "{{ allowedCIDRs }}", +"deniedCIDRs": "{{ deniedCIDRs }}", +"injectionRules": "{{ injectionRules }}", +"allow": "{{ allow }}", +"subnets": "{{ subnets }}" +}' +; +``` + + diff --git a/website/docs/services/sandboxes/snapshots/index.md b/website/docs/services/sandboxes/snapshots/index.md new file mode 100644 index 0000000..8ff6f75 --- /dev/null +++ b/website/docs/services/sandboxes/snapshots/index.md @@ -0,0 +1,487 @@ +--- +title: snapshots +hide_title: false +hide_table_of_contents: false +keywords: + - snapshots + - sandboxes + - vercel + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a snapshots resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + +This object contains information related to a Snapshot of a Vercel Sandbox session (v2 API). + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringThe unique identifier of the snapshot. (example: snap_123a6c5209bc3778245d011443644c8d27dc2c50)
stringThe unique identifier of the parent snapshot, if this snapshot was created from another snapshot. (example: snap_parent123) (wire: parentId)
stringThe unique identifier of the session from which the snapshot was created. (example: sbx_123a6c5209bc3778245d011443644c8d27dc2c50) (wire: sourceSessionId)
numberThe time when the snapshot was created, in milliseconds since the epoch. (wire: createdAt)
stringThe method used to create the snapshot. (automatic, manual) (example: manual) (wire: creationMethod)
numberThe time when the snapshot will expire, in milliseconds since the epoch. If not set, the snapshot does not have any expiration. (wire: expiresAt)
numberThe last time the snapshot was used (e.g. to resume or create a sandbox), in milliseconds since the epoch. Falls back to `createdAt` for older snapshots that predate this field. (wire: lastUsedAt)
stringThe region where the snapshot is stored. (example: iad1)
arrayThe regions where the snapshot is available.
numberThe size of the snapshot in bytes. (wire: sizeBytes)
stringThe status of the snapshot. (created, deleted, failed) (example: created)
numberThe last time the snapshot was updated, in milliseconds since the epoch. (wire: updatedAt)
+
+ + +This object contains information related to a Snapshot of a Vercel Sandbox session (v2 API). + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringThe unique identifier of the snapshot. (example: snap_123a6c5209bc3778245d011443644c8d27dc2c50)
stringThe unique identifier of the parent snapshot, if this snapshot was created from another snapshot. (example: snap_parent123) (wire: parentId)
stringThe unique identifier of the session from which the snapshot was created. (example: sbx_123a6c5209bc3778245d011443644c8d27dc2c50) (wire: sourceSessionId)
numberThe time when the snapshot was created, in milliseconds since the epoch. (wire: createdAt)
stringThe method used to create the snapshot. (automatic, manual) (example: manual) (wire: creationMethod)
numberThe time when the snapshot will expire, in milliseconds since the epoch. If not set, the snapshot does not have any expiration. (wire: expiresAt)
numberThe last time the snapshot was used (e.g. to resume or create a sandbox), in milliseconds since the epoch. Falls back to `createdAt` for older snapshots that predate this field. (wire: lastUsedAt)
stringThe region where the snapshot is stored. (example: iad1)
arrayThe regions where the snapshot is available.
numberThe size of the snapshot in bytes. (wire: sizeBytes)
stringThe status of the snapshot. (created, deleted, failed) (example: created)
numberThe last time the snapshot was updated, in milliseconds since the epoch. (wire: updatedAt)
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
snapshot_idteam_id, slugRetrieves detailed information about a specific snapshot, including its creation time, size, expiration date, and the source session it was created from.
project, name, limit, cursor, sort_order, team_id, slugRetrieves a paginated list of snapshots for a specific project.
session_idteam_id, slugCreates a point-in-time snapshot of a running session's filesystem. Snapshots can be used to quickly restore a session to a previous state or to create new sessions with pre-configured environments. The session must be running and able to accept commands for a snapshot to be created. The session will be terminated after the snapshot is created. Unlike v2, snapshots expire after 7 days when neither the request nor the sandbox configuration specifies an expiration.
snapshot_idteam_id, slugPermanently deletes a snapshot and frees its associated storage. This action cannot be undone. After deletion, the snapshot can no longer be used to create new sessions.
session_idteamId, slugCreates a point-in-time snapshot of a running session's filesystem. Snapshots can be used to quickly restore a session to a previous state or to create new sessions with pre-configured environments. The session must be running and able to accept commands for a snapshot to be created. The session will be terminated after the snapshot is created.
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringThe unique identifier of the session to snapshot.
stringThe unique identifier of the snapshot to delete.
stringOpaque pagination cursor from a previous response.
numberMaximum number of snapshots to return in the response. Used for pagination.
stringName for the sandbox. Must be unique per project and URL-safe (alphanumeric, hyphens, underscores).
stringThe unique identifier or name of the project to list snapshots for.
stringThe Team slug to perform the request on behalf of.
stringSort direction for results by creation time. (wire: sortOrder)
stringThe Team identifier to perform the request on behalf of.
stringThe Team identifier to perform the request on behalf of. (wire: teamId)
+ +## `SELECT` examples + + + + +Retrieves detailed information about a specific snapshot, including its creation time, size, expiration date, and the source session it was created from. + +```sql +SELECT +id, +parent_id, +source_session_id, +created_at, +creation_method, +expires_at, +last_used_at, +region, +regions, +size_bytes, +status, +updated_at +FROM vercel.sandboxes.snapshots +WHERE snapshot_id = '{{ snapshot_id }}' -- required +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + + +Retrieves a paginated list of snapshots for a specific project. + +```sql +SELECT +id, +parent_id, +source_session_id, +created_at, +creation_method, +expires_at, +last_used_at, +region, +regions, +size_bytes, +status, +updated_at +FROM vercel.sandboxes.snapshots +WHERE project = '{{ project }}' +AND name = '{{ name }}' +AND limit = '{{ limit }}' +AND cursor = '{{ cursor }}' +AND sort_order = '{{ sort_order }}' +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + + + +## `INSERT` examples + + + + +Creates a point-in-time snapshot of a running session's filesystem. Snapshots can be used to quickly restore a session to a previous state or to create new sessions with pre-configured environments. The session must be running and able to accept commands for a snapshot to be created. The session will be terminated after the snapshot is created. Unlike v2, snapshots expire after 7 days when neither the request nor the sandbox configuration specifies an expiration. + +```sql +INSERT INTO vercel.sandboxes.snapshots ( +expiration, +session_id, +team_id, +slug +) +SELECT +{{ expiration }}, +'{{ session_id }}', +'{{ team_id }}', +'{{ slug }}' +RETURNING +session, +snapshot +; +``` + + + +{`# Description fields are for documentation purposes +- name: snapshots + props: + - name: session_id + value: "{{ session_id }}" + description: Required parameter for the snapshots resource. + - name: expiration + value: {{ expiration }} + description: | + The number of milliseconds after which the snapshot will expire and be deleted. Defaults to 7 days when neither this field nor the sandbox configuration specifies an expiration. Use 0 for no expiration. + - name: team_id + value: "{{ team_id }}" + description: The Team identifier to perform the request on behalf of. + description: The Team identifier to perform the request on behalf of. + - name: slug + value: "{{ slug }}" + description: The Team slug to perform the request on behalf of. + description: The Team slug to perform the request on behalf of. +`} + + + + + +## `DELETE` examples + + + + +Permanently deletes a snapshot and frees its associated storage. This action cannot be undone. After deletion, the snapshot can no longer be used to create new sessions. + +```sql +DELETE FROM vercel.sandboxes.snapshots +WHERE snapshot_id = '{{ snapshot_id }}' --required +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + + + +## Lifecycle Methods + +EXEC variables use wire (API) names. + + + + +Creates a point-in-time snapshot of a running session's filesystem. Snapshots can be used to quickly restore a session to a previous state or to create new sessions with pre-configured environments. The session must be running and able to accept commands for a snapshot to be created. The session will be terminated after the snapshot is created. + +```sql +EXEC vercel.sandboxes.snapshots.create_v2 +@session_id='{{ session_id }}' --required, +@teamId='{{ teamId }}', +@slug='{{ slug }}' +@@json= +'{ +"expiration": {{ expiration }} +}' +; +``` + + diff --git a/website/docs/services/secrets/secrets/index.md b/website/docs/services/secrets/secrets/index.md deleted file mode 100644 index ca2d21e..0000000 --- a/website/docs/services/secrets/secrets/index.md +++ /dev/null @@ -1,460 +0,0 @@ ---- -title: secrets -hide_title: false -hide_table_of_contents: false -keywords: - - secrets - - secrets - - vercel - - infrastructure-as-code - - configuration-as-data - - cloud inventory -description: Query, deploy and manage vercel resources using SQL -custom_edit_url: null -image: /img/stackql-vercel-provider-featured-image.png ---- - -import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; - -Creates, updates, deletes, gets or lists a secrets resource. - -## Overview - - - - -
Namesecrets
TypeResource
Id
- -## Fields - -The following fields are returned by `SELECT` queries: - - - - -Successful response retrieving a secret. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDatatypeDescription
stringThe name of the secret. (example: my-api-key)
string (date-time)The date when the secret was created. (example: 2021-02-10T13:11:49.180Z)
numberTimestamp for when the secret was created.
booleanIndicates whether the secret value can be decrypted after it has been created.
stringThe unique identifier of the project which the secret belongs to. (example: prj_2WjyKQmM8ZnGcJsPWMrHRHrE)
stringThe unique identifier of the team the secret was created for. (example: team_LLHUOMOoDlqOp8wPE4kFo9pE)
stringThe unique identifier of the secret. (example: sec_XCG7t7AIHuO2SBA8667zNUiM)
stringThe unique identifier of the user who created the secret. (example: 2qDDuGFTWXBLDNnqZfWPDp1A)
stringThe value of the secret.
-
- - -Successful response retrieving a list of secrets. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDatatypeDescription
stringThe name of the secret. (example: my-api-key)
string (date-time)The date when the secret was created. (example: 2021-02-10T13:11:49.180Z)
numberTimestamp for when the secret was created.
booleanIndicates whether the secret value can be decrypted after it has been created.
stringThe unique identifier of the project which the secret belongs to. (example: prj_2WjyKQmM8ZnGcJsPWMrHRHrE)
stringThe unique identifier of the team the secret was created for. (example: team_LLHUOMOoDlqOp8wPE4kFo9pE)
stringThe unique identifier of the secret. (example: sec_XCG7t7AIHuO2SBA8667zNUiM)
stringThe unique identifier of the user who created the secret. (example: 2qDDuGFTWXBLDNnqZfWPDp1A)
stringThe value of the secret.
-
-
- -## Methods - -The following methods are available for this resource: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameAccessible byRequired ParamsOptional ParamsDescription
idOrName, teamIddecryptRetrieves the information for a specific secret by passing either the secret id or name in the URL.
teamIdid, projectIdRetrieves the active Vercel secrets for the authenticated user or team. By default it returns 20 secrets. The rest can be retrieved using the pagination options. The body will contain an entry for each secret.
name, teamId, data__name, data__valueAllows to create a new secret.
idOrName, teamIdThis deletes the user or team’s secret defined in the URL.
teamIdid, projectIdRetrieves the active Vercel secrets for the authenticated user or team. By default it returns 20 secrets. The rest can be retrieved using the pagination options. The body will contain an entry for each secret.
name, teamId, nameEnables to edit the name of a secret. The name has to be unique to the user or team’s secrets.
- -## Parameters - -Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDatatypeDescription
stringThe name or the unique identifier to which the secret belongs to.
stringThe name of the secret.
stringThe Team identifier or slug to perform the request on behalf of.
stringWhether to try to decrypt the value of the secret. Only works if `decryptable` has been set to `true` when the secret was created.
stringFilter out secrets based on comma separated secret ids.
stringFilter out secrets that belong to a project.
- -## `SELECT` examples - - - - -Retrieves the information for a specific secret by passing either the secret id or name in the URL. - -```sql -SELECT -name, -created, -createdAt, -decryptable, -projectId, -teamId, -uid, -userId, -value -FROM vercel.secrets.secrets -WHERE idOrName = '{{ idOrName }}' -- required -AND teamId = '{{ teamId }}' -- required -AND decrypt = '{{ decrypt }}' -; -``` - - - -Retrieves the active Vercel secrets for the authenticated user or team. By default it returns 20 secrets. The rest can be retrieved using the pagination options. The body will contain an entry for each secret. - -```sql -SELECT -name, -created, -createdAt, -decryptable, -projectId, -teamId, -uid, -userId, -value -FROM vercel.secrets.secrets -WHERE teamId = '{{ teamId }}' -- required -AND id = '{{ id }}' -AND projectId = '{{ projectId }}' -; -``` - - - - -## `INSERT` examples - - - - -Allows to create a new secret. - -```sql -INSERT INTO vercel.secrets.secrets ( -data__name, -data__value, -data__decryptable, -data__projectId, -name, -teamId -) -SELECT -'{{ name }}' /* required */, -'{{ value }}' /* required */, -{{ decryptable }}, -'{{ projectId }}', -'{{ name }}', -'{{ teamId }}' -RETURNING -name, -created, -createdAt, -decryptable, -projectId, -teamId, -uid, -userId, -value -; -``` - - - -```yaml -# Description fields are for documentation purposes -- name: secrets - props: - - name: name - value: string - description: Required parameter for the secrets resource. - - name: teamId - value: string - description: Required parameter for the secrets resource. - - name: name - value: string - description: | - The name of the secret (max 100 characters). - - name: value - value: string - description: | - The value of the new secret. - - name: decryptable - value: boolean - description: | - Whether the secret value can be decrypted after it has been created. - - name: projectId - value: string - description: | - Associate a secret to a project. -``` - - - - -## `DELETE` examples - - - - -This deletes the user or team’s secret defined in the URL. - -```sql -DELETE FROM vercel.secrets.secrets -WHERE idOrName = '{{ idOrName }}' --required -AND teamId = '{{ teamId }}' --required -; -``` - - - - -## Lifecycle Methods - - - - -Retrieves the active Vercel secrets for the authenticated user or team. By default it returns 20 secrets. The rest can be retrieved using the pagination options. The body will contain an entry for each secret. - -```sql -EXEC vercel.secrets.secrets._get_secrets -@teamId='{{ teamId }}' --required, -@id='{{ id }}', -@projectId='{{ projectId }}' -; -``` - - - -Enables to edit the name of a secret. The name has to be unique to the user or team’s secrets. - -```sql -EXEC vercel.secrets.secrets.rename_secret -@name='{{ name }}' --required, -@teamId='{{ teamId }}' --required -@@json= -'{ -"name": "{{ name }}" -}' -; -``` - - diff --git a/website/docs/services/security/attack_challenge_mode/index.md b/website/docs/services/security/attack_challenge_mode/index.md new file mode 100644 index 0000000..52d0c47 --- /dev/null +++ b/website/docs/services/security/attack_challenge_mode/index.md @@ -0,0 +1,118 @@ +--- +title: attack_challenge_mode +hide_title: false +hide_table_of_contents: false +keywords: + - attack_challenge_mode + - security + - vercel + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists an attack_challenge_mode resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + +`SELECT` not supported for this resource, use `SHOW METHODS` to view available operations for the resource. + + +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
project_id, attack_mode_enabled, attack_mode_active_untilteam_id, slugUpdate the setting for determining if the project has Attack Challenge mode enabled.
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringThe Team slug to perform the request on behalf of.
stringThe Team identifier to perform the request on behalf of. (wire: teamId)
+ +## `UPDATE` examples + + + + +Update the setting for determining if the project has Attack Challenge mode enabled. + +```sql +UPDATE vercel.security.attack_challenge_mode +SET +project_id = '{{ project_id }}', +attack_mode_enabled = {{ attack_mode_enabled }}, +attack_mode_active_until = {{ attack_mode_active_until }} +WHERE +project_id = '{{ project_id }}' --required +AND attack_mode_enabled = {{ attack_mode_enabled }} --required +AND attack_mode_active_until = '{{ attack_mode_active_until }}' --required +AND team_id = '{{ team_id}}' +AND slug = '{{ slug}}' +RETURNING +attack_mode_enabled, +attack_mode_updated_at; +``` + + diff --git a/website/docs/services/security/attack_status/index.md b/website/docs/services/security/attack_status/index.md new file mode 100644 index 0000000..529861e --- /dev/null +++ b/website/docs/services/security/attack_status/index.md @@ -0,0 +1,182 @@ +--- +title: attack_status +hide_title: false +hide_table_of_contents: false +keywords: + - attack_status + - security + - vercel + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists an attack_status resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string (wire: ownerId)
string (wire: projectId)
object (wire: affectedHostMap)
number (wire: atMinute)
number (wire: endTime)
number (wire: startTime)
string
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
project_idsince, team_id, slugRetrieve active attack data within the last N days (default: 1 day)
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string (wire: projectId)
number
stringThe Team slug to perform the request on behalf of.
stringThe Team identifier to perform the request on behalf of. (wire: teamId)
+ +## `SELECT` examples + + + + +Retrieve active attack data within the last N days (default: 1 day) + +```sql +SELECT +owner_id, +project_id, +affected_host_map, +at_minute, +end_time, +start_time, +state +FROM vercel.security.attack_status +WHERE project_id = '{{ project_id }}' -- required +AND since = '{{ since }}' +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + diff --git a/website/docs/services/security/firewall_bypass/index.md b/website/docs/services/security/firewall_bypass/index.md new file mode 100644 index 0000000..e80579c --- /dev/null +++ b/website/docs/services/security/firewall_bypass/index.md @@ -0,0 +1,365 @@ +--- +title: firewall_bypass +hide_title: false +hide_table_of_contents: false +keywords: + - firewall_bypass + - security + - vercel + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a firewall_bypass resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string (wire: Id)
string (wire: ActorId)
string (wire: OwnerId)
string (wire: ProjectId)
string (block, bypass) (wire: Action)
string (wire: CreatedAt)
string (wire: DeletedAt)
string (wire: Domain)
number (wire: ExpiresAt)
string (wire: Ip)
boolean (false, true) (wire: IsProjectRule)
string (wire: Note)
string (wire: UpdatedAt)
string (wire: UpdatedAtHour)
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
project_idlimit, source_ip, domain, project_scope, offset, team_id, slugRetrieve the system bypass rules configured for the specified project
project_id, domain, project_scopeteam_id, slugCreate new system bypass rules
project_idteam_id, slugRemove system bypass rules
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string (wire: projectId)
stringFilter by domain
number
stringUsed for pagination. Retrieves results after the provided id
booleanFilter by project scoped rules (wire: projectScope)
stringThe Team slug to perform the request on behalf of.
stringFilter by source IP (wire: sourceIp)
stringThe Team identifier to perform the request on behalf of. (wire: teamId)
+ +## `SELECT` examples + + + + +Retrieve the system bypass rules configured for the specified project + +```sql +SELECT +id, +actor_id, +owner_id, +project_id, +action, +created_at, +deleted_at, +domain, +expires_at, +ip, +is_project_rule, +note, +updated_at, +updated_at_hour +FROM vercel.security.firewall_bypass +WHERE project_id = '{{ project_id }}' -- required +AND limit = '{{ limit }}' +AND source_ip = '{{ source_ip }}' +AND domain = '{{ domain }}' +AND project_scope = '{{ project_scope }}' +AND offset = '{{ offset }}' +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + + + +## `INSERT` examples + + + + +Create new system bypass rules + +```sql +INSERT INTO vercel.security.firewall_bypass ( +domain, +project_scope, +source_ip, +all_sources, +ttl, +note, +project_id, +team_id, +slug +) +SELECT +'{{ domain }}' /* required */, +{{ project_scope }} /* required */, +'{{ source_ip }}', +{{ all_sources }}, +{{ ttl }}, +'{{ note }}', +'{{ project_id }}', +'{{ team_id }}', +'{{ slug }}' +RETURNING +ok, +pagination, +result +; +``` + + + +{`# Description fields are for documentation purposes +- name: firewall_bypass + props: + - name: project_id + value: "{{ project_id }}" + description: Required parameter for the firewall_bypass resource. + - name: domain + value: "{{ domain }}" + - name: project_scope + value: {{ project_scope }} + description: | + If the specified bypass will apply to all domains for a project. + - name: source_ip + value: "{{ source_ip }}" + - name: all_sources + value: {{ all_sources }} + - name: ttl + value: {{ ttl }} + description: | + Time to live in milliseconds + - name: note + value: "{{ note }}" + - name: team_id + value: "{{ team_id }}" + description: The Team identifier to perform the request on behalf of. + description: The Team identifier to perform the request on behalf of. + - name: slug + value: "{{ slug }}" + description: The Team slug to perform the request on behalf of. + description: The Team slug to perform the request on behalf of. +`} + + + + + +## `DELETE` examples + + + + +Remove system bypass rules + +```sql +DELETE FROM vercel.security.firewall_bypass +WHERE project_id = '{{ project_id }}' --required +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + diff --git a/website/docs/services/security/firewall_config/index.md b/website/docs/services/security/firewall_config/index.md new file mode 100644 index 0000000..6f5f484 --- /dev/null +++ b/website/docs/services/security/firewall_config/index.md @@ -0,0 +1,270 @@ +--- +title: firewall_config +hide_title: false +hide_table_of_contents: false +keywords: + - firewall_config + - security + - vercel + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a firewall_config resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
object
object
array
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
Lists WAF configs for a project
project_id, action, value, idteam_id, slugProcess updates to modify the existing firewall config for a project
project_id, firewall_enabledteam_id, slugSet the firewall configuration to provided rules and settings. Creates or overwrite the existing firewall configuration.
projectId, teamId, slugGenerate a firewall rule from a natural language description.
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string (wire: projectId)
string
stringThe Team slug to perform the request on behalf of.
stringThe Team identifier to perform the request on behalf of.
stringThe Team identifier to perform the request on behalf of. (wire: teamId)
+ +## `SELECT` examples + + + + +Lists WAF configs for a project + +```sql +SELECT +active, +draft, +versions +FROM vercel.security.firewall_config +; +``` + + + + +## `UPDATE` examples + + + + +Process updates to modify the existing firewall config for a project + +```sql +UPDATE vercel.security.firewall_config +SET +action = '{{ action }}', +id = '{{ id }}', +value = '{{ value }}' +WHERE +project_id = '{{ project_id }}' --required +AND action = '{{ action }}' --required +AND value = '{{ value }}' --required +AND id = '{{ id }}' --required +AND team_id = '{{ team_id}}' +AND slug = '{{ slug}}'; +``` + + + + +## `REPLACE` examples + + + + +Set the firewall configuration to provided rules and settings. Creates or overwrite the existing firewall configuration. + +```sql +REPLACE vercel.security.firewall_config +SET +firewall_enabled = {{ firewall_enabled }}, +managed_rules = '{{ managed_rules }}', +crs = '{{ crs }}', +rules = '{{ rules }}', +rulesets = '{{ rulesets }}', +ips = '{{ ips }}', +bot_id_enabled = {{ bot_id_enabled }}, +log_headers = '{{ log_headers }}' +WHERE +project_id = '{{ project_id }}' --required +AND firewall_enabled = {{ firewall_enabled }} --required +AND team_id = '{{ team_id}}' +AND slug = '{{ slug}}' +RETURNING +active; +``` + + + + +## Lifecycle Methods + +EXEC variables use wire (API) names. + + + + +Generate a firewall rule from a natural language description. + +```sql +EXEC vercel.security.firewall_config.generate_rule +@projectId='{{ projectId }}', +@teamId='{{ teamId }}', +@slug='{{ slug }}' +; +``` + + diff --git a/website/docs/services/security/firewall_config_versions/index.md b/website/docs/services/security/firewall_config_versions/index.md new file mode 100644 index 0000000..820d7d9 --- /dev/null +++ b/website/docs/services/security/firewall_config_versions/index.md @@ -0,0 +1,290 @@ +--- +title: firewall_config_versions +hide_title: false +hide_table_of_contents: false +keywords: + - firewall_config_versions + - security + - vercel + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a firewall_config_versions resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + +If the firewall configuration includes a [custom managed ruleset](https://vercel.com/docs/security/vercel-waf/managed-rulesets), it will include a `crs` item that has the following values: sd: Scanner Detection ma: Multipart Attack lfi: Local File Inclusion Attack rfi: Remote File Inclusion Attack rce: Remote Execution Attack php: PHP Attack gen: Generic Attack xss: XSS Attack sqli: SQL Injection Attack sf: Session Fixation Attack java: Java Attack + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string
string (wire: ownerId)
boolean (false, true) (wire: botIdEnabled)
array
array
objectCustom Ruleset
boolean (false, true) (wire: firewallEnabled)
array
array (*) (wire: logHeaders)
object (wire: managedRules)
string (wire: projectKey)
array
array
string (wire: updatedAt)
number
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
project_id, config_versionteam_id, slugRetrieve the specified firewall configuration for a project. The deployed configVersion will be `active`
config_versionPromotes a draft WAF config to an active config
config_versionPromotes a draft WAF config to an active config
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringThe deployed configVersion for the firewall configuration
string (wire: projectId)
stringThe Team slug to perform the request on behalf of.
stringThe Team identifier to perform the request on behalf of. (wire: teamId)
+ +## `SELECT` examples + + + + +Retrieve the specified firewall configuration for a project. The deployed configVersion will be `active` + +```sql +SELECT +id, +owner_id, +bot_id_enabled, +changes, +conditions, +crs, +firewall_enabled, +ips, +log_headers, +managed_rules, +project_key, +rules, +rulesets, +updated_at, +version +FROM vercel.security.firewall_config_versions +WHERE project_id = '{{ project_id }}' -- required +AND config_version = '{{ config_version }}' -- required +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + + + +## `DELETE` examples + + + + +Promotes a draft WAF config to an active config + +```sql +DELETE FROM vercel.security.firewall_config_versions +WHERE config_version = '{{ config_version }}' --required +; +``` + + + + +## Lifecycle Methods + +EXEC variables use wire (API) names. + + + + +Promotes a draft WAF config to an active config + +```sql +EXEC vercel.security.firewall_config_versions.activate +@config_version='{{ config_version }}' --required +; +``` + + diff --git a/website/docs/services/security/firewall_events/index.md b/website/docs/services/security/firewall_events/index.md new file mode 100644 index 0000000..7700bb7 --- /dev/null +++ b/website/docs/services/security/firewall_events/index.md @@ -0,0 +1,158 @@ +--- +title: firewall_events +hide_title: false +hide_table_of_contents: false +keywords: + - firewall_events + - security + - vercel + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a firewall_events resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
array
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
project_idstart_timestamp, end_timestamp, hosts, team_id, slugRetrieve firewall actions for a project Rule names are resolved against the project's *current* active firewall configuration and the team's active rulesets, so a rule that has since been renamed reports its new name and one that has been deleted reports `null`. System rules such as `sys_dos_mitigation` and `ip_blocking` have no configured name and always report `null`.
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string (wire: projectId)
number (wire: endTimestamp)
string
stringThe Team slug to perform the request on behalf of.
number (wire: startTimestamp)
stringThe Team identifier to perform the request on behalf of. (wire: teamId)
+ +## `SELECT` examples + + + + +Retrieve firewall actions for a project Rule names are resolved against the project's *current* active firewall configuration and the team's active rulesets, so a rule that has since been renamed reports its new name and one that has been deleted reports `null`. System rules such as `sys_dos_mitigation` and `ip_blocking` have no configured name and always report `null`. + +```sql +SELECT +actions +FROM vercel.security.firewall_events +WHERE project_id = '{{ project_id }}' -- required +AND start_timestamp = '{{ start_timestamp }}' +AND end_timestamp = '{{ end_timestamp }}' +AND hosts = '{{ hosts }}' +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + diff --git a/website/docs/services/security/index.md b/website/docs/services/security/index.md new file mode 100644 index 0000000..803f7c6 --- /dev/null +++ b/website/docs/services/security/index.md @@ -0,0 +1,37 @@ +--- +title: security +hide_title: false +hide_table_of_contents: false +keywords: + - security + - vercel + - stackql + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +security service documentation. + +:::info[Service Summary] + +total resources: __6__ + +::: + +## Resources + \ No newline at end of file diff --git a/website/docs/services/billing_settings/index.md b/website/docs/services/storage/index.md similarity index 76% rename from website/docs/services/billing_settings/index.md rename to website/docs/services/storage/index.md index 56516d0..5c05f3c 100644 --- a/website/docs/services/billing_settings/index.md +++ b/website/docs/services/storage/index.md @@ -1,9 +1,9 @@ --- -title: billing_settings +title: storage hide_title: false hide_table_of_contents: false keywords: - - billing_settings + - storage - vercel - stackql - infrastructure-as-code @@ -14,7 +14,7 @@ custom_edit_url: null image: /img/stackql-vercel-provider-featured-image.png --- -billing_settings service documentation. +storage service documentation. :::info[Service Summary] @@ -25,7 +25,7 @@ total resources: __1__ ## Resources
diff --git a/website/docs/services/storage/stores/index.md b/website/docs/services/storage/stores/index.md new file mode 100644 index 0000000..f85bfc5 --- /dev/null +++ b/website/docs/services/storage/stores/index.md @@ -0,0 +1,251 @@ +--- +title: stores +hide_title: false +hide_table_of_contents: false +keywords: + - stores + - storage + - vercel + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a stores resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
object (wire: projectFilter)
array (wire: projectsMetadata)
string (available, error, initializing, limits-exceeded-suspended, limits-exceeded-suspended-store-count, onboarding, suspended, uninstalled, )
number (wire: totalConnectedProjects)
boolean (false, true) (wire: usageQuotaExceeded)
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
idskip-metadata, include-guides
name
id
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string
boolean
boolean
+ +## `SELECT` examples + + + + +No description available. + +```sql +SELECT +project_filter, +projects_metadata, +status, +total_connected_projects, +usage_quota_exceeded +FROM vercel.storage.stores +WHERE id = '{{ id }}' -- required +AND skip-metadata = '{{ skip-metadata }}' +AND include-guides = '{{ include-guides }}' +; +``` + + + + +## `INSERT` examples + + + + +No description available. + +```sql +INSERT INTO vercel.storage.stores ( +name, +region, +access, +project_id +) +SELECT +'{{ name }}' /* required */, +'{{ region }}', +'{{ access }}', +'{{ project_id }}' +RETURNING +store +; +``` + + + +{`# Description fields are for documentation purposes +- name: stores + props: + - name: name + value: "{{ name }}" + - name: region + value: "{{ region }}" + valid_values: ['arn1', 'bom1', 'cdg1', 'cle1', 'cpt1', 'dub1', 'dxb1', 'fra1', 'gru1', 'hkg1', 'hnd1', 'iad1', 'icn1', 'kix1', 'lhr1', 'pdx1', 'sfo1', 'sin1', 'syd1', 'yul1'] + - name: access + value: "{{ access }}" + valid_values: ['public', 'private'] + default: public + - name: project_id + value: "{{ project_id }}" +`} + + + + + +## `DELETE` examples + + + + +No description available. + +```sql +DELETE FROM vercel.storage.stores +WHERE id = '{{ id }}' --required +; +``` + + diff --git a/website/docs/services/teams/request/index.md b/website/docs/services/teams/access_requests/index.md similarity index 53% rename from website/docs/services/teams/request/index.md rename to website/docs/services/teams/access_requests/index.md index c981010..fd8c855 100644 --- a/website/docs/services/teams/request/index.md +++ b/website/docs/services/teams/access_requests/index.md @@ -1,9 +1,9 @@ --- -title: request +title: access_requests hide_title: false hide_table_of_contents: false keywords: - - request + - access_requests - teams - vercel - infrastructure-as-code @@ -15,16 +15,17 @@ image: /img/stackql-vercel-provider-featured-image.png --- import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; -Creates, updates, deletes, gets or lists a request resource. +Creates, updates, deletes, gets or lists an access_requests resource. ## Overview - + - +
Namerequest
Name
TypeResource
Id
Id
## Fields @@ -32,12 +33,12 @@ Creates, updates, deletes, gets or lists a request resource. The following fields are returned by `SELECT` queries: - + Successfully @@ -51,9 +52,14 @@ Successfully - + + string + The name of the team. (example: My Team) (wire: teamName) + + + number - Timestamp in milliseconds when the user requested access to the team. + Timestamp in milliseconds when the user requested access to the team. (wire: accessRequestedAt) @@ -63,7 +69,7 @@ Successfully boolean - Current status of the membership. Will be `true` if confirmed, if pending it'll be `false`. + Current status of the membership. Will be `true` if confirmed, if pending it'll be `false`. (false, true) @@ -76,19 +82,14 @@ Successfully Map of the connected GitLab account. - + object - A map that describes the origin from where the user joined. + A map that describes the origin from where the user joined. (wire: joinedFrom) - + string - The name of the team. (example: My Team) - - - - string - The slug of the team. (example: my-team) + The slug of the team. (example: my-team) (wire: teamSlug) @@ -111,18 +112,18 @@ The following methods are available for this resource: - + - teamId, userId + user_id, team_id Check the status of a join request. It'll respond with a 404 if the request has been declined. If no `userId` path segment was provided, this endpoint will instead return the status of the authenticated user. - - - teamId, joinedFrom + + + team_id, joined_from - Request access to a team as a member. An owner has to approve the request. Only 10 users can request access to a team at the same time. + Request access to a team as a member. An owner has to approve the request. Only 100 users can request access to a team at the same time. @@ -140,15 +141,15 @@ Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](# - - + + string - ID of the Team. + - - + + string - User ID. + @@ -156,54 +157,84 @@ Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](# ## `SELECT` examples - + Check the status of a join request. It'll respond with a 404 if the request has been declined. If no `userId` path segment was provided, this endpoint will instead return the status of the authenticated user. ```sql SELECT -accessRequestedAt, +team_name, +access_requested_at, bitbucket, confirmed, github, gitlab, -joinedFrom, -teamName, -teamSlug -FROM vercel.teams.request -WHERE teamId = '{{ teamId }}' -- required -AND userId = '{{ userId }}' -- required +joined_from, +team_slug +FROM vercel.teams.access_requests +WHERE user_id = '{{ user_id }}' -- required +AND team_id = '{{ team_id }}' -- required ; ``` -## Lifecycle Methods +## `INSERT` examples - + -Request access to a team as a member. An owner has to approve the request. Only 10 users can request access to a team at the same time. +Request access to a team as a member. An owner has to approve the request. Only 100 users can request access to a team at the same time. ```sql -EXEC vercel.teams.request.request_access_to_team -@teamId='{{ teamId }}' --required -@@json= -'{ -"joinedFrom": "{{ joinedFrom }}" -}' +INSERT INTO vercel.teams.access_requests ( +joined_from, +team_id +) +SELECT +'{{ joined_from }}' /* required */, +'{{ team_id }}' +RETURNING +team_name, +access_requested_at, +bitbucket, +confirmed, +github, +gitlab, +joined_from, +team_slug ; ``` + + + +{`# Description fields are for documentation purposes +- name: access_requests + props: + - name: team_id + value: "{{ team_id }}" + description: Required parameter for the access_requests resource. + - name: joined_from + value: + origin: "{{ origin }}" + commitId: "{{ commitId }}" + repoId: "{{ repoId }}" + repoPath: "{{ repoPath }}" + gitUserId: "{{ gitUserId }}" + gitUserLogin: "{{ gitUserLogin }}" +`} + diff --git a/website/docs/services/teams/index.md b/website/docs/services/teams/index.md index 75e40d3..a559a93 100644 --- a/website/docs/services/teams/index.md +++ b/website/docs/services/teams/index.md @@ -25,11 +25,11 @@ total resources: __4__ ## Resources \ No newline at end of file diff --git a/website/docs/services/teams/members/index.md b/website/docs/services/teams/members/index.md index 1b2e240..2d37344 100644 --- a/website/docs/services/teams/members/index.md +++ b/website/docs/services/teams/members/index.md @@ -15,6 +15,7 @@ image: /img/stackql-vercel-provider-featured-image.png --- import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; @@ -22,7 +23,7 @@ Creates, updates, deletes, gets or lists a members resource. ## Overview - +
Namemembers
Name
TypeResource
Id
@@ -32,12 +33,12 @@ Creates, updates, deletes, gets or lists a members resource. The following fields are returned by `SELECT` queries: - + @@ -54,9 +55,9 @@ The following fields are returned by `SELECT` queries: - + - + @@ -71,12 +72,12 @@ The following fields are returned by `SELECT` queries: - + - + - + @@ -94,9 +95,14 @@ The following fields are returned by `SELECT` queries: - + + + + + + - + @@ -106,7 +112,7 @@ The following fields are returned by `SELECT` queries: - + @@ -139,39 +145,46 @@ The following methods are available for this resource: - + - - + + - - - - - + + + + + - - - - - + + + + + - - - + + + + + + + + + + - + - + - + - +
The name of this user. (example: Jane Doe)
numberTimestamp in milliseconds for when this team member was accepted by an owner.Timestamp in milliseconds for when this team member was accepted by an owner. (wire: accessRequestedAt)
booleanBoolean that indicates if this member was confirmed by an owner.Boolean that indicates if this member was confirmed by an owner. (false, true)
numberTimestamp in milliseconds when this member was added.Timestamp in milliseconds when this member was added. (wire: createdAt)
Information about the GitLab account of this user.
booleanIndicates whether the user is managed by an enterprise. (false, true) (wire: isEnterpriseManaged)
objectMap with information about the members origin if they joined by requesting access.Map with information about the members origin if they joined by requesting access. (wire: joinedFrom)
stringRole of this user in the team. (example: OWNER)Role of this user in the team. (BILLING, CONTRIBUTOR, DEVELOPER, MEMBER, OWNER, SECURITY, VIEWER, VIEWER_FOR_PLUS) (example: OWNER)
teamIdlimit, since, until, search, role, excludeProject, eligibleMembersForProjectIdteam_idlimit, since, until, search, role, exclude_project, eligible_members_for_project_id, slug Get a paginated list of team members for the provided team.
teamId, uidnewDefaultTeamIdRemove a Team Member from the Team, or dismiss a user that requested access, or leave a team.team_idslugInvite a user to join the team specified in the URL. The authenticated user needs to be an `OWNER` in order to successfully invoke this endpoint. The user to be invited must be specified by email.
teamIdlimit, since, until, search, role, excludeProject, eligibleMembersForProjectIdGet a paginated list of team members for the provided team.uid, team_idUpdate the membership of a Team Member on the Team specified by `teamId`, such as changing the _role_ of the member, or confirming a request to join the Team for an unconfirmed member. The authenticated user must be an `OWNER` of the Team.
teamIduid, team_idnew_default_team_idRemove a Team Member from the Team, or dismiss a user that requested access, or leave a team. Directory Sync members can be removed when their directory email is absent or does not match the user's primary or verified secondary emails.
invite_id, team_id Invite a user to join the team specified in the URL. The authenticated user needs to be an `OWNER` in order to successfully invoke this endpoint. The user can be specified with an email or an ID. If both email and ID are provided, ID will take priority.Delete an active Team invite code.
teamId, uidteam_id Update the membership of a Team Member on the Team specified by `teamId`, such as changing the _role_ of the member, or confirming a request to join the Team for an unconfirmed member. The authenticated user must be an `OWNER` of the Team.Join a team with a provided invite code or team ID.
@@ -189,35 +202,40 @@ Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](# - - + + string - ID of the Team. + The Team invite code ID. + + + + string + string - The ID of the member. + The user ID of the member. - - + + string - Include team members who are eligible to be members of the specified project. + Include team members who are eligible to be members of the specified project. (wire: eligibleMembersForProjectId) - - + + string - Exclude members who belong to the specified project. + Exclude members who belong to the specified project. (wire: excludeProject) number Limit how many teams should be returned - - + + string - The ID of the team to set as the new default team for the Northstar user. + The ID of the team to set as the new default team for the Northstar user. (wire: newDefaultTeamId) @@ -234,6 +252,11 @@ Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](# number Timestamp in milliseconds to only include members added since then. + + + string + The Team slug to perform the request on behalf of. + number @@ -245,127 +268,182 @@ Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](# ## `SELECT` examples - + Get a paginated list of team members for the provided team. ```sql SELECT name, -accessRequestedAt, +access_requested_at, avatar, bitbucket, confirmed, -createdAt, +created_at, email, github, gitlab, -joinedFrom, +is_enterprise_managed, +joined_from, projects, role, uid, username FROM vercel.teams.members -WHERE teamId = '{{ teamId }}' -- required +WHERE team_id = '{{ team_id }}' -- required AND limit = '{{ limit }}' AND since = '{{ since }}' AND until = '{{ until }}' AND search = '{{ search }}' AND role = '{{ role }}' -AND excludeProject = '{{ excludeProject }}' -AND eligibleMembersForProjectId = '{{ eligibleMembersForProjectId }}' +AND exclude_project = '{{ exclude_project }}' +AND eligible_members_for_project_id = '{{ eligible_members_for_project_id }}' +AND slug = '{{ slug }}' ; ``` -## `DELETE` examples +## `INSERT` examples - + -Remove a Team Member from the Team, or dismiss a user that requested access, or leave a team. +Invite a user to join the team specified in the URL. The authenticated user needs to be an `OWNER` in order to successfully invoke this endpoint. The user to be invited must be specified by email. ```sql -DELETE FROM vercel.teams.members -WHERE teamId = '{{ teamId }}' --required -AND uid = '{{ uid }}' --required -AND newDefaultTeamId = '{{ newDefaultTeamId }}' +INSERT INTO vercel.teams.members ( +team_id, +slug +) +SELECT +'{{ team_id }}', +'{{ slug }}' +RETURNING +email, +role, +team_permissions, +team_roles, +uid, +username ; ``` + + + +{`# Description fields are for documentation purposes +- name: members + props: + - name: team_id + value: "{{ team_id }}" + description: Required parameter for the members resource. + - name: slug + value: "{{ slug }}" + description: The Team slug to perform the request on behalf of. + description: The Team slug to perform the request on behalf of. +`} + -## Lifecycle Methods +## `UPDATE` examples - + -Get a paginated list of team members for the provided team. +Update the membership of a Team Member on the Team specified by `teamId`, such as changing the _role_ of the member, or confirming a request to join the Team for an unconfirmed member. The authenticated user must be an `OWNER` of the Team. ```sql -EXEC vercel.teams.members._get_team_members -@teamId='{{ teamId }}' --required, -@limit='{{ limit }}', -@since='{{ since }}', -@until='{{ until }}', -@search='{{ search }}', -@role='{{ role }}', -@excludeProject='{{ excludeProject }}', -@eligibleMembersForProjectId='{{ eligibleMembersForProjectId }}' +UPDATE vercel.teams.members +SET +confirmed = {{ confirmed }}, +role = '{{ role }}', +team_permissions = '{{ team_permissions }}', +projects = '{{ projects }}', +joined_from = '{{ joined_from }}' +WHERE +uid = '{{ uid }}' --required +AND team_id = '{{ team_id }}' --required +RETURNING +id; +``` + + + + +## `DELETE` examples + + + + +Remove a Team Member from the Team, or dismiss a user that requested access, or leave a team. Directory Sync members can be removed when their directory email is absent or does not match the user's primary or verified secondary emails. + +```sql +DELETE FROM vercel.teams.members +WHERE uid = '{{ uid }}' --required +AND team_id = '{{ team_id }}' --required +AND new_default_team_id = '{{ new_default_team_id }}' ; ``` - + -Invite a user to join the team specified in the URL. The authenticated user needs to be an `OWNER` in order to successfully invoke this endpoint. The user can be specified with an email or an ID. If both email and ID are provided, ID will take priority. +Delete an active Team invite code. ```sql -EXEC vercel.teams.members.invite_user_to_team -@teamId='{{ teamId }}' --required -@@json= -'{ -"uid": "{{ uid }}", -"email": "{{ email }}", -"role": "{{ role }}", -"projects": "{{ projects }}" -}' +DELETE FROM vercel.teams.members +WHERE invite_id = '{{ invite_id }}' --required +AND team_id = '{{ team_id }}' --required ; ``` - + -Update the membership of a Team Member on the Team specified by `teamId`, such as changing the _role_ of the member, or confirming a request to join the Team for an unconfirmed member. The authenticated user must be an `OWNER` of the Team. + +## Lifecycle Methods + +EXEC variables use wire (API) names. + + + + +Join a team with a provided invite code or team ID. ```sql -EXEC vercel.teams.members.update_team_member -@teamId='{{ teamId }}' --required, -@uid='{{ uid }}' --required +EXEC vercel.teams.members.join +@team_id='{{ team_id }}' --required @@json= '{ -"confirmed": {{ confirmed }}, -"role": "{{ role }}", -"projects": "{{ projects }}", -"joinedFrom": "{{ joinedFrom }}" +"inviteCode": "{{ inviteCode }}" }' ; ``` diff --git a/website/docs/services/teams/microfrontend_groups/index.md b/website/docs/services/teams/microfrontend_groups/index.md new file mode 100644 index 0000000..a3cf6ff --- /dev/null +++ b/website/docs/services/teams/microfrontend_groups/index.md @@ -0,0 +1,150 @@ +--- +title: microfrontend_groups +hide_title: false +hide_table_of_contents: false +keywords: + - microfrontend_groups + - teams + - vercel + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a microfrontend_groups resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + +`SELECT` not supported for this resource, use `SHOW METHODS` to view available operations for the resource. + + +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
group_id, team_idslugUpdates a microfrontends group's settings.
group_id, team_idslugDeletes a microfrontends group from the team associated with the group ID.
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringThe microfrontend group ID to delete.
stringThe Team identifier to perform the request on behalf of.
stringThe Team slug to perform the request on behalf of.
+ +## `UPDATE` examples + + + + +Updates a microfrontends group's settings. + +```sql +UPDATE vercel.teams.microfrontend_groups +SET +name = '{{ name }}', +fallback_environment = '{{ fallback_environment }}', +enable_polyrepo_branch_routing = {{ enable_polyrepo_branch_routing }} +WHERE +group_id = '{{ group_id }}' --required +AND team_id = '{{ team_id }}' --required +AND slug = '{{ slug}}' +RETURNING +updated_microfrontends_group; +``` + + + + +## `DELETE` examples + + + + +Deletes a microfrontends group from the team associated with the group ID. + +```sql +DELETE FROM vercel.teams.microfrontend_groups +WHERE group_id = '{{ group_id }}' --required +AND team_id = '{{ team_id }}' --required +AND slug = '{{ slug }}' +; +``` + + diff --git a/website/docs/services/teams/teams/index.md b/website/docs/services/teams/teams/index.md index 4a4d454..c887a53 100644 --- a/website/docs/services/teams/teams/index.md +++ b/website/docs/services/teams/teams/index.md @@ -15,6 +15,7 @@ image: /img/stackql-vercel-provider-featured-image.png --- import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; @@ -22,7 +23,7 @@ Creates, updates, deletes, gets or lists a teams resource. ## Overview - +
Nameteams
Name
TypeResource
Id
@@ -32,13 +33,13 @@ Creates, updates, deletes, gets or lists a teams resource. The following fields are returned by `SELECT` queries: - + The requested team @@ -61,20 +62,235 @@ The requested team string Name associated with the Team account, or `null` if none has been provided. (example: My Team) + + + string + The ID of the user who created the Team. (example: R6efeCJQ2HKXywuasPDc0fOWB) (wire: creatorId) + + + + string + Best-effort ID of the organization’s root billing team. When present, compare `orgRootTeamId === id` to identify the root team. It may be omitted even when `parentId` is set if organization resolution fails or the referenced organization is missing. Always omitted for non-organization teams. (example: team_nllPyCtREAqxxdyFKbbMDlxd) (wire: orgRootTeamId) + + + + string + The organizationId for teams that belong to an organization (set on both the organization's root team and its child teams). (example: org_nllPyCtREAqxxdyFKbbMDlxd) (wire: parentId) + + + + number + Timestamp (ms) after which API keys created at or before this time are considered invalid for this team. (wire: apiKeysInvalidatedAt) + + + + number + Timestamp (ms) after which Vercel App tokens created at or before this time are considered invalid for this team. (wire: appTokensInvalidatedAt) + string The ID of the file used as avatar for this Team. (example: 6eb07268bcfadd309905ffb1579354084c24655c) + + + object + The team's billing plan. + + + + object + + + + + number + UNIX timestamp (in milliseconds) when the Team was created. (wire: createdAt) + + + + object + Default deployment protection for this team null indicates protection is disabled (wire: defaultDeploymentProtection) + + + + object + Default deployment expiration settings for this team (wire: defaultExpirationSettings) + + + + object + Default Passport configuration for new projects in this team. (wire: defaultPassport) + + + + object + Default job configuration applied to new projects created in this team. (wire: defaultProjectJobs) + + + + object + Default roles for the team. (wire: defaultRoles) + + + + object + Composable deployment-time policy for the team. Used as the default for every project on the team, with optional per-project overrides on `project.deploymentPolicy`. (wire: deploymentPolicy) + + + + string + A short description of the Team. (example: Our mission is to make cloud computing accessible to everyone.) + + + + number + (false, true) (wire: disableHardAutoBlocks) + + + + boolean + Default for projects in the team. When `true`, projects in this team will not emit GitHub repository-dispatch events on deployment events unless the project explicitly overrides this setting via `project.gitProviderOptions.disableRepositoryDispatchEvents`. (false, true) (wire: disableRepositoryDispatchEvents) + + + + string + Require production secrets to use a different value than preview or development. (default, off, on, ) (wire: disjunctiveProductionSecretPolicy) + + + + string + Controls who can request access to protected deployments. (all, email-domain, none) (wire: dpAccessRequestsMode) + + + + string + Hostname that'll be matched with emails on sign-up to automatically join the Team. (example: example.com) (wire: emailDomain) + + + + string + Whether toolbar is enabled on preview deployments (default, default-force, off, off-force, on, on-force, ) (wire: enablePreviewFeedback) + + + + string + Whether toolbar is enabled on production deployments (default, default-force, off, off-force, on, on-force, ) (wire: enableProductionFeedback) + + + + boolean + Indicates if IP addresses should be accessible in observability (o11y) tooling (false, true, ) (wire: hideIpAddresses) + + + + boolean + Indicates if IP addresses should be accessible in log drains (false, true, ) (wire: hideIpAddressesInLogDrains) + + + + number + Timestamp (ms) after which integration tokens created at or before this time are considered invalid for this team. (wire: integrationTokensInvalidatedAt) + + + + string + Code that can be used to join this Team. Only visible to Team owners. (example: hasihf9e89) (wire: inviteCode) + + + + array + (wire: ipBuckets) + + + + object + The membership of the authenticated User in relation to the Team. + + + + object + NSNB configuration for the team. (wire: nsnbConfig) + + + + number + Timestamp (ms) after which personal access tokens created at or before this time are considered invalid for this team. (wire: personalAccessTokensInvalidatedAt) + + + + boolean + Whether the team is a platform team. (false, true) + + + + string + The hostname that is current set as preview deployment suffix. (example: example.dev) (wire: previewDeploymentSuffix) + + + + object + Is remote caching enabled for this team (wire: remoteCaching) + + + + boolean + When enabled, all projects in the team require commits to be signed and verified by the git provider before deployments will be created. Projects may override this via `project.gitProviderOptions.requireVerifiedCommits` (gated by `Project:Update`). (false, true) (wire: requireVerifiedCommits) + + + + object + (wire: resourceConfig) + + + + object + When "Single Sign-On (SAML)" is configured, this object contains information regarding the configuration of the Identity Provider (IdP). + + + + string + Sensitive environment variable policy for this team (default, off, on, ) (wire: sensitiveEnvironmentVariablePolicy) + string The Team's slug, which is unique across the Vercel platform. (example: my-team) + + + string + The prefix that is prepended to automatic aliases. (wire: stagingPrefix) + + + + object + When enabled, creating and managing connectors requires Owner role or the ConnectorManager permission. (wire: strictConnectors) + + + + object + When enabled, deployment protection settings require stricter permissions (owner-only). (wire: strictDeploymentProtectionSettings) + + + + object + When enabled, adding, changing, or removing project password protection requires Owner role. (wire: strictPasswordProtectionSettings) + + + + object + When enabled, creating shareable links requires Owner role. (wire: strictShareableLinks) + + + + number + Timestamp (in milliseconds) of when the Team was last updated. (wire: updatedAt) + - + A paginated list of teams. @@ -108,53 +324,46 @@ The following methods are available for this resource: - + - teamId + team_id slug Get information for the Team specified by the `teamId` parameter. - + limit, since, until Get a paginated list of all the Teams the authenticated User is a member of. - + - data__slug + slug Create a new Team under your account. You need to send a POST request with the desired Team slug, and optionally the Team name. - - - teamId - newDefaultTeamId - Delete a team under your account. You need to send a `DELETE` request with the desired team `id`. An optional array of reasons for deletion may also be sent. - - - - - teamId + + + team_id - Join a team with a provided invite code or team ID. + Update the information of a Team specified by the `teamId` parameter. The request body should contain the information that will be updated on the Team. - - - teamId - - Update the information of a Team specified by the `teamId` parameter. The request body should contain the information that will be updated on the Team. + + + team_id + new_default_team_id, slug + Delete a team under your account. You need to send a `DELETE` request with the desired team `id`. An optional array of reasons for deletion may also be sent. - + - - limit, since, until - Get a paginated list of all the Teams the authenticated User is a member of. + team_id, roles + slug + Update the Directory Sync role mappings for a Team. This endpoint allows updating the mapping between directory groups and team roles or access groups. @@ -172,20 +381,20 @@ Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](# - - + + string - The Team identifier or slug to perform the request on behalf of. + The Team identifier to perform the request on behalf of. number Maximum number of Teams which may be returned. - - + + string - Id of the team to be set as the new default team + Id of the team to be set as the new default team (wire: newDefaultTeamId) @@ -195,7 +404,7 @@ Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](# string - + The Team slug to perform the request on behalf of. @@ -208,13 +417,13 @@ Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](# ## `SELECT` examples - + Get information for the Team specified by the `teamId` parameter. @@ -222,15 +431,58 @@ Get information for the Team specified by the `teamId` parameter. SELECT id, name, +creator_id, +org_root_team_id, +parent_id, +api_keys_invalidated_at, +app_tokens_invalidated_at, avatar, -slug +billing, +connect, +created_at, +default_deployment_protection, +default_expiration_settings, +default_passport, +default_project_jobs, +default_roles, +deployment_policy, +description, +disable_hard_auto_blocks, +disable_repository_dispatch_events, +disjunctive_production_secret_policy, +dp_access_requests_mode, +email_domain, +enable_preview_feedback, +enable_production_feedback, +hide_ip_addresses, +hide_ip_addresses_in_log_drains, +integration_tokens_invalidated_at, +invite_code, +ip_buckets, +membership, +nsnb_config, +personal_access_tokens_invalidated_at, +platform, +preview_deployment_suffix, +remote_caching, +require_verified_commits, +resource_config, +saml, +sensitive_environment_variable_policy, +slug, +staging_prefix, +strict_connectors, +strict_deployment_protection_settings, +strict_password_protection_settings, +strict_shareable_links, +updated_at FROM vercel.teams.teams -WHERE teamId = '{{ teamId }}' -- required +WHERE team_id = '{{ team_id }}' -- required AND slug = '{{ slug }}' ; ``` - + Get a paginated list of all the Teams the authenticated User is a member of. @@ -250,133 +502,208 @@ AND until = '{{ until }}' ## `INSERT` examples - + Create a new Team under your account. You need to send a POST request with the desired Team slug, and optionally the Team name. ```sql INSERT INTO vercel.teams.teams ( -data__slug, -data__name +slug, +name, +attribution ) SELECT '{{ slug }}' /* required */, -'{{ name }}' +'{{ name }}', +'{{ attribution }}' RETURNING id, -billing, slug ; ``` -```yaml -# Description fields are for documentation purposes +{`# Description fields are for documentation purposes - name: teams props: - name: slug - value: string + value: "{{ slug }}" description: | The desired slug for the Team - name: name - value: string + value: "{{ name }}" description: | The desired name for the Team. It will be generated from the provided slug if nothing is provided -``` + - name: attribution + description: | + Attribution information for the session or current page + value: + sessionReferrer: "{{ sessionReferrer }}" + landingPage: "{{ landingPage }}" + pageBeforeConversionPage: "{{ pageBeforeConversionPage }}" + utm: + utmSource: "{{ utmSource }}" + utmMedium: "{{ utmMedium }}" + utmCampaign: "{{ utmCampaign }}" + utmTerm: "{{ utmTerm }}" +`} + -## `DELETE` examples +## `UPDATE` examples - + -Delete a team under your account. You need to send a `DELETE` request with the desired team `id`. An optional array of reasons for deletion may also be sent. +Update the information of a Team specified by the `teamId` parameter. The request body should contain the information that will be updated on the Team. ```sql -DELETE FROM vercel.teams.teams -WHERE teamId = '{{ teamId }}' --required -AND newDefaultTeamId = '{{ newDefaultTeamId }}' -; +UPDATE vercel.teams.teams +SET +avatar = '{{ avatar }}', +description = '{{ description }}', +email_domain = '{{ email_domain }}', +name = '{{ name }}', +preview_deployment_suffix = '{{ preview_deployment_suffix }}', +regenerate_invite_code = {{ regenerate_invite_code }}, +saml = '{{ saml }}', +slug = '{{ slug }}', +enable_preview_feedback = '{{ enable_preview_feedback }}', +enable_production_feedback = '{{ enable_production_feedback }}', +sensitive_environment_variable_policy = '{{ sensitive_environment_variable_policy }}', +disjunctive_production_secret_policy = '{{ disjunctive_production_secret_policy }}', +remote_caching = '{{ remote_caching }}', +hide_ip_addresses = {{ hide_ip_addresses }}, +hide_ip_addresses_in_log_drains = {{ hide_ip_addresses_in_log_drains }}, +dp_access_requests_mode = '{{ dp_access_requests_mode }}', +require_verified_commits = {{ require_verified_commits }}, +disable_repository_dispatch_events = {{ disable_repository_dispatch_events }}, +default_deployment_protection = '{{ default_deployment_protection }}', +default_passport = '{{ default_passport }}', +default_expiration_settings = '{{ default_expiration_settings }}', +deployment_policy = '{{ deployment_policy }}', +strict_deployment_protection_settings = '{{ strict_deployment_protection_settings }}', +strict_shareable_links = '{{ strict_shareable_links }}', +strict_password_protection_settings = '{{ strict_password_protection_settings }}', +strict_connectors = '{{ strict_connectors }}', +nsnb_config = '{{ nsnb_config }}', +default_project_jobs = '{{ default_project_jobs }}', +resource_config = '{{ resource_config }}' +WHERE +team_id = '{{ team_id }}' --required +RETURNING +id, +name, +creator_id, +org_root_team_id, +parent_id, +api_keys_invalidated_at, +app_tokens_invalidated_at, +avatar, +billing, +connect, +created_at, +default_deployment_protection, +default_expiration_settings, +default_passport, +default_project_jobs, +default_roles, +deployment_policy, +description, +disable_hard_auto_blocks, +disable_repository_dispatch_events, +disjunctive_production_secret_policy, +dp_access_requests_mode, +email_domain, +enable_preview_feedback, +enable_production_feedback, +hide_ip_addresses, +hide_ip_addresses_in_log_drains, +integration_tokens_invalidated_at, +invite_code, +ip_buckets, +membership, +nsnb_config, +personal_access_tokens_invalidated_at, +platform, +preview_deployment_suffix, +remote_caching, +require_verified_commits, +resource_config, +saml, +sensitive_environment_variable_policy, +slug, +staging_prefix, +strict_connectors, +strict_deployment_protection_settings, +strict_password_protection_settings, +strict_shareable_links, +updated_at; ``` -## Lifecycle Methods +## `DELETE` examples - + -Join a team with a provided invite code or team ID. +Delete a team under your account. You need to send a `DELETE` request with the desired team `id`. An optional array of reasons for deletion may also be sent. ```sql -EXEC vercel.teams.teams.join_team -@teamId='{{ teamId }}' --required -@@json= -'{ -"inviteCode": "{{ inviteCode }}", -"teamId": "{{ teamId }}" -}' +DELETE FROM vercel.teams.teams +WHERE team_id = '{{ team_id }}' --required +AND new_default_team_id = '{{ new_default_team_id }}' +AND slug = '{{ slug }}' ; ``` - + -Update the information of a Team specified by the `teamId` parameter. The request body should contain the information that will be updated on the Team. + +## Lifecycle Methods + +EXEC variables use wire (API) names. + + + + +Update the Directory Sync role mappings for a Team. This endpoint allows updating the mapping between directory groups and team roles or access groups. ```sql -EXEC vercel.teams.teams.patch_team -@teamId='{{ teamId }}' --required +EXEC vercel.teams.teams.update_dsync_roles +@team_id='{{ team_id }}' --required, +@slug='{{ slug }}' @@json= '{ -"avatar": "{{ avatar }}", -"description": "{{ description }}", -"emailDomain": "{{ emailDomain }}", -"name": "{{ name }}", -"previewDeploymentSuffix": "{{ previewDeploymentSuffix }}", -"regenerateInviteCode": {{ regenerateInviteCode }}, -"saml": "{{ saml }}", -"slug": "{{ slug }}", -"enablePreviewFeedback": "{{ enablePreviewFeedback }}", -"sensitiveEnvironmentVariablePolicy": "{{ sensitiveEnvironmentVariablePolicy }}", -"migrateExistingEnvVariablesToSensitive": {{ migrateExistingEnvVariablesToSensitive }}, -"remoteCaching": "{{ remoteCaching }}", -"hideIpAddresses": {{ hideIpAddresses }} +"roles": "{{ roles }}" }' ; ``` - - -Get a paginated list of all the Teams the authenticated User is a member of. - -```sql -EXEC vercel.teams.teams._get_teams -@limit='{{ limit }}', -@since='{{ since }}', -@until='{{ until }}' -; -``` - diff --git a/website/docs/services/user/event_types/index.md b/website/docs/services/user/event_types/index.md new file mode 100644 index 0000000..0b030cb --- /dev/null +++ b/website/docs/services/user/event_types/index.md @@ -0,0 +1,160 @@ +--- +title: event_types +hide_title: false +hide_table_of_contents: false +keywords: + - event_types + - user + - vercel + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists an event_types resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + +A user-facing event type. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringThe name of the event type. (access-group-created, access-group-deleted, access-group-project-updated, access-group-updated, access-group-user-added, access-group-user-removed, admin-agentic-provisioning-account-unlinked, admin-plan-updated, admin-secondary-email-added, admin-secondary-email-removed, admin-team-name-update, admin-team-slug-update, admin-user-delete, admin-user-primary-email-updated, admin-username-updated, agentic-provisioning-account-blocked, agentic-provisioning-account-linked, agentic-provisioning-account-relinked, agentic-provisioning-account-unlinked, agentic-provisioning-credentials-rotated, agentic-provisioning-plan-changed, agentic-provisioning-team-created, ai-alert-investigation, ai-code-review, ai-gateway-api-key-created, ai-gateway-api-key-deleted, ai-gateway-api-key-quota-updated, ai-gateway-auto-reload-updated, ai-gateway-budget-default-updated, ai-gateway-byok-credential-created, ai-gateway-byok-credential-deleted, ai-gateway-byok-credential-updated, ai-gateway-byok-model-mappings-updated, ai-gateway-credits-purchased, ai-gateway-guardrails-updated, ai-gateway-hipaa-compliance-toggled, ai-gateway-inference-regions-updated, ai-gateway-model-allowlist-models-updated, ai-gateway-model-allowlist-toggled, ai-gateway-private-model-created, ai-gateway-private-model-deleted, ai-gateway-private-model-updated, ai-gateway-private-provider-created, ai-gateway-private-provider-deleted, ai-gateway-private-provider-updated, ai-gateway-prompt-training-opt-out-toggled, ai-gateway-provider-allowlist-providers-updated, ai-gateway-provider-allowlist-toggled, ai-gateway-rule-created, ai-gateway-rule-deleted, ai-gateway-rule-updated, ai-gateway-scope-budget-updated, ai-gateway-transcripts-default-disabled, ai-gateway-transcripts-default-enabled, ai-gateway-transcripts-disabled, ai-gateway-transcripts-enabled, ai-gateway-transcripts-retention-updated, ai-gateway-virtual-model-config-archived, ai-gateway-virtual-model-config-created, ai-gateway-virtual-model-config-deleted, ai-gateway-virtual-model-config-restored, ai-gateway-virtual-model-config-updated, ai-gateway-zero-data-retention-toggled, ai-omniagent, alert-investigation-project-allowlist-updated, alert-rule-created, alert-rule-deleted, alert-rule-updated, alias, alias-chown, alias-delete, alias-invite-created, alias-invite-joined, alias-invite-revoked, alias-protection-bypass-created, alias-protection-bypass-exception, alias-protection-bypass-regenerated, alias-protection-bypass-revoked, alias-system, alias-user-scoped-access-denied, alias-user-scoped-access-granted, alias-user-scoped-access-requested, alias-user-scoped-access-revoked, aliases-assigned, attack-mode-disabled, attack-mode-enabled, audit-log-export-downloaded, audit-log-export-requested, authorize-git-deployment, auto-expose-system-envs, avatar, billing-settings-updated, bulk-redirects-settings-updated, bulk-redirects-version-promoted, bulk-redirects-version-restored, cert, cert-autorenew, cert-chown, cert-clone, cert-delete, cert-renew, cert-replace, cert-system-create, code-owners-config-updated, compliance-document-downloaded, compliance-document-previewed, compliance-documents-bulk-downloaded, concurrent-builds-update, connect-attach-project, connect-bitbucket, connect-bitbucket-app, connect-configuration-created, connect-configuration-deleted, connect-configuration-link-updated, connect-configuration-linked, connect-configuration-unlinked, connect-configuration-updated, connect-create-connector, connect-delete-connector, connect-delete-installation, connect-detach-project, connect-github, connect-github-custom-host, connect-github-limited, connect-gitlab, connect-gitlab-app, connect-import-tokens, connect-revoke-all-tokens, connect-update-connector, connect-update-trigger-destinations, connect-upsert-installation, custom-alert-created, custom-alert-deleted, custom-alert-updated, custom-environments-settings-updated, custom-metric-metadata-deleted, custom-metric-metadata-updated, custom-suffix-clear, custom-suffix-disable, custom-suffix-enable, custom-suffix-pending, custom-suffix-ready, deploy-hook-created, deploy-hook-deduped, deploy-hook-deleted, deploy-hook-processed, deployment, deployment-check-created, deployment-check-deleted, deployment-check-updated, deployment-chown, deployment-creation-blocked, deployment-delete, deployment-policy-blocked, deployment-undeleted, disabled-integration-installation-removed, disconnect-bitbucket-app, disconnect-github, disconnect-github-custom-host, disconnect-github-limited, disconnect-gitlab-app, dns-add, dns-delete, dns-record-internal, dns-update, dns-zonefile-import, domain, domain-buy, domain-cdn, domain-chown, domain-custom-ns-change, domain-delegated, domain-delete, domain-ech-change, domain-move-in, domain-move-out, domain-move-out-request-sent, domain-renew-change, domain-service-type-updated, domain-transfer-in, domain-transfer-in-canceled, domain-transfer-in-completed, domain-zone-change, domain-zone-change-internal, drain-created, drain-deleted, drain-disabled, drain-enabled, drain-updated, edge-cache-dangerously-delete-by-src-images, edge-cache-dangerously-delete-by-tags, edge-cache-dangerously-delete-immutable-static, edge-cache-invalidate-by-src-images, edge-cache-invalidate-by-tags, edge-cache-purge-all, edge-cache-rollback-purge, edge-config-backup-restored, edge-config-created, edge-config-deleted, edge-config-items-updated, edge-config-schema-deleted, edge-config-schema-updated, edge-config-token-created, edge-config-token-deleted, edge-config-transfer-in, edge-config-transfer-out, edge-config-updated, email, email-notification-rule-removed, email-notification-rule-updated, emu-member-removed-unverified-domain, enforce-disjunctive-production-secrets, enforce-sensitive-environment-variables, env-variable-add, env-variable-delete, env-variable-edit, env-variable-masked, env-variable-read, env-variable-read:cli:dev, env-variable-read:cli:env:add, env-variable-read:cli:env:ls, env-variable-read:cli:env:pull, env-variable-read:cli:env:rm, env-variable-read:cli:pull, env-variable-read:unknown-source, env-variable-read:v0:env:pull, env-variable-rotated, experiment-created, experiment-deleted, experiment-transitioned, experiment-updated, firewall-bypass-created, firewall-bypass-deleted, firewall-config-modified, firewall-config-promoted, firewall-config-removed, firewall-managed-rulegroup-updated, firewall-managed-ruleset-updated, flag, flag-archived, flag-created, flag-deleted, flag-unarchived, flag-updated, flags-explorer-subscription, flags-sdk-key, flags-sdk-key-added, flags-sdk-key-deleted, flags-sdk-key-read, flags-segment, flags-settings, flags-transferred, flat-rate-cdn-auto-upgrade-consent, git-integration-repo-push, git_account_integration_link_added, global-config-backup-restored, global-config-created, global-config-deleted, global-config-items-updated, global-config-schema-deleted, global-config-schema-updated, global-config-token-created, global-config-token-deleted, global-config-transfer-in, global-config-transfer-out, global-config-updated, instant-rollback-created, integration-configuration-credential-revoked, integration-configuration-credential-rotated, integration-configuration-owner-changed, integration-configuration-scope-change-confirmed, integration-configuration-transfer-in-success, integration-configuration-transfer-out-success, integration-configurations-disabled, integration-installation-billing-plan-updated, integration-installation-completed, integration-installation-permission-updated, integration-installation-removed, integration-resource-redis-command-executed, integration-resource-sql-query-executed, integration-scope-changed, invoice-modified, invoice-refunded, kms-issuer-created, kms-issuer-deleted, kms-issuer-key-activated, kms-issuer-key-created, kms-issuer-key-revoked, kms-issuer-key-rotated, kms-issuer-policy-created, kms-issuer-policy-deleted, kms-issuer-policy-updated, kms-issuer-updated, log-drain-created, log-drain-deleted, log-drain-disabled, log-drain-enabled, login, login-connection-linked, login-connection-unlinked, manual-deployment-promotion-created, marketplace-flex-commit-opt-in, marketplace-integration-allowlist-updated, microfrontend-group-added, microfrontend-group-deleted, microfrontend-group-updated, microfrontend-project-added-to-group, microfrontend-project-removed-from-group, microfrontend-project-updated, monitoring-alert-updated, monitoring-disabled, monitoring-enabled, oauth-app-connection-created, oauth-app-connection-removed, oauth-app-connection-updated, oauth-app-created, oauth-app-deleted, oauth-app-secret-deleted, oauth-app-secret-generated, oauth-app-token-created, oauth-app-updated, observability-disabled, observability-enabled, observability-plus-project-disabled, observability-plus-project-enabled, oidc-policy-created, oidc-policy-deleted, oidc-policy-updated, oidc-policy-used-to-obtain-app-token, organization-create, organization-delete, organization-dsync-group-delete, organization-dsync-group-upsert, organization-slug-update, organization-team-add, organization-team-create, organization-team-delete, organization-team-sso-update, owner-blocked, owner-soft-blocked, owner-soft-unblocked, owner-unblocked, page-integrity-config-updated, page-integrity-header-approved, page-integrity-header-rejected, page-integrity-inventory-cleared, page-integrity-resource-approved, page-integrity-resource-deleted, page-integrity-resource-rejected, page-integrity-script-approval-rule-created, page-integrity-script-approval-rule-deleted, passkey-created, passkey-deleted, passkey-updated, passport-access-granted, password-protection-disabled, password-protection-enabled, payment-method-added, payment-method-default-updated, payment-method-removed, plan, preview-deployment-suffix-disabled, preview-deployment-suffix-enabled, preview-deployment-suffix-update, privatelink-endpoint-created, privatelink-endpoint-deleted, privatelink-endpoint-updated, production-branch-updated, project-add-alias, project-add-redirect, project-affected-projects-deployments-updated, project-alias-configured-change, project-analytics-disabled, project-analytics-enabled, project-auto-assign-custom-production-domains-updated, project-automation-bypass, project-avatar-update, project-build-command-updated, project-build-logs-and-source-protection-updated, project-build-machine-updated, project-card-widget-preference-updated, project-client-cert-delete, project-client-cert-upload, project-connect-configurations, project-consolidated-git-commit-status-updated, project-created, project-cron-jobs-toggled, project-custom-environment-created, project-custom-environment-deleted, project-custom-environment-updated, project-customer-success-code-visibility-updated, project-delete, project-deployment-policy-updated, project-deployment-retention-updated, project-directory-listing, project-domain-deleted, project-domain-moved, project-domain-unverified, project-domain-updated, project-domain-verified, project-elastic-concurrency-updated, project-expiration-locked, project-expiration-reached, project-expiration-scheduled, project-expiration-unlocked, project-external-rewrite-caching-updated, project-framework-updated, project-function-cpu-memory, project-function-failover, project-function-max-duration, project-function-regions, project-functions-beta-updated, project-functions-fluid-disabled, project-functions-fluid-enabled, project-git-commit-comments-toggled, project-git-commit-status-toggled, project-git-create-deployments-toggled, project-git-credential-bound-created, project-git-credential-bound-deleted, project-git-credential-bound-updated, project-git-credential-grant-created, project-git-credential-grant-deleted, project-git-credential-grant-updated, project-git-fork-protection-updated, project-git-lfs-toggled, project-git-pr-comments-toggled, project-git-repository-connected, project-git-repository-disconnected, project-git-repository-dispatch-events-toggled, project-git-require-verified-commits-toggled, project-ignored-build-step-updated, project-install-command-updated, project-member-added, project-member-invited, project-member-removed, project-member-removed-batch, project-member-updated, project-move-in-success, project-move-out-failed, project-move-out-started, project-move-out-success, project-name, project-node-version-updated, project-oidc-issuer-mode-updated, project-oidc-token-created, project-options-allowlist, project-output-directory-updated, project-passport-updated, project-password-protection, project-paused, project-preview-deployment-suffix, project-preview-environment-branch-tracking-updated, project-prioritize-production-builds-updated, project-program-enrollment-changed, project-protected-sourcemaps-updated, project-rollback-description-updated, project-rolling-release-aborted, project-rolling-release-approved, project-rolling-release-completed, project-rolling-release-configured, project-rolling-release-continued, project-rolling-release-disabled, project-rolling-release-enabled, project-rolling-release-paused, project-rolling-release-started, project-rolling-release-suggested-actions-generated, project-rolling-release-timer, project-root-directory-updated, project-routes-version-promoted, project-routes-version-restored, project-sandbox-config-updated, project-sandbox-url-protection-updated, project-skew-protection-allowed-domains-updated, project-skew-protection-max-age-updated, project-skew-protection-threshold-updated, project-source-files-outside-root-directory-updated, project-speed-insights-disabled, project-speed-insights-enabled, project-speed-insights-free-data-started, project-sso-protection, project-static-ips-updated, project-trusted-ips, project-trusted-sources, project-unpaused, project-web-analytics-disabled, project-web-analytics-enabled, protected-git-scope-added, protected-git-scope-removed, runtime-cache-purge-all, saml-connection-created, saml-connection-deleted, sandbox-alias-assigned, sandbox-alias-delete, sandbox-drive-created, sandbox-drive-deleted, sandbox-snapshot-regions-updated, scale, scale-auto, secondary-email-added, secondary-email-removed, secondary-email-verified, secret-add, secret-delete, secret-rename, security-list-created, security-list-deleted, security-list-updated, security-plus-updated, set-bio, set-name, set-profiles, set-scale, shared-env-variable-create, shared-env-variable-delete, shared-env-variable-read, shared-env-variable-repo-link, shared-env-variable-repo-unlink, shared-env-variable-update, show-ip-addresses, signup, signup-via-bitbucket, signup-via-github, signup-via-gitlab, speed-insights-settings-updated, spend-created, spend-deleted, spend-updated, sso-login, storage-accept-tos, storage-access-token-set, storage-accessed-data-browser, storage-connect-project, storage-create, storage-delete, storage-disconnect-project, storage-disconnect-projects, storage-inactive-store-deleted, storage-reset-credentials, storage-resource-repl-command, storage-set-locked, storage-transfer-in-success, storage-transfer-out-success, storage-transfer-request-created, storage-update, storage-update-project-connection, storage-upgrade-project-connection-to-oidc, storage-view-secret, strict-connectors, strict-deployment-protection-settings, strict-password-protection-settings, strict-shareable-links, subscription-created, subscription-product-added, subscription-product-removed, subscription-updated, support-session-created, team, team-agent-billing-migration-decision-changed, team-avatar-update, team-collaboration-settings-updated, team-default-build-machine-updated, team-default-passport-updated, team-delete, team-deployment-policy-updated, team-domain-verification-created, team-domain-verification-deleted, team-domain-verification-verified, team-email-domain-update, team-emu-updated, team-ended-trial, team-firewall-config-modified, team-firewall-config-promoted, team-git-repository-dispatch-events-toggled, team-git-require-verified-commits-toggled, team-invite-bulk-delete, team-invite-code-reset, team-invite-link-created, team-invite-link-deleted, team-ip-blocking-rules-created, team-ip-blocking-rules-removed, team-member-add, team-member-confirm-request, team-member-decline-request, team-member-delete, team-member-entitlement-added, team-member-entitlement-canceled, team-member-entitlement-reactivated, team-member-entitlement-removed, team-member-join, team-member-leave, team-member-request-access, team-member-role-update, team-member-sso-authorization-attempt, team-mfa-enforcement-updated, team-name-update, team-paid-invoice, team-program-enrollment-changed, team-remote-caching-purge, team-remote-caching-update, team-saml-enforced, team-saml-roles, team-slug-update, team-tokens-invalidated, tracing-configured, tracing-disabled, tracing-paused, tracing-resumed, unlink-login-connection, update-account-flow-dismissed, update-account-flow-triggered, user-auto-block-configured, user-blocked, user-delete, user-delete-requested, user-emu-account-archived, user-emu-account-deleted, user-emu-account-recovered, user-emu-account-update-opted-in, user-emu-account-update-opted-out, user-emu-recovery-email-sent, user-emu-recovery-initiated, user-emu-toggled, user-mfa-challenge-failed, user-mfa-challenge-initiated, user-mfa-challenge-verified, user-mfa-change-failed, user-mfa-configuration-updated, user-mfa-recovery-code-used, user-mfa-recovery-codes-regenerated, user-mfa-removed, user-mfa-setup-skipped, user-mfa-totp-verification-started, user-mfa-totp-verified, user-phone-removed, user-phone-updated, user-primary-email-updated, user-provider-email-claim-evaluated, user-sudo-mode-removed, user-token-created, user-token-deleted, user-tokens-deleted, user-unblocked, username, v0-chat-ai-usage, v0-chat-created, v0-chat-message-sent, vcr-image-deleted, vcr-image-pushed, vcr-repository-created, vcr-repository-deleted, vcr-repository-permission-added, vcr-repository-permission-removed, vcr-repository-permissions-cleared, vcr-repository-visibility-changed, vercel-agent-elevated-permissions-approved, vercel-agent-elevated-permissions-requested, vercel-agent-session-created, vercel-agent-team-trial-credits-applied, vercel-app-installation-request-dismissed, vercel-app-installation-requested, vercel-app-installation-updated, vercel-app-installed, vercel-app-tokens-revoked, vercel-app-uninstalled, vercel-toolbar, vpc-peering-connection-accepted, vpc-peering-connection-deleted, vpc-peering-connection-rejected, vpc-peering-connection-updated, vulnerability-banner-dismissed, web-analytics-tier-updated, webhook-created, webhook-deleted, webhook-updated, workflow-deployment-key-accessed) (example: deployment-created)
arrayCategories that group this event type with related event types.
booleanPresent only when this event type is deprecated. (false, true)
stringDescription of the event, visible to users in the Activity dashboard and docs.
arrayEvent type names that supersede this deprecated event type. (wire: replacedBy)
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
team_id, slugReturns the list of user-facing event types with descriptions.
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringThe Team slug to perform the request on behalf of.
stringThe Team identifier to perform the request on behalf of. (wire: teamId)
+ +## `SELECT` examples + + + + +Returns the list of user-facing event types with descriptions. + +```sql +SELECT +name, +categories, +deprecated, +description, +replaced_by +FROM vercel.user.event_types +WHERE team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + diff --git a/website/docs/services/user/events/index.md b/website/docs/services/user/events/index.md index 93f1980..6fa83da 100644 --- a/website/docs/services/user/events/index.md +++ b/website/docs/services/user/events/index.md @@ -15,6 +15,7 @@ image: /img/stackql-vercel-provider-featured-image.png --- import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; @@ -22,7 +23,7 @@ Creates, updates, deletes, gets or lists an events resource. ## Overview - +
Nameevents
Name
TypeResource
Id
@@ -32,12 +33,12 @@ Creates, updates, deletes, gets or lists an events resource. The following fields are returned by `SELECT` queries: - + Successful response. @@ -56,29 +57,79 @@ Successful response. The unique identifier of the Event. (example: uev_bfmMjiMnXfnPbT97dGdpJbCN) - + + string + The ID of the principal who generated the event. The principal is typically a user, but it could also be an app, an integration, etc. The principal may have delegated its authority to an acting party, and so {@link viaIds} should be checked as well. (wire: principalId) + + + + string + (wire: requestId) + + + + string + The ID of the session that the principal's token belongs to, when it belongs to one. (wire: sessionId) + + + + string + The public ID of the token that the principal authenticated with, when the request behind this event carried one. (wire: tokenId) + + + + string + When the principal who generated the event is a user, this is their ID; otherwise, it is empty. (example: zTuNVUXEAvvnNN3IaqinkyMw) (wire: userId) + + + + array + The categories that group this event with related event types. An event can belong to multiple categories (e.g. a firewall event is both Firewall and Security). The first entry is the "primary" category. Use the `/events/types` endpoint to discover the full list of categories. + + + number - Timestamp (in milliseconds) of when the event was generated. + Timestamp (in milliseconds) of when the event was generated. (wire: createdAt) array A list of "entities" within the event `text`. Useful for enhancing the displayed text with additional styling and links. + + + string + The payload of the event, if requested. (opaque JSON object) + + + + object + Metadata for {@link principalId}. + string The human-readable text of the Event. (example: You logged in via GitHub) + + + string + The type of the event. (access-group-created, access-group-deleted, access-group-project-updated, access-group-updated, access-group-user-added, access-group-user-removed, admin-agentic-provisioning-account-unlinked, admin-plan-updated, admin-secondary-email-added, admin-secondary-email-removed, admin-team-name-update, admin-team-slug-update, admin-user-delete, admin-user-primary-email-updated, admin-username-updated, agentic-provisioning-account-blocked, agentic-provisioning-account-linked, agentic-provisioning-account-relinked, agentic-provisioning-account-unlinked, agentic-provisioning-credentials-rotated, agentic-provisioning-plan-changed, agentic-provisioning-team-created, ai-alert-investigation, ai-code-review, ai-gateway-api-key-created, ai-gateway-api-key-deleted, ai-gateway-api-key-quota-updated, ai-gateway-auto-reload-updated, ai-gateway-budget-default-updated, ai-gateway-byok-credential-created, ai-gateway-byok-credential-deleted, ai-gateway-byok-credential-updated, ai-gateway-byok-model-mappings-updated, ai-gateway-credits-purchased, ai-gateway-guardrails-updated, ai-gateway-hipaa-compliance-toggled, ai-gateway-inference-regions-updated, ai-gateway-model-allowlist-models-updated, ai-gateway-model-allowlist-toggled, ai-gateway-private-model-created, ai-gateway-private-model-deleted, ai-gateway-private-model-updated, ai-gateway-private-provider-created, ai-gateway-private-provider-deleted, ai-gateway-private-provider-updated, ai-gateway-prompt-training-opt-out-toggled, ai-gateway-provider-allowlist-providers-updated, ai-gateway-provider-allowlist-toggled, ai-gateway-rule-created, ai-gateway-rule-deleted, ai-gateway-rule-updated, ai-gateway-scope-budget-updated, ai-gateway-transcripts-default-disabled, ai-gateway-transcripts-default-enabled, ai-gateway-transcripts-disabled, ai-gateway-transcripts-enabled, ai-gateway-transcripts-retention-updated, ai-gateway-virtual-model-config-archived, ai-gateway-virtual-model-config-created, ai-gateway-virtual-model-config-deleted, ai-gateway-virtual-model-config-restored, ai-gateway-virtual-model-config-updated, ai-gateway-zero-data-retention-toggled, ai-omniagent, alert-investigation-project-allowlist-updated, alert-rule-created, alert-rule-deleted, alert-rule-updated, alias, alias-chown, alias-delete, alias-invite-created, alias-invite-joined, alias-invite-revoked, alias-protection-bypass-created, alias-protection-bypass-exception, alias-protection-bypass-regenerated, alias-protection-bypass-revoked, alias-system, alias-user-scoped-access-denied, alias-user-scoped-access-granted, alias-user-scoped-access-requested, alias-user-scoped-access-revoked, aliases-assigned, attack-mode-disabled, attack-mode-enabled, audit-log-export-downloaded, audit-log-export-requested, authorize-git-deployment, auto-expose-system-envs, avatar, billing-settings-updated, bulk-redirects-settings-updated, bulk-redirects-version-promoted, bulk-redirects-version-restored, cert, cert-autorenew, cert-chown, cert-clone, cert-delete, cert-renew, cert-replace, cert-system-create, code-owners-config-updated, compliance-document-downloaded, compliance-document-previewed, compliance-documents-bulk-downloaded, concurrent-builds-update, connect-attach-project, connect-bitbucket, connect-bitbucket-app, connect-configuration-created, connect-configuration-deleted, connect-configuration-link-updated, connect-configuration-linked, connect-configuration-unlinked, connect-configuration-updated, connect-create-connector, connect-delete-connector, connect-delete-installation, connect-detach-project, connect-github, connect-github-custom-host, connect-github-limited, connect-gitlab, connect-gitlab-app, connect-import-tokens, connect-revoke-all-tokens, connect-update-connector, connect-update-trigger-destinations, connect-upsert-installation, custom-alert-created, custom-alert-deleted, custom-alert-updated, custom-environments-settings-updated, custom-metric-metadata-deleted, custom-metric-metadata-updated, custom-suffix-clear, custom-suffix-disable, custom-suffix-enable, custom-suffix-pending, custom-suffix-ready, deploy-hook-created, deploy-hook-deduped, deploy-hook-deleted, deploy-hook-processed, deployment, deployment-check-created, deployment-check-deleted, deployment-check-updated, deployment-chown, deployment-creation-blocked, deployment-delete, deployment-policy-blocked, deployment-undeleted, disabled-integration-installation-removed, disconnect-bitbucket-app, disconnect-github, disconnect-github-custom-host, disconnect-github-limited, disconnect-gitlab-app, dns-add, dns-delete, dns-record-internal, dns-update, dns-zonefile-import, domain, domain-buy, domain-cdn, domain-chown, domain-custom-ns-change, domain-delegated, domain-delete, domain-ech-change, domain-move-in, domain-move-out, domain-move-out-request-sent, domain-renew-change, domain-service-type-updated, domain-transfer-in, domain-transfer-in-canceled, domain-transfer-in-completed, domain-zone-change, domain-zone-change-internal, drain-created, drain-deleted, drain-disabled, drain-enabled, drain-updated, edge-cache-dangerously-delete-by-src-images, edge-cache-dangerously-delete-by-tags, edge-cache-dangerously-delete-immutable-static, edge-cache-invalidate-by-src-images, edge-cache-invalidate-by-tags, edge-cache-purge-all, edge-cache-rollback-purge, edge-config-backup-restored, edge-config-created, edge-config-deleted, edge-config-items-updated, edge-config-schema-deleted, edge-config-schema-updated, edge-config-token-created, edge-config-token-deleted, edge-config-transfer-in, edge-config-transfer-out, edge-config-updated, email, email-notification-rule-removed, email-notification-rule-updated, emu-member-removed-unverified-domain, enforce-disjunctive-production-secrets, enforce-sensitive-environment-variables, env-variable-add, env-variable-delete, env-variable-edit, env-variable-masked, env-variable-read, env-variable-read:cli:dev, env-variable-read:cli:env:add, env-variable-read:cli:env:ls, env-variable-read:cli:env:pull, env-variable-read:cli:env:rm, env-variable-read:cli:pull, env-variable-read:unknown-source, env-variable-read:v0:env:pull, env-variable-rotated, experiment-created, experiment-deleted, experiment-transitioned, experiment-updated, firewall-bypass-created, firewall-bypass-deleted, firewall-config-modified, firewall-config-promoted, firewall-config-removed, firewall-managed-rulegroup-updated, firewall-managed-ruleset-updated, flag, flag-archived, flag-created, flag-deleted, flag-unarchived, flag-updated, flags-explorer-subscription, flags-sdk-key, flags-sdk-key-added, flags-sdk-key-deleted, flags-sdk-key-read, flags-segment, flags-settings, flags-transferred, flat-rate-cdn-auto-upgrade-consent, git-integration-repo-push, git_account_integration_link_added, global-config-backup-restored, global-config-created, global-config-deleted, global-config-items-updated, global-config-schema-deleted, global-config-schema-updated, global-config-token-created, global-config-token-deleted, global-config-transfer-in, global-config-transfer-out, global-config-updated, instant-rollback-created, integration-configuration-credential-revoked, integration-configuration-credential-rotated, integration-configuration-owner-changed, integration-configuration-scope-change-confirmed, integration-configuration-transfer-in-success, integration-configuration-transfer-out-success, integration-configurations-disabled, integration-installation-billing-plan-updated, integration-installation-completed, integration-installation-permission-updated, integration-installation-removed, integration-resource-redis-command-executed, integration-resource-sql-query-executed, integration-scope-changed, invoice-modified, invoice-refunded, kms-issuer-created, kms-issuer-deleted, kms-issuer-key-activated, kms-issuer-key-created, kms-issuer-key-revoked, kms-issuer-key-rotated, kms-issuer-policy-created, kms-issuer-policy-deleted, kms-issuer-policy-updated, kms-issuer-updated, log-drain-created, log-drain-deleted, log-drain-disabled, log-drain-enabled, login, login-connection-linked, login-connection-unlinked, manual-deployment-promotion-created, marketplace-flex-commit-opt-in, marketplace-integration-allowlist-updated, microfrontend-group-added, microfrontend-group-deleted, microfrontend-group-updated, microfrontend-project-added-to-group, microfrontend-project-removed-from-group, microfrontend-project-updated, monitoring-alert-updated, monitoring-disabled, monitoring-enabled, oauth-app-connection-created, oauth-app-connection-removed, oauth-app-connection-updated, oauth-app-created, oauth-app-deleted, oauth-app-secret-deleted, oauth-app-secret-generated, oauth-app-token-created, oauth-app-updated, observability-disabled, observability-enabled, observability-plus-project-disabled, observability-plus-project-enabled, oidc-policy-created, oidc-policy-deleted, oidc-policy-updated, oidc-policy-used-to-obtain-app-token, organization-create, organization-delete, organization-dsync-group-delete, organization-dsync-group-upsert, organization-slug-update, organization-team-add, organization-team-create, organization-team-delete, organization-team-sso-update, owner-blocked, owner-soft-blocked, owner-soft-unblocked, owner-unblocked, page-integrity-config-updated, page-integrity-header-approved, page-integrity-header-rejected, page-integrity-inventory-cleared, page-integrity-resource-approved, page-integrity-resource-deleted, page-integrity-resource-rejected, page-integrity-script-approval-rule-created, page-integrity-script-approval-rule-deleted, passkey-created, passkey-deleted, passkey-updated, passport-access-granted, password-protection-disabled, password-protection-enabled, payment-method-added, payment-method-default-updated, payment-method-removed, plan, preview-deployment-suffix-disabled, preview-deployment-suffix-enabled, preview-deployment-suffix-update, privatelink-endpoint-created, privatelink-endpoint-deleted, privatelink-endpoint-updated, production-branch-updated, project-add-alias, project-add-redirect, project-affected-projects-deployments-updated, project-alias-configured-change, project-analytics-disabled, project-analytics-enabled, project-auto-assign-custom-production-domains-updated, project-automation-bypass, project-avatar-update, project-build-command-updated, project-build-logs-and-source-protection-updated, project-build-machine-updated, project-card-widget-preference-updated, project-client-cert-delete, project-client-cert-upload, project-connect-configurations, project-consolidated-git-commit-status-updated, project-created, project-cron-jobs-toggled, project-custom-environment-created, project-custom-environment-deleted, project-custom-environment-updated, project-customer-success-code-visibility-updated, project-delete, project-deployment-policy-updated, project-deployment-retention-updated, project-directory-listing, project-domain-deleted, project-domain-moved, project-domain-unverified, project-domain-updated, project-domain-verified, project-elastic-concurrency-updated, project-expiration-locked, project-expiration-reached, project-expiration-scheduled, project-expiration-unlocked, project-external-rewrite-caching-updated, project-framework-updated, project-function-cpu-memory, project-function-failover, project-function-max-duration, project-function-regions, project-functions-beta-updated, project-functions-fluid-disabled, project-functions-fluid-enabled, project-git-commit-comments-toggled, project-git-commit-status-toggled, project-git-create-deployments-toggled, project-git-credential-bound-created, project-git-credential-bound-deleted, project-git-credential-bound-updated, project-git-credential-grant-created, project-git-credential-grant-deleted, project-git-credential-grant-updated, project-git-fork-protection-updated, project-git-lfs-toggled, project-git-pr-comments-toggled, project-git-repository-connected, project-git-repository-disconnected, project-git-repository-dispatch-events-toggled, project-git-require-verified-commits-toggled, project-ignored-build-step-updated, project-install-command-updated, project-member-added, project-member-invited, project-member-removed, project-member-removed-batch, project-member-updated, project-move-in-success, project-move-out-failed, project-move-out-started, project-move-out-success, project-name, project-node-version-updated, project-oidc-issuer-mode-updated, project-oidc-token-created, project-options-allowlist, project-output-directory-updated, project-passport-updated, project-password-protection, project-paused, project-preview-deployment-suffix, project-preview-environment-branch-tracking-updated, project-prioritize-production-builds-updated, project-program-enrollment-changed, project-protected-sourcemaps-updated, project-rollback-description-updated, project-rolling-release-aborted, project-rolling-release-approved, project-rolling-release-completed, project-rolling-release-configured, project-rolling-release-continued, project-rolling-release-disabled, project-rolling-release-enabled, project-rolling-release-paused, project-rolling-release-started, project-rolling-release-suggested-actions-generated, project-rolling-release-timer, project-root-directory-updated, project-routes-version-promoted, project-routes-version-restored, project-sandbox-config-updated, project-sandbox-url-protection-updated, project-skew-protection-allowed-domains-updated, project-skew-protection-max-age-updated, project-skew-protection-threshold-updated, project-source-files-outside-root-directory-updated, project-speed-insights-disabled, project-speed-insights-enabled, project-speed-insights-free-data-started, project-sso-protection, project-static-ips-updated, project-trusted-ips, project-trusted-sources, project-unpaused, project-web-analytics-disabled, project-web-analytics-enabled, protected-git-scope-added, protected-git-scope-removed, runtime-cache-purge-all, saml-connection-created, saml-connection-deleted, sandbox-alias-assigned, sandbox-alias-delete, sandbox-drive-created, sandbox-drive-deleted, sandbox-snapshot-regions-updated, scale, scale-auto, secondary-email-added, secondary-email-removed, secondary-email-verified, secret-add, secret-delete, secret-rename, security-list-created, security-list-deleted, security-list-updated, security-plus-updated, set-bio, set-name, set-profiles, set-scale, shared-env-variable-create, shared-env-variable-delete, shared-env-variable-read, shared-env-variable-repo-link, shared-env-variable-repo-unlink, shared-env-variable-update, show-ip-addresses, signup, signup-via-bitbucket, signup-via-github, signup-via-gitlab, speed-insights-settings-updated, spend-created, spend-deleted, spend-updated, sso-login, storage-accept-tos, storage-access-token-set, storage-accessed-data-browser, storage-connect-project, storage-create, storage-delete, storage-disconnect-project, storage-disconnect-projects, storage-inactive-store-deleted, storage-reset-credentials, storage-resource-repl-command, storage-set-locked, storage-transfer-in-success, storage-transfer-out-success, storage-transfer-request-created, storage-update, storage-update-project-connection, storage-upgrade-project-connection-to-oidc, storage-view-secret, strict-connectors, strict-deployment-protection-settings, strict-password-protection-settings, strict-shareable-links, subscription-created, subscription-product-added, subscription-product-removed, subscription-updated, support-session-created, team, team-agent-billing-migration-decision-changed, team-avatar-update, team-collaboration-settings-updated, team-default-build-machine-updated, team-default-passport-updated, team-delete, team-deployment-policy-updated, team-domain-verification-created, team-domain-verification-deleted, team-domain-verification-verified, team-email-domain-update, team-emu-updated, team-ended-trial, team-firewall-config-modified, team-firewall-config-promoted, team-git-repository-dispatch-events-toggled, team-git-require-verified-commits-toggled, team-invite-bulk-delete, team-invite-code-reset, team-invite-link-created, team-invite-link-deleted, team-ip-blocking-rules-created, team-ip-blocking-rules-removed, team-member-add, team-member-confirm-request, team-member-decline-request, team-member-delete, team-member-entitlement-added, team-member-entitlement-canceled, team-member-entitlement-reactivated, team-member-entitlement-removed, team-member-join, team-member-leave, team-member-request-access, team-member-role-update, team-member-sso-authorization-attempt, team-mfa-enforcement-updated, team-name-update, team-paid-invoice, team-program-enrollment-changed, team-remote-caching-purge, team-remote-caching-update, team-saml-enforced, team-saml-roles, team-slug-update, team-tokens-invalidated, tracing-configured, tracing-disabled, tracing-paused, tracing-resumed, unlink-login-connection, update-account-flow-dismissed, update-account-flow-triggered, user-auto-block-configured, user-blocked, user-delete, user-delete-requested, user-emu-account-archived, user-emu-account-deleted, user-emu-account-recovered, user-emu-account-update-opted-in, user-emu-account-update-opted-out, user-emu-recovery-email-sent, user-emu-recovery-initiated, user-emu-toggled, user-mfa-challenge-failed, user-mfa-challenge-initiated, user-mfa-challenge-verified, user-mfa-change-failed, user-mfa-configuration-updated, user-mfa-recovery-code-used, user-mfa-recovery-codes-regenerated, user-mfa-removed, user-mfa-setup-skipped, user-mfa-totp-verification-started, user-mfa-totp-verified, user-phone-removed, user-phone-updated, user-primary-email-updated, user-provider-email-claim-evaluated, user-sudo-mode-removed, user-token-created, user-token-deleted, user-tokens-deleted, user-unblocked, username, v0-chat-ai-usage, v0-chat-created, v0-chat-message-sent, vcr-image-deleted, vcr-image-pushed, vcr-repository-created, vcr-repository-deleted, vcr-repository-permission-added, vcr-repository-permission-removed, vcr-repository-permissions-cleared, vcr-repository-visibility-changed, vercel-agent-elevated-permissions-approved, vercel-agent-elevated-permissions-requested, vercel-agent-session-created, vercel-agent-team-trial-credits-applied, vercel-app-installation-request-dismissed, vercel-app-installation-requested, vercel-app-installation-updated, vercel-app-installed, vercel-app-tokens-revoked, vercel-app-uninstalled, vercel-toolbar, vpc-peering-connection-accepted, vpc-peering-connection-deleted, vpc-peering-connection-rejected, vpc-peering-connection-updated, vulnerability-banner-dismissed, web-analytics-tier-updated, webhook-created, webhook-deleted, webhook-updated, workflow-deployment-key-accessed) (example: login) + object - Metadata for the User who generated the event. + Metadata for {@link userId}. - - string - The unique identifier of the User who generated the event. (example: zTuNVUXEAvvnNN3IaqinkyMw) + + array + Metadata for {@link viaIds}. + + + + array + If the principal delegated its authority (for example, a user delegating to an app), then this array contains the ID of the current actor. For example, if `principalId` is "user123" and `viaIds` is `["app456"]`, we can say the event was triggered by - "app456 on behalf of user123", or - "user123 via app4556". Both are equivalent. Arbitrarily long chains of delegation can be represented. For example, if `principalId` is "user123" and `viaIds` is `["service1", "service2"]`, we can say the event was triggered by "user123 via service1 via service2". (wire: viaIds) @@ -101,17 +152,10 @@ The following methods are available for this resource: - + - teamId - limit, since, until, types, userId - Retrieves a list of "events" generated by the User on Vercel. Events are generated when the User performs a particular action, such as logging in, creating a deployment, and joining a Team (just to name a few). When the `teamId` parameter is supplied, then the events that are returned will be in relation to the Team that was specified. - - - - - teamId - limit, since, until, types, userId + + limit, since, until, types, user_id, principal_id, project_ids, entity_id, with_payload, team_id, slug Retrieves a list of "events" generated by the User on Vercel. Events are generated when the User performs a particular action, such as logging in, creating a deployment, and joining a Team (just to name a few). When the `teamId` parameter is supplied, then the events that are returned will be in relation to the Team that was specified. @@ -130,35 +174,60 @@ Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](# - - + + string - The Team identifier or slug to perform the request on behalf of. + Filters events to those associated with a specific entity (matched against `payload.id`). For example, a connector ID. (wire: entityId) number Maximum number of items which may be returned. + + + string + When retrieving events for a Team, the `principalId` parameter may be specified to filter events generated by a specific principal. (wire: principalId) + + + + string + Comma-delimited list of project IDs to filter the results by. (wire: projectIds) + string Timestamp to only include items created since then. + + + string + The Team slug to perform the request on behalf of. + + + + string + The Team identifier to perform the request on behalf of. (wire: teamId) + string - Comma-delimited list of event \"types\" to filter the results by. + Comma-delimited list of event "types" to filter the results by. string Timestamp to only include items created until then. - - + + + string + Deprecated. Use `principalId` instead. If `principalId` and `userId` both exist, `principalId` will be used. (wire: userId) + + + string - When retrieving events for a Team, the `userId` parameter may be specified to filter events generated by a specific member of the Team. + When set to `true`, the response will include the `payload` field for each event. (wire: withPayload) @@ -166,56 +235,45 @@ Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](# ## `SELECT` examples - + Retrieves a list of "events" generated by the User on Vercel. Events are generated when the User performs a particular action, such as logging in, creating a deployment, and joining a Team (just to name a few). When the `teamId` parameter is supplied, then the events that are returned will be in relation to the Team that was specified. ```sql SELECT id, -createdAt, +principal_id, +request_id, +session_id, +token_id, +user_id, +categories, +created_at, entities, +payload, +principal, text, +type, user, -userId +via, +via_ids FROM vercel.user.events -WHERE teamId = '{{ teamId }}' -- required -AND limit = '{{ limit }}' +WHERE limit = '{{ limit }}' AND since = '{{ since }}' AND until = '{{ until }}' AND types = '{{ types }}' -AND userId = '{{ userId }}' -; -``` - - - - -## Lifecycle Methods - - - - -Retrieves a list of "events" generated by the User on Vercel. Events are generated when the User performs a particular action, such as logging in, creating a deployment, and joining a Team (just to name a few). When the `teamId` parameter is supplied, then the events that are returned will be in relation to the Team that was specified. - -```sql -EXEC vercel.user.events._list_user_events -@teamId='{{ teamId }}' --required, -@limit='{{ limit }}', -@since='{{ since }}', -@until='{{ until }}', -@types='{{ types }}', -@userId='{{ userId }}' +AND user_id = '{{ user_id }}' +AND principal_id = '{{ principal_id }}' +AND project_ids = '{{ project_ids }}' +AND entity_id = '{{ entity_id }}' +AND with_payload = '{{ with_payload }}' +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' ; ``` diff --git a/website/docs/services/user/index.md b/website/docs/services/user/index.md index e7d385e..b2a476c 100644 --- a/website/docs/services/user/index.md +++ b/website/docs/services/user/index.md @@ -18,13 +18,14 @@ user service documentation. :::info[Service Summary] -total resources: __2__ +total resources: __3__ ::: ## Resources
diff --git a/website/docs/services/user/user/index.md b/website/docs/services/user/user/index.md index bf36e56..ed8c8d9 100644 --- a/website/docs/services/user/user/index.md +++ b/website/docs/services/user/user/index.md @@ -15,6 +15,7 @@ image: /img/stackql-vercel-provider-featured-image.png --- import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; @@ -22,7 +23,7 @@ Creates, updates, deletes, gets or lists a user resource. ## Overview - +
Nameuser
Name
TypeResource
Id
@@ -32,12 +33,12 @@ Creates, updates, deletes, gets or lists a user resource. The following fields are returned by `SELECT` queries: - + Successful response. @@ -50,6 +51,141 @@ Successful response. + + + string + The User's unique identifier. (example: AEIIDYVk59zbFF2Sxfyxxmua) + + + + string + Name associated with the User account, or `null` if none has been provided. (example: John Doe) + + + + string + The user's default team. (wire: defaultTeamId) + + + + string + (wire: importFlowGitNamespaceId) + + + + object + Context for the Update Account screen. Present only when `isAccountUpdateRequired` is true. `managedTeams` is empty for orphan mode (user matches an EMU domain but is not on the team). (wire: accountUpdateContext) + + + + array + set of dashboard view preferences (cards or list) per scopeId (wire: activeDashboardViews) + + + + string + SHA1 hash of the avatar for the User account. Can be used in conjuction with the ... endpoint to retrieve the avatar image. (example: 22cb30c85ff45ac4c72de8981500006b28114aa1) + + + + string + An object containing billing infomation associated with the User account. (opaque JSON object) + + + + number + UNIX timestamp (in milliseconds) when the User account was created. (wire: createdAt) + + + + object + data cache settings (wire: dataCache) + + + + array + A record of when, under a certain scopeId, a toast was dismissed (wire: dismissedToasts) + + + + string + Email address associated with the User account. (example: me@example.com) + + + + array + A list of projects and spaces across teams that a user has marked as a favorite. (wire: favoriteProjectsAndSpaces) + + + + object + Feature blocks for the user (wire: featureBlocks) + + + + boolean + Whether the user has a trial available for a paid plan subscription. (false, true) (wire: hasTrialAvailable) + + + + string + (wire: importFlowGitNamespace) + + + + string + (bitbucket, cursor-origin, github, github-custom-host, github-limited, gitlab, vercel, ) (wire: importFlowGitProvider) + + + + boolean + When `true`, the user must complete the EMU Update Account flow before they can use the dashboard. (false, true) (wire: isAccountUpdateRequired) + + + + boolean + Indicates whether the user is managed by an enterprise. (false, true) (wire: isEnterpriseManaged) + + + + boolean + Property indicating that this User data contains only limited information, due to the authentication token missing privileges to read the full User data. Re-login with email, GitHub, GitLab or Bitbucket in order to upgrade the authentication token with the necessary privileges. (true) + + + + array + (wire: preferredScopesAndGitNamespaces) + + + + object + remote caching settings (wire: remoteCaching) + + + + object + An object containing infomation related to the amount of platform resources may be allocated to the User account. (wire: resourceConfig) + + + + boolean + Whether the Enterprise Managed User joined the current team through the Update Account flow and should see its welcome experience. (false, true) (wire: shouldShowEnterpriseManagedWelcome) + + + + object + When the User account has been "soft blocked", this property will contain the date when the restriction was enacted, and the identifier for why. (wire: softBlock) + + + + string + Prefix that will be used in the URL of "Preview" deployments created by the User account. (wire: stagingPrefix) + + + + string + Unique username associated with the User account. (example: jdoe) + @@ -71,26 +207,19 @@ The following methods are available for this resource: - + Retrieves information related to the currently authenticated User. - + Initiates the deletion process for the currently authenticated User, by sending a deletion confirmation email. The email contains a link that the user needs to visit in order to proceed with the deletion process. - - - - - - Retrieves information related to the currently authenticated User. - @@ -113,18 +242,44 @@ Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](# ## `SELECT` examples - + Retrieves information related to the currently authenticated User. ```sql SELECT -* +id, +name, +default_team_id, +import_flow_git_namespace_id, +account_update_context, +active_dashboard_views, +avatar, +billing, +created_at, +data_cache, +dismissed_toasts, +email, +favorite_projects_and_spaces, +feature_blocks, +has_trial_available, +import_flow_git_namespace, +import_flow_git_provider, +is_account_update_required, +is_enterprise_managed, +limited, +preferred_scopes_and_git_namespaces, +remote_caching, +resource_config, +should_show_enterprise_managed_welcome, +soft_block, +staging_prefix, +username FROM vercel.user.user ; ``` @@ -135,12 +290,12 @@ FROM vercel.user.user ## `DELETE` examples - + Initiates the deletion process for the currently authenticated User, by sending a deletion confirmation email. The email contains a link that the user needs to visit in order to proceed with the deletion process. @@ -150,24 +305,3 @@ DELETE FROM vercel.user.user ``` - - -## Lifecycle Methods - - - - -Retrieves information related to the currently authenticated User. - -```sql -EXEC vercel.user.user._get_auth_user - -; -``` - - diff --git a/website/docs/services/vcr/images/index.md b/website/docs/services/vcr/images/index.md new file mode 100644 index 0000000..1baae40 --- /dev/null +++ b/website/docs/services/vcr/images/index.md @@ -0,0 +1,380 @@ +--- +title: images +hide_title: false +hide_table_of_contents: false +keywords: + - images + - vcr + - vercel + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists an images resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + +A single image with its tags, status and resolved Dockerfile layer history. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringInternal identifier of the image. (example: img_a1b2c3d4e5f6)
stringIdentifier of the repository the image belongs to. (example: repo_a1b2c3d4e5f6) (wire: repositoryId)
stringCPU architecture the manifest targets. Only present for single-platform manifests. (example: amd64)
stringISO 8601 timestamp of when the image was created. (example: 2026-06-30T10:00:00.000Z) (wire: createdAt)
stringWhether the manifest is a multi-platform image index, a single-platform image manifest or an attestation. (attestation, index, manifest)
array
stringSHA-256 digest of the image manifest. (example: sha256:2c4e8f3a1b9d0e5c7a6f4b2d8e1c9a0b3d5f7e9c1a2b4d6f8e0c2a4b6d8f0e2c) (wire: manifestDigest)
stringOperating system the manifest targets. Only present for single-platform manifests. (example: linux)
stringIdentifier of the actor that pushed the image. (wire: pushedBy)
numberTotal size in bytes of the image's resources (manifest, config and layer blobs) stored by the registry. (wire: sizeInBytes)
stringVHS-readiness status, or `null` for a multi-platform index. (preparing, ready, unoptimized, )
arrayTags pointing at this image's manifest.
+
+ + +An image enriched with its tags and VHS-readiness status, as returned when listing a repository's images. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringInternal identifier of the image. (example: img_a1b2c3d4e5f6)
stringIdentifier of the repository the image belongs to. (example: repo_a1b2c3d4e5f6) (wire: repositoryId)
stringCPU architecture the manifest targets. Only present for single-platform manifests. (example: amd64)
stringISO 8601 timestamp of when the image was created. (example: 2026-06-30T10:00:00.000Z) (wire: createdAt)
stringWhether the manifest is a multi-platform image index, a single-platform image manifest or an attestation. (attestation, index, manifest)
stringSHA-256 digest of the image manifest. (example: sha256:2c4e8f3a1b9d0e5c7a6f4b2d8e1c9a0b3d5f7e9c1a2b4d6f8e0c2a4b6d8f0e2c) (wire: manifestDigest)
stringOperating system the manifest targets. Only present for single-platform manifests. (example: linux)
stringIdentifier of the actor that pushed the image. (wire: pushedBy)
numberTotal size in bytes of the image's resources (manifest, config and layer blobs) stored by the registry. (wire: sizeInBytes)
stringVHS-readiness status, or `null` for a multi-platform index. (preparing, ready, unoptimized, )
arrayTags pointing at this image's manifest.
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
project_id, id_or_name, image_id_or_digestteam_id, slugFetch an individual image from a repository, including its tags and Dockerfile history entries with discriminated layer details for UI rendering. The image may be addressed by its internal id (`image_...`) or by its manifest digest (`sha256:...`).
project_id, id_or_namelimit, cursor, untagged, team_id, slugList images for a container registry repository, including their tags.
project_id, id_or_name, image_idteam_id, slugSchedule an image for deletion. The image is marked so it disappears from list/get immediately; subscriber-vcr reclaims the manifest, blobs, tags and row asynchronously via the VcrManifestRemoved event.
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string
string
stringThe internal image id (`image_...`) or the image manifest digest (`sha256:...`).
stringProject ID. Missing or empty values return HTTP 400. (wire: projectId)
stringOpaque pagination cursor returned by a previous list response.
integer
stringThe Team slug to perform the request on behalf of.
stringThe Team identifier to perform the request on behalf of. (wire: teamId)
boolean
+ +## `SELECT` examples + + + + +Fetch an individual image from a repository, including its tags and Dockerfile history entries with discriminated layer details for UI rendering. The image may be addressed by its internal id (`image_...`) or by its manifest digest (`sha256:...`). + +```sql +SELECT +id, +repository_id, +arch, +created_at, +kind, +layers, +manifest_digest, +platform, +pushed_by, +size_in_bytes, +status, +tags +FROM vercel.vcr.images +WHERE project_id = '{{ project_id }}' -- required +AND id_or_name = '{{ id_or_name }}' -- required +AND image_id_or_digest = '{{ image_id_or_digest }}' -- required +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + + +List images for a container registry repository, including their tags. + +```sql +SELECT +id, +repository_id, +arch, +created_at, +kind, +manifest_digest, +platform, +pushed_by, +size_in_bytes, +status, +tags +FROM vercel.vcr.images +WHERE project_id = '{{ project_id }}' -- required +AND id_or_name = '{{ id_or_name }}' -- required +AND limit = '{{ limit }}' +AND cursor = '{{ cursor }}' +AND untagged = '{{ untagged }}' +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + + + +## `DELETE` examples + + + + +Schedule an image for deletion. The image is marked so it disappears from list/get immediately; subscriber-vcr reclaims the manifest, blobs, tags and row asynchronously via the VcrManifestRemoved event. + +```sql +DELETE FROM vercel.vcr.images +WHERE project_id = '{{ project_id }}' --required +AND id_or_name = '{{ id_or_name }}' --required +AND image_id = '{{ image_id }}' --required +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + diff --git a/website/docs/services/vcr/index.md b/website/docs/services/vcr/index.md new file mode 100644 index 0000000..124427f --- /dev/null +++ b/website/docs/services/vcr/index.md @@ -0,0 +1,35 @@ +--- +title: vcr +hide_title: false +hide_table_of_contents: false +keywords: + - vcr + - vercel + - stackql + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +vcr service documentation. + +:::info[Service Summary] + +total resources: __4__ + +::: + +## Resources + \ No newline at end of file diff --git a/website/docs/services/vcr/permissions/index.md b/website/docs/services/vcr/permissions/index.md new file mode 100644 index 0000000..f973809 --- /dev/null +++ b/website/docs/services/vcr/permissions/index.md @@ -0,0 +1,319 @@ +--- +title: permissions +hide_title: false +hide_table_of_contents: false +keywords: + - permissions + - vcr + - vercel + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a permissions resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + +A team's access grant to a Vercel Container Registry repository. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringIdentifier of the repository the permission grants access to. (example: repo_a1b2c3d4e5f6) (wire: repositoryId)
stringIdentifier of the team that is granted access to the repository. (example: team_a1b2c3d4e5f6) (wire: teamId)
stringISO 8601 timestamp of when the permission was created. (example: 2026-06-30T10:00:00.000Z) (wire: createdAt)
stringSlug of the team that is granted access to the repository. (example: my-team) (wire: teamSlug)
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
project_id, id_or_namelimit, cursor, team_id, slugList the teams a VCR repository is shared with.
project_id, id_or_nameslugGrant a team access to a VCR repository. Sharing applies to the whole repository.
project_id, id_or_nameslugRevoke a team's access to a VCR repository.
projectId, id_or_nameteamId, slugRevoke every team's access to a VCR repository. Clearing an unshared repository is a no-op.
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string
stringProject ID. Missing or empty values return HTTP 400.
stringProject ID. Missing or empty values return HTTP 400. (wire: projectId)
stringOpaque pagination cursor returned by a previous list response.
integer
stringThe Team slug to perform the request on behalf of.
stringThe Team identifier to perform the request on behalf of.
stringThe Team identifier to perform the request on behalf of. (wire: teamId)
+ +## `SELECT` examples + + + + +List the teams a VCR repository is shared with. + +```sql +SELECT +repository_id, +team_id, +created_at, +team_slug +FROM vercel.vcr.permissions +WHERE project_id = '{{ project_id }}' -- required +AND id_or_name = '{{ id_or_name }}' -- required +AND limit = '{{ limit }}' +AND cursor = '{{ cursor }}' +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + + + +## `INSERT` examples + + + + +Grant a team access to a VCR repository. Sharing applies to the whole repository. + +```sql +INSERT INTO vercel.vcr.permissions ( +team_id, +team_slug, +project_id, +id_or_name, +slug +) +SELECT +'{{ team_id }}', +'{{ team_slug }}', +'{{ project_id }}', +'{{ id_or_name }}', +'{{ slug }}' +RETURNING +permission +; +``` + + + +{`# Description fields are for documentation purposes +- name: permissions + props: + - name: project_id + value: "{{ project_id }}" + description: Required parameter for the permissions resource. + - name: id_or_name + value: "{{ id_or_name }}" + description: Required parameter for the permissions resource. + - name: team_id + value: "{{ team_id }}" + description: | + ID of a team that is granted access to a repository. + - name: team_slug + value: "{{ team_slug }}" + description: | + Slug of a team that is granted access to a repository. + - name: slug + value: "{{ slug }}" + description: The Team slug to perform the request on behalf of. + description: The Team slug to perform the request on behalf of. +`} + + + + + +## `DELETE` examples + + + + +Revoke a team's access to a VCR repository. + +```sql +DELETE FROM vercel.vcr.permissions +WHERE project_id = '{{ project_id }}' --required +AND id_or_name = '{{ id_or_name }}' --required +AND slug = '{{ slug }}' +; +``` + + + + +## Lifecycle Methods + +EXEC variables use wire (API) names. + + + + +Revoke every team's access to a VCR repository. Clearing an unshared repository is a no-op. + +```sql +EXEC vercel.vcr.permissions.clear +@projectId='{{ projectId }}' --required, +@id_or_name='{{ id_or_name }}' --required, +@teamId='{{ teamId }}', +@slug='{{ slug }}' +; +``` + + diff --git a/website/docs/services/vcr/repositories/index.md b/website/docs/services/vcr/repositories/index.md new file mode 100644 index 0000000..86ae49c --- /dev/null +++ b/website/docs/services/vcr/repositories/index.md @@ -0,0 +1,359 @@ +--- +title: repositories +hide_title: false +hide_table_of_contents: false +keywords: + - repositories + - vcr + - vercel + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a repositories resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + +A Vercel Container Registry repository. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringUnique identifier of the repository. (example: repo_a1b2c3d4e5f6)
stringName of the repository. (example: my-app)
stringIdentifier of the project the repository belongs to. (example: prj_a1b2c3d4e5f6) (wire: projectId)
stringISO 8601 timestamp of when the repository was created. (example: 2026-06-30T10:00:00.000Z) (wire: createdAt)
booleanWhether the repository is public. Images in public repositories can be pulled by anyone. Defaults to `false` (private). (false, true)
stringISO 8601 timestamp of when the repository was last updated. (example: 2026-06-30T10:00:00.000Z) (wire: updatedAt)
+
+ + +A Vercel Container Registry repository. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringUnique identifier of the repository. (example: repo_a1b2c3d4e5f6)
stringName of the repository. (example: my-app)
stringIdentifier of the project the repository belongs to. (example: prj_a1b2c3d4e5f6) (wire: projectId)
stringISO 8601 timestamp of when the repository was created. (example: 2026-06-30T10:00:00.000Z) (wire: createdAt)
booleanWhether the repository is public. Images in public repositories can be pulled by anyone. Defaults to `false` (private). (false, true)
stringISO 8601 timestamp of when the repository was last updated. (example: 2026-06-30T10:00:00.000Z) (wire: updatedAt)
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
project_id, id_or_nameteam_id, slugFetch a container registry repository for a project by ID or name.
project_idlimit, cursor, team_id, slugList container registry repositories for a project.
project_id, nameteam_id, slugCreate a container registry repository for a project.
project_id, id_or_nameteam_id, slugSchedule a repository for deletion. The repository is marked so it disappears from list/get immediately; subscriber-vcr reclaims every image (manifests, blobs, tags and rows) and finally deletes the repository row asynchronously via the VcrRepositoryRemoved event.
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string
stringProject ID. Missing or empty values return HTTP 400. (wire: projectId)
stringOpaque pagination cursor returned by a previous list response.
integer
stringThe Team slug to perform the request on behalf of.
stringThe Team identifier to perform the request on behalf of. (wire: teamId)
+ +## `SELECT` examples + + + + +Fetch a container registry repository for a project by ID or name. + +```sql +SELECT +id, +name, +project_id, +created_at, +public, +updated_at +FROM vercel.vcr.repositories +WHERE project_id = '{{ project_id }}' -- required +AND id_or_name = '{{ id_or_name }}' -- required +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + + +List container registry repositories for a project. + +```sql +SELECT +id, +name, +project_id, +created_at, +public, +updated_at +FROM vercel.vcr.repositories +WHERE project_id = '{{ project_id }}' -- required +AND limit = '{{ limit }}' +AND cursor = '{{ cursor }}' +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + + + +## `INSERT` examples + + + + +Create a container registry repository for a project. + +```sql +INSERT INTO vercel.vcr.repositories ( +project_id, +name, +team_id, +slug +) +SELECT +'{{ project_id }}' /* required */, +'{{ name }}' /* required */, +'{{ team_id }}', +'{{ slug }}' +RETURNING +repository +; +``` + + + +{`# Description fields are for documentation purposes +- name: repositories + props: + - name: project_id + value: "{{ project_id }}" + description: | + Project ID. Missing or empty values return HTTP 400. + - name: name + value: "{{ name }}" + description: | + Single Docker repository name component. + - name: team_id + value: "{{ team_id }}" + description: The Team identifier to perform the request on behalf of. + description: The Team identifier to perform the request on behalf of. + - name: slug + value: "{{ slug }}" + description: The Team slug to perform the request on behalf of. + description: The Team slug to perform the request on behalf of. +`} + + + + + +## `DELETE` examples + + + + +Schedule a repository for deletion. The repository is marked so it disappears from list/get immediately; subscriber-vcr reclaims every image (manifests, blobs, tags and rows) and finally deletes the repository row asynchronously via the VcrRepositoryRemoved event. + +```sql +DELETE FROM vercel.vcr.repositories +WHERE project_id = '{{ project_id }}' --required +AND id_or_name = '{{ id_or_name }}' --required +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + diff --git a/website/docs/services/vcr/tags/index.md b/website/docs/services/vcr/tags/index.md new file mode 100644 index 0000000..7bfb379 --- /dev/null +++ b/website/docs/services/vcr/tags/index.md @@ -0,0 +1,341 @@ +--- +title: tags +hide_title: false +hide_table_of_contents: false +keywords: + - tags + - vcr + - vercel + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a tags resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + +A tag pointing at an image in a Vercel Container Registry repository, enriched with the backing image's metadata and VHS-readiness status. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringInternal identifier of the image the tag points at. (example: img_a1b2c3d4e5f6) (wire: imageId)
stringCPU architecture the manifest targets. Only present for single-platform manifests. (example: amd64)
stringISO 8601 timestamp of when the tag was created. (example: 2026-06-30T10:00:00.000Z) (wire: createdAt)
stringWhether the manifest is a multi-platform image index, a single-platform image manifest or an attestation. (attestation, index, manifest)
stringSHA-256 digest of the image manifest the tag points at. (example: sha256:2c4e8f3a1b9d0e5c7a6f4b2d8e1c9a0b3d5f7e9c1a2b4d6f8e0c2a4b6d8f0e2c) (wire: manifestDigest)
stringOperating system the manifest targets. Only present for single-platform manifests. (example: linux)
stringIdentifier of the actor that pushed the image. (wire: pushedBy)
numberTotal size in bytes of the image's resources (manifest, config and layer blobs) stored by the registry. (wire: sizeInBytes)
stringVHS-readiness status, or `null` for a multi-platform index. (preparing, ready, unoptimized, )
stringThe tag name. (example: latest)
stringISO 8601 timestamp of when the tag was last updated. (example: 2026-06-30T10:00:00.000Z) (wire: updatedAt)
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string (wire: imageId)
string
string (wire: createdAt)
string (attestation, index, manifest)
string (wire: manifestDigest)
string
string (wire: pushedBy)
number (wire: sizeInBytes)
string (preparing, ready, unoptimized, )
string
string (wire: updatedAt)
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
project_id, id_or_name, tagteam_id, slugFetch a single tag from a repository, including the backing image's metadata and VHS-readiness status.
project_id, id_or_namelimit, cursor, sort_by, sort_order, team_id, slugList a repository's tags.
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string
stringProject ID. Missing or empty values return HTTP 400. (wire: projectId)
string
string
integer
stringThe Team slug to perform the request on behalf of.
stringField to sort the non-pinned tags by. (wire: sortBy)
stringSort direction. Defaults to desc. (wire: sortOrder)
stringThe Team identifier to perform the request on behalf of. (wire: teamId)
+ +## `SELECT` examples + + + + +Fetch a single tag from a repository, including the backing image's metadata and VHS-readiness status. + +```sql +SELECT +image_id, +arch, +created_at, +kind, +manifest_digest, +platform, +pushed_by, +size_in_bytes, +status, +tag, +updated_at +FROM vercel.vcr.tags +WHERE project_id = '{{ project_id }}' -- required +AND id_or_name = '{{ id_or_name }}' -- required +AND tag = '{{ tag }}' -- required +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + + +List a repository's tags. + +```sql +SELECT +image_id, +arch, +created_at, +kind, +manifest_digest, +platform, +pushed_by, +size_in_bytes, +status, +tag, +updated_at +FROM vercel.vcr.tags +WHERE project_id = '{{ project_id }}' -- required +AND id_or_name = '{{ id_or_name }}' -- required +AND limit = '{{ limit }}' +AND cursor = '{{ cursor }}' +AND sort_by = '{{ sort_by }}' +AND sort_order = '{{ sort_order }}' +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + diff --git a/website/docs/services/web_analytics/event_aggregates/index.md b/website/docs/services/web_analytics/event_aggregates/index.md new file mode 100644 index 0000000..b66762e --- /dev/null +++ b/website/docs/services/web_analytics/event_aggregates/index.md @@ -0,0 +1,1496 @@ +--- +title: event_aggregates +hide_title: false +hide_table_of_contents: false +keywords: + - event_aggregates + - web_analytics + - vercel + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists an event_aggregates resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string (wire: aiGatewayModelId)
string (wire: asnId)
string (wire: deploymentId)
string (wire: entryId)
string (wire: entryItemId)
string (wire: environmentId)
string (wire: generationId)
string (wire: keyId)
string (wire: messageId)
string (wire: microfrontendsDefaultAppDeploymentId)
string (wire: microfrontendsDefaultAppProjectId)
string (wire: networkId)
string (wire: privatelinkEndpointId)
string (wire: projectId)
string (wire: quotaEntityId)
string (wire: reportingProjectId)
string (wire: requestId)
string (wire: sandboxSessionId)
string (wire: sdkKeyId)
string (wire: sessionId)
string (wire: stepRunId)
string (wire: storeId)
string (wire: visitorId)
string (wire: wafRuleId)
string (wire: workflowRunId)
string (wire: appName)
string (wire: asnName)
string (wire: attributionEventName)
string (wire: botName)
string (wire: browserName)
string (wire: entryName)
string (wire: eventName)
string (wire: flagClientName)
string (wire: keyName)
string (wire: metricName)
string (wire: osName)
string (wire: privatelinkDnsName)
string (wire: projectName)
string (wire: queueName)
string (wire: reportingProjectName)
string (wire: repositoryName)
string (wire: sandboxName)
string (wire: serverActionName)
string (wire: storeName)
string (wire: tagName)
string (wire: workflowName)
string (wire: workflowStepName)
string (wire: aiModel)
string (wire: aiModelType)
string (wire: aiProvider)
string
string (wire: attributionTarget)
string (wire: authMethod)
string (wire: billableRegion)
string (wire: blobOperationLevel)
string (wire: blobOperationType)
string (wire: botCategory)
string (wire: botCategoryLegacy)
string (wire: botCheckResult)
string (wire: botVerified)
string (wire: cacheApi)
string (wire: cacheCreation1hInputTokensCurrency)
string (wire: cacheCreationInputTokensCurrency)
string (wire: cacheHitLevel)
string (wire: cacheHitState)
string (wire: cacheHostname)
string (wire: cacheOperation)
string (wire: cachePath)
string (wire: cacheReason)
string (wire: cacheResult)
string (wire: cacheTags)
string (wire: cachedInputTokensCurrency)
string
string (wire: clientIp)
string (wire: clientIpCountry)
string (wire: clientJa4Digest)
string (wire: clientUserAgent)
string (wire: codingAgent)
string (wire: commitSha)
string (wire: consumerGroup)
string (wire: contentCaptureInputs)
string (wire: contentCaptureOutputs)
string (wire: contentCaptureStatus)
string (wire: contentType)
string (wire: costCurrency)
string
string (wire: dataCacheRegion)
string (wire: deepAnalysisCheck)
string (wire: deviceType)
string
string (wire: edgeNetworkRegion)
string (wire: edgeType)
string (wire: entryRevalidateSeconds)
string
string (wire: errorCode)
string (wire: errorMessage)
string (wire: eventData)
string (wire: eventType)
string (wire: externalRewriteTargetHost)
string (wire: externalRewriteTargetPath)
string (wire: fetchIndex)
string (wire: fetchType)
string (wire: flagEvaluationReason)
string (wire: flagKey)
string (wire: flagVariant)
string
string (wire: functionDispatcher)
string (wire: functionRegion)
string (wire: functionStartType)
string (wire: gatewayCostCurrency)
string (wire: hipaaRequested)
string (wire: httpAccept)
string (wire: httpStatus)
string (wire: imageSource)
string (wire: imageTransformationRegion)
string (wire: inferenceEndpointSlug)
string (wire: inferenceGeoRegion)
string (wire: inferenceProviderRegion)
string (wire: inferenceScope)
string (wire: isAdditionalRequest)
string (wire: isByok)
string (wire: isPrefetchRequest)
string (wire: isPrivateModel)
string (wire: isRequestZdr)
string (wire: isStreaming)
string (wire: isrAction)
string (wire: isrCacheRegion)
string (wire: marketCostCurrency)
string (wire: microfrontendsMatchedPath)
string (wire: microfrontendsResponseReason)
string (wire: middlewareAction)
string (wire: middlewareActionTarget)
string (wire: moderationApplied)
string (wire: networkTenancy)
string (wire: notificationUrl)
string (wire: optimizedFormatMimeType)
string (wire: optimizedQuality)
string (wire: optimizedWidthPixels)
string (wire: originHostname)
string (wire: originPath)
string (wire: originRoute)
string (wire: pathType)
string (wire: pathTypeVariant)
string (wire: piiRedactionApplied)
string (wire: pprState)
string (wire: privatelinkIpAddress)
string
string (wire: providerAttemptCanonicalSlug)
string (wire: providerAttemptCredentialType)
string (wire: providerAttemptDevSafetyIdentifier)
string (wire: providerAttemptError)
string (wire: providerAttemptIsFinal)
string (wire: providerAttemptModelIndex)
string (wire: providerAttemptNumber)
string (wire: providerAttemptRegion)
string (wire: providerAttemptSafetyIdentifier)
string (wire: providerAttemptStatusCode)
string (wire: providerAttemptSuccess)
string (wire: providerAttemptTimeout)
string (wire: providerAttemptTotalInRequest)
string (wire: pullRequestNumber)
string (wire: pullRequestState)
string (wire: queueRegion)
string (wire: quotaEntityType)
string (wire: quotaRequested)
string
string (wire: redirectLocation)
string (wire: referrerHostname)
string (wire: referrerUrl)
string
string (wire: repositoryOwner)
string (wire: requestApi)
string (wire: requestExtension)
string (wire: requestHostname)
string (wire: requestMethod)
string (wire: requestPath)
string (wire: requestResolvedIp)
string (wire: requestedInferenceRegion)
string (wire: reviewConclusion)
string (wire: reviewStatus)
string (wire: rewriteDestinationHostname)
string
string (wire: ruleCategory)
string
string (wire: sdkKeyEnvironment)
string (wire: servedSpeed)
string
string (wire: skewProtection)
string
string (wire: sourceImage)
string (wire: sourceImageHash)
string (wire: sourceImageHostname)
string (wire: sourceImagePathname)
string (wire: specVersion)
string (wire: spendAttribution)
string (wire: spendReportDatePart)
string (wire: spendReportGroupBy)
string (wire: surchargeCostCurrency)
string (date-time)
string (wire: toolCallErrorType)
string (wire: toolCallProvider)
string (wire: toolCallStatusCode)
string (wire: toolCallSuccess)
string (wire: toolCallType)
string (wire: trafficSource)
string (wire: transcriptInputs)
string (wire: transcriptOutputs)
string (wire: transcriptStatus)
string (wire: triggeringTag)
string (wire: utmCampaign)
string (wire: utmContent)
string (wire: utmMedium)
string (wire: utmSource)
string (wire: utmTerm)
string (wire: vdcOperationOrigin)
string (wire: videoAspectRatio)
string (wire: videoResolution)
string (wire: virtualModelKind)
string (wire: virtualModelSlug)
string (wire: wafAction)
string (wire: workflowEventType)
string (wire: workflowStatus)
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
project_id, by, since, untillimit, filter, team_id, slugCounts custom events on a project, within the requested date range. Results are either aggregated or broken down over time. Results can additionally be broken down by one dimension, and filtered by multiple dimensions.
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
arrayUp to two dimensions used to break down results. At most one time granularity is allowed: hour, day, week, month, year. Other dimensions: country, deviceType, environment, requestPath, referrerHostname, osName, browserName, route, utmSource, utmMedium, utmCampaign, utmContent, utmTerm, eventName. JSON dimensions: flags, eventData. Used bare, they break down results by key, for example flags returns one group per flag name. With a key, they break down results by that key's value, for example eventData/plan. Wrap keys containing characters other than letters, digits, and underscores in single quotes, for example flags/'my-flag'.
stringThe project identifier or the project name (wire: projectId)
Timestamp in milliseconds, or a valid Date string. Selects data from (including) this date and time. Will be adjusted according to the desired time granularity.
Timestamp in milliseconds, or a valid Date string. Selects data until (including) this date. Will be adjusted according to the desired time granularity.
stringOData-compliant filter. Encode the value when sending it in a URL. Allows filtering on one or multiple dimensions. By default, filters for production environment only. Supported dimensions: country, deviceType, environment, requestPath, referrerHostname, osName, browserName, route, utmSource, utmMedium, utmCampaign, utmContent, utmTerm, eventName. JSON dimensions filtered by key: flags/<name>, eventData/<property>, for example eventData/plan eq 'pro'. Wrap keys containing characters other than letters, digits, and underscores in single quotes, for example flags/'my-flag' eq 'true'. Supported operations include eq, ne, in, and logical operators and, or, not with parentheses. Functions such as startswith are supported by the OData parser.
integerNumber of distinct results, default to 10. Other results are grouped into "Others" group.
stringThe Team slug to perform the request on behalf of.
stringThe Team identifier to perform the request on behalf of. (wire: teamId)
+ +## `SELECT` examples + + + + +Counts custom events on a project, within the requested date range. Results are either aggregated or broken down over time. Results can additionally be broken down by one dimension, and filtered by multiple dimensions. + +```sql +SELECT +ai_gateway_model_id, +asn_id, +deployment_id, +entry_id, +entry_item_id, +environment_id, +generation_id, +key_id, +message_id, +microfrontends_default_app_deployment_id, +microfrontends_default_app_project_id, +network_id, +privatelink_endpoint_id, +project_id, +quota_entity_id, +reporting_project_id, +request_id, +sandbox_session_id, +sdk_key_id, +session_id, +step_run_id, +store_id, +visitor_id, +waf_rule_id, +workflow_run_id, +app_name, +asn_name, +attribution_event_name, +bot_name, +browser_name, +entry_name, +event_name, +flag_client_name, +key_name, +metric_name, +os_name, +privatelink_dns_name, +project_name, +queue_name, +reporting_project_name, +repository_name, +sandbox_name, +server_action_name, +store_name, +tag_name, +workflow_name, +workflow_step_name, +ai_model, +ai_model_type, +ai_provider, +attributes, +attribution_target, +auth_method, +billable_region, +blob_operation_level, +blob_operation_type, +bot_category, +bot_category_legacy, +bot_check_result, +bot_verified, +cache_api, +cache_creation_1h_input_tokens_currency, +cache_creation_input_tokens_currency, +cache_hit_level, +cache_hit_state, +cache_hostname, +cache_operation, +cache_path, +cache_reason, +cache_result, +cache_tags, +cached_input_tokens_currency, +cause, +client_ip, +client_ip_country, +client_ja_4_digest, +client_user_agent, +coding_agent, +commit_sha, +consumer_group, +content_capture_inputs, +content_capture_outputs, +content_capture_status, +content_type, +cost_currency, +country, +data_cache_region, +deep_analysis_check, +device_type, +direction, +edge_network_region, +edge_type, +entry_revalidate_seconds, +environment, +error_code, +error_message, +event_data, +event_type, +external_rewrite_target_host, +external_rewrite_target_path, +fetch_index, +fetch_type, +flag_evaluation_reason, +flag_key, +flag_variant, +flags, +function_dispatcher, +function_region, +function_start_type, +gateway_cost_currency, +hipaa_requested, +http_accept, +http_status, +image_source, +image_transformation_region, +inference_endpoint_slug, +inference_geo_region, +inference_provider_region, +inference_scope, +is_additional_request, +is_byok, +is_prefetch_request, +is_private_model, +is_request_zdr, +is_streaming, +isr_action, +isr_cache_region, +market_cost_currency, +microfrontends_matched_path, +microfrontends_response_reason, +middleware_action, +middleware_action_target, +moderation_applied, +network_tenancy, +notification_url, +optimized_format_mime_type, +optimized_quality, +optimized_width_pixels, +origin_hostname, +origin_path, +origin_route, +path_type, +path_type_variant, +pii_redaction_applied, +ppr_state, +privatelink_ip_address, +provider, +provider_attempt_canonical_slug, +provider_attempt_credential_type, +provider_attempt_dev_safety_identifier, +provider_attempt_error, +provider_attempt_is_final, +provider_attempt_model_index, +provider_attempt_number, +provider_attempt_region, +provider_attempt_safety_identifier, +provider_attempt_status_code, +provider_attempt_success, +provider_attempt_timeout, +provider_attempt_total_in_request, +pull_request_number, +pull_request_state, +queue_region, +quota_entity_type, +quota_requested, +reason, +redirect_location, +referrer_hostname, +referrer_url, +region, +repository_owner, +request_api, +request_extension, +request_hostname, +request_method, +request_path, +request_resolved_ip, +requested_inference_region, +review_conclusion, +review_status, +rewrite_destination_hostname, +route, +rule_category, +runtime, +sdk_key_environment, +served_speed, +service, +skew_protection, +source, +source_image, +source_image_hash, +source_image_hostname, +source_image_pathname, +spec_version, +spend_attribution, +spend_report_date_part, +spend_report_group_by, +surcharge_cost_currency, +timestamp, +tool_call_error_type, +tool_call_provider, +tool_call_status_code, +tool_call_success, +tool_call_type, +traffic_source, +transcript_inputs, +transcript_outputs, +transcript_status, +triggering_tag, +utm_campaign, +utm_content, +utm_medium, +utm_source, +utm_term, +vdc_operation_origin, +video_aspect_ratio, +video_resolution, +virtual_model_kind, +virtual_model_slug, +waf_action, +workflow_event_type, +workflow_status +FROM vercel.web_analytics.event_aggregates +WHERE project_id = '{{ project_id }}' -- required +AND by = '{{ by }}' -- required +AND since = '{{ since }}' -- required +AND until = '{{ until }}' -- required +AND limit = '{{ limit }}' +AND filter = '{{ filter }}' +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + diff --git a/website/docs/services/web_analytics/event_counts/index.md b/website/docs/services/web_analytics/event_counts/index.md new file mode 100644 index 0000000..53da387 --- /dev/null +++ b/website/docs/services/web_analytics/event_counts/index.md @@ -0,0 +1,1490 @@ +--- +title: event_counts +hide_title: false +hide_table_of_contents: false +keywords: + - event_counts + - web_analytics + - vercel + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists an event_counts resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string (wire: aiGatewayModelId)
string (wire: asnId)
string (wire: deploymentId)
string (wire: entryId)
string (wire: entryItemId)
string (wire: environmentId)
string (wire: generationId)
string (wire: keyId)
string (wire: messageId)
string (wire: microfrontendsDefaultAppDeploymentId)
string (wire: microfrontendsDefaultAppProjectId)
string (wire: networkId)
string (wire: privatelinkEndpointId)
string (wire: projectId)
string (wire: quotaEntityId)
string (wire: reportingProjectId)
string (wire: requestId)
string (wire: sandboxSessionId)
string (wire: sdkKeyId)
string (wire: sessionId)
string (wire: stepRunId)
string (wire: storeId)
string (wire: visitorId)
string (wire: wafRuleId)
string (wire: workflowRunId)
string (wire: appName)
string (wire: asnName)
string (wire: attributionEventName)
string (wire: botName)
string (wire: browserName)
string (wire: entryName)
string (wire: eventName)
string (wire: flagClientName)
string (wire: keyName)
string (wire: metricName)
string (wire: osName)
string (wire: privatelinkDnsName)
string (wire: projectName)
string (wire: queueName)
string (wire: reportingProjectName)
string (wire: repositoryName)
string (wire: sandboxName)
string (wire: serverActionName)
string (wire: storeName)
string (wire: tagName)
string (wire: workflowName)
string (wire: workflowStepName)
string (wire: aiModel)
string (wire: aiModelType)
string (wire: aiProvider)
string
string (wire: attributionTarget)
string (wire: authMethod)
string (wire: billableRegion)
string (wire: blobOperationLevel)
string (wire: blobOperationType)
string (wire: botCategory)
string (wire: botCategoryLegacy)
string (wire: botCheckResult)
string (wire: botVerified)
string (wire: cacheApi)
string (wire: cacheCreation1hInputTokensCurrency)
string (wire: cacheCreationInputTokensCurrency)
string (wire: cacheHitLevel)
string (wire: cacheHitState)
string (wire: cacheHostname)
string (wire: cacheOperation)
string (wire: cachePath)
string (wire: cacheReason)
string (wire: cacheResult)
string (wire: cacheTags)
string (wire: cachedInputTokensCurrency)
string
string (wire: clientIp)
string (wire: clientIpCountry)
string (wire: clientJa4Digest)
string (wire: clientUserAgent)
string (wire: codingAgent)
string (wire: commitSha)
string (wire: consumerGroup)
string (wire: contentCaptureInputs)
string (wire: contentCaptureOutputs)
string (wire: contentCaptureStatus)
string (wire: contentType)
string (wire: costCurrency)
number
string
string (wire: dataCacheRegion)
string (wire: deepAnalysisCheck)
string (wire: deviceType)
string
string (wire: edgeNetworkRegion)
string (wire: edgeType)
string (wire: entryRevalidateSeconds)
string
string (wire: errorCode)
string (wire: errorMessage)
string (wire: eventData)
string (wire: eventType)
string (wire: externalRewriteTargetHost)
string (wire: externalRewriteTargetPath)
string (wire: fetchIndex)
string (wire: fetchType)
string (wire: flagEvaluationReason)
string (wire: flagKey)
string (wire: flagVariant)
string
string (wire: functionDispatcher)
string (wire: functionRegion)
string (wire: functionStartType)
string (wire: gatewayCostCurrency)
string (wire: hipaaRequested)
string (wire: httpAccept)
string (wire: httpStatus)
string (wire: imageSource)
string (wire: imageTransformationRegion)
string (wire: inferenceEndpointSlug)
string (wire: inferenceGeoRegion)
string (wire: inferenceProviderRegion)
string (wire: inferenceScope)
string (wire: isAdditionalRequest)
string (wire: isByok)
string (wire: isPrefetchRequest)
string (wire: isPrivateModel)
string (wire: isRequestZdr)
string (wire: isStreaming)
string (wire: isrAction)
string (wire: isrCacheRegion)
string (wire: marketCostCurrency)
string (wire: microfrontendsMatchedPath)
string (wire: microfrontendsResponseReason)
string (wire: middlewareAction)
string (wire: middlewareActionTarget)
string (wire: moderationApplied)
string (wire: networkTenancy)
string (wire: notificationUrl)
string (wire: optimizedFormatMimeType)
string (wire: optimizedQuality)
string (wire: optimizedWidthPixels)
string (wire: originHostname)
string (wire: originPath)
string (wire: originRoute)
string (wire: pathType)
string (wire: pathTypeVariant)
string (wire: piiRedactionApplied)
string (wire: pprState)
string (wire: privatelinkIpAddress)
string
string (wire: providerAttemptCanonicalSlug)
string (wire: providerAttemptCredentialType)
string (wire: providerAttemptDevSafetyIdentifier)
string (wire: providerAttemptError)
string (wire: providerAttemptIsFinal)
string (wire: providerAttemptModelIndex)
string (wire: providerAttemptNumber)
string (wire: providerAttemptRegion)
string (wire: providerAttemptSafetyIdentifier)
string (wire: providerAttemptStatusCode)
string (wire: providerAttemptSuccess)
string (wire: providerAttemptTimeout)
string (wire: providerAttemptTotalInRequest)
string (wire: pullRequestNumber)
string (wire: pullRequestState)
string (wire: queueRegion)
string (wire: quotaEntityType)
string (wire: quotaRequested)
string
string (wire: redirectLocation)
string (wire: referrerHostname)
string (wire: referrerUrl)
string
string (wire: repositoryOwner)
string (wire: requestApi)
string (wire: requestExtension)
string (wire: requestHostname)
string (wire: requestMethod)
string (wire: requestPath)
string (wire: requestResolvedIp)
string (wire: requestedInferenceRegion)
string (wire: reviewConclusion)
string (wire: reviewStatus)
string (wire: rewriteDestinationHostname)
string
string (wire: ruleCategory)
string
string (wire: sdkKeyEnvironment)
string (wire: servedSpeed)
string
string (wire: skewProtection)
string
string (wire: sourceImage)
string (wire: sourceImageHash)
string (wire: sourceImageHostname)
string (wire: sourceImagePathname)
string (wire: specVersion)
string (wire: spendAttribution)
string (wire: spendReportDatePart)
string (wire: spendReportGroupBy)
string (wire: surchargeCostCurrency)
string (wire: toolCallErrorType)
string (wire: toolCallProvider)
string (wire: toolCallStatusCode)
string (wire: toolCallSuccess)
string (wire: toolCallType)
string (wire: trafficSource)
string (wire: transcriptInputs)
string (wire: transcriptOutputs)
string (wire: transcriptStatus)
string (wire: triggeringTag)
string (wire: utmCampaign)
string (wire: utmContent)
string (wire: utmMedium)
string (wire: utmSource)
string (wire: utmTerm)
string (wire: vdcOperationOrigin)
string (wire: videoAspectRatio)
string (wire: videoResolution)
string (wire: virtualModelKind)
string (wire: virtualModelSlug)
number
string (wire: wafAction)
string (wire: workflowEventType)
string (wire: workflowStatus)
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
project_idsince, until, filter, team_id, slugCounts the number of custom events on a project (production only), since Web Analytics was enabled. Results can be filtered on supported dimensions.
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringThe project identifier or the project name (wire: projectId)
stringOData-compliant filter. Encode the value when sending it in a URL. Allows filtering on one or multiple dimensions. Supported dimensions: country, deviceType, environment, requestPath, referrerHostname, osName, browserName, route, utmSource, utmMedium, utmCampaign, utmContent, utmTerm, eventName. JSON dimensions filtered by key: flags/<name>, eventData/<property>, for example eventData/plan eq 'pro'. Wrap keys containing characters other than letters, digits, and underscores in single quotes, for example flags/'my-flag' eq 'true'. Supported operations include eq, ne, in, and logical operators and, or, not with parentheses. Functions such as startswith are supported by the OData parser.
Timestamp in milliseconds, or a valid Date string. Selects data from (including) this date and time. Will be adjusted according to the desired time granularity.
stringThe Team slug to perform the request on behalf of.
stringThe Team identifier to perform the request on behalf of. (wire: teamId)
Timestamp in milliseconds, or a valid Date string. Selects data until (including) this date. Will be adjusted according to the desired time granularity.
+ +## `SELECT` examples + + + + +Counts the number of custom events on a project (production only), since Web Analytics was enabled. Results can be filtered on supported dimensions. + +```sql +SELECT +ai_gateway_model_id, +asn_id, +deployment_id, +entry_id, +entry_item_id, +environment_id, +generation_id, +key_id, +message_id, +microfrontends_default_app_deployment_id, +microfrontends_default_app_project_id, +network_id, +privatelink_endpoint_id, +project_id, +quota_entity_id, +reporting_project_id, +request_id, +sandbox_session_id, +sdk_key_id, +session_id, +step_run_id, +store_id, +visitor_id, +waf_rule_id, +workflow_run_id, +app_name, +asn_name, +attribution_event_name, +bot_name, +browser_name, +entry_name, +event_name, +flag_client_name, +key_name, +metric_name, +os_name, +privatelink_dns_name, +project_name, +queue_name, +reporting_project_name, +repository_name, +sandbox_name, +server_action_name, +store_name, +tag_name, +workflow_name, +workflow_step_name, +ai_model, +ai_model_type, +ai_provider, +attributes, +attribution_target, +auth_method, +billable_region, +blob_operation_level, +blob_operation_type, +bot_category, +bot_category_legacy, +bot_check_result, +bot_verified, +cache_api, +cache_creation_1h_input_tokens_currency, +cache_creation_input_tokens_currency, +cache_hit_level, +cache_hit_state, +cache_hostname, +cache_operation, +cache_path, +cache_reason, +cache_result, +cache_tags, +cached_input_tokens_currency, +cause, +client_ip, +client_ip_country, +client_ja_4_digest, +client_user_agent, +coding_agent, +commit_sha, +consumer_group, +content_capture_inputs, +content_capture_outputs, +content_capture_status, +content_type, +cost_currency, +count, +country, +data_cache_region, +deep_analysis_check, +device_type, +direction, +edge_network_region, +edge_type, +entry_revalidate_seconds, +environment, +error_code, +error_message, +event_data, +event_type, +external_rewrite_target_host, +external_rewrite_target_path, +fetch_index, +fetch_type, +flag_evaluation_reason, +flag_key, +flag_variant, +flags, +function_dispatcher, +function_region, +function_start_type, +gateway_cost_currency, +hipaa_requested, +http_accept, +http_status, +image_source, +image_transformation_region, +inference_endpoint_slug, +inference_geo_region, +inference_provider_region, +inference_scope, +is_additional_request, +is_byok, +is_prefetch_request, +is_private_model, +is_request_zdr, +is_streaming, +isr_action, +isr_cache_region, +market_cost_currency, +microfrontends_matched_path, +microfrontends_response_reason, +middleware_action, +middleware_action_target, +moderation_applied, +network_tenancy, +notification_url, +optimized_format_mime_type, +optimized_quality, +optimized_width_pixels, +origin_hostname, +origin_path, +origin_route, +path_type, +path_type_variant, +pii_redaction_applied, +ppr_state, +privatelink_ip_address, +provider, +provider_attempt_canonical_slug, +provider_attempt_credential_type, +provider_attempt_dev_safety_identifier, +provider_attempt_error, +provider_attempt_is_final, +provider_attempt_model_index, +provider_attempt_number, +provider_attempt_region, +provider_attempt_safety_identifier, +provider_attempt_status_code, +provider_attempt_success, +provider_attempt_timeout, +provider_attempt_total_in_request, +pull_request_number, +pull_request_state, +queue_region, +quota_entity_type, +quota_requested, +reason, +redirect_location, +referrer_hostname, +referrer_url, +region, +repository_owner, +request_api, +request_extension, +request_hostname, +request_method, +request_path, +request_resolved_ip, +requested_inference_region, +review_conclusion, +review_status, +rewrite_destination_hostname, +route, +rule_category, +runtime, +sdk_key_environment, +served_speed, +service, +skew_protection, +source, +source_image, +source_image_hash, +source_image_hostname, +source_image_pathname, +spec_version, +spend_attribution, +spend_report_date_part, +spend_report_group_by, +surcharge_cost_currency, +tool_call_error_type, +tool_call_provider, +tool_call_status_code, +tool_call_success, +tool_call_type, +traffic_source, +transcript_inputs, +transcript_outputs, +transcript_status, +triggering_tag, +utm_campaign, +utm_content, +utm_medium, +utm_source, +utm_term, +vdc_operation_origin, +video_aspect_ratio, +video_resolution, +virtual_model_kind, +virtual_model_slug, +visitors, +waf_action, +workflow_event_type, +workflow_status +FROM vercel.web_analytics.event_counts +WHERE project_id = '{{ project_id }}' -- required +AND since = '{{ since }}' +AND until = '{{ until }}' +AND filter = '{{ filter }}' +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + diff --git a/website/docs/services/web_analytics/index.md b/website/docs/services/web_analytics/index.md new file mode 100644 index 0000000..7bf10dd --- /dev/null +++ b/website/docs/services/web_analytics/index.md @@ -0,0 +1,37 @@ +--- +title: web_analytics +hide_title: false +hide_table_of_contents: false +keywords: + - web_analytics + - vercel + - stackql + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +web_analytics service documentation. + +:::info[Service Summary] + +total resources: __6__ + +::: + +## Resources + \ No newline at end of file diff --git a/website/docs/services/web_analytics/pageview_aggregates/index.md b/website/docs/services/web_analytics/pageview_aggregates/index.md new file mode 100644 index 0000000..8e05037 --- /dev/null +++ b/website/docs/services/web_analytics/pageview_aggregates/index.md @@ -0,0 +1,1496 @@ +--- +title: pageview_aggregates +hide_title: false +hide_table_of_contents: false +keywords: + - pageview_aggregates + - web_analytics + - vercel + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a pageview_aggregates resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string (wire: aiGatewayModelId)
string (wire: asnId)
string (wire: deploymentId)
string (wire: entryId)
string (wire: entryItemId)
string (wire: environmentId)
string (wire: generationId)
string (wire: keyId)
string (wire: messageId)
string (wire: microfrontendsDefaultAppDeploymentId)
string (wire: microfrontendsDefaultAppProjectId)
string (wire: networkId)
string (wire: privatelinkEndpointId)
string (wire: projectId)
string (wire: quotaEntityId)
string (wire: reportingProjectId)
string (wire: requestId)
string (wire: sandboxSessionId)
string (wire: sdkKeyId)
string (wire: sessionId)
string (wire: stepRunId)
string (wire: storeId)
string (wire: visitorId)
string (wire: wafRuleId)
string (wire: workflowRunId)
string (wire: appName)
string (wire: asnName)
string (wire: attributionEventName)
string (wire: botName)
string (wire: browserName)
string (wire: entryName)
string (wire: eventName)
string (wire: flagClientName)
string (wire: keyName)
string (wire: metricName)
string (wire: osName)
string (wire: privatelinkDnsName)
string (wire: projectName)
string (wire: queueName)
string (wire: reportingProjectName)
string (wire: repositoryName)
string (wire: sandboxName)
string (wire: serverActionName)
string (wire: storeName)
string (wire: tagName)
string (wire: workflowName)
string (wire: workflowStepName)
string (wire: aiModel)
string (wire: aiModelType)
string (wire: aiProvider)
string
string (wire: attributionTarget)
string (wire: authMethod)
string (wire: billableRegion)
string (wire: blobOperationLevel)
string (wire: blobOperationType)
string (wire: botCategory)
string (wire: botCategoryLegacy)
string (wire: botCheckResult)
string (wire: botVerified)
string (wire: cacheApi)
string (wire: cacheCreation1hInputTokensCurrency)
string (wire: cacheCreationInputTokensCurrency)
string (wire: cacheHitLevel)
string (wire: cacheHitState)
string (wire: cacheHostname)
string (wire: cacheOperation)
string (wire: cachePath)
string (wire: cacheReason)
string (wire: cacheResult)
string (wire: cacheTags)
string (wire: cachedInputTokensCurrency)
string
string (wire: clientIp)
string (wire: clientIpCountry)
string (wire: clientJa4Digest)
string (wire: clientUserAgent)
string (wire: codingAgent)
string (wire: commitSha)
string (wire: consumerGroup)
string (wire: contentCaptureInputs)
string (wire: contentCaptureOutputs)
string (wire: contentCaptureStatus)
string (wire: contentType)
string (wire: costCurrency)
string
string (wire: dataCacheRegion)
string (wire: deepAnalysisCheck)
string (wire: deviceType)
string
string (wire: edgeNetworkRegion)
string (wire: edgeType)
string (wire: entryRevalidateSeconds)
string
string (wire: errorCode)
string (wire: errorMessage)
string (wire: eventData)
string (wire: eventType)
string (wire: externalRewriteTargetHost)
string (wire: externalRewriteTargetPath)
string (wire: fetchIndex)
string (wire: fetchType)
string (wire: flagEvaluationReason)
string (wire: flagKey)
string (wire: flagVariant)
string
string (wire: functionDispatcher)
string (wire: functionRegion)
string (wire: functionStartType)
string (wire: gatewayCostCurrency)
string (wire: hipaaRequested)
string (wire: httpAccept)
string (wire: httpStatus)
string (wire: imageSource)
string (wire: imageTransformationRegion)
string (wire: inferenceEndpointSlug)
string (wire: inferenceGeoRegion)
string (wire: inferenceProviderRegion)
string (wire: inferenceScope)
string (wire: isAdditionalRequest)
string (wire: isByok)
string (wire: isPrefetchRequest)
string (wire: isPrivateModel)
string (wire: isRequestZdr)
string (wire: isStreaming)
string (wire: isrAction)
string (wire: isrCacheRegion)
string (wire: marketCostCurrency)
string (wire: microfrontendsMatchedPath)
string (wire: microfrontendsResponseReason)
string (wire: middlewareAction)
string (wire: middlewareActionTarget)
string (wire: moderationApplied)
string (wire: networkTenancy)
string (wire: notificationUrl)
string (wire: optimizedFormatMimeType)
string (wire: optimizedQuality)
string (wire: optimizedWidthPixels)
string (wire: originHostname)
string (wire: originPath)
string (wire: originRoute)
string (wire: pathType)
string (wire: pathTypeVariant)
string (wire: piiRedactionApplied)
string (wire: pprState)
string (wire: privatelinkIpAddress)
string
string (wire: providerAttemptCanonicalSlug)
string (wire: providerAttemptCredentialType)
string (wire: providerAttemptDevSafetyIdentifier)
string (wire: providerAttemptError)
string (wire: providerAttemptIsFinal)
string (wire: providerAttemptModelIndex)
string (wire: providerAttemptNumber)
string (wire: providerAttemptRegion)
string (wire: providerAttemptSafetyIdentifier)
string (wire: providerAttemptStatusCode)
string (wire: providerAttemptSuccess)
string (wire: providerAttemptTimeout)
string (wire: providerAttemptTotalInRequest)
string (wire: pullRequestNumber)
string (wire: pullRequestState)
string (wire: queueRegion)
string (wire: quotaEntityType)
string (wire: quotaRequested)
string
string (wire: redirectLocation)
string (wire: referrerHostname)
string (wire: referrerUrl)
string
string (wire: repositoryOwner)
string (wire: requestApi)
string (wire: requestExtension)
string (wire: requestHostname)
string (wire: requestMethod)
string (wire: requestPath)
string (wire: requestResolvedIp)
string (wire: requestedInferenceRegion)
string (wire: reviewConclusion)
string (wire: reviewStatus)
string (wire: rewriteDestinationHostname)
string
string (wire: ruleCategory)
string
string (wire: sdkKeyEnvironment)
string (wire: servedSpeed)
string
string (wire: skewProtection)
string
string (wire: sourceImage)
string (wire: sourceImageHash)
string (wire: sourceImageHostname)
string (wire: sourceImagePathname)
string (wire: specVersion)
string (wire: spendAttribution)
string (wire: spendReportDatePart)
string (wire: spendReportGroupBy)
string (wire: surchargeCostCurrency)
string (date-time)
string (wire: toolCallErrorType)
string (wire: toolCallProvider)
string (wire: toolCallStatusCode)
string (wire: toolCallSuccess)
string (wire: toolCallType)
string (wire: trafficSource)
string (wire: transcriptInputs)
string (wire: transcriptOutputs)
string (wire: transcriptStatus)
string (wire: triggeringTag)
string (wire: utmCampaign)
string (wire: utmContent)
string (wire: utmMedium)
string (wire: utmSource)
string (wire: utmTerm)
string (wire: vdcOperationOrigin)
string (wire: videoAspectRatio)
string (wire: videoResolution)
string (wire: virtualModelKind)
string (wire: virtualModelSlug)
string (wire: wafAction)
string (wire: workflowEventType)
string (wire: workflowStatus)
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
project_id, by, since, untillimit, filter, team_id, slugCounts pageviews on a project, within the requested date range. Results are either aggregated or broken down over time. Results can additionally be broken down by one dimension, and filtered by multiple dimensions.
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
arrayUp to two dimensions used to break down results. At most one time granularity is allowed: hour, day, week, month, year. Other dimensions: country, deviceType, environment, requestPath, referrerHostname, osName, browserName, route, utmSource, utmMedium, utmCampaign, utmContent, utmTerm. JSON dimensions: flags. Used bare, it breaks down results by key, for example flags returns one group per flag name. With a key, it breaks down results by that key's value, for example flags/beta_banner. Wrap keys containing characters other than letters, digits, and underscores in single quotes, for example flags/'my-flag'.
stringThe project identifier or the project name (wire: projectId)
Timestamp in milliseconds, or a valid Date string. Selects data from (including) this date and time. Will be adjusted according to the desired time granularity.
Timestamp in milliseconds, or a valid Date string. Selects data until (including) this date. Will be adjusted according to the desired time granularity.
stringOData-compliant filter. Encode the value when sending it in a URL. Allows filtering on one or multiple dimensions. By default, filters for production environment only. Supported dimensions: country, deviceType, environment, requestPath, referrerHostname, osName, browserName, route, utmSource, utmMedium, utmCampaign, utmContent, utmTerm. JSON dimensions filtered by key: flags/<name>, for example flags/beta_banner eq 'true'. Wrap keys containing characters other than letters, digits, and underscores in single quotes, for example flags/'my-flag' eq 'true'. Supported operations include eq, ne, in, and logical operators and, or, not with parentheses. Functions such as startswith are supported by the OData parser.
integerNumber of distinct results, default to 10. Other results are grouped into "Others" group.
stringThe Team slug to perform the request on behalf of.
stringThe Team identifier to perform the request on behalf of. (wire: teamId)
+ +## `SELECT` examples + + + + +Counts pageviews on a project, within the requested date range. Results are either aggregated or broken down over time. Results can additionally be broken down by one dimension, and filtered by multiple dimensions. + +```sql +SELECT +ai_gateway_model_id, +asn_id, +deployment_id, +entry_id, +entry_item_id, +environment_id, +generation_id, +key_id, +message_id, +microfrontends_default_app_deployment_id, +microfrontends_default_app_project_id, +network_id, +privatelink_endpoint_id, +project_id, +quota_entity_id, +reporting_project_id, +request_id, +sandbox_session_id, +sdk_key_id, +session_id, +step_run_id, +store_id, +visitor_id, +waf_rule_id, +workflow_run_id, +app_name, +asn_name, +attribution_event_name, +bot_name, +browser_name, +entry_name, +event_name, +flag_client_name, +key_name, +metric_name, +os_name, +privatelink_dns_name, +project_name, +queue_name, +reporting_project_name, +repository_name, +sandbox_name, +server_action_name, +store_name, +tag_name, +workflow_name, +workflow_step_name, +ai_model, +ai_model_type, +ai_provider, +attributes, +attribution_target, +auth_method, +billable_region, +blob_operation_level, +blob_operation_type, +bot_category, +bot_category_legacy, +bot_check_result, +bot_verified, +cache_api, +cache_creation_1h_input_tokens_currency, +cache_creation_input_tokens_currency, +cache_hit_level, +cache_hit_state, +cache_hostname, +cache_operation, +cache_path, +cache_reason, +cache_result, +cache_tags, +cached_input_tokens_currency, +cause, +client_ip, +client_ip_country, +client_ja_4_digest, +client_user_agent, +coding_agent, +commit_sha, +consumer_group, +content_capture_inputs, +content_capture_outputs, +content_capture_status, +content_type, +cost_currency, +country, +data_cache_region, +deep_analysis_check, +device_type, +direction, +edge_network_region, +edge_type, +entry_revalidate_seconds, +environment, +error_code, +error_message, +event_data, +event_type, +external_rewrite_target_host, +external_rewrite_target_path, +fetch_index, +fetch_type, +flag_evaluation_reason, +flag_key, +flag_variant, +flags, +function_dispatcher, +function_region, +function_start_type, +gateway_cost_currency, +hipaa_requested, +http_accept, +http_status, +image_source, +image_transformation_region, +inference_endpoint_slug, +inference_geo_region, +inference_provider_region, +inference_scope, +is_additional_request, +is_byok, +is_prefetch_request, +is_private_model, +is_request_zdr, +is_streaming, +isr_action, +isr_cache_region, +market_cost_currency, +microfrontends_matched_path, +microfrontends_response_reason, +middleware_action, +middleware_action_target, +moderation_applied, +network_tenancy, +notification_url, +optimized_format_mime_type, +optimized_quality, +optimized_width_pixels, +origin_hostname, +origin_path, +origin_route, +path_type, +path_type_variant, +pii_redaction_applied, +ppr_state, +privatelink_ip_address, +provider, +provider_attempt_canonical_slug, +provider_attempt_credential_type, +provider_attempt_dev_safety_identifier, +provider_attempt_error, +provider_attempt_is_final, +provider_attempt_model_index, +provider_attempt_number, +provider_attempt_region, +provider_attempt_safety_identifier, +provider_attempt_status_code, +provider_attempt_success, +provider_attempt_timeout, +provider_attempt_total_in_request, +pull_request_number, +pull_request_state, +queue_region, +quota_entity_type, +quota_requested, +reason, +redirect_location, +referrer_hostname, +referrer_url, +region, +repository_owner, +request_api, +request_extension, +request_hostname, +request_method, +request_path, +request_resolved_ip, +requested_inference_region, +review_conclusion, +review_status, +rewrite_destination_hostname, +route, +rule_category, +runtime, +sdk_key_environment, +served_speed, +service, +skew_protection, +source, +source_image, +source_image_hash, +source_image_hostname, +source_image_pathname, +spec_version, +spend_attribution, +spend_report_date_part, +spend_report_group_by, +surcharge_cost_currency, +timestamp, +tool_call_error_type, +tool_call_provider, +tool_call_status_code, +tool_call_success, +tool_call_type, +traffic_source, +transcript_inputs, +transcript_outputs, +transcript_status, +triggering_tag, +utm_campaign, +utm_content, +utm_medium, +utm_source, +utm_term, +vdc_operation_origin, +video_aspect_ratio, +video_resolution, +virtual_model_kind, +virtual_model_slug, +waf_action, +workflow_event_type, +workflow_status +FROM vercel.web_analytics.pageview_aggregates +WHERE project_id = '{{ project_id }}' -- required +AND by = '{{ by }}' -- required +AND since = '{{ since }}' -- required +AND until = '{{ until }}' -- required +AND limit = '{{ limit }}' +AND filter = '{{ filter }}' +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + diff --git a/website/docs/services/web_analytics/pageview_counts/index.md b/website/docs/services/web_analytics/pageview_counts/index.md new file mode 100644 index 0000000..8150559 --- /dev/null +++ b/website/docs/services/web_analytics/pageview_counts/index.md @@ -0,0 +1,1490 @@ +--- +title: pageview_counts +hide_title: false +hide_table_of_contents: false +keywords: + - pageview_counts + - web_analytics + - vercel + - infrastructure-as-code + - configuration-as-data + - cloud inventory +description: Query, deploy and manage vercel resources using SQL +custom_edit_url: null +image: /img/stackql-vercel-provider-featured-image.png +--- + +import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Creates, updates, deletes, gets or lists a pageview_counts resource. + +## Overview + + + + +
Name
TypeResource
Id
+ +## Fields + +The following fields are returned by `SELECT` queries: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
string (wire: aiGatewayModelId)
string (wire: asnId)
string (wire: deploymentId)
string (wire: entryId)
string (wire: entryItemId)
string (wire: environmentId)
string (wire: generationId)
string (wire: keyId)
string (wire: messageId)
string (wire: microfrontendsDefaultAppDeploymentId)
string (wire: microfrontendsDefaultAppProjectId)
string (wire: networkId)
string (wire: privatelinkEndpointId)
string (wire: projectId)
string (wire: quotaEntityId)
string (wire: reportingProjectId)
string (wire: requestId)
string (wire: sandboxSessionId)
string (wire: sdkKeyId)
string (wire: sessionId)
string (wire: stepRunId)
string (wire: storeId)
string (wire: visitorId)
string (wire: wafRuleId)
string (wire: workflowRunId)
string (wire: appName)
string (wire: asnName)
string (wire: attributionEventName)
string (wire: botName)
string (wire: browserName)
string (wire: entryName)
string (wire: eventName)
string (wire: flagClientName)
string (wire: keyName)
string (wire: metricName)
string (wire: osName)
string (wire: privatelinkDnsName)
string (wire: projectName)
string (wire: queueName)
string (wire: reportingProjectName)
string (wire: repositoryName)
string (wire: sandboxName)
string (wire: serverActionName)
string (wire: storeName)
string (wire: tagName)
string (wire: workflowName)
string (wire: workflowStepName)
string (wire: aiModel)
string (wire: aiModelType)
string (wire: aiProvider)
string
string (wire: attributionTarget)
string (wire: authMethod)
string (wire: billableRegion)
string (wire: blobOperationLevel)
string (wire: blobOperationType)
string (wire: botCategory)
string (wire: botCategoryLegacy)
string (wire: botCheckResult)
string (wire: botVerified)
string (wire: cacheApi)
string (wire: cacheCreation1hInputTokensCurrency)
string (wire: cacheCreationInputTokensCurrency)
string (wire: cacheHitLevel)
string (wire: cacheHitState)
string (wire: cacheHostname)
string (wire: cacheOperation)
string (wire: cachePath)
string (wire: cacheReason)
string (wire: cacheResult)
string (wire: cacheTags)
string (wire: cachedInputTokensCurrency)
string
string (wire: clientIp)
string (wire: clientIpCountry)
string (wire: clientJa4Digest)
string (wire: clientUserAgent)
string (wire: codingAgent)
string (wire: commitSha)
string (wire: consumerGroup)
string (wire: contentCaptureInputs)
string (wire: contentCaptureOutputs)
string (wire: contentCaptureStatus)
string (wire: contentType)
string (wire: costCurrency)
string
string (wire: dataCacheRegion)
string (wire: deepAnalysisCheck)
string (wire: deviceType)
string
string (wire: edgeNetworkRegion)
string (wire: edgeType)
string (wire: entryRevalidateSeconds)
string
string (wire: errorCode)
string (wire: errorMessage)
string (wire: eventData)
string (wire: eventType)
string (wire: externalRewriteTargetHost)
string (wire: externalRewriteTargetPath)
string (wire: fetchIndex)
string (wire: fetchType)
string (wire: flagEvaluationReason)
string (wire: flagKey)
string (wire: flagVariant)
string
string (wire: functionDispatcher)
string (wire: functionRegion)
string (wire: functionStartType)
string (wire: gatewayCostCurrency)
string (wire: hipaaRequested)
string (wire: httpAccept)
string (wire: httpStatus)
string (wire: imageSource)
string (wire: imageTransformationRegion)
string (wire: inferenceEndpointSlug)
string (wire: inferenceGeoRegion)
string (wire: inferenceProviderRegion)
string (wire: inferenceScope)
string (wire: isAdditionalRequest)
string (wire: isByok)
string (wire: isPrefetchRequest)
string (wire: isPrivateModel)
string (wire: isRequestZdr)
string (wire: isStreaming)
string (wire: isrAction)
string (wire: isrCacheRegion)
string (wire: marketCostCurrency)
string (wire: microfrontendsMatchedPath)
string (wire: microfrontendsResponseReason)
string (wire: middlewareAction)
string (wire: middlewareActionTarget)
string (wire: moderationApplied)
string (wire: networkTenancy)
string (wire: notificationUrl)
string (wire: optimizedFormatMimeType)
string (wire: optimizedQuality)
string (wire: optimizedWidthPixels)
string (wire: originHostname)
string (wire: originPath)
string (wire: originRoute)
number
string (wire: pathType)
string (wire: pathTypeVariant)
string (wire: piiRedactionApplied)
string (wire: pprState)
string (wire: privatelinkIpAddress)
string
string (wire: providerAttemptCanonicalSlug)
string (wire: providerAttemptCredentialType)
string (wire: providerAttemptDevSafetyIdentifier)
string (wire: providerAttemptError)
string (wire: providerAttemptIsFinal)
string (wire: providerAttemptModelIndex)
string (wire: providerAttemptNumber)
string (wire: providerAttemptRegion)
string (wire: providerAttemptSafetyIdentifier)
string (wire: providerAttemptStatusCode)
string (wire: providerAttemptSuccess)
string (wire: providerAttemptTimeout)
string (wire: providerAttemptTotalInRequest)
string (wire: pullRequestNumber)
string (wire: pullRequestState)
string (wire: queueRegion)
string (wire: quotaEntityType)
string (wire: quotaRequested)
string
string (wire: redirectLocation)
string (wire: referrerHostname)
string (wire: referrerUrl)
string
string (wire: repositoryOwner)
string (wire: requestApi)
string (wire: requestExtension)
string (wire: requestHostname)
string (wire: requestMethod)
string (wire: requestPath)
string (wire: requestResolvedIp)
string (wire: requestedInferenceRegion)
string (wire: reviewConclusion)
string (wire: reviewStatus)
string (wire: rewriteDestinationHostname)
string
string (wire: ruleCategory)
string
string (wire: sdkKeyEnvironment)
string (wire: servedSpeed)
string
string (wire: skewProtection)
string
string (wire: sourceImage)
string (wire: sourceImageHash)
string (wire: sourceImageHostname)
string (wire: sourceImagePathname)
string (wire: specVersion)
string (wire: spendAttribution)
string (wire: spendReportDatePart)
string (wire: spendReportGroupBy)
string (wire: surchargeCostCurrency)
string (wire: toolCallErrorType)
string (wire: toolCallProvider)
string (wire: toolCallStatusCode)
string (wire: toolCallSuccess)
string (wire: toolCallType)
string (wire: trafficSource)
string (wire: transcriptInputs)
string (wire: transcriptOutputs)
string (wire: transcriptStatus)
string (wire: triggeringTag)
string (wire: utmCampaign)
string (wire: utmContent)
string (wire: utmMedium)
string (wire: utmSource)
string (wire: utmTerm)
string (wire: vdcOperationOrigin)
string (wire: videoAspectRatio)
string (wire: videoResolution)
string (wire: virtualModelKind)
string (wire: virtualModelSlug)
number
string (wire: wafAction)
string (wire: workflowEventType)
string (wire: workflowStatus)
+
+
+ +## Methods + +The following methods are available for this resource: + + + + + + + + + + + + + + + + + + + + +
NameAccessible byRequired ParamsOptional ParamsDescription
project_idsince, until, filter, team_id, slugCounts the number of page views on a project (production only), since Web Analytics was enabled. Results can be filtered on supported dimensions.
+ +## Parameters + +Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](#methods) section to see which parameters are required or optional for each operation. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDatatypeDescription
stringThe project identifier or the project name (wire: projectId)
stringOData-compliant filter. Encode the value when sending it in a URL. Allows filtering on one or multiple dimensions. Supported dimensions: country, deviceType, environment, requestPath, referrerHostname, osName, browserName, route, utmSource, utmMedium, utmCampaign, utmContent, utmTerm. JSON dimensions filtered by key: flags/<name>, for example flags/beta_banner eq 'true'. Wrap keys containing characters other than letters, digits, and underscores in single quotes, for example flags/'my-flag' eq 'true'. Supported operations include eq, ne, in, and logical operators and, or, not with parentheses. Functions such as startswith are supported by the OData parser.
Timestamp in milliseconds, or a valid Date string. Selects data from (including) this date and time. Will be adjusted according to the desired time granularity.
stringThe Team slug to perform the request on behalf of.
stringThe Team identifier to perform the request on behalf of. (wire: teamId)
Timestamp in milliseconds, or a valid Date string. Selects data until (including) this date. Will be adjusted according to the desired time granularity.
+ +## `SELECT` examples + + + + +Counts the number of page views on a project (production only), since Web Analytics was enabled. Results can be filtered on supported dimensions. + +```sql +SELECT +ai_gateway_model_id, +asn_id, +deployment_id, +entry_id, +entry_item_id, +environment_id, +generation_id, +key_id, +message_id, +microfrontends_default_app_deployment_id, +microfrontends_default_app_project_id, +network_id, +privatelink_endpoint_id, +project_id, +quota_entity_id, +reporting_project_id, +request_id, +sandbox_session_id, +sdk_key_id, +session_id, +step_run_id, +store_id, +visitor_id, +waf_rule_id, +workflow_run_id, +app_name, +asn_name, +attribution_event_name, +bot_name, +browser_name, +entry_name, +event_name, +flag_client_name, +key_name, +metric_name, +os_name, +privatelink_dns_name, +project_name, +queue_name, +reporting_project_name, +repository_name, +sandbox_name, +server_action_name, +store_name, +tag_name, +workflow_name, +workflow_step_name, +ai_model, +ai_model_type, +ai_provider, +attributes, +attribution_target, +auth_method, +billable_region, +blob_operation_level, +blob_operation_type, +bot_category, +bot_category_legacy, +bot_check_result, +bot_verified, +cache_api, +cache_creation_1h_input_tokens_currency, +cache_creation_input_tokens_currency, +cache_hit_level, +cache_hit_state, +cache_hostname, +cache_operation, +cache_path, +cache_reason, +cache_result, +cache_tags, +cached_input_tokens_currency, +cause, +client_ip, +client_ip_country, +client_ja_4_digest, +client_user_agent, +coding_agent, +commit_sha, +consumer_group, +content_capture_inputs, +content_capture_outputs, +content_capture_status, +content_type, +cost_currency, +country, +data_cache_region, +deep_analysis_check, +device_type, +direction, +edge_network_region, +edge_type, +entry_revalidate_seconds, +environment, +error_code, +error_message, +event_data, +event_type, +external_rewrite_target_host, +external_rewrite_target_path, +fetch_index, +fetch_type, +flag_evaluation_reason, +flag_key, +flag_variant, +flags, +function_dispatcher, +function_region, +function_start_type, +gateway_cost_currency, +hipaa_requested, +http_accept, +http_status, +image_source, +image_transformation_region, +inference_endpoint_slug, +inference_geo_region, +inference_provider_region, +inference_scope, +is_additional_request, +is_byok, +is_prefetch_request, +is_private_model, +is_request_zdr, +is_streaming, +isr_action, +isr_cache_region, +market_cost_currency, +microfrontends_matched_path, +microfrontends_response_reason, +middleware_action, +middleware_action_target, +moderation_applied, +network_tenancy, +notification_url, +optimized_format_mime_type, +optimized_quality, +optimized_width_pixels, +origin_hostname, +origin_path, +origin_route, +pageviews, +path_type, +path_type_variant, +pii_redaction_applied, +ppr_state, +privatelink_ip_address, +provider, +provider_attempt_canonical_slug, +provider_attempt_credential_type, +provider_attempt_dev_safety_identifier, +provider_attempt_error, +provider_attempt_is_final, +provider_attempt_model_index, +provider_attempt_number, +provider_attempt_region, +provider_attempt_safety_identifier, +provider_attempt_status_code, +provider_attempt_success, +provider_attempt_timeout, +provider_attempt_total_in_request, +pull_request_number, +pull_request_state, +queue_region, +quota_entity_type, +quota_requested, +reason, +redirect_location, +referrer_hostname, +referrer_url, +region, +repository_owner, +request_api, +request_extension, +request_hostname, +request_method, +request_path, +request_resolved_ip, +requested_inference_region, +review_conclusion, +review_status, +rewrite_destination_hostname, +route, +rule_category, +runtime, +sdk_key_environment, +served_speed, +service, +skew_protection, +source, +source_image, +source_image_hash, +source_image_hostname, +source_image_pathname, +spec_version, +spend_attribution, +spend_report_date_part, +spend_report_group_by, +surcharge_cost_currency, +tool_call_error_type, +tool_call_provider, +tool_call_status_code, +tool_call_success, +tool_call_type, +traffic_source, +transcript_inputs, +transcript_outputs, +transcript_status, +triggering_tag, +utm_campaign, +utm_content, +utm_medium, +utm_source, +utm_term, +vdc_operation_origin, +video_aspect_ratio, +video_resolution, +virtual_model_kind, +virtual_model_slug, +visitors, +waf_action, +workflow_event_type, +workflow_status +FROM vercel.web_analytics.pageview_counts +WHERE project_id = '{{ project_id }}' -- required +AND since = '{{ since }}' +AND until = '{{ until }}' +AND filter = '{{ filter }}' +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' +; +``` + + diff --git a/website/docs/services/billing_settings/data_cache/index.md b/website/docs/services/web_analytics/speed_insights/index.md similarity index 62% rename from website/docs/services/billing_settings/data_cache/index.md rename to website/docs/services/web_analytics/speed_insights/index.md index ef30107..e5f87ba 100644 --- a/website/docs/services/billing_settings/data_cache/index.md +++ b/website/docs/services/web_analytics/speed_insights/index.md @@ -1,10 +1,10 @@ --- -title: data_cache +title: speed_insights hide_title: false hide_table_of_contents: false keywords: - - data_cache - - billing_settings + - speed_insights + - web_analytics - vercel - infrastructure-as-code - configuration-as-data @@ -15,16 +15,17 @@ image: /img/stackql-vercel-provider-featured-image.png --- import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; -Creates, updates, deletes, gets or lists a data_cache resource. +Creates, updates, deletes, gets or lists a speed_insights resource. ## Overview - + - +
Namedata_cache
Name
TypeResource
Id
Id
## Fields @@ -50,9 +51,9 @@ The following methods are available for this resource: - + - + projectId, value @@ -72,26 +73,34 @@ Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](# + + + string + + ## Lifecycle Methods +EXEC variables use wire (API) names. + - + No description available. ```sql -EXEC vercel.billing_settings.data_cache.enable_excess_billing +EXEC vercel.web_analytics.speed_insights.toggle +@projectId='{{ projectId }}' --required @@json= '{ -"excessBillingEnabled": {{ excessBillingEnabled }} +"value": {{ value }} }' ; ``` diff --git a/website/docs/services/cache/data_cache_purge_all/index.md b/website/docs/services/web_analytics/web_insights/index.md similarity index 63% rename from website/docs/services/cache/data_cache_purge_all/index.md rename to website/docs/services/web_analytics/web_insights/index.md index a10b893..115b603 100644 --- a/website/docs/services/cache/data_cache_purge_all/index.md +++ b/website/docs/services/web_analytics/web_insights/index.md @@ -1,10 +1,10 @@ --- -title: data_cache_purge_all +title: web_insights hide_title: false hide_table_of_contents: false keywords: - - data_cache_purge_all - - cache + - web_insights + - web_analytics - vercel - infrastructure-as-code - configuration-as-data @@ -15,16 +15,17 @@ image: /img/stackql-vercel-provider-featured-image.png --- import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; -Creates, updates, deletes, gets or lists a data_cache_purge_all resource. +Creates, updates, deletes, gets or lists a web_insights resource. ## Overview - + - +
Namedata_cache_purge_all
Name
TypeResource
Id
Id
## Fields @@ -50,9 +51,9 @@ The following methods are available for this resource: - + - projectIdOrName + projectId, value @@ -72,8 +73,8 @@ Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](# - - + + string @@ -82,19 +83,25 @@ Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](# ## Lifecycle Methods +EXEC variables use wire (API) names. + - + No description available. ```sql -EXEC vercel.cache.data_cache_purge_all.purge_all -@projectIdOrName='{{ projectIdOrName }}' --required +EXEC vercel.web_analytics.web_insights.toggle +@projectId='{{ projectId }}' --required +@@json= +'{ +"value": {{ value }} +}' ; ``` diff --git a/website/docs/services/webhooks/webhooks/index.md b/website/docs/services/webhooks/webhooks/index.md index beeaee2..528c0e1 100644 --- a/website/docs/services/webhooks/webhooks/index.md +++ b/website/docs/services/webhooks/webhooks/index.md @@ -15,6 +15,7 @@ image: /img/stackql-vercel-provider-featured-image.png --- import CopyableCode from '@site/src/components/CopyableCode/CopyableCode'; +import CodeBlock from '@theme/CodeBlock'; import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; @@ -22,7 +23,7 @@ Creates, updates, deletes, gets or lists a webhooks resource. ## Overview - +
Namewebhooks
Name
TypeResource
Id
@@ -32,13 +33,13 @@ Creates, updates, deletes, gets or lists a webhooks resource. The following fields are returned by `SELECT` queries: - + @@ -55,9 +56,19 @@ The following fields are returned by `SELECT` queries: - + + + + + + + + + + + - + @@ -65,29 +76,24 @@ The following fields are returned by `SELECT` queries: - - - - - - + - + - + - + - +
The webhook id (example: account_hook_GflD6EYyo7F4ViYS)
stringThe unique ID of the team the webhook belongs to (example: ZspSRT4ljIEEmMHgoDwKWDei) (wire: ownerId)
array (wire: alertRuleIds)
numberA number containing the date when the webhook was created in in millisecondsA number containing the date when the webhook was created in in milliseconds (wire: createdAt)
The webhooks events (example: deployment.created)
stringThe unique ID of the team the webhook belongs to (example: ZspSRT4ljIEEmMHgoDwKWDei)
arrayThe ID of the projects the webhook is associated withThe ID of the projects the webhook is associated with (wire: projectIds)
numberA number containing the date when the webhook was updated in in millisecondsA number containing the date when the webhook was updated in in milliseconds (wire: updatedAt)
stringA string with the URL of the webhook (example: https://my-webhook.com)A string with the URL of the webhook (example: https:​//my-webhook.com)
- + @@ -98,6 +104,51 @@ The following fields are returned by `SELECT` queries: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
stringThe webhook id (example: account_hook_GflD6EYyo7F4ViYS)
stringThe unique ID of the team the webhook belongs to (example: ZspSRT4ljIEEmMHgoDwKWDei) (wire: ownerId)
array (wire: alertRuleIds)
numberA number containing the date when the webhook was created in in milliseconds (wire: createdAt)
arrayThe webhooks events (example: deployment.created)
arrayThe ID of the projects the webhook is associated with (wire: projectIds)
array (wire: projectsMetadata)
numberA number containing the date when the webhook was updated in in milliseconds (wire: updatedAt)
stringA string with the URL of the webhook (example: https:​//my-webhook.com)
@@ -119,31 +170,31 @@ The following methods are available for this resource: - + - id, teamId - + id + team_id, slug Get a webhook - + - teamId - projectId + + project_id, team_id, slug Get a list of webhooks - + - teamId, data__url, data__events - + url, events + team_id, slug Creates a webhook - + - id, teamId - + id + team_id, slug Deletes a webhook @@ -167,15 +218,20 @@ Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](# string - - + + string - The Team identifier or slug to perform the request on behalf of. + (wire: projectId) - - + + string - + The Team slug to perform the request on behalf of. + + + + string + The Team identifier to perform the request on behalf of. (wire: teamId) @@ -183,41 +239,52 @@ Parameters can be passed in the `WHERE` clause of a query. Check the [Methods](# ## `SELECT` examples - + Get a webhook ```sql SELECT id, -createdAt, +owner_id, +alert_rule_ids, +created_at, events, -ownerId, -projectIds, -updatedAt, +project_ids, +updated_at, url FROM vercel.webhooks.webhooks WHERE id = '{{ id }}' -- required -AND teamId = '{{ teamId }}' -- required +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' ; ``` - + Get a list of webhooks ```sql SELECT -* +id, +owner_id, +alert_rule_ids, +created_at, +events, +project_ids, +projects_metadata, +updated_at, +url FROM vercel.webhooks.webhooks -WHERE teamId = '{{ teamId }}' -- required -AND projectId = '{{ projectId }}' +WHERE project_id = '{{ project_id }}' +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' ; ``` @@ -227,56 +294,66 @@ AND projectId = '{{ projectId }}' ## `INSERT` examples - + Creates a webhook ```sql INSERT INTO vercel.webhooks.webhooks ( -data__url, -data__events, -data__projectIds, -teamId +url, +events, +project_ids, +team_id, +slug ) SELECT '{{ url }}' /* required */, '{{ events }}' /* required */, -'{{ projectIds }}', -'{{ teamId }}' +'{{ project_ids }}', +'{{ team_id }}', +'{{ slug }}' RETURNING id, -createdAt, +owner_id, +alert_rule_ids, +created_at, events, -ownerId, -projectIds, +project_ids, secret, -updatedAt, +updated_at, url ; ``` -```yaml -# Description fields are for documentation purposes +{`# Description fields are for documentation purposes - name: webhooks props: - - name: teamId - value: string - description: Required parameter for the webhooks resource. - name: url - value: string + value: "{{ url }}" - name: events - value: array - - name: projectIds - value: array -``` + value: + - "{{ events }}" + - name: project_ids + value: + - "{{ project_ids }}" + - name: team_id + value: "{{ team_id }}" + description: The Team identifier to perform the request on behalf of. + description: The Team identifier to perform the request on behalf of. + - name: slug + value: "{{ slug }}" + description: The Team slug to perform the request on behalf of. + description: The Team slug to perform the request on behalf of. +`} + @@ -284,19 +361,20 @@ url ## `DELETE` examples - + Deletes a webhook ```sql DELETE FROM vercel.webhooks.webhooks WHERE id = '{{ id }}' --required -AND teamId = '{{ teamId }}' --required +AND team_id = '{{ team_id }}' +AND slug = '{{ slug }}' ; ``` diff --git a/website/docusaurus.config.js b/website/docusaurus.config.js index e6e3e3c..1c65881 100644 --- a/website/docusaurus.config.js +++ b/website/docusaurus.config.js @@ -1,232 +1,40 @@ -// @ts-check -// `@type` JSDoc annotations allow editor autocompletion and type checking -// (when paired with `@ts-check`). -// There are various equivalent ways to declare your Docusaurus config. -// See: https://docusaurus.io/docs/api/docusaurus-config - import {themes as prismThemes} from 'prism-react-renderer'; - -// Provider configuration - change these for different providers -const providerName = "vercel"; -const providerTitle = "Vercel"; - -const providerDropDownListItems = [ - { - label: 'AWS', - to: '/providers/aws', - }, - { - label: 'Azure', - to: '/providers/azure', - }, - { - label: 'Google', - to: '/providers/google', - }, - { - label: 'Databricks', - to: '/providers/databricks', - }, - { - label: 'Snowflake', - to: '/providers/snowflake', - }, - { - label: 'Confluent', - to: '/providers/confluent', - }, - { - label: 'Okta', - to: '/providers/okta', - }, - { - label: 'GitHub', - to: '/providers/github', - }, - { - label: 'OpenAI', - to: '/providers/openai', - }, - { - label: '... More', - to: '/providers', - }, -]; - -const footerStackQLItems = [ - { - label: 'Documentation', - to: '/stackqldocs', - }, - { - label: 'Install', - to: '/install', - }, - { - label: 'Contact us', - to: '/contact-us', - }, -]; - -const footerMoreItems = [ - { - label: 'Providers', - to: '/providers', - }, - { - label: 'stackql-deploy', - to: '/stackql-deploy', - }, - { - label: 'Blog', - to: '/blog', - }, - { - label: 'Tutorials', - to: '/tutorials', - }, -]; - -// This runs in Node.js - Don't use client-side code here (browser APIs, JSX...) - -/** @type {import('@docusaurus/types').Config} */ -const config = { - title: `StackQL ${providerTitle} Provider`, - tagline: `Query and Provision ${providerTitle} Resources using StackQL`, - favicon: 'img/favicon.ico', - staticDirectories: ['static'], - // Future flags, see https://docusaurus.io/docs/api/docusaurus-config#future - future: { - v4: true, // Improve compatibility with the upcoming Docusaurus v4 - }, - - // Set the production url of your site here - url: `https://${providerName}-provider.stackql.io`, - // Set the // pathname under which your site is served - // For GitHub pages deployment, it is often '//' - baseUrl: '/', - - // GitHub pages deployment config. - // If you aren't using GitHub pages, you don't need these. - organizationName: 'stackql', // Usually your GitHub org/user name. - projectName: `stackql-provider-${providerName}`, // Usually your repo name. - - onBrokenLinks: 'warn', - onBrokenMarkdownLinks: 'warn', - - // Even if you don't use internationalization, you can use this field to set - // useful metadata like html lang. For example, if your site is Chinese, you - // may want to replace "en" with "zh-Hans". - i18n: { - defaultLocale: 'en', - locales: ['en'], - }, - - presets: [ - [ - 'classic', - /** @type {import('@docusaurus/preset-classic').Options} */ - ({ - docs: { - sidebarPath: './sidebars.js', - // Please change this to your repo. - // Remove this to remove the "edit this page" links. - // editUrl: 'https://github.com/stackql/stackql-deploy/tree/main/website/', - routeBasePath: '/', // Set the docs to be the root of the site - }, - theme: { - customCss: './src/css/custom.css', - }, - }), - ], - ], - - themeConfig: - /** @type {import('@docusaurus/preset-classic').ThemeConfig} */ - ({ - // Replace with your project's social card - image: 'img/stackql-cover.png', - navbar: { - logo: { - alt: 'StackQL Registry', - href: '/providers', - src: 'img/stackql-registry-logo.svg', - srcDark: 'img/stackql-registry-logo-white.svg', - }, - items: [ - { - to: '/install', - position: 'left', - label: 'Install', - }, - { - to: '/stackql-deploy', - position: 'left', - label: 'stackql-deploy', - }, - { - to: '/providers', - type: 'dropdown', - label: 'Providers', - position: 'left', - items: providerDropDownListItems, - }, - { - type: 'dropdown', - label: 'More', - position: 'left', - items: [ - { - to: '/stackqldocs', - label: 'StackQL Docs', - }, - { - to: '/blog', - label: 'Blog', - }, - { - to: '/tutorials', - label: 'Tutorials', - }, - ], - }, - { - href: 'https://github.com/stackql/stackql', - position: 'right', - className: 'header-github-link', - 'aria-label': 'GitHub repository', - }, - ], - }, - footer: { - style: 'dark', - logo: { - alt: 'StackQL', - href: '/providers', - src: 'img/stackql-registry-logo.svg', - srcDark: 'img/stackql-registry-logo-white.svg', - }, - links: [ - { - title: 'StackQL', - items: footerStackQLItems, - }, - { - title: 'More', - items: footerMoreItems, - }, - ], - copyright: `© ${new Date().getFullYear()} StackQL Studios`, - }, - colorMode: { - // using user system preferences, instead of the hardcoded defaultMode - respectPrefersColorScheme: true, - }, - prism: { - theme: prismThemes.nightOwl, - darkTheme: prismThemes.dracula, - }, - }), +import { createConfig } from './.shared-config/index.js'; +import { providerName, providerTitle } from './provider.js'; + +// Shared StackQL provider microsite configuration (navbar, footer, theme, +// plugins, redirects) is vendored from stackql/docusaurus-config into +// .shared-config/ by the `vendor-config` script before every start/build. +// Only provider identity and the few site-local overrides live here. +const config = createConfig({ + providerName, + providerTitle, + prismThemes, + overrides: { + // Docusaurus Faster (rspack + swc, via @docusaurus/faster) for build + // speed and consistency with the other provider microsites. + future: { + v4: true, + faster: true, + }, + }, +}); + +// Date-stamp every generated doc page ("Last updated on ...") from git +// history; the shared config leaves this off. +config.presets[0][1].docs.showLastUpdateTime = true; + +// Use the locally vendored registry-branded logos (STACKQL>> | REGISTRY) +// instead of the shared config's hotlinked main-site wordmark - self-contained +// assets, no cross-origin fetch. global.css swaps in the -mobile variants +// below 996px. +const registryLogo = { + alt: 'StackQL', + href: '/', + src: 'img/stackql-registry-logo.svg', + srcDark: 'img/stackql-registry-logo-white.svg', }; +config.themeConfig.navbar.logo = { ...registryLogo }; +config.themeConfig.footer.logo = { ...registryLogo }; export default config; diff --git a/website/package.json b/website/package.json index 8f57f6c..3c098a2 100644 --- a/website/package.json +++ b/website/package.json @@ -4,6 +4,10 @@ "private": true, "scripts": { "docusaurus": "docusaurus", + "vendor-config": "rimraf .shared-config && git clone --depth 1 --branch main https://github.com/stackql/docusaurus-config.git .shared-config", + "prestart": "yarn vendor-config", + "prebuild": "yarn vendor-config", + "sanitize-docs": "node scripts/sanitize-docs.mjs", "start": "docusaurus start", "build": "docusaurus build", "swizzle": "docusaurus swizzle", @@ -14,8 +18,11 @@ "write-heading-ids": "docusaurus write-heading-ids" }, "dependencies": { - "@docusaurus/core": "3.8.1", - "@docusaurus/preset-classic": "3.8.1", + "@docusaurus/core": "^3.10.2", + "@docusaurus/faster": "^3.10.2", + "@docusaurus/plugin-ideal-image": "^3.10.2", + "@docusaurus/preset-classic": "^3.10.2", + "@docusaurus/theme-mermaid": "^3.10.2", "@emotion/react": "^11.14.0", "@emotion/styled": "^11.14.1", "@iconify/react": "^6.0.0", @@ -29,8 +36,23 @@ "react-dom": "^19.0.0" }, "devDependencies": { - "@docusaurus/module-type-aliases": "3.8.1", - "@docusaurus/types": "3.8.1" + "@docusaurus/module-type-aliases": "^3.10.2", + "@docusaurus/types": "^3.10.2", + "rimraf": "^6.0.1" + }, + "overrides": { + "rimraf": "^6.0.1", + "glob": "^13.0.0", + "memfs": "^4.17.0", + "uuid": "^11.0.0", + "@ungap/structured-clone": "^1.3.1" + }, + "resolutions": { + "rimraf": "^6.0.1", + "glob": "^13.0.0", + "memfs": "^4.17.0", + "uuid": "^11.0.0", + "@ungap/structured-clone": "^1.3.1" }, "browserslist": { "production": [ @@ -45,7 +67,7 @@ ] }, "engines": { - "node": ">=18.0" + "node": ">=20.0" }, "license": "MIT" } diff --git a/website/provider.js b/website/provider.js new file mode 100644 index 0000000..0c6e3b8 --- /dev/null +++ b/website/provider.js @@ -0,0 +1,2 @@ +export const providerName = 'vercel'; +export const providerTitle = 'Vercel'; diff --git a/website/scripts/sanitize-docs.mjs b/website/scripts/sanitize-docs.mjs new file mode 100644 index 0000000..b2000da --- /dev/null +++ b/website/scripts/sanitize-docs.mjs @@ -0,0 +1,172 @@ +#!/usr/bin/env node +// Post-docgen sanitizer for the generated provider docs. +// +// Vendor descriptions can carry literal angle-bracket placeholders +// (), stray unpaired HTML and brace expressions. MDX v3 parses +// any raw as JSX and fails the build on the first mismatch; braces +// ({...}) parse as JSX expressions with the same failure mode. +// +// The doc generator's own structure is line-shaped: one `...` +// cell per line, and description text ONLY ever appears as td inner +// content. So the deterministic fix: inside every description cell, +// escape ALL angle brackets and braces (protecting the stage-1 +// backtick-wrapped `` tokens as spans); leave +// every other line - tables, Tabs/TabItem/CodeBlock, CopyableCode, +// index link lists - byte-for-byte untouched. +// +// Run after `npm run generate-docs`, before building the website. + +import fs from 'node:fs'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const docsDir = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..', 'docs'); + +const TD_LINE = /^(\s*)(.*)(<\/td>\s*)$/; +const LINK_TOKEN = '(?:]*\\/>|[^<>]*<\\/code>)<\\/a>'; +const LINK_TOKEN_CELL = new RegExp(`^${LINK_TOKEN}(?:,\\s*${LINK_TOKEN})*$`); +const BACKTICKED = /`<([A-Za-z][A-Za-z0-9_.:-]*)>`/g; +// Control-char sentinels: cannot occur in generated markdown. +const OPEN = ''; +const CLOSE = ''; + +let filesChanged = 0; +let cellsEscaped = 0; + +function escapeDescription(inner) { + let out = inner.replace(BACKTICKED, (m, name) => OPEN + name + CLOSE); + out = out + .replace(//g, '>') + .replace(/\{/g, '{') + .replace(/\}/g, '}') + // Regex fragments in descriptions read as markdown links + // ("[...](...)") and crash the link resolver. + .replace(/\[/g, '[') + .replace(/\]/g, ']') + // GFM autolinks bare "scheme://..." literals on the DECODED text + // tree (entity escapes cannot evade it) and Docusaurus crashes on + // regex-shaped ones ("https://.+"). A zero-width space inside "://" + // is invisible in rendering but breaks the autolink prefix match. + .replace(/:\/\//g, ':​//'); + out = out.split(OPEN).join('<').split(CLOSE).join('>'); + return out; +} + +// Inside a CodeBlock template literal, a lone backslash before u/x is a JS +// string escape, and ${ starts interpolation. Double the backslash / escape +// the $ so the source text renders verbatim. The (?{`...`} spans hold verbatim SQL in a JSX + // template literal. The MDX/HTML escapes applied elsewhere must NOT + // touch these lines, but JS still evaluates the template literal. + if (inCodeBlock) { + if (/<\/CodeBlock>/.test(line)) inCodeBlock = false; + const esc = escapeTemplateLiteral(line); + if (esc !== line) { lines[i] = esc; changed = true; } + continue; + } + if (//.test(line)) inCodeBlock = true; + const esc = escapeTemplateLiteral(line); + if (esc !== line) { lines[i] = esc; changed = true; } + continue; + } + if (/^/.test(trimmed)) { + inTabItemProse = false; + continue; + } + + // Description table cells (one ... per line). + const m = TD_LINE.exec(line); + if (m) { + const inner = m[2]; + if (/^]*\/>$/.test(inner)) continue; + // Structural link cells in the Methods/Parameters tables - generated + // structure, not description text - must stay verbatim. + if (LINK_TOKEN_CELL.test(inner)) continue; + const codeCell = /^([^<>]*)<\/code>$/.exec(inner); + if (codeCell) { + // Type/pattern cells: regex patterns form accidental markdown + // links and MDX brace expressions. Neutralise both; entities + // decode inside the element so rendering is unchanged. + const escaped = codeCell[1] + .replace(/\[/g, '[') + .replace(/\]/g, ']') + .replace(/\{/g, '{') + .replace(/\}/g, '}') + .replace(/:\/\//g, ':​//'); + if (escaped !== codeCell[1]) { + lines[i] = m[1] + '' + escaped + '' + m[3]; + cellsEscaped++; + changed = true; + } + continue; + } + const escaped = escapeDescription(inner); + if (escaped !== inner) { + lines[i] = m[1] + escaped + m[3]; + cellsEscaped++; + changed = true; + } + continue; + } + + // Method-description prose inside blocks (the paragraphs + // between the TabItem opener and the ```sql fence). Prose never + // starts with '<'; anything with raw angle brackets or braces there + // is hostile description content. + if (inTabItemProse && trimmed && !trimmed.startsWith('<') && /[<>{}]/.test(line)) { + const escaped = escapeDescription(line); + if (escaped !== line) { + lines[i] = escaped; + cellsEscaped++; + changed = true; + } + } + } + return { text: lines.join('\n'), changed }; +} + +function walk(dir) { + for (const entry of fs.readdirSync(dir, { withFileTypes: true })) { + const p = path.join(dir, entry.name); + if (entry.isDirectory()) { + walk(p); + } else if (entry.name.endsWith('.md') || entry.name.endsWith('.mdx')) { + const before = fs.readFileSync(p, 'utf8'); + const { text: after, changed } = sanitize(before); + if (changed) { + fs.writeFileSync(p, after); + filesChanged++; + } + } + } +} + +walk(docsDir); +console.log(`sanitize-docs: escaped ${cellsEscaped} description cell(s) across ${filesChanged} file(s)`); diff --git a/website/sidebars.js b/website/sidebars.js index 72e3166..f719984 100644 --- a/website/sidebars.js +++ b/website/sidebars.js @@ -1,42 +1,14 @@ -// @ts-check +import { providerTitle } from './provider.js'; -// This runs in Node.js - Don't use client-side code here (browser APIs, JSX...) - -/** - * Creating a sidebar enables you to: - - create an ordered group of docs - - render a sidebar for each doc of that group - - provide next/previous navigation - - The sidebars can be generated from the filesystem, or explicitly defined here. - - Create as many sidebars as you want. - - @type {import('@docusaurus/plugin-content-docs').SidebarsConfig} - */ - -import config from './docusaurus.config'; - -const providerTitle = config.title.replace(/^StackQL /, '').replace(/ Provider$/, ''); - - const sidebars = { +const sidebars = { mainSidebar: [ - { - type: 'link', - label: 'All Providers', - href: '/providers', - }, + { type: 'link', label: 'All Providers', href: '/providers' }, { type: 'category', label: `${providerTitle} Provider`, - link: {type: 'doc', id: 'provider-intro'}, - items: [ - { - type: 'autogenerated', - dirName: 'services', - } - ] - }, + link: { type: 'doc', id: 'provider-intro' }, + items: [{ type: 'autogenerated', dirName: 'services' }], + }, ], }; diff --git a/website/src/components/CopyableCode/CopyableCode.js b/website/src/components/CopyableCode/CopyableCode.js index 8115f33..d17969f 100644 --- a/website/src/components/CopyableCode/CopyableCode.js +++ b/website/src/components/CopyableCode/CopyableCode.js @@ -1,29 +1,29 @@ -import React, { useState } from 'react'; -import Clipboard from 'clipboard'; - -const CopyableCode = ({ code }) => { - const [isCopied, setIsCopied] = useState(false); - - const handleCopy = () => { - const clipboard = new Clipboard('.copyable-code', { - text: () => code, - }); - - clipboard.on('success', function() { - setIsCopied(true); - window.setTimeout(() => setIsCopied(false), 2000); - clipboard.destroy(); - }); - }; - - return ( - - - {code} - - {isCopied ? Copied! : null} - - ); -}; - -export default CopyableCode; +import React, { useState } from 'react'; +import Clipboard from 'clipboard'; + +const CopyableCode = ({ code }) => { + const [isCopied, setIsCopied] = useState(false); + + const handleCopy = () => { + const clipboard = new Clipboard('.copyable-code', { + text: () => code, + }); + + clipboard.on('success', function() { + setIsCopied(true); + window.setTimeout(() => setIsCopied(false), 2000); + clipboard.destroy(); + }); + }; + + return ( + + + {code} + + {isCopied ? Copied! : null} + + ); +}; + +export default CopyableCode; diff --git a/website/src/components/SchemaTable/SchemaTable.js b/website/src/components/SchemaTable/SchemaTable.js new file mode 100644 index 0000000..2553353 --- /dev/null +++ b/website/src/components/SchemaTable/SchemaTable.js @@ -0,0 +1,49 @@ +import React, { useState } from 'react'; +import styles from './SchemaTable.module.css'; + +function SchemaRow({ name, type, description, children, depth = 0 }) { + const [expanded, setExpanded] = useState(false); + const hasChildren = children && children.length > 0; + + return ( + <> + + + {hasChildren && ( + setExpanded(!expanded)} + > + {expanded ? '▼' : '▶'} + + )} + {name} + + {type} + + + {expanded && children?.map((child, idx) => ( + + ))} + + ); +} + +export default function SchemaTable({ fields }) { + return ( + + + + + + + + + + {fields.map((field, idx) => ( + + ))} + +
NameDatatypeDescription
+ ); +} \ No newline at end of file diff --git a/website/src/components/SchemaTable/SchemaTable.module.css b/website/src/components/SchemaTable/SchemaTable.module.css new file mode 100644 index 0000000..ed4ef36 --- /dev/null +++ b/website/src/components/SchemaTable/SchemaTable.module.css @@ -0,0 +1,27 @@ +.schemaTable { + width: 100%; + border-collapse: collapse; +} + +.schemaTable th, +.schemaTable td { + border: 1px solid var(--ifm-table-border-color); + padding: 8px 12px; + text-align: left; +} + +.schemaTable th { + background: var(--ifm-table-head-background); +} + +.row:hover { + background: var(--ifm-table-stripe-background); +} + +.expander { + cursor: pointer; + margin-right: 8px; + user-select: none; + color: var(--ifm-color-primary); + font-size: 10px; +} \ No newline at end of file diff --git a/website/src/components/StackqlDeployDropdown/StackqlDeployDropdown.js b/website/src/components/StackqlDeployDropdown/StackqlDeployDropdown.js new file mode 100644 index 0000000..b252fd7 --- /dev/null +++ b/website/src/components/StackqlDeployDropdown/StackqlDeployDropdown.js @@ -0,0 +1,400 @@ +import React, { useState } from 'react'; +import Button from '@mui/material/Button'; +import Menu from '@mui/material/Menu'; +import MenuItem from '@mui/material/MenuItem'; +import ListItemIcon from '@mui/material/ListItemIcon'; +import ListItemText from '@mui/material/ListItemText'; +import DownloadIcon from '@mui/icons-material/Download'; +import ContentCopyIcon from '@mui/icons-material/ContentCopy'; +import KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown'; +import {useLocation} from '@docusaurus/router'; +import styles from './StackqlDeployDropdown.module.css'; + +/** + * Collects all DOM elements between a heading and the next

. + */ +function getElementsBetweenHeadings(heading) { + const elements = []; + let el = heading.nextElementSibling; + while (el && el.tagName !== 'H2') { + elements.push(el); + el = el.nextElementSibling; + } + return elements; +} + +/** + * Extracts text from a element, preserving newlines. + * prism-react-renderer wraps each line in a child element (div or span), + * and textContent concatenates them without newlines, so we join manually. + */ +function getCodeText(codeEl) { + if (codeEl.children.length > 0) { + return Array.from(codeEl.children) + .map(line => line.textContent.replace(/\n$/, '')) + .join('\n'); + } + return codeEl.textContent; +} + +/** + * Extracts the text content of a code block from within a set of elements. + * If preferredTab is provided, looks for a tab with that label first. + */ +function extractCodeFromElements(elements, preferredTab) { + if (preferredTab) { + for (const el of elements) { + const tabs = el.querySelectorAll('[role="tab"]'); + const panels = el.querySelectorAll('[role="tabpanel"]'); + for (let i = 0; i < tabs.length; i++) { + const tabLabel = tabs[i].textContent.trim().toLowerCase(); + if (tabLabel === preferredTab.toLowerCase() && panels[i]) { + const codeEl = panels[i].querySelector('pre code'); + if (codeEl) return getCodeText(codeEl); + } + } + } + } + // Fallback: first code block in the section + for (const el of elements) { + const codeEl = el.querySelector('pre code'); + if (codeEl) return getCodeText(codeEl); + } + return null; +} + +/** + * Scans the rendered page DOM for SQL example sections and extracts + * code blocks to build a context-aware stackql-deploy template. + * + * Section heading IDs generated by Docusaurus: + * ## `SELECT` examples -> #select-examples + * ## `INSERT` examples -> #insert-examples + * ## `UPDATE` examples -> #update-examples + * ## `REPLACE` examples -> #replace-examples + * ## `DELETE` examples -> #delete-examples + * ## Lifecycle Methods -> #lifecycle-methods + */ +function extractTemplateFromPage() { + const sections = {}; + + // --- SELECT (prefer "get" tab for a single-resource check) --- + const selectH2 = document.getElementById('select-examples'); + if (selectH2) { + const els = getElementsBetweenHeadings(selectH2); + sections.select = extractCodeFromElements(els, 'get (all properties)') + || extractCodeFromElements(els, 'get') + || extractCodeFromElements(els); + } + + // --- INSERT (prefer "create" tab -- skip "Manifest" yaml tab) --- + const insertH2 = document.getElementById('insert-examples') || document.getElementById('insert-example'); + if (insertH2) { + const els = getElementsBetweenHeadings(insertH2); + sections.insert = extractCodeFromElements(els, 'All Properties') + || extractCodeFromElements(els, 'create') + || extractCodeFromElements(els); + } + + // --- UPDATE --- + const updateH2 = document.getElementById('update-examples') || document.getElementById('update-example'); + if (updateH2) { + const els = getElementsBetweenHeadings(updateH2); + sections.update = extractCodeFromElements(els); + } + + // --- REPLACE --- + const replaceH2 = document.getElementById('replace-examples'); + if (replaceH2) { + const els = getElementsBetweenHeadings(replaceH2); + sections.replace = extractCodeFromElements(els); + } + + // --- DELETE (standalone section) --- + const deleteH2 = document.getElementById('delete-examples') || document.getElementById('delete-example'); + if (deleteH2) { + const els = getElementsBetweenHeadings(deleteH2); + sections.delete = extractCodeFromElements(els); + } + + // --- Lifecycle Methods: look for a "delete" tab if no standalone DELETE --- + if (!sections.delete) { + const lifecycleH2 = document.getElementById('lifecycle-methods'); + if (lifecycleH2) { + const els = getElementsBetweenHeadings(lifecycleH2); + sections.delete = extractCodeFromElements(els, 'delete'); + } + } + + return sections; +} + +/** + * Parses a SELECT SQL string into its components: + * fields - column names from the SELECT list + * table - fully-qualified table reference after FROM + * where - the raw WHERE clause (conditions only, no leading WHERE) + */ +function parseSelectSQL(sql) { + const selectFromMatch = sql.match(/SELECT\s+([\s\S]+?)\s+FROM\s+/i); + const fromMatch = sql.match(/FROM\s+(\S+)/i); + const whereMatch = sql.match(/WHERE\s+([\s\S]+?)(?:\s*;\s*$|$)/i); + + const fields = selectFromMatch + ? selectFromMatch[1] + .split(',') + .map(f => f.trim()) + .filter(f => f && f !== '*') + : []; + + const table = fromMatch ? fromMatch[1] : ''; + const where = whereMatch ? whereMatch[1].trim().replace(/;\s*$/, '').trim() : ''; + + return { fields, table, where }; +} + +// Parses column names from an INSERT INTO ... (...) statement +// and returns the base field names (stripping data__ prefix). +function parseInsertColumns(sql) { + const match = sql.match(/INSERT\s+INTO\s+\S+\s*\(([\s\S]+?)\)/i); + if (!match) return []; + return match[1] + .split(',') + // .map(c => c.trim().replace(/^data__/, '')) + .map(c => c.trim()) + .filter(Boolean); +} + +// Builds an "exists" hint query - a simplified count query using only the +// original WHERE params (required parameters from the page). +function buildExistsQuery(parsed) { + let sql = `SELECT count(*) as count\nFROM ${parsed.table}`; + if (parsed.where) { + const conditions = parsed.where.split(/\s+AND\s+/i).map(c => c.trim()); + sql += `\nWHERE ${conditions.join(' AND\n')}`; + } + sql += '\n;'; + return sql; +} + +// Builds a "statecheck" hint query - a count query where SELECT fields become +// equality checks in the WHERE clause, followed by the original WHERE params. +function buildStatecheckQuery(parsed) { + // Extract condition field names from WHERE clause to avoid duplicates + const whereConditionFields = new Set(); + if (parsed.where) { + parsed.where.split(/\s+AND\s+/i).forEach(c => { + const match = c.trim().match(/^\s*(\w+)\s*=/); + if (match) whereConditionFields.add(match[1].toLowerCase()); + }); + } + + // Filter out fields already in the WHERE clause (e.g., region) + const filteredFields = parsed.fields.filter(f => !whereConditionFields.has(f.toLowerCase())); + const fieldConditions = filteredFields.map(f => `${f} = {{ ${f} }}`); + + // Collect all WHERE conditions + const allConditions = [...fieldConditions]; + if (parsed.where) { + parsed.where.split(/\s+AND\s+/i).forEach(c => allConditions.push(c.trim())); + } + + let sql = `SELECT count(*) as count\nFROM ${parsed.table}`; + if (allConditions.length > 0) { + sql += `\nWHERE \n${allConditions.join(' AND\n')}`; + } + sql += '\n;'; + return sql; +} + +/** + * Builds the stackql-deploy IQL template from extracted sections. + * Only includes anchors for operations that actually exist on the page. + */ +function buildTemplate(sections) { + const parts = []; + let parsed = null; + + if (sections.select) { + parsed = parseSelectSQL(sections.select); + parts.push(`/*+ exists */\n${buildExistsQuery(parsed)}`); + } + + if (sections.insert) { + parts.push(sections.insert); + } + + if (sections.update) { + parts.push(sections.update); + } else if (sections.replace) { + parts.push(sections.replace); + } + + if (parsed) { + // If INSERT exists, narrow to mutable fields only (skip created_at, etc.) + let mutableParsed = parsed; + if (sections.insert) { + const insertColSet = new Set(parseInsertColumns(sections.insert)); + const mutableFields = parsed.fields.filter(f => insertColSet.has(f)); + if (mutableFields.length > 0) { + mutableParsed = { ...parsed, fields: mutableFields }; + } + } + + parts.push(`/*+ statecheck, retries=5, retry_delay=10 */\n${buildStatecheckQuery(mutableParsed)}`); + + // Use all GET fields minus region for exports + const exportFields = parsed.fields.filter(f => f.toLowerCase() !== 'region'); + let exportsSql = `SELECT\n${exportFields.join(',\n')}\nFROM ${parsed.table}`; + if (parsed.where) { + const conditions = parsed.where.split(/\s+AND\s+/i).map(c => c.trim()); + exportsSql += `\nWHERE ${conditions.join(' AND\n')}`; + } + exportsSql += ';'; + parts.push(`/*+ exports */\n${exportsSql}`); + } + + if (sections.delete) { + parts.push(sections.delete); + } + + return parts.join('\n\n'); +} + +function getResourceName(pathname) { + const match = pathname.match(/\/services\/[^/]+\/([^/]+)/); + return match ? match[1] : null; +} + +export default function StackqlDeployDropdown() { + const [anchorEl, setAnchorEl] = useState(null); + const [copied, setCopied] = useState(false); + const open = Boolean(anchorEl); + const location = useLocation(); + + const resourceName = getResourceName(location.pathname); + + // Only render on resource pages (URL: /services/{service}/{resource}) + if (!resourceName) return null; + + const filename = `${resourceName}.iql`; + + function getTemplate() { + const sections = extractTemplateFromPage(); + return buildTemplate(sections); + } + + const handleClick = (event) => { + setAnchorEl(event.currentTarget); + }; + + const handleClose = () => { + setAnchorEl(null); + }; + + const handleDownload = () => { + const template = getTemplate(); + if (!template) { + handleClose(); + return; + } + const blob = new Blob([template], { type: 'text/plain' }); + const url = URL.createObjectURL(blob); + const a = document.createElement('a'); + a.href = url; + a.download = filename; + document.body.appendChild(a); + a.click(); + document.body.removeChild(a); + URL.revokeObjectURL(url); + handleClose(); + }; + + const handleCopy = async () => { + const template = getTemplate(); + if (!template) { + handleClose(); + return; + } + try { + await navigator.clipboard.writeText(template); + setCopied(true); + setTimeout(() => setCopied(false), 2000); + } catch { + const textarea = document.createElement('textarea'); + textarea.value = template; + document.body.appendChild(textarea); + textarea.select(); + document.execCommand('copy'); + document.body.removeChild(textarea); + setCopied(true); + setTimeout(() => setCopied(false), 2000); + } + handleClose(); + }; + + return ( +
+ + + + + + + + Download + + + + + + + + {copied ? 'Copied!' : 'Copy'} + + + +
+ ); +} diff --git a/website/src/components/StackqlDeployDropdown/StackqlDeployDropdown.module.css b/website/src/components/StackqlDeployDropdown/StackqlDeployDropdown.module.css new file mode 100644 index 0000000..cdb453c --- /dev/null +++ b/website/src/components/StackqlDeployDropdown/StackqlDeployDropdown.module.css @@ -0,0 +1,12 @@ +/* Only show on md+ viewports (Docusaurus default breakpoint: 996px) */ +.dropdownWrapper { + display: none; + flex-shrink: 0; +} + +@media screen and (min-width: 997px) { + .dropdownWrapper { + display: flex; + align-items: center; + } +} diff --git a/website/src/css/custom.css b/website/src/css/global.css similarity index 89% rename from website/src/css/custom.css rename to website/src/css/global.css index ce0b531..3e50218 100644 --- a/website/src/css/custom.css +++ b/website/src/css/global.css @@ -256,4 +256,32 @@ div:has(> .vhsImage) { .providerDocColumn { width: 100%; } - } \ No newline at end of file + } + +/* +* breadcrumbs with actions (stackql-deploy dropdown) +*/ +.breadcrumbs-with-actions { + display: flex; + align-items: center; + justify-content: space-between; + flex-wrap: nowrap; +} + +.breadcrumbs-with-actions nav { + flex: 1; + min-width: 0; +} + +/* +* registry logo: swap to the narrower -mobile mark below the Docusaurus +* mobile breakpoint (996px), per theme +*/ +@media (max-width: 996px) { + .navbar__logo img[src$='stackql-registry-logo.svg'] { + content: url('/img/stackql-registry-logo-mobile.svg'); + } + .navbar__logo img[src$='stackql-registry-logo-white.svg'] { + content: url('/img/stackql-registry-logo-white-mobile.svg'); + } +} \ No newline at end of file diff --git a/website/src/pages/blog.js b/website/src/pages/blog.js deleted file mode 100644 index e435012..0000000 --- a/website/src/pages/blog.js +++ /dev/null @@ -1,10 +0,0 @@ -import React from 'react'; -import Head from '@docusaurus/Head'; - -export default function Blog() { - return ( - - - - ); -}; \ No newline at end of file diff --git a/website/src/pages/contact-us.js b/website/src/pages/contact-us.js deleted file mode 100644 index b6850d8..0000000 --- a/website/src/pages/contact-us.js +++ /dev/null @@ -1,10 +0,0 @@ -import React from 'react'; -import Head from '@docusaurus/Head'; - -export default function ConactUs() { - return ( - - - - ); -}; \ No newline at end of file diff --git a/website/src/pages/install.js b/website/src/pages/install.js deleted file mode 100644 index 341a4bb..0000000 --- a/website/src/pages/install.js +++ /dev/null @@ -1,10 +0,0 @@ -import React from 'react'; -import Head from '@docusaurus/Head'; - -export default function Install() { - return ( - - - - ); -}; \ No newline at end of file diff --git a/website/src/pages/providers/aws.js b/website/src/pages/providers/aws.js deleted file mode 100644 index 780099a..0000000 --- a/website/src/pages/providers/aws.js +++ /dev/null @@ -1,10 +0,0 @@ -import React from 'react'; -import Head from '@docusaurus/Head'; - -export default function Registry() { - return ( - - - - ); -}; \ No newline at end of file diff --git a/website/src/pages/providers/azure.js b/website/src/pages/providers/azure.js deleted file mode 100644 index 467f77a..0000000 --- a/website/src/pages/providers/azure.js +++ /dev/null @@ -1,10 +0,0 @@ -import React from 'react'; -import Head from '@docusaurus/Head'; - -export default function Registry() { - return ( - - - - ); -}; \ No newline at end of file diff --git a/website/src/pages/providers/confluent.js b/website/src/pages/providers/confluent.js deleted file mode 100644 index e886aaf..0000000 --- a/website/src/pages/providers/confluent.js +++ /dev/null @@ -1,10 +0,0 @@ -import React from 'react'; -import Head from '@docusaurus/Head'; - -export default function Registry() { - return ( - - - - ); -}; \ No newline at end of file diff --git a/website/src/pages/providers/databricks.js b/website/src/pages/providers/databricks.js deleted file mode 100644 index a04b603..0000000 --- a/website/src/pages/providers/databricks.js +++ /dev/null @@ -1,10 +0,0 @@ -import React from 'react'; -import Head from '@docusaurus/Head'; - -export default function Registry() { - return ( - - - - ); -}; \ No newline at end of file diff --git a/website/src/pages/providers/github.js b/website/src/pages/providers/github.js deleted file mode 100644 index b425c6c..0000000 --- a/website/src/pages/providers/github.js +++ /dev/null @@ -1,10 +0,0 @@ -import React from 'react'; -import Head from '@docusaurus/Head'; - -export default function Registry() { - return ( - - - - ); -}; \ No newline at end of file diff --git a/website/src/pages/providers/google.js b/website/src/pages/providers/google.js deleted file mode 100644 index 01fe8b7..0000000 --- a/website/src/pages/providers/google.js +++ /dev/null @@ -1,10 +0,0 @@ -import React from 'react'; -import Head from '@docusaurus/Head'; - -export default function Registry() { - return ( - - - - ); -}; \ No newline at end of file diff --git a/website/src/pages/providers/index.js b/website/src/pages/providers/index.js deleted file mode 100644 index 9afaa02..0000000 --- a/website/src/pages/providers/index.js +++ /dev/null @@ -1,10 +0,0 @@ -import React from 'react'; -import Head from '@docusaurus/Head'; - -export default function Providers() { - return ( - - - - ); -}; \ No newline at end of file diff --git a/website/src/pages/providers/okta.js b/website/src/pages/providers/okta.js deleted file mode 100644 index cdddc72..0000000 --- a/website/src/pages/providers/okta.js +++ /dev/null @@ -1,10 +0,0 @@ -import React from 'react'; -import Head from '@docusaurus/Head'; - -export default function Registry() { - return ( - - - - ); -}; \ No newline at end of file diff --git a/website/src/pages/providers/openai.js b/website/src/pages/providers/openai.js deleted file mode 100644 index 9884c84..0000000 --- a/website/src/pages/providers/openai.js +++ /dev/null @@ -1,10 +0,0 @@ -import React from 'react'; -import Head from '@docusaurus/Head'; - -export default function Registry() { - return ( - - - - ); -}; \ No newline at end of file diff --git a/website/src/pages/providers/snowflake.js b/website/src/pages/providers/snowflake.js deleted file mode 100644 index 7b3ec43..0000000 --- a/website/src/pages/providers/snowflake.js +++ /dev/null @@ -1,10 +0,0 @@ -import React from 'react'; -import Head from '@docusaurus/Head'; - -export default function Registry() { - return ( - - - - ); -}; \ No newline at end of file diff --git a/website/src/pages/stackql-deploy.js b/website/src/pages/stackql-deploy.js deleted file mode 100644 index 95e18b3..0000000 --- a/website/src/pages/stackql-deploy.js +++ /dev/null @@ -1,10 +0,0 @@ -import React from 'react'; -import Head from '@docusaurus/Head'; - -export default function Deploy() { - return ( - - - - ); -}; \ No newline at end of file diff --git a/website/src/pages/stackqldocs.js b/website/src/pages/stackqldocs.js deleted file mode 100644 index 7182d93..0000000 --- a/website/src/pages/stackqldocs.js +++ /dev/null @@ -1,10 +0,0 @@ -import React from 'react'; -import Head from '@docusaurus/Head'; - -export default function StackQLDocs() { - return ( - - - - ); -}; \ No newline at end of file diff --git a/website/src/pages/tutorials.js b/website/src/pages/tutorials.js deleted file mode 100644 index 2bb5f07..0000000 --- a/website/src/pages/tutorials.js +++ /dev/null @@ -1,10 +0,0 @@ -import React from 'react'; -import Head from '@docusaurus/Head'; - -export default function Tutorials() { - return ( - - - - ); -}; \ No newline at end of file diff --git a/website/src/theme/DocBreadcrumbs/index.js b/website/src/theme/DocBreadcrumbs/index.js new file mode 100644 index 0000000..2c5c7cf --- /dev/null +++ b/website/src/theme/DocBreadcrumbs/index.js @@ -0,0 +1,12 @@ +import React from 'react'; +import DocBreadcrumbs from '@theme-original/DocBreadcrumbs'; +import StackqlDeployDropdown from '@site/src/components/StackqlDeployDropdown/StackqlDeployDropdown'; + +export default function DocBreadcrumbsWrapper(props) { + return ( +
+ + +
+ ); +} diff --git a/website/src/theme/Footer/index.tsx b/website/src/theme/Footer/index.tsx index 99ba9d5..eb3d03a 100644 --- a/website/src/theme/Footer/index.tsx +++ b/website/src/theme/Footer/index.tsx @@ -1,262 +1,262 @@ -/** - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -import React from 'react'; -import clsx from 'clsx'; - -import Link from '@docusaurus/Link'; -import {FooterLinkItem, useThemeConfig} from '@docusaurus/theme-common'; -import useBaseUrl from '@docusaurus/useBaseUrl'; -import isInternalUrl from '@docusaurus/isInternalUrl'; -import styles from './styles.module.css'; -import ThemedImage, {Props as ThemedImageProps} from '@theme/ThemedImage'; -import IconExternalLink from '@theme/Icon/ExternalLink'; -import { IconButton } from '@mui/material'; -import { useColorMode } from '@docusaurus/theme-common'; - -import { Icon } from '@iconify/react'; - -// add for responsive logo image -import { useWindowSize } from '@docusaurus/theme-common'; - -// Custom styles to fix the spacing issue -const socialIconsContainerStyle: React.CSSProperties = { - display: 'flex', - justifyContent: 'center', - alignItems: 'center', - flexWrap: 'wrap', // Allow wrapping on small screens - margin: '16px 0', -}; - -const iconButtonStyle = { - padding: '12px', // Ensure buttons have enough clickable area -}; - -function FooterLink({ - to, - href, - label, - prependBaseUrlToHref, - ...props -}: FooterLinkItem) { - const toUrl = useBaseUrl(to); - const normalizedHref = useBaseUrl(href, {forcePrependBaseUrl: true}); - - return ( - - {href && !isInternalUrl(href) ? ( - - {label} - - - ) : ( - label - )} - - ); -} - -const FooterLogo = ({ - sources, - alt, - width, - height, - logo, -}: Pick & { logo: any }) => { - // Get window width for responsiveness - const windowSize = useWindowSize(); - - // Set threshold for mobile view (e.g., 768px) - const isMobile = windowSize === 'mobile' ? true : false; - - const getMobileLogoPath = (path: string) => path?.replace('.svg', '-mobile.svg'); - - // Choose appropriate image sources based on screen size - // const responsiveSources = { - // light: useBaseUrl(isMobile ? getMobileLogoPath(logo.src) : logo.src), - // dark: useBaseUrl(isMobile ? getMobileLogoPath(logo.srcDark || logo.src) : (logo.srcDark || logo.src)), - // }; - const responsiveSources = { - light: useBaseUrl(isMobile ? getMobileLogoPath(logo?.src) : logo?.src), - dark: useBaseUrl(isMobile ? getMobileLogoPath(logo?.srcDark || logo?.src) : (logo?.srcDark || logo?.src)), - }; - - return ( - - ); -} - -function Footer(): JSX.Element | null { - const socialLinks = { - linkedin: "https://www.linkedin.com/company/stackql", - twitter: "https://twitter.com/stackql", - github: "https://github.com/stackql", - discord: "https://discord.com/invite/xVXZ9d5NxN", - slack: "https://join.slack.com/t/stackqlcommunity/shared_invite/zt-1cbdq9s5v-CkY65IMAesCgFqjN6FU6hg", - }; - - const {colorMode} = useColorMode(); - - const {footer} = useThemeConfig(); - - const {copyright, links = [], logo = { src: '' }} = footer || {}; - const sources = { - light: useBaseUrl(logo.src), - dark: useBaseUrl(logo.srcDark || logo.src), - }; - - if (!footer) { - return null; - } - - return ( -
-
- {links && links.length > 0 && ( -
-
- {logo && (logo.src || logo.srcDark) && ( -
- {logo.href ? ( - - - - ) : ( - - )} -
- )} -

- A new approach to querying and
- provisioning cloud services. -

-
- {links.map((linkItem, i) => ( -
- {linkItem.title != null ? ( -

{linkItem.title}

- ) : null} - {linkItem.items != null && - Array.isArray(linkItem.items) && - linkItem.items.length > 0 ? ( -
    - {linkItem.items.map((item, key) => - item.html ? ( -
  • - ) : ( -
  • - -
  • - ), - )} -
- ) : null} -
- ))} -
- )} -
- {(logo || copyright) && ( - <> -
- {copyright ? ( -
- ) : null} -
- {/* Social Icons Container with Fixed Spacing */} -
- - - - - - - - - - - - - - - -
- - )} -
-
- ); -} - +/** + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +import React from 'react'; +import clsx from 'clsx'; + +import Link from '@docusaurus/Link'; +import {FooterLinkItem, useThemeConfig} from '@docusaurus/theme-common'; +import useBaseUrl from '@docusaurus/useBaseUrl'; +import isInternalUrl from '@docusaurus/isInternalUrl'; +import styles from './styles.module.css'; +import ThemedImage, {Props as ThemedImageProps} from '@theme/ThemedImage'; +import IconExternalLink from '@theme/Icon/ExternalLink'; +import { IconButton } from '@mui/material'; +import { useColorMode } from '@docusaurus/theme-common'; + +import { Icon } from '@iconify/react'; + +// add for responsive logo image +import { useWindowSize } from '@docusaurus/theme-common'; + +// Custom styles to fix the spacing issue +const socialIconsContainerStyle: React.CSSProperties = { + display: 'flex', + justifyContent: 'center', + alignItems: 'center', + flexWrap: 'wrap', // Allow wrapping on small screens + margin: '16px 0', +}; + +const iconButtonStyle = { + padding: '12px', // Ensure buttons have enough clickable area +}; + +function FooterLink({ + to, + href, + label, + prependBaseUrlToHref, + ...props +}: FooterLinkItem) { + const toUrl = useBaseUrl(to); + const normalizedHref = useBaseUrl(href, {forcePrependBaseUrl: true}); + + return ( + + {href && !isInternalUrl(href) ? ( + + {label} + + + ) : ( + label + )} + + ); +} + +const FooterLogo = ({ + sources, + alt, + width, + height, + logo, +}: Pick & { logo: any }) => { + // Get window width for responsiveness + const windowSize = useWindowSize(); + + // Set threshold for mobile view (e.g., 768px) + const isMobile = windowSize === 'mobile' ? true : false; + + const getMobileLogoPath = (path: string) => path?.replace('.svg', '-mobile.svg'); + + // Choose appropriate image sources based on screen size + // const responsiveSources = { + // light: useBaseUrl(isMobile ? getMobileLogoPath(logo.src) : logo.src), + // dark: useBaseUrl(isMobile ? getMobileLogoPath(logo.srcDark || logo.src) : (logo.srcDark || logo.src)), + // }; + const responsiveSources = { + light: useBaseUrl(isMobile ? getMobileLogoPath(logo?.src) : logo?.src), + dark: useBaseUrl(isMobile ? getMobileLogoPath(logo?.srcDark || logo?.src) : (logo?.srcDark || logo?.src)), + }; + + return ( + + ); +} + +function Footer(): JSX.Element | null { + const socialLinks = { + linkedin: "https://www.linkedin.com/company/stackql", + twitter: "https://twitter.com/stackql", + github: "https://github.com/stackql", + discord: "https://discord.com/invite/xVXZ9d5NxN", + slack: "https://join.slack.com/t/stackqlcommunity/shared_invite/zt-1cbdq9s5v-CkY65IMAesCgFqjN6FU6hg", + }; + + const {colorMode} = useColorMode(); + + const {footer} = useThemeConfig(); + + const {copyright, links = [], logo = { src: '' }} = footer || {}; + const sources = { + light: useBaseUrl(logo.src), + dark: useBaseUrl(logo.srcDark || logo.src), + }; + + if (!footer) { + return null; + } + + return ( +
+
+ {links && links.length > 0 && ( +
+
+ {logo && (logo.src || logo.srcDark) && ( +
+ {logo.href ? ( + + + + ) : ( + + )} +
+ )} +

+ A new approach to querying and
+ provisioning cloud services. +

+
+ {links.map((linkItem, i) => ( +
+ {linkItem.title != null ? ( +

{linkItem.title}

+ ) : null} + {linkItem.items != null && + Array.isArray(linkItem.items) && + linkItem.items.length > 0 ? ( +
    + {linkItem.items.map((item, key) => + item.html ? ( +
  • + ) : ( +
  • + +
  • + ), + )} +
+ ) : null} +
+ ))} +
+ )} +
+ {(logo || copyright) && ( + <> +
+ {copyright ? ( +
+ ) : null} +
+ {/* Social Icons Container with Fixed Spacing */} +
+ + + + + + + + + + + + + + + +
+ + )} +
+
+ ); +} + export default Footer; \ No newline at end of file diff --git a/website/static/CNAME b/website/static/CNAME index 1f7a4f5..1660ef3 100644 --- a/website/static/CNAME +++ b/website/static/CNAME @@ -1 +1 @@ -snowflake-provider.stackql.io +vercel-provider.stackql.io diff --git a/website/static/apple-touch-icon.png b/website/static/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..54d5bf4c39a0ea69edae2faf1de88b441fc77799 GIT binary patch literal 7748 zcma)h1yEc;v+e>RxCHkQba8^aB{(6tySr|1mjo6Ii@R?E1b26rU}HPmVXO+eEQ^fd`SXo&>)KMWYKnzut+h;L;0e0K_IGb#kbO0K8r^=`fi50ndx2r zNccwGfob6ALa+t_i&8D4Qe%T&t&?)&;qmoiDqDskBd>UllD0R`NI%{$R?X5(#UCmk zOlDG);2Ie&OXoa|VvX!oi=;7&ElNfV&|(F5W@+Spual8JRJ*8WD~;G8>)UrU#jK!q zN(sbH_9NnkCK7GED(J!xL<~mq0=-9C3gPMgOS_cJP7%<}fDd{e>XMJt{LJWiE9jB3 z>tP$k+34=oOI)ZEssN}8bRX(LYu#A|v+CiEe0Afyj_yW42D*La5zJK(PRAz2e~Ps( zn{U@y71Cet6YALgh#~>{yKx`=FGmJV_W3aAf&7%sY&#&Y!fF~Hv>(!iB!MaxtgtT} ziJR0yb*sFNN^3uf!!kG+0WuDeqJ8W1T}M4gEn#oyh|MSdY&p+e`ge7eP_C{J-R<`q zAz9|rn{HDSac=MWcpp}C9#@ng6sMen1Y%S~rrCJWtR%Ua8&CIe^2epBAtSpi*`Bh& zouz89S<|4cDHPc&Mk!l0jv*%OM`1r=h#pk#5a22h6GpGd*jEWlEw-owqu+AcK6699 zZR#eDV!!&POu}?g)cx4IEBO844JsTFX4q$viPnB8^iRd_1G1kJ7u3qU2%OKF&x)x- zJOk6hocWe)v!s`i^wy+|So@!94P}TV%4CmI=?S5T${&OElPFqGFkKVQUGu_kxc_p3 zX-seuyZ&v2x3Cr}&mk-EotFR!vu3vW8|z8AB8*#2ItB3xv-I(j?vs!s-ljq@_vTNb zmA%5!wHQI#&7bT_;|b`aIp(^)cJ`QtN*ZnpKUxZ}h}ZK#6Q>n(`>}W>$d94IR>w3K z7t%#Z<=*1A{48}0tr4yCgc3QLO~wHWTgBhW)7d=F@K4u5mQP7J+)N=7=0mE8x5t09= zVKdTRz&dq+?RMUXWlFn=eg^7sH&xiR4H?a#+@rX0Z+R%qdA@7S&y5$ z8U_X7E@*X!n%@T2ELUMvE?;r)%?9f!=DsDMM`Y$#4oyS|7AEiOTv&4w#vp)+`;-I*D|>z5ALEhx2ZuM~xdx{v1fJpa;P(eP-S z-Hl6<#ygr&;k73{`RWwHxmas08>qVif7AVHaKcSw>kU^8bjxP`7&( zQ^1Io{7VLlZbh9fksbX{)Repa;v2eXky^a}?(RQC{(mF>FPe<>TE#O@Fhop|XiJkK z2PUp$JE{}&84qW{UV^e5#4w$hE;#EspS^cAnaJz9B`b$|#?F)Ul*y84Z0QaSy*IHvx6(egG<0xRUzyU@r;4ASdE0I|(vF2QNd2d*u-ea_^YM6_y1mmDMSkBv z7*d#9eiW#3hxiJ07%j=y1BOsgreV0jE!>uV2gjZTe zcF(k9KU`)^v{wgGo0_=n91-FK%+AEk9=*<_Ak1`b`04~^vk0_*6^xi;k`PX4KLit7Woe+!tDrl5OAGXE?Mk?DdbNZ<2**AZp*{jW)3k z@y_WEm-t}M3O`k8+lVMLMf1$+r=T+O*TPZAM>~>Us*1+^0{4F zP zJ>|M~{nMctMa#cZ2uh0BC?e}afMjaO) z;1dq!Z}eaMD2YVOc2EijR7M61&8m3LgC0WS%UGj%Iuj`2_#)YeaX#GR%8g%(n5qI0 zk6j-WW=a>{Lr4)A%96FMrc6A#5$v(Sbdv4F9f&JQ04EfAYh%Fk-PN!!DNDz_=8Dsm zx@spz`RFoE74+xO^`pmamyZ_~mrK=V4BHWvh{<vc%RDZb6kj?jN07hn|rz?aYZ3wSAe}F{FBr|2dcS}EhvTX`lIK|61 znTSS(!Zyd2cY5oER2Ok;fj|04^ z8S(xvA1aKRr{kp5va?hjJT$b>1j-6O=Vc6Dmu(*|)n;1XWdQmBgPl53Knc1+lMBJX zyHWeEK0t8!kcLj2F}jx>tHmp#|7IeW-a2bP$r^0>fY$%!XJiluZIK}r$J zrK?ShXjPS8LpL>Y+0hDQrpe1I%!cr29I1EgLJL2qq^cZc5?s&gsOiH#E&cuy3?ZnJ z#5YnFxhAFMQ~Tf>VAS>@;r)R@OHesp)(;tXRX-Jjvdv|Pmn-=9$fr@3VI|AqJ(~sL zNce&KKWRxYmdq|brkr><=d+bJzXJlVNQSCbEFd0G#5cZLY8Leq8X*nXf|^c0upz&i z%h0>vvyvjwO91V%*+n}#L$f=k*aB9ysDvO4nB@#CsjyX2TYY#;h2NlTqFi77^FZ_1 z*iilFM+sWV{ zp3_M+Q`i10Z>*wn7jg?dnh)dnQR1a4NXDUU-WYzVSFaUs<-n#aq-HphY3f?vuTco6Wj#Rye5z~Zb2p7F&!ye4&V zMFdT)eM04eM5zUPT8xfuH=0OPIF{7Z83L;4#Ei~}(es}7!?m}HzwjJF zczHJDX0Mv979??THq44{F$mJ9ER!{8rHq~Xz@O|e4b`wrG5fe5e~AxJ zgnvv^LJ}tjg{s1F+hfVtvODQF?SMRNKjf78g^n$pX2S6=m>c&Z za9io>A~Zi2X*$a??zOJaAg|3Qt3K>itkwpPuytSqn`Vw}B`5T#lhOnu z{$?quIqf8;vGt^u?WrCbu*NvlYxxVL*4z|mZ`q2FQF*`KjCEBe?yUzjxe`Qa1%Nje zz%sYZzs^j{CICKI!5QVfX;F*6Ec~i3OSg4oE7jM3D>b`|Wi7V}z8+8AcQE8CD^p88 zqUB%YNTC?t(5>P&C<|jBWD>`YZ;Ks|BFGz$+Ka?}p>&6l?`;)EI4^p4?jhQzD(FjY zztwLB6&`T0JUS1^Ev+z9w#EQ(LsDd9D|ucBE(ATo+Fd>*Z>=g}9R(Csgi6~mEND3E zzmru2^YW0VjSm;T5TVjmmkO2slEoY6eS4@uX*{brUix|@_8X>+T%#@r^A8tGvpMUz z*nVMNf+Yc{<{MPNCO6#9Y5LG1ym1%r`~wR8xiIDbpd<=lk^tr(46 z{DRQAh2l@GI+oCu23vIbSa^B`NeX}@hb#3^0KpQIaxE?enc?_!5}M<6hGk0uz9l)K zuStC~N&$nC>nO>b+?b~j4$xL7Bg?Y#7$v>(G?{y{d<2uYM5XsKfOa~S-k0We`ry&{ z2co(%Rw66m1%1uY*(}|pybPtjBP4kHL$eK<49AbD<}BWK#sM@=rL|NnL{@O~Xm#9R zQ|?bMr#=`QW6NEYsv+ya%q^Wa4y7M~Md`mJsykU?`4c1PhaZ-%@|q1Qqw0qVIHLfs z(zx7$Xy4L9VE+b2v+HKB4I$NgufV25ax)z3|N~4yVG<L{MYmMRwr%0Q23(%Nx_cmn?Q@#cc9y}1ZVN@F-whB~8> zagr5HC+DENaXkF&@qU*PU{>R~an?`5qCeAMi4Kp`_X>P694R0Q5j4A2-fmzWCNC1S z&Nr`F0fthTyC2K+BF}l}{V6l^0HyY8k5&{*P6>(Na49Lvs~ICrOzL=9?Wqsa2P>~u z5sTp~7UmxmS9=L4kb;~$@z~s_BBkb0h4)wvEA>Zu#QB}7I2p%Y963o@6zn0R>Y02V z@myl{wVwAANG6u;IAvL6xSpP%Z{@^Cht^Vwb@=jE9aR=I)<(>2?UEoEC^9Q8)wO@7 zZk_dBe`v2Rf{w!4zoudKW3pUg%OsZ8)5f4Y^`^_uZ#}T!9KAIDp!Y1_Uc@UaGR|7r z2dMupS({26sgK3lhorG<52v5yq37wSFUo|%mcOpyz!cEUvzz){EH7HO+gts`@0+yL zl5;xEY@>`js@99WX7yg`6X7XY{AJP+_GC(R_S!0Rgk;DcaAGe;A}QNF3lp=% z-(1v=O6?+DD|^oRHa5a^X-vQOm8bPPg$=))`ifUs?RIN~#hJk6Vw^7f>ar=3C52g_ zVzXg|U(BE(`!ac9E0N#$OM`7X-lV`qPX?3AH8$Z?ee=x_zi~cmb(v6Bo>*(Du2+Ta z3N-BNnhIs_(UoWE73U{azEk~Ea@Ky|5o}E?YNZa2iHUW95C%Q?;NT5#^V}g*;56O) z?pUF`4E9VC{a3Wxo1P!_WjqsZS@%^dh2(TIo;Bz?UEPYf{HOWy_6FoP^(w&pM*ddY zx_^J;Xr)x}#+xpUbmtUNyic&})2kV#;&Ru{_rl9gFf zZaYr~-S1;IRSUk+cX$V0(|m%gc2UsHSa|h%BU#1cPV#U^NU=q{03@LkEIbk#4d#PBRb3#yEKTe|?ie=tYt8@TQw^viH7KKd&#b{1@{70$5#eI0!R&yLRv_w*ry>ESE@ ztLbm2u|3-h<{Xmjsf_`dHU}l&z?|0g+PtafHIBs;zzFXd<$u==(twiZq zPewq)RC1RZKk9mE*O_a(kGqJR-Xa^hv;m>DPUf>5~JTpX7^e>g+nh};kL(rF?(r>2q-0DWq|T@W!@)PFZHvz&gVo8!W@ zlhx*P;3Ga%xzZZku-Jd)lNmuO(jI$u=j`Znb#^tEOgzBO^X?8| zE7-8NyzS>jlKgyiAuXHD?=bT(Syh!32co&I$2MZk4mx!5zZDq1P2I@CkF=jqZ6cx^!f+bYeoHC;=4Snk3LSnjef)2YJnr$i3{mZ^iA+du6F^y@o5s^fSQ7@vG-m>Rf67q0j7PD=dyYF z%f@AeGAAuoR;aA-^rdNVwq%fp=6I`SlBNU@2|oqIot=w4Q_cRZdUgeA{!1K#Wf;7! zJ3ya3!z@EGHdT_{fP;KG&(kr^m$;&YOlf6cwe;<%=y7^NO{%V-EWrfh9j969LF2(@ zGYM$q<~w9`@q68C%Z&7MkH*rNCQ>`jE9pJTjP==8V1Mk^J%IhGa+S7ar-_Kb7cq!c zQ6c|fI&>hsv`m~@!(BDdiVs<({9Sax@f3*V*eOh~xkSZV+8Ef?US+(O5h zG^Fg8v9f#_jP>xCh=9hN`IqZT+-ZMDB7a7V>h;5>M_A%b+Xk`#9cFKx2YbhN5SCHP z+X}RK%wGZkE8Co~oDV0Dxt-S=N4t?@x&ug}D^1(vc4J$Ng%LguK_i|x&+CC2$EL8B zInHd(@9k?JxpCS8NdHin%|SvS{T3#PhIAR!V@y~*JRCSu zwM;49Ox*&#_QQNh4Yai++U5q+bQkRf&9CN-(2*Yht?*vPskpg9EYxGMHhbE!D!@Sg zr*@YviSrqdo=_uJdHfy6e8I_=-Zf~!Nivoom^(a0`;>|MU*yI9ZB z{*SrA8w?Ka+$I}s;*8cL20qNhm!E{#WDI|pRg}JkeFcBExX;}#($Rj^=aO;qCRO22 ze;I4>BHeYWah-`aG1yISOT!!%@z(5;wpN2Zv2{S4m7D+K$0mewMCVsRDg%v-lvi!! zxD~%foLn0w-#8*1!H0EcuS4MT@7)NUjecsJRk_HlEs~L1XcdO1F{o6L)$#mj7;Rjc zAdVm`6;z{xTk=@yxNeM#sDVcu~mO=+Z~1394Z+8xHj~0(@Lq1{(*u4)?A3Cm*x6J zjEe=9Al^N6>P+*OZC&e@`Pq7P`Jw(ct*ES*IK#y!&ipBJYkzxI0pkICrQ`q!yn5;KdHN*Ued(G{A?4>{h`uf2GE@e>2_Qp*4LeAnAR;DOz7hI)Fh zPx-72Gs)MXA-tYJ+e?zc{SCUpI}M-O<(_>pe})YH^``EtDJ+r@Aiv(b8i>Z1kGg=F zJdPMEgs`=gk~}v;VhWVOC1HFmOZqvd@LWq)0*qP3PxTu%7#*pZI zhF$B=lD@7PGuH&PH#=c=7wrM(RDibEI`_gST%)}E0=VcQ_RRTK7y=I;tK!}NNtQ7K zAIOb{W3?Ml(I5)Q-lYMzAev^3-BnoiLM5Sm)X45p6qs^bmyXjN@ny&(0x8&SN}+v9 ziXY=PA#C=F`RO2J zvBCr=-qBQ>{#fKB6%|s%ALs5vKS=!z$m{6m!?uhHKrdRiBkB}o{d6JqLV%qR7XHec zqZ&yMXA7nD?XjyNl3_MyEGC2auCN5?%&Fo}>z;2xfhExZj=9QyPS4lxuIQZ)9kRGx z+>+4hVP_Pc5O(b8qZbk`L!ZTI^tjJ=&u%wU)_s{@IWgkS|V_irGA4@cXG#m-uGfa^_0h^!vO${b=XV(DQG6d)dM9$pUa*Bq~3Yw_@k za0`p@@UwAqi*R%MTeT|xKLXCKR`xc&|FZz5F!Bu`K>jp>rmGFa+uXw%ByHttVNI*( zY;J3po)rbnmL`r=h%t3L)*=5WYSu6#614Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>`T@Ck7(s%#9%Yz)b6 zEUj(~%4`hFZgfv+@}!4j(%Kk>69%8&fnd8=5}8HhV3VAOj~!%Id6uvf0LMZL({z7J5Jn4?O3fA z(dm@fq!`j>n9#2h+U}Uxq#V@r|NsBS>FYRvfhblIG z%v{JRkdTy?FmZ|#)1@^$MnRiSH1GyH_;`i+$(;xaVBy|i+;LJ{bM=YUr&g`Z&d54> zs)&JgOKHj1FHd<(c(3+6abyaLk~*fgYgyVev1wt~xD*&8U0tQ4t*hDH)zigYCp4^{ zy}Nz+^zHrY=kGW3=w4OnkPuMdkr7eRvWzJ}AxQgFOju}`nH5_KXMjSOR~X|H2G$N{ zOUb0I0WqhJ9?Cy&nOiTJ zTUc4xd$I_#u!2j2$>9`c<;@`qr*B+2apcSqnIr6{8$1?x=`p+#7cBYYWI7dS1%s!n KpUXO@geCwPM^2Og literal 0 HcmV?d00001 diff --git a/website/static/favicon-32x32.png b/website/static/favicon-32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..f1efee03ab3cbef83577a5b041c102fb9d599fe9 GIT binary patch literal 1533 zcmZ`%dpwj`82(Uchjz8tNl{ZFmeHsPT{ap&cO%BNW*f$kA~Tv{#wFkR$X!?>*DfpD zg?2C%)-|lz&@Rm)^HUl>>qo6?|Gm1Jn#EF=Z|v|ogA&UV76l*2-;#} zO>{;PC*7On&`c~&`W=N0{^kzm5LBL~AokuUZPKir9Uv%N8-n0i2wFiYcnX5p1PGd@ zLXg>Y2*NT7YEB)6AlYOmd$Q#i4~|8^l^B2kX+%eZOW}YM2>|>rgVvFkKeu4u86+*( z5gm7sxY(fHE37zP*| z5W)qven8h1(R4wy$cQ!>*+)hQo`_o@u=4|Ij)=rn@&K(t&C z0}qr3ny&F?{#oiyF<5(8$1};qFB5AI3_X!;_Q1?PvwKi<`$>mAyKv{JSbJ7s@5r0$ zzqVNh=Ni#62F7RB*VpG4K9)6fyGQ-Jha88sgNebpuV)vg=NF5sI!R$Sb~#_M4#_X9 ze75*;xmwWY6L(MBJ<*ACqon5f%)7;Ri%aECgiP<%YWO+sWxUKhluVhu*=%eSZJ!$JZ8Fc+SJGi-PXmn~`*DEO?xvai( zU~y^L)GrfHNo8hKw04gyEw2iMqj*Zn{vT6WS(VRv##UCv5{V@FPQwmTOjKS~*MLYY zUK6iLghNxHsK(eg!t!z%CNayyv&}P>>Q$w}hZD;22tjbBVhU z3idc7=h@(Z7joz{qUVMjJBv660Cf_w`xN342uvsl-W|z#B(op=ulg)!M;8>KusccBM) zmW_j@{KTejs8nzI3-e7i;f%)TO@9a)Tg!r}35qEx-i0v)=4)^-PLF}vqL7x5l61A4{~;w+ zA&q2hA5uwlqt4_Ne2Xp0%Ptxfsify#(@6m!5eP-s$Cgxb$?x zt!nOgiSfR9dj69@N(HCu@!XK3^(c?#&slo-D&lBiVBOMNh2dywKlzDlRyxa+GsQdN z(J?3JqP3A)RB#pxnoi)(s;>WCk0#mm7lzpaCR3!J?me2Qbdsn_Y^tuT%8V(S6|gn6yDX7}v<=ZnWH_twmRL zH8OGPJpnl|@j-qNti4Yt64&$5C)Z+Gda!)GS#&d62pt9J0O0@uPcX(C8j%SH%?O5O zhQ@k?17-xmkrr^_KZ2lO-vB@E{|jt$O?y#+dpOyHM-?TM=rmJ#&?_JtOGn~E3o7ytz75d- literal 0 HcmV?d00001 diff --git a/website/static/favicon.ico b/website/static/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..0145fbfbd5b887d60a9edca52036888a7d3cbd0d GIT binary patch literal 15086 zcmeHOX>?Ro5^l#CJ@aSAIdc>o(20nsFerM|;|!ysqXS})Eri8ELVyHF!X5}DguahO z!j6P}7eqlpQG~DvVMq2o5SAn?VF?KkLK3po)K{-xr#s#0yoLtCIrKS|`}*bGcfVV= zs&3t?YK!F&%cGWh^(@@_S-yS2VtLDAvH1DfzCU5HoaTE^aEt$U{k_F9f**K^pW!Z+ zAST?GPffjX_g7i1k1>6yl$xrPwvFka59kQLBb6!52Xuh3#WTh?n11It2mbz~vZ^uM zUQyAJr22)D>J{Vz>OiVTJ5muopgx^R#SAE6oT-d6l<6_df!javy;&+YrbKlQAT6*C zY0aJ`t!Z`N(5KZ%^940~hP1ZzNc9dT#(aY**oHqs4T;TFA^tkvCQtKtf2*9-q$+7G zo+pL1P%4S%P@CoQkm}c!wC2w-=1Pp+;3?+t*_)&WM;Ec&MDsj~RcI5^Dl^{=>_*GH zR{g_y4YXgBbqHx4-)H0poslFk=zgZ1o{6P&KJp8bc2L6r@@!wO~gZw<` z{CAZ92Tp#f>-(4?{|}u0GJg0szz_Qw{DDXNqx`Fqx&!;FcyCeuReWck*|#ahZzZks zf8FB8xZ^t1qo3pZ(WH=n@-x8U-99m_`Lp!H*l?N`)trX6_&ZrKk2~Ef&EjXQle_+# zZe(4e%=4#d)8g?oHLL**ZCcGVKY{u9Z)+$&=Q;@Y93eq~l+$_vgR)xi@$|t7*v>ohh!(i_#zK?3MjBi=W>+ z_VZWh#O`%eRB+3V0T(&fGHCy=i|MQA02&eST)F%l+N?SyE*e9**;k$V7v9RFl!IGn z`Gj6HrhQ$JOVc`L62HNdQSEBe_oKSnjCw*5li4(&iATfg9zpTk@D z(VWO8v}@%&%Fevt)W4{(fX*lHqg69vXhQHCVkaupF)#6BeIX|!18dSEtvwyt@-yY- zTyw%vkav?#?MZ>$6C25^jM=|}SiwWNJ(zoDF~mkkKgLe9=4?V?|%44`pAuQ3js zze>+T25;j->kC$3E@te;2Xo50kS24S-t$A&F+O)W^q1?~#qaPQ%wrgz>1Ou%n11_d zmgqGz)PNzF&K=uBlS2RH*5>Ma%F`k<2`oG3PwXeilH=z_=0#e{a_h1VKEQAA1n-7D zof7sQZTx1e$c2I7R&I{iDa_S)zHAGf#aza=e}#S=--A*QZKL9%LgN*@Mk8g-o%;C_ zKV<5YDs0nh&^N3bXOni@$2Nl>xMY6JgJ}^T(4N%`oowCu1z+41{Dw}CYWFfN9o>yi z?pe>a>82e!F0y(3p|39MFLJ2s6848V{hQG4Rr6hJQ*ludt(qR=Q~btykNf;p@hj4f z>~P{2aOYgR!h6FKn$LR!@Hwu%G4BxpHE6-$*0Lwx%+5kL`={_$zR1x}6MKs-bMZHB zLw*c>o7nj+T0PrJ=_e05$tiUAdd7L$xuWdetlJ&~cU+rVv}8mu9ovyW`8Tuem~nB7 z_vYlCYw5d@U1(I>mxS-==Qw}4_6EQ7uSS!*y(9Z*#@Q28Qe12wx1^+4e51`vCeqaK z_ucwNShF$z`-kY~>HV9iAV1gM9~ao04{iK`zP7fr`$leY8}`pEe#Q~O)%^q56f^#oBmT>2$7#dDIN=F!xwlKDd$n8an1fmVGhd;vdlDAX;^7_HKdV)~ zP8qx@(*i%v4Qp8EP5WnM-r+J2llakZDEkP&AZzT-7F0M^HSw>-?s||j7mS|X>ji$V z-dpaNZfsz=&-zY&e1qKt9&hKuHcjSFIR4PkZT#VZ zz^^pYLOJ*1E8X%|7H;c#2mT9w*H$OFTEqE4W1DCbX|&q?=JK0M%u4-;6M)S!NhU(J;qYV6=bB{|5-z6OjB zxudXF$iZhYHDs#Fb4ZZ7hoJZL+5yZF_Ovn)hSlq zTmw<0`g9@{@`>(KATQu63Te#yB=0j`lRqK9uEN`pis}izXEWAu-2MgFjSqjX#`lM_ zKBTZ*ah-=1&-#v(g1+4@m2lrorUb?m$n-}8_cdJn*9W zhkw1`fECX&|BN;f-Q zF4eeqV*>}q|BQ1&kcG(Z_hEeI^?e<`63o9H$LIzROm@Hiw!FLf!D5)0e#^m*g0q1XkpyE}uCr&mw+(a_nvB3+c4oS`q zxy1C72Pk1?tW&%YIkNb!^(Fq9aVA+}*~r(OIl7Zp#7AOg$e-Er zDR>{=i#Rc2{Tsd>E%8>p=0UGRK^!w-#$ZZ6ae#9eMVt@dSo-P1v}TTyc&RZrkrBK6 zIj_I{8Jnztf8e8$k2)dwC_PtxDK$xA^jHV<(=k`!b*f9q(WD;SD)D73PTJuedOja> zH!=URIDlbD<0oa#$F{GM^+tYTT7+vJ%=*bwEQ3!;9R2ix&GPJ3j;$MUUT?<7+`xlL zA#c;V`NQc_%28b&IG35i^RvGb^Jk2}J*E4*oHHFqSI(W}^(qz_PTIbbMsvM^$fJq* z%ez>%riM2l4N;5bYj;! z&O3#OO|kQ|g7J}inAxWh?c{ot>??X*19GOvcC4nwBZ4W;9&fKIwJLL?n$g}hi=_4g zs6 zpVu3?dE^0iulh=CYkBoJ;QQ=;{scYP{=+o$c^ePoBVGZ!4;x%z4v61_y#lg{wKe3= zzRrBl?X}18(TDdm_$cM|cf8Nmq8rVn9@AouL^>BP%e;fa!BXhOZY)8QpcWZSw?uq}8-x>@$ z%yp&-5|=@oQZN9=T_lW+SXV?_#4aW=)n`3SQi$WUdRg}c;g5Pl0jxh9gQ}Qb)PL&| z9>`~(nDsn%4ci&`T|SQ{szH4V)qo!4HL(suk4#ZaR3^uh=JD9IFm@tG4Xk=3=AK4l zFeb)EoC0A9KPG#ef`4mP_M-+x2C4AC<18yTn6jOz@eS4G<6NdZTWehBaa@688c|L8 zjGwMG_w!!H@w=XgcKh_-lH8t-s8Ihb=`V5(KhgC)`aReCqLU%$k6P@fCFhO$3fwpR zPF&;6V4Rm+bh%68EG-y*BF+}Cvmdic>MW*l4VA_|7JS9Eb2O>l!FdO@JWgjATYu;! zY9(j(ZX~sRs43gIVh+vXT0i*d@b^#cOO$gHYTn>83x0?G_zu4Tgt{EmAftvEK2Pk& zf0bHO`0zKcXG%R1p3@xrGY?QV03T=f%K386fPV;|40A)xAZmF~3yd?Q@YR?<>pn1{ zHU{Sj)b*i$2>bWcd z#4qdST4Ms7GFSe;@XWF8(kM&o^by}LM?M^%b$8vl;T`v9{kbT=AN1BXv(Bloz+-Hi idZ}*BG9ZWU=|ep>kDR{)sjz@F_7mD$@4z~t@Bab!?d6{U literal 0 HcmV?d00001 diff --git a/website/static/img/docusaurus-social-card.jpg b/website/static/img/docusaurus-social-card.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ffcb448210e1a456cb3588ae8b396a597501f187 GIT binary patch literal 55746 zcmbq(by$^M)9+14OPA6h5)#tgAkrW$rF5rshja^@6p-$cZlt9Iq*J;!NH?5&>+^i? zd%l0pA7}Qy_I1b1tTi)h&HByS>tW_$1;CblCG!e^g989K@B=)|13|!}zl4PJ2n7Wh z1qB@q6%`E~2jemL!Fh^}hYfz85|I!R5RwovP?C~TGO*Io(y{V!aPUb>O6%!)!~Op% zc=!h3pup!KRwBSr0q{6*2sm&L-2e})oA3y5u+IKNa7f6Ak5CX$;b9M9ul{`jn)3(= z0TCG<li6i8=o)3kSrx^3DjJi7W8(8t_%PJ~8lVjC z2VTPD&_&_>060+qq1c&?u#iAbP9wbT2jg5_aX>LlOOXw|dQJ8p&2XYYDc|J+YUT?3|Fxm{f?d*1vFWPGwXt8P3T#_TQB*NSP3+0+ndOe%v- zTZotCfofsS06&ki{<`Cj8{s5jFZc&1dl<{IBW%#V_!JjOm6+#&aRi;8ODL(?0fENIOtiNXjMhdO24CeDB#rNcC*<=TwpueFfx=2=r z-lt`qW^;vEFji%7kO25#YkwjKyZ93WFbbY!Q6-@Jz!9kqj>xgp2VhEYyMJwMYyHZV zG;7!MV>54LS*F?==$6(Z9S zfrEy``J-iu6G?#+q=$58MlrE}+C~G-hEMn#CuNuuVV;8#FHuD_feqmtfw~Ran|V#C zy+f^&q>|d(X{ubCVWs3Ai;Fz>-kAk`yX{^Qj_xV#NEV8oxtfCsq3%uYN0U4+Kcu%j z?Rzr+fnu%QVSgx7Z8;iqDfklVK3tl(C|B5~_ywyQf&|IJgyoV|q( z<1`6^2G=2%pTX$m#~!Q-7f>sA;n6 zsy{fJ>o;yxpRCMtZFb#E)dl;n&K%g;H?#HaC_HvnHuqN*d+9vB7ZNpfqqTsk*(((>8<~)=+HX!*Ss3~|# zShAf@XL@`g)$G$rAA9cU; zk+0v$7Rl=PDs_rN&*@^DQ<3}LIqeDu_8cvBZoZQK#xaB*@qDhG^d_fYSBG@Y_wC5B zy{FTF=4jI`H0PRGXlulcwJ$*KBs^);$y@AfTWB!przp%+gn+%ZU2qD$Eml|2m?K;y zsAx49(J!Aq5lqX4u5Rlh{1hD6V?uI0-0}%=eSBZT$;aWCJrM*G=&(~P~7QxUJFlHF+63{SfFhWU%gt&D(4Z~X54CH?JsJEHzO9{;5# z5f-P_*$Y>=CXYL(i4Vw1)$Y&DwihU}jeLyuS2hQ>zS%^7!rET)y)?ZI;W^c(neZ5; zcYHr@l=i48ImXZ(y)o<7>Av^Nw!8t!KDn{67gef*G5f-&iZ;`G@ej`@uBTkn0_QVc zw|RGr%!y|LdrjWk$H6iyi9+o%)D%pY)DHt@e}~ z-ryeSdskl$jkA%Gje(z=CvGUb4lqb$@>K02q8; zBpGv48m)G3Jz8nD`*7z;ch+s~JId9q{~KmJV4qG#VyhtwGh1U7ZW~XgF&CHVcfjI@4|IAMzt7B{D4ttmRhW76WO-cP6HX>7cPSIon_Pic=YB^cwH;qqm2b=+@OjfH55;lLt@>%R&7MejNBW98rLJXZZQtF zmm<7wrV(U^X%O}rZp($;Nb;(nTO##-Fk_K%y2c4)Yt?EsKDLVz&SyIxmRvPYUf)~A zkMkfE4X%Dz8*f>*I$-5J)wLSdUUaV&xP%U!WXidR7*F!E3|fu1supvKyq>T*84`M& z=Dt)zp4h*&a^3bbAWSy|{$~mRt znU?J9X@W)z1+)2SKH;RDEk{C{F~PxzePOC4k2I22=OxAKZEhYTo#jZLnzJRvL-#I` z%_%U{YhbA5LxSuc7mb|<#t0l8BZHy-cvj?r(|M5YOMU0wJ}PLj6z+91PP@u~sUN(0 zoPkUiqj+}m^;#5WI-p1sl3!d`><`0$1U4*Tus{#@{oJ~C_^ll&fIY{RWHLB)Iw~-5 z_trhoc*;Xx|5u&|7Q=~%>SU9dJXt>XnSP z$}G4aR=bB#EC~i5U_z8$Olb|B1Ec2J6a`$P64P%*8UxnscnAmYxki;vGRSH!M<=El z7AwT}?l;S3Ju)fk9NDaW<~K*9J6DCaimLP@Zry38*StONeVaYg4GMSV1sb;$0#63E znXJh6$=|17p)3iget{zQI-ZcSA4kztpbVusXh9 z97)P(^GVx?9}T_w+?VG}Hu2dxs!PdI;c!Skm{8crbnUpgGsmO6Y~0f~`3af#=;}JO zs+>jl(}Ww@TF9nIIp*io9|Ar+SXKeoJ2p0xqq^dDIUaz_3UMRe!*?g>RKH02EKY^8E=Ov%mKqCKc_O8|58B$F z2nPy$8uP`nq5-GE>)_IseB*$*+;W_EcowmS_|Q%w=6aW(&AB z%OtxG-1&Xrq>E%{bjzK4kBw z>Fssz$u`@4(H4(yPd(wlj>oT~6v>IV?P zZDj-meBV3Xh&lOz7Q@p@Wg;VMtEtz0tWmBTlY%+n#pR{sF{)xA5u*BuDd zu~BvH^44yI-2poCTSulFIMHH|6$HIN2!U|l513rs>o5b7&T060H4stH!Rj6uhJ>*c z|EXULN z@Ms{ehhc57nJbz5tP(eS6gqwNx4;1P!wL~Xzd!0hhz^)}wUrh90P!E%NrcHnd5moayrW^mwAO&F9eVphr}#sl@u5#&@cZG3Pef_5ki2d4No`s`w>3E)~NzQq~(%!wQ~iX zS=!>QgW*;6d%-30eCYi-s{}L5+4xRvjRMVc-|_!cJZOOW|D`V>G$9BAul9zT%D`1W z9M}_f^IBfCT+$nV07$(ZMgM6Q>awY7HarX62K->7rWiZ>Plf%@Tc$X)SUE~YSzKHO zOo@t904vq~)2~8z9N~Y(5ghjQaweijSq9}$13ISo#S19Gyn+S8<}IqydMB*M2Fv(F;m*Z^NjCKA@hf(byh~F_Wz8Y|LB9G zj>CREj|u0+^+~|!q^Z4wYAm~DH8vU0K5hJLx;^WW) zn1WdmfwUxh0&F)Ge zJJ$CZ;Gif2pJe@g3jR{7X$9eG;iwp*gh^4;#?q$usU`sYWi;VGk9zUsuxLCqS?i4> zU*!nKB+RzHh&TF;OaYU1boXkFHseTZ9^7*ClUf6WeOAm2`Zgc?XVxs@; z3fyjS*rbEGB3x27NK$sQDLqTsoYX+=I47hKrjQhxw>;|F(o#M)1Zs3=vHf+{4*=lU zQU(~L2n)P!C zOzn-%j;-zdo*A78MJ(b}aNl*Pd%bH4<%$K3cP@a%?zXvnXr7tnRf8PyxM=h2%x6XV zGm+MfF#t#t=FVq6y^o&};nl4gZ1=OgS0W6oT4??aAn_EswVeD=G?0*F3Ky5X?YMg! z*>m;`U68Bw-j3*NS)Xv59AyM$#IrAaBLy!3%T~RztCkOyD`0Oh)~c45m`f(fWkn+8 zFDQ?ehB?iesKfXr>kR(d+^nK;|$bJ0BgK9l#= zSZkY0hNH`T%pTpu&S<)sN$BmKep32<*GjviX5<~dm2S)BRn}Za<=11?iR0CbzUy=Y zs!S!r=YBKN!Hvrz2HB~apVp)gQ@jZ_C@MZHwF>*RQt`RvqEl`)rFXy;*9O;aJ^+IS zAuxBFkwxDhrD+zs6}YE;!WWE7N;x=xxy(hv8tOrT%;~evWtP_;i-tw#{=|s|_1gD} z+$ZPC>;C15y?f=k!B)}XV?@W+W5Jl7E#au2n|eXFYo52!7iV_nr>%rHTLnmp5t__ zeQ~n3Y!)Mwq>pgU`A+DOtI(5{uM`!T&#y7{XqPhrZyx}q50{b`55VTpH9@&go43WC zqZc?IJ_ikEfm4 zqiap;*teY3XjF&M`E)w#v0j2fK8>&^=3ARl7X5?sL7($cGUyT(&GjZ}T7K}UWUq6o zgZIm=(`C|a=eg_1ZeQ8aAv^V`3$rbeo%f|J-#teM&do=aJ4+|bCGzXl53;$~hV*A0ZA5ycpm&br> z1s-woGI3ag*H2HL@1`7`+#zk!nQo^`L}FmXBF9_OVvslb3Qd{^lg7NlT6j-eh)ldq zIsckeM z_udDHz~0vrwpZ3KkTG;-vI!dRfSCp$d>Y)?cj8N5Tr%KDYlI~&_w+W~Esn4I>jEK8 zFVT=y$0H**Z{;PZsC?US7QBb(=tZKtCHDjvqV8L^j>>H?^4A4kTvR^*B7Ecb4?qFk z;I3A-%I#4)i|WCd)!jLZw1itTxsZ$F`MsNa(gzoB&z!Z262^le=~~4I&U`Eb`C+z^ z-VqlxQ;MGC=e90n>dE>aoHV5TkqviF0s?l+z${VoH%t8KFvbH=8^6e$^AlVGU~39o z`MtfitBvEM13&NqqE=`^fHwS_HEw#UDbHmBR+1A|sO+c44k$ zHR9{S!q-(m1a+=}nRGQkrWg-S#Cg;_7%!4Ry2VnE5r>E(^0Gl4^r-P`1z2qO@^9(pRjEp!;DAe7B)FZP$pa4?IWYcn*v>YZ(G2ETw zy|C4)s}8H`Ddud6ogaW9O%*z&O_X=V^6P+mS%uG2EcbTZmk$RT3*(0o4D%(Ts3kn3 zR^3eYF*}KjX-S8m()tqnj4;!Sp!Ho z(7&2M@h1HM;%Et+(u{~Toh0sg@7K`vuJ8O(-mWug9HRvjKP2RmGqWQF%DK(bM_*a0 z>f3#KhBt~#=bL&FWEC}JiXdh?Q9fn5e)7$+{?1Bdf8>;*vDW!BMGjU0?$JBadm(AQ zHAmi$WF|HJ@r5-F$f^VPE+X>suAfbT1DUvi%}6k2#y?ZFyltx!?p zAr?D|oG4gh_c+U9sb>u3LP&?IzmiCo$x4%SP!Q8Q(jEtG(-GPNIhRV_K5L z7Q77k6Jdl2*V9zOs=X@?=vUZ(27Ngc&%L;RjmxGl273=|7++0XC*K z9Zp<^Y~Pm)w3D*jwEo<^OkS4Y<#>lqUb=O)W%Fa5t!Yi<%z$TRIO#_Z7Q3QZ2H5BD@(x_63h;Y($5taTf_%0;ZvK_v)P3}%^YaRF4ri60UEoVB z9tvN{)Jtntfs9Z(yp!blwx06#5$P9W8ouO?r4Ila4@;@S!F4qL>h!`rvxwm8$-&c` zq^<(9nR=GK@B4e0qjX45ZoSs3?|jeZ@13@KMK0R)%1IlSsLp0DH)BFK20FoEM2kwW zSasI{O!BwCJ+a#u@A3ot$06uqU?n&`1G^@J*u|t@Fqwmwe+Wf0fpg%{_PCq6A2+)j z2hE=ehK9p~efCY}}Fj~mMr1Qr~qOdueZ6a_2SDwHZ*lG#r|D%`UFa~RYpuWgUN;*|PxsXBBeqTj`RJnU2 z9PE7zrU|}#_j#k%TQeT63k<&b?|z^RNGOSfltB4MjA|mxqLrdoZ?;jS1BSRxcR{3 z&%l5U(~v7ESy(7pNhyb$1x}p^+*ny$*~6KoZMdfentT6QH1Dr`Dd@U^^%MTqyRNen zJ1b!yKUiiizxRn-n~&g}YvqM*{G%USoM1&>P*AuSldPnqET|FpU!M=af1wNq_3z-J zu56ng_&fk$SpR2Tg&VxTY(oJPP3gAh>wSjZ5#J1#nHbkU`Cof;dA1dQz?$+;E7aQf zK?$L1IL6d(9>vPMi+iISD+SJz*W!e)X$i&Pwc(XN-;gZPke+O!zgm29u4?v!xUP9C zcK48Y@K`NN;M7x{1@te z=@S`oF&M(3^!G8wji3Z4u|IZUp?p~QVc?q&l}!U>SAWC+@B3Q=M8Gx8SMIb+e*r+q z{Yg@g$}_Sz-mgRV1*RA!0Rj$rc-W8!5u7m!h@?;r;RvN(6Nx9m1}wb6UV=69pH!1u4ND1C3^0#GV9Vk5v%jLF1iBkM+~_oe#(k6e04;|1 zqVxcTK}B~<8@cW$rb+NWw4LZ7KVGkN-UHS;bD^cK+2-3`Rj^V98<9f`kPTuKt;S`5 z?|)V)15P$Dy~TG^p+BRJpbTIN2fb57!5|jT#s_X^pnNi>exLT+xuR}kI zLTF>DrKH5As1d;xUMq}JD`rE#xm<3PV^bKt~*|K(@>_s$+l6?PG9c;I$Y$I9Wx zA;xF_MZf_#OaTl`qJ^-80rMXYZnX;yHMnC5N`v2j=zq5Pz&RPG92*Z}aj95Z+R(pq z5>Xr9FJ8qsGy#`dMOy$X4%|!w<&^&whNI5zri}lV6#?4!$Ljbv_f0<2-3Nu?974eOh|NodBrc6s{g264H^#+vv zkI(-F!??JN@B<(iW`KcV-0ngu+-@)j;0A>UFo`kAQKI6|7gl5B1rI>b2tj!?@U%?! zpFY4#g}oL@l|*Hrm#l)1qwa_0RO)Vc;oKlpABihvuq26}r$$LgB-%uwqRxuRrpyG- z63Ji#aENg52nfiiNRQwVk-^yt-aSGBkWsL4aPbK7DcQKVMb!z2h+ndEs=YI%qUPWc zQ>IZ-)zB2Te@6Q%>$!xa)SLHy;OQb1@YE3;2Jiq}T8Nyd)7_1XLd)Qqf~l-gf<mu~bv_xL2)jRuX@t1;#}dEe+$KYBs8Ozc8vKSmQMe zW+znS+=sB{$!eWdtEK&;U{CqQ65Mz$g8{KO3091K?+PmZnxe)Uj z+Qa!s1zBptH)^y=Y^r;+YwUV(!nv}S<^CwP->`OJJ9$f5gUG$;btdeT%D1lTQVA%c1zi!li^! zRC4P;e}Vde23*`#o$}dkJ+39wA!C@gdHJNz_ROozn%~qZ35{gxr zfiN+FJmv8BeiZfN4}PZY+~4(EHI@`4GB%VeN^dL-nxv{!>bS=G=d1&YuW4g(RYo?9 z1bQp@-L75k9jgsahz$6&S+Al>N$6|(Uspyh?G^CV(>yb-uEMv?{QHK7y|JZHbV$py z%-C#HQ^wHzF5_m4mG%K(t4T}wM0ZA{r9PYV^B7{;x3r!Xhwb>CR?<2{=4)iW>-lFp zYAZW-ff6Srzcmf>ey26kFp~2&CwAle919+v=b#GbfQ_k(^GDH^U5h6Ij_hJl+$cY7 z`$l|J9)NY0%G=H3-AiTp4`ibZCebLFOx0X*^9LW5S-jM98V1l7TC$z>H_cy3Z}AyT z7cVLl@}RT$dt1%R4$rYgTUqZJB_<@D5gGBnLzk|&Ap3rHOWJjl)n=4BT|4ZgqT{Y# zt8otJt6vZPNdUZ->2VQc|t#}@1f$zuiGu7Z`2Eq_iUO7kLfvf z3+3l;rJH=!P82eCED=AEqW3F^^w0nBW|fbIo$+A)nzK!N%82P?SXGa`4vSNK00<2u zG?U_{jq8ikbd8p@c-wd;R3TJ+v(c9o9< z15te~^)#o6%yp?zaR-=9=hVgU2)|jpPHt`JGmCnIB+qepbmFikm>#nfBmU{7vA8^z zhTK~#rjjnUOtV*azuR=2pq%=qDo}!HCW$#qTWyAliZ8Xa(cAZ0uV^tvuLjr-#E|<6 zgACc9`oD!F+lpA=rLNEf$nCx{x6Vg$hB|ia>mt1(@zkT4(zdKQrNiynVbyP`+<(GC zZSyg_F+eKZ$i9krPDP!?9!-GQV7-#k7*{YGhxdf%D@)yd=P%=c?r60bP2qytty%-G zh7;7A?%TTQIkk;cPgbW*m6aq{m1>`^R}`Bmi$Y$X?QaEJ3_Auk*q^L1i~N3dGM6CL zP<_JeZDBHK(^_7!@i}$(_U*t}@%hy|H{~Q{;gP|bU)fn%xGdctI%`>elX|Q^@vKaK z!d+`Jp@j=)v%^wXH{7|-__X;}-BP#uIY3=_0IGNc zu~4o%m8|B~5EtZ$^}=3sv!lGEYU+H?Y3%_wM6P8#*6#HJvT!3ul#<{n9ja- zRGu5okTwJ1Zmk}BqcGi4_;~IURanbdr+P5iXG<{exUhhs+*pLQ^{jA#EZ#>o0{+2Mh|5& za#ugek0I`(zQL#5eLDARVY*Xa(DwdUqkel}vhN3?;f0iO-H(xqufvN&!zQI78i>uE z8>&m)ewHaoGgtXPku_dEb6PORWr~;1cC<+G5K=KBl%`A&gp6C>lB)v5Ri$FsN;P4>0AbJz7kC<~Dg6Mg7fXVHmZhEHpA*eA&u za?3ON*{!W8PYLPoTR+cR&PxuH$lp`AWkTjWWz)Zkn3TIiCEofih+Lm=9GE(9)!Yfc zt(H1<`s=^*222e=?7hC0lh4e7B}PtVI_{cAdxGNtdfZX}Ca>Ti9YS^NB6cCtzFtR} zgaj!>#THZKLuuFqeb58ou+VPMIV94Az9}?pq(nm5%Nr@`CDh7dQqUo_(1Ka~Jk;oawETtB8>b`mRyBtgh zO#hV*Tx!lPBM`YD{&wUnqnt2DkRmgRC{h$?KYyR zNy|HI%;HhKQrs~er!LN>c2+qWT)k%E+~E5H9eFKV;EhkieNbfqMTavz)YO`;;q)r^ zRKcAY}gLEwaGA zNB*t;%C<*Y+tgCdcJX-=MUjGgyz~ESiO9#&b61{-h<+|2 zO;mjRZ}0|pCLmN$E}rD#(9h}~)QpVO*=OQA z#Y%e{>N&D?0uC{dY5L(<8J1$SoXTWsj~6x5e9=~^#nEWa^lWqnid)H7wg`B&H>nuf zicIgRBoFD2ii?SfJ43AUH&TVFO^DDYcT;;?zvOP%hwr9IDk(8n^Rrc$KG_W$S^CCU zJn=ZugG;lxxPrOnJdw}Typ5n~t5&$I{si5!MLacZa-r_WCh{j~l7-Op=$9TV5idhN zglm&=R)0UNEvq|kz+%&#x}Q{2@c3ZLBldp!yX7N~c^eZPht|o%1isQe*+RisbVF_% zc)4$!;>pF);4JrP4@@UX#!&8hI;B{0l7;+j>*r10Q|es&1NFKQ)-tV2$Om$A@O-## zCLqC6viD-87K8StG^Ws5ct0&olMkYox>$?+Dv3O{NlG}G;g5QSmf4?q;BsuQo`^U|{x}>ACKXRkdd^tU`U+|LS znWy0^S2)LcB@0!EdDt(Vij$36^78r3tM}C?KI}e^X9-D}*M!iFT%zNr0Gf&Ck7!`A>(uLE(OdeRwb4qX3EiMVz=vWC3?2PE%-wA%a1ap0C zl~rRJyzSkY8Ag$Lm-Lq^*t1^}+zs%@8si;z!Aaw5c$|~Vez}RpL6m1>KPeiGJ-kE2 zbc5&X&fJgVtRw*RtiMc#4#s3H)KgHzHqg{R3E#R(bk3b8<&|L5d#($dxdtH$sL)Ko zW+BbDfPQKTs#e36Joca~N!pf`_Le7~Lv03)(7sml@e{h^6)?B<b% z4<^3n;sOFVdZ|+>M(^LPJA^2T?>N`FCB!o7f5xo^osCpJG~aJR*pRaJ`|hF>b2{X( z4aKEJ#QV2I?XR1|0J3}|ZH&ySn!Nm=`P+m<#hI$;xz?{pkF56P+%fUR#QbB?5vU@D z`>PliKDIXEyl0$1ZZC5zk$jU4dGg+)S}VQJ{2eA&|CmIoN#1+}`@$?!Mu3F2+9T02 ze0p5ot83?2=!y%bJ6DW(u9o4&WO$pZ4(odr6?FoB7XL4e)f!oeU;7hCto!x9u^3y2 z_p)OlA3aa{6K=F7$1_8Kool5Rz84;b!W+-X$m#2JgTdGR`~%<5^BB{h$tmHspv zRGNoo-aTFhEpL1CiLM*gJ|XE30ntfqZ6RW8RmFz7r7ZSdo2F`+dbIqX^P95F?^XML zEd;Je?~!LW2b^bUTSOUq6$IdZfuOEh#~DDY>}8&v?k$U}JNqeWBw+k5RaOv)s}jE= zQ}Q=>D-=P$ONyT$s*Ds6LSFrpWZV z9vm@*jijy=tPX3=aU<`d%SuI}+t_(ucyRkiyAE)B^U$L7DbCd`ZfC1GSJ8C#vU2#vSFtvhw(~TDanF;rn!a zWgH2WF*ekmAnI0Qm{vS{Le0(+uM5o()7|2IRkMwT_#?fPo-fNKuG}%_?WB5XSGAlb zor5}ub|f^JD<-m8x~AHfvW<5`F`lhl67hM38YaG)q~vy{D&^Yntrm?>4z^ZOsgY#Q z1rH+LbV>KeLE_&Mx4guoLMo);;h{zA@6Vg{<*=;A?ow0;2nhIdN=lYmb%EU~F+?HH zLaoso&FKfglw9l+vgl0wD}L>5CraD=W3%oYoYELRdWj9p+A0?Z!6LgiDg#Eu>Ssf0 z&g1y!IZG_R=3hb@lHbRp(1j)&W)S7%^q<5B2`lgE5Sih9hn&%pLfAg~&g4O!dAzEw zr6}!RX6}Ey-TL;=D!pNqHJX2g5o#)RC9PgCs$st=+TNbHeB0ziMr46BDXhn3@+9lb zakzM5tAy8y(qP%tE{ZSGapnb4Z^LN!*_y7=s>e||+mVpl^pnes7OO}vC4KH*VY&(u zBMQ9fD2JG^z22EVkkJ~(SO;UACk7d9{ug7_|C8~{@mt)aT#ZU+DQOUbF#6axF}^Fd zmhtBwd{#Y3lNT?|FIsK&gZ~-#n-Y__6Paff`W5$GI_?&4)>Y6wNn%X>=Sz?np7Qyo zZH9g7Vq#S+Wke2_L1>5intVG>$_RV=;j_%`e4O#OwWIFnFw^vf``;Nw$R9Y&G7L@Q zEpjyn?t&uTR?$ToG6e_w*elUbNC~oP3@8{6T6R7*{BS$ppthlyGy84Q%jeFbF-1n> zO)SGM6LD+T;r0urWn8w~gEyVb*0_W98_BXWEHC7aW9+`WLmR`7N+r~9=L(~xq$Jgb zc0`M~DlkIF1Q$x214|&HJK67p$TCg(T6J$4SH->xR%+&~^((0Nxq2lp^|OY^7-4i; zBL#gyG5+ECIpe3%Ik#hK5FP>?%G+Pa7_Z}b`G(asWH1;##`0)}=0g~DiAQ%12Cj5i z28T%p_C$R@L_1|{@r`H-3@utWDI40LfR4i!SA32m0qYI@45{@x~z)w#KlJvgXw}%|m zRo=DGsu9QXI-g+Tl7VIjr}mX;4fZ(YL6iQz z`lznb+}yW8^|YL;n26~KwXN#Dv2^Jf8J;RGE5MC0?77MSdMq!OZES zr@rC*vXhutbr*g#pI;TJ7-h(_N3>Ax$cW*Hvendxf#T2KHpKfFv0s*GVYIHa#ER76 zH)fn1{!z7-v31;4FFC;np`(vIh~mi%Kk6K0qRrbY_10$&xciNpno*F#wFH=MCWkdaFgK=U$FHh6#XJ6e393;9h_D1Zj72KeX!pg_>9E<8*a-g z^}Kf2k*_7=T(WO~W~`LQ`#b^ur_5KjDOs!UUZE)a4ErIxiW)A?ryWE_hQ{K-z66() zy-hd_Wf6g>qeoGlrK;PChpG^jPZRHd1~2MDVv*}eCafA~rLyFEm7f|EuG-#T2SgA< zQulXvo;0LIo^229Q9ItQ+RBrWH?~QpcDh9k(_=n;aXhtJh!9kR$kCNj9kJ=~BEU51 ziIB~(jdq=S3*TzWE4mQ!!I|ecuJydbjIPp*Xw5Ghu@wSqzc$S6Ix+3baF**T>Mt41 zK!k+2I%~h$4?s4Ot~MGVS3+Ob?$pC%AG>el2v|PfPf#)JsHx(Ctgl_0O>zUrPSn=nDj;t;8OUo=NMf=eZW`H&)xh@0RbL zug`wD9%>dDMf!g1Mmbzz7-EO^Yys;ref6{S7=chPEbgzvK3Ygwd;HLVo?}5(#ACVb zWsLd8mLOML?j@oEu`Ybe-Ndygs{ANWu zTYi}_YQ<948Jzmju!q^KwWli0(I_g&4zh3T`JS8oyS-JxRIlxlOkv13y^u$ebFvDyZKo49C5A{;Tr}MGMfceW3vqv{k;$^5ymBa8D>MecFsutjT zA|2ncpoEfZ3}EUt@Ng34X@75@l=LMd z^xZ7gESH4|2|k980z_jCp=#YZA)wxX8X~1diHoFqFvh?^Q;)oZcQ^W-l}yf5-ITM^aKZ zdfcjKlYl-&+8kEemP6lOR$P)7OO`b%yP(T25cq|hroP0p;{1@NydW2?&Uu!(^E(fD z#^%)iOUjTB^}P|c>sOo(_ivgq!yorSoV_H}q{tDvSL(K+bRbh52yrU?;o;#a1$BI; zG0RiGi1qO#MDdZ{{&bK@3)dmD(0ps&@XAgmQ$@l-h4Gx@t|NQC$u0q^d(ku>t~*n- zd~721PFdAKA^EX@ux5Tar!^~Q?kN4Q#)8B>%mcd&9luSEH|o>s^4tryTublkdEEI{ zKR#&=Y~)FcH*t4`M?g&TY~~}M>#}&vt3FYW)XMt2n{6+LCM@Vc2}fP)OONUg_(3`R zRab{`pOc0H4Vwb&4_9$Hs=7gmE~%pp$%I+QRt~Z=N*)eeji{_PhDB=gEL1PPqQmXj ziAC29F0k*5&JI!cBe@oy3-j>BSk^9W)qi|x9siuq!?B_AiaL9Ia3GgP?P`@aa0sC%Vx~ z4_H;|sIZ_baSi_@V?ArUq-+ig)fyk1eXqmTJP^R3h2&8I=PKcQB=1Si$Yi>2^`ec` zWhT-zHa%mNK+fB?4Hfg(dl$9ssVh57orM0LPj=M|2|5Z33$ZS1MD#ToTy?*a5E<)o zZ^vgVRHt{{s?S|cu9e|pBs<_KW^^?c+z zVk*-fa)Av4H$i8mAsYz;V>N#~@y4qSwKG%ox#ZW_-xaK$Fo)u_7H+~xDQI%!Bh|re zEIa^~TT?%8*jT^u!yxl1>%qYTu)I_Iwf#Cm!)=kQd!PDS6W_)FgT0q+ohn_P|7b-8%kc;m zg1^9mPpG^{HSkKoxNcleZ|3O*V?9Y(hvnWYam7N)*3PotcW%Kd$xrtzn4cx+@DGp{ zFPwjuW6B=Zy)W%}`8}SIrnZJ4SEixC`5nMMSLxD`jCML$)Oa|F+)t9}6J=&fRyZ_^ z*(>evV$1-$K&$Aa2X9j!@6ZDeqAYa1l-8b9FTg}aF(uUeG0nO9eI}>KD(22{Y3iez z8sj(PllCVvngk!res$*`DI4Nz8|c28;b3g=9C+P-zJQd-I3R2Rjn*zpn2l7K`Dk-4 zq4GHFR>DRKlZC)XE(X!Rv+KEpkgX@Ph)0`3j~T?RfLQbFSRt^V`+L0ShrurdA)6#R zbvLEIWqYfi#>&qP=f_x+*)14zkd8ci08%!rf(xnWtQ7*>#*Q3lqkb5ZF8F>;{gl*e(oha^!C7JqB6_d~123dt*fdvJq(?6p*0LOR6U zl~o@(cjQPyT3~|OL^gOFW$f2uVn7?jn#?#D74*G0zSOzzEpH3+v@4X!>%a#ZdTNAo z02SDS+U^x)AN~i#!qbx+7~#+diA%C-494h3`5HW7V|SpXT!d-y6K;E6??0eZ_5aM0iGa7jgD1?z-2)tt(?%)HrV0P2IbUwxg)d%!3 z4(Qq8t4L!w^x)eVTb&7NdkTc^eWb9hI4uNo=4Vx(!X0`ZmUUTkqhL%zXoLtLh)Z5V zt{c8kL1$SYHBbFM)7D;w($|K!o|>Tg+asAc(_eT~?!65~_r`GLc;t~??0R+=C$8+% zSU9dXJbLgR#?h~h;~9v{d|1ty%Q<2)Xi_iT>Z%Bt?C^@A1-{?xP6+qny4pNWax8sr zh$_z;Rh0)xfA?_O?hY?gv-D6ddJNR4@Y&jc|MeC)wpLV5P2%7;{EV$#ZcqAzo!qmx z?ntfHdsSvdZRqSGv5P*ec0FDX*}Bmbt}B=gb58YCcP~YrMboq0D&KRi(a*1$I=D`) z(2;{aX$+9#~ce9s7Dc;AlEy)1ge>u4P`ls#tV!AH}{Mrf3Ev0g>k_on;O1VUFJ zja5^PD~MNp_xa--s%kd#tw&d-JDVyx?UVu)d+29O8LvL)y+8u|%P4{5!jguGKBVVX zp!?(Q-W+--0V4ud;Ga3@%BC&Ar4xVyW%TLQs?ySqbxoXLB9 zegDO|`1jpj(`&Du>guZMs^_U@SzO2wiCx{s6}xlc&#oh~?+TXf7P=r0OSNAfr7?9= z+=L&!eF>@TAe>!T(a=TM0@E)Zl#UnR35M&^|&$%M!ToyO7X*>OO8DdjGdIhHXPX z?svWHw5|YD^yy!Ed6saf6-1ZQANVTlA1J0y8BhWitD!fgc0O*ZogU?W{Bt5=|3G*4 z0jq4((3_~e7hRJuRM`){U|z**Fm`udnq^RoEE9-!$k5NS%TzM(uPX~_hfO9JTpe|K z%R@gT`}pR!(lNGD0G4yAhj zMEi$N{5aLE!7mDWy`(!%x!PN3{hv3%S)|U`OK02zn;mkigLW|8Cqk||nYC#RM3piP z1hL@Q<|b|GXjZHE1wYf7mwb8HTsHNp&aOo8IRTPw{J4rdTvT7LGO=6`h|uC8t^tE^ z2nXn^x%`~8UdLhe>F%x^KudaWuj^CIgH|`GNqTS1huhCeAzR|zcVN*+D^GZvg@t6{ zt%Jlv;t+k^cO{`*Oyu4vy&A6z3MJqkIX9c1AKljGEZooh3;N(+_BT<651L-I+e8z) zJj{Ug6s~`2z968B!3)qy`JqVw0XcMz?Z)C-ni;Puf&MR5s_EUj`9^N zc;)D0ekKK2F19`-g_u62@O@lqzi$?uQmFd1QaNobI;MW=A>yG|U2xA+(&{n4;JspG zJ-vAO_MWK+!A_SoceK(e*pjJyX<)UFz?T`Y9-H}d$jADsFSt4t`-_TXMgbZ8=s-uI zN}uEaz=#(l8|*5;4k$FC@p&!SWuo}TbavOrfL;Xic}AxxdwTfr^OtTM9$#(&gBgL1 zCgRm~-OP9kaZ(%GS-8HpsZuFAHf+g8Ui_asA_>2N z{}WoY+y{;)wte$I9;{JE2LYtY*L*^DeR{mjQxi_YwYJXSbXjlVYbWV!4!n?iElyk& zy^M>mx?ICf@W0anrFqwS(ZZjxm2p{Ct18%;%=`5whuQRB?n4Dp#-@jXfH)`T4>T}@ z(>zL!clT~7L2ehKJ&TDg2W)5kvy+LcyuryarP5q}=lE*g1$Wvc=HHClGs`X=cHYVQ zV}5aV#pFaKx{*62j~+E^{o=!<`%)BcQ1;0AmTT>}S>h0q=-1Jorgo9}7wS1Vyu?Kz`8EX1p_-4{J;lNJ2x?N3deQ?__Q4X`u)~;kVttI`SSwqY})U zf!AS6{dh$TKArl?Vs+3KubJMLAtooil(z? zH&-|YJnm*^mH@3dxDfSU*-TRgaxN1LCP6qu6!CF@J3Oh0=h9*XU1M@+6Ladmu>#JL zivIKXm3}!-e;8OYA`>woR4Cl#xB3fxB-`Hfqdc^pNib+J^$P$`DP<2hsrEp}I zQ_(``<1Ijf%natpKc5HM-Rbhu=J%eJL$8^zKwH{4agt`@cU1m zpuThV^OMMoOu|w6wC==YEgygQfoIad0O`QgblvY9_mqR|jApUcdy(Lkr*{YU$F~Ua zvVw5Wf>5GNfOcC6tG6U_>qy0qoKn(JYXY~@{Ms4=6*zcF8aRn@6ME~GsrJ;*92N6^ zY&>yh34%;EV*Zw;eUAUiZ&wupmR#g{_0^$e6Jn*c<*U&c;U$E65sQ5)%m&SUYzMv% zL@{=a8s{6R;#~Aq!_0ZP+Tc)HXZ5ttQ41tW7Sc)-6RcWb|JVmk8IeRFVEm!eAw1hE z38h>Y8j7T!0u5>#PY-3{)X9)G95$Wv?EN>(`ptIATg601g<1x!fptG-rH!E8_D@^y z1dNbQ@fN$x9!1XHW+PoaRWA7IS^)5E@W13I|A?-6U)7!w%dBI^uO*pI%56K)#`Thv z-ykObUb-b&0wAUMakr6}NE zsL^B24*0tdMdL@1LP5fH`2~=$lzpVC69|=}~RgpfhWupn~ZWk?Y`?*YnkT_6$PAm99BukW^KI)qfJ>l z7gXMiPUofoC9Bro+CW7mC0xY!TbAfh0b1`nTbEap3tQFSf^P~N%gc}L-aK4q7FyV7 z-@5mo0)~jBS5zmee1R-;UOJh> z6|SRB=#IA`W&$$?_C^Vd&&Iv7(>d?yU;US>%S-BE#sGTl9D^{`XhF(sl)+s)nO|&? ze4$V+tST@VS}vAD#eC`K%Zkygf8sG>Pkk)Z^}zOVizMU#CQ8@4t$~e;W)dyD-enef^M{H?8TfvnQ52E(dj(=QWa6&O0Hv@R6& zpj@3*{UYB9a;QNv9v$&h2&FMY3{H@X_2m2D0qm|zED*}8veH-axyoutqwF+`s)m|j zar8t1hZeL@p<%kzlZ}vgS;u%!PwYlakwmV{6rHdH6q~lQx|_r;Y%Ugs)4647*q_6- zwwzIk*Nalst^J^^%Bw8uzG*yzsz3`;;iL@i*opd5c?gEWnV1H?)A63{rHAr_EeJa! zvLVTlcpd~f@!0}a1uC}NP)0oLH_psD)Bjj%z?;CVe~Ob-vUkv+@w|UkHrAF6MB^bW zXERG#+UDPn6}LdfiHN*L4Y63-QVWLf!d<@>3DgG5QHbSQ0JwNPO~03wt&=#W40a`s znR6ty-#LlsAr&j8WQN5p%Z(NJ26hwHL~*DZ#|M_0tKqlLJC0TPJ6p-04~_mvsh2yJ zcF|vIuCXa-`NLj43JP}KqP;}qDCMonly(h@e*0Mh66D5NoA6m#T_!NLI=5w|`!(Ki0SOZ$ zAkviwBa7y?yDKq$8j(Iryu&3z*5dMo_^O$^eVtYvG5y>wBjjSkU=jo>qer@qPsa{4_M z(Xibqwva-z)kVxKEJq4Xr}L8~Cea8ByVGjJxFPv1my_RMIXt})#m?ixGH;vQLnGs& z(%FW1e$SO?YtGfHiyh}F)3FgT*q%X`S4URO%=#xn@3tOVYJ8{~sR?|^irvM{_V*at zT}D$9Hho10>?JS#r@W#HExX0O;Wi%j-mV4;`RymI_fb#wWcsYLnJnWd4+R zQTCq409!kbtSIN$TtcWjf>tL_i%h(cneO6VujA%+V$YUuQNPitngyJsBYmT?m*Ew)fQL(Vb{TWhqd;;-aCMu8Jqy zw2Yd4`Iz-T{h?>b=3Q-OxR>m>!p8lX-+x@r`JYI8mIyx0sOg>cvh<4&)gh4hba2An zmR(mU>;-6VwQc7Xa@K?Gzs5RDL)+B7sH@|A+w)j!YwDZLn}&KJI*N59c#fg7>AE=i zINsqY>+;Z6qnqY*iv1VLEcom0AhDH{^4ovv?*(W=TKE((gi)J1#w**@D^sPqAJ0Z^ z$j~1H?&D{nlhjt!m+STEj0Qt@%!(D8{b_$=V*B5$ zHD`O^3SIt%ifHf~oz})(b3JpS2zs40H@I9~Uii*uhH}v@Y~*(dvxFpw zA+1~<>mw=oBLbi^HIV`mbpE*1zc|AKIGkV{vP6dakoiot8>A z4!wuo%14@qFmIw*7bgnXj!kmRyL%p#H&@EfeAD#S@6H6OJ&LhiV{HA!) zQ8Y`L$Bq9Tg)GEP$gy?S^oPqB1^qt zJMHL~Uk18aQ&>09jAbl$r2d*J!NI)XdVmo{RWDpYz_TPN^D#*p!zvS2^PUf-Z`G5nB9L zSnclzT+*fn7R5oMKo14@r@pE`I ze3}FQ5~U+Xv;woLD?&R1@SMdKn`3N0%}d>SwkoGzP}bmzboU+(ZNONteR?hP#JA9zYRE}5ryhmi9r+hJ}$VsJ66eF~hT_rk;{+D>g#GN`L(iD)H$%URv4H-v_z zS8NRLobH1LD(Vn>O8?W?juDIdbm`_;YC+B)1Uot(VJV@yVyEpYT*ztMXMPbjVW8}s zm5yBhVX3%jNNmB6FX15?X~x&$8R~&CKro?`7e;CJVecI@#=9J?J&k1Q^zj%F84qTP zbPUJI4atIQxEPyO2mpT|-1O;d9>CnVUAH11ws;v8$ccDV}ac2<q3&_&!wTy->U&lk5cVKJxb9R0Iig(AXDxJKGq4N#1xnY{BZl`vUHL;ndgi>@XYSTCgUxaNIFXF0C@0)X7TNicC_GjvQ ztr@xX9n#fJzpT7HS-e#ry?SurQZh;zH%PMWs>_Q+ei|7D16dA89Ot^8%zgP*V-v;V z=UU|U2G|-D8cN~^u(ut)Rh_yuZ}zoAT;cspnTQ{#fT*Eg*#53NQJgvbq0%VMGSDbB zpb12ox#9fUH9M8l()~6kFyoVTD4>7o((h*{n^hL83_%gyHLpBs2$HvORIcz zeCP>s?ytt!8_cs@Kg(fmNgZDKmHV0dwaV7N6|UkBG!>1)20n)#j(JYa%t$>0zji+} za(I*i?l~5PWHk;{KLKT^rnEG~8l^h^YHg=X0+8S;iFhD;M&s5W?zLD*NAI+~f6yf} zKsOhU;09vj)lK8lKuBOASqSsTD7D-#En9kwA@-+-bRERwB3TUftK_4_Gm?`W+rJ!c z8V*JIk;*wSu&`-(aKZz7DE<=O?H%1}`%`rBr zj`aar@#AMRq6?B}^4GFhz(Rlf(G}q@E_-E(N2^4H4!m)stH`W-#k?bK%{74=H4{x? zB6Sf18yibRl+kUyIyX#xSlTo!%M^xGb_^_!6y?X^k$#TFQI(WqH{T2PZMF2=p?MaK z2f!Y}ERcH7vn^|tZDLR;0H-Q^tbyZ?G?7UlIkYr6KLrPnMT&w8A=at-$*^CUQv$la zp*9NVcNaT)Z4*HU@}|f)v~;r1TiNK{CzI(r&Ce|YW^v0?QWB=GA|{?GZx%-c9-R17 zFIQ(Ho+B8)3+Qc6%zd&1h6YkP-6YVeQyuPFU$C)p3rLVssmFk34c79jC=rG=fH_L} z^Y#K1?Mb0x)=!J||1f;^50rWdxXAD`3LnH{VPjo8ZIU;CtkU)`gRuK(SmaFPNsB?h0arwM+5SUmvL&Q%t z85E>Z5&~)b2YQ3}A8^Anl4O#Q@7JY9uv|(8MfPz@rOe0;uCAy?;gwAQjVi0yGES_p z?h;`bIU-*q3wf!=5{2HAS(DdEVOAT5ktuKFsN8)J)Y{zvD( zr(Est_{Q#>jx-F`7Sx_j`{92xv^}bPxiykDTFQ7~dhc4A)ww_DiR`WAxzl>{`o9N( z23n=16>qh~Uek0wAtr-93J#q}{)OT_uu%z*yL|am1DU7rKoo%Cg8&XS^;dh8k40{m zE=(7&Eip3z6LBvq!&2ENm480+ewx!>8(vQr6mXVD_?ehccU1DFeJ7Q2ad{f(;^Fkv z_~G?yb;CeO%B=tU3D!-NNs+Yg+aH!2&dZYQMC~r|yH+W)S$rG*8rtKGb#O3CEpl^1 zSh5~E6-$!GS;vmz1S#jKVxJn_e|1i^#X3hK|2)_+Kg3m46!vITR(~Ad3(8S4wzuY( zA;t(*RNzdUbA{*q60*myOKCfZ zSSAEwT-~zu*X>h2S~ZU{TrIutUC)Y4){tO$t$tCTRF~NRP*E=~Y~GJ|U90UU14#;S zGlsxY?~zzZ-Q~ECZxsCiarmZ3iQd5$o&UJZ{ze1gP*l`P|}5>3^b#oXr3*IAUlL2je^D^~`l@z_vZ0u{S%M$&)aS*Ij! z-hNtY`2m7T{0c%9|7%sFe=RsVD`#s|FqQD7t3d;di(Lj|YHU}Qc*d$<$J=VPXT>6B z3OU;=WJVhDIq*|VAFqnsn}13D!LHm&D&u8PG(5yyF{(^`e(D=p=Oq90U*n3qEJ&2G zpti}lu$a4dBmQsh1T1Hdtcc{D~%)d5FjW%D3q_w1^wDc{5;~1iM3c$bb ziJQs-Loo06jkNuWrh>(DsmpA1L12D+XMxS{ERq)f@ZtAINzybplW5i2;}=KW_=G3* z#>w(6BIiecp~@#>B+daN?Ao??)o#UGYVLxg&$*(b>wsS7=$Wd=@Z7&p@^8}U3e}2I z&g_oikS81WguVK^CTR-3(7l#(1>}LSVCd>55Y_z~W@bYElp0Mq%K~P51c>4+RYI}# zpHXYgig7oHso2kqR5CT>4Vog>TkDZ1;`D_O$+AiB30ftzWGbmUT>wr5G@@Rc3$vp% zwdPLsKfcn3JmVIMPKP(X+q4WaR%_kR*l_QkFEq(l06CN)lu03-g|Ut+8I`MPPiltK zUwhM@^z=`bUARfFT!x4ff^N_3hREaZ#Iedfq2eVISz$jaT$2!k3k*Sw^Pq(Ou-M_EdYrJSmwf?&JJNH!_h z-&nn%za86-q5g$ZFcdR-`E&#G7iw-Pp71@j%fI)|O_)H9>d{R@v1Bk4E3&^lL&z65 z`3F^p>MQ_bmEhhsR+N8LEp|bjUJVh#-Cctu^UNw-{z9>z=PvyT{0n6dp>%6tLBT-7 zKyHLUMngn^hlhsrkbr@O!iK}b!KDO>Nd?+E=P?XvLpD4QvuD;_jeuoU_ zdTp8HsN%CkkDWX31pK(5KTPPoK)qkZ`gd|CNDHIW1XVYb9qXU(_}v9vU!H=*47UB$ z*$cZhOzSf#glqL0HAK2;FZCmX%5-pt!mg?>kr_5M^hu1!>8{L`ol;qZV_Sc_sY|nNi*)U(D*Xv7rj{`V!YA62maFW)Vpu|rqFC}$p5&0|Kpp+-+8Wlgw7 zAQZzc&Ci8mdQQset|dG**wvXDu|ml7hKXO9efs42=9dusiH~G#^M#Gy=eC?4R@ov1 zJ4fKK+_7vJ^)Y9!;xZ1Q*AJQ^e%i3HQ>76`>C+u*zSGf7?4W9w6AiS z{*B=>e%(MRyo{x>>`#_6pxkvxuG8H92y^(dkWbd2AiqI5D9!~#X1t&74A4Q;@x!ag zp(~3(KLdM(*s1MVeb+jg%F1G^u=x|=$zPwK)g zuZVuc^RjBB{duk~!{6{nx4v0l@&8dulgc(YTL!P)2I^c*(#Sy)T}E_xO={>vLE9fo zDS4r6X);W{Vubd45iK6*n)ezQ{>a`P{wico?6@lm<1yl1o3|Ird6>Eiwa>$xDl8fA zjFw0y=?Jh2N4W_EjGemBg!I%smb8Z&vox@8d5*|s339AStKf9EMUadr{cmY}9+3(N zB&YiZ2dLxFALeEIWAE3eLmUBq0k!jVfbnGdUU*0dtk+NxCF>hZYhmMrhX35)&ki5< zRKD=;(}eFDD6zICwOjjo4(3+Z*o*>q=Yy{~=hZp+cPw}Xfbu`v?hL+OCj}}k3%CN^ za&G0;z4*D?xv86kMhJE3+F1A(Y@h56I#S7q>L}JoPw^k#(hfA^eKQp)8ctVr;tQX5n(wuC4>kK@S(aHHUirpOekHpjGJxdjR!jmLzfy*fo- z{YS#~|0H|~_wJGwD7lOeKu`C~?!x~wqfY|UO?@^=h36)OWMaxhtSi22FgnLc9Q@^A zd@C#cd(B!UK~Dqc&Nzx^p`@+1GFUDZtKdv-1(Cld;55%WQWuXVQu81wyEm8a`^$|r z?Ipi{w-@&=Mfk^jBH$!fn64N-@Z8Lik7PGy(9K+WT7BmMe-ehgUTh67LNl(+e8(86 z28`2V&HTG8o{C|uf(1dE(9#qNHaR2FS*?|Wr1p4xkn)3``BsuUh5?#^Ro5J!p)xv~ z64E&ugeoFvk8wDxv0+UE(YQFf|DkZ13t0&&sP%UT?*fV;+c`sJtj(WV4rR7S*OR!} ze4;W@_5(1%`E^C|MShYGaWHW$zgFPjV?ys|zw^u)|mp zzZW@8AK3(#)WH~G<;aq4UyCnJPZjD`|KPIx3zcGfApP~X&2xa+8MM(ojn(Popz(Qh z7LG&zWPViDV}{J>c)!JXK3RV9G|@|#S6)(M^44FdY@Zo?KI^^N>16@>h=gV5YxNKC zt%4U8djc{e>f-tJ=JpK#?4uW9#L)@1iZN!!>c`KH41fNk0y}{qA^&mO_5+Xn-sN;{16^U3|i^_$7(e>3CjR*S7Qh z-mmCR%`tAs|zS#Rkr16}7&uyK*XNwU$%GAwx$C8-|d_cgGnyx0WU(pT3CT!&mTp zWBoGJqLPYmBJ>c^8d`?a<_E??^-Ti@hT)~TYLICauV8jGC#<8)4ii}I{b#p$82XoN z%5mXx5|{dBy}@jMw$WV230l~>3h42FD;|c-XS_dbGEtfX$+wxY21XHsb5V68*q&geyI&{ zy*^xJUJ9U{Q$06$n$w_}=ecFqIxIwAw2+E_F(m=sH< zPMV=Un^53GazGVHYZQPz>+7va$>6C6!_XiuUQee(~nJ_cz!L9acq+1SWfk&Z+1iAR*D_6J*f1! zQPQ7tK(uHUane||)U8SSB$Dfl2s{4q4Hd=-x1B;G@JI4@f-V%60@uF_Q2$0>Qimm zs5YcBp${DH<$NXM=zy(r?kI7@oD~dpszm+>%BXCTSm$U3u4j)`1j1Ua9P_ms^?zzAxdspPHo>g%$ZYb`dF-ZNrrx^6Mt4KiV>?b0pL)nYE~_ zP$NYeGJGE%|B*; z360 z=oF>sY+arM$80X*tGzsw7EB*>n+4SniQp>A$lxp75~+-xSL~p^JiDx2V-V3xY@;$O z%NdIb#SY#8v#?`ld6Tg{OmAq?i@GwZP~S=LWiP-DO2 zfPQfik0+e)UhF2jS_}+b2F1xi5y*zbJ#vULGVD8G8!5#cpJ{*>FEGjEQ~`dQ zcOU0y^v1QfPn5adbKorrTEV`n1jZ+_CsbJ?7Kr{!{MaVr<5I+;lH8( zlWWm?@-3xS25%g{URt*s)5O45P+KHTQmBiS5l41G*l2XM69dicDjS8R&7MI?rhX$| z9OeEVX^1FAvg=?cGlm5GH&pt&yd*=Av8$S^(AY%ltYRug)@W2>D^WA(SW;|dj#Bb* zPY9}ZL!MjVzPnal92|C{3IUIgvC$FM07?EV&8XVOsA2{>=keTXV!WOswB5r0g)(
sH`pxVp$E*LSx0bY$^ho1gZ(Ce+BX zgV-v@;O*LCgouh%LTJjh>6fNe1i)!k?_(K>@#hAJi=BY zGE;k|p=-ghx5_WRZ|zIf2wi`nNO=!AA^h@IFVd>=cc9tAO;Z$>jb7>?tb6ny`W{KE z@4c#}i7OkeEN~Kt%gx{BlP5$=yT6^}6F42x4XRhqN%6t?;^?rmV5dyeoKLqcsOHK2 zbb#$ru$;PP7F>-8@AY=H`&w$0QopRgaXn7;V8}$bm*lMCBkc85YEVhMoV!yFW|9fq zOOmzYH%4z?uXN91iF#K}mflTpD~cK^sdvEd|BV->>NLNJv8A%AlG31C6zsX}U(Y-$ zZwF~!_}FM_&U^rCK^~wXBnkagUjoVFg9|^`O?Sx!Zea>pf;c8<%({Q|nH^JacOn1z zeADz)ALFn#kY)z$^0QBF!@D0pPDEp@pW1(>)BE4M#(XVf)^jdx86Y`CCpVU>tB zuWv)APNSav7T`?DGY-4Nv|7{Snoz5!!&0eVGg@vN53J3Ee_3g#hG{28yjf!D{fT1E zpg%UfmE;4?O=&gw@ZDbf3Hai_OYc~H3~3&%p!09Y^Dod7$$qC>#(szjxJE8nhoW^b zyHTy4i$#2Ft$oO_M0HjPEsBbN7v4b>>76ZMU^64jzyQgDIvRU(8vw zWPJAM{3hPn^}8Sq7x3jCh>#A0#0LkcK;;6~LD|#%`NK@4|3rICT1gYuQz2?o{Y!3t{~rZg8TZEN4}C z0NFhS4PVz}Y>K%r9px4qj2)fe-bF0^YHjv9n(WTJK5}pczXS&VM!l-6Fb>;jtTbAc zK>wvDj2JFDuA*@Qh}BhoWY_h{4$zT9GX>R%Nz*M!2arbiK*p^`yCvbGMUsmhg)T~` zogo2NWbfPXr~}*^P`(nPi=GphNo*`lsV|mWNcALV zT9G=LCo(Lc$(c{p)vLpUgeC#3E!-5SI2<4q|L5aG>&KDQ6FuD;dD&Is2 zkhb{2IeyUMrXlL3Ba;z9Ch9BN|Oh{&lpP3T)V)to~umT2O}(UETHGV#M=KbH!v$e0++(+CsN zSl4jZIVZ1@nNopF65IvlxKhF>5$T-|oFbj-96=Jh9ctiE1@X35d7DPBaSD)+;H0*g6&q6ycF7_o7Ecw|X6Ib0dkC_CeD&2k z4?8=&aA-}O)<}TCveL}yP3kxGgUUoI;yiH&aiWuC5M_T*)_gbr}=-st| zZJZ9OO_)~7+%}NDF!kg;Xf>^I7$qw`T-gJy4AHH+g(f9~Yxw(2pl-SRg!wfr8=mMO zCV?;L;%ft?iQ)j@x|yb=-9tNF>u8~|kQNpK7`dl5y417E$Ynes8{9URCTU895-IJ5 zXfeN$gmepw!q10Mxeweej^snobY3zU8wjP`Z4wJ<@b@jSL5`$!bslp5J**O@Yq>%d z_0hQbLdi?M!t9H9mHsEW9WxV>jiGKMeQ!=g11Yf_90%3xV6v_G>rUWzaJ=|>#w6Gt z!7>DF1j_a~&rQ84Qn+njH9Y0@^rEgU;RTPsTLbVLq$5sDYi4iv7pfSYk zd_X9gsDx|AO^DW24B~@?;DVWf=pZLF6g$J!A2^X~-$QzCY`9=kG+Yy0qnw*_=_~EN zmvYy&A-eT751Sl#79(PY&mVc)jF^}V$sWk(4;x?qGTBP>v}D_%V|3P5Q`KS5v8b{c=sf7;8 zFqg%9AX3{CQ8=vcoli2JJISLN>1js61v%7CNzMThI}#;JFoE~YZVWlH2&RkFfePwL zBC^c9cfypX9rvfb?57aJ6EZ_D5mra$NvyCy!xp?Lb-5yfL}CO8w=pD8^(npBqbtWe z0xUCvv>QNXDu@&m73$6t98wT%g8dU~(ucaHlfk$P7=<%SWg&vjyO`+Hl9|^Z7$A zOeO(-ugx8&LSF<0ZU{UYi$(r=E)z>S{3BcrF%?<<@A04krSP9aY&X{NJ*GFAU~Q`F zNp2ioI&(wWsc32Nd<&ggwXsqM(GTlAYEbad$|0uUnUksjzg3*x5Yc&Xb8vjKnM?>! zeF#^==usY-oz_FiVY|77gsk8r|G95&P2beFjv@L;uh@|)xJzj4aebFyE>LydpS;AD7Kmxcxl$Oc>#b9|?L=2Rh2C6xE zG!vK>JSXB`qb3?siIObloPr!}Ofs{EC#G+aQ~>t#!QGX!-OA zf#wb~D}+LF_GHM{J#CA8gfsC=llm~MJPCZ*5_RI6@5?mIa_Wiw4B5Dv}6#;FrRVu8jR zQ|+?GOQ9jvK@6*Cv+GW&!C8o4Q56s=%jKop=|6|B&CB5mKC>W1A3vz>k1ILtRO+cr;txw^|Xo7o4;1vI6I zA&x~YuD~?WRJ`lK*kG?PX+sv)HOUaUsmtw& z{ctGOOL3U4rz&j>uVP`l3tM8SEILA*^pL?ZaA@R_k_V?32mH)j0@U@J+?Gx!(Wd^w zI{)2K(vy=Us;57#LIjbWB|e)O+E#;H%DNrEe{_@$K&(}{)-vmwp^>XD?2CyX6{Lhy za!(R2Q$+KF-6fUr?s({!w4@$2Dggwpg`!?@Us5R)ic z08>>Z7#koZArTNXuS$mrlK>S+4a8m-{t3dHnKQk{ovDKfN3}$BhGK7s_R6T|S7ZMR z#d>?Gs$3g5+|N0|MJDBs7#%NfIJ8Lr?{*!TV+aK(mQIFwGKUd}%}YnaYZcDHmUls; zS#KH5QZE}E@72DIWZ zPDrZtVaRC?ff+sIP+_6#|j?V(2=p@p+rvTQt+G`62yXR5@5@B(b$-7-lj3+#&Deo1XCzPC>y*N3}&uX0<*I5PeO-4)iJc@c~< zx)tZNom4Dw^Nm(2y^EI>Gu^J&4&|cOwGd=fnl$LGy!#_PD3YeTk~BID%?Yi2hm{%b z2i4A&VXyz|$~)|>Ep7~d{0=UXUY-KDajD~JQ-3~tbfC}oRS+rn^3#ZiGBl2>aXSy3 z=kE{c+u4kIqR2Y}4Sj#O;urUZsUhW=y&vVEt*0_`OwyDc*JT?t%Au`m4bn+-N)kSv zK91 {ReJKDzsq0S-SERkON=-c09|2#}%+_b0t3Ya`yJPygodggISBkbAcyLjE*Yb3t~UOjgkC_x9x z0%ciuS;!aTIaZoh3#Ky z{Mn*dN(JR&aE6UjX}(iKdiHtp)?Dn+DT-#nTL!|b0~qQwX}hrXNf8(CFUUz3Ck@ZO zJr(~a$g9DPz8~o<709L)cO9H&>>POetiuW*8k;I$=Ny)+Qs(gZi0C>6uk}eX-yo2u z_Q?nPbZb&5ZAQ%xm3P5`a##*2TCphkfJs_WqJZj*G(~2M8EXJEwmy^-`Ohh+P)o8d z32-I3#1_iA1go*xr0xoVszj#v7K+l0sS|8GX(C^BPqg!rz>xH+2_DDrF2nbthIsV< zH#H9BPA2g(B$J;T3)c(AivPyJfRi z+O=6D@RCc02uj|UQPXi!$ED@sxGcSV0|n% zESt|!TTYS4n&=IT7>A!CxHRwu+mfH3gAvO8qtFqES*XOFv7wd=(p#vB_9p|lJGH#< zpqSTvztq@Vj38pJ1E@?*IZalBhiY7qD8lr9he#B2TuHSjNRe7gSNXyK0PN+vgGpJs zkbLPNQfDEW2OTT{tZkrJ@nZ(^`bK0RxEf-n_Qzz3q-$Mdh=Fz>d(I~bjhXwkwAbE#ajxzb1>IY4l z^bvM+z;j4T3J$DIIy7VdwwZsMK|r*zVIa~_TNNHxo0tP0S2=I_2a(-eij8|P=HCyvL?}NiRhz4V3H4+rb))2ccB9ciWLS?WQN^W zPT(mTz8B~sAx80&B>sLON)#-(m#)9@TmbJyu#(!n`HrE>x_o5LGmLwS=iWUCJ z$va2Lku;fU^K=pV9ZU+GEgLg3-USwpMBrAY=I;WH;6Yi0ua;BiM1;*Za$JT2 zc${@R6iaXXO$zt4A$&3Y+u%vBVd)u=eplj0mn}wMdkiGxc9f9m>u^Lp+UW{zO)C4HEw?2#b*6zx8Zr=L62x~jL8Fw9ewU#DT6 z2*_z8*r)u>2`PabRe88wRb&m|lG7)<>6lSQFjIkaL9Q23Uzt>(=JC^`hy_&9mX3S3g ze17Fpzc(+phd*xqX+PyJRJCh^kJjAyxsC#TvjI!a!vE8&T6n(QgS`~w2z%4=KOB=O zOc^0f#tPmk7=p}tBKZ9L2|iK0{8##~GllmA*&iR^$fziT2@EISxQ zGLAN1)CgHfd88>D^ZAr(@ERBCxbY(--zfXMfN5Buyr+Gu)4y(Soad?6Z8R#)^yd-d1Gau#{Ee~Msa8J!f(4)&Iuag*7dFBY{{PO+n0{8c6LZW zXc0MwtoFq-a*0id_%Bpyoo9GGkr%%MVY0J2^%QkbqN@4u?s?hn+AH`F13?4^#A;Mb>1;*iQ3? zWVEXstG~!WJRHWQDK;f|Fk)?ICjzhBxTBHAdvK6uhENYbMuF6@1MTCxZvsw3zrQ$J zOz5FIQ%d)e#61y$oe{ac&>Lpoui@i13&d%*oI~2`;BF^@9lE)TaSd!h)6Zmvnvkzv0aQ!JPe2 zQYfgY&U8F5gc)97Dyo>h3{uNTN;HUU=Ks(RQ>BZpSyX6Z0_y8r-Rw;uq9K7`?XU-A zN&TrP0B4W#eMpL3Z2WUCwyS)=%^hu6L{T=aXqbHpi8DML_%mjFVMj_&iaJhG)D@fl zqo#;3tB55bT78Boy=Cx(j zo3jc`p8rPKTR_F}E&ZZ{Cb+u>cOTr{-Q8_)Cj@tQm*DR1?(QDkEl7Ys2)UF0Ip25B zefPa@t+!Us(0g{%T~)hk_m-+(&9K%l1z=o53Xca5dU8UBr(u%i*&Tki4>N}JEuo5N zC)XxjPCN}pufXoP=W3PQ&0n}ZgqpJ4D34aE8(!8Psn%03 z=)^oHDl?{M#*$Lz#s)xnQ-!BRVF|X9F5H(Wt6i$v1kg=7eB>LzqO~iUP2*|&}=PoYMg6(K!GRgs+J#QqOoi;Sa7Q;5Co|fI_S}ucxvP=_qicnw#6kW@3 zkp{zDnL_T3_or*9ODt z)x^)|EDIxq5q1-Ul-hD}%ES%rB~f;2FMx;d_CZAv8I*Y@WU_m9Dcb7ng$K)r#ymf* zI8#4L@%SVu%SJZZ$>31FO?neEFnH-NaEu^j-s}fO4J+jH`q<>B1PPl4Kq8r%B>A1f zai{)={(nNQCWh?fO zr|<&7Sx$3Wb%jBIFqi^ko)!m~=5g}@VHJg6q+EkZR;06zVq92iQDQG;7oLS`b)TU+ zjjnfkmIptt)LjYP98~MrQP7jbywS>2e#pU%vVb`Vhqa7F$uWQ{KUD7{wr-WD&nQ$F zt}XSKsR(mZ5eL|Po0c=OSA>fkZ-VU7sDhnDi@(`5{-Im%U?#DxZ)*u;oMs&{9+66s zgHqF{XSq!cPg*Tsk_)GHxiYVXdpoJWu}rM-;SXRc=uT+C!&kRxqT#Kj^F)>I%8)7d zm8@U)gs%V*7_@Awv5**8Z!o;HHo3wF(93^F|Aa#vKs$jZMHI{eyG9W#JK0#=%Fr>| zAH=8=rpo0h{az8703Fi#bn>9fYGeaU<4fo z+M?-Xb7oo)%YES`ZN)L{Tu;J3dSb%=pKiO;V}AGG-o@yjK0CO>F;WCEj6IK1yzXEI zml$D+C()I-XLI!PknLXM?%a}~uhEC1ho7=qowQGOuH~KxD4Bl%GmJhZ*#4PduTy0% zXqsBIxQn=+Nh4kQ?JKP+V6kE6n8^;F@FtWaVUcwm*%w+!qq|{if{&K$LwJJbS+PoF z!_Eh+nDa);R&W;PQ#a3U0zO)RKLA1Rxf)IcvD4d-THHSXEAh1&Y@u4Z`90p_qHTTu za@%Jyq)S-CLs`~|1+S#2n_gr)W~xNkRC**K$ncrLSiIMD3^lPKR$or?p@w4-i#kuA z0-qn(hNsk<_f<;43*MXVwP;)$^MdY9UmSHc<2!!4thEy@KB5?2m;elX|rt;kR12=94?mIjUMAP zOg4QW=h2+RjQ$pJSf*D6<$ltKTb76jX+5MJxX*U#JdX|V+!plLGTfKBJec|xGeaJm zXqsrJ{<5c>dORc-3U3+EyV8^jLq{9(AV@Z-^UVViH33u0HA%YOPO`$84ROdpT=z!W zt05xj%Bikeh{LjBGBR!m%91CY=FE?6RS*M~8Y5;}G*PhZBRR9dXsYwi%r@AF9g0(C zgNf0!9HjYKcDaSf{NeqaRGk7J^fs(-{#Qw|50N>=otYS0HDr&g2%J9Fnx?m9mjEr; zKyr+bcob-gDo4?X&JokwI(!rAA?O(Pc!sP|`G)+1L$mQBof3flz4^@q@+_xB6y$7J zl2$qbC-$hc>r(+3V|10+fG_ikGS47r9}YsZUWSSUQt7z~y!Mu!h~2FH-d-gUaGBOK zI`%oO&W&ZK-eOq%b^>pGf^^2@9JVX`o7~_PkTvusM)J{F)wEraBlmXbRfhT0{AK`I z-!2**CYNAtON9@tv@B{AJSWHS9ePnilhnQfAxrWQkl-gum=t=kK*z66Q7(M*M%8jH z%R*ElJFvGBOsN*vCDg>qDE(}>7u*qQrZUPTnIcC%7|<0PK)2SJp`_dLJN);y#t^|u zn|Gu~8uqt+g47@QA(kT)n$%oQpCZa3&w(9@Fh9f*Zum4O{w% z;;7-1J8)V@84Inu%($l(UhDej9k?!_lhP@$G`@Td_Va%I(+Iy}QBJffXT2wy99+UF zsz?JMP&=Ve?2bakv0D}0G>HXHdGrX?IziVP%^jjceWy?q!8+A7=L!%&A56SrHM9&0 zl3UT|L%D=uV~dwAUk_7j#sU_wp$}tGO1G21#|`R)$H@@ z;lO?X1(A?oKhb=ZO*%DCc{BqE0StHo(^#{hl7om5=q?{KL$N@8tL)Lb(_9Wc-<)Fob6JDKd z?^EL=JS+VT<4mX`c*h%urcs`z^N(bBxMC>9Qp%)pG^WZCQJn$Gobde&gTx;wY@C60 zxy4dHTjI6Fx7nn31_`#fBqQ&t@WRqj$Ui|0%9gf`%O~Zt?>`lsxr{5u$dQ%0 zx1OA$`6v(cXKa9X*VjYZeBL#!qXUqmku zPL#k85!YCT3@nFG8(o+}j3Oe!)vkg9a|(_>ASf>HHA%qGeq+e6xm#-gA{i%Qin8f*G*!VAOR`Bly{6&{#s?qMH^)GH&P^Du_aFb$f5S1zN$R@JJ8ro9m6k=!1e8=?Jg>Qqy_%Hf7s3;6)Dh z=Qb#9p9=7+0>>h7E)VU7Sb?km!>dB}uU7>pQ3B!O<`nI{$lqyY*jQW0AAsS2)@uAu z{2|2&Shva(_j+DcoRI@4Dr`6lTzAt_yA^85k4QBYhe#9%RJjScBa=0bQg2AYPnMjF zvMlgDl-Z)(RQW3hLEE?c#(#DlS+FU+&J`lahDpLk3sg91pb|7j-Ne61SD>;zka&Zq zm$v3K1|I9z4d3)!hX}vd7RmoS;xmw(_m-M8krZ_bxBLtNa{WH}MSHZ(!9=bhpgaDw zZRjpU*69sONb0@3uE<}oH}>uImFwa1Y#txVKJWa&^hpKmI#~tsi_D zOKpL;&rA^S`xVZa5T*$`j8-27IWSwC{>mv=8$aDz^+iCMcK;;wxFvRmIiA4QXCQpDaY}!G^hp-#`q#Y5y;gC0FC_f=u zlPn$-v%BA6wgS#Y2-y67_lr%x6CKCs3G`8*U6SinzZE+l^Vtj0T1FAvfXZwFUi}txH8QiGXsoL-_^E$5FG~n??LUN{{}|KN#6T zO+__B%BLbZ@}j&~MUN1Kd?>!1zk27d@zYC?u*~>~&@ybPCm!!PiT`8Zs`t-OqF|S} zPx5w^g-2P~tYXblliPiCvm0df(DyYi$pl)sS(chRv;q1Ck-k;B8M3#zti;f~jt z@@PD8xb+{v1wA+dixUkTfdvHt4F?Ge1%LtvVEq$;1r37+4#8rB#UlO0!paU*#u3KE zCgTthB^NWMbV~SF22Dr^h>zfr>s1&vkqHy$%x>jf^LmaM60%egD_e7#VoVG;W8>|* zqiw^whg&)!eDpfl*{yzO#Z0HV>0qQo{T%cinKJdU=Z#F8I+Qw0J5PI)mLj%q-wAw) z0rOG)MsPQX?`Nyk{=WI?VuM#E8=^rnT&%=mBQEsEMP0ifI3^3}qP9U@@uFx!>`4v2 zbk4=i$pslPBuimnVr$&$o)nQ(REzbYSwd^vrn>gU7A|~v&bqEmiNSgXgx8badJxp4 zJ>!qXT6;t>Z`)1G6ds$JBI%7#5%h_k9tyNdR(PNVR=+ITy}emX!p62U795 zM66??@Z~c%n6cXQdu=>pRaFlw+_FZM-5wHPhGs{T18d{IPr2m74(d>;UsPcoj_U?cPs;H^i8*FRcAKrB1=Uz#>Xj* zoE(BG&mvzdtx(;Yy+W|`{QpXC=&$sKNp7X-?lJh0qbA2?>)UhHX&9#6EfSYfPtt^; z79q<6b|3yjh+Kb#*l1RD-Y9gfH0c4)CsGKk`S33Z8vK=DSNql{13ID72~d%lyfbhS zdkO#0N-8e>NTr$#ycJkfq(*dJA`p74JNHCv!B@AeN9T?4O1xThWrz=azZe7%9z1^+EGo-qn^-d{$SNrTJGuuUZYME7aa@9;)JZ(<-1kAAi(jg2Gdgddm^&z(CX{{~L;7TC5IT19E;a6pj8J&|USY-=JzA-sECEIeCcdN_h;b+eZ~E4ptm^Vx|NsjPoFyW&HlS?N8+@HZpooFP1F zSl-}w2~w0Qt}krV;p>i@{l(G|5{tchgxZgmFezdht2+50eJ^14J#W}9?J_$%k=_8)k+nyVRQew~Q&F=icqwTq=X%B7kK5{?s1Y7k=~TKKIkJD%+-t#g4G^&5uqr@*q9@>Y<|sHe zz8^pA*S2)fXy|mL9M%5{9PWG4S0~TnBk;;J@Y6jsR9#wlK3aJDeSP^3R47-#Yo_j{%W?rwh`H-ZYVeaZJK(nwekV{igcgP!FswRKQ!1v zu*QPYPVEK~Rjc!94OTW6Sl0Vtix$DFY^oo1K(ZpLcv#6pE!OS%Y*S2{D1984^1Wc5 z{JUCjxUk~Gr)zjjB#aWM8mJu!&~6Pze*U-LS8kYum%Dq0{qxgfgDt%J{eA~V2bsdM z)Y>D^1Sz=}gN0DN>B}7XIJ}_*ubNrX9AM8gwmNTC6n2>cQ|Wn`?IQ2lVjI#ccuf8? z@3myDr+mK0f@zS_ioyvDXBHB{>uO;0QvZZL)pvjwX)0+%G5Tnn;HJ^R*Mzm#5oFo; ziAv@Z@cnbH#a1|cRgA7HloCqt0km2^x@c!2-=(OvScj$eaSlC4Dq2@PfNkHO$(C3 z5fZwdh~mfj1MZ(8Zyl8{#+Aq|%#1WJ zTDtR~8f$tHT@>DV@6})fkeg&ie&P`d^_zdwDY@L>Lq_UtZO?-)MF|(;N7t*7i)U86Jb` zTv~#r&8?=^C8($LL1WoQ2m*fgj3FvNi3p#k9jA_Jl0D=28CvY8Zl%IJ^mhm1G_o9L+b`ZO zsREn&1mSuihjP4mm(HL5}(0?X$mJ5kX8u{`_JrecCzqt`C(I_KsMi=Lm_T)p#l z@74-{Gm!m%{z$&XF%#AWtSd3|IZLpy$54Vuh=9VK%ojE{g<-Xq*jF;?pw<& zZZdE4%WVzq?X6=9udCyRjxf%|)3cCFGHS=N#~<&#U)Ppi6S-Y@HHq-`OOhy4yK0`1 zm6{3sbHk_YGHmmgTHJ;{aUOwkx6AkTGXZ&^95*9VLyrD!b3+1vMye+Q{og2Fd!DeD(O@ z#GMAiLz^bdVqMU^w-moue{+t$XpPoCtO!aqxe_LeP&jXIO@R0lCffc{Vl>=Io)*( z(P^-Lj8J8L>m46P?LK*cXwaeS&_Vq@udb{1e>{p}yWT14`y?n`a21oyDPa0&-NOFs zQ*`F%y$(C(=HLVU$?k3n0$m0S^&1Xe)RP+d0{~A;h0wtBP)Hb9L>MUOe`cis2mmA$ z8Y&nSLf=m7gYJljwf5 zhXXsg2_7$JR1ZPn|G!@AowaipoK|iZUM<0g zjesU`D(WF(hOwD9jsl;?Od?JfGQ@aO84;L}Wxhaa)jR{oS9llrQ429V6qEz_E?U|Q z(N6nC3ogk4UgAih7E8$#3yrMChJ3&n$C75*alzK7YL^*MgN1Y~;mnPpqR9;R1bIs+Y5cWOst;kSP>7p`vlaQ~{h=U6SwboDT z9Ha0wE&jR!4{#?i6)O5$1Xb6RJBYIy@@fP>RyXgm`3a%K`bId2iH<%18(^NJ_~V`n z^Io`ce!l)+Pl;|atA6?yYb5xq%t8`hw0t3Zt}%_^2BU-DQw*PpB@vo1ZMn``1lFb@ zh?ZG+(4B3b^5s(w6e05q0;~s2Y1iwuW05vsVw7zCr0pF8l3q;G{fge`3p)(ZnhlVa z4c8W`y>XeQRmyh@m!BoY@j~|2c9yOc;%ne15(*x;;aB#sf`-)^j2rL?8WC{wmXXcb zh~F<^uvuV{kKJ^B2Gjufeq=6~nS{L;y)ma2|Ag@-A6D7qe#T#$eQFynPwbZ3K-V2h zpl&e63L}}%uLUqFeKwSHmu=|BiquxXv(U6&L4b+SRtp-ob{MCru^M7(Hf=W(^WaDV zrxbK<8MEbI5_P2Rg&es3P7iH3xWwD4GvLPPflEczZufHAmdxbgi z+B2{qv_Fy`DZLbRREKYdgniZ-C4A1ch zU1-#JBel800)sTv7%#R!jz&xKBVv#=(eC`~vF_?x&zD&k!$qw8pu!i~=wmwOl=5EH zB5&E)|9uMnl`Exus2lBZi8CxIPo%Gc*rcKis?FD%ci>Ca+E)GTHhXb=RJX`#fG9+)YDz z!=}8$C0#~XWK1rIO{0t|0*xw6ikeT#J{XwEzlsjH$lBC*HI(^K39@ne`^a=)oiZ@edc`tiBOeM3p#bohJrt9Gr#uNH&dF~6A5IC*KH%{hEw)7uy~+GHtg zVrRNfd`wElk?XH#ZoP*9z?`RbzBQPKrkjE{D!iEoU_JEnm80WKqE3 zhsMPw{D{6N5XM9+#S#98YwK~Bfa9=(;=5)K_7QShYYui}|3ZVJHGV{2`ClPsdC1{Y z$(Mrp1+PD$iu(|xh)3JLpVPQlZ^9pPiGf}Q(ZW**POxh^e+W^I?t~w;Z_U4@6MQB~ zB0Xx4j7Chzju8gPf1n`D2cf6ycfhz{Ed=K4R?`pf^9If&_1h0 zQ~e~eGB}rTElFg?*0Rf_q@StzYQ|P&K-{j~8+~$|tYeF;y=?7G3-k34AnM?&(Vf29 z~%e(~sow#P{}S4R?r z$V3=)|KtanXDljM@WgN|I#z@H6Dl@F$VJv^Z{JHbU%$SiT7b|GKe^Z*lnLjyf)^$* ze-t7U&KTHug(5QqKP$4i*pmOX%N1#;GaKZ_&tJTK6EA4=9n+B z#Pbey+X&?jD?_*!?=N%L(XeL`-IeedE&Mm-0Ja?Y&>)au^p5nR<*0&Ns3L(zhr`^+ zPY0(o^)d>c8UEPM1jz}2iN((aL)ZNQhzn2DnR5jW!7wJweJOZ4deN$ldvd% z84!7Z`7n+7|9Xl8?K%r_MWTv>b2Q{A5yT+WdGH6IN%D({`O)MLpz+^@kLzYQ;wG=? z1qwIk{0R}RH~sz*egE1~fPjVsK*4-~hWOXm4H^vU1_OXaMFXN^V6w1dVUx0P2rGYL zr4xUd(LF%mnW_6V06rl^(I|BHM8M9ON(0OZZ zw%h#dp6cK{J$)(NWi#{M7N0I1oyHz>J1HlM46(omdCTc9-wpTd(i09$ zNOs2*5`iyG#7!wdO*p`&6tyk*!*|b&8#$N;G;E^9BCb2a)^P|Zq9IinDYui5{T^?0WGBxO>`Em}0X3DYC7tC1IYFYle z(6nq@19>^_ggU6YM|Gb>zwRaS3@FXXK(Y@PSE+|jx9x_Kada}vYfEs@Q zDm61%eplGyUpx17&*bsS74i}E_4a4nLW5?hjv6^>iW3*d&&`vh=9kz;j5wZ`l|$jt z>50#F)>>)NwF?tT9{PZaX*aOGCOT!la5^2*mDG`0gq|}BIxLfd*nGoOUL<9c zbv0?g?NhBR1|Au`Yq7)75m1Y3%$fF6N4zUh>1171Vs!WCJ(yZSZzeV?&9WLD|!cQk@3N5yA!LvX8%>3kPsoHU_A z*DSS}>50FBTSe|~tHjQ!u>*~?yEltZq!W+DX$3Ou^tV1q#K_e1@D+|GGacPj#(KhQ zqkit+Ok?>OAQvf+ZjlTwL+`h^w7@gj{t=O*EY& z4mv-!kny!+!z!frdtXyCYaSil4G9SP9?@^{dJ^{>2dHP? zR(SQ=@g74hbAM1;?$LES%Q(P0oA5OQ6*qQz5=cVOKGsigj5$zBpK_4Z*eOVevdg@R zxq3bJ&wy$nhCaX0vqe{H9)DG+->)X4#PUaaUakh$Xx{Gjz;72{VtI2Y)-?62Vd$0Fos^iH{g>KMorU%iiJbaKM!D5Fb3F~A+S9$RsN9hd z+n*pKT=YxW-VtzO*S!pI+Ub>@F1p0(uv)U?1_{9Th5a>zmNokSGK5|N$@*W^Uh@&e z&gR->GpZwx&rsCcn~xamnlCf^Zn_^4yJ)F60!kT#8o)gy6G>V#GJT+owVChlFw5%UlQn@z7Qtnh1|<>2ukCZCE68d@rDn z4MlPfHms%k5G6h@B>Va43NQVhA^k&#+a6h#Dnc?tD)#WB0`)o4%;8$yB%UgL)G3oA zJK3BOvdUxBcGGz)Auuo0XvkOTapf4Z0%-)a#&w=(qz4JM>0ZJGjI1QwQZQazE2v)m zSpp7YmDVg#@L;PvGZou;wbR|_DI>9Jo#Ox{y*mr{EB}J{c#$2e6oE&%k61Jt>rIrT z^n6^vLM9(`yvgVvz+q8vUo#p@`4{10v8bq=1@~<3OpKsxi>5GELJFf^1RN)pJCo|0 z7&`vK7JD6LFd{muIoe@pmgjtGws^>h4Y`^&Flgh+LPN5!ax-DDS|03206aCJGAOg$ z9O9_h_?8W;O+e)3noPc3=bF>0v`COWZChQNj(^HJ<0G+kNlb1|wm2xqZb|#Yz_g9w z)jk}_szB>@mrNt5RbN80k`AV0rJIVsDw=wWgjKQl66oFRIU(t~4+iG=ZC)(MM>jxi z`D(5Jt-|7!X0sRhj~oWPK<*cHYUWcAUyQ{?;v_(+RYMv`x*Jm-Mz96z3R9t^wiXFj z`;9S0o3b~k!!IXMR3sQC+~b*l`>%G`+88r}c>Z&;8>6g#St5Pg-{tN>J6cE3@(eX; zPz;JfO$X9}htog57XSX#(GpRjE_-t8lp7T>>5ijaGbNa9GNf~+@y6MJ*{RCM&rf2S zJ<6M0t+6jw-w;9cFhIIA16_n~?BE)fWmA^8s8AkIrXP3wE1D%H;XZH9>T9Hd@$pdr zC|O{}JI2h+OnVlmxl#HVn?6yuGOnhaYEbfsWei$ngji3LZQ5ZJ^V6sChB?4PDwz}v zqZ;Ug;i{pAkG%PnEdT9zgG|k$9A<=#rp79|cFvP+(JZ%ltILOoa>^h*SuuJFPyV7c zDke=uT{1Ekg|Gs97~2sB)&6HGrYk%K-Zq> znhLf>ODW_T9ddel3HYqWNqXJq3F9?>sEj#tJYvLU0jYw%|zYRUir8~$++-)D8M*WlNiz);jY>+s%E|N z>DZ}y$O8{gTD_+J0AM5}PRC!c#ikM&u5yj%Uq)Rs^@Y84K>@k<#j2fnW~mkas^yv2 zuQ^Y@6@C251p3tSb}Qx_mrvU+*tZ^eu3uxo6%y`R?1?pR!{6PU(OP%+K72R5lKqsmCR{)xUu)dZkXHvg7h;oC#Hpv$sH_hc@lqOZGMc6 z?wacSY9+fia1S`Q0tv=UZHoR1yALsi9_|pW)Rx0;eW3JT5M!p2e4J^$4kV zc08;a^=Oh@rRBl5o_V$~^EyKuB^6p#s*@_VZkc`6BI!snjt86945Re*D--Eus@uLs z+@ZM(l~nRBD<`y(1R3;~yI`AnL0b%ZWb#b|8<|vSlUN=U^4BXmU!c<7z%X z?%CZ`CD}`2mnq^7^|^1Uz=pT#Fq&Sa4jb}bZ&F7Rbl!v_-}f;C_|ej~36RDONSEdc z)63ZEoBaC)p81T+%X34@vxesSP}@c_HMZt@>COGx{<;DuQDxr8Udo?XYH2RNd0yJA zq;(n_zGRh>Uj<1#ERDA`h85#Qrzre5Vyx60a|LRcQ+;%}x3k4Zv8bnSDcwLQ*F(p< zgCX+kxA8%1iT60uXVYud{k9_&Z2SPst&bMd$BS7S2_Di3@rb`lGENP;1x zOB@@;CGU?#d z{T7=viWw{Fn6ySuxW=KgseC)T+xiDUT3EcIG}EZ*)9zXyR%yLgt0h0Y@+p}k#mI7p zPiU-9$ttC9=9*pYUCA>592?8d;Gg#aJdte&WgiFCJ69DI*U3&cz)TW(uYqGvHEbMe z>TySwR`441M!U!twnFKsvECcBu$-NR>?Dq(UrU)M!Or`mT*tFJ|R={uh5Nn6vFj$Rxsm7+sM zeI^BOS8V5cS##dG+*+&7Br%UX-D}R^9V@Hr^T=Lbp{ZX*^eYwfROD+L!S7Nsa_?GJ z?+1Bt$%lIn-ZM=gu-DBJ2d9kaTeW|)4=`EK`e{OKIUa=OD^drVN=#&*4a%#wS&s0W zjYd}20@w?%gOfbfIZNx-lOE;{vylc7Yt0~tfpxzP=LpF zHt5=j0D4$*1YDKi$WOTSkOI{QPAd}TM5hQB}A)j1;A$TyZAS$cbg2xGnV7ftz^5iw zKjH-Hk3J(`$MvL90A71adzZ@)h%ZgxsQcOJYCg1K$plYtF#PT1UYb8CT4eOBh5LDV zp8owhu=s}na2~jp?UG-PmlzmW-X}lw@~fg?bE~{~KiV~}F3NChw(fs!M5>c84@o=Z zuueS$CFe>3i&_SB>}!cJH!akuF+M4!D0y=>nIwn^eA|L0=KDk`WXHfARpZy=Z@7As zdWZOhqP4UZKTzHJ%M|i%JbT-59gd6Ji_j&}FT zFT1|Bb$sTvp=N4&M+49$3WO}b8oc9IYqKJ1$+CvEN%%KkNmop(x;4G3?{p3t*beYM zR&(N3^r!Kq5W9(siz_u5(*F8O1XqCpP@jV1x&Sdhtc?*w5wBS3fz#Za`YXm4yu1%{C;K7E_4JwWAQeduPZDwF62*>o4ULj_eP^q9 zyK?Jh=oxJUM$mO{iB=q{!l4^~ZM|IKVHj>2)spWo=~G}`8qzUsZNT!UY?kfi_9#)g zu18C<2zMOI+P%c`~_RU z>P>%VbIcQvjQ_LxPCL_op_<$FyQ^Jl#S3F@Pd0X4Mjt#`-C0&YI+XU#bKLm*$fwI8 zO?dGn)7=-wS|%lAqlTq?9YzxBq4wFt6;6Iwrnd#tx00We3U-xwrf>MxppWe6--BIP zsd&+{tD+k7&e!g3!HIbFl!*-W4j*tLAQX)C$;J86qM?-~h96Ao&{Zw+Y~;vfjO0Hw z4Vn?Xhy?@Ggr!71(W?^Sple_Up^D-@glY?w4P} zb(<5<)|OVGRM3m~em3<*^Zjfz-6Fu6ZX+>n&+Iu??Cm$)I0b{-)PWb#B>uYPLPEg6 zBSJ%efcP)BTr_lO@D8X71{s@(s+x&&!vZ;ru&A<2U}8aG;{d68(jaC~(LM~jv1vkb zlbG4R*VO*m1yn zNUS(Z?+ZH40x;@vlM?YXtv~)&tTU1|*va`ywlU6%4pg`DV&<&#(|*wo{mEH`4M(W~ zqKu8z!*uGZc`EP06_S9ltD;djxWG9S5N#a1n>=DO(X*{4M&+@S^Fyj~**@|CCXH#@ z;Uwm8e)3f}8DKbzHE(Dlu*5y}zdwLoJLiM3Fr_?@UIqv}b4aS85C_!qMwE?V23>q9 z%Kmiz% zBI#^-ld_G?4{6`$Ijs)=Iz5$nKCem4+vK%KFsg7niRqqZ8bibV3{#%eiWqL2#kV0M zwn?u_Yqm`DEjOCDNo!kq9ij+B*#wuA7sJO$1=DU)LulJtPnXYf4%@EMq3W?2|KdvEj*4U($6&Z7v{_58Y$(b@ z)+l{o$2Wng6ZmVsK~>}u(|;;A;DYquY$pE)oBap~UAeOKOgiHB9;z8$HAOPD@_n|a zf@54viUUSj(HB@XF5Vw6hq9?;ta6>dEpuY=2K0!N$4L&5F$EB4leM3!|MuDKOL+)u zrQQ`{zSa+|<7C?{-?|n(Bqo3Bx*AerBXP)jpcK0Sj%N6)3}t{~crJY(8K=b8r4*Vq zMTCA^rc_na6r-6kFzOfS|MEcGzI<8}`Xyn@0&!zzbbPLLhRFEY-Oa>l(gDd_xjV)| zCxy#iJc5%3ps9eF*9m)Fok?zmZQ3jh&`;LK$=vuHS?lGY#reCiL*Ylxmc{Ruxe`A^ zqv8{S^CPO?a6Nb(Y`?2=1j7HDy%!slb|a1e3sfrDm`hSyvV0x0VFCo(_Ud5jm{Kt-w59*5 zb$tA)=pg4S#r0R~!s}0tC)Vj7RD4C-nL?FRunVjrC%GCUp>4^E->E*;nD6`GXBW)h zCR_=s&El_r{qpY9N4HLD&- z>9G{s7#}1`TnT;4`L@TGd2UE&f55~=pnWluj645w?){Qq=vp7)4w*E2N}{=VJ|dfN&_(5b&gH(HuQ`=r};x=%Hpvku^QPCjsP z9yZA4D`vLGK*Ce%F(l63ob@2^>=LG0yJ!G_XgLOsHOWY+_m9(Kx zadThtSgElE4ez>^mgPOsR(O;Qo9_;z`efN9Qn2VR7h+FQr=ssQH}=+Xr!V6qwx^4I z%*>0fE(8}m9c=HLD_!}&B{y0^6X#m{wN46O!@lHFD#S5sp-QjAV|+oX*1iJPXtO+d zD{@E4Cnpan;k*Y83#4i-HreSa`A4A3)aA8vkhA z9{_qgfn+7QSJy&IdniGY3~&y4@_>!@X?>xI7MdtTtx*xj7gyE6e@k>dHr1OB2>%~K z=w3_oSN?Dh@8QjC(Z<)s5_4-4^Smytgtjah@EqIM{gbwNlGpJ6RsV z7=d*CffvhMaFR9W8j^6R+ss?_(D9W(Yx|*UUfXKeSw^m0v+M?+VA3=F=6o6542*r3! zspTVpk5SNQ)%dCjFNF^Dcz_ygSp8%yS5T> z#_YE$<<6e#kZAmv3a9~c&||DQj~KnuCuqrGRNed}PImnds>RVr&23V8Xwrr#oXQ+} zWhOId^0^9w^$p3t!1fkVt5!?|QfcJP#sVh+VPn%Cw-vB*NGHltx9mszf0^ z`4PE92Kzi8zMeFA6iIR}8C{ker+$3}4bJyRh@-lu978n1=6GmajpfQaNlGEZq)rwU z0A6)^UK#*-l+^N$lj^_tdxe0!vSlR@+A*%)6##~-UY36$C-`5LU1>NJY}+2$daa3J z9!trLWsqv@j3t?2EMbVoIzsj>#A68+VT>`Dq>^Pu4Tdab>&Z?=v`CZe4U)0TGI`NA zy~q3g|Gt0casRuH`@HV!Jns8G&Xb&)Xe8_)t2<+f+(eE9E8TYxBAcD@>C*M#SkMX& zI!HmY8?|fzTrcyGetZe8SASt6a~|S}{V%Z>f%z})W&f&X#8K0W-a&oGZ;GV;0F4$? zxYm;+9i5_RE-B zj&jqfkP zX(b)A#Ga`oyt(VkO7Ot&R4jpEqyg~bmbhn|`4u^zhuQ*ty@ab&=*-C;FS!Z% zP00}ekL^c<-zClw7}6GmMI#NkEX_maIqI)%cMD0MBlki%Th}}bugJ~G#fs0KW*2WH zzF&W0Iy3~q!Y7WYC;h5$5~;fAh7Miqgo6mVM(@4rt-RR;kU5&6U;FRV0_N)R90FEBWm}huS0^1RH!+Ql>)Dd)-k!nz{Y;?mU(Ll;)4vng|hhX?kp*8nw^rGH;-=Q$fz7Eixxn6FY7;?n1! zm$H@(k^hEWjORKKGudEUuQg4RE_`cd4t}@vVkbsc=hpmfsmncRcPFz*EdGT!vvt9E zE?GtDxNenpqnuf3#(ZCM7ncyZG~Wy=lvkdOC8-YD_GM7L+vjB7M_8(NFCdGL5zn0^ z64xST;(HL4;0p_A>WxmOB>xq}@pQ0;qbbH!~>^>dJ{hCjTp0>F9>XOOg#lj0>ED3 zQg6vafv^X(s~S%o`=MZ%JfCx9f;dH`LSXp7pl!wbLPr6CUrh?RJYtcx=#()0Pw5YT z;=qn6cT*{%L}~Kv0N<}oS*1l9X5@1sZ9K0ZrSK%Ly>W}c{;dBaM}I>mv#Etj~Ewh%m_!Gu$?c;G*lAl z5J{~Ru37T3f$LLxXYa7|yFrP1=M2m|LWB#+!QbKi@t~LE) zT$LN_07xkKqJP@Erg4`+@7Mtz{RWgb^=*HFc5IN_i|PmX6=OsL%Q~F?dGabyo0K6f zWbg^Nev9bERIsIIcD1_hNlv&ck(!V2!wl8M$ldw1K zyMH;vvYbH(K&4iD3#u&ESFeY5 z71fX|XPe^lh4z-i#NHdJ6zi00Ewnsf(eo^XsqBo$uy5`gwHfhp-s`Qct-w4pWrKy| z+$CXc^fQ_`S9D5C^JNY^0vC5)U^NSRB&W~Uu7nMJD1)s2$?p}VGjoHYGo5hTsTi15 z>Et!(wkn>i3*SrYX!rHa9@Sn*a7J*$FPew=pzSqsB{tm#L^F*=lvHq^OG_Y&@Y|7M zm@AvWKC0N>vwm;9Bd{hR9^|QiwN2ME51#*cyRCX48itr^MYbiq@% z4=(ktY`;>~lh<4L4M>(EjXNvOgJjnU_Ow^~;Zu(PnwLCg2=hFuEAv*Eo)9TF5%)&8 z)l=H8&gLB`@V>7g{P)P1E4R;-k?^KHnw;5;Lgs3g>Rk#NIcqldK_My5h3%)}*DeDM_3+e-(|7+*K~X1G(iFaCtRA?39O|vA6_50Zd_Fh{38*N_DdmOK zmxU-ebBi`(p9y6AXGNWwMpMF`-+6K#>Otm3kO9Se7@)*Ee;aQAh!h^&^zaQtq*Mst zxk}E)BlFCDxf9j>OzRZ(*Mh|@4~~DrEd7wcc<4oT9FN{X4-y0#;dg}qs!VunMV`J^ zK|kMtfQx7zQ^ZnIZv{~aaS}nl1L(?`vp>7!=DKg0bmTauLxEE*1<=0>7&Euu$j+ND2K8G0TYxmgMx(@$vZ8xZ1?{SGOusNl(auW*Aqp5YVDJ+06E1ch!KR^K@QHMe!ZO+s%u-(u8yt=7~Xu>#Gz zG1hB0!u&;y>+J`bP^S8pmF!(-PP+CDPR6O~ScgYQ;mgFR|K*It14@*i)Um}04*kU2 z8_uzmlYH3@mhEi0By+~)a%bD0<3k9#+l~NX&fy@)1aGl9)KWaxfEzF4LDsZELHBzD zwz`tKL-(roRVBqSCtctt>sesRcKE^84P$=J^r$baw0)wpAylw`A6YmB;nT2TWNt6q`#w zbji@}RbsG|ibh~gY#7({&YjEO#bll;Ak~c4C(u?LX%uTFiUmTb-3}Vx&)z$sTTWLE zz({#C$(7?!nm8>&?F27MXAPwnc0SPE@EqFaxp3WGd2XL1UB1*~Y*L|Xad|~7dV$Vy zbP$z>%hvwU8K=~WPpSF;S6aNQEdjpE9uCU?hE7zqOG9l`8UvMkblzKUH2be^y8jp& zbC771OK}nw)19PaBi-tbjGh$wS@7`7cC0f?gaQ@E#vY0K`GKBBT^l>z`6{-Xat;i` z-hwr^^5L^=@N3$Nr7jJ9y-uOal1a*MD(gUzn!@E~>N?MZHOw!oj7G@~qZOVq@^E@^gVoL`1~+`zrg4GH=q zhUR8rZV6ybF}5Kn|Ijy1xVyqnCbXR|s(F&j6nTT2I&B@6U)Momn zl~40vbNl+;CPGgwrXWGeRz#vo^va=%#z!&v-QX>;r?CzDmF&wICs&t^gjb+HbyAlu zMj$fEW+#&V8gGY(KVE`c>Cwx4@n%%k0e}1*(>b4BUJnY1Zgl-#TGDp0Kkn<2!w5~g zvI66hkuJCqL^qCJr{ynR-v56Ayn?5WKTl%wvo~rR^I$L2G3XIr$!y>eANg-P#SqaU fgzs%Vr*-jYG(YMS<ttdtee# literal 0 HcmV?d00001 diff --git a/website/static/img/logo.svg b/website/static/img/logo.svg new file mode 100644 index 0000000..9db6d0d --- /dev/null +++ b/website/static/img/logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/website/static/safari-pinned-tab.svg b/website/static/safari-pinned-tab.svg new file mode 100644 index 0000000..2563f76 --- /dev/null +++ b/website/static/safari-pinned-tab.svg @@ -0,0 +1,27 @@ + + + + +Created by potrace 1.14, written by Peter Selinger 2001-2017 + + + + + diff --git a/website/static/site.webmanifest b/website/static/site.webmanifest new file mode 100644 index 0000000..c0f898a --- /dev/null +++ b/website/static/site.webmanifest @@ -0,0 +1,11 @@ +{ + "name": "StackQL AWS Provider", + "short_name": "StackQL AWS", + "icons": [ + { "src": "/favicon-32x32.png", "sizes": "32x32", "type": "image/png" }, + { "src": "/favicon-16x16.png", "sizes": "16x16", "type": "image/png" } + ], + "theme_color": "#ffffff", + "background_color": "#ffffff", + "display": "standalone" +} diff --git a/website/yarn.lock b/website/yarn.lock index 00f1900..92a90cd 100644 --- a/website/yarn.lock +++ b/website/yarn.lock @@ -2,192 +2,223 @@ # yarn lockfile v1 -"@algolia/abtesting@1.3.0": - version "1.3.0" - resolved "https://registry.yarnpkg.com/@algolia/abtesting/-/abtesting-1.3.0.tgz#3fade769bf5b03244baaee8034b83e2b49f8e86c" - integrity sha512-KqPVLdVNfoJzX5BKNGM9bsW8saHeyax8kmPFXul5gejrSPN3qss7PgsFH5mMem7oR8tvjvNkia97ljEYPYCN8Q== - dependencies: - "@algolia/client-common" "5.37.0" - "@algolia/requester-browser-xhr" "5.37.0" - "@algolia/requester-fetch" "5.37.0" - "@algolia/requester-node-http" "5.37.0" - -"@algolia/autocomplete-core@1.17.9": - version "1.17.9" - resolved "https://registry.yarnpkg.com/@algolia/autocomplete-core/-/autocomplete-core-1.17.9.tgz#83374c47dc72482aa45d6b953e89377047f0dcdc" - integrity sha512-O7BxrpLDPJWWHv/DLA9DRFWs+iY1uOJZkqUwjS5HSZAGcl0hIVCQ97LTLewiZmZ402JYUrun+8NqFP+hCknlbQ== - dependencies: - "@algolia/autocomplete-plugin-algolia-insights" "1.17.9" - "@algolia/autocomplete-shared" "1.17.9" - -"@algolia/autocomplete-plugin-algolia-insights@1.17.9": - version "1.17.9" - resolved "https://registry.yarnpkg.com/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.17.9.tgz#74c86024d09d09e8bfa3dd90b844b77d9f9947b6" - integrity sha512-u1fEHkCbWF92DBeB/KHeMacsjsoI0wFhjZtlCq2ddZbAehshbZST6Hs0Avkc0s+4UyBGbMDnSuXHLuvRWK5iDQ== - dependencies: - "@algolia/autocomplete-shared" "1.17.9" - -"@algolia/autocomplete-preset-algolia@1.17.9": - version "1.17.9" - resolved "https://registry.yarnpkg.com/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.17.9.tgz#911f3250544eb8ea4096fcfb268f156b085321b5" - integrity sha512-Na1OuceSJeg8j7ZWn5ssMu/Ax3amtOwk76u4h5J4eK2Nx2KB5qt0Z4cOapCsxot9VcEN11ADV5aUSlQF4RhGjQ== - dependencies: - "@algolia/autocomplete-shared" "1.17.9" - -"@algolia/autocomplete-shared@1.17.9": - version "1.17.9" - resolved "https://registry.yarnpkg.com/@algolia/autocomplete-shared/-/autocomplete-shared-1.17.9.tgz#5f38868f7cb1d54b014b17a10fc4f7e79d427fa8" - integrity sha512-iDf05JDQ7I0b7JEA/9IektxN/80a2MZ1ToohfmNS3rfeuQnIKI3IJlIafD0xu4StbtQTghx9T3Maa97ytkXenQ== - -"@algolia/client-abtesting@5.37.0": - version "5.37.0" - resolved "https://registry.yarnpkg.com/@algolia/client-abtesting/-/client-abtesting-5.37.0.tgz#37df3674ccc37dfb0aa4cbfea42002bb136fb909" - integrity sha512-Dp2Zq+x9qQFnuiQhVe91EeaaPxWBhzwQ6QnznZQnH9C1/ei3dvtmAFfFeaTxM6FzfJXDLvVnaQagTYFTQz3R5g== - dependencies: - "@algolia/client-common" "5.37.0" - "@algolia/requester-browser-xhr" "5.37.0" - "@algolia/requester-fetch" "5.37.0" - "@algolia/requester-node-http" "5.37.0" - -"@algolia/client-analytics@5.37.0": - version "5.37.0" - resolved "https://registry.yarnpkg.com/@algolia/client-analytics/-/client-analytics-5.37.0.tgz#6fb4d748e1af43d8bc9f955d73d98205ce1c1ee5" - integrity sha512-wyXODDOluKogTuZxRII6mtqhAq4+qUR3zIUJEKTiHLe8HMZFxfUEI4NO2qSu04noXZHbv/sRVdQQqzKh12SZuQ== - dependencies: - "@algolia/client-common" "5.37.0" - "@algolia/requester-browser-xhr" "5.37.0" - "@algolia/requester-fetch" "5.37.0" - "@algolia/requester-node-http" "5.37.0" - -"@algolia/client-common@5.37.0": - version "5.37.0" - resolved "https://registry.yarnpkg.com/@algolia/client-common/-/client-common-5.37.0.tgz#f7ca097c4bae44e4ea365ee8f420693d0005c98e" - integrity sha512-GylIFlPvLy9OMgFG8JkonIagv3zF+Dx3H401Uo2KpmfMVBBJiGfAb9oYfXtplpRMZnZPxF5FnkWaI/NpVJMC+g== - -"@algolia/client-insights@5.37.0": - version "5.37.0" - resolved "https://registry.yarnpkg.com/@algolia/client-insights/-/client-insights-5.37.0.tgz#f4f4011fc89bc0b2dfc384acc3c6fb38f633f4ec" - integrity sha512-T63afO2O69XHKw2+F7mfRoIbmXWGzgpZxgOFAdP3fR4laid7pWBt20P4eJ+Zn23wXS5kC9P2K7Bo3+rVjqnYiw== - dependencies: - "@algolia/client-common" "5.37.0" - "@algolia/requester-browser-xhr" "5.37.0" - "@algolia/requester-fetch" "5.37.0" - "@algolia/requester-node-http" "5.37.0" - -"@algolia/client-personalization@5.37.0": - version "5.37.0" - resolved "https://registry.yarnpkg.com/@algolia/client-personalization/-/client-personalization-5.37.0.tgz#c1688db681623b189f353599815a118033ceebb5" - integrity sha512-1zOIXM98O9zD8bYDCJiUJRC/qNUydGHK/zRK+WbLXrW1SqLFRXECsKZa5KoG166+o5q5upk96qguOtE8FTXDWQ== - dependencies: - "@algolia/client-common" "5.37.0" - "@algolia/requester-browser-xhr" "5.37.0" - "@algolia/requester-fetch" "5.37.0" - "@algolia/requester-node-http" "5.37.0" - -"@algolia/client-query-suggestions@5.37.0": - version "5.37.0" - resolved "https://registry.yarnpkg.com/@algolia/client-query-suggestions/-/client-query-suggestions-5.37.0.tgz#fa514df8d36fb548258c712f3ba6f97eb84ebb87" - integrity sha512-31Nr2xOLBCYVal+OMZn1rp1H4lPs1914Tfr3a34wU/nsWJ+TB3vWjfkUUuuYhWoWBEArwuRzt3YNLn0F/KRVkg== - dependencies: - "@algolia/client-common" "5.37.0" - "@algolia/requester-browser-xhr" "5.37.0" - "@algolia/requester-fetch" "5.37.0" - "@algolia/requester-node-http" "5.37.0" - -"@algolia/client-search@5.37.0": - version "5.37.0" - resolved "https://registry.yarnpkg.com/@algolia/client-search/-/client-search-5.37.0.tgz#38c7110d96fbbbda7b7fb0578a18b8cad3c25af2" - integrity sha512-DAFVUvEg+u7jUs6BZiVz9zdaUebYULPiQ4LM2R4n8Nujzyj7BZzGr2DCd85ip4p/cx7nAZWKM8pLcGtkTRTdsg== - dependencies: - "@algolia/client-common" "5.37.0" - "@algolia/requester-browser-xhr" "5.37.0" - "@algolia/requester-fetch" "5.37.0" - "@algolia/requester-node-http" "5.37.0" +"@11ty/gray-matter@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@11ty/gray-matter/-/gray-matter-1.0.0.tgz#35ee04d76b870893c053f64f659c923a7a9db2d7" + integrity sha512-7mJJl+wf1AByoT0PknQiQfOPnVNT4fevGrUBVWO4HXsnYn1aQPyRyrELYrNUFleUBM++KzMKN6QaxHPk0t/6/g== + dependencies: + js-yaml "^4.1.0" + kind-of "^6.0.3" + section-matter "^1.0.0" + strip-bom-string "^1.0.0" + +"@algolia/abtesting@1.25.0": + version "1.25.0" + resolved "https://registry.yarnpkg.com/@algolia/abtesting/-/abtesting-1.25.0.tgz#cf3b1ead5b9910b22ec953bcf1e20ad8b308f5d4" + integrity sha512-rSTin9Uta23uaewYVQEp8XI9T3iA/zrg0/1G2vhf8oFFDxFL5vybnZ5IQwsVAg4JpKxPX4/WYNKdcfWrZymk7w== + dependencies: + "@algolia/client-common" "5.59.0" + "@algolia/requester-browser-xhr" "5.59.0" + "@algolia/requester-fetch" "5.59.0" + "@algolia/requester-node-http" "5.59.0" + +"@algolia/autocomplete-core@1.19.2": + version "1.19.2" + resolved "https://registry.yarnpkg.com/@algolia/autocomplete-core/-/autocomplete-core-1.19.2.tgz#702df67a08cb3cfe8c33ee1111ef136ec1a9e232" + integrity sha512-mKv7RyuAzXvwmq+0XRK8HqZXt9iZ5Kkm2huLjgn5JoCPtDy+oh9yxUMfDDaVCw0oyzZ1isdJBc7l9nuCyyR7Nw== + dependencies: + "@algolia/autocomplete-plugin-algolia-insights" "1.19.2" + "@algolia/autocomplete-shared" "1.19.2" + +"@algolia/autocomplete-core@^1.19.2": + version "1.19.10" + resolved "https://registry.yarnpkg.com/@algolia/autocomplete-core/-/autocomplete-core-1.19.10.tgz#a8c6b9ac8d29d41402800d5e095b632b70089ec4" + integrity sha512-K8uQ5iZCCMeqqE0JxjvcxJzDFuqZC1LTGJvR2P76ofDoOdKTs6jqoNxG5MnhzlTkNfE98VOQjcrg7qLxXPpT7g== + dependencies: + "@algolia/autocomplete-plugin-algolia-insights" "1.19.10" + "@algolia/autocomplete-shared" "1.19.10" + +"@algolia/autocomplete-plugin-algolia-insights@1.19.10": + version "1.19.10" + resolved "https://registry.yarnpkg.com/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.19.10.tgz#2686c0daca6e1f72b59ae9dae375c72193b3c35e" + integrity sha512-zy/cYkMKEDdT4ns/SZC6by99qaIzLCTtckPw7cTe8BMPepwXjjQdhRyBCk2CJodMQc4Ktb0zJrt2YxTtMYa4Gg== + dependencies: + "@algolia/autocomplete-shared" "1.19.10" + +"@algolia/autocomplete-plugin-algolia-insights@1.19.2": + version "1.19.2" + resolved "https://registry.yarnpkg.com/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.19.2.tgz#3584b625b9317e333d1ae43664d02358e175c52d" + integrity sha512-TjxbcC/r4vwmnZaPwrHtkXNeqvlpdyR+oR9Wi2XyfORkiGkLTVhX2j+O9SaCCINbKoDfc+c2PB8NjfOnz7+oKg== + dependencies: + "@algolia/autocomplete-shared" "1.19.2" + +"@algolia/autocomplete-shared@1.19.10": + version "1.19.10" + resolved "https://registry.yarnpkg.com/@algolia/autocomplete-shared/-/autocomplete-shared-1.19.10.tgz#b608b23d11a24f0d64dfebc859d572acd33a200e" + integrity sha512-vGJ2MDLgDOK3k256ks6t8u07bX4jdRQ0B/8MuRjjcvGTveVWwOU5lNd564uyuuqPMXQITl03HJx/juMtIFcQRw== + +"@algolia/autocomplete-shared@1.19.2": + version "1.19.2" + resolved "https://registry.yarnpkg.com/@algolia/autocomplete-shared/-/autocomplete-shared-1.19.2.tgz#c0b7b8dc30a5c65b70501640e62b009535e4578f" + integrity sha512-jEazxZTVD2nLrC+wYlVHQgpBoBB5KPStrJxLzsIFl6Kqd1AlG9sIAGl39V5tECLpIQzB3Qa2T6ZPJ1ChkwMK/w== + +"@algolia/client-abtesting@5.59.0": + version "5.59.0" + resolved "https://registry.yarnpkg.com/@algolia/client-abtesting/-/client-abtesting-5.59.0.tgz#3a6c22f3b71b79c9911d7a9b5d137401cd39d57f" + integrity sha512-bm2XN0hCSMYwStSsCBT0/PUB2BDxoyR1Lnub3c392HMEy9bi8PUSW8vR6zltVEKWG2t4PQFWMD5C07bmJxGgPg== + dependencies: + "@algolia/client-common" "5.59.0" + "@algolia/requester-browser-xhr" "5.59.0" + "@algolia/requester-fetch" "5.59.0" + "@algolia/requester-node-http" "5.59.0" + +"@algolia/client-analytics@5.59.0": + version "5.59.0" + resolved "https://registry.yarnpkg.com/@algolia/client-analytics/-/client-analytics-5.59.0.tgz#0eaba7b10c46da7bac955841961134a8af16e435" + integrity sha512-XOFPOTa69WuqHR6c5tMgnUUwwqQgNSzMpxmhrgA9KmxRf8WIqEa0cokHJvohk5CYb7CZx0xeSL6Bk2IUJ7Lv7Q== + dependencies: + "@algolia/client-common" "5.59.0" + "@algolia/requester-browser-xhr" "5.59.0" + "@algolia/requester-fetch" "5.59.0" + "@algolia/requester-node-http" "5.59.0" + +"@algolia/client-common@5.59.0": + version "5.59.0" + resolved "https://registry.yarnpkg.com/@algolia/client-common/-/client-common-5.59.0.tgz#3def8bbdba75c5eb13e5fbbdbbc80a6b4362f897" + integrity sha512-PC8ipLOYFKRTfIUY1J3FJxS6ryzWziaXmIX9/sNMoUR8L+XhF7hX2QAeUI87YVl5zujvlYTSOb+HAIqKXDjyHQ== + +"@algolia/client-insights@5.59.0": + version "5.59.0" + resolved "https://registry.yarnpkg.com/@algolia/client-insights/-/client-insights-5.59.0.tgz#47d8127d4f9093dbb9c4456f18139378614248ac" + integrity sha512-yFNcCMM5fHiyoR0HuxMrzy+VjDcmhFUZTm2IJ2DHwGsVH3B5SEob4zTmeEZ3j/AZqNnmrJOCKl/tJnBg7+84bA== + dependencies: + "@algolia/client-common" "5.59.0" + "@algolia/requester-browser-xhr" "5.59.0" + "@algolia/requester-fetch" "5.59.0" + "@algolia/requester-node-http" "5.59.0" + +"@algolia/client-personalization@5.59.0": + version "5.59.0" + resolved "https://registry.yarnpkg.com/@algolia/client-personalization/-/client-personalization-5.59.0.tgz#b4200dbbeeda202440d0a81176bc004347c655ae" + integrity sha512-GYja6HkDt2VrQhWmB2cLx3Z5fDwI9no7q+xwCWcFrTPm5CLH9QZvK0XLO9co1FcNIDxxkMaP3AXM39/XcecEOg== + dependencies: + "@algolia/client-common" "5.59.0" + "@algolia/requester-browser-xhr" "5.59.0" + "@algolia/requester-fetch" "5.59.0" + "@algolia/requester-node-http" "5.59.0" + +"@algolia/client-query-suggestions@5.59.0": + version "5.59.0" + resolved "https://registry.yarnpkg.com/@algolia/client-query-suggestions/-/client-query-suggestions-5.59.0.tgz#5abd4de319821587b5fefffcb6a82557877f6fce" + integrity sha512-Wofg7bMpWh8N5qDDZs0wy6whc+KMmdNsxgrIGp9Ug2s1Bka0uq7AjyckdxReKPHLA0Q1qH8X/SNh0wn2t2X2Lw== + dependencies: + "@algolia/client-common" "5.59.0" + "@algolia/requester-browser-xhr" "5.59.0" + "@algolia/requester-fetch" "5.59.0" + "@algolia/requester-node-http" "5.59.0" + +"@algolia/client-search@5.59.0": + version "5.59.0" + resolved "https://registry.yarnpkg.com/@algolia/client-search/-/client-search-5.59.0.tgz#04b78294e570410025ae5baa2af726afd94060f6" + integrity sha512-fHnALZfbEnODczGk14Y/1YBRApp6UEpZUTexGcMUPzY7RDc7q4HN2Y6jh0KUG8Jo9B+q+wOoQEc3ziR0ErbuFg== + dependencies: + "@algolia/client-common" "5.59.0" + "@algolia/requester-browser-xhr" "5.59.0" + "@algolia/requester-fetch" "5.59.0" + "@algolia/requester-node-http" "5.59.0" "@algolia/events@^4.0.1": version "4.0.1" resolved "https://registry.yarnpkg.com/@algolia/events/-/events-4.0.1.tgz#fd39e7477e7bc703d7f893b556f676c032af3950" integrity sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ== -"@algolia/ingestion@1.37.0": - version "1.37.0" - resolved "https://registry.yarnpkg.com/@algolia/ingestion/-/ingestion-1.37.0.tgz#bb6016e656c68014050814abf130e103f977794e" - integrity sha512-pkCepBRRdcdd7dTLbFddnu886NyyxmhgqiRcHHaDunvX03Ij4WzvouWrQq7B7iYBjkMQrLS8wQqSP0REfA4W8g== +"@algolia/ingestion@1.59.0": + version "1.59.0" + resolved "https://registry.yarnpkg.com/@algolia/ingestion/-/ingestion-1.59.0.tgz#c151412bef8130958b49f2b67c74267b4390a3ae" + integrity sha512-Fa38s1mHgoaLCT117sfJ6P78rtxUt93CYxBYpq1VOIcslaF+cH+1h5uikAPsKfxLnsuEDZHiBiaI6eNPTsQMRA== + dependencies: + "@algolia/client-common" "5.59.0" + "@algolia/requester-browser-xhr" "5.59.0" + "@algolia/requester-fetch" "5.59.0" + "@algolia/requester-node-http" "5.59.0" + +"@algolia/monitoring@1.59.0": + version "1.59.0" + resolved "https://registry.yarnpkg.com/@algolia/monitoring/-/monitoring-1.59.0.tgz#a4d88bd92c7732d9753cd8540113b8b80435824d" + integrity sha512-NyNsRSqM2tF1MX7ZGw/j4rduoEJiQ5wfvbSo/CFVdEzYCjyxbGFRPOZyS/GETJG9rk1TdHOq8NZqKqk/u1fm4g== dependencies: - "@algolia/client-common" "5.37.0" - "@algolia/requester-browser-xhr" "5.37.0" - "@algolia/requester-fetch" "5.37.0" - "@algolia/requester-node-http" "5.37.0" + "@algolia/client-common" "5.59.0" + "@algolia/requester-browser-xhr" "5.59.0" + "@algolia/requester-fetch" "5.59.0" + "@algolia/requester-node-http" "5.59.0" -"@algolia/monitoring@1.37.0": - version "1.37.0" - resolved "https://registry.yarnpkg.com/@algolia/monitoring/-/monitoring-1.37.0.tgz#6d20c220d648db8faea45679350f1516917cc13d" - integrity sha512-fNw7pVdyZAAQQCJf1cc/ih4fwrRdQSgKwgor4gchsI/Q/ss9inmC6bl/69jvoRSzgZS9BX4elwHKdo0EfTli3w== +"@algolia/recommend@5.59.0": + version "5.59.0" + resolved "https://registry.yarnpkg.com/@algolia/recommend/-/recommend-5.59.0.tgz#59fc6015f6a5d0c044d2ff1f7085a33e6229da73" + integrity sha512-nXBK2uygWtvbCOffMWqqfjjcEtp9enDKY5/2Pw/Hhw8VVaOyK2ThbGK04bNX/Le+qoK1VHYkodWGVTKfw0Otkw== dependencies: - "@algolia/client-common" "5.37.0" - "@algolia/requester-browser-xhr" "5.37.0" - "@algolia/requester-fetch" "5.37.0" - "@algolia/requester-node-http" "5.37.0" + "@algolia/client-common" "5.59.0" + "@algolia/requester-browser-xhr" "5.59.0" + "@algolia/requester-fetch" "5.59.0" + "@algolia/requester-node-http" "5.59.0" -"@algolia/recommend@5.37.0": - version "5.37.0" - resolved "https://registry.yarnpkg.com/@algolia/recommend/-/recommend-5.37.0.tgz#dd5e814f30bbb92395902e120fdb28a120b91341" - integrity sha512-U+FL5gzN2ldx3TYfQO5OAta2TBuIdabEdFwD5UVfWPsZE5nvOKkc/6BBqP54Z/adW/34c5ZrvvZhlhNTZujJXQ== +"@algolia/requester-browser-xhr@5.59.0": + version "5.59.0" + resolved "https://registry.yarnpkg.com/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.59.0.tgz#d5212acb793a600bf456b5de9fa9821cbb982c80" + integrity sha512-yb+4afX/zja8QwX0KmV4/ae2kyYkRknsE79CRusYS2U5D8qwn2wq0cn1x12f3tm3F3+5FgmDdbuGdQTuCLSKMQ== dependencies: - "@algolia/client-common" "5.37.0" - "@algolia/requester-browser-xhr" "5.37.0" - "@algolia/requester-fetch" "5.37.0" - "@algolia/requester-node-http" "5.37.0" + "@algolia/client-common" "5.59.0" -"@algolia/requester-browser-xhr@5.37.0": - version "5.37.0" - resolved "https://registry.yarnpkg.com/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.37.0.tgz#8851ab846d8005055c36a59422161ebe1594ae48" - integrity sha512-Ao8GZo8WgWFABrU7iq+JAftXV0t+UcOtCDL4mzHHZ+rQeTTf1TZssr4d0vIuoqkVNnKt9iyZ7T4lQff4ydcTrw== +"@algolia/requester-fetch@5.59.0": + version "5.59.0" + resolved "https://registry.yarnpkg.com/@algolia/requester-fetch/-/requester-fetch-5.59.0.tgz#76eed36e67286b59da4b6685587d93b0e600774f" + integrity sha512-Lp52TmpA1QtNmdHzs505Xwf4tgII7RAapkDSF9AAtWIBETcGaTIaXci4Rd9nS6SdaWK1BWTSqAPp5wzh6UN3Ag== dependencies: - "@algolia/client-common" "5.37.0" + "@algolia/client-common" "5.59.0" -"@algolia/requester-fetch@5.37.0": - version "5.37.0" - resolved "https://registry.yarnpkg.com/@algolia/requester-fetch/-/requester-fetch-5.37.0.tgz#93602fdc9a59b41ecd53768c53c11cddb0db846a" - integrity sha512-H7OJOXrFg5dLcGJ22uxx8eiFId0aB9b0UBhoOi4SMSuDBe6vjJJ/LeZyY25zPaSvkXNBN3vAM+ad6M0h6ha3AA== +"@algolia/requester-node-http@5.59.0": + version "5.59.0" + resolved "https://registry.yarnpkg.com/@algolia/requester-node-http/-/requester-node-http-5.59.0.tgz#b443a095ba494f5d176b891dcd07d8edad78c686" + integrity sha512-YYHLEs5rC6oRTFwT7bJaKBR9NSFzikeVHGAT1ffATmUQzR8XqyhHXjoieAUoR7fBU6I5cfy1FVeh5GoRgriuzA== dependencies: - "@algolia/client-common" "5.37.0" + "@algolia/client-common" "5.59.0" -"@algolia/requester-node-http@5.37.0": - version "5.37.0" - resolved "https://registry.yarnpkg.com/@algolia/requester-node-http/-/requester-node-http-5.37.0.tgz#83da1b52f3ee86f262a5d4b2a88a74db665211c2" - integrity sha512-npZ9aeag4SGTx677eqPL3rkSPlQrnzx/8wNrl1P7GpWq9w/eTmRbOq+wKrJ2r78idlY0MMgmY/mld2tq6dc44g== +"@antfu/install-pkg@^2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@antfu/install-pkg/-/install-pkg-2.0.1.tgz#bdbc3d228e6f645c583ed93545fcdd5f5a2f0ca2" + integrity sha512-iCKVQcIC0e3oDxEfs3SHQGW+ovhBMZmS1TE+bTk50rVyMCBmCfClv7Qi3HQKlumYwvjb/iIMeWCW2i67q6kFfQ== dependencies: - "@algolia/client-common" "5.37.0" + package-manager-detector "^1.7.0" + tinyexec "^1.2.4" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.27.1.tgz#200f715e66d52a23b221a9435534a91cc13ad5be" - integrity sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg== +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.29.7.tgz#f2fbbfea87c44a21590ec515b778b2c26d8866e7" + integrity sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw== dependencies: - "@babel/helper-validator-identifier" "^7.27.1" + "@babel/helper-validator-identifier" "^7.29.7" js-tokens "^4.0.0" picocolors "^1.1.1" -"@babel/compat-data@^7.27.2", "@babel/compat-data@^7.27.7", "@babel/compat-data@^7.28.0": - version "7.28.4" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.28.4.tgz#96fdf1af1b8859c8474ab39c295312bfb7c24b04" - integrity sha512-YsmSKC29MJwf0gF8Rjjrg5LQCmyh+j/nD8/eP7f+BeoQTKYqs9RoWbjGOdy0+1Ekr68RJZMUOPVQaQisnIo4Rw== +"@babel/compat-data@^7.28.6", "@babel/compat-data@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.29.7.tgz#6f0237f0f36d2e51c0570a636faed9d2d0efe629" + integrity sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg== "@babel/core@^7.21.3", "@babel/core@^7.25.9": - version "7.28.4" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.28.4.tgz#12a550b8794452df4c8b084f95003bce1742d496" - integrity sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA== - dependencies: - "@babel/code-frame" "^7.27.1" - "@babel/generator" "^7.28.3" - "@babel/helper-compilation-targets" "^7.27.2" - "@babel/helper-module-transforms" "^7.28.3" - "@babel/helpers" "^7.28.4" - "@babel/parser" "^7.28.4" - "@babel/template" "^7.27.2" - "@babel/traverse" "^7.28.4" - "@babel/types" "^7.28.4" + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.29.7.tgz#80c10b17248082968b57a857b91640971f2070f7" + integrity sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA== + dependencies: + "@babel/code-frame" "^7.29.7" + "@babel/generator" "^7.29.7" + "@babel/helper-compilation-targets" "^7.29.7" + "@babel/helper-module-transforms" "^7.29.7" + "@babel/helpers" "^7.29.7" + "@babel/parser" "^7.29.7" + "@babel/template" "^7.29.7" + "@babel/traverse" "^7.29.7" + "@babel/types" "^7.29.7" "@jridgewell/remapping" "^2.3.5" convert-source-map "^2.0.0" debug "^4.1.0" @@ -195,213 +226,221 @@ json5 "^2.2.3" semver "^6.3.1" -"@babel/generator@^7.25.9", "@babel/generator@^7.28.3": - version "7.28.3" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.28.3.tgz#9626c1741c650cbac39121694a0f2d7451b8ef3e" - integrity sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw== +"@babel/generator@^7.25.9", "@babel/generator@^7.29.7", "@babel/generator@^7.29.8": + version "7.29.8" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.29.8.tgz#4b0b887885422643339e09022148a4c4ebaa4979" + integrity sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg== dependencies: - "@babel/parser" "^7.28.3" - "@babel/types" "^7.28.2" + "@babel/parser" "^7.29.8" + "@babel/types" "^7.29.8" "@jridgewell/gen-mapping" "^0.3.12" "@jridgewell/trace-mapping" "^0.3.28" jsesc "^3.0.2" -"@babel/helper-annotate-as-pure@^7.27.1", "@babel/helper-annotate-as-pure@^7.27.3": - version "7.27.3" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz#f31fd86b915fc4daf1f3ac6976c59be7084ed9c5" - integrity sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg== +"@babel/helper-annotate-as-pure@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.29.7.tgz#c70fe3c6ecbdc3fd2dd1b0f498428b88b82ce47f" + integrity sha512-OoK6239jHPuSQOoS0kfTVKn0b/rVTk0seKq4Gd2UMLtmOVLjDC0ki3e+c90Trqv2gMfvJFqkiljrr568+qddiw== dependencies: - "@babel/types" "^7.27.3" + "@babel/types" "^7.29.7" -"@babel/helper-compilation-targets@^7.27.1", "@babel/helper-compilation-targets@^7.27.2": - version "7.27.2" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz#46a0f6efab808d51d29ce96858dd10ce8732733d" - integrity sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ== +"@babel/helper-compilation-targets@^7.28.6", "@babel/helper-compilation-targets@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz#7a1def704302401c47f64fa85589e974ae217042" + integrity sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g== dependencies: - "@babel/compat-data" "^7.27.2" - "@babel/helper-validator-option" "^7.27.1" + "@babel/compat-data" "^7.29.7" + "@babel/helper-validator-option" "^7.29.7" browserslist "^4.24.0" lru-cache "^5.1.1" semver "^6.3.1" -"@babel/helper-create-class-features-plugin@^7.27.1", "@babel/helper-create-class-features-plugin@^7.28.3": - version "7.28.3" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.3.tgz#3e747434ea007910c320c4d39a6b46f20f371d46" - integrity sha512-V9f6ZFIYSLNEbuGA/92uOvYsGCJNsuA8ESZ4ldc09bWk/j8H8TKiPw8Mk1eG6olpnO0ALHJmYfZvF4MEE4gajg== - dependencies: - "@babel/helper-annotate-as-pure" "^7.27.3" - "@babel/helper-member-expression-to-functions" "^7.27.1" - "@babel/helper-optimise-call-expression" "^7.27.1" - "@babel/helper-replace-supers" "^7.27.1" - "@babel/helper-skip-transparent-expression-wrappers" "^7.27.1" - "@babel/traverse" "^7.28.3" +"@babel/helper-create-class-features-plugin@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.29.7.tgz#6eddf286f2ec418f740c91d60a83347c55838ddd" + integrity sha512-IY3ZD9Tmooqr3TUhc3DUWxiuo8xx1DWLhd5M7hQ+ZWJamqM2BbalrBJb2MisSLoYorOj75U03qULCxQTY9r3hg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.29.7" + "@babel/helper-member-expression-to-functions" "^7.29.7" + "@babel/helper-optimise-call-expression" "^7.29.7" + "@babel/helper-replace-supers" "^7.29.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.29.7" + "@babel/traverse" "^7.29.7" semver "^6.3.1" -"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.27.1.tgz#05b0882d97ba1d4d03519e4bce615d70afa18c53" - integrity sha512-uVDC72XVf8UbrH5qQTc18Agb8emwjTiZrQE11Nv3CuBEZmVvTwwE9CBUEvHku06gQCAyYf8Nv6ja1IN+6LMbxQ== +"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.29.7.tgz#5d4c3f928f315cf6c4184ea2fc3b5b38745b2430" + integrity sha512-907Uymvqgg1dwUA+7IGwFAOSYzQOuzPXKNJ1yxzwPffzkYFg2q2eHi1fIOs6sXkG9NbIUMunnUlkYsfRFNvomg== dependencies: - "@babel/helper-annotate-as-pure" "^7.27.1" - regexpu-core "^6.2.0" + "@babel/helper-annotate-as-pure" "^7.29.7" + regexpu-core "^6.3.1" semver "^6.3.1" -"@babel/helper-define-polyfill-provider@^0.6.5": - version "0.6.5" - resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.5.tgz#742ccf1cb003c07b48859fc9fa2c1bbe40e5f753" - integrity sha512-uJnGFcPsWQK8fvjgGP5LZUZZsYGIoPeRjSF5PGwrelYgq7Q15/Ft9NGFp1zglwgIv//W0uG4BevRuSJRyylZPg== +"@babel/helper-define-polyfill-provider@^0.6.5", "@babel/helper-define-polyfill-provider@^0.6.8": + version "0.6.8" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.8.tgz#cf1e4462b613f2b54c41e6ff758d5dfcaa2c85d1" + integrity sha512-47UwBLPpQi1NoWzLuHNjRoHlYXMwIJoBf7MFou6viC/sIHWYygpvr0B6IAyh5sBdA2nr2LPIRww8lfaUVQINBA== dependencies: - "@babel/helper-compilation-targets" "^7.27.2" - "@babel/helper-plugin-utils" "^7.27.1" - debug "^4.4.1" + "@babel/helper-compilation-targets" "^7.28.6" + "@babel/helper-plugin-utils" "^7.28.6" + debug "^4.4.3" lodash.debounce "^4.0.8" - resolve "^1.22.10" - -"@babel/helper-globals@^7.28.0": - version "7.28.0" - resolved "https://registry.yarnpkg.com/@babel/helper-globals/-/helper-globals-7.28.0.tgz#b9430df2aa4e17bc28665eadeae8aa1d985e6674" - integrity sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw== - -"@babel/helper-member-expression-to-functions@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.27.1.tgz#ea1211276be93e798ce19037da6f06fbb994fa44" - integrity sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA== - dependencies: - "@babel/traverse" "^7.27.1" - "@babel/types" "^7.27.1" - -"@babel/helper-module-imports@^7.16.7", "@babel/helper-module-imports@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz#7ef769a323e2655e126673bb6d2d6913bbead204" - integrity sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w== - dependencies: - "@babel/traverse" "^7.27.1" - "@babel/types" "^7.27.1" - -"@babel/helper-module-transforms@^7.27.1", "@babel/helper-module-transforms@^7.28.3": - version "7.28.3" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz#a2b37d3da3b2344fe085dab234426f2b9a2fa5f6" - integrity sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw== - dependencies: - "@babel/helper-module-imports" "^7.27.1" - "@babel/helper-validator-identifier" "^7.27.1" - "@babel/traverse" "^7.28.3" - -"@babel/helper-optimise-call-expression@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz#c65221b61a643f3e62705e5dd2b5f115e35f9200" - integrity sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw== - dependencies: - "@babel/types" "^7.27.1" - -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.27.1", "@babel/helper-plugin-utils@^7.8.0": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz#ddb2f876534ff8013e6c2b299bf4d39b3c51d44c" - integrity sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw== - -"@babel/helper-remap-async-to-generator@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.27.1.tgz#4601d5c7ce2eb2aea58328d43725523fcd362ce6" - integrity sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.27.1" - "@babel/helper-wrap-function" "^7.27.1" - "@babel/traverse" "^7.27.1" - -"@babel/helper-replace-supers@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.27.1.tgz#b1ed2d634ce3bdb730e4b52de30f8cccfd692bc0" - integrity sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA== - dependencies: - "@babel/helper-member-expression-to-functions" "^7.27.1" - "@babel/helper-optimise-call-expression" "^7.27.1" - "@babel/traverse" "^7.27.1" - -"@babel/helper-skip-transparent-expression-wrappers@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz#62bb91b3abba8c7f1fec0252d9dbea11b3ee7a56" - integrity sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg== - dependencies: - "@babel/traverse" "^7.27.1" - "@babel/types" "^7.27.1" - -"@babel/helper-string-parser@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz#54da796097ab19ce67ed9f88b47bb2ec49367687" - integrity sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA== - -"@babel/helper-validator-identifier@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz#a7054dcc145a967dd4dc8fee845a57c1316c9df8" - integrity sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow== - -"@babel/helper-validator-option@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz#fa52f5b1e7db1ab049445b421c4471303897702f" - integrity sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg== - -"@babel/helper-wrap-function@^7.27.1": - version "7.28.3" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.28.3.tgz#fe4872092bc1438ffd0ce579e6f699609f9d0a7a" - integrity sha512-zdf983tNfLZFletc0RRXYrHrucBEg95NIFMkn6K9dbeMYnsgHaSBGcQqdsCSStG2PYwRre0Qc2NNSCXbG+xc6g== - dependencies: - "@babel/template" "^7.27.2" - "@babel/traverse" "^7.28.3" - "@babel/types" "^7.28.2" - -"@babel/helpers@^7.28.4": - version "7.28.4" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.28.4.tgz#fe07274742e95bdf7cf1443593eeb8926ab63827" - integrity sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w== - dependencies: - "@babel/template" "^7.27.2" - "@babel/types" "^7.28.4" + resolve "^1.22.11" + +"@babel/helper-globals@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-globals/-/helper-globals-7.29.7.tgz#f04a96fbd8473241b1079243f5b3f03a3010ab7b" + integrity sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA== + +"@babel/helper-member-expression-to-functions@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.29.7.tgz#8dbdb3ce0b5c487e1aec10e13c9a43a500814df8" + integrity sha512-j+7JYmk1JYDtACIGj0QJqqWZjoUpMoEikQGADMaHgCMCSDqd2+P32rfcibUNrGOMWrlzK1WJBdxrB3JJQZwWtg== + dependencies: + "@babel/traverse" "^7.29.7" + "@babel/types" "^7.29.7" + +"@babel/helper-module-imports@^7.16.7", "@babel/helper-module-imports@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz#ef25048a518e828d7393fac5882ddd73921d7396" + integrity sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g== + dependencies: + "@babel/traverse" "^7.29.7" + "@babel/types" "^7.29.7" + +"@babel/helper-module-transforms@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz#b062747a5997ba138637201328bbff77960574ae" + integrity sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg== + dependencies: + "@babel/helper-module-imports" "^7.29.7" + "@babel/helper-validator-identifier" "^7.29.7" + "@babel/traverse" "^7.29.7" + +"@babel/helper-optimise-call-expression@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.29.7.tgz#77b0b5b94f1997fa9d6e3125f445227b1faf9d85" + integrity sha512-+kmGVjcT9RGYzoDwdwEqEvGgKe3BYq+O1iGzjFubaNgZHwYHP6lsF2Yghf4kEuv9BV7tYDZ913aBW9am6YKong== + dependencies: + "@babel/types" "^7.29.7" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.28.6", "@babel/helper-plugin-utils@^7.29.7", "@babel/helper-plugin-utils@^7.8.0": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.29.7.tgz#c0a0766f1a13617d8a17407d7ab8f9d486225ea4" + integrity sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw== + +"@babel/helper-remap-async-to-generator@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.29.7.tgz#34b1f68dd75b86d31df781a29c3ff2df88da82e6" + integrity sha512-16AMiW26DbXWBbr3B8wNozKM0ydMLB892vaOaJW/fPJdnT8vJk5sdkQcU/isqUxyCE0cEoa8wZOcbgDuC4b6Og== + dependencies: + "@babel/helper-annotate-as-pure" "^7.29.7" + "@babel/helper-wrap-function" "^7.29.7" + "@babel/traverse" "^7.29.7" + +"@babel/helper-replace-supers@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.29.7.tgz#bc3c3964329043c79112e513c1b198f16589ac21" + integrity sha512-atfGXWSeCiF4DnKZIfmJfQRkSw9b9gNNXR1kqKjbhG4pGYCOnkp8OcTB8E3NXjBu8NpheSnOeNKz8KT7UNFTmQ== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.29.7" + "@babel/helper-optimise-call-expression" "^7.29.7" + "@babel/traverse" "^7.29.7" + +"@babel/helper-skip-transparent-expression-wrappers@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.29.7.tgz#50c95c7e4c4f54936cfa0116428edc559862d551" + integrity sha512-brcMGQaVzIeUb+6/bs1Av0f8YuNNjKY2JyvfRCsFuFsdKccEQ5Ges2y74D74NZ1Rz8lKJ9ksJkfqwQFJ/iNEyQ== + dependencies: + "@babel/traverse" "^7.29.7" + "@babel/types" "^7.29.7" + +"@babel/helper-string-parser@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz#7f0871d99824d23137d60f86fcf6130fd5a1b51f" + integrity sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw== + +"@babel/helper-validator-identifier@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz#bd87084ced0c796ec46bda492de6e83d29e89fc2" + integrity sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg== + +"@babel/helper-validator-option@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz#cf315be940213b354eb4abcc0bd01ebe3f73bc2a" + integrity sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw== + +"@babel/helper-wrap-function@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.29.7.tgz#eec72163044548a0935e9d182bf2d547ec5ff483" + integrity sha512-iES0Skag9ERIF68aXadpO6dbXa03mNWK3sEqJaMnLNs/eC3l0lkImdfoy6Y09/SfkpawdAB4RjQ7PVA7TcVGdw== + dependencies: + "@babel/template" "^7.29.7" + "@babel/traverse" "^7.29.7" + "@babel/types" "^7.29.7" + +"@babel/helpers@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.29.7.tgz#45abfde7548997e34376c3e69feb475cffb4a607" + integrity sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg== + dependencies: + "@babel/template" "^7.29.7" + "@babel/types" "^7.29.7" -"@babel/parser@^7.27.2", "@babel/parser@^7.28.3", "@babel/parser@^7.28.4": - version "7.28.4" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.28.4.tgz#da25d4643532890932cc03f7705fe19637e03fa8" - integrity sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg== +"@babel/parser@^7.29.7", "@babel/parser@^7.29.8": + version "7.29.8" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.29.8.tgz#9653716a2f10c677b98fbc63d4bfb000c302cf17" + integrity sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA== dependencies: - "@babel/types" "^7.28.4" - -"@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.27.1.tgz#61dd8a8e61f7eb568268d1b5f129da3eee364bf9" - integrity sha512-QPG3C9cCVRQLxAVwmefEmwdTanECuUBMQZ/ym5kiw3XKCGA7qkuQLcjWWHcrD/GKbn/WmJwaezfuuAOcyKlRPA== + "@babel/types" "^7.29.8" + +"@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.29.7.tgz#2b535896d933a85aa92377eaa3d51a437d54a4e3" + integrity sha512-j8SrR0zLZrRsC09DlszEx8FpMiwukKffYXMK0d5LmOglO7vGG6sz/BR/20yHqWH+Lnn31JTt2PE3hIWNgM2J6w== dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - "@babel/traverse" "^7.27.1" - -"@babel/plugin-bugfix-safari-class-field-initializer-scope@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.27.1.tgz#43f70a6d7efd52370eefbdf55ae03d91b293856d" - integrity sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA== + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/traverse" "^7.29.7" + +"@babel/plugin-bugfix-safari-class-field-initializer-scope@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.29.7.tgz#b00711a9e52bf4fe55ef7e54b2ef4a881bf804c8" + integrity sha512-r8j8escF+U2FUHo0KOhPUdMzUO+jp9fInva6+ACVAF3Y97Ev+5iNZwiqTghmzNeWwDkOPlYuTcfb1vDaoZKmAQ== dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - -"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.27.1.tgz#beb623bd573b8b6f3047bd04c32506adc3e58a72" - integrity sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-plugin-utils" "^7.29.7" + +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.29.7.tgz#2375328852026a3cf6bc0bcf2de7d236f2d5e701" + integrity sha512-GE1TFSiuFeGsCxmYXZl8HwoPrVlwe4rHPFE8weieGKZqnDORK+Ar3vgWMgW+AOxQ6/2TgLSKx9p6W7O4rC6qgQ== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.27.1.tgz#e134a5479eb2ba9c02714e8c1ebf1ec9076124fd" - integrity sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw== +"@babel/plugin-bugfix-safari-rest-destructuring-rhs-array@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-rest-destructuring-rhs-array/-/plugin-bugfix-safari-rest-destructuring-rhs-array-7.29.7.tgz#759a857c46c4d2a6199685cf71070d81ae5f743a" + integrity sha512-oBNVCvnO5tND+xSopWvV8WNGfpTfgP4Zr/YXXSj8zfmcPktp5Ku/aZlsIowgSD4fjmgHn6sGmB9APVsU5zOdhA== dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - "@babel/helper-skip-transparent-expression-wrappers" "^7.27.1" - "@babel/plugin-transform-optional-chaining" "^7.27.1" - -"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@^7.28.3": - version "7.28.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.28.3.tgz#373f6e2de0016f73caf8f27004f61d167743742a" - integrity sha512-b6YTX108evsvE4YgWyQ921ZAFFQm3Bn+CA3+ZXlNVnPhx+UfsVURoPjfGAPCjBgrqo30yX/C2nZGX96DxvR9Iw== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - "@babel/traverse" "^7.28.3" + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.29.7" + +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.29.7.tgz#86de98dd8e03836178231ea96c27dab26016a705" + integrity sha512-QQt9qKHZ2sg/kivaLr7lnQr8HVrQDdBNSfCsTjiDxRuX/K5ORyKq+Bu8Xr0cDE3Dfkv0cw28Ve0EKyKMvulkOw== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.29.7" + "@babel/plugin-transform-optional-chaining" "^7.29.7" + +"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.29.7.tgz#f5d892681dbf4b08753436a5e55000d5ba728d6d" + integrity sha512-pn6QacGLgvCcwc+syUhKE/qSjV2D1IHDB84RNxWYSt1mW3K/SCtjinZ2p0cETJxAWBjPy3K/1lHwG5BjjPxNlw== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/traverse" "^7.29.7" "@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2": version "7.21.0-placeholder-for-preset-env.2" @@ -415,33 +454,33 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-import-assertions@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.27.1.tgz#88894aefd2b03b5ee6ad1562a7c8e1587496aecd" - integrity sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg== +"@babel/plugin-syntax-import-assertions@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.29.7.tgz#c5cd868505269126cc18882e1f01f7b0e0e24b4e" + integrity sha512-/An1OCBN93thpBAGyfsK2pcf0jvju1SAtKkL2Ny++B5Sy6sqgzXDQH1cZxWbF96Wuk+bn41MDA9bLd4VVAw6rw== dependencies: - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-syntax-import-attributes@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz#34c017d54496f9b11b61474e7ea3dfd5563ffe07" - integrity sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww== +"@babel/plugin-syntax-import-attributes@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.29.7.tgz#6115264516e95ead0f35a41710906612e447f605" + integrity sha512-zGYcYfq/WmZ4V+kBIXQon9dSSc8ircGZqw9ZaNhhGj9nZkeBu1jHLBDQqYYi5WA9uawvA2sIMbry2nCFhf5Djg== dependencies: - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-syntax-jsx@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz#2f9beb5eff30fa507c5532d107daac7b888fa34c" - integrity sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w== +"@babel/plugin-syntax-jsx@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.29.7.tgz#622c16f9ad63782fe6e83dadc7e40330744b7f1e" + integrity sha512-TSu8+mHCoEaaCDEZ0I3+6mvTBYR4PCxQwf2z9/r5Tbztv6NaLR3B9thGTTxX2WGuGHJqRiAbKPeGTJ5XWXVg6A== dependencies: - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-syntax-typescript@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.27.1.tgz#5147d29066a793450f220c63fa3a9431b7e6dd18" - integrity sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ== +"@babel/plugin-syntax-typescript@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.29.7.tgz#7c29388932313ed58413a0343048d75d92fb5b24" + integrity sha512-ngr+82Sh0xMz25TPCZi+nC2iTzjfCdWS2ONXTp/PtSCHCgaCNBpdMqgvJ2ccdLlClVZ7sisIgB914j/JFe+RZA== dependencies: - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-plugin-utils" "^7.29.7" "@babel/plugin-syntax-unicode-sets-regex@^7.18.6": version "7.18.6" @@ -451,540 +490,541 @@ "@babel/helper-create-regexp-features-plugin" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-arrow-functions@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.27.1.tgz#6e2061067ba3ab0266d834a9f94811196f2aba9a" - integrity sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA== +"@babel/plugin-transform-arrow-functions@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.29.7.tgz#d651343f562c03f47951bd1802195d0e10605f27" + integrity sha512-N7zArUXWzAMzm+/N0uPBeVB3Fam5lMxtUwMmDK5f/IBBS7a7p1qeUoxd/6CckXoxUdgsntq1Dh8xNW06maZbDQ== dependencies: - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-transform-async-generator-functions@^7.28.0": - version "7.28.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.28.0.tgz#1276e6c7285ab2cd1eccb0bc7356b7a69ff842c2" - integrity sha512-BEOdvX4+M765icNPZeidyADIvQ1m1gmunXufXxvRESy/jNNyfovIqUyE7MVgGBjWktCoJlzvFA1To2O4ymIO3Q== +"@babel/plugin-transform-async-generator-functions@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.29.7.tgz#a5365617921d82a1fee33124a1102bb38a1e677d" + integrity sha512-d98gXZkgswvkyohMBABkhm3GeXhYj8psWfwQ2C7gtfrKGTykQa/iOIi+JJhwMjPlZ6Vm2XN+DCf3Es1EoG4ZLA== dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - "@babel/helper-remap-async-to-generator" "^7.27.1" - "@babel/traverse" "^7.28.0" + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/helper-remap-async-to-generator" "^7.29.7" + "@babel/traverse" "^7.29.7" -"@babel/plugin-transform-async-to-generator@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.27.1.tgz#9a93893b9379b39466c74474f55af03de78c66e7" - integrity sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA== +"@babel/plugin-transform-async-to-generator@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.29.7.tgz#3b5e8f1fb58133cf701bcf0baaf6f01bfd1a8889" + integrity sha512-pcUb2SS+RMo9TWVBwKGI5ShtoG7R+zBsFmCKDa6fe8c+hPr3XJlZgoE5j6i8W7gDjhyvy+85vmYexanvXh3d1w== dependencies: - "@babel/helper-module-imports" "^7.27.1" - "@babel/helper-plugin-utils" "^7.27.1" - "@babel/helper-remap-async-to-generator" "^7.27.1" + "@babel/helper-module-imports" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/helper-remap-async-to-generator" "^7.29.7" -"@babel/plugin-transform-block-scoped-functions@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.27.1.tgz#558a9d6e24cf72802dd3b62a4b51e0d62c0f57f9" - integrity sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg== +"@babel/plugin-transform-block-scoped-functions@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.29.7.tgz#96d292634434082d6687bcdb81139affedf77e8c" + integrity sha512-cUSmjh72N+rN4PrkFlN1dJwNCwjVp5d38/CQrEsFggkD10UiFlBFgdH3tv5dNsLuHY+3S8db2xCHjhZcv5WgvA== dependencies: - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-transform-block-scoping@^7.28.0": - version "7.28.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.4.tgz#e19ac4ddb8b7858bac1fd5c1be98a994d9726410" - integrity sha512-1yxmvN0MJHOhPVmAsmoW5liWwoILobu/d/ShymZmj867bAdxGbehIrew1DuLpw2Ukv+qDSSPQdYW1dLNE7t11A== +"@babel/plugin-transform-block-scoping@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.29.7.tgz#baa376691ae16244cd14335422fca6900f54e17d" + integrity sha512-ONyr4+AZhKh8yKWInVxU9AXA9EbsyeLcL6V0dJy6M2/62vuvpGm29zzuymbTpdc451GEpDIdAyPLP3r+P61yKQ== dependencies: - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-transform-class-properties@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.27.1.tgz#dd40a6a370dfd49d32362ae206ddaf2bb082a925" - integrity sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA== +"@babel/plugin-transform-class-properties@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.29.7.tgz#034897b8a21beec163332fac2de235b14409abdf" + integrity sha512-GtcpjFvanPfzNQi3eTitsCqtRRmmqzpy/A+yhTR1HaZo1Ly3EA8ZXxlPyHdR8/IuRMYc3E4wdGBewB2QKQjAaA== dependencies: - "@babel/helper-create-class-features-plugin" "^7.27.1" - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-create-class-features-plugin" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-transform-class-static-block@^7.28.3": - version "7.28.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.28.3.tgz#d1b8e69b54c9993bc558203e1f49bfc979bfd852" - integrity sha512-LtPXlBbRoc4Njl/oh1CeD/3jC+atytbnf/UqLoqTDcEYGUPj022+rvfkbDYieUrSj3CaV4yHDByPE+T2HwfsJg== +"@babel/plugin-transform-class-static-block@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.29.7.tgz#fed8efd19f3dd3e1114ee390707c70912778fd7c" + integrity sha512-kibJgmEdX2iMwsHY2tSZNDgj8PwIlCQz7FK9KuGKO8zsuoUwSEhoNnNVp/emKWrbY4HeO6kkXfdMqRKKKXBm2A== dependencies: - "@babel/helper-create-class-features-plugin" "^7.28.3" - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-create-class-features-plugin" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-transform-classes@^7.28.3": - version "7.28.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.4.tgz#75d66175486788c56728a73424d67cbc7473495c" - integrity sha512-cFOlhIYPBv/iBoc+KS3M6et2XPtbT2HiCRfBXWtfpc9OAyostldxIf9YAYB6ypURBBbx+Qv6nyrLzASfJe+hBA== +"@babel/plugin-transform-classes@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.29.7.tgz#61d3e5aaae0c838acc3204d9db7c8dc05c25815b" + integrity sha512-qV0OGGBVacduzQHE649JyCneOFI/maT+YKsO+K4Yi3xv2wTPNjM/W2o2gdzMwEAZz7fXNTHAe0NcSg30bIN69g== dependencies: - "@babel/helper-annotate-as-pure" "^7.27.3" - "@babel/helper-compilation-targets" "^7.27.2" - "@babel/helper-globals" "^7.28.0" - "@babel/helper-plugin-utils" "^7.27.1" - "@babel/helper-replace-supers" "^7.27.1" - "@babel/traverse" "^7.28.4" + "@babel/helper-annotate-as-pure" "^7.29.7" + "@babel/helper-compilation-targets" "^7.29.7" + "@babel/helper-globals" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/helper-replace-supers" "^7.29.7" + "@babel/traverse" "^7.29.7" -"@babel/plugin-transform-computed-properties@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.27.1.tgz#81662e78bf5e734a97982c2b7f0a793288ef3caa" - integrity sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw== +"@babel/plugin-transform-computed-properties@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.29.7.tgz#95028787ca31901b9a20b5c6d9605c32346f55ad" + integrity sha512-RK7/IyU5phpuCdBAuig5VkzG/EnbDaui5SQGdU9BFrHdV+mV4cUjLMQ9lJDjLNtWHsqtiefpGZUXQP2BiTYMsA== dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - "@babel/template" "^7.27.1" + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/template" "^7.29.7" -"@babel/plugin-transform-destructuring@^7.28.0": - version "7.28.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.28.0.tgz#0f156588f69c596089b7d5b06f5af83d9aa7f97a" - integrity sha512-v1nrSMBiKcodhsyJ4Gf+Z0U/yawmJDBOTpEB3mcQY52r9RIyPneGyAS/yM6seP/8I+mWI3elOMtT5dB8GJVs+A== +"@babel/plugin-transform-destructuring@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.29.7.tgz#5781ec6947852e27b64c1165f0db431f408090e4" + integrity sha512-iPX8aD6H9zV5s7ZsqTdNocPN/MGQ5sSMnElKrktxjJRMnB2jN/1p2+R7GkfD6CAYoVFqy5A4XnSIUeGgJzIWpg== dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - "@babel/traverse" "^7.28.0" + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/traverse" "^7.29.7" -"@babel/plugin-transform-dotall-regex@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.27.1.tgz#aa6821de864c528b1fecf286f0a174e38e826f4d" - integrity sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw== +"@babel/plugin-transform-dotall-regex@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.29.7.tgz#b203de9740e4c7ff6b55ce436ed5313b88d70af8" + integrity sha512-3qc18hsD2RdZiyJNDNc7HQpv6xbncwh8FYtxNFFzclSyh/trPD9KkVR9BDECUjDLvb7yJVF15GfYUuC+LMkkiQ== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.27.1" - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-create-regexp-features-plugin" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-transform-duplicate-keys@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.27.1.tgz#f1fbf628ece18e12e7b32b175940e68358f546d1" - integrity sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q== +"@babel/plugin-transform-duplicate-keys@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.29.7.tgz#8f3fe721835cb7a433420841dae90afc962ea7ae" + integrity sha512-6IvRRriEMqnBwD6chtxdLpMYCHWEzN+oL5cyQtjykya19UgzbmKhxmhZgKC/LHxS2nYr9Q/qYPZ5Lr6jOL9+yQ== dependencies: - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-transform-duplicate-named-capturing-groups-regex@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.27.1.tgz#5043854ca620a94149372e69030ff8cb6a9eb0ec" - integrity sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ== +"@babel/plugin-transform-duplicate-named-capturing-groups-regex@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.29.7.tgz#dc6c405e55c01b7657e1827a25332c4ac17e9cac" + integrity sha512-2wiIyo2BjtgU7HufSeDnL9L2O7zr8jmhFKuSr65VpRkUiRKRNpb0mdlk56+XPPKoIrfHqzbMuglDvZun0RISsA== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.27.1" - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-create-regexp-features-plugin" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-transform-dynamic-import@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.27.1.tgz#4c78f35552ac0e06aa1f6e3c573d67695e8af5a4" - integrity sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A== +"@babel/plugin-transform-dynamic-import@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.29.7.tgz#a83a6faec5bab5b619adf9d0eac6c1c270123c2a" + integrity sha512-giOlEm/EFjfjr+te9NsdjkUo2v4f8rS/SXPumRVHAtbNcyNlvtREkU1dZzaIDclNpnaVhlCqRdFKhJBjBikzLg== dependencies: - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-transform-explicit-resource-management@^7.28.0": - version "7.28.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.28.0.tgz#45be6211b778dbf4b9d54c4e8a2b42fa72e09a1a" - integrity sha512-K8nhUcn3f6iB+P3gwCv/no7OdzOZQcKchW6N389V6PD8NUWKZHzndOd9sPDVbMoBsbmjMqlB4L9fm+fEFNVlwQ== +"@babel/plugin-transform-explicit-resource-management@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.29.7.tgz#65c8b9f76ec915b02a0e1df703125a0fca58abaa" + integrity sha512-Rstj7coNz8sE+7Ju7ihpHLI564lsK5pUpNNlvptCIC/16E/S5hbl6n3kESPKdNRmqEWlpn5xpS5Q2dvXBsySLw== dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - "@babel/plugin-transform-destructuring" "^7.28.0" + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/plugin-transform-destructuring" "^7.29.7" -"@babel/plugin-transform-exponentiation-operator@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.27.1.tgz#fc497b12d8277e559747f5a3ed868dd8064f83e1" - integrity sha512-uspvXnhHvGKf2r4VVtBpeFnuDWsJLQ6MF6lGJLC89jBR1uoVeqM416AZtTuhTezOfgHicpJQmoD5YUakO/YmXQ== +"@babel/plugin-transform-exponentiation-operator@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.29.7.tgz#00bf002fde8794356171f5d4df200f6bc0d5a303" + integrity sha512-zFpMOTLZBdW5LfObqcSbL6kefg4R4eLdmvS0wbN9M6D5Mym/sKm9toOoWyVOa+xDjvCnuWcHls2YonXwHvH3CQ== dependencies: - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-transform-export-namespace-from@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.27.1.tgz#71ca69d3471edd6daa711cf4dfc3400415df9c23" - integrity sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ== +"@babel/plugin-transform-export-namespace-from@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.29.7.tgz#d6014f45cec61d7691335c6c9804204bee801d51" + integrity sha512-24B2nOy2TeJSMheqwPD4DDQOV/elLSIlKxjZt4i05H5AgdPdWR3n18HnNrcJ+j76WJd9gbwb9jPjNYUy6RautA== dependencies: - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-transform-for-of@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.27.1.tgz#bc24f7080e9ff721b63a70ac7b2564ca15b6c40a" - integrity sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw== +"@babel/plugin-transform-for-of@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.29.7.tgz#c65a678592117717aacdb10c1b73a9cb85e830be" + integrity sha512-zeSIHh0+E1Um1WJRXCFlHQYu2ieJNdivLLjlBEp+dIBu3S51n+SZZmIXjxnItw6pz56Cn+KvK68BIBVsxq2JiQ== dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - "@babel/helper-skip-transparent-expression-wrappers" "^7.27.1" + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.29.7" -"@babel/plugin-transform-function-name@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.27.1.tgz#4d0bf307720e4dce6d7c30fcb1fd6ca77bdeb3a7" - integrity sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ== +"@babel/plugin-transform-function-name@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.29.7.tgz#8b87f8a7504dbcd96135167e3fc4f61126a7bd86" + integrity sha512-otRWaHXE6fbAGkePvaj/kvs3HsqXfPhlnzwSOlnFgbqCPMd975dW+4wZ00WFBt+/YlBGcJwNrARQTOJOb4ZrIg== dependencies: - "@babel/helper-compilation-targets" "^7.27.1" - "@babel/helper-plugin-utils" "^7.27.1" - "@babel/traverse" "^7.27.1" + "@babel/helper-compilation-targets" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/traverse" "^7.29.7" -"@babel/plugin-transform-json-strings@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.27.1.tgz#a2e0ce6ef256376bd527f290da023983527a4f4c" - integrity sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q== +"@babel/plugin-transform-json-strings@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.29.7.tgz#f57d63dcc05b4481c281acedcd8fc4e3e439a1d4" + integrity sha512-RRnE2+eon1rJAq8MnoF1b5kTpY1vU88twHcvcKMrsqP/jxIRqDVs9iJB5fqPuqyeFAW0wJo4MlUIPpQCq/aRsg== dependencies: - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-transform-literals@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.27.1.tgz#baaefa4d10a1d4206f9dcdda50d7d5827bb70b24" - integrity sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA== +"@babel/plugin-transform-literals@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.29.7.tgz#b90bd47463326c2a9d779e1bd5e1f88b9f421921" + integrity sha512-DZ/oLP21ZuWx1vKqnoNv6/tvEK48AQOBRai40CX9dTjGluvT/YZCyY3rryDtyUqCEoyNroy5KKPwX2iQCiRvyw== dependencies: - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-transform-logical-assignment-operators@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.27.1.tgz#890cb20e0270e0e5bebe3f025b434841c32d5baa" - integrity sha512-SJvDs5dXxiae4FbSL1aBJlG4wvl594N6YEVVn9e3JGulwioy6z3oPjx/sQBO3Y4NwUu5HNix6KJ3wBZoewcdbw== +"@babel/plugin-transform-logical-assignment-operators@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.29.7.tgz#9b29425adf5c794967aabe4b046a046a167bac2f" + integrity sha512-A0H91hh6W8MFRkp5TqJmMr39jzGD1A1E1Ysiv2O06Sfbhkapm+XyIzxWCEh5kqwOZ1/8QZ0dY3SeQ7XBqfJd5Q== dependencies: - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-transform-member-expression-literals@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.27.1.tgz#37b88ba594d852418e99536f5612f795f23aeaf9" - integrity sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ== +"@babel/plugin-transform-member-expression-literals@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.29.7.tgz#1281689fa2fefc17b110d21ebafd0fe9402d5309" + integrity sha512-hl1kwFZCCiDyfH25Xmco9jTrkPgnS9pmOzSG7W5I4SaGbLeqKv417hcU2RKmaxoPEgsoJh7ZPOrnPGq99bHoUg== dependencies: - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-transform-modules-amd@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.27.1.tgz#a4145f9d87c2291fe2d05f994b65dba4e3e7196f" - integrity sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA== +"@babel/plugin-transform-modules-amd@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.29.7.tgz#f05ca662c8a1dc4be2f337af9c7e80369c942d6c" + integrity sha512-fxtQoH3m5ywUSIfaH0FGCzWu4McsYon5bD3K4XnskC7f+OyQMj7rsOMi4NvvmJ83WwBAg4UCe+ov4VZlqEvyew== dependencies: - "@babel/helper-module-transforms" "^7.27.1" - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-module-transforms" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-transform-modules-commonjs@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.27.1.tgz#8e44ed37c2787ecc23bdc367f49977476614e832" - integrity sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw== +"@babel/plugin-transform-modules-commonjs@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.29.7.tgz#70e6835abf2663dafbe94b8ef1f51de7351ef135" + integrity sha512-j0vCldybPC5b5dwCQOJ21uKtHzt7hxLygJTg9eF1ScfaikEDNfzn94XoW5Fi+seBR0nCyL23xaBFFkq7dTM8XQ== dependencies: - "@babel/helper-module-transforms" "^7.27.1" - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-module-transforms" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-transform-modules-systemjs@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.27.1.tgz#00e05b61863070d0f3292a00126c16c0e024c4ed" - integrity sha512-w5N1XzsRbc0PQStASMksmUeqECuzKuTJer7kFagK8AXgpCMkeDMO5S+aaFb7A51ZYDF7XI34qsTX+fkHiIm5yA== +"@babel/plugin-transform-modules-systemjs@^7.29.7": + version "7.29.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.29.8.tgz#e60a6a42ac63a3095f9cc7264f698a100c8fe05d" + integrity sha512-6iSnEK0zlkLKU4heofK/AdmRD4e2SHVpJMtrwnTCzhnaM98ria4rTrOXBBi45BTTYnJtO8txnPsX4fChYXkmeA== dependencies: - "@babel/helper-module-transforms" "^7.27.1" - "@babel/helper-plugin-utils" "^7.27.1" - "@babel/helper-validator-identifier" "^7.27.1" - "@babel/traverse" "^7.27.1" + "@babel/helper-module-transforms" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/helper-validator-identifier" "^7.29.7" + "@babel/traverse" "^7.29.8" -"@babel/plugin-transform-modules-umd@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.27.1.tgz#63f2cf4f6dc15debc12f694e44714863d34cd334" - integrity sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w== +"@babel/plugin-transform-modules-umd@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.29.7.tgz#391d1c0215aca6307257f2f608598dfe55feb6cf" + integrity sha512-B4UkaTK3QpgCwJnrxKfMPKdo92CN7OKXAlpAAnM3UPu0Q0lCCk57ylA9AJbRy2v8dDKOPAAWcoR6CMyeoHwRCA== dependencies: - "@babel/helper-module-transforms" "^7.27.1" - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-module-transforms" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-transform-named-capturing-groups-regex@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.27.1.tgz#f32b8f7818d8fc0cc46ee20a8ef75f071af976e1" - integrity sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng== +"@babel/plugin-transform-named-capturing-groups-regex@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.29.7.tgz#21e75d847b31189842fa7a77703722ed4b43d27d" + integrity sha512-vuFoLwr4qnv2xbZ16SQd6uPcH5FNrLHhk/Jzo++0XJFcaDsr4gjJVg6j398oMHiC+83k/GiBzviwF5KBJkPUtQ== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.27.1" - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-create-regexp-features-plugin" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-transform-new-target@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.27.1.tgz#259c43939728cad1706ac17351b7e6a7bea1abeb" - integrity sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ== +"@babel/plugin-transform-new-target@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.29.7.tgz#714147ce7947e1b49cbd84137ca2e75e92b2a067" + integrity sha512-fEo41GmsOUhOBlw8ioo6zvjX5Xc2Lqkzlyfqbpsk3eB6TReV18uhxZ0esfEokVbY2+PVJAQHNKxER6lGrzNd3A== dependencies: - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-transform-nullish-coalescing-operator@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.27.1.tgz#4f9d3153bf6782d73dd42785a9d22d03197bc91d" - integrity sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA== +"@babel/plugin-transform-nullish-coalescing-operator@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.29.7.tgz#8a54cdf88c3f50433a6173117a286195b67714cc" + integrity sha512-idmp1dFaekP9GbcMvG24Kvw2BfhFZjHnNJCkV4WuIY4PskJzwI3f1N5OdgYke38T7rftO6ERulFRn2cFeZwRkg== dependencies: - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-transform-numeric-separator@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.27.1.tgz#614e0b15cc800e5997dadd9bd6ea524ed6c819c6" - integrity sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw== +"@babel/plugin-transform-numeric-separator@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.29.7.tgz#0266d5cd42ab87ec40fee45a4e36483cfdcbc66a" + integrity sha512-zR7fv/z14OjgHl4AgRtkDBvBMhIzCxqV/qN/2BCRC7LjFwvuzjYe7gDWxC4Wl/SNsLM6SE1IWvRPYMgSJaUvNw== dependencies: - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-transform-object-rest-spread@^7.28.0": - version "7.28.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.4.tgz#9ee1ceca80b3e6c4bac9247b2149e36958f7f98d" - integrity sha512-373KA2HQzKhQCYiRVIRr+3MjpCObqzDlyrM6u4I201wL8Mp2wHf7uB8GhDwis03k2ti8Zr65Zyyqs1xOxUF/Ew== +"@babel/plugin-transform-object-rest-spread@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.29.7.tgz#e0d5060241803922c545676613cc8acbbda0d266" + integrity sha512-Ld98jn4c0smUywL57m7SgsHq3OpThOa6LqZJif3G6jYOovPleoFhVrBJ1WegRApSFB2wu4+RelAj9AC9G08Z4A== dependencies: - "@babel/helper-compilation-targets" "^7.27.2" - "@babel/helper-plugin-utils" "^7.27.1" - "@babel/plugin-transform-destructuring" "^7.28.0" - "@babel/plugin-transform-parameters" "^7.27.7" - "@babel/traverse" "^7.28.4" + "@babel/helper-compilation-targets" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/plugin-transform-destructuring" "^7.29.7" + "@babel/plugin-transform-parameters" "^7.29.7" + "@babel/traverse" "^7.29.7" -"@babel/plugin-transform-object-super@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.27.1.tgz#1c932cd27bf3874c43a5cac4f43ebf970c9871b5" - integrity sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng== +"@babel/plugin-transform-object-super@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.29.7.tgz#e89283d14fa3c35817d4493ffc6bc649aa10e4eb" + integrity sha512-Ea/diGcw0twB5IlZPO5sgET6fJsLJqPABqTuFWIR+iMPGPZJkATEIWx0wa+aEQ5UY1CBQyP/gkAiLEqn1vBiQA== dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - "@babel/helper-replace-supers" "^7.27.1" + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/helper-replace-supers" "^7.29.7" -"@babel/plugin-transform-optional-catch-binding@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.27.1.tgz#84c7341ebde35ccd36b137e9e45866825072a30c" - integrity sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q== +"@babel/plugin-transform-optional-catch-binding@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.29.7.tgz#729664f79985be504eba112c51de9f71d009030b" + integrity sha512-sLsyndxK2VwX6yNUOakMb7Sh553ZTe/vVM1XJ+9Z5aW1ytsc8xOIwmyk05NNjN60vkc5/KqoTH6hB4V41LJhng== dependencies: - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-transform-optional-chaining@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.27.1.tgz#874ce3c4f06b7780592e946026eb76a32830454f" - integrity sha512-BQmKPPIuc8EkZgNKsv0X4bPmOoayeu4F1YCwx2/CfmDSXDbp7GnzlUH+/ul5VGfRg1AoFPsrIThlEBj2xb4CAg== +"@babel/plugin-transform-optional-chaining@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.29.7.tgz#b84a1b574b3c73001023092567e16c492b720e51" + integrity sha512-6GM1dhvK3gNODkXcEcMCOLEDCLSoZ/sBbro2Ax8HURyasQ4NshagQixkRFdh5niI6E4gmA/jYI/4aT7rRos3ZQ== dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - "@babel/helper-skip-transparent-expression-wrappers" "^7.27.1" + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.29.7" -"@babel/plugin-transform-parameters@^7.27.7": - version "7.27.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.7.tgz#1fd2febb7c74e7d21cf3b05f7aebc907940af53a" - integrity sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg== +"@babel/plugin-transform-parameters@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.29.7.tgz#a5ddc3b9bfb534814cb8334cbeba47d9cf9db090" + integrity sha512-ZDOBqV/qLYJI0YElr8DcENEyARsFQeESqWXH6gZlghYXuPPjvweuDhP4VyEi4BlUBlLRFZVjxoZDMjxhLW766g== dependencies: - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-transform-private-methods@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.27.1.tgz#fdacbab1c5ed81ec70dfdbb8b213d65da148b6af" - integrity sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA== +"@babel/plugin-transform-private-methods@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.29.7.tgz#cea8bd3ab99533892897a02999d5b752584ad145" + integrity sha512-/6Rz4DK1ETDEM/bWHsPHcaEe7ZaT1EqSXjtSP/L0DijOYuaUhiRiOKcwpZ8P7zR4xXEHc2ITdiCgBm9Tpyv9ug== dependencies: - "@babel/helper-create-class-features-plugin" "^7.27.1" - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-create-class-features-plugin" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-transform-private-property-in-object@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.27.1.tgz#4dbbef283b5b2f01a21e81e299f76e35f900fb11" - integrity sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ== +"@babel/plugin-transform-private-property-in-object@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.29.7.tgz#4a2f6be5aba47be7afbdb4cd7903c46edf3a7661" + integrity sha512-+BNo06dnrzdNNqCm1X6YUaVv0DKk8Q+JYcoZfOkLhYWNCXzlwTSRq8zGWayT1csjcpNXV9CQTBRRbmTLZac5cA== dependencies: - "@babel/helper-annotate-as-pure" "^7.27.1" - "@babel/helper-create-class-features-plugin" "^7.27.1" - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-annotate-as-pure" "^7.29.7" + "@babel/helper-create-class-features-plugin" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-transform-property-literals@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.27.1.tgz#07eafd618800591e88073a0af1b940d9a42c6424" - integrity sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ== +"@babel/plugin-transform-property-literals@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.29.7.tgz#d45817cd72f9e134ab1f7fbb79264cfcb85cf636" + integrity sha512-bOMRLQuI0A5ZqHq3OWJ89/rXpJ/NJrbVhXiP4zwPGMs6kpcVsuTUNjwoE30K0Qm3mf48a/TnRYYD6vPNqcg6jA== dependencies: - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-plugin-utils" "^7.29.7" "@babel/plugin-transform-react-constant-elements@^7.21.3": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.27.1.tgz#6c6b50424e749a6e48afd14cf7b92f98cb9383f9" - integrity sha512-edoidOjl/ZxvYo4lSBOQGDSyToYVkTAwyVoa2tkuYTSmjrB1+uAedoL5iROVLXkxH+vRgA7uP4tMg2pUJpZ3Ug== + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.29.7.tgz#8264440ea2ffc5ec405aebd7eac074815d6e28b1" + integrity sha512-J0wGhKan+rIiE2OhfhRptySLrJ6SjQYM6b6N1FMlhyhCcw1Mig8vQjWchyB+bgHGDvaWo6Diu6CLRMra2uMtmg== dependencies: - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-transform-react-display-name@^7.27.1": - version "7.28.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.28.0.tgz#6f20a7295fea7df42eb42fed8f896813f5b934de" - integrity sha512-D6Eujc2zMxKjfa4Zxl4GHMsmhKKZ9VpcqIchJLvwTxad9zWIYulwYItBovpDOoNLISpcZSXoDJ5gaGbQUDqViA== +"@babel/plugin-transform-react-display-name@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.29.7.tgz#bf161a6d750267b79db7ff6f8fb89c3369b02df3" + integrity sha512-+1wdDMGNb4UPeY3Q4L5yLiYe6TXPXubs4NjrgRFw13hPRLJfEMw2Q5OXkee6/IfdqePIeW4Jjwe3aBh7SdKz4Q== dependencies: - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-transform-react-jsx-development@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.27.1.tgz#47ff95940e20a3a70e68ad3d4fcb657b647f6c98" - integrity sha512-ykDdF5yI4f1WrAolLqeF3hmYU12j9ntLQl/AOG1HAS21jxyg1Q0/J/tpREuYLfatGdGmXp/3yS0ZA76kOlVq9Q== +"@babel/plugin-transform-react-jsx-development@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.29.7.tgz#64e6aacb5cb43b9e80d3d5f19ddefc158a624f09" + integrity sha512-Xfy3UVMF04+ypnFbkhvfqtmvwfe92qwQdbGZVonhE+6v35GzlofmOnA1szaZqzb9xYWr0nl1e5EMmzi0DNON1g== dependencies: - "@babel/plugin-transform-react-jsx" "^7.27.1" + "@babel/plugin-transform-react-jsx" "^7.29.7" -"@babel/plugin-transform-react-jsx@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.27.1.tgz#1023bc94b78b0a2d68c82b5e96aed573bcfb9db0" - integrity sha512-2KH4LWGSrJIkVf5tSiBFYuXDAoWRq2MMwgivCf+93dd0GQi8RXLjKA/0EvRnVV5G0hrHczsquXuD01L8s6dmBw== +"@babel/plugin-transform-react-jsx@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.29.7.tgz#3d16a0e5773f079400a8c82a190709cdf92ee204" + integrity sha512-WsZulLVBUHXVj2cUcPVx6UE21TpalB6bHbSFErKT0Ib++ax24jjXe73FqlWvdylFOjiuPHYi6VCcgRad1ItN+A== dependencies: - "@babel/helper-annotate-as-pure" "^7.27.1" - "@babel/helper-module-imports" "^7.27.1" - "@babel/helper-plugin-utils" "^7.27.1" - "@babel/plugin-syntax-jsx" "^7.27.1" - "@babel/types" "^7.27.1" + "@babel/helper-annotate-as-pure" "^7.29.7" + "@babel/helper-module-imports" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/plugin-syntax-jsx" "^7.29.7" + "@babel/types" "^7.29.7" -"@babel/plugin-transform-react-pure-annotations@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.27.1.tgz#339f1ce355eae242e0649f232b1c68907c02e879" - integrity sha512-JfuinvDOsD9FVMTHpzA/pBLisxpv1aSf+OIV8lgH3MuWrks19R27e6a6DipIg4aX1Zm9Wpb04p8wljfKrVSnPA== +"@babel/plugin-transform-react-pure-annotations@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.29.7.tgz#76445c90112dd0a7371b63264563bfa9a4fcd6e3" + integrity sha512-H5E+HBgDpr6Q5t+Aj11tL7XkIui1jhbIoArVQnqjgXo5/3YxkN7ZEBcWF4RQlB0T4rrxJQbXS6kiFV6B7XTqUA== dependencies: - "@babel/helper-annotate-as-pure" "^7.27.1" - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-annotate-as-pure" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-transform-regenerator@^7.28.3": - version "7.28.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.28.4.tgz#9d3fa3bebb48ddd0091ce5729139cd99c67cea51" - integrity sha512-+ZEdQlBoRg9m2NnzvEeLgtvBMO4tkFBw5SQIUgLICgTrumLoU7lr+Oghi6km2PFj+dbUt2u1oby2w3BDO9YQnA== +"@babel/plugin-transform-regenerator@^7.29.7": + version "7.29.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.29.8.tgz#3a4a4dd7214af9d524f0503bb97c99af5f4abf26" + integrity sha512-0UpIXPtdDtMXfnV2OJAVMLpj3H/92vmkA6lpSRakmycJvj3VUy6Xs1dM8tXRugupykr5WB+LpiVl0J8LMVg2mg== dependencies: - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-transform-regexp-modifiers@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.27.1.tgz#df9ba5577c974e3f1449888b70b76169998a6d09" - integrity sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA== +"@babel/plugin-transform-regexp-modifiers@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.29.7.tgz#68311c0c10af2198212528863f8542843e424025" + integrity sha512-mB5Fs0VWrJ42ZCmc8114v60qetdaUVNkj9PmSZRmanCZM3S9hm0CFRLjRmYIsuXav14l2jvZ+4T8iiCGnhj3nQ== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.27.1" - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-create-regexp-features-plugin" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-transform-reserved-words@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.27.1.tgz#40fba4878ccbd1c56605a4479a3a891ac0274bb4" - integrity sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw== +"@babel/plugin-transform-reserved-words@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.29.7.tgz#a6feeb179b36a5f1fc6e3154c1eb727bdbe35876" + integrity sha512-5+YhdpVgmfSmwZyLMftfaiffLRMHjzIRHFHHLdibcSyJm2pasMrKHrO3Ptrt2DRshjvpgjEJJ1zVW14WPq/6QA== dependencies: - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-plugin-utils" "^7.29.7" "@babel/plugin-transform-runtime@^7.25.9": - version "7.28.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.28.3.tgz#f5990a1b2d2bde950ed493915e0719841c8d0eaa" - integrity sha512-Y6ab1kGqZ0u42Zv/4a7l0l72n9DKP/MKoKWaUSBylrhNZO2prYuqFOLbn5aW5SIFXwSH93yfjbgllL8lxuGKLg== + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.29.7.tgz#7c7fb6e2a46dce67e278b6cc84421c1d16da5695" + integrity sha512-xmAscdE/AsqRW7vutbPNoUmu/nF5SrLKPs7aoJgEjo35lLKA/Bc0i2rMv/hr1+Y0o1bQCiVtith3u2vdgRL39Q== dependencies: - "@babel/helper-module-imports" "^7.27.1" - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-module-imports" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" babel-plugin-polyfill-corejs2 "^0.4.14" babel-plugin-polyfill-corejs3 "^0.13.0" babel-plugin-polyfill-regenerator "^0.6.5" semver "^6.3.1" -"@babel/plugin-transform-shorthand-properties@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.27.1.tgz#532abdacdec87bfee1e0ef8e2fcdee543fe32b90" - integrity sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ== +"@babel/plugin-transform-shorthand-properties@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.29.7.tgz#25c0436b98f4bd9ca4b98e1fbd662743bbaab9bf" + integrity sha512-I+WYbGBAiCn7nA6xBrlgPH+MB7HWb4u8pv5S0Pv7OtwNvIFvCCb24YlttKEeUFVurfBCEaOTnuhlqsb7f0Z5Dg== dependencies: - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-transform-spread@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.27.1.tgz#1a264d5fc12750918f50e3fe3e24e437178abb08" - integrity sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q== +"@babel/plugin-transform-spread@^7.29.7": + version "7.29.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.29.8.tgz#c894cff38556a5dafeb412e13fc012b6df4b95a2" + integrity sha512-4S9ksMGVWUshvgK0mKfvZky7leuG5/uoFVwMpAomJ8bMoDJiNHRVmc1EglwW/CmGVSqqWpEbXm9FmbRit22qoA== dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - "@babel/helper-skip-transparent-expression-wrappers" "^7.27.1" + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.29.7" -"@babel/plugin-transform-sticky-regex@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.27.1.tgz#18984935d9d2296843a491d78a014939f7dcd280" - integrity sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g== +"@babel/plugin-transform-sticky-regex@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.29.7.tgz#a42c0fd1fa42f7e98e1e0c7757f72a1bbca3a015" + integrity sha512-BCHzNYJGe9l7EpwwDBN/ztlL2NYFFq8hp9ddjtUEM9f2O7S7kKV/lL6Fwo7IF7NSkYhPK2vO+86nIGltA90MsA== dependencies: - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-transform-template-literals@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.27.1.tgz#1a0eb35d8bb3e6efc06c9fd40eb0bcef548328b8" - integrity sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg== +"@babel/plugin-transform-template-literals@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.29.7.tgz#ada97d8e0832bca8edb315888aa654b1570f3835" + integrity sha512-NCSEJ4sLFU2gqAub45HYh4fus2yQ36rr6ei6vpU7NdoJqCpxvEG8E6eJpscGyXP3VHD2Ny+fSXr04k1hoUrFqA== dependencies: - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-transform-typeof-symbol@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.27.1.tgz#70e966bb492e03509cf37eafa6dcc3051f844369" - integrity sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw== +"@babel/plugin-transform-typeof-symbol@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.29.7.tgz#d848a4677c1ee3485ab017f4018f04597798911c" + integrity sha512-223mNGoTkBiTEWFoK+Q6Go3tueMRclO8vxxxxquNCYuNI4jWOofFKJRRDu6SDrB8Sgo1UEGW9T4GAQ8ZyRso1A== dependencies: - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-transform-typescript@^7.27.1": - version "7.28.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.28.0.tgz#796cbd249ab56c18168b49e3e1d341b72af04a6b" - integrity sha512-4AEiDEBPIZvLQaWlc9liCavE0xRM0dNca41WtBeM3jgFptfUOSG9z0uteLhq6+3rq+WB6jIvUwKDTpXEHPJ2Vg== +"@babel/plugin-transform-typescript@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.29.7.tgz#f0449c3df7037bbe232043476851c38f5e4a7615" + integrity sha512-jK52h8LaLc7JarhQV2ofeFMts4H7vnOXnqZNA6fYglBTZewRBE51KWt3BUltW1P+KoPsYkHoJeXePuz4zo2LMw== dependencies: - "@babel/helper-annotate-as-pure" "^7.27.3" - "@babel/helper-create-class-features-plugin" "^7.27.1" - "@babel/helper-plugin-utils" "^7.27.1" - "@babel/helper-skip-transparent-expression-wrappers" "^7.27.1" - "@babel/plugin-syntax-typescript" "^7.27.1" + "@babel/helper-annotate-as-pure" "^7.29.7" + "@babel/helper-create-class-features-plugin" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/helper-skip-transparent-expression-wrappers" "^7.29.7" + "@babel/plugin-syntax-typescript" "^7.29.7" -"@babel/plugin-transform-unicode-escapes@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.27.1.tgz#3e3143f8438aef842de28816ece58780190cf806" - integrity sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg== +"@babel/plugin-transform-unicode-escapes@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.29.7.tgz#1e99554b0cddfd650d649a9f2b996049893e5720" + integrity sha512-jCfXxSjf94lf4E0hKE0AByxF6F3/pVFqRdUUNkDJhsY0m1ZKjnN6ZYyMeHNpzflxb/0q5b7t3p+BE+SLF1WOtA== dependencies: - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-transform-unicode-property-regex@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.27.1.tgz#bdfe2d3170c78c5691a3c3be934c8c0087525956" - integrity sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q== +"@babel/plugin-transform-unicode-property-regex@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.29.7.tgz#44444afc73768c2190fac4d95f7716817b7f204a" + integrity sha512-OgZ+zoAJgZLUCunsTRQ5LAjOywDv5zzZ2/hQ5aMw1pGXyY2rtE8/chXYUmu3AlVHKpm10KEdG9aMwbI/K76ZGw== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.27.1" - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-create-regexp-features-plugin" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-transform-unicode-regex@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.27.1.tgz#25948f5c395db15f609028e370667ed8bae9af97" - integrity sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw== +"@babel/plugin-transform-unicode-regex@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.29.7.tgz#c3064b293ff7f1794b71f7650eec8db9896d3e59" + integrity sha512-7D/x/23/d/3VqZ0QA+LGbZMlGwZjztBygSWWWsfTPoQ1oQ6Q1P6Mr3d0kk42XabyUVw+fha3LqdRsFqeKqvCyA== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.27.1" - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-create-regexp-features-plugin" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" -"@babel/plugin-transform-unicode-sets-regex@^7.27.1": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.27.1.tgz#6ab706d10f801b5c72da8bb2548561fa04193cd1" - integrity sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw== +"@babel/plugin-transform-unicode-sets-regex@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.29.7.tgz#b03ac9f27326f6197e8e574add83bbf33fc34ecd" + integrity sha512-BLOhLht9DOJwIxlmp91wHvkXv1lguuHS3/FwUO8HL1H0u8s4hR1gASVFyilu9iGtcTRYqjTZmlsFFeQletntEg== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.27.1" - "@babel/helper-plugin-utils" "^7.27.1" + "@babel/helper-create-regexp-features-plugin" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" "@babel/preset-env@^7.20.2", "@babel/preset-env@^7.25.9": - version "7.28.3" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.28.3.tgz#2b18d9aff9e69643789057ae4b942b1654f88187" - integrity sha512-ROiDcM+GbYVPYBOeCR6uBXKkQpBExLl8k9HO1ygXEyds39j+vCCsjmj7S8GOniZQlEs81QlkdJZe76IpLSiqpg== - dependencies: - "@babel/compat-data" "^7.28.0" - "@babel/helper-compilation-targets" "^7.27.2" - "@babel/helper-plugin-utils" "^7.27.1" - "@babel/helper-validator-option" "^7.27.1" - "@babel/plugin-bugfix-firefox-class-in-computed-class-key" "^7.27.1" - "@babel/plugin-bugfix-safari-class-field-initializer-scope" "^7.27.1" - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.27.1" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.27.1" - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly" "^7.28.3" + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.29.7.tgz#5e2ab5e764b493fdefc99c43aeaa70a9533a37fd" + integrity sha512-GYzX36n1nsciIb0uyH0GHwxwtNwPQIcpxSeiVLDtG/B7jB5xXgchnmL1f/jCX5o+pwnaDBtO60ONSJhEBJfxYA== + dependencies: + "@babel/compat-data" "^7.29.7" + "@babel/helper-compilation-targets" "^7.29.7" + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/helper-validator-option" "^7.29.7" + "@babel/plugin-bugfix-firefox-class-in-computed-class-key" "^7.29.7" + "@babel/plugin-bugfix-safari-class-field-initializer-scope" "^7.29.7" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.29.7" + "@babel/plugin-bugfix-safari-rest-destructuring-rhs-array" "^7.29.7" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.29.7" + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly" "^7.29.7" "@babel/plugin-proposal-private-property-in-object" "7.21.0-placeholder-for-preset-env.2" - "@babel/plugin-syntax-import-assertions" "^7.27.1" - "@babel/plugin-syntax-import-attributes" "^7.27.1" + "@babel/plugin-syntax-import-assertions" "^7.29.7" + "@babel/plugin-syntax-import-attributes" "^7.29.7" "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6" - "@babel/plugin-transform-arrow-functions" "^7.27.1" - "@babel/plugin-transform-async-generator-functions" "^7.28.0" - "@babel/plugin-transform-async-to-generator" "^7.27.1" - "@babel/plugin-transform-block-scoped-functions" "^7.27.1" - "@babel/plugin-transform-block-scoping" "^7.28.0" - "@babel/plugin-transform-class-properties" "^7.27.1" - "@babel/plugin-transform-class-static-block" "^7.28.3" - "@babel/plugin-transform-classes" "^7.28.3" - "@babel/plugin-transform-computed-properties" "^7.27.1" - "@babel/plugin-transform-destructuring" "^7.28.0" - "@babel/plugin-transform-dotall-regex" "^7.27.1" - "@babel/plugin-transform-duplicate-keys" "^7.27.1" - "@babel/plugin-transform-duplicate-named-capturing-groups-regex" "^7.27.1" - "@babel/plugin-transform-dynamic-import" "^7.27.1" - "@babel/plugin-transform-explicit-resource-management" "^7.28.0" - "@babel/plugin-transform-exponentiation-operator" "^7.27.1" - "@babel/plugin-transform-export-namespace-from" "^7.27.1" - "@babel/plugin-transform-for-of" "^7.27.1" - "@babel/plugin-transform-function-name" "^7.27.1" - "@babel/plugin-transform-json-strings" "^7.27.1" - "@babel/plugin-transform-literals" "^7.27.1" - "@babel/plugin-transform-logical-assignment-operators" "^7.27.1" - "@babel/plugin-transform-member-expression-literals" "^7.27.1" - "@babel/plugin-transform-modules-amd" "^7.27.1" - "@babel/plugin-transform-modules-commonjs" "^7.27.1" - "@babel/plugin-transform-modules-systemjs" "^7.27.1" - "@babel/plugin-transform-modules-umd" "^7.27.1" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.27.1" - "@babel/plugin-transform-new-target" "^7.27.1" - "@babel/plugin-transform-nullish-coalescing-operator" "^7.27.1" - "@babel/plugin-transform-numeric-separator" "^7.27.1" - "@babel/plugin-transform-object-rest-spread" "^7.28.0" - "@babel/plugin-transform-object-super" "^7.27.1" - "@babel/plugin-transform-optional-catch-binding" "^7.27.1" - "@babel/plugin-transform-optional-chaining" "^7.27.1" - "@babel/plugin-transform-parameters" "^7.27.7" - "@babel/plugin-transform-private-methods" "^7.27.1" - "@babel/plugin-transform-private-property-in-object" "^7.27.1" - "@babel/plugin-transform-property-literals" "^7.27.1" - "@babel/plugin-transform-regenerator" "^7.28.3" - "@babel/plugin-transform-regexp-modifiers" "^7.27.1" - "@babel/plugin-transform-reserved-words" "^7.27.1" - "@babel/plugin-transform-shorthand-properties" "^7.27.1" - "@babel/plugin-transform-spread" "^7.27.1" - "@babel/plugin-transform-sticky-regex" "^7.27.1" - "@babel/plugin-transform-template-literals" "^7.27.1" - "@babel/plugin-transform-typeof-symbol" "^7.27.1" - "@babel/plugin-transform-unicode-escapes" "^7.27.1" - "@babel/plugin-transform-unicode-property-regex" "^7.27.1" - "@babel/plugin-transform-unicode-regex" "^7.27.1" - "@babel/plugin-transform-unicode-sets-regex" "^7.27.1" + "@babel/plugin-transform-arrow-functions" "^7.29.7" + "@babel/plugin-transform-async-generator-functions" "^7.29.7" + "@babel/plugin-transform-async-to-generator" "^7.29.7" + "@babel/plugin-transform-block-scoped-functions" "^7.29.7" + "@babel/plugin-transform-block-scoping" "^7.29.7" + "@babel/plugin-transform-class-properties" "^7.29.7" + "@babel/plugin-transform-class-static-block" "^7.29.7" + "@babel/plugin-transform-classes" "^7.29.7" + "@babel/plugin-transform-computed-properties" "^7.29.7" + "@babel/plugin-transform-destructuring" "^7.29.7" + "@babel/plugin-transform-dotall-regex" "^7.29.7" + "@babel/plugin-transform-duplicate-keys" "^7.29.7" + "@babel/plugin-transform-duplicate-named-capturing-groups-regex" "^7.29.7" + "@babel/plugin-transform-dynamic-import" "^7.29.7" + "@babel/plugin-transform-explicit-resource-management" "^7.29.7" + "@babel/plugin-transform-exponentiation-operator" "^7.29.7" + "@babel/plugin-transform-export-namespace-from" "^7.29.7" + "@babel/plugin-transform-for-of" "^7.29.7" + "@babel/plugin-transform-function-name" "^7.29.7" + "@babel/plugin-transform-json-strings" "^7.29.7" + "@babel/plugin-transform-literals" "^7.29.7" + "@babel/plugin-transform-logical-assignment-operators" "^7.29.7" + "@babel/plugin-transform-member-expression-literals" "^7.29.7" + "@babel/plugin-transform-modules-amd" "^7.29.7" + "@babel/plugin-transform-modules-commonjs" "^7.29.7" + "@babel/plugin-transform-modules-systemjs" "^7.29.7" + "@babel/plugin-transform-modules-umd" "^7.29.7" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.29.7" + "@babel/plugin-transform-new-target" "^7.29.7" + "@babel/plugin-transform-nullish-coalescing-operator" "^7.29.7" + "@babel/plugin-transform-numeric-separator" "^7.29.7" + "@babel/plugin-transform-object-rest-spread" "^7.29.7" + "@babel/plugin-transform-object-super" "^7.29.7" + "@babel/plugin-transform-optional-catch-binding" "^7.29.7" + "@babel/plugin-transform-optional-chaining" "^7.29.7" + "@babel/plugin-transform-parameters" "^7.29.7" + "@babel/plugin-transform-private-methods" "^7.29.7" + "@babel/plugin-transform-private-property-in-object" "^7.29.7" + "@babel/plugin-transform-property-literals" "^7.29.7" + "@babel/plugin-transform-regenerator" "^7.29.7" + "@babel/plugin-transform-regexp-modifiers" "^7.29.7" + "@babel/plugin-transform-reserved-words" "^7.29.7" + "@babel/plugin-transform-shorthand-properties" "^7.29.7" + "@babel/plugin-transform-spread" "^7.29.7" + "@babel/plugin-transform-sticky-regex" "^7.29.7" + "@babel/plugin-transform-template-literals" "^7.29.7" + "@babel/plugin-transform-typeof-symbol" "^7.29.7" + "@babel/plugin-transform-unicode-escapes" "^7.29.7" + "@babel/plugin-transform-unicode-property-regex" "^7.29.7" + "@babel/plugin-transform-unicode-regex" "^7.29.7" + "@babel/plugin-transform-unicode-sets-regex" "^7.29.7" "@babel/preset-modules" "0.1.6-no-external-plugins" - babel-plugin-polyfill-corejs2 "^0.4.14" - babel-plugin-polyfill-corejs3 "^0.13.0" - babel-plugin-polyfill-regenerator "^0.6.5" - core-js-compat "^3.43.0" + babel-plugin-polyfill-corejs2 "^0.4.15" + babel-plugin-polyfill-corejs3 "^0.14.0" + babel-plugin-polyfill-regenerator "^0.6.6" + core-js-compat "^3.48.0" semver "^6.3.1" "@babel/preset-modules@0.1.6-no-external-plugins": @@ -997,69 +1037,99 @@ esutils "^2.0.2" "@babel/preset-react@^7.18.6", "@babel/preset-react@^7.25.9": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.27.1.tgz#86ea0a5ca3984663f744be2fd26cb6747c3fd0ec" - integrity sha512-oJHWh2gLhU9dW9HHr42q0cI0/iHHXTLGe39qvpAZZzagHy0MzYLCnCVV0symeRvzmjHyVU7mw2K06E6u/JwbhA== + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.29.7.tgz#2ed18366e38c2081bbf1760dc01e88fa5674eb17" + integrity sha512-C+PV1TFUPTmBQGoPBL8j2QmLpZ117YTCwxIZeJOM96GbYMFSc7/pOXU5lVykwnZxyTqQxRsvoRk6f2FktZgGHA== dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - "@babel/helper-validator-option" "^7.27.1" - "@babel/plugin-transform-react-display-name" "^7.27.1" - "@babel/plugin-transform-react-jsx" "^7.27.1" - "@babel/plugin-transform-react-jsx-development" "^7.27.1" - "@babel/plugin-transform-react-pure-annotations" "^7.27.1" + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/helper-validator-option" "^7.29.7" + "@babel/plugin-transform-react-display-name" "^7.29.7" + "@babel/plugin-transform-react-jsx" "^7.29.7" + "@babel/plugin-transform-react-jsx-development" "^7.29.7" + "@babel/plugin-transform-react-pure-annotations" "^7.29.7" "@babel/preset-typescript@^7.21.0", "@babel/preset-typescript@^7.25.9": - version "7.27.1" - resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.27.1.tgz#190742a6428d282306648a55b0529b561484f912" - integrity sha512-l7WfQfX0WK4M0v2RudjuQK4u99BS6yLHYEmdtVPP7lKV013zr9DygFuWNlnbvQ9LR+LS0Egz/XAvGx5U9MX0fQ== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - "@babel/helper-validator-option" "^7.27.1" - "@babel/plugin-syntax-jsx" "^7.27.1" - "@babel/plugin-transform-modules-commonjs" "^7.27.1" - "@babel/plugin-transform-typescript" "^7.27.1" - -"@babel/runtime-corejs3@^7.25.9": - version "7.28.4" - resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.28.4.tgz#c25be39c7997ce2f130d70b9baecb8ed94df93fa" - integrity sha512-h7iEYiW4HebClDEhtvFObtPmIvrd1SSfpI9EhOeKk4CtIK/ngBWFpuhCzhdmRKtg71ylcue+9I6dv54XYO1epQ== - dependencies: - core-js-pure "^3.43.0" - -"@babel/runtime@^7.1.2", "@babel/runtime@^7.10.3", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.18.3", "@babel/runtime@^7.25.9", "@babel/runtime@^7.28.3", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.7": - version "7.28.4" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.28.4.tgz#a70226016fabe25c5783b2f22d3e1c9bc5ca3326" - integrity sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ== - -"@babel/template@^7.27.1", "@babel/template@^7.27.2": - version "7.27.2" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.27.2.tgz#fa78ceed3c4e7b63ebf6cb39e5852fca45f6809d" - integrity sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw== - dependencies: - "@babel/code-frame" "^7.27.1" - "@babel/parser" "^7.27.2" - "@babel/types" "^7.27.1" - -"@babel/traverse@^7.25.9", "@babel/traverse@^7.27.1", "@babel/traverse@^7.28.0", "@babel/traverse@^7.28.3", "@babel/traverse@^7.28.4": - version "7.28.4" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.28.4.tgz#8d456101b96ab175d487249f60680221692b958b" - integrity sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ== - dependencies: - "@babel/code-frame" "^7.27.1" - "@babel/generator" "^7.28.3" - "@babel/helper-globals" "^7.28.0" - "@babel/parser" "^7.28.4" - "@babel/template" "^7.27.2" - "@babel/types" "^7.28.4" + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.29.7.tgz#de9be1f47b785c979ec7b3a71f4cd8bae5267b62" + integrity sha512-/Foi8vKY2EVbed/1eZx0gJEEwHAIxogrySI7rULcRIvhZzbvoE/b5qG5Ghc0WKAFKOHA9SD1x7RsFlOYdutIiQ== + dependencies: + "@babel/helper-plugin-utils" "^7.29.7" + "@babel/helper-validator-option" "^7.29.7" + "@babel/plugin-syntax-jsx" "^7.29.7" + "@babel/plugin-transform-modules-commonjs" "^7.29.7" + "@babel/plugin-transform-typescript" "^7.29.7" + +"@babel/runtime@^7.1.2", "@babel/runtime@^7.10.3", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.18.3", "@babel/runtime@^7.25.9", "@babel/runtime@^7.28.6", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.29.7.tgz#12022450c45a4da6d8d8287b18a4ff2ddb23f768" + integrity sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw== + +"@babel/template@^7.29.7": + version "7.29.7" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.29.7.tgz#4d9d4004f645cdd304de958c725162784ecac700" + integrity sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg== + dependencies: + "@babel/code-frame" "^7.29.7" + "@babel/parser" "^7.29.7" + "@babel/types" "^7.29.7" + +"@babel/traverse@^7.25.9", "@babel/traverse@^7.29.7", "@babel/traverse@^7.29.8": + version "7.29.8" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.29.8.tgz#4111014cdc71a0f95d9471907590baa0b8a6b28a" + integrity sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg== + dependencies: + "@babel/code-frame" "^7.29.7" + "@babel/generator" "^7.29.8" + "@babel/helper-globals" "^7.29.7" + "@babel/parser" "^7.29.8" + "@babel/template" "^7.29.7" + "@babel/types" "^7.29.8" debug "^4.3.1" -"@babel/types@^7.21.3", "@babel/types@^7.27.1", "@babel/types@^7.27.3", "@babel/types@^7.28.2", "@babel/types@^7.28.4", "@babel/types@^7.4.4": - version "7.28.4" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.28.4.tgz#0a4e618f4c60a7cd6c11cb2d48060e4dbe38ac3a" - integrity sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q== +"@babel/types@^7.21.3", "@babel/types@^7.29.7", "@babel/types@^7.29.8", "@babel/types@^7.4.4": + version "7.29.8" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.29.8.tgz#1229eef31d85156d70fa3f4cd859376d0eaf6863" + integrity sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg== + dependencies: + "@babel/helper-string-parser" "^7.29.7" + "@babel/helper-validator-identifier" "^7.29.7" + +"@braintree/sanitize-url@^7.1.2": + version "7.1.2" + resolved "https://registry.yarnpkg.com/@braintree/sanitize-url/-/sanitize-url-7.1.2.tgz#ca2035b0fefe956a8676ff0c69af73e605fcd81f" + integrity sha512-jigsZK+sMF/cuiB7sERuo9V7N9jx+dhmHHnQyDSVdpZwVutaBu7WvNYqMDLSgFgfB30n452TP3vjDAvFC973mA== + +"@chevrotain/cst-dts-gen@11.1.2": + version "11.1.2" + resolved "https://registry.yarnpkg.com/@chevrotain/cst-dts-gen/-/cst-dts-gen-11.1.2.tgz#501ea6177fa21cc57264c792ef5cc3d0bb9410fd" + integrity sha512-XTsjvDVB5nDZBQB8o0o/0ozNelQtn2KrUVteIHSlPd2VAV2utEb6JzyCJaJ8tGxACR4RiBNWy5uYUHX2eji88Q== + dependencies: + "@chevrotain/gast" "11.1.2" + "@chevrotain/types" "11.1.2" + lodash-es "4.17.23" + +"@chevrotain/gast@11.1.2": + version "11.1.2" + resolved "https://registry.yarnpkg.com/@chevrotain/gast/-/gast-11.1.2.tgz#213393f2b5842e8bf13369bdc042c7fd18201af2" + integrity sha512-Z9zfXR5jNZb1Hlsd/p+4XWeUFugrHirq36bKzPWDSIacV+GPSVXdk+ahVWZTwjhNwofAWg/sZg58fyucKSQx5g== dependencies: - "@babel/helper-string-parser" "^7.27.1" - "@babel/helper-validator-identifier" "^7.27.1" + "@chevrotain/types" "11.1.2" + lodash-es "4.17.23" + +"@chevrotain/regexp-to-ast@11.1.2": + version "11.1.2" + resolved "https://registry.yarnpkg.com/@chevrotain/regexp-to-ast/-/regexp-to-ast-11.1.2.tgz#6aeb0b3fd5e3f220b063b3d856fbbaed582e4cfa" + integrity sha512-nMU3Uj8naWer7xpZTYJdxbAs6RIv/dxYzkYU8GSwgUtcAAlzjcPfX1w+RKRcYG8POlzMeayOQ/znfwxEGo5ulw== + +"@chevrotain/types@11.1.2", "@chevrotain/types@~11.1.2": + version "11.1.2" + resolved "https://registry.yarnpkg.com/@chevrotain/types/-/types-11.1.2.tgz#e83a1a2704f0c5e49e7592b214031a0f4a34d7e5" + integrity sha512-U+HFai5+zmJCkK86QsaJtoITlboZHBqrVketcO2ROv865xfCMSFpELQoz1GkX5GzME8pTa+3kbKrZHQtI0gdbw== + +"@chevrotain/utils@11.1.2": + version "11.1.2" + resolved "https://registry.yarnpkg.com/@chevrotain/utils/-/utils-11.1.2.tgz#a0b13637acc0a2933d8a2edeba4bf1da789c565d" + integrity sha512-4mudFAQ6H+MqBTfqLmU7G1ZwRzCLfJEooL/fsF6rCX5eePMbGhoy5n4g+G4vlh2muDcsCTJtL+uKbOzWxs5LHA== "@colors/colors@1.5.0": version "1.5.0" @@ -1104,15 +1174,15 @@ resolved "https://registry.yarnpkg.com/@csstools/media-query-list-parser/-/media-query-list-parser-4.0.3.tgz#7aec77bcb89c2da80ef207e73f474ef9e1b3cdf1" integrity sha512-HAYH7d3TLRHDOUQK4mZKf9k9Ph/m8Akstg66ywKR4SFAigjs3yBiUeZtFxywiTm5moZMAp/5W/ZuFnNXXYLuuQ== -"@csstools/postcss-alpha-function@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@csstools/postcss-alpha-function/-/postcss-alpha-function-1.0.0.tgz#8764fbbf25a5f1e106fb623ae632e01a220a6fc2" - integrity sha512-r2L8KNg5Wriq5n8IUQcjzy2Rh37J5YjzP9iOyHZL5fxdWYHB08vqykHQa4wAzN/tXwDuCHnhQDGCtxfS76xn7g== +"@csstools/postcss-alpha-function@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@csstools/postcss-alpha-function/-/postcss-alpha-function-1.0.1.tgz#7989605711de7831bc7cd75b94c9b5bac9c3728e" + integrity sha512-isfLLwksH3yHkFXfCI2Gcaqg7wGGHZZwunoJzEZk0yKYIokgre6hYVFibKL3SYAoR1kBXova8LB+JoO5vZzi9w== dependencies: "@csstools/css-color-parser" "^3.1.0" "@csstools/css-parser-algorithms" "^3.0.5" "@csstools/css-tokenizer" "^3.0.4" - "@csstools/postcss-progressive-custom-properties" "^4.2.0" + "@csstools/postcss-progressive-custom-properties" "^4.2.1" "@csstools/utilities" "^2.0.0" "@csstools/postcss-cascade-layers@^5.0.2": @@ -1123,58 +1193,69 @@ "@csstools/selector-specificity" "^5.0.0" postcss-selector-parser "^7.0.0" -"@csstools/postcss-color-function-display-p3-linear@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@csstools/postcss-color-function-display-p3-linear/-/postcss-color-function-display-p3-linear-1.0.0.tgz#27395b62a5d9a108eefcc0eb463247a15f4269a1" - integrity sha512-7q+OuUqfowRrP84m/Jl0wv3pfCQyUTCW5MxDIux+/yty5IkUUHOTigCjrC0Fjy3OT0ncGLudHbfLWmP7E1arNA== +"@csstools/postcss-color-function-display-p3-linear@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@csstools/postcss-color-function-display-p3-linear/-/postcss-color-function-display-p3-linear-1.0.1.tgz#3017ff5e1f65307d6083e58e93d76724fb1ebf9f" + integrity sha512-E5qusdzhlmO1TztYzDIi8XPdPoYOjoTY6HBYBCYSj+Gn4gQRBlvjgPQXzfzuPQqt8EhkC/SzPKObg4Mbn8/xMg== dependencies: "@csstools/css-color-parser" "^3.1.0" "@csstools/css-parser-algorithms" "^3.0.5" "@csstools/css-tokenizer" "^3.0.4" - "@csstools/postcss-progressive-custom-properties" "^4.2.0" + "@csstools/postcss-progressive-custom-properties" "^4.2.1" "@csstools/utilities" "^2.0.0" -"@csstools/postcss-color-function@^4.0.11": - version "4.0.11" - resolved "https://registry.yarnpkg.com/@csstools/postcss-color-function/-/postcss-color-function-4.0.11.tgz#03c34a51dc00943a6674294fb1163e7af9e87ffd" - integrity sha512-AtH22zLHTLm64HLdpv5EedT/zmYTm1MtdQbQhRZXxEB6iYtS6SrS1jLX3TcmUWMFzpumK/OVylCm3HcLms4slw== +"@csstools/postcss-color-function@^4.0.12": + version "4.0.12" + resolved "https://registry.yarnpkg.com/@csstools/postcss-color-function/-/postcss-color-function-4.0.12.tgz#a7c85a98c77b522a194a1bbb00dd207f40c7a771" + integrity sha512-yx3cljQKRaSBc2hfh8rMZFZzChaFgwmO2JfFgFr1vMcF3C/uyy5I4RFIBOIWGq1D+XbKCG789CGkG6zzkLpagA== dependencies: "@csstools/css-color-parser" "^3.1.0" "@csstools/css-parser-algorithms" "^3.0.5" "@csstools/css-tokenizer" "^3.0.4" - "@csstools/postcss-progressive-custom-properties" "^4.2.0" + "@csstools/postcss-progressive-custom-properties" "^4.2.1" "@csstools/utilities" "^2.0.0" -"@csstools/postcss-color-mix-function@^3.0.11": - version "3.0.11" - resolved "https://registry.yarnpkg.com/@csstools/postcss-color-mix-function/-/postcss-color-mix-function-3.0.11.tgz#6db0a1c749fabaf2bf978b37044700d1c1b09fc2" - integrity sha512-cQpXBelpTx0YhScZM5Ve0jDCA4RzwFc7oNafzZOGgCHt/GQVYiU8Vevz9QJcwy/W0Pyi/BneY+KMjz23lI9r+Q== +"@csstools/postcss-color-mix-function@^3.0.12": + version "3.0.12" + resolved "https://registry.yarnpkg.com/@csstools/postcss-color-mix-function/-/postcss-color-mix-function-3.0.12.tgz#2f1ee9f8208077af069545c9bd79bb9733382c2a" + integrity sha512-4STERZfCP5Jcs13P1U5pTvI9SkgLgfMUMhdXW8IlJWkzOOOqhZIjcNhWtNJZes2nkBDsIKJ0CJtFtuaZ00moag== dependencies: "@csstools/css-color-parser" "^3.1.0" "@csstools/css-parser-algorithms" "^3.0.5" "@csstools/css-tokenizer" "^3.0.4" - "@csstools/postcss-progressive-custom-properties" "^4.2.0" + "@csstools/postcss-progressive-custom-properties" "^4.2.1" "@csstools/utilities" "^2.0.0" -"@csstools/postcss-color-mix-variadic-function-arguments@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@csstools/postcss-color-mix-variadic-function-arguments/-/postcss-color-mix-variadic-function-arguments-1.0.1.tgz#2dd9d66ded0d41cd7b2c13a1188f03e894c17d7e" - integrity sha512-c7hyBtbF+jlHIcUGVdWY06bHICgguV9ypfcELU3eU3W/9fiz2dxM8PqxQk2ndXYTzLnwPvNNqu1yCmQ++N6Dcg== +"@csstools/postcss-color-mix-variadic-function-arguments@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@csstools/postcss-color-mix-variadic-function-arguments/-/postcss-color-mix-variadic-function-arguments-1.0.2.tgz#b4012b62a4eaa24d694172bb7137f9d2319cb8f2" + integrity sha512-rM67Gp9lRAkTo+X31DUqMEq+iK+EFqsidfecmhrteErxJZb6tUoJBVQca1Vn1GpDql1s1rD1pKcuYzMsg7Z1KQ== dependencies: "@csstools/css-color-parser" "^3.1.0" "@csstools/css-parser-algorithms" "^3.0.5" "@csstools/css-tokenizer" "^3.0.4" - "@csstools/postcss-progressive-custom-properties" "^4.2.0" + "@csstools/postcss-progressive-custom-properties" "^4.2.1" "@csstools/utilities" "^2.0.0" -"@csstools/postcss-content-alt-text@^2.0.7": - version "2.0.7" - resolved "https://registry.yarnpkg.com/@csstools/postcss-content-alt-text/-/postcss-content-alt-text-2.0.7.tgz#ac0a263e8acb0be99cdcfc0b1792c62141825747" - integrity sha512-cq/zWaEkpcg3RttJ5+GdNwk26NwxY5KgqgtNL777Fdd28AVGHxuBvqmK4Jq4oKhW1NX4M2LbgYAVVN0NZ+/XYQ== +"@csstools/postcss-content-alt-text@^2.0.8": + version "2.0.8" + resolved "https://registry.yarnpkg.com/@csstools/postcss-content-alt-text/-/postcss-content-alt-text-2.0.8.tgz#1d52da1762893c32999ff76839e48d6ec7c7a4cb" + integrity sha512-9SfEW9QCxEpTlNMnpSqFaHyzsiRpZ5J5+KqCu1u5/eEJAWsMhzT40qf0FIbeeglEvrGRMdDzAxMIz3wqoGSb+Q== + dependencies: + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" + "@csstools/postcss-progressive-custom-properties" "^4.2.1" + "@csstools/utilities" "^2.0.0" + +"@csstools/postcss-contrast-color-function@^2.0.12": + version "2.0.12" + resolved "https://registry.yarnpkg.com/@csstools/postcss-contrast-color-function/-/postcss-contrast-color-function-2.0.12.tgz#ca46986d095c60f208d9e3f24704d199c9172637" + integrity sha512-YbwWckjK3qwKjeYz/CijgcS7WDUCtKTd8ShLztm3/i5dhh4NaqzsbYnhm4bjrpFpnLZ31jVcbK8YL77z3GBPzA== dependencies: + "@csstools/css-color-parser" "^3.1.0" "@csstools/css-parser-algorithms" "^3.0.5" "@csstools/css-tokenizer" "^3.0.4" - "@csstools/postcss-progressive-custom-properties" "^4.2.0" + "@csstools/postcss-progressive-custom-properties" "^4.2.1" "@csstools/utilities" "^2.0.0" "@csstools/postcss-exponential-functions@^2.0.9": @@ -1203,34 +1284,34 @@ "@csstools/css-parser-algorithms" "^3.0.5" "@csstools/css-tokenizer" "^3.0.4" -"@csstools/postcss-gradients-interpolation-method@^5.0.11": - version "5.0.11" - resolved "https://registry.yarnpkg.com/@csstools/postcss-gradients-interpolation-method/-/postcss-gradients-interpolation-method-5.0.11.tgz#f1c5c431a44ed9655cb408aea8666ed2c5250490" - integrity sha512-8M3mcNTL3cGIJXDnvrJ2oWEcKi3zyw7NeYheFKePUlBmLYm1gkw9Rr/BA7lFONrOPeQA3yeMPldrrws6lqHrug== +"@csstools/postcss-gradients-interpolation-method@^5.0.12": + version "5.0.12" + resolved "https://registry.yarnpkg.com/@csstools/postcss-gradients-interpolation-method/-/postcss-gradients-interpolation-method-5.0.12.tgz#0955cce4d97203b861bf66742bbec611b2f3661c" + integrity sha512-jugzjwkUY0wtNrZlFeyXzimUL3hN4xMvoPnIXxoZqxDvjZRiSh+itgHcVUWzJ2VwD/VAMEgCLvtaJHX+4Vj3Ow== dependencies: "@csstools/css-color-parser" "^3.1.0" "@csstools/css-parser-algorithms" "^3.0.5" "@csstools/css-tokenizer" "^3.0.4" - "@csstools/postcss-progressive-custom-properties" "^4.2.0" + "@csstools/postcss-progressive-custom-properties" "^4.2.1" "@csstools/utilities" "^2.0.0" -"@csstools/postcss-hwb-function@^4.0.11": - version "4.0.11" - resolved "https://registry.yarnpkg.com/@csstools/postcss-hwb-function/-/postcss-hwb-function-4.0.11.tgz#4bb173f1c8c2361bf46a842a948ee687471ae4ea" - integrity sha512-9meZbsVWTZkWsSBazQips3cHUOT29a/UAwFz0AMEXukvpIGGDR9+GMl3nIckWO5sPImsadu4F5Zy+zjt8QgCdA== +"@csstools/postcss-hwb-function@^4.0.12": + version "4.0.12" + resolved "https://registry.yarnpkg.com/@csstools/postcss-hwb-function/-/postcss-hwb-function-4.0.12.tgz#07f7ecb08c50e094673bd20eaf7757db0162beee" + integrity sha512-mL/+88Z53KrE4JdePYFJAQWFrcADEqsLprExCM04GDNgHIztwFzj0Mbhd/yxMBngq0NIlz58VVxjt5abNs1VhA== dependencies: "@csstools/css-color-parser" "^3.1.0" "@csstools/css-parser-algorithms" "^3.0.5" "@csstools/css-tokenizer" "^3.0.4" - "@csstools/postcss-progressive-custom-properties" "^4.2.0" + "@csstools/postcss-progressive-custom-properties" "^4.2.1" "@csstools/utilities" "^2.0.0" -"@csstools/postcss-ic-unit@^4.0.3": - version "4.0.3" - resolved "https://registry.yarnpkg.com/@csstools/postcss-ic-unit/-/postcss-ic-unit-4.0.3.tgz#ba0375e9d346e6e5a42dc8c2cb1133b2262f9ffa" - integrity sha512-RtYYm2qUIu9vAaHB0cC8rQGlOCQAUgEc2tMr7ewlGXYipBQKjoWmyVArqsk7SEr8N3tErq6P6UOJT3amaVof5Q== +"@csstools/postcss-ic-unit@^4.0.4": + version "4.0.4" + resolved "https://registry.yarnpkg.com/@csstools/postcss-ic-unit/-/postcss-ic-unit-4.0.4.tgz#2ee2da0690db7edfbc469279711b9e69495659d2" + integrity sha512-yQ4VmossuOAql65sCPppVO1yfb7hDscf4GseF0VCA/DTDaBc0Wtf8MTqVPfjGYlT5+2buokG0Gp7y0atYZpwjg== dependencies: - "@csstools/postcss-progressive-custom-properties" "^4.2.0" + "@csstools/postcss-progressive-custom-properties" "^4.2.1" "@csstools/utilities" "^2.0.0" postcss-value-parser "^4.2.0" @@ -1247,14 +1328,14 @@ "@csstools/selector-specificity" "^5.0.0" postcss-selector-parser "^7.0.0" -"@csstools/postcss-light-dark-function@^2.0.10": - version "2.0.10" - resolved "https://registry.yarnpkg.com/@csstools/postcss-light-dark-function/-/postcss-light-dark-function-2.0.10.tgz#b606f13d1f81efd297763c6ad1ac515c3ca4165b" - integrity sha512-g7Lwb294lSoNnyrwcqoooh9fTAp47rRNo+ILg7SLRSMU3K9ePIwRt566sNx+pehiCelv4E1ICaU1EwLQuyF2qw== +"@csstools/postcss-light-dark-function@^2.0.11": + version "2.0.11" + resolved "https://registry.yarnpkg.com/@csstools/postcss-light-dark-function/-/postcss-light-dark-function-2.0.11.tgz#0df448aab9a33cb9a085264ff1f396fb80c4437d" + integrity sha512-fNJcKXJdPM3Lyrbmgw2OBbaioU7yuKZtiXClf4sGdQttitijYlZMD5K7HrC/eF83VRWRrYq6OZ0Lx92leV2LFA== dependencies: "@csstools/css-parser-algorithms" "^3.0.5" "@csstools/css-tokenizer" "^3.0.4" - "@csstools/postcss-progressive-custom-properties" "^4.2.0" + "@csstools/postcss-progressive-custom-properties" "^4.2.1" "@csstools/utilities" "^2.0.0" "@csstools/postcss-logical-float-and-clear@^3.0.0": @@ -1314,31 +1395,44 @@ "@csstools/utilities" "^2.0.0" postcss-value-parser "^4.2.0" -"@csstools/postcss-normalize-display-values@^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.0.tgz#ecdde2daf4e192e5da0c6fd933b6d8aff32f2a36" - integrity sha512-HlEoG0IDRoHXzXnkV4in47dzsxdsjdz6+j7MLjaACABX2NfvjFS6XVAnpaDyGesz9gK2SC7MbNwdCHusObKJ9Q== +"@csstools/postcss-normalize-display-values@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.1.tgz#3738ecadb38cd6521c9565635d61aa4bf5457d27" + integrity sha512-TQUGBuRvxdc7TgNSTevYqrL8oItxiwPDixk20qCB5me/W8uF7BPbhRrAvFuhEoywQp/woRsUZ6SJ+sU5idZAIA== dependencies: postcss-value-parser "^4.2.0" -"@csstools/postcss-oklab-function@^4.0.11": - version "4.0.11" - resolved "https://registry.yarnpkg.com/@csstools/postcss-oklab-function/-/postcss-oklab-function-4.0.11.tgz#d69242a9b027dda731bd79db7293bc938bb6df97" - integrity sha512-9f03ZGxZ2VmSCrM4SDXlAYP+Xpu4VFzemfQUQFL9OYxAbpvDy0FjDipZ0i8So1pgs8VIbQI0bNjFWgfdpGw8ig== +"@csstools/postcss-oklab-function@^4.0.12": + version "4.0.12" + resolved "https://registry.yarnpkg.com/@csstools/postcss-oklab-function/-/postcss-oklab-function-4.0.12.tgz#416640ef10227eea1375b47b72d141495950971d" + integrity sha512-HhlSmnE1NKBhXsTnNGjxvhryKtO7tJd1w42DKOGFD6jSHtYOrsJTQDKPMwvOfrzUAk8t7GcpIfRyM7ssqHpFjg== dependencies: "@csstools/css-color-parser" "^3.1.0" "@csstools/css-parser-algorithms" "^3.0.5" "@csstools/css-tokenizer" "^3.0.4" - "@csstools/postcss-progressive-custom-properties" "^4.2.0" + "@csstools/postcss-progressive-custom-properties" "^4.2.1" "@csstools/utilities" "^2.0.0" -"@csstools/postcss-progressive-custom-properties@^4.2.0": - version "4.2.0" - resolved "https://registry.yarnpkg.com/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-4.2.0.tgz#7f15349c2cd108478d28e1503c660d4037925030" - integrity sha512-fWCXRasX17N1NCPTCuwC3FJDV+Wc031f16cFuuMEfIsYJ1q5ABCa59W0C6VeMGqjNv6ldf37vvwXXAeaZjD9PA== +"@csstools/postcss-position-area-property@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@csstools/postcss-position-area-property/-/postcss-position-area-property-1.0.0.tgz#41f0cbc737a81a42890d5ec035fa26a45f4f4ad4" + integrity sha512-fUP6KR8qV2NuUZV3Cw8itx0Ep90aRjAZxAEzC3vrl6yjFv+pFsQbR18UuQctEKmA72K9O27CoYiKEgXxkqjg8Q== + +"@csstools/postcss-progressive-custom-properties@^4.2.1": + version "4.2.1" + resolved "https://registry.yarnpkg.com/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-4.2.1.tgz#c39780b9ff0d554efb842b6bd75276aa6f1705db" + integrity sha512-uPiiXf7IEKtUQXsxu6uWtOlRMXd2QWWy5fhxHDnPdXKCQckPP3E34ZgDoZ62r2iT+UOgWsSbM4NvHE5m3mAEdw== dependencies: postcss-value-parser "^4.2.0" +"@csstools/postcss-property-rule-prelude-list@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@csstools/postcss-property-rule-prelude-list/-/postcss-property-rule-prelude-list-1.0.0.tgz#700b7aa41228c02281bda074ae778f36a09da188" + integrity sha512-IxuQjUXq19fobgmSSvUDO7fVwijDJaZMvWQugxfEUxmjBeDCVaDuMpsZ31MsTm5xbnhA+ElDi0+rQ7sQQGisFA== + dependencies: + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" + "@csstools/postcss-random-function@^2.0.1": version "2.0.1" resolved "https://registry.yarnpkg.com/@csstools/postcss-random-function/-/postcss-random-function-2.0.1.tgz#3191f32fe72936e361dadf7dbfb55a0209e2691e" @@ -1348,15 +1442,15 @@ "@csstools/css-parser-algorithms" "^3.0.5" "@csstools/css-tokenizer" "^3.0.4" -"@csstools/postcss-relative-color-syntax@^3.0.11": - version "3.0.11" - resolved "https://registry.yarnpkg.com/@csstools/postcss-relative-color-syntax/-/postcss-relative-color-syntax-3.0.11.tgz#d81d59ff123fa5f3e4a0493b1e2b0585353bb541" - integrity sha512-oQ5fZvkcBrWR+k6arHXk0F8FlkmD4IxM+rcGDLWrF2f31tWyEM3lSraeWAV0f7BGH6LIrqmyU3+Qo/1acfoJng== +"@csstools/postcss-relative-color-syntax@^3.0.12": + version "3.0.12" + resolved "https://registry.yarnpkg.com/@csstools/postcss-relative-color-syntax/-/postcss-relative-color-syntax-3.0.12.tgz#ced792450102441f7c160e1d106f33e4b44181f8" + integrity sha512-0RLIeONxu/mtxRtf3o41Lq2ghLimw0w9ByLWnnEVuy89exmEEq8bynveBxNW3nyHqLAFEeNtVEmC1QK9MZ8Huw== dependencies: "@csstools/css-color-parser" "^3.1.0" "@csstools/css-parser-algorithms" "^3.0.5" "@csstools/css-tokenizer" "^3.0.4" - "@csstools/postcss-progressive-custom-properties" "^4.2.0" + "@csstools/postcss-progressive-custom-properties" "^4.2.1" "@csstools/utilities" "^2.0.0" "@csstools/postcss-scope-pseudo-class@^4.0.1": @@ -1384,6 +1478,21 @@ "@csstools/css-parser-algorithms" "^3.0.5" "@csstools/css-tokenizer" "^3.0.4" +"@csstools/postcss-syntax-descriptor-syntax-production@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@csstools/postcss-syntax-descriptor-syntax-production/-/postcss-syntax-descriptor-syntax-production-1.0.1.tgz#98590e372e547cdae60aef47cfee11f3881307dd" + integrity sha512-GneqQWefjM//f4hJ/Kbox0C6f2T7+pi4/fqTqOFGTL3EjnvOReTqO1qUQ30CaUjkwjYq9qZ41hzarrAxCc4gow== + dependencies: + "@csstools/css-tokenizer" "^3.0.4" + +"@csstools/postcss-system-ui-font-family@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@csstools/postcss-system-ui-font-family/-/postcss-system-ui-font-family-1.0.0.tgz#bd65b79078debf6f67b318dc9b71a8f9fa16f8c8" + integrity sha512-s3xdBvfWYfoPSBsikDXbuorcMG1nN1M6GdU0qBsGfcmNR0A/qhloQZpTxjA3Xsyrk1VJvwb2pOfiOT3at/DuIQ== + dependencies: + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" + "@csstools/postcss-text-decoration-shorthand@^4.0.3": version "4.0.3" resolved "https://registry.yarnpkg.com/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-4.0.3.tgz#fae1b70f07d1b7beb4c841c86d69e41ecc6f743c" @@ -1426,25 +1535,29 @@ resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#1d572bfbbe14b7704e0ba0f39b74815b84870d70" integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw== -"@docsearch/css@3.9.0": - version "3.9.0" - resolved "https://registry.yarnpkg.com/@docsearch/css/-/css-3.9.0.tgz#3bc29c96bf024350d73b0cfb7c2a7b71bf251cd5" - integrity sha512-cQbnVbq0rrBwNAKegIac/t6a8nWoUAn8frnkLFW6YARaRmAQr5/Eoe6Ln2fqkUCZ40KpdrKbpSAmgrkviOxuWA== +"@docsearch/core@4.7.0": + version "4.7.0" + resolved "https://registry.yarnpkg.com/@docsearch/core/-/core-4.7.0.tgz#914962191f2718b9caa48f4cbe46c0720fdc055d" + integrity sha512-p/9xVKmPDj3FPvMfPf5naVO3Ej8SCbcUugGvx1+8GgkuBNbqxqN2Irx3WLBv8VY0jH7XpRwKWdlmjXLZsmTLsg== -"@docsearch/react@^3.9.0": - version "3.9.0" - resolved "https://registry.yarnpkg.com/@docsearch/react/-/react-3.9.0.tgz#d0842b700c3ee26696786f3c8ae9f10c1a3f0db3" - integrity sha512-mb5FOZYZIkRQ6s/NWnM98k879vu5pscWqTLubLFBO87igYYT4VzVazh4h5o/zCvTIZgEt3PvsCOMOswOUo9yHQ== +"@docsearch/css@4.7.0": + version "4.7.0" + resolved "https://registry.yarnpkg.com/@docsearch/css/-/css-4.7.0.tgz#d6d93c6ddf5e813a3ea09da719e150c222693a5c" + integrity sha512-Sk5xkdRFeE7PeWjG9l4AfTwdvMfr9wHiwNNCpHXT4v4SNyNMKdHGvEILc31BgaVFGDDNbv5u/a73tofRiwbEZw== + +"@docsearch/react@^3.9.0 || ^4.3.2": + version "4.7.0" + resolved "https://registry.yarnpkg.com/@docsearch/react/-/react-4.7.0.tgz#8e7d77c34d19755f98d225a3413eddf605658d70" + integrity sha512-x6oedjJ8O8/pIDBsMo5Orca3/6cQCz616/CwthVe68l43mqnj2lrJ9kFQITBqy8hMsS3nWeBWFoVO5dJ1DCFKA== dependencies: - "@algolia/autocomplete-core" "1.17.9" - "@algolia/autocomplete-preset-algolia" "1.17.9" - "@docsearch/css" "3.9.0" - algoliasearch "^5.14.2" + "@algolia/autocomplete-core" "1.19.2" + "@docsearch/core" "4.7.0" + "@docsearch/css" "4.7.0" -"@docusaurus/babel@3.8.1": - version "3.8.1" - resolved "https://registry.yarnpkg.com/@docusaurus/babel/-/babel-3.8.1.tgz#db329ac047184214e08e2dbc809832c696c18506" - integrity sha512-3brkJrml8vUbn9aeoZUlJfsI/GqyFcDgQJwQkmBtclJgWDEQBKKeagZfOgx0WfUQhagL1sQLNW0iBdxnI863Uw== +"@docusaurus/babel@3.10.2": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@docusaurus/babel/-/babel-3.10.2.tgz#4d5f8ac4d16bfe26c06f256687831787edb46e8a" + integrity sha512-aJ1hpGyvfkte3dDAfNbWM4biW4yWZBVz7TIGLZP+v+tWOBgxX3e0N5ZIXHIvmfNNXTI77pcHUx3KmtOk05Ze3Q== dependencies: "@babel/core" "^7.25.9" "@babel/generator" "^7.25.9" @@ -1454,25 +1567,24 @@ "@babel/preset-react" "^7.25.9" "@babel/preset-typescript" "^7.25.9" "@babel/runtime" "^7.25.9" - "@babel/runtime-corejs3" "^7.25.9" "@babel/traverse" "^7.25.9" - "@docusaurus/logger" "3.8.1" - "@docusaurus/utils" "3.8.1" + "@docusaurus/logger" "3.10.2" + "@docusaurus/utils" "3.10.2" babel-plugin-dynamic-import-node "^2.3.3" fs-extra "^11.1.1" tslib "^2.6.0" -"@docusaurus/bundler@3.8.1": - version "3.8.1" - resolved "https://registry.yarnpkg.com/@docusaurus/bundler/-/bundler-3.8.1.tgz#e2b11d615f09a6e470774bb36441b8d06736b94c" - integrity sha512-/z4V0FRoQ0GuSLToNjOSGsk6m2lQUG4FRn8goOVoZSRsTrU8YR2aJacX5K3RG18EaX9b+52pN4m1sL3MQZVsQA== +"@docusaurus/bundler@3.10.2": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@docusaurus/bundler/-/bundler-3.10.2.tgz#323492eb0550b6a7f6e5fa6b9877cdb2c53b1be3" + integrity sha512-i0ZNcy0f0WhaOlYVgzLsWhIoEXO9kS3HRoKPtgE6vQtZUq7arKZaYdNBudr3mqCmd+TyOkwtwfHgs1ENj07r5g== dependencies: "@babel/core" "^7.25.9" - "@docusaurus/babel" "3.8.1" - "@docusaurus/cssnano-preset" "3.8.1" - "@docusaurus/logger" "3.8.1" - "@docusaurus/types" "3.8.1" - "@docusaurus/utils" "3.8.1" + "@docusaurus/babel" "3.10.2" + "@docusaurus/cssnano-preset" "3.10.2" + "@docusaurus/logger" "3.10.2" + "@docusaurus/types" "3.10.2" + "@docusaurus/utils" "3.10.2" babel-loader "^9.2.1" clean-css "^5.3.3" copy-webpack-plugin "^11.0.0" @@ -1490,20 +1602,20 @@ tslib "^2.6.0" url-loader "^4.1.1" webpack "^5.95.0" - webpackbar "^6.0.1" - -"@docusaurus/core@3.8.1": - version "3.8.1" - resolved "https://registry.yarnpkg.com/@docusaurus/core/-/core-3.8.1.tgz#c22e47c16a22cb7d245306c64bc54083838ff3db" - integrity sha512-ENB01IyQSqI2FLtOzqSI3qxG2B/jP4gQPahl2C3XReiLebcVh5B5cB9KYFvdoOqOWPyr5gXK4sjgTKv7peXCrA== - dependencies: - "@docusaurus/babel" "3.8.1" - "@docusaurus/bundler" "3.8.1" - "@docusaurus/logger" "3.8.1" - "@docusaurus/mdx-loader" "3.8.1" - "@docusaurus/utils" "3.8.1" - "@docusaurus/utils-common" "3.8.1" - "@docusaurus/utils-validation" "3.8.1" + webpackbar "^7.0.0" + +"@docusaurus/core@3.10.2", "@docusaurus/core@^3.10.2": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@docusaurus/core/-/core-3.10.2.tgz#349cae728fc3769b3f8aef4cf538ccb79aace8d0" + integrity sha512-EYByj6nk+aD9KeVxV6Hmo2/nAAT79P21Y82ycTBOBtrmqilloIbIEhgL2/8Xpt2Jz/pgNqHAwyusOGwmbKeJmA== + dependencies: + "@docusaurus/babel" "3.10.2" + "@docusaurus/bundler" "3.10.2" + "@docusaurus/logger" "3.10.2" + "@docusaurus/mdx-loader" "3.10.2" + "@docusaurus/utils" "3.10.2" + "@docusaurus/utils-common" "3.10.2" + "@docusaurus/utils-validation" "3.10.2" boxen "^6.2.1" chalk "^4.1.2" chokidar "^3.5.3" @@ -1511,11 +1623,11 @@ combine-promises "^1.1.0" commander "^5.1.0" core-js "^3.31.1" - detect-port "^1.5.1" + detect-port "^2.1.0" escape-html "^1.0.3" eta "^2.2.0" eval "^0.1.8" - execa "5.1.1" + execa "^5.1.1" fs-extra "^11.1.1" html-tags "^3.3.1" html-webpack-plugin "^5.6.0" @@ -1526,46 +1638,73 @@ prompts "^2.4.2" react-helmet-async "npm:@slorber/react-helmet-async@1.3.0" react-loadable "npm:@docusaurus/react-loadable@6.0.0" - react-loadable-ssr-addon-v5-slorber "^1.0.1" + react-loadable-ssr-addon-v5-slorber "^1.0.3" react-router "^5.3.4" react-router-config "^5.1.1" react-router-dom "^5.3.4" semver "^7.5.4" - serve-handler "^6.1.6" + serve-handler "^6.1.7" tinypool "^1.0.2" tslib "^2.6.0" update-notifier "^6.0.2" webpack "^5.95.0" webpack-bundle-analyzer "^4.10.2" - webpack-dev-server "^4.15.2" + webpack-dev-server "^5.2.2" webpack-merge "^6.0.1" -"@docusaurus/cssnano-preset@3.8.1": - version "3.8.1" - resolved "https://registry.yarnpkg.com/@docusaurus/cssnano-preset/-/cssnano-preset-3.8.1.tgz#bd55026251a6ab8e2194839a2042458ef9880c44" - integrity sha512-G7WyR2N6SpyUotqhGznERBK+x84uyhfMQM2MmDLs88bw4Flom6TY46HzkRkSEzaP9j80MbTN8naiL1fR17WQug== +"@docusaurus/cssnano-preset@3.10.2": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@docusaurus/cssnano-preset/-/cssnano-preset-3.10.2.tgz#e3ac7e85585f77e8fdef95176ab7c211d1296630" + integrity sha512-4gCnHRbJLTloiwfvFAa92tgb2gI4KYhvjfQVYnEaiMO/EgvWfCo1LwytHXen+1oZAN0VAlS0JAPxp3MsvKDa3A== dependencies: cssnano-preset-advanced "^6.1.2" postcss "^8.5.4" postcss-sort-media-queries "^5.2.0" tslib "^2.6.0" -"@docusaurus/logger@3.8.1": - version "3.8.1" - resolved "https://registry.yarnpkg.com/@docusaurus/logger/-/logger-3.8.1.tgz#45321b2e2e14695d0dbd8b4104ea7b0fbaa98700" - integrity sha512-2wjeGDhKcExEmjX8k1N/MRDiPKXGF2Pg+df/bDDPnnJWHXnVEZxXj80d6jcxp1Gpnksl0hF8t/ZQw9elqj2+ww== +"@docusaurus/faster@^3.10.2": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@docusaurus/faster/-/faster-3.10.2.tgz#6cacd14085445d5826990f7525c5df1cf371e04a" + integrity sha512-p/5E5/RyHv+QWusJMPN5i3OMJTqTgkhuwzVbB1AReDWTUHXQCmf5mlTFzGiDrWeQWIDOKsuOPn1jJh0s9LUOHA== + dependencies: + "@docusaurus/types" "3.10.2" + "@rspack/core" "^1.7.10" + "@swc/core" "^1.15.40" + "@swc/html" "^1.15.40" + browserslist "^4.24.2" + lightningcss "^1.27.0" + semver "^7.5.4" + swc-loader "^0.2.6" + tslib "^2.6.0" + webpack "^5.95.0" + +"@docusaurus/logger@3.10.2": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@docusaurus/logger/-/logger-3.10.2.tgz#280bed53d0eb9cdc56e896a155036207910e89c9" + integrity sha512-gSEwqtPfCAnC3ZSJY6xL7tcIfgg0vFD39jbv93eakuweyvO2864xR0K+kmKwBhkTCtWRNjuGGnb5rdmkD/ndqw== dependencies: chalk "^4.1.2" tslib "^2.6.0" -"@docusaurus/mdx-loader@3.8.1": - version "3.8.1" - resolved "https://registry.yarnpkg.com/@docusaurus/mdx-loader/-/mdx-loader-3.8.1.tgz#74309b3614bbcef1d55fb13e6cc339b7fb000b5f" - integrity sha512-DZRhagSFRcEq1cUtBMo4TKxSNo/W6/s44yhr8X+eoXqCLycFQUylebOMPseHi5tc4fkGJqwqpWJLz6JStU9L4w== +"@docusaurus/lqip-loader@3.10.2": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@docusaurus/lqip-loader/-/lqip-loader-3.10.2.tgz#6cfe52091e4df3832acfec4001910d0e0889158b" + integrity sha512-U9ON9YXhfQcF7s4JUrcw02Nxez9ctI5nu/+6XGGmLJ+yx36ALT1fFCHzHfd7+TvSB1H7aoT/6T5BdfZvRp++Wg== dependencies: - "@docusaurus/logger" "3.8.1" - "@docusaurus/utils" "3.8.1" - "@docusaurus/utils-validation" "3.8.1" + "@docusaurus/logger" "3.10.2" + file-loader "^6.2.0" + lodash "^4.17.21" + sharp "^0.32.3" + tslib "^2.6.0" + +"@docusaurus/mdx-loader@3.10.2": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@docusaurus/mdx-loader/-/mdx-loader-3.10.2.tgz#3b4e7ffacff4ed856db2ec4e94c13b0a652d62eb" + integrity sha512-9Fd4V/SFjfrVQ0JH5EN0+iPWyFunvTeQE3gfyFeetqPaXMP0OylIjOw16dCuXG4NZJrYdBqwzjh18/h3gRi47w== + dependencies: + "@docusaurus/logger" "3.10.2" + "@docusaurus/utils" "3.10.2" + "@docusaurus/utils-validation" "3.10.2" "@mdx-js/mdx" "^3.0.0" "@slorber/remark-comment" "^1.0.0" escape-html "^1.0.3" @@ -1588,12 +1727,12 @@ vfile "^6.0.1" webpack "^5.88.1" -"@docusaurus/module-type-aliases@3.8.1": - version "3.8.1" - resolved "https://registry.yarnpkg.com/@docusaurus/module-type-aliases/-/module-type-aliases-3.8.1.tgz#454de577bd7f50b5eae16db0f76b49ca5e4e281a" - integrity sha512-6xhvAJiXzsaq3JdosS7wbRt/PwEPWHr9eM4YNYqVlbgG1hSK3uQDXTVvQktasp3VO6BmfYWPozueLWuj4gB+vg== +"@docusaurus/module-type-aliases@3.10.2", "@docusaurus/module-type-aliases@^3.10.2": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@docusaurus/module-type-aliases/-/module-type-aliases-3.10.2.tgz#7c3b940c77d72e71d33a1e76f0e003b418e6163a" + integrity sha512-h/I5e4jaAhDHW4vaLENi1i2hnOEnXY1t9R+nnRTbgUl7ymVRzN/HF7dDfj8rKYGj8gfIge+Ef+iYRAMtbGvsrQ== dependencies: - "@docusaurus/types" "3.8.1" + "@docusaurus/types" "3.10.2" "@types/history" "^4.7.11" "@types/react" "*" "@types/react-router-config" "*" @@ -1601,20 +1740,21 @@ react-helmet-async "npm:@slorber/react-helmet-async@1.3.0" react-loadable "npm:@docusaurus/react-loadable@6.0.0" -"@docusaurus/plugin-content-blog@3.8.1": - version "3.8.1" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-blog/-/plugin-content-blog-3.8.1.tgz#88d842b562b04cf59df900d9f6984b086f821525" - integrity sha512-vNTpMmlvNP9n3hGEcgPaXyvTljanAKIUkuG9URQ1DeuDup0OR7Ltvoc8yrmH+iMZJbcQGhUJF+WjHLwuk8HSdw== - dependencies: - "@docusaurus/core" "3.8.1" - "@docusaurus/logger" "3.8.1" - "@docusaurus/mdx-loader" "3.8.1" - "@docusaurus/theme-common" "3.8.1" - "@docusaurus/types" "3.8.1" - "@docusaurus/utils" "3.8.1" - "@docusaurus/utils-common" "3.8.1" - "@docusaurus/utils-validation" "3.8.1" +"@docusaurus/plugin-content-blog@3.10.2": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-blog/-/plugin-content-blog-3.10.2.tgz#2374886ec3d76e8f014e85db8c3c010de6c419be" + integrity sha512-0cbEnNKf0InmLkhj/+nVRmqEnWEoOE8Mh+2x1qOXI0qYpCnphq4RXknVJ8BvybKRXqYVvbmdMfiJSup+k4tm5w== + dependencies: + "@docusaurus/core" "3.10.2" + "@docusaurus/logger" "3.10.2" + "@docusaurus/mdx-loader" "3.10.2" + "@docusaurus/theme-common" "3.10.2" + "@docusaurus/types" "3.10.2" + "@docusaurus/utils" "3.10.2" + "@docusaurus/utils-common" "3.10.2" + "@docusaurus/utils-validation" "3.10.2" cheerio "1.0.0-rc.12" + combine-promises "^1.1.0" feed "^4.2.2" fs-extra "^11.1.1" lodash "^4.17.21" @@ -1625,20 +1765,20 @@ utility-types "^3.10.0" webpack "^5.88.1" -"@docusaurus/plugin-content-docs@3.8.1": - version "3.8.1" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.8.1.tgz#40686a206abb6373bee5638de100a2c312f112a4" - integrity sha512-oByRkSZzeGNQByCMaX+kif5Nl2vmtj2IHQI2fWjCfCootsdKZDPFLonhIp5s3IGJO7PLUfe0POyw0Xh/RrGXJA== - dependencies: - "@docusaurus/core" "3.8.1" - "@docusaurus/logger" "3.8.1" - "@docusaurus/mdx-loader" "3.8.1" - "@docusaurus/module-type-aliases" "3.8.1" - "@docusaurus/theme-common" "3.8.1" - "@docusaurus/types" "3.8.1" - "@docusaurus/utils" "3.8.1" - "@docusaurus/utils-common" "3.8.1" - "@docusaurus/utils-validation" "3.8.1" +"@docusaurus/plugin-content-docs@3.10.2": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.10.2.tgz#249bbc806437f227b06410ecc771eb67d8910a9a" + integrity sha512-Sqwl4FPoZBDrlY8I2VU2H8O0M91CHp9T8ToMSkTZmjvHCif+1laqfXi6sTk8IfyVS/trN5yNjcWd1bFsGB6W5Q== + dependencies: + "@docusaurus/core" "3.10.2" + "@docusaurus/logger" "3.10.2" + "@docusaurus/mdx-loader" "3.10.2" + "@docusaurus/module-type-aliases" "3.10.2" + "@docusaurus/theme-common" "3.10.2" + "@docusaurus/types" "3.10.2" + "@docusaurus/utils" "3.10.2" + "@docusaurus/utils-common" "3.10.2" + "@docusaurus/utils-validation" "3.10.2" "@types/react-router-config" "^5.0.7" combine-promises "^1.1.0" fs-extra "^11.1.1" @@ -1649,142 +1789,163 @@ utility-types "^3.10.0" webpack "^5.88.1" -"@docusaurus/plugin-content-pages@3.8.1": - version "3.8.1" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-pages/-/plugin-content-pages-3.8.1.tgz#41b684dbd15390b7bb6a627f78bf81b6324511ac" - integrity sha512-a+V6MS2cIu37E/m7nDJn3dcxpvXb6TvgdNI22vJX8iUTp8eoMoPa0VArEbWvCxMY/xdC26WzNv4wZ6y0iIni/w== +"@docusaurus/plugin-content-pages@3.10.2": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-pages/-/plugin-content-pages-3.10.2.tgz#377c11b36a6a5e0c0c14dd9dea799f986d662ed7" + integrity sha512-h5R12sZ/vV9EPiVjvIl9YFCOwkpwXes7dQMYt3EvP6Pphu4amHxxTqWxf08Fl5DR8h+oZMbWpFTNw5vKEYfvzQ== dependencies: - "@docusaurus/core" "3.8.1" - "@docusaurus/mdx-loader" "3.8.1" - "@docusaurus/types" "3.8.1" - "@docusaurus/utils" "3.8.1" - "@docusaurus/utils-validation" "3.8.1" + "@docusaurus/core" "3.10.2" + "@docusaurus/mdx-loader" "3.10.2" + "@docusaurus/types" "3.10.2" + "@docusaurus/utils" "3.10.2" + "@docusaurus/utils-validation" "3.10.2" fs-extra "^11.1.1" tslib "^2.6.0" webpack "^5.88.1" -"@docusaurus/plugin-css-cascade-layers@3.8.1": - version "3.8.1" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-css-cascade-layers/-/plugin-css-cascade-layers-3.8.1.tgz#cb414b4a82aa60fc64ef2a435ad0105e142a6c71" - integrity sha512-VQ47xRxfNKjHS5ItzaVXpxeTm7/wJLFMOPo1BkmoMG4Cuz4nuI+Hs62+RMk1OqVog68Swz66xVPK8g9XTrBKRw== +"@docusaurus/plugin-css-cascade-layers@3.10.2": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-css-cascade-layers/-/plugin-css-cascade-layers-3.10.2.tgz#54edc6450b0bb95be5990ea416b4c4dc5e6bdde0" + integrity sha512-UkdvQby5OQUKWrw3lLnSTJXQ6VETaUVTuPQX9AABtmFm5h+ifEBx1OQ+LN726Q4byuwBf2ElHkf4qU4hTxdvRg== dependencies: - "@docusaurus/core" "3.8.1" - "@docusaurus/types" "3.8.1" - "@docusaurus/utils" "3.8.1" - "@docusaurus/utils-validation" "3.8.1" + "@docusaurus/core" "3.10.2" + "@docusaurus/types" "3.10.2" + "@docusaurus/utils" "3.10.2" + "@docusaurus/utils-validation" "3.10.2" tslib "^2.6.0" -"@docusaurus/plugin-debug@3.8.1": - version "3.8.1" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-debug/-/plugin-debug-3.8.1.tgz#45b107e46b627caaae66995f53197ace78af3491" - integrity sha512-nT3lN7TV5bi5hKMB7FK8gCffFTBSsBsAfV84/v293qAmnHOyg1nr9okEw8AiwcO3bl9vije5nsUvP0aRl2lpaw== +"@docusaurus/plugin-debug@3.10.2": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-debug/-/plugin-debug-3.10.2.tgz#2452f258668bb2514085d2d5fff700457c531aad" + integrity sha512-8vbZNOSCpnsT57EY6CgN7sgRVmx3KTYwO8Uvo2pbxOyb8tbqAwtT9SslqaQ41HbA1v1hpn5RP7u5s2KvRwAFpQ== dependencies: - "@docusaurus/core" "3.8.1" - "@docusaurus/types" "3.8.1" - "@docusaurus/utils" "3.8.1" + "@docusaurus/core" "3.10.2" + "@docusaurus/types" "3.10.2" + "@docusaurus/utils" "3.10.2" fs-extra "^11.1.1" react-json-view-lite "^2.3.0" tslib "^2.6.0" -"@docusaurus/plugin-google-analytics@3.8.1": - version "3.8.1" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-3.8.1.tgz#64a302e62fe5cb6e007367c964feeef7b056764a" - integrity sha512-Hrb/PurOJsmwHAsfMDH6oVpahkEGsx7F8CWMjyP/dw1qjqmdS9rcV1nYCGlM8nOtD3Wk/eaThzUB5TSZsGz+7Q== +"@docusaurus/plugin-google-analytics@3.10.2": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-3.10.2.tgz#7a0375c5a238cd9220166d9be8afc00ba508c55d" + integrity sha512-kMHMBK9j4VAtgd5owwrRLRIi0EjkrpXlX7ePj1+y68XfVZV9I1T4S+koPDm+Hfw2TtnyHvh0uNrDvjz+DjQGVA== dependencies: - "@docusaurus/core" "3.8.1" - "@docusaurus/types" "3.8.1" - "@docusaurus/utils-validation" "3.8.1" + "@docusaurus/core" "3.10.2" + "@docusaurus/types" "3.10.2" + "@docusaurus/utils-validation" "3.10.2" tslib "^2.6.0" -"@docusaurus/plugin-google-gtag@3.8.1": - version "3.8.1" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-3.8.1.tgz#8c76f8a1d96448f2f0f7b10e6bde451c40672b95" - integrity sha512-tKE8j1cEZCh8KZa4aa80zpSTxsC2/ZYqjx6AAfd8uA8VHZVw79+7OTEP2PoWi0uL5/1Is0LF5Vwxd+1fz5HlKg== +"@docusaurus/plugin-google-gtag@3.10.2": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-3.10.2.tgz#65df25eb5fb3f2a3f2d0fba8ddd423060e09e1ca" + integrity sha512-Vt90nNFhtAChRe9+it1hcHFgFvETdSnOkL5Bma+p6E/yU2tAYrvvyk+gv+LJGM2ZUkyKuKXLRsZ2Lb0bO7+Vog== dependencies: - "@docusaurus/core" "3.8.1" - "@docusaurus/types" "3.8.1" - "@docusaurus/utils-validation" "3.8.1" - "@types/gtag.js" "^0.0.12" + "@docusaurus/core" "3.10.2" + "@docusaurus/types" "3.10.2" + "@docusaurus/utils-validation" "3.10.2" tslib "^2.6.0" -"@docusaurus/plugin-google-tag-manager@3.8.1": - version "3.8.1" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-3.8.1.tgz#88241ffd06369f4a4d5fb982ff3ac2777561ae37" - integrity sha512-iqe3XKITBquZq+6UAXdb1vI0fPY5iIOitVjPQ581R1ZKpHr0qe+V6gVOrrcOHixPDD/BUKdYwkxFjpNiEN+vBw== +"@docusaurus/plugin-google-tag-manager@3.10.2": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-3.10.2.tgz#882a24e51dc42487d2c1d4f2cde3f59c99a276cb" + integrity sha512-MLCffCldysi/R0nzJQP7ZWd0xAoGNnSTiVOo6TTR6mKVGFhE+/XArGe67ZcaZv1uytgQXoXs92VJrgVDrz80rQ== dependencies: - "@docusaurus/core" "3.8.1" - "@docusaurus/types" "3.8.1" - "@docusaurus/utils-validation" "3.8.1" + "@docusaurus/core" "3.10.2" + "@docusaurus/types" "3.10.2" + "@docusaurus/utils-validation" "3.10.2" tslib "^2.6.0" -"@docusaurus/plugin-sitemap@3.8.1": - version "3.8.1" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-sitemap/-/plugin-sitemap-3.8.1.tgz#3aebd39186dc30e53023f1aab44625bc0bdac892" - integrity sha512-+9YV/7VLbGTq8qNkjiugIelmfUEVkTyLe6X8bWq7K5qPvGXAjno27QAfFq63mYfFFbJc7z+pudL63acprbqGzw== - dependencies: - "@docusaurus/core" "3.8.1" - "@docusaurus/logger" "3.8.1" - "@docusaurus/types" "3.8.1" - "@docusaurus/utils" "3.8.1" - "@docusaurus/utils-common" "3.8.1" - "@docusaurus/utils-validation" "3.8.1" +"@docusaurus/plugin-ideal-image@^3.10.2": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-ideal-image/-/plugin-ideal-image-3.10.2.tgz#51fa3048328ce403b2f153aee1fa676827d49106" + integrity sha512-M1uRffUaE5hqbo7368jSclYSU6oOOFdJ3/fq644kwaoComeG+jjBJ9piFrHkExtiU2Q7zcm1dWaqtfJVrR9wSQ== + dependencies: + "@docusaurus/core" "3.10.2" + "@docusaurus/lqip-loader" "3.10.2" + "@docusaurus/responsive-loader" "^1.7.0" + "@docusaurus/theme-translations" "3.10.2" + "@docusaurus/types" "3.10.2" + "@docusaurus/utils-validation" "3.10.2" + sharp "^0.32.3" + tslib "^2.6.0" + webpack "^5.88.1" + +"@docusaurus/plugin-sitemap@3.10.2": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-sitemap/-/plugin-sitemap-3.10.2.tgz#6c662c7df3bb7d36887f8b73f54d85dc4d36371d" + integrity sha512-PODkwg5XetLML3hU/3xpCKJUZ9cqExLaBnD/Fzzwj2VHogLeqnDisLIujae87zuze7T4mCm2A6KEqZkyiz07EQ== + dependencies: + "@docusaurus/core" "3.10.2" + "@docusaurus/logger" "3.10.2" + "@docusaurus/types" "3.10.2" + "@docusaurus/utils" "3.10.2" + "@docusaurus/utils-common" "3.10.2" + "@docusaurus/utils-validation" "3.10.2" fs-extra "^11.1.1" sitemap "^7.1.1" tslib "^2.6.0" -"@docusaurus/plugin-svgr@3.8.1": - version "3.8.1" - resolved "https://registry.yarnpkg.com/@docusaurus/plugin-svgr/-/plugin-svgr-3.8.1.tgz#6f340be8eae418a2cce540d8ece096ffd9c9b6ab" - integrity sha512-rW0LWMDsdlsgowVwqiMb/7tANDodpy1wWPwCcamvhY7OECReN3feoFwLjd/U4tKjNY3encj0AJSTxJA+Fpe+Gw== +"@docusaurus/plugin-svgr@3.10.2": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@docusaurus/plugin-svgr/-/plugin-svgr-3.10.2.tgz#916fd0a5d39bf73cb621de9789cce243a7ef1754" + integrity sha512-JgfT3jWM0TJ8Uw0cEcqxHpybngQY1vlBYpuuNO+gEh5iPh5Ar+vxq/u9CFrYsWeXy48BN7Db76Pzp2edNXUQ8A== dependencies: - "@docusaurus/core" "3.8.1" - "@docusaurus/types" "3.8.1" - "@docusaurus/utils" "3.8.1" - "@docusaurus/utils-validation" "3.8.1" + "@docusaurus/core" "3.10.2" + "@docusaurus/types" "3.10.2" + "@docusaurus/utils" "3.10.2" + "@docusaurus/utils-validation" "3.10.2" "@svgr/core" "8.1.0" "@svgr/webpack" "^8.1.0" tslib "^2.6.0" webpack "^5.88.1" -"@docusaurus/preset-classic@3.8.1": - version "3.8.1" - resolved "https://registry.yarnpkg.com/@docusaurus/preset-classic/-/preset-classic-3.8.1.tgz#bb79fd12f3211363720c569a526c7e24d3aa966b" - integrity sha512-yJSjYNHXD8POMGc2mKQuj3ApPrN+eG0rO1UPgSx7jySpYU+n4WjBikbrA2ue5ad9A7aouEtMWUoiSRXTH/g7KQ== - dependencies: - "@docusaurus/core" "3.8.1" - "@docusaurus/plugin-content-blog" "3.8.1" - "@docusaurus/plugin-content-docs" "3.8.1" - "@docusaurus/plugin-content-pages" "3.8.1" - "@docusaurus/plugin-css-cascade-layers" "3.8.1" - "@docusaurus/plugin-debug" "3.8.1" - "@docusaurus/plugin-google-analytics" "3.8.1" - "@docusaurus/plugin-google-gtag" "3.8.1" - "@docusaurus/plugin-google-tag-manager" "3.8.1" - "@docusaurus/plugin-sitemap" "3.8.1" - "@docusaurus/plugin-svgr" "3.8.1" - "@docusaurus/theme-classic" "3.8.1" - "@docusaurus/theme-common" "3.8.1" - "@docusaurus/theme-search-algolia" "3.8.1" - "@docusaurus/types" "3.8.1" - -"@docusaurus/theme-classic@3.8.1": - version "3.8.1" - resolved "https://registry.yarnpkg.com/@docusaurus/theme-classic/-/theme-classic-3.8.1.tgz#1e45c66d89ded359225fcd29bf3258d9205765c1" - integrity sha512-bqDUCNqXeYypMCsE1VcTXSI1QuO4KXfx8Cvl6rYfY0bhhqN6d2WZlRkyLg/p6pm+DzvanqHOyYlqdPyP0iz+iw== - dependencies: - "@docusaurus/core" "3.8.1" - "@docusaurus/logger" "3.8.1" - "@docusaurus/mdx-loader" "3.8.1" - "@docusaurus/module-type-aliases" "3.8.1" - "@docusaurus/plugin-content-blog" "3.8.1" - "@docusaurus/plugin-content-docs" "3.8.1" - "@docusaurus/plugin-content-pages" "3.8.1" - "@docusaurus/theme-common" "3.8.1" - "@docusaurus/theme-translations" "3.8.1" - "@docusaurus/types" "3.8.1" - "@docusaurus/utils" "3.8.1" - "@docusaurus/utils-common" "3.8.1" - "@docusaurus/utils-validation" "3.8.1" +"@docusaurus/preset-classic@^3.10.2": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@docusaurus/preset-classic/-/preset-classic-3.10.2.tgz#e4419c811723ab913a946c63efcc15e7f5f60a0a" + integrity sha512-a4B3VczmDl99zK0EufDQYomdJ186WDingjmDXxhN2PNPS9Ty/Y2M5CLFX1KQMRKqRTLiRDKfutzG5IY1FC/ceg== + dependencies: + "@docusaurus/core" "3.10.2" + "@docusaurus/plugin-content-blog" "3.10.2" + "@docusaurus/plugin-content-docs" "3.10.2" + "@docusaurus/plugin-content-pages" "3.10.2" + "@docusaurus/plugin-css-cascade-layers" "3.10.2" + "@docusaurus/plugin-debug" "3.10.2" + "@docusaurus/plugin-google-analytics" "3.10.2" + "@docusaurus/plugin-google-gtag" "3.10.2" + "@docusaurus/plugin-google-tag-manager" "3.10.2" + "@docusaurus/plugin-sitemap" "3.10.2" + "@docusaurus/plugin-svgr" "3.10.2" + "@docusaurus/theme-classic" "3.10.2" + "@docusaurus/theme-common" "3.10.2" + "@docusaurus/theme-search-algolia" "3.10.2" + "@docusaurus/types" "3.10.2" + +"@docusaurus/responsive-loader@^1.7.0": + version "1.7.1" + resolved "https://registry.yarnpkg.com/@docusaurus/responsive-loader/-/responsive-loader-1.7.1.tgz#fe22a657263350cbc777e296e8d8403c53d2f247" + integrity sha512-jAebZ43f8GVpZSrijLGHVVp7Y0OMIPRaL+HhiIWQ+f/b72lTsKLkSkOVHEzvd2psNJ9lsoiM3gt6akpak6508w== + dependencies: + loader-utils "^2.0.0" + +"@docusaurus/theme-classic@3.10.2": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@docusaurus/theme-classic/-/theme-classic-3.10.2.tgz#a64bd600c789b33c67c30c256b07e2ca0f57e2ae" + integrity sha512-JqTSLQmqmA9uKWZsD5iwBGJ4JyKB4/yTw6PsSXVPRJG/6GAm/u+add9Iip+hvwP12/AnPNztrdxsI14NJW4KeA== + dependencies: + "@docusaurus/core" "3.10.2" + "@docusaurus/logger" "3.10.2" + "@docusaurus/mdx-loader" "3.10.2" + "@docusaurus/module-type-aliases" "3.10.2" + "@docusaurus/plugin-content-blog" "3.10.2" + "@docusaurus/plugin-content-docs" "3.10.2" + "@docusaurus/plugin-content-pages" "3.10.2" + "@docusaurus/theme-common" "3.10.2" + "@docusaurus/theme-translations" "3.10.2" + "@docusaurus/types" "3.10.2" + "@docusaurus/utils" "3.10.2" + "@docusaurus/utils-common" "3.10.2" + "@docusaurus/utils-validation" "3.10.2" "@mdx-js/react" "^3.0.0" clsx "^2.0.0" copy-text-to-clipboard "^3.2.0" @@ -1799,15 +1960,15 @@ tslib "^2.6.0" utility-types "^3.10.0" -"@docusaurus/theme-common@3.8.1": - version "3.8.1" - resolved "https://registry.yarnpkg.com/@docusaurus/theme-common/-/theme-common-3.8.1.tgz#17c23316fbe3ee3f7e707c7298cb59a0fff38b4b" - integrity sha512-UswMOyTnPEVRvN5Qzbo+l8k4xrd5fTFu2VPPfD6FcW/6qUtVLmJTQCktbAL3KJ0BVXGm5aJXz/ZrzqFuZERGPw== +"@docusaurus/theme-common@3.10.2": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@docusaurus/theme-common/-/theme-common-3.10.2.tgz#5cf2a8b76554b8b38c6afe8448470c411f683e5b" + integrity sha512-R9b/vMpK1yye6hNZTA6x/ivRv+at6GhxnXcxkpzCGzO1R1RwiquqiFg2wMFh6aqlJTpWRFKpFD2TzCDQcyOU0A== dependencies: - "@docusaurus/mdx-loader" "3.8.1" - "@docusaurus/module-type-aliases" "3.8.1" - "@docusaurus/utils" "3.8.1" - "@docusaurus/utils-common" "3.8.1" + "@docusaurus/mdx-loader" "3.10.2" + "@docusaurus/module-type-aliases" "3.10.2" + "@docusaurus/utils" "3.10.2" + "@docusaurus/utils-common" "3.10.2" "@types/history" "^4.7.11" "@types/react" "*" "@types/react-router-config" "*" @@ -1817,21 +1978,35 @@ tslib "^2.6.0" utility-types "^3.10.0" -"@docusaurus/theme-search-algolia@3.8.1": - version "3.8.1" - resolved "https://registry.yarnpkg.com/@docusaurus/theme-search-algolia/-/theme-search-algolia-3.8.1.tgz#3aa3d99c35cc2d4b709fcddd4df875a9b536e29b" - integrity sha512-NBFH5rZVQRAQM087aYSRKQ9yGEK9eHd+xOxQjqNpxMiV85OhJDD4ZGz6YJIod26Fbooy54UWVdzNU0TFeUUUzQ== - dependencies: - "@docsearch/react" "^3.9.0" - "@docusaurus/core" "3.8.1" - "@docusaurus/logger" "3.8.1" - "@docusaurus/plugin-content-docs" "3.8.1" - "@docusaurus/theme-common" "3.8.1" - "@docusaurus/theme-translations" "3.8.1" - "@docusaurus/utils" "3.8.1" - "@docusaurus/utils-validation" "3.8.1" - algoliasearch "^5.17.1" - algoliasearch-helper "^3.22.6" +"@docusaurus/theme-mermaid@^3.10.2": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@docusaurus/theme-mermaid/-/theme-mermaid-3.10.2.tgz#826e47a01fefbe49fdbb0f4f575c9399d3ccd92c" + integrity sha512-Stssh5MYQJ+EdYugUXf+ZcpeJFQPKXf0KCd/SWp10o3CmXNaOoh5IEgVjVqY1e1XhQf3on4+Y4BnrMiD95E2SQ== + dependencies: + "@docusaurus/core" "3.10.2" + "@docusaurus/module-type-aliases" "3.10.2" + "@docusaurus/theme-common" "3.10.2" + "@docusaurus/types" "3.10.2" + "@docusaurus/utils-validation" "3.10.2" + mermaid ">=11.6.0" + tslib "^2.6.0" + +"@docusaurus/theme-search-algolia@3.10.2": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@docusaurus/theme-search-algolia/-/theme-search-algolia-3.10.2.tgz#e7756d4088a7df4d11fd734bfe0e8fa28ceac1dd" + integrity sha512-1msxllyhi/5m77JukXtp5UFnUAriwZIC1oJ7MTnpQpCwLTbclJi5BK5n28CTZuSXpQN2ewbbnqRgAhMM6c6ihg== + dependencies: + "@algolia/autocomplete-core" "^1.19.2" + "@docsearch/react" "^3.9.0 || ^4.3.2" + "@docusaurus/core" "3.10.2" + "@docusaurus/logger" "3.10.2" + "@docusaurus/plugin-content-docs" "3.10.2" + "@docusaurus/theme-common" "3.10.2" + "@docusaurus/theme-translations" "3.10.2" + "@docusaurus/utils" "3.10.2" + "@docusaurus/utils-validation" "3.10.2" + algoliasearch "^5.37.0" + algoliasearch-helper "^3.26.0" clsx "^2.0.0" eta "^2.2.0" fs-extra "^11.1.1" @@ -1839,21 +2014,22 @@ tslib "^2.6.0" utility-types "^3.10.0" -"@docusaurus/theme-translations@3.8.1": - version "3.8.1" - resolved "https://registry.yarnpkg.com/@docusaurus/theme-translations/-/theme-translations-3.8.1.tgz#4b1d76973eb53861e167c7723485e059ba4ffd0a" - integrity sha512-OTp6eebuMcf2rJt4bqnvuwmm3NVXfzfYejL+u/Y1qwKhZPrjPoKWfk1CbOP5xH5ZOPkiAsx4dHdQBRJszK3z2g== +"@docusaurus/theme-translations@3.10.2": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@docusaurus/theme-translations/-/theme-translations-3.10.2.tgz#cd649083babd12df324e7129008aaccacd4cfb13" + integrity sha512-iv20wrxnyXkY89LM3TzRlzGlt5fIGO5UnaR6UL1ZVfB9RRFjxQFQ6awDrwAc6Km8Y5gD8pInuwYPF+6/TiCxXA== dependencies: fs-extra "^11.1.1" tslib "^2.6.0" -"@docusaurus/types@3.8.1": - version "3.8.1" - resolved "https://registry.yarnpkg.com/@docusaurus/types/-/types-3.8.1.tgz#83ab66c345464e003b576a49f78897482061fc26" - integrity sha512-ZPdW5AB+pBjiVrcLuw3dOS6BFlrG0XkS2lDGsj8TizcnREQg3J8cjsgfDviszOk4CweNfwo1AEELJkYaMUuOPg== +"@docusaurus/types@3.10.2", "@docusaurus/types@^3.10.2": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@docusaurus/types/-/types-3.10.2.tgz#9ffe35adfb4587e49158ee9e10d94b86419a5932" + integrity sha512-B6rvfwIFSapUqUJjMriZswX13K8l5Z7AcmVE6uTEJpYddQieSTR12DsGaFtcZAIDsQd4p+0WTl0Vc6jmZK0Trw== dependencies: "@mdx-js/mdx" "^3.0.0" "@types/history" "^4.7.11" + "@types/mdast" "^4.0.2" "@types/react" "*" commander "^5.1.0" joi "^17.9.2" @@ -1862,43 +2038,43 @@ webpack "^5.95.0" webpack-merge "^5.9.0" -"@docusaurus/utils-common@3.8.1": - version "3.8.1" - resolved "https://registry.yarnpkg.com/@docusaurus/utils-common/-/utils-common-3.8.1.tgz#c369b8c3041afb7dcd595d4172beb1cc1015c85f" - integrity sha512-zTZiDlvpvoJIrQEEd71c154DkcriBecm4z94OzEE9kz7ikS3J+iSlABhFXM45mZ0eN5pVqqr7cs60+ZlYLewtg== +"@docusaurus/utils-common@3.10.2": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@docusaurus/utils-common/-/utils-common-3.10.2.tgz#a65fcfffafa4e15a59fe61d7ba315ee5d4c49269" + integrity sha512-x3Dz6jv6iQKBNjBmVTu8p57abMp/VNTUgKBMgRVXJc5444orBTsArv0+cdfrXTiz/VMmHfDRVkPbL7GH2B7T7w== dependencies: - "@docusaurus/types" "3.8.1" + "@docusaurus/types" "3.10.2" tslib "^2.6.0" -"@docusaurus/utils-validation@3.8.1": - version "3.8.1" - resolved "https://registry.yarnpkg.com/@docusaurus/utils-validation/-/utils-validation-3.8.1.tgz#0499c0d151a4098a0963237057993282cfbd538e" - integrity sha512-gs5bXIccxzEbyVecvxg6upTwaUbfa0KMmTj7HhHzc016AGyxH2o73k1/aOD0IFrdCsfJNt37MqNI47s2MgRZMA== +"@docusaurus/utils-validation@3.10.2": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@docusaurus/utils-validation/-/utils-validation-3.10.2.tgz#2624b0ca6675675da2f063828115b43c9a22de47" + integrity sha512-sn8unbDfUL585NtR3cwHefPicOyaHvPaX7VD0aOg/siIxUBoKyKKaGEqzJZDS64mM43TnxurkYDtmB1wsJlZsw== dependencies: - "@docusaurus/logger" "3.8.1" - "@docusaurus/utils" "3.8.1" - "@docusaurus/utils-common" "3.8.1" + "@docusaurus/logger" "3.10.2" + "@docusaurus/utils" "3.10.2" + "@docusaurus/utils-common" "3.10.2" fs-extra "^11.2.0" joi "^17.9.2" js-yaml "^4.1.0" lodash "^4.17.21" tslib "^2.6.0" -"@docusaurus/utils@3.8.1": - version "3.8.1" - resolved "https://registry.yarnpkg.com/@docusaurus/utils/-/utils-3.8.1.tgz#2ac1e734106e2f73dbd0f6a8824d525f9064e9f0" - integrity sha512-P1ml0nvOmEFdmu0smSXOqTS1sxU5tqvnc0dA4MTKV39kye+bhQnjkIKEE18fNOvxjyB86k8esoCIFM3x4RykOQ== +"@docusaurus/utils@3.10.2": + version "3.10.2" + resolved "https://registry.yarnpkg.com/@docusaurus/utils/-/utils-3.10.2.tgz#d99c1ffc5c7961e912344269a8728ce2aad8b3dc" + integrity sha512-xx0W3eav2uW1NRIpuHJWNwLTC15xPNjU4Uxi9NSnd3swYC96BE3vFiT93SD8s24kmAAWNwgZwfZ2fghGZ01Lcw== dependencies: - "@docusaurus/logger" "3.8.1" - "@docusaurus/types" "3.8.1" - "@docusaurus/utils-common" "3.8.1" + "@11ty/gray-matter" "^1.0.0" + "@docusaurus/logger" "3.10.2" + "@docusaurus/types" "3.10.2" + "@docusaurus/utils-common" "3.10.2" escape-string-regexp "^4.0.0" - execa "5.1.1" + execa "^5.1.1" file-loader "^6.2.0" fs-extra "^11.1.1" github-slugger "^1.5.0" globby "^11.1.0" - gray-matter "^4.0.3" jiti "^1.20.0" js-yaml "^4.1.0" lodash "^4.17.21" @@ -1911,6 +2087,28 @@ utility-types "^3.10.0" webpack "^5.88.1" +"@emnapi/core@^1.5.0": + version "1.11.3" + resolved "https://registry.yarnpkg.com/@emnapi/core/-/core-1.11.3.tgz#5e95348a42cd1e06f0b9aa380cd74091daa4d520" + integrity sha512-zLpS5asjEb7lq8jYLq37N6XKaE41DIexlY1rF/z4/tIl3wo13Sqm28fRyfIsKZD+NZ8mM5RoKkpW/rBcuoSZSg== + dependencies: + "@emnapi/wasi-threads" "1.2.3" + tslib "^2.4.0" + +"@emnapi/runtime@^1.5.0": + version "1.11.3" + resolved "https://registry.yarnpkg.com/@emnapi/runtime/-/runtime-1.11.3.tgz#84257ae3b0531eb2aec1ffa23d70700da007ba95" + integrity sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA== + dependencies: + tslib "^2.4.0" + +"@emnapi/wasi-threads@1.2.3": + version "1.2.3" + resolved "https://registry.yarnpkg.com/@emnapi/wasi-threads/-/wasi-threads-1.2.3.tgz#c9bf72fd4be5b928aee894820e8d814ed73916e9" + integrity sha512-ELEBe8PsLvvJ6QMr0zLt8ffvOHW/dc1m3CEzNMg7aJUv3bMaoDtw2TXyDAwkYBuroxxuHEwhRTLJSe5sya547g== + dependencies: + tslib "^2.4.0" + "@emotion/babel-plugin@^11.13.5": version "11.13.5" resolved "https://registry.yarnpkg.com/@emotion/babel-plugin/-/babel-plugin-11.13.5.tgz#eab8d65dbded74e0ecfd28dc218e75607c4e7bc0" @@ -2042,6 +2240,15 @@ resolved "https://registry.yarnpkg.com/@iconify/types/-/types-2.0.0.tgz#ab0e9ea681d6c8a1214f30cd741fe3a20cc57f57" integrity sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg== +"@iconify/utils@^3.0.2": + version "3.1.7" + resolved "https://registry.yarnpkg.com/@iconify/utils/-/utils-3.1.7.tgz#fff11c528490b119a250ace3cf35a0a78e182317" + integrity sha512-JZHlwdID+dy+lTgbYC8NEC4zeugqeYsc6jewvzb4c58kHauJn+X7rNwQjxz5p2qSjqaEeQoLkCIQ9v/H4PK0/w== + dependencies: + "@antfu/install-pkg" "^2.0.1" + "@iconify/types" "^2.0.0" + import-meta-resolve "^4.2.0" + "@jest/schemas@^29.6.3": version "29.6.3" resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.6.3.tgz#430b5ce8a4e0044a7e3819663305a7b3091c8e03" @@ -2091,11 +2298,11 @@ "@jridgewell/trace-mapping" "^0.3.25" "@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.5.0": - version "1.5.5" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz#6912b00d2c631c0d15ce1a7ab57cd657f2a8f8ba" - integrity sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og== + version "1.6.0" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.6.0.tgz#f4c663e862f06dc98ca4d453862c46902789a18d" + integrity sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw== -"@jridgewell/trace-mapping@^0.3.18", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25", "@jridgewell/trace-mapping@^0.3.28": +"@jridgewell/trace-mapping@^0.3.18", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25", "@jridgewell/trace-mapping@^0.3.28", "@jridgewell/trace-mapping@^0.3.31": version "0.3.31" resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz#db15d6781c931f3a251a3dac39501c98a6082fd0" integrity sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw== @@ -2103,6 +2310,167 @@ "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" +"@jsonjoy.com/base64@17.67.0": + version "17.67.0" + resolved "https://registry.yarnpkg.com/@jsonjoy.com/base64/-/base64-17.67.0.tgz#7eeda3cb41138d77a90408fd2e42b2aba10576d7" + integrity sha512-5SEsJGsm15aP8TQGkDfJvz9axgPwAEm98S5DxOuYe8e1EbfajcDmgeXXzccEjh+mLnjqEKrkBdjHWS5vFNwDdw== + +"@jsonjoy.com/base64@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@jsonjoy.com/base64/-/base64-1.1.2.tgz#cf8ea9dcb849b81c95f14fc0aaa151c6b54d2578" + integrity sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA== + +"@jsonjoy.com/buffers@17.67.0", "@jsonjoy.com/buffers@^17.65.0": + version "17.67.0" + resolved "https://registry.yarnpkg.com/@jsonjoy.com/buffers/-/buffers-17.67.0.tgz#5c58dbcdeea8824ce296bd1cfce006c2eb167b3d" + integrity sha512-tfExRpYxBvi32vPs9ZHaTjSP4fHAfzSmcahOfNxtvGHcyJel+aibkPlGeBB+7AoC6hL7lXIE++8okecBxx7lcw== + +"@jsonjoy.com/buffers@^1.0.0", "@jsonjoy.com/buffers@^1.2.0": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@jsonjoy.com/buffers/-/buffers-1.2.1.tgz#8d99c7f67eaf724d3428dfd9826c6455266a5c83" + integrity sha512-12cdlDwX4RUM3QxmUbVJWqZ/mrK6dFQH4Zxq6+r1YXKXYBNgZXndx2qbCJwh3+WWkCSn67IjnlG3XYTvmvYtgA== + +"@jsonjoy.com/codegen@17.67.0": + version "17.67.0" + resolved "https://registry.yarnpkg.com/@jsonjoy.com/codegen/-/codegen-17.67.0.tgz#3635fd8769d77e19b75dc5574bc9756019b2e591" + integrity sha512-idnkUplROpdBOV0HMcwhsCUS5TRUi9poagdGs70A6S4ux9+/aPuKbh8+UYRTLYQHtXvAdNfQWXDqZEx5k4Dj2Q== + +"@jsonjoy.com/codegen@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@jsonjoy.com/codegen/-/codegen-1.0.0.tgz#5c23f796c47675f166d23b948cdb889184b93207" + integrity sha512-E8Oy+08cmCf0EK/NMxpaJZmOxPqM+6iSe2S4nlSBrPZOORoDJILxtbSUEDKQyTamm/BVAhIGllOBNU79/dwf0g== + +"@jsonjoy.com/fs-core@4.78.0": + version "4.78.0" + resolved "https://registry.yarnpkg.com/@jsonjoy.com/fs-core/-/fs-core-4.78.0.tgz#d8d03caf1d537308c893a447f34abb293a651d16" + integrity sha512-0YE5XQj383AwNj5fG0Mm1gyx/ViVe2DJzS5FeVbJulw0pteEK9mfbeB0MWH3/ARoXb2AhHHuiiNthdWF0Y6EYQ== + dependencies: + "@jsonjoy.com/fs-node-builtins" "4.78.0" + "@jsonjoy.com/fs-node-utils" "4.78.0" + thingies "^2.5.0" + +"@jsonjoy.com/fs-fsa@4.78.0": + version "4.78.0" + resolved "https://registry.yarnpkg.com/@jsonjoy.com/fs-fsa/-/fs-fsa-4.78.0.tgz#afc0ccf9af5f497260895e69b150965587516af3" + integrity sha512-V1lUo5k4xUypsfdmvCrrUJ44BCixbgvpus71WI3a3BOQt39bK2LasU/HgpJ1P9or8a2d5mWR3kk26sRoehDlaw== + dependencies: + "@jsonjoy.com/fs-core" "4.78.0" + "@jsonjoy.com/fs-node-builtins" "4.78.0" + "@jsonjoy.com/fs-node-utils" "4.78.0" + thingies "^2.5.0" + +"@jsonjoy.com/fs-node-builtins@4.78.0": + version "4.78.0" + resolved "https://registry.yarnpkg.com/@jsonjoy.com/fs-node-builtins/-/fs-node-builtins-4.78.0.tgz#c1b30600aca51a6fd45b7f1b991e4e3c7468dcbd" + integrity sha512-yiyMh9uKnQvRVDYzINP9P2AXZPdHYM2iVsQ/2U2V+g+gfTr4vPcT1Ox0aQs0IIXGQRAnksyA63KSqpOOJ/O3lA== + +"@jsonjoy.com/fs-node-to-fsa@4.78.0": + version "4.78.0" + resolved "https://registry.yarnpkg.com/@jsonjoy.com/fs-node-to-fsa/-/fs-node-to-fsa-4.78.0.tgz#444a0b118e24649b4fa076264b266809144f0746" + integrity sha512-L1e0UgRJ/igqt3JUDJh3z8YXTKqJc9r9MY4ZakEMOqqEDq/C5fmSZDDzq03d7HqdG1rehkmCDpKyXWqQEVpQGw== + dependencies: + "@jsonjoy.com/fs-fsa" "4.78.0" + "@jsonjoy.com/fs-node-builtins" "4.78.0" + "@jsonjoy.com/fs-node-utils" "4.78.0" + +"@jsonjoy.com/fs-node-utils@4.78.0": + version "4.78.0" + resolved "https://registry.yarnpkg.com/@jsonjoy.com/fs-node-utils/-/fs-node-utils-4.78.0.tgz#652ddc6a000ba89af24adca9fdc9477e8ed4edfe" + integrity sha512-Am25+Y/rEFtkJBZCFgs84XPXqeqXq4FvXmCYMZ0bEC/M+vT0e6tHBU4Camp9/Yzuf6NoxaInC3iXIN791wVu9g== + dependencies: + "@jsonjoy.com/fs-node-builtins" "4.78.0" + glob-to-regex.js "^1.3.1" + +"@jsonjoy.com/fs-node@4.78.0": + version "4.78.0" + resolved "https://registry.yarnpkg.com/@jsonjoy.com/fs-node/-/fs-node-4.78.0.tgz#ca45eee75971abf13e70f64a01d68ae17e5da860" + integrity sha512-AhoKCEEzsTU5C+9pSegNkErrQijvpHj10kzVhaXIxjs/0taxjCCLG7zE+Y+EWCMNCVmgFEyca+oTQQWm2RO+sg== + dependencies: + "@jsonjoy.com/fs-core" "4.78.0" + "@jsonjoy.com/fs-node-builtins" "4.78.0" + "@jsonjoy.com/fs-node-utils" "4.78.0" + "@jsonjoy.com/fs-print" "4.78.0" + "@jsonjoy.com/fs-snapshot" "4.78.0" + glob-to-regex.js "^1.3.1" + thingies "^2.5.0" + +"@jsonjoy.com/fs-print@4.78.0": + version "4.78.0" + resolved "https://registry.yarnpkg.com/@jsonjoy.com/fs-print/-/fs-print-4.78.0.tgz#c5f9cc2c3b5ee90425481ecc33ba5be93da60fd8" + integrity sha512-Uwk0SvDN1X+5FNW3MxibrFVXXUnd0nTUP6qwvPikg3QDeXRiRww91mz34lXYa/xO5eVuUqa1WXmd0ljy1+Ej0w== + dependencies: + "@jsonjoy.com/fs-node-utils" "4.78.0" + tree-dump "^1.1.0" + +"@jsonjoy.com/fs-snapshot@4.78.0": + version "4.78.0" + resolved "https://registry.yarnpkg.com/@jsonjoy.com/fs-snapshot/-/fs-snapshot-4.78.0.tgz#1f6669bd06475c83c6465c9c00fc1201110a741a" + integrity sha512-+HvPGwV1IcXtwFFxMBK5x8rmqBuIkPpEFZMGkO8BolJH+AuSvQGVwvlKulUjQ9KECpN4GTCcgeQtyUvYC8heSA== + dependencies: + "@jsonjoy.com/buffers" "^17.65.0" + "@jsonjoy.com/fs-node-utils" "4.78.0" + "@jsonjoy.com/json-pack" "^17.65.0" + "@jsonjoy.com/util" "^17.65.0" + +"@jsonjoy.com/json-pack@^1.11.0": + version "1.21.0" + resolved "https://registry.yarnpkg.com/@jsonjoy.com/json-pack/-/json-pack-1.21.0.tgz#93f8dd57fe3a3a92132b33d1eb182dcd9e7629fa" + integrity sha512-+AKG+R2cfZMShzrF2uQw34v3zbeDYUqnQ+jg7ORic3BGtfw9p/+N6RJbq/kkV8JmYZaINknaEQ2m0/f693ZPpg== + dependencies: + "@jsonjoy.com/base64" "^1.1.2" + "@jsonjoy.com/buffers" "^1.2.0" + "@jsonjoy.com/codegen" "^1.0.0" + "@jsonjoy.com/json-pointer" "^1.0.2" + "@jsonjoy.com/util" "^1.9.0" + hyperdyperid "^1.2.0" + thingies "^2.5.0" + tree-dump "^1.1.0" + +"@jsonjoy.com/json-pack@^17.65.0": + version "17.67.0" + resolved "https://registry.yarnpkg.com/@jsonjoy.com/json-pack/-/json-pack-17.67.0.tgz#8dd8ff65dd999c5d4d26df46c63915c7bdec093a" + integrity sha512-t0ejURcGaZsn1ClbJ/3kFqSOjlryd92eQY465IYrezsXmPcfHPE/av4twRSxf6WE+TkZgLY+71vCZbiIiFKA/w== + dependencies: + "@jsonjoy.com/base64" "17.67.0" + "@jsonjoy.com/buffers" "17.67.0" + "@jsonjoy.com/codegen" "17.67.0" + "@jsonjoy.com/json-pointer" "17.67.0" + "@jsonjoy.com/util" "17.67.0" + hyperdyperid "^1.2.0" + thingies "^2.5.0" + tree-dump "^1.1.0" + +"@jsonjoy.com/json-pointer@17.67.0": + version "17.67.0" + resolved "https://registry.yarnpkg.com/@jsonjoy.com/json-pointer/-/json-pointer-17.67.0.tgz#74439573dc046e0c9a3a552fb94b391bc75313b8" + integrity sha512-+iqOFInH+QZGmSuaybBUNdh7yvNrXvqR+h3wjXm0N/3JK1EyyFAeGJvqnmQL61d1ARLlk/wJdFKSL+LHJ1eaUA== + dependencies: + "@jsonjoy.com/util" "17.67.0" + +"@jsonjoy.com/json-pointer@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@jsonjoy.com/json-pointer/-/json-pointer-1.0.2.tgz#049cb530ac24e84cba08590c5e36b431c4843408" + integrity sha512-Fsn6wM2zlDzY1U+v4Nc8bo3bVqgfNTGcn6dMgs6FjrEnt4ZCe60o6ByKRjOGlI2gow0aE/Q41QOigdTqkyK5fg== + dependencies: + "@jsonjoy.com/codegen" "^1.0.0" + "@jsonjoy.com/util" "^1.9.0" + +"@jsonjoy.com/util@17.67.0", "@jsonjoy.com/util@^17.65.0": + version "17.67.0" + resolved "https://registry.yarnpkg.com/@jsonjoy.com/util/-/util-17.67.0.tgz#7c4288fc3808233e55c7610101e7bb4590cddd3f" + integrity sha512-6+8xBaz1rLSohlGh68D1pdw3AwDi9xydm8QNlAFkvnavCJYSze+pxoW2VKP8p308jtlMRLs5NTHfPlZLd4w7ew== + dependencies: + "@jsonjoy.com/buffers" "17.67.0" + "@jsonjoy.com/codegen" "17.67.0" + +"@jsonjoy.com/util@^1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@jsonjoy.com/util/-/util-1.9.0.tgz#7ee95586aed0a766b746cd8d8363e336c3c47c46" + integrity sha512-pLuQo+VPRnN8hfPqUTLTHk126wuYdXVxE6aDmjSeV4NCAgyxWbiOIeNJVtID3h1Vzpoi9m4jXezf73I6LgabgQ== + dependencies: + "@jsonjoy.com/buffers" "^1.0.0" + "@jsonjoy.com/codegen" "^1.0.0" + "@leichtgewicht/ip-codec@^2.0.1": version "2.0.5" resolved "https://registry.yarnpkg.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz#4fc56c15c580b9adb7dc3c333a134e540b44bfb1" @@ -2146,89 +2514,153 @@ dependencies: "@types/mdx" "^2.0.0" -"@mui/core-downloads-tracker@^7.3.2": - version "7.3.2" - resolved "https://registry.yarnpkg.com/@mui/core-downloads-tracker/-/core-downloads-tracker-7.3.2.tgz#896a7890864d619093dc79541ec1ecfa3b507ad2" - integrity sha512-AOyfHjyDKVPGJJFtxOlept3EYEdLoar/RvssBTWVAvDJGIE676dLi2oT/Kx+FoVXFoA/JdV7DEMq/BVWV3KHRw== +"@mermaid-js/parser@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@mermaid-js/parser/-/parser-2.0.0.tgz#018b3e6754e4302fb059765c37bae30ecdff4147" + integrity sha512-K8BeapFUfrfxbRAUQAG5oBOCwo1+bNWzaVnPxTCutkfrTBn6T/j91FIhqxWJ32SUeQ9T3iy1zcmPZ5ROZEvDrg== + dependencies: + "@chevrotain/types" "~11.1.2" + +"@module-federation/error-codes@0.22.0": + version "0.22.0" + resolved "https://registry.yarnpkg.com/@module-federation/error-codes/-/error-codes-0.22.0.tgz#31ccc990dc240d73912ba7bd001f7e35ac751992" + integrity sha512-xF9SjnEy7vTdx+xekjPCV5cIHOGCkdn3pIxo9vU7gEZMIw0SvAEdsy6Uh17xaCpm8V0FWvR0SZoK9Ik6jGOaug== + +"@module-federation/runtime-core@0.22.0": + version "0.22.0" + resolved "https://registry.yarnpkg.com/@module-federation/runtime-core/-/runtime-core-0.22.0.tgz#7321ec792bb7d1d22bee6162ec43564b769d2a3c" + integrity sha512-GR1TcD6/s7zqItfhC87zAp30PqzvceoeDGYTgF3Vx2TXvsfDrhP6Qw9T4vudDQL3uJRne6t7CzdT29YyVxlgIA== + dependencies: + "@module-federation/error-codes" "0.22.0" + "@module-federation/sdk" "0.22.0" + +"@module-federation/runtime-tools@0.22.0": + version "0.22.0" + resolved "https://registry.yarnpkg.com/@module-federation/runtime-tools/-/runtime-tools-0.22.0.tgz#36f2a7cb267af208a9d1a237fe9a71b4bf31431e" + integrity sha512-4ScUJ/aUfEernb+4PbLdhM/c60VHl698Gn1gY21m9vyC1Ucn69fPCA1y2EwcCB7IItseRMoNhdcWQnzt/OPCNA== + dependencies: + "@module-federation/runtime" "0.22.0" + "@module-federation/webpack-bundler-runtime" "0.22.0" + +"@module-federation/runtime@0.22.0": + version "0.22.0" + resolved "https://registry.yarnpkg.com/@module-federation/runtime/-/runtime-0.22.0.tgz#f789c9ef40d846d110711c8221ecc0ad938d43d8" + integrity sha512-38g5iPju2tPC3KHMPxRKmy4k4onNp6ypFPS1eKGsNLUkXgHsPMBFqAjDw96iEcjri91BrahG4XcdyKi97xZzlA== + dependencies: + "@module-federation/error-codes" "0.22.0" + "@module-federation/runtime-core" "0.22.0" + "@module-federation/sdk" "0.22.0" + +"@module-federation/sdk@0.22.0": + version "0.22.0" + resolved "https://registry.yarnpkg.com/@module-federation/sdk/-/sdk-0.22.0.tgz#6ad4c1de85a900c3c80ff26cb87cce253e3a2770" + integrity sha512-x4aFNBKn2KVQRuNVC5A7SnrSCSqyfIWmm1DvubjbO9iKFe7ith5niw8dqSFBekYBg2Fwy+eMg4sEFNVvCAdo6g== + +"@module-federation/webpack-bundler-runtime@0.22.0": + version "0.22.0" + resolved "https://registry.yarnpkg.com/@module-federation/webpack-bundler-runtime/-/webpack-bundler-runtime-0.22.0.tgz#dcbe8f972d722fe278e6a7c21988d4bee53d401d" + integrity sha512-aM8gCqXu+/4wBmJtVeMeeMN5guw3chf+2i6HajKtQv7SJfxV/f4IyNQJUeUQu9HfiAZHjqtMV5Lvq/Lvh8LdyA== + dependencies: + "@module-federation/runtime" "0.22.0" + "@module-federation/sdk" "0.22.0" + +"@mui/core-downloads-tracker@^7.3.11": + version "7.3.11" + resolved "https://registry.yarnpkg.com/@mui/core-downloads-tracker/-/core-downloads-tracker-7.3.11.tgz#93251cf192641b9582641991feea60149159902c" + integrity sha512-a7I/b/nBTdXYz2cOSlEmkQ9WWE1x8FHpqMhFPp+Y1VPFxcOw91G5ELOHARQAGSPy5V+UCgJua6K/1x70bAtQPw== "@mui/icons-material@^7.3.1": - version "7.3.2" - resolved "https://registry.yarnpkg.com/@mui/icons-material/-/icons-material-7.3.2.tgz#050049cd6195b815e85888aaebd436e8e95084b8" - integrity sha512-TZWazBjWXBjR6iGcNkbKklnwodcwj0SrChCNHc9BhD9rBgET22J1eFhHsEmvSvru9+opDy3umqAimQjokhfJlQ== + version "7.3.11" + resolved "https://registry.yarnpkg.com/@mui/icons-material/-/icons-material-7.3.11.tgz#dfea40829d1ca96c074c85093fdfe0de170af5ad" + integrity sha512-+hz5ilwHZ3djd5es3sCErLioqe/NhZcYTsV/TNXZAMdJdb23F4xzJjqnnZdnurc3S1+ietcssRNqieOhPQLZ7Q== dependencies: - "@babel/runtime" "^7.28.3" + "@babel/runtime" "^7.28.6" "@mui/material@^7.3.1": - version "7.3.2" - resolved "https://registry.yarnpkg.com/@mui/material/-/material-7.3.2.tgz#21ad66bba695e2cd36e4a93e2e4ff5e04d8636a1" - integrity sha512-qXvbnawQhqUVfH1LMgMaiytP+ZpGoYhnGl7yYq2x57GYzcFL/iPzSZ3L30tlbwEjSVKNYcbiKO8tANR1tadjUg== - dependencies: - "@babel/runtime" "^7.28.3" - "@mui/core-downloads-tracker" "^7.3.2" - "@mui/system" "^7.3.2" - "@mui/types" "^7.4.6" - "@mui/utils" "^7.3.2" + version "7.3.11" + resolved "https://registry.yarnpkg.com/@mui/material/-/material-7.3.11.tgz#aa6e0640bb29bd01e6c353ac3436fa0b20e5a36b" + integrity sha512-yq8bPc3LxOwKRWpcjRgDkYFmpM6aKlARfESTmOQcvLYFeJwtHte2tw6hJDrb8sk8wcvpDprHEHVaoUU0MslIkw== + dependencies: + "@babel/runtime" "^7.28.6" + "@mui/core-downloads-tracker" "^7.3.11" + "@mui/system" "^7.3.11" + "@mui/types" "^7.4.12" + "@mui/utils" "^7.3.11" "@popperjs/core" "^2.11.8" "@types/react-transition-group" "^4.4.12" clsx "^2.1.1" - csstype "^3.1.3" + csstype "^3.2.3" prop-types "^15.8.1" - react-is "^19.1.1" + react-is "^19.2.3" react-transition-group "^4.4.5" -"@mui/private-theming@^7.3.2": - version "7.3.2" - resolved "https://registry.yarnpkg.com/@mui/private-theming/-/private-theming-7.3.2.tgz#9b883ac9ec9288327de038da6ddf8ffa179be831" - integrity sha512-ha7mFoOyZGJr75xeiO9lugS3joRROjc8tG1u4P50dH0KR7bwhHznVMcYg7MouochUy0OxooJm/OOSpJ7gKcMvg== +"@mui/private-theming@^7.3.11": + version "7.3.11" + resolved "https://registry.yarnpkg.com/@mui/private-theming/-/private-theming-7.3.11.tgz#96d4cde586624916816f5a97fef3c808cf562fb0" + integrity sha512-9B+YKms0fRHbNrqp9tOT/DNbNnU5gyvJ1o3qAGXfq8GmZcbJnE3At9x07Zr/o0pkhzg4aDdwXVqe4+AcgtOCPA== dependencies: - "@babel/runtime" "^7.28.3" - "@mui/utils" "^7.3.2" + "@babel/runtime" "^7.28.6" + "@mui/utils" "^7.3.11" prop-types "^15.8.1" -"@mui/styled-engine@^7.3.2": - version "7.3.2" - resolved "https://registry.yarnpkg.com/@mui/styled-engine/-/styled-engine-7.3.2.tgz#cac6acb9480d6eaf60d9c99a7d24503e53236b32" - integrity sha512-PkJzW+mTaek4e0nPYZ6qLnW5RGa0KN+eRTf5FA2nc7cFZTeM+qebmGibaTLrgQBy3UpcpemaqfzToBNkzuxqew== +"@mui/styled-engine@^7.3.10": + version "7.3.10" + resolved "https://registry.yarnpkg.com/@mui/styled-engine/-/styled-engine-7.3.10.tgz#53e98c1fdeda972b5932c76f6a2a29faf33f0d11" + integrity sha512-WxE9SiF8xskAQqGjsp0poXCkCqsoXFEsSr0HBXfApmGHR+DBnXRp+z46Vsltg4gpPM4Z96DeAQRpeAOnhNg7Ng== dependencies: - "@babel/runtime" "^7.28.3" + "@babel/runtime" "^7.28.6" "@emotion/cache" "^11.14.0" "@emotion/serialize" "^1.3.3" "@emotion/sheet" "^1.4.0" - csstype "^3.1.3" + csstype "^3.2.3" prop-types "^15.8.1" -"@mui/system@^7.3.2": - version "7.3.2" - resolved "https://registry.yarnpkg.com/@mui/system/-/system-7.3.2.tgz#e838097fc6cb0a2e4c1822478950db89affb116a" - integrity sha512-9d8JEvZW+H6cVkaZ+FK56R53vkJe3HsTpcjMUtH8v1xK6Y1TjzHdZ7Jck02mGXJsE6MQGWVs3ogRHTQmS9Q/rA== +"@mui/system@^7.3.11": + version "7.3.11" + resolved "https://registry.yarnpkg.com/@mui/system/-/system-7.3.11.tgz#ffb8ba06f43d697db80257b9a2dfc8042b18554a" + integrity sha512-7izwGWdNawAKpBKcRlx7f2gFnAAjmASBWvMcyX4YYEeLOFsbfGRbUYGInvnAcUeql3rPxI7F9Ft4oY2OLRz44g== dependencies: - "@babel/runtime" "^7.28.3" - "@mui/private-theming" "^7.3.2" - "@mui/styled-engine" "^7.3.2" - "@mui/types" "^7.4.6" - "@mui/utils" "^7.3.2" + "@babel/runtime" "^7.28.6" + "@mui/private-theming" "^7.3.11" + "@mui/styled-engine" "^7.3.10" + "@mui/types" "^7.4.12" + "@mui/utils" "^7.3.11" clsx "^2.1.1" - csstype "^3.1.3" + csstype "^3.2.3" prop-types "^15.8.1" -"@mui/types@^7.4.6": - version "7.4.6" - resolved "https://registry.yarnpkg.com/@mui/types/-/types-7.4.6.tgz#1432e0814cf155287283f6bbd1e95976a148ef07" - integrity sha512-NVBbIw+4CDMMppNamVxyTccNv0WxtDb7motWDlMeSC8Oy95saj1TIZMGynPpFLePt3yOD8TskzumeqORCgRGWw== +"@mui/types@^7.4.12": + version "7.4.12" + resolved "https://registry.yarnpkg.com/@mui/types/-/types-7.4.12.tgz#e4eba37a7506419ea5c5e0604322ba82b271bf46" + integrity sha512-iKNAF2u9PzSIj40CjvKJWxFXJo122jXVdrmdh0hMYd+FR+NuJMkr/L88XwWLCRiJ5P1j+uyac25+Kp6YC4hu6w== dependencies: - "@babel/runtime" "^7.28.3" + "@babel/runtime" "^7.28.6" -"@mui/utils@^7.3.2": - version "7.3.2" - resolved "https://registry.yarnpkg.com/@mui/utils/-/utils-7.3.2.tgz#361775d72c557a03115150e8aec4329c7ef14563" - integrity sha512-4DMWQGenOdLnM3y/SdFQFwKsCLM+mqxzvoWp9+x2XdEzXapkznauHLiXtSohHs/mc0+5/9UACt1GdugCX2te5g== +"@mui/utils@^7.3.11": + version "7.3.11" + resolved "https://registry.yarnpkg.com/@mui/utils/-/utils-7.3.11.tgz#493f46f053fe3a692e041b1b6b8295e2f46d9448" + integrity sha512-XTjGnifwteg71/ij+0e7Y7d+hwyntMYP5wPoA/g2drdGH+Flkvjwy0OfrVpKBbaOvofq4zU/LIyUZyKgmWu18g== dependencies: - "@babel/runtime" "^7.28.3" - "@mui/types" "^7.4.6" + "@babel/runtime" "^7.28.6" + "@mui/types" "^7.4.12" "@types/prop-types" "^15.7.15" clsx "^2.1.1" prop-types "^15.8.1" - react-is "^19.1.1" + react-is "^19.2.3" + +"@napi-rs/wasm-runtime@1.0.7": + version "1.0.7" + resolved "https://registry.yarnpkg.com/@napi-rs/wasm-runtime/-/wasm-runtime-1.0.7.tgz#dcfea99a75f06209a235f3d941e3460a51e9b14c" + integrity sha512-SeDnOO0Tk7Okiq6DbXmmBODgOAb9dp9gjlphokTUxmt8U3liIP1ZsozBahH69j/RJv+Rfs6IwUKHTgQYJ/HBAw== + dependencies: + "@emnapi/core" "^1.5.0" + "@emnapi/runtime" "^1.5.0" + "@tybys/wasm-util" "^0.10.1" + +"@noble/hashes@1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.4.0.tgz#45814aa329f30e4fe0ba49426f49dfccdd066426" + integrity sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg== "@nodelib/fs.scandir@2.1.5": version "2.1.5" @@ -2251,6 +2683,136 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" +"@peculiar/asn1-cms@^2.6.0", "@peculiar/asn1-cms@^2.9.4": + version "2.9.4" + resolved "https://registry.yarnpkg.com/@peculiar/asn1-cms/-/asn1-cms-2.9.4.tgz#1c0b42ba5dcbaf8e1e060a1e76cd2442affbc37c" + integrity sha512-cben7oxmQsUGZqotus7yt0srYdncOT6RNWcTQ77T2RFOXejYVYkXadrfePdRcrVpO9K95IRLKKglG2k38jKXuw== + dependencies: + "@peculiar/asn1-schema" "^2.9.4" + "@peculiar/asn1-x509" "^2.9.4" + "@peculiar/asn1-x509-attr" "^2.9.4" + asn1js "^3.0.10" + tslib "^2.8.1" + +"@peculiar/asn1-csr@^2.6.0": + version "2.9.4" + resolved "https://registry.yarnpkg.com/@peculiar/asn1-csr/-/asn1-csr-2.9.4.tgz#d306964f97bd7eb4edc6e3dc5e5ac87b2414e858" + integrity sha512-xd4YN4vpRjkDAQWVfZZkeu12IEND7DOpkqaHSIHxZl1uggUNa9Ju0QxY2jHvDAS9pP0zhRBytg8ifsnGo3V0jw== + dependencies: + "@peculiar/asn1-schema" "^2.9.4" + "@peculiar/asn1-x509" "^2.9.4" + asn1js "^3.0.10" + tslib "^2.8.1" + +"@peculiar/asn1-ecc@^2.6.0": + version "2.9.4" + resolved "https://registry.yarnpkg.com/@peculiar/asn1-ecc/-/asn1-ecc-2.9.4.tgz#2bf1bd8734584689a2d3f43c57b25ce3a60a0ce2" + integrity sha512-JJXefFshRAuVAjWQo/39bkg1ywc1VaiO44S8RRC+Ykvf/u2KDmYffoDb0ZBPCR5uJy4AGKQhl8mX+Q8ShcWaXQ== + dependencies: + "@peculiar/asn1-schema" "^2.9.4" + "@peculiar/asn1-x509" "^2.9.4" + asn1js "^3.0.10" + tslib "^2.8.1" + +"@peculiar/asn1-pfx@^2.9.4": + version "2.9.4" + resolved "https://registry.yarnpkg.com/@peculiar/asn1-pfx/-/asn1-pfx-2.9.4.tgz#795ddfe7ee3669b50f42cdaed42cc82b22a5d440" + integrity sha512-khuGzHTzNzk4GDlIBEILyIs6Lce0yn0ZBdoI9v93kmNncfZRhD+AQ5ODFqdhvoE8cMJF/JMTQ8yA+t1D14kqCw== + dependencies: + "@peculiar/asn1-cms" "^2.9.4" + "@peculiar/asn1-pkcs8" "^2.9.4" + "@peculiar/asn1-rsa" "^2.9.4" + "@peculiar/asn1-schema" "^2.9.4" + asn1js "^3.0.10" + tslib "^2.8.1" + +"@peculiar/asn1-pkcs8@^2.9.4": + version "2.9.4" + resolved "https://registry.yarnpkg.com/@peculiar/asn1-pkcs8/-/asn1-pkcs8-2.9.4.tgz#79ac7696eb7acf3fe68b121ac39fcb265f8b219e" + integrity sha512-duRdotlUx9eDZe6QrQpQKl61RbWykCHBCkKayP8V8XdEFwlKHZ8qGGDMyS6Pye7OX7nLFttTTpRkJeet78ckwQ== + dependencies: + "@peculiar/asn1-schema" "^2.9.4" + "@peculiar/asn1-x509" "^2.9.4" + asn1js "^3.0.10" + tslib "^2.8.1" + +"@peculiar/asn1-pkcs9@^2.6.0": + version "2.9.4" + resolved "https://registry.yarnpkg.com/@peculiar/asn1-pkcs9/-/asn1-pkcs9-2.9.4.tgz#18c89ab8d5e34469d43497bdbde7fc84cf437991" + integrity sha512-kaL4cNxBpdQE2dKlyZBqz4ygCrwffO+8wfoxTEqM1Z8RadvCeELBRzcv0dzM8aY9azHMwODO5nxU65zXmhToOQ== + dependencies: + "@peculiar/asn1-cms" "^2.9.4" + "@peculiar/asn1-pfx" "^2.9.4" + "@peculiar/asn1-pkcs8" "^2.9.4" + "@peculiar/asn1-schema" "^2.9.4" + "@peculiar/asn1-x509" "^2.9.4" + "@peculiar/asn1-x509-attr" "^2.9.4" + asn1js "^3.0.10" + tslib "^2.8.1" + +"@peculiar/asn1-rsa@^2.6.0", "@peculiar/asn1-rsa@^2.9.4": + version "2.9.4" + resolved "https://registry.yarnpkg.com/@peculiar/asn1-rsa/-/asn1-rsa-2.9.4.tgz#0547359f09b10876a21a96ef32b70af6db9855ad" + integrity sha512-pZ96eD1PptovcWQ/GSmuNFXd/7EQJNlKfDaNCyE2rx3W0v6QFelkzquVqRSRyyDXXCYD69ZXJDzZ8GhIiQzKoA== + dependencies: + "@peculiar/asn1-schema" "^2.9.4" + "@peculiar/asn1-x509" "^2.9.4" + asn1js "^3.0.10" + tslib "^2.8.1" + +"@peculiar/asn1-schema@^2.6.0", "@peculiar/asn1-schema@^2.9.4": + version "2.9.4" + resolved "https://registry.yarnpkg.com/@peculiar/asn1-schema/-/asn1-schema-2.9.4.tgz#99003d4bc87ec2ed2c4deb2843404496a912c3cf" + integrity sha512-GjzePcT9Iw8NzeOPf73iNS9xM+TBhd/FilAfP+RQGkTMQJTVWtytN3JHJACCjf/ABNau5S7mS3g+DcuxmRgYEg== + dependencies: + "@peculiar/utils" "^2.0.2" + asn1js "^3.0.10" + tslib "^2.8.1" + +"@peculiar/asn1-x509-attr@^2.9.4": + version "2.9.4" + resolved "https://registry.yarnpkg.com/@peculiar/asn1-x509-attr/-/asn1-x509-attr-2.9.4.tgz#c74094ffb97442c3fac7b965bd1345f9a0b59d48" + integrity sha512-ehQXbpQaQYycgu8OrvigwSPTFfVRcu0ECNYCWw+yzBp02Lw5paRqzzhUpfOgO2K38+WfFZuEz/0RPtam5g0OMg== + dependencies: + "@peculiar/asn1-schema" "^2.9.4" + "@peculiar/asn1-x509" "^2.9.4" + asn1js "^3.0.10" + tslib "^2.8.1" + +"@peculiar/asn1-x509@^2.6.0", "@peculiar/asn1-x509@^2.9.4": + version "2.9.4" + resolved "https://registry.yarnpkg.com/@peculiar/asn1-x509/-/asn1-x509-2.9.4.tgz#f997898c48ba6536bed640f788734d36477c21ad" + integrity sha512-CxhBo/RdEbMMob7T31ZdQjGuoyRFLVwrDzTn25bihzBasRg9kRm/0IxIPvhgQtcK/9dNcO1XQL2fuPugwELL0Q== + dependencies: + "@peculiar/asn1-schema" "^2.9.4" + "@peculiar/utils" "^2.0.2" + asn1js "^3.0.10" + tslib "^2.8.1" + +"@peculiar/utils@^2.0.2": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@peculiar/utils/-/utils-2.0.3.tgz#a27ca4c4b73652e110f19a7d16d664f458a5528e" + integrity sha512-+oL3HPFRIZ1St2K50lWCXiioIgSoxzz7R1J3uF6neO2yl1sgmpgY6XXJH4BdpoDkMWznQTeYF6oWNDZLCdQ4eQ== + dependencies: + tslib "^2.8.1" + +"@peculiar/x509@^1.14.2": + version "1.14.3" + resolved "https://registry.yarnpkg.com/@peculiar/x509/-/x509-1.14.3.tgz#2c44c2b89474346afec38a0c2803ec4fb8ce959e" + integrity sha512-C2Xj8FZ0uHWeCXXqX5B4/gVFQmtSkiuOolzAgutjTfseNOHT3pUjljDZsTSxXFGgio54bCzVFqmEOUrIVk8RDA== + dependencies: + "@peculiar/asn1-cms" "^2.6.0" + "@peculiar/asn1-csr" "^2.6.0" + "@peculiar/asn1-ecc" "^2.6.0" + "@peculiar/asn1-pkcs9" "^2.6.0" + "@peculiar/asn1-rsa" "^2.6.0" + "@peculiar/asn1-schema" "^2.6.0" + "@peculiar/asn1-x509" "^2.6.0" + pvtsutils "^1.3.6" + reflect-metadata "^0.2.2" + tslib "^2.8.1" + tsyringe "^4.10.0" + "@pnpm/config.env-replace@^1.1.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz#ab29da53df41e8948a00f2433f085f54de8b3a4c" @@ -2263,10 +2825,10 @@ dependencies: graceful-fs "4.2.10" -"@pnpm/npm-conf@^2.1.0": - version "2.3.1" - resolved "https://registry.yarnpkg.com/@pnpm/npm-conf/-/npm-conf-2.3.1.tgz#bb375a571a0bd63ab0a23bece33033c683e9b6b0" - integrity sha512-c83qWb22rNRuB0UaVCI0uRPNRr8Z0FWnEIvT47jiHAmOIUHbBOg5XvV7pM5x+rKn9HRpjxquDbXYSXr3fAKFcw== +"@pnpm/npm-conf@^3.0.2": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@pnpm/npm-conf/-/npm-conf-3.0.3.tgz#17b59982126c86294a8d248aa1d7b185f2df6484" + integrity sha512-//0sR/cow/s4ICQaYoAobOl4aU8cjU6x/V24V7XkKotb9+O+3zySIYp146vpaobYHnxa4pZX8NkV54Z5AwbDKA== dependencies: "@pnpm/config.env-replace" "^1.1.0" "@pnpm/network.ca-file" "^1.0.1" @@ -2282,6 +2844,88 @@ resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.8.tgz#6b79032e760a0899cd4204710beede972a3a185f" integrity sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A== +"@rspack/binding-darwin-arm64@1.7.12": + version "1.7.12" + resolved "https://registry.yarnpkg.com/@rspack/binding-darwin-arm64/-/binding-darwin-arm64-1.7.12.tgz#e6e10e7ff15c2254d6cbe9125a747ada880a34f3" + integrity sha512-rbFprJaJiqrmfy8SHth8EsoRS0wg4bXcucwj9NiMzpGFq14Opw8c04iQ6H9BECYzgmN0PKZ9rh41LdVvhdZe4A== + +"@rspack/binding-darwin-x64@1.7.12": + version "1.7.12" + resolved "https://registry.yarnpkg.com/@rspack/binding-darwin-x64/-/binding-darwin-x64-1.7.12.tgz#fe90b64228eb49612e4932049325f52a4ddcfd28" + integrity sha512-jnOp+/UXOJa9xqUb8KXH03sysoO2e4Ij6tw6MqDdmdj8n/A8PQENRPUbW9AwXpPtVDJPus9r4fi7b3+6e4B8Hg== + +"@rspack/binding-linux-arm64-gnu@1.7.12": + version "1.7.12" + resolved "https://registry.yarnpkg.com/@rspack/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.7.12.tgz#61d63a0fcb9b4eb25b9d68e1f897c8e2619a8a5a" + integrity sha512-C8owWG+yvo7X0oVLIXetkoJhIFBP1LYNcAQqtgLmJnQLQDklGuP83dKC+zISGQWpjawHfZ1ER96vLgoTrxKZdw== + +"@rspack/binding-linux-arm64-musl@1.7.12": + version "1.7.12" + resolved "https://registry.yarnpkg.com/@rspack/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.7.12.tgz#fd5157890b1250937bb98332dcbb35ff2d7aafd3" + integrity sha512-i51WWI64aRpsfSki6rN0aepPqXkVfS+vZM7+4bWDcmnhUmdMvhIPcYg0QRk3DtyJnu33jqNLM0WHY78k00NyfA== + +"@rspack/binding-linux-x64-gnu@1.7.12": + version "1.7.12" + resolved "https://registry.yarnpkg.com/@rspack/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.7.12.tgz#a8c963c47a043069b154c704d87bf6a658772ac7" + integrity sha512-MSos0FuPEefqo9V92ULd5hggKG29EkSNg1zDcypy0OkpsKh5pfjVxTLYFXgTcVyFoUQQbdG8zFBzYbwmJ8V4ew== + +"@rspack/binding-linux-x64-musl@1.7.12": + version "1.7.12" + resolved "https://registry.yarnpkg.com/@rspack/binding-linux-x64-musl/-/binding-linux-x64-musl-1.7.12.tgz#1e95af2b152a0833272c26c3473cfa60832ef8b0" + integrity sha512-JcAMVKXOnjfpC3coWjCFPWD3Yl8RBw6a+IXQQ8mfRlHaHMIiOv8IfZqx15XRxMUn49CtP7Z0Na8iiAg2aKrcfw== + +"@rspack/binding-wasm32-wasi@1.7.12": + version "1.7.12" + resolved "https://registry.yarnpkg.com/@rspack/binding-wasm32-wasi/-/binding-wasm32-wasi-1.7.12.tgz#37a10f322e82cbd51114e8a3182f46c6af101a20" + integrity sha512-n+ZqP6ZMc0nhOgvadg5VhEs9ojtbES80AcWeFnmGkbzIszvGSO63GKNiRkXtjJ9KFuRzytbbmsCqkUVH+Tywxg== + dependencies: + "@napi-rs/wasm-runtime" "1.0.7" + +"@rspack/binding-win32-arm64-msvc@1.7.12": + version "1.7.12" + resolved "https://registry.yarnpkg.com/@rspack/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.7.12.tgz#77f648ee1cb717c50fdd02126a528b4960654116" + integrity sha512-8+h5fYDXYdmugbdfZ+D1y8IQ3rv2EhSfyGP7vBe+bjNyaMa4jWrpucmZbtxojUL1AzaeuHbvMdj9UO/gelk/+g== + +"@rspack/binding-win32-ia32-msvc@1.7.12": + version "1.7.12" + resolved "https://registry.yarnpkg.com/@rspack/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.7.12.tgz#9f7cbb26a9c8d9a1cc15d2059de21172b1623c41" + integrity sha512-cDMGwTRSa2p9fNBVe1wTRkF2AEXZ9ARWW36QeC5CkLaI0Ezz8lvhF2+CSOPnhaQ1O1qtn0L0SF+lFnrY+I7xGQ== + +"@rspack/binding-win32-x64-msvc@1.7.12": + version "1.7.12" + resolved "https://registry.yarnpkg.com/@rspack/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.7.12.tgz#b4c6dceaa63def4aa205d25246c1a5b05d7f36b0" + integrity sha512-wIqFvlgFqrgUyj/6S/FJcvShnkZOmIeXTfqvheLY67MGq8qd8jb1YimQVKAIrmWB3yuJKUFACI3Ag1UBtEedEA== + +"@rspack/binding@1.7.12": + version "1.7.12" + resolved "https://registry.yarnpkg.com/@rspack/binding/-/binding-1.7.12.tgz#8c0b19795f980b0e513855245e689719352c08a4" + integrity sha512-f4HHuLbvuld8Ba4iB/4ibse5XrKxFrgmM3S4P2AOKnPlekAFlBjmltCuaTL/W2ggYvILaVY+YcFXrEH1rrKeQA== + optionalDependencies: + "@rspack/binding-darwin-arm64" "1.7.12" + "@rspack/binding-darwin-x64" "1.7.12" + "@rspack/binding-linux-arm64-gnu" "1.7.12" + "@rspack/binding-linux-arm64-musl" "1.7.12" + "@rspack/binding-linux-x64-gnu" "1.7.12" + "@rspack/binding-linux-x64-musl" "1.7.12" + "@rspack/binding-wasm32-wasi" "1.7.12" + "@rspack/binding-win32-arm64-msvc" "1.7.12" + "@rspack/binding-win32-ia32-msvc" "1.7.12" + "@rspack/binding-win32-x64-msvc" "1.7.12" + +"@rspack/core@^1.7.10": + version "1.7.12" + resolved "https://registry.yarnpkg.com/@rspack/core/-/core-1.7.12.tgz#e2a36bd16a10e10aee5905827064ac4b8a63b321" + integrity sha512-6CwFIHlhRmXfZoMj3v9MZ1SMTPBn+cHVXeMIeaGp5sufqinKsISbsqHu6ZMJu2wDSmZLdmQJX6zLxkhcAUlhkQ== + dependencies: + "@module-federation/runtime-tools" "0.22.0" + "@rspack/binding" "1.7.12" + "@rspack/lite-tapable" "1.1.0" + +"@rspack/lite-tapable@1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@rspack/lite-tapable/-/lite-tapable-1.1.0.tgz#3cfdafeed01078e116bd4f191b684c8b484de425" + integrity sha512-E2B0JhYFmVAwdDiG14+DW0Di4Ze4Jg10Pc4/lILUrd5DRCaklduz2OvJ5HYQ6G+hd+WTzqQb3QnDNfK4yvAFYw== + "@sideway/address@^4.1.5": version "4.1.5" resolved "https://registry.yarnpkg.com/@sideway/address/-/address-4.1.5.tgz#4bc149a0076623ced99ca8208ba780d65a99b9d5" @@ -2300,9 +2944,9 @@ integrity sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ== "@sinclair/typebox@^0.27.8": - version "0.27.8" - resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e" - integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== + version "0.27.12" + resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.12.tgz#0cacd3cff047a32936b1ace47ea7c86eaab60a7f" + integrity sha512-hhyNJ+nbR6ZR7pToHvllEFun9TL0sbL+tk/ON75lo+Xas054uez98qRbsuNt7MBCyZKK4+8Yli/OAGZhmfBZ/g== "@sindresorhus/is@^4.6.0": version "4.6.0" @@ -2429,6 +3073,179 @@ "@svgr/plugin-jsx" "8.1.0" "@svgr/plugin-svgo" "8.1.0" +"@swc/core-darwin-arm64@1.16.2": + version "1.16.2" + resolved "https://registry.yarnpkg.com/@swc/core-darwin-arm64/-/core-darwin-arm64-1.16.2.tgz#b180d8647923c75e5aabbf4ea6e543d113aa3c79" + integrity sha512-i/j0HNbnn79qnTVPicvay92Nark8fW8NQqn1e2mGERjUXNpBV0+SwQxlRpk2zBhn6laJ8PDI6Kn1nHZhnz3LCA== + +"@swc/core-darwin-x64@1.16.2": + version "1.16.2" + resolved "https://registry.yarnpkg.com/@swc/core-darwin-x64/-/core-darwin-x64-1.16.2.tgz#ae8286ddd5a6f1b0f1c540e3338682fed7ceb2ab" + integrity sha512-HrwqHyEyHVXO3qTk8EkNK7/b6sOZSEoNh+pot6RdE5x0LbNqfo8LtJUvi3UTXr+5ja/o5HbJdW80eCXo+NjbiA== + +"@swc/core-linux-arm-gnueabihf@1.16.2": + version "1.16.2" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.16.2.tgz#9879d6eb91d3663dfcae557cde866642b21b7590" + integrity sha512-MdXi83Z/gGp1LIrg+h7HKxiul/z/Bty/ZJSvYAFqDl9zteC1XLSAZdScquKtXPp50rdyXqritTDCqQBhwVfZKA== + +"@swc/core-linux-arm64-gnu@1.16.2": + version "1.16.2" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.16.2.tgz#9684df59917e4b0de8f528f04cf7f6e7526ca7b1" + integrity sha512-/jcTmK6Ktz3owM3YtiKvjofV6p3VpHnYzTIrOGwDIOsDigRAAVuZ8east33wYO/7UTdKYFlyHNnJNT0WJqOA3Q== + +"@swc/core-linux-arm64-musl@1.16.2": + version "1.16.2" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.16.2.tgz#36b59ed1a46795755e6d083e6693753c5ea1e7d0" + integrity sha512-4gFarKaFnlJTSlJYKmMhV4u+3YE4uYfiydpBoYjmgQhCf9lAieOq+WilZaK9vVSHeqLuQpTEiGULZqAdsRX5Dw== + +"@swc/core-linux-ppc64-gnu@1.16.2": + version "1.16.2" + resolved "https://registry.yarnpkg.com/@swc/core-linux-ppc64-gnu/-/core-linux-ppc64-gnu-1.16.2.tgz#b0f648e760031e4674e0d07eb4991dfb468d21ee" + integrity sha512-syqSLGd6KlZ1PciNzs6bIUlhOuFztZufebOHaERjc4N4SqNZxyqYd4I+jj/EfOYnpe0kNjccn9HJLN1p5dz3+w== + +"@swc/core-linux-s390x-gnu@1.16.2": + version "1.16.2" + resolved "https://registry.yarnpkg.com/@swc/core-linux-s390x-gnu/-/core-linux-s390x-gnu-1.16.2.tgz#7757e4999f4e236a8bb05bd04367574ce926d4cc" + integrity sha512-ZBBLK+ewGyXLzWeMS7wbKtWBdnif6etn7xvPY/iOfbdsjX/+bgkp1pQt2lWF2wlu2hXYZuhJ/tHZE/QR8/apzg== + +"@swc/core-linux-x64-gnu@1.16.2": + version "1.16.2" + resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.16.2.tgz#a25271e8199c46e54f1042c9d98fbf38fdb4736c" + integrity sha512-LyHJgxCA4Tje0ysBMbEb0tt/ie8kgUKoFE3JAKFhpevmTmhYEoC0H9s47WuDsqiFckF1ITUguZIXJG6K5e0dvg== + +"@swc/core-linux-x64-musl@1.16.2": + version "1.16.2" + resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.16.2.tgz#afc4e5f5e519e4e2ca75a560496fbc6b5164718d" + integrity sha512-PghXJlVM1cgtLfNUR1vxFo1z+PDRAe8cWAJlZZ7spmeiN7BospGXg/MHUg7oNSgwSX7Zo//YKv9P5yD9apsFJQ== + +"@swc/core-win32-arm64-msvc@1.16.2": + version "1.16.2" + resolved "https://registry.yarnpkg.com/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.16.2.tgz#98b936a9cf2faad87c92c979161f17f22c55b742" + integrity sha512-StTOSefYBxemvNYYUI3UmO1a8y+hSPjjfHogC2TEHL+Z1PlEBim/XtLas5rS04jAzT9RrNmbtX911SZ42H9jSQ== + +"@swc/core-win32-ia32-msvc@1.16.2": + version "1.16.2" + resolved "https://registry.yarnpkg.com/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.16.2.tgz#2e30f6a8f78b0c79268e6d39f0ae3b378919449c" + integrity sha512-fycER209DYIzsibpTMC+chND05OfOjgztWL9U8OE6/uUlsOUZH3eh98isBLEnOymYUhlJLEt5++W1+KL/FOh5Q== + +"@swc/core-win32-x64-msvc@1.16.2": + version "1.16.2" + resolved "https://registry.yarnpkg.com/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.16.2.tgz#a25e080ed09770e68c1dc5a2a7e973a01dc40b2f" + integrity sha512-cSd1z6ivSrJPVr+moVwOHWjeKy6TpO4/Shwcv5KCrKYXCccxwh4pRy1C3fDioNx2PF1jPZWHKZjtXt+Be9VbaQ== + +"@swc/core@^1.15.40": + version "1.16.2" + resolved "https://registry.yarnpkg.com/@swc/core/-/core-1.16.2.tgz#6cc0c7f27938bea7208467a18ab518fa23b78367" + integrity sha512-95I4kiSMeveI/Mhi+tE4fiWcWLUMfzfKrk0jtr8LRMqHgOgq+xHS+zExkDqoO4b5OeeuXHMWVdD5MeP3X6sULw== + dependencies: + "@swc/counter" "^0.1.3" + "@swc/types" "^0.1.28" + optionalDependencies: + "@swc/core-darwin-arm64" "1.16.2" + "@swc/core-darwin-x64" "1.16.2" + "@swc/core-linux-arm-gnueabihf" "1.16.2" + "@swc/core-linux-arm64-gnu" "1.16.2" + "@swc/core-linux-arm64-musl" "1.16.2" + "@swc/core-linux-ppc64-gnu" "1.16.2" + "@swc/core-linux-s390x-gnu" "1.16.2" + "@swc/core-linux-x64-gnu" "1.16.2" + "@swc/core-linux-x64-musl" "1.16.2" + "@swc/core-win32-arm64-msvc" "1.16.2" + "@swc/core-win32-ia32-msvc" "1.16.2" + "@swc/core-win32-x64-msvc" "1.16.2" + +"@swc/counter@^0.1.3": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@swc/counter/-/counter-0.1.3.tgz#cc7463bd02949611c6329596fccd2b0ec782b0e9" + integrity sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ== + +"@swc/html-darwin-arm64@1.16.2": + version "1.16.2" + resolved "https://registry.yarnpkg.com/@swc/html-darwin-arm64/-/html-darwin-arm64-1.16.2.tgz#dfe45d70266262a59aaaa0d93740b6161803f192" + integrity sha512-SNBUxkxLBXD0ATwnOG1rF8mpSrRtFDfqWnEUmbm/g4KwmCt7NuHHv9YYqA3lqfq90Ucc+Xlk7afx8KAW/utz4A== + +"@swc/html-darwin-x64@1.16.2": + version "1.16.2" + resolved "https://registry.yarnpkg.com/@swc/html-darwin-x64/-/html-darwin-x64-1.16.2.tgz#72066bda0d843c024dd5230aa013445d10037cde" + integrity sha512-WVBgn6yrBPMZu+DL95/XGAXYcgd1nhd67Ml1UjMtFoFMVKY+VRpCq8JpTZTMXhWbVoRENUHk+3PHu0nNjlE/Fg== + +"@swc/html-linux-arm-gnueabihf@1.16.2": + version "1.16.2" + resolved "https://registry.yarnpkg.com/@swc/html-linux-arm-gnueabihf/-/html-linux-arm-gnueabihf-1.16.2.tgz#efa7dd85b03b941ac173ae2870355f9721993905" + integrity sha512-V9F/Akd2TXrf5nUhdLgdy3FoVFxQbw8pA2AOyqnEOa2Mbm1R7DZJJ0GdShEMcoyMyMDB9r/4pWuWfxNtP4mFHA== + +"@swc/html-linux-arm64-gnu@1.16.2": + version "1.16.2" + resolved "https://registry.yarnpkg.com/@swc/html-linux-arm64-gnu/-/html-linux-arm64-gnu-1.16.2.tgz#4b6a02b42a40463e9ed9a96e0c42b7095b244f48" + integrity sha512-jonZVtHc6BesMjC/muUEJGzE1L2kVdgiPVuHc7CL79MrUm0Hjf8LS4Wmtjqe2bLTfRcaMfaYl/60ZcRXHCaYSQ== + +"@swc/html-linux-arm64-musl@1.16.2": + version "1.16.2" + resolved "https://registry.yarnpkg.com/@swc/html-linux-arm64-musl/-/html-linux-arm64-musl-1.16.2.tgz#0334e071cb8a01e0423fe7da27204b71f1afed66" + integrity sha512-dvki9/sgacHk9ouORmnIok5FbpeE9zUE8yqGGhL1kitNJi6/TKzfnMOpRxSxeDk1/ccvJTAdjRGDIGkT45+b3Q== + +"@swc/html-linux-ppc64-gnu@1.16.2": + version "1.16.2" + resolved "https://registry.yarnpkg.com/@swc/html-linux-ppc64-gnu/-/html-linux-ppc64-gnu-1.16.2.tgz#6c0d7293a1f7f7631e975c767755eb5236769193" + integrity sha512-6m0vVWHl9MW7cmWKVgKlFW6yhRv0uahMEaDxNIvXrPC3LdbbiiYZui+ryhyQGIYeVps3OMujzUjc0GihNz/afQ== + +"@swc/html-linux-s390x-gnu@1.16.2": + version "1.16.2" + resolved "https://registry.yarnpkg.com/@swc/html-linux-s390x-gnu/-/html-linux-s390x-gnu-1.16.2.tgz#853018d7b57377e2f3b23d369a1571862c34d2b9" + integrity sha512-TOlz6wgKyZjg4THJsNZfDz/rAMO+rBa0s2eewTeHEfuJhI+jGu7H6Co6bdbMpN3oyDvTMG7N1f1ktSbkE0erAg== + +"@swc/html-linux-x64-gnu@1.16.2": + version "1.16.2" + resolved "https://registry.yarnpkg.com/@swc/html-linux-x64-gnu/-/html-linux-x64-gnu-1.16.2.tgz#a347921e256f6ecb8847956bbacd4a23e1476adb" + integrity sha512-5EduoVpsnuAAkG9BW8COxcIKAe5swgNAEo+BVkAJCOy1ZMZm0krQYBdvlaDCsGGE9yLDKVPm7rpYIi7vTTZTbA== + +"@swc/html-linux-x64-musl@1.16.2": + version "1.16.2" + resolved "https://registry.yarnpkg.com/@swc/html-linux-x64-musl/-/html-linux-x64-musl-1.16.2.tgz#ebfbbdb05f2f991a34bc500dce0ca10bfbcdfc3b" + integrity sha512-c0Z84dvBd0oh1ZcBHnM18itmvJFLbCZBKFF2lEDHsGBSLQ/1sPbggEKsVO4KgWkkhwQV2l9AB4jnsw1HrwZJCg== + +"@swc/html-win32-arm64-msvc@1.16.2": + version "1.16.2" + resolved "https://registry.yarnpkg.com/@swc/html-win32-arm64-msvc/-/html-win32-arm64-msvc-1.16.2.tgz#69207d99cd80e55fe1ea722c8c8d5174b3d3cd2a" + integrity sha512-Aq7V2B5gS23X59DzV2z892c4NBHYtJbwhvsCjJN1MBMx723htjgNE9KVIJp9dQaJBr2PrNfb/u3QFwnWV2tAoQ== + +"@swc/html-win32-ia32-msvc@1.16.2": + version "1.16.2" + resolved "https://registry.yarnpkg.com/@swc/html-win32-ia32-msvc/-/html-win32-ia32-msvc-1.16.2.tgz#9473a17f22c65ec20059533bd8cc78b32c82a711" + integrity sha512-9gslPcsfXxKvAZtOvDkxGuEbM7lqBrONzLAyRsyUtw8KxFcSYkGIO48RDTstGWOkgTgKjjAq/WWqt9qr/NcE3A== + +"@swc/html-win32-x64-msvc@1.16.2": + version "1.16.2" + resolved "https://registry.yarnpkg.com/@swc/html-win32-x64-msvc/-/html-win32-x64-msvc-1.16.2.tgz#7c7aeaa21b8848a765be2d4f7ee2ee3fecfd0f52" + integrity sha512-Kdb4VdC8FyF5s1MQaFUNeASLckHECrb/oYy/6OCtU+hbgxQ/o/JCgE4uCe8YAg0LCWSOjhx73PCZDGwPf1TpKw== + +"@swc/html@^1.15.40": + version "1.16.2" + resolved "https://registry.yarnpkg.com/@swc/html/-/html-1.16.2.tgz#91ee34374e4c926c6c8a8f43561688192b8a1725" + integrity sha512-RmWH8m5dePWDFpHpmFKquZCRe5SyD/Sb0FBPxWcWv/tsjtlJl6oHeaxBsTL2edvaHuW385Fy5nPuTjDD/a+GEA== + dependencies: + "@swc/counter" "^0.1.3" + optionalDependencies: + "@swc/html-darwin-arm64" "1.16.2" + "@swc/html-darwin-x64" "1.16.2" + "@swc/html-linux-arm-gnueabihf" "1.16.2" + "@swc/html-linux-arm64-gnu" "1.16.2" + "@swc/html-linux-arm64-musl" "1.16.2" + "@swc/html-linux-ppc64-gnu" "1.16.2" + "@swc/html-linux-s390x-gnu" "1.16.2" + "@swc/html-linux-x64-gnu" "1.16.2" + "@swc/html-linux-x64-musl" "1.16.2" + "@swc/html-win32-arm64-msvc" "1.16.2" + "@swc/html-win32-ia32-msvc" "1.16.2" + "@swc/html-win32-x64-msvc" "1.16.2" + +"@swc/types@^0.1.28": + version "0.1.28" + resolved "https://registry.yarnpkg.com/@swc/types/-/types-0.1.28.tgz#e3cd892383fba3b8904c40518bbe1265a50753f2" + integrity sha512-V6Mnml8v09QALx6K0elJ7o9K/MkVDtW3t6L+7Ou/JcWtb3xwId2AH4FeOceySd2JaO87IMw4+6vSZxLm34LPbw== + dependencies: + "@swc/counter" "^0.1.3" + "@szmarczak/http-timer@^5.0.1": version "5.0.1" resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-5.0.1.tgz#c7c1bf1141cdd4751b0399c8fc7b8b664cd5be3a" @@ -2436,10 +3253,12 @@ dependencies: defer-to-connect "^2.0.1" -"@trysound/sax@0.2.0": - version "0.2.0" - resolved "https://registry.yarnpkg.com/@trysound/sax/-/sax-0.2.0.tgz#cccaab758af56761eb7bf37af6f03f326dd798ad" - integrity sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA== +"@tybys/wasm-util@^0.10.1": + version "0.10.4" + resolved "https://registry.yarnpkg.com/@tybys/wasm-util/-/wasm-util-0.10.4.tgz#3e85ecb266f9d1722250e89bc69528615720b154" + integrity sha512-W3c4gRigFS0T/Ma4qIYF3GDAc5AQdHb1yL5znJT1Zv1YaD9Kitx656wBjvr19qbiosmZT8lWDM5BEMynUqX65A== + dependencies: + tslib "^2.4.0" "@types/body-parser@*": version "1.19.6" @@ -2449,14 +3268,14 @@ "@types/connect" "*" "@types/node" "*" -"@types/bonjour@^3.5.9": +"@types/bonjour@^3.5.13": version "3.5.13" resolved "https://registry.yarnpkg.com/@types/bonjour/-/bonjour-3.5.13.tgz#adf90ce1a105e81dd1f9c61fdc5afda1bfb92956" integrity sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ== dependencies: "@types/node" "*" -"@types/connect-history-api-fallback@^1.3.5": +"@types/connect-history-api-fallback@^1.5.4": version "1.5.4" resolved "https://registry.yarnpkg.com/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz#7de71645a103056b48ac3ce07b3520b819c1d5b3" integrity sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw== @@ -2471,28 +3290,222 @@ dependencies: "@types/node" "*" -"@types/debug@^4.0.0": - version "4.1.12" - resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.12.tgz#a155f21690871953410df4b6b6f53187f0500917" - integrity sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ== +"@types/d3-array@*": + version "3.2.2" + resolved "https://registry.yarnpkg.com/@types/d3-array/-/d3-array-3.2.2.tgz#e02151464d02d4a1b44646d0fcdb93faf88fde8c" + integrity sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw== + +"@types/d3-axis@*": + version "3.0.6" + resolved "https://registry.yarnpkg.com/@types/d3-axis/-/d3-axis-3.0.6.tgz#e760e5765b8188b1defa32bc8bb6062f81e4c795" + integrity sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw== dependencies: - "@types/ms" "*" + "@types/d3-selection" "*" -"@types/eslint-scope@^3.7.7": - version "3.7.7" - resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.7.tgz#3108bd5f18b0cdb277c867b3dd449c9ed7079ac5" - integrity sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg== +"@types/d3-brush@*": + version "3.0.6" + resolved "https://registry.yarnpkg.com/@types/d3-brush/-/d3-brush-3.0.6.tgz#c2f4362b045d472e1b186cdbec329ba52bdaee6c" + integrity sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A== dependencies: - "@types/eslint" "*" - "@types/estree" "*" + "@types/d3-selection" "*" + +"@types/d3-chord@*": + version "3.0.6" + resolved "https://registry.yarnpkg.com/@types/d3-chord/-/d3-chord-3.0.6.tgz#1706ca40cf7ea59a0add8f4456efff8f8775793d" + integrity sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg== -"@types/eslint@*": - version "9.6.1" - resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-9.6.1.tgz#d5795ad732ce81715f27f75da913004a56751584" - integrity sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag== +"@types/d3-color@*": + version "3.1.3" + resolved "https://registry.yarnpkg.com/@types/d3-color/-/d3-color-3.1.3.tgz#368c961a18de721da8200e80bf3943fb53136af2" + integrity sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A== + +"@types/d3-contour@*": + version "3.0.6" + resolved "https://registry.yarnpkg.com/@types/d3-contour/-/d3-contour-3.0.6.tgz#9ada3fa9c4d00e3a5093fed0356c7ab929604231" + integrity sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg== dependencies: - "@types/estree" "*" - "@types/json-schema" "*" + "@types/d3-array" "*" + "@types/geojson" "*" + +"@types/d3-delaunay@*": + version "6.0.4" + resolved "https://registry.yarnpkg.com/@types/d3-delaunay/-/d3-delaunay-6.0.4.tgz#185c1a80cc807fdda2a3fe960f7c11c4a27952e1" + integrity sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw== + +"@types/d3-dispatch@*": + version "3.0.7" + resolved "https://registry.yarnpkg.com/@types/d3-dispatch/-/d3-dispatch-3.0.7.tgz#ef004d8a128046cfce434d17182f834e44ef95b2" + integrity sha512-5o9OIAdKkhN1QItV2oqaE5KMIiXAvDWBDPrD85e58Qlz1c1kI/J0NcqbEG88CoTwJrYe7ntUCVfeUl2UJKbWgA== + +"@types/d3-drag@*": + version "3.0.7" + resolved "https://registry.yarnpkg.com/@types/d3-drag/-/d3-drag-3.0.7.tgz#b13aba8b2442b4068c9a9e6d1d82f8bcea77fc02" + integrity sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ== + dependencies: + "@types/d3-selection" "*" + +"@types/d3-dsv@*": + version "3.0.7" + resolved "https://registry.yarnpkg.com/@types/d3-dsv/-/d3-dsv-3.0.7.tgz#0a351f996dc99b37f4fa58b492c2d1c04e3dac17" + integrity sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g== + +"@types/d3-ease@*": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@types/d3-ease/-/d3-ease-3.0.2.tgz#e28db1bfbfa617076f7770dd1d9a48eaa3b6c51b" + integrity sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA== + +"@types/d3-fetch@*": + version "3.0.7" + resolved "https://registry.yarnpkg.com/@types/d3-fetch/-/d3-fetch-3.0.7.tgz#c04a2b4f23181aa376f30af0283dbc7b3b569980" + integrity sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA== + dependencies: + "@types/d3-dsv" "*" + +"@types/d3-force@*": + version "3.0.10" + resolved "https://registry.yarnpkg.com/@types/d3-force/-/d3-force-3.0.10.tgz#6dc8fc6e1f35704f3b057090beeeb7ac674bff1a" + integrity sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw== + +"@types/d3-format@*": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@types/d3-format/-/d3-format-3.0.4.tgz#b1e4465644ddb3fdf3a263febb240a6cd616de90" + integrity sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g== + +"@types/d3-geo@*": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@types/d3-geo/-/d3-geo-3.1.1.tgz#9e283af179601c549581600b3fec25941911329d" + integrity sha512-65Emv9fQiQQqphLlRkuQ5ypPsOmWPhtBGCMv61JDPEPMvsx+gzhGf74yw1a78xFKPj6zw4AgQICJoQv0vK9M2w== + dependencies: + "@types/geojson" "*" + +"@types/d3-hierarchy@*": + version "3.1.7" + resolved "https://registry.yarnpkg.com/@types/d3-hierarchy/-/d3-hierarchy-3.1.7.tgz#6023fb3b2d463229f2d680f9ac4b47466f71f17b" + integrity sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg== + +"@types/d3-interpolate@*": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz#412b90e84870285f2ff8a846c6eb60344f12a41c" + integrity sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA== + dependencies: + "@types/d3-color" "*" + +"@types/d3-path@*": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@types/d3-path/-/d3-path-3.1.1.tgz#f632b380c3aca1dba8e34aa049bcd6a4af23df8a" + integrity sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg== + +"@types/d3-polygon@*": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@types/d3-polygon/-/d3-polygon-3.0.2.tgz#dfae54a6d35d19e76ac9565bcb32a8e54693189c" + integrity sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA== + +"@types/d3-quadtree@*": + version "3.0.6" + resolved "https://registry.yarnpkg.com/@types/d3-quadtree/-/d3-quadtree-3.0.6.tgz#d4740b0fe35b1c58b66e1488f4e7ed02952f570f" + integrity sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg== + +"@types/d3-random@*": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@types/d3-random/-/d3-random-3.0.4.tgz#6bd3683b8332fc0f01e7059b7636bc5c7ede7337" + integrity sha512-UHYId5WTCx4L4YNel7NU00XUXXgvgpgZOvp10PuvsQENjMDXhh2RyFc0KBjO7B45ne4Ha1yVH7ii0vnzKkuzWA== + +"@types/d3-scale-chromatic@*": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz#dc6d4f9a98376f18ea50bad6c39537f1b5463c39" + integrity sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ== + +"@types/d3-scale@*": + version "4.0.9" + resolved "https://registry.yarnpkg.com/@types/d3-scale/-/d3-scale-4.0.9.tgz#57a2f707242e6fe1de81ad7bfcccaaf606179afb" + integrity sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw== + dependencies: + "@types/d3-time" "*" + +"@types/d3-selection@*": + version "3.0.11" + resolved "https://registry.yarnpkg.com/@types/d3-selection/-/d3-selection-3.0.11.tgz#bd7a45fc0a8c3167a631675e61bc2ca2b058d4a3" + integrity sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w== + +"@types/d3-shape@*": + version "3.2.0" + resolved "https://registry.yarnpkg.com/@types/d3-shape/-/d3-shape-3.2.0.tgz#66ff342011dc243c6c20e6b899523d148aca412d" + integrity sha512-kVd74ta9eof3eJOvbNd1vGKS/XERRyQbT26Og63hIsvDO84cjD5gEOhsXf26w3FSoNlPVz84DOFcKv/oou+fMw== + dependencies: + "@types/d3-path" "*" + +"@types/d3-time-format@*": + version "4.0.3" + resolved "https://registry.yarnpkg.com/@types/d3-time-format/-/d3-time-format-4.0.3.tgz#d6bc1e6b6a7db69cccfbbdd4c34b70632d9e9db2" + integrity sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg== + +"@types/d3-time@*": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@types/d3-time/-/d3-time-3.0.4.tgz#8472feecd639691450dd8000eb33edd444e1323f" + integrity sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g== + +"@types/d3-timer@*": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@types/d3-timer/-/d3-timer-3.0.2.tgz#70bbda77dc23aa727413e22e214afa3f0e852f70" + integrity sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw== + +"@types/d3-transition@*": + version "3.0.9" + resolved "https://registry.yarnpkg.com/@types/d3-transition/-/d3-transition-3.0.9.tgz#1136bc57e9ddb3c390dccc9b5ff3b7d2b8d94706" + integrity sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg== + dependencies: + "@types/d3-selection" "*" + +"@types/d3-zoom@*": + version "3.0.8" + resolved "https://registry.yarnpkg.com/@types/d3-zoom/-/d3-zoom-3.0.8.tgz#dccb32d1c56b1e1c6e0f1180d994896f038bc40b" + integrity sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw== + dependencies: + "@types/d3-interpolate" "*" + "@types/d3-selection" "*" + +"@types/d3@^7.4.3": + version "7.4.3" + resolved "https://registry.yarnpkg.com/@types/d3/-/d3-7.4.3.tgz#d4550a85d08f4978faf0a4c36b848c61eaac07e2" + integrity sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww== + dependencies: + "@types/d3-array" "*" + "@types/d3-axis" "*" + "@types/d3-brush" "*" + "@types/d3-chord" "*" + "@types/d3-color" "*" + "@types/d3-contour" "*" + "@types/d3-delaunay" "*" + "@types/d3-dispatch" "*" + "@types/d3-drag" "*" + "@types/d3-dsv" "*" + "@types/d3-ease" "*" + "@types/d3-fetch" "*" + "@types/d3-force" "*" + "@types/d3-format" "*" + "@types/d3-geo" "*" + "@types/d3-hierarchy" "*" + "@types/d3-interpolate" "*" + "@types/d3-path" "*" + "@types/d3-polygon" "*" + "@types/d3-quadtree" "*" + "@types/d3-random" "*" + "@types/d3-scale" "*" + "@types/d3-scale-chromatic" "*" + "@types/d3-selection" "*" + "@types/d3-shape" "*" + "@types/d3-time" "*" + "@types/d3-time-format" "*" + "@types/d3-timer" "*" + "@types/d3-transition" "*" + "@types/d3-zoom" "*" + +"@types/debug@^4.0.0": + version "4.1.13" + resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.13.tgz#22d1cc9d542d3593caea764f974306ab36286ee7" + integrity sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw== + dependencies: + "@types/ms" "*" "@types/estree-jsx@^1.0.0": version "1.0.5" @@ -2502,24 +3515,24 @@ "@types/estree" "*" "@types/estree@*", "@types/estree@^1.0.0", "@types/estree@^1.0.8": - version "1.0.8" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.8.tgz#958b91c991b1867ced318bedea0e215ee050726e" - integrity sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w== + version "1.0.9" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.9.tgz#cf3f0e876d7bee15a93ab925b82bf570a3904a24" + integrity sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg== "@types/express-serve-static-core@*", "@types/express-serve-static-core@^5.0.0": - version "5.0.7" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-5.0.7.tgz#2fa94879c9d46b11a5df4c74ac75befd6b283de6" - integrity sha512-R+33OsgWw7rOhD1emjU7dzCDHucJrgJXMA5PYCzJxVil0dsyx5iBEPHqpPfiKNJQb7lZ1vxwoLR4Z87bBUpeGQ== + version "5.1.3" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-5.1.3.tgz#9d34c88c0c9ee62b9a6e4d9f8ab8d7e29688e6b4" + integrity sha512-dPfW8NFiOF4wOHc7+N/QSxlY9cfSsenewGbAz8C8U/MULPd/YZ27LvJUIlzaXie7e6Ove9YunJGgC9tbHD2cKw== dependencies: "@types/node" "*" "@types/qs" "*" "@types/range-parser" "*" "@types/send" "*" -"@types/express-serve-static-core@^4.17.33": - version "4.19.6" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz#e01324c2a024ff367d92c66f48553ced0ab50267" - integrity sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A== +"@types/express-serve-static-core@^4.17.21", "@types/express-serve-static-core@^4.17.33": + version "4.19.9" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.19.9.tgz#b746a8bb6c389af7a31141397bb539f775b0ae84" + integrity sha512-QP2ESEe/ImWY0HDwNAnK9PvEffUyhLTnWkk7KXzHfyeWAnlrDe1fN77bXl6ia8KT3wPlmA7t9/VPRpnf4Ex9sg== dependencies: "@types/node" "*" "@types/qs" "*" @@ -2527,33 +3540,33 @@ "@types/send" "*" "@types/express@*": - version "5.0.3" - resolved "https://registry.yarnpkg.com/@types/express/-/express-5.0.3.tgz#6c4bc6acddc2e2a587142e1d8be0bce20757e956" - integrity sha512-wGA0NX93b19/dZC1J18tKWVIYWyyF2ZjT9vin/NRu0qzzvfVzWjs04iq2rQ3H65vCTQYlRqs3YHfY7zjdV+9Kw== + version "5.0.6" + resolved "https://registry.yarnpkg.com/@types/express/-/express-5.0.6.tgz#2d724b2c990dcb8c8444063f3580a903f6d500cc" + integrity sha512-sKYVuV7Sv9fbPIt/442koC7+IIwK5olP1KWeD88e/idgoJqDm3JV/YUiPwkoKK92ylff2MGxSz1CSjsXelx0YA== dependencies: "@types/body-parser" "*" "@types/express-serve-static-core" "^5.0.0" - "@types/serve-static" "*" + "@types/serve-static" "^2" -"@types/express@^4.17.13": - version "4.17.23" - resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.23.tgz#35af3193c640bfd4d7fe77191cd0ed411a433bef" - integrity sha512-Crp6WY9aTYP3qPi2wGDo9iUe/rceX01UMhnF1jmwDcKCFM6cx7YhGP/Mpr3y9AASpfHixIG0E6azCcL5OcDHsQ== +"@types/express@^4.17.25": + version "4.17.25" + resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.25.tgz#070c8c73a6fee6936d65c195dbbfb7da5026649b" + integrity sha512-dVd04UKsfpINUnK0yBoYHDF3xu7xVH4BuDotC/xGuycx4CgbP48X/KF/586bcObxT0HENHXEU8Nqtu6NR+eKhw== dependencies: "@types/body-parser" "*" "@types/express-serve-static-core" "^4.17.33" "@types/qs" "*" - "@types/serve-static" "*" + "@types/serve-static" "^1" -"@types/gtag.js@^0.0.12": - version "0.0.12" - resolved "https://registry.yarnpkg.com/@types/gtag.js/-/gtag.js-0.0.12.tgz#095122edca896689bdfcdd73b057e23064d23572" - integrity sha512-YQV9bUsemkzG81Ea295/nF/5GijnD2Af7QhEofh7xu+kvCN6RdodgNwwGWXB5GMI3NoyvQo0odNctoH/qLMIpg== +"@types/geojson@*": + version "7946.0.16" + resolved "https://registry.yarnpkg.com/@types/geojson/-/geojson-7946.0.16.tgz#8ebe53d69efada7044454e3305c19017d97ced2a" + integrity sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg== "@types/hast@^3.0.0": - version "3.0.4" - resolved "https://registry.yarnpkg.com/@types/hast/-/hast-3.0.4.tgz#1d6b39993b82cea6ad783945b0508c25903e15aa" - integrity sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ== + version "3.0.5" + resolved "https://registry.yarnpkg.com/@types/hast/-/hast-3.0.5.tgz#48020de4c0e63492f4ca9db42068c108f68b7f8f" + integrity sha512-rp/ezSWaD1m44dPKICGhiskI13nVr7qTloFwDa/IYkhhf5nzwP+zIQcIJh3WIFSBOy/H1PzB40jPjMDksN4F+g== dependencies: "@types/unist" "*" @@ -2568,9 +3581,9 @@ integrity sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg== "@types/http-cache-semantics@^4.0.2": - version "4.0.4" - resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz#b979ebad3919799c979b17c72621c0bc0a31c6c4" - integrity sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA== + version "4.2.0" + resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz#f6a7788f438cbfde15f29acad46512b4c01913b3" + integrity sha512-L3LgimLHXtGkWikKnsPg0/VFx9OGZaC+eN1u4r+OB1XRqH3meBIAVC2zr1WdMH+RHmnRkqliQAOHNJ/E0j/e0Q== "@types/http-errors@*": version "2.0.5" @@ -2578,9 +3591,9 @@ integrity sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg== "@types/http-proxy@^1.17.8": - version "1.17.16" - resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.16.tgz#dee360707b35b3cc85afcde89ffeebff7d7f9240" - integrity sha512-sdWoUajOB1cd0A8cRRQ1cfyWNbmFKLAqBB89Y8x5iYyG/mkJHc0YUH8pdWBy2omi9qtCpiIgGjuwO0dQST2l5w== + version "1.17.17" + resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.17.tgz#d9e2c4571fe3507343cb210cd41790375e59a533" + integrity sha512-ED6LB+Z1AVylNTu7hdzuBqOgMnvG/ld6wGCG8wFnAzKX5uyW2K3WD52v0gnLCTK/VLpXtKckgWuyScYK6cSPaw== dependencies: "@types/node" "*" @@ -2603,7 +3616,7 @@ dependencies: "@types/istanbul-lib-report" "*" -"@types/json-schema@*", "@types/json-schema@^7.0.15", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": +"@types/json-schema@^7.0.15", "@types/json-schema@^7.0.8": version "7.0.15" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== @@ -2616,9 +3629,9 @@ "@types/unist" "*" "@types/mdx@^2.0.0": - version "2.0.13" - resolved "https://registry.yarnpkg.com/@types/mdx/-/mdx-2.0.13.tgz#68f6877043d377092890ff5b298152b0a21671bd" - integrity sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw== + version "2.0.14" + resolved "https://registry.yarnpkg.com/@types/mdx/-/mdx-2.0.14.tgz#c1e54113265b152021ab0afe0434e3cadd90bfe3" + integrity sha512-T48PeuJtvLosNTPVhfnIp3i/n3a4g4Bad7YCq5k64D4u7NwDrAotikQ+5+sjtUvBmxCMlbo3dVL+C2dP0rWHzg== "@types/mime@^1": version "1.3.5" @@ -2630,19 +3643,12 @@ resolved "https://registry.yarnpkg.com/@types/ms/-/ms-2.1.0.tgz#052aa67a48eccc4309d7f0191b7e41434b90bb78" integrity sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA== -"@types/node-forge@^1.3.0": - version "1.3.14" - resolved "https://registry.yarnpkg.com/@types/node-forge/-/node-forge-1.3.14.tgz#006c2616ccd65550560c2757d8472eb6d3ecea0b" - integrity sha512-mhVF2BnD4BO+jtOp7z1CdzaK4mbuK0LLQYAvdOLqHTavxFNq4zA1EmYkpnFjP8HOUzedfQkRnp0E2ulSAYSzAw== - dependencies: - "@types/node" "*" - "@types/node@*": - version "24.5.2" - resolved "https://registry.yarnpkg.com/@types/node/-/node-24.5.2.tgz#52ceb83f50fe0fcfdfbd2a9fab6db2e9e7ef6446" - integrity sha512-FYxk1I7wPv3K2XBaoyH2cTnocQEu8AOZ60hPbsyukMPLv5/5qr7V1i8PLHdl6Zf87I+xZXFvPCXYjiTFq+YSDQ== + version "26.5.1" + resolved "https://registry.yarnpkg.com/@types/node/-/node-26.5.1.tgz#b19c390e15813f402a94b86e3af9042f792138be" + integrity sha512-CzNm2FezW4VR/LjG6yUdiEgLE/rAQ9Slj5gCu/C2VrdcW7I0ahNZ8DRbHT7zOZ6r3ONgd/bsQIeSaoDGrd1C6g== dependencies: - undici-types "~7.12.0" + undici-types "~8.9.0" "@types/node@^17.0.5": version "17.0.45" @@ -2655,9 +3661,9 @@ integrity sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw== "@types/prismjs@^1.26.0": - version "1.26.5" - resolved "https://registry.yarnpkg.com/@types/prismjs/-/prismjs-1.26.5.tgz#72499abbb4c4ec9982446509d2f14fb8483869d6" - integrity sha512-AUZTa7hQ2KY5L7AmtSiqxlhWxb4ina0yd8hNbl4TWuqnv/pFP0nDMb3YrfSBf4hJVGLh2YEIBfKaBW/9UEl6IQ== + version "1.26.6" + resolved "https://registry.yarnpkg.com/@types/prismjs/-/prismjs-1.26.6.tgz#6ea27c126d645319ae4f7055eda63a9e835c0187" + integrity sha512-vqlvI7qlMvcCBbVe0AKAb4f97//Hy0EBTaiW8AalRnG/xAN5zOiWWyrNqNXeq8+KAuvRewjCVY1+IPxk4RdNYw== "@types/prop-types@^15.7.15": version "15.7.15" @@ -2665,9 +3671,9 @@ integrity sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw== "@types/qs@*": - version "6.14.0" - resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.14.0.tgz#d8b60cecf62f2db0fb68e5e006077b9178b85de5" - integrity sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ== + version "6.15.1" + resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.15.1.tgz#8606884272c63f0db96986bd3548650d8a9388bf" + integrity sha512-GZHUBZR9hckSUhrxmp1nG6NwdpM9fCunJwyThLW1X3AyHgd9IlHb6VANpQQqDr2o/qQp6McZ3y/IA2rVzKzSbw== "@types/range-parser@*": version "1.2.7" @@ -2706,16 +3712,16 @@ integrity sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w== "@types/react@*": - version "19.1.13" - resolved "https://registry.yarnpkg.com/@types/react/-/react-19.1.13.tgz#fc650ffa680d739a25a530f5d7ebe00cdd771883" - integrity sha512-hHkbU/eoO3EG5/MZkuFSKmYqPbSVk5byPFa3e7y/8TybHiLMACgI8seVYlicwk7H5K/rI2px9xrQp/C+AUDTiQ== + version "19.3.0" + resolved "https://registry.yarnpkg.com/@types/react/-/react-19.3.0.tgz#3b3ce8d8c1627fb5ccd4dadd57ef445c5a153b77" + integrity sha512-N0rFCuH9YoxG9/m61l9MfpJKfmLOVU0em7ipIz6TRgSSkvReLB9vL85GB+yr8Bs5leqpvg96JSwF4ZS1s4viQg== dependencies: - csstype "^3.0.2" + csstype "^3.2.2" -"@types/retry@0.12.0": - version "0.12.0" - resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.0.tgz#2b35eccfcee7d38cd72ad99232fbd58bffb3c84d" - integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA== +"@types/retry@0.12.2": + version "0.12.2" + resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.2.tgz#ed279a64fa438bb69f2480eda44937912bb7480a" + integrity sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow== "@types/sax@^1.2.1": version "1.2.7" @@ -2725,36 +3731,56 @@ "@types/node" "*" "@types/send@*": - version "0.17.5" - resolved "https://registry.yarnpkg.com/@types/send/-/send-0.17.5.tgz#d991d4f2b16f2b1ef497131f00a9114290791e74" - integrity sha512-z6F2D3cOStZvuk2SaP6YrwkNO65iTZcwA2ZkSABegdkAh/lf+Aa/YQndZVfmEXT5vgAp6zv06VQ3ejSVjAny4w== + version "1.2.1" + resolved "https://registry.yarnpkg.com/@types/send/-/send-1.2.1.tgz#6a784e45543c18c774c049bff6d3dbaf045c9c74" + integrity sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ== + dependencies: + "@types/node" "*" + +"@types/send@<1": + version "0.17.6" + resolved "https://registry.yarnpkg.com/@types/send/-/send-0.17.6.tgz#aeb5385be62ff58a52cd5459daa509ae91651d25" + integrity sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og== dependencies: "@types/mime" "^1" "@types/node" "*" -"@types/serve-index@^1.9.1": +"@types/serve-index@^1.9.4": version "1.9.4" resolved "https://registry.yarnpkg.com/@types/serve-index/-/serve-index-1.9.4.tgz#e6ae13d5053cb06ed36392110b4f9a49ac4ec898" integrity sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug== dependencies: "@types/express" "*" -"@types/serve-static@*", "@types/serve-static@^1.13.10": - version "1.15.8" - resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.8.tgz#8180c3fbe4a70e8f00b9f70b9ba7f08f35987877" - integrity sha512-roei0UY3LhpOJvjbIP6ZZFngyLKl5dskOtDhxY5THRSpO+ZI+nzJ+m5yUMzGrp89YRa7lvknKkMYjqQFGwA7Sg== +"@types/serve-static@^1", "@types/serve-static@^1.15.5": + version "1.15.10" + resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.10.tgz#768169145a778f8f5dfcb6360aead414a3994fee" + integrity sha512-tRs1dB+g8Itk72rlSI2ZrW6vZg0YrLI81iQSTkMmOqnqCaNr/8Ek4VwWcN5vZgCYWbg/JJSGBlUaYGAOP73qBw== dependencies: "@types/http-errors" "*" "@types/node" "*" - "@types/send" "*" + "@types/send" "<1" -"@types/sockjs@^0.3.33": +"@types/serve-static@^2": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-2.2.0.tgz#d4a447503ead0d1671132d1ab6bd58b805d8de6a" + integrity sha512-8mam4H1NHLtu7nmtalF7eyBH14QyOASmcxHhSfEoRyr0nP/YdoesEtU+uSRvMe96TW/HPTtkoKqQLl53N7UXMQ== + dependencies: + "@types/http-errors" "*" + "@types/node" "*" + +"@types/sockjs@^0.3.36": version "0.3.36" resolved "https://registry.yarnpkg.com/@types/sockjs/-/sockjs-0.3.36.tgz#ce322cf07bcc119d4cbf7f88954f3a3bd0f67535" integrity sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q== dependencies: "@types/node" "*" +"@types/trusted-types@^2.0.7": + version "2.0.7" + resolved "https://registry.yarnpkg.com/@types/trusted-types/-/trusted-types-2.0.7.tgz#baccb07a970b91707df3a3e8ba6896c57ead2d11" + integrity sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw== + "@types/unist@*", "@types/unist@^3.0.0": version "3.0.3" resolved "https://registry.yarnpkg.com/@types/unist/-/unist-3.0.3.tgz#acaab0f919ce69cce629c2d4ed2eb4adc1b6c20c" @@ -2765,7 +3791,7 @@ resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.11.tgz#11af57b127e32487774841f7a4e54eab166d03c4" integrity sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA== -"@types/ws@^8.5.5": +"@types/ws@^8.5.10": version "8.18.1" resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.18.1.tgz#48464e4bf2ddfd17db13d845467f6070ffea4aa9" integrity sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg== @@ -2778,16 +3804,24 @@ integrity sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ== "@types/yargs@^17.0.8": - version "17.0.33" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.33.tgz#8c32303da83eec050a84b3c7ae7b9f922d13e32d" - integrity sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA== + version "17.0.35" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.35.tgz#07013e46aa4d7d7d50a49e15604c1c5340d4eb24" + integrity sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg== dependencies: "@types/yargs-parser" "*" -"@ungap/structured-clone@^1.0.0": - version "1.3.0" - resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.3.0.tgz#d06bbb384ebcf6c505fde1c3d0ed4ddffe0aaff8" - integrity sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g== +"@ungap/structured-clone@^1.0.0", "@ungap/structured-clone@^1.3.1": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.4.0.tgz#5e2e1374c0a30b5a42e8b083523a225c6945f88a" + integrity sha512-1mEZtMKPM09vDmQt5y7YvmN2+DFTP7Tg0EWXdic8/C6VRnpb33e4ghisCIE3WZjsE2N8mf+QV1Zqh7ZFYLWInQ== + +"@upsetjs/venn.js@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@upsetjs/venn.js/-/venn.js-2.0.0.tgz#3be192038cdda927aa4f8b22ab51af82abf47f34" + integrity sha512-WbBhLrooyePuQ1VZxrJjtLvTc4NVfpOyKx0sKqioq9bX1C1m7Jgykkn8gLrtwumBioXIqam8DLxp88Adbue6Hw== + optionalDependencies: + d3-selection "^3.0.0" + d3-transition "^3.0.1" "@webassemblyjs/ast@1.14.1", "@webassemblyjs/ast@^1.14.1": version "1.14.1" @@ -2920,7 +3954,7 @@ resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== -accepts@~1.3.4, accepts@~1.3.8: +accepts@~1.3.8: version "1.3.8" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== @@ -2928,32 +3962,27 @@ accepts@~1.3.4, accepts@~1.3.8: mime-types "~2.1.34" negotiator "0.6.3" -acorn-import-phases@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz#16eb850ba99a056cb7cbfe872ffb8972e18c8bd7" - integrity sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ== - acorn-jsx@^5.0.0: version "5.3.2" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== acorn-walk@^8.0.0: - version "8.3.4" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.4.tgz#794dd169c3977edf4ba4ea47583587c5866236b7" - integrity sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g== + version "8.3.5" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.5.tgz#8a6b8ca8fc5b34685af15dabb44118663c296496" + integrity sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw== dependencies: acorn "^8.11.0" acorn@^8.0.0, acorn@^8.0.4, acorn@^8.11.0, acorn@^8.15.0: - version "8.15.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.15.0.tgz#a360898bc415edaac46c8241f6383975b930b816" - integrity sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg== + version "8.18.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.18.0.tgz#4faf01b2d6d326bfeed97aea1f52220b5f4c1940" + integrity sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ== -address@^1.0.1: - version "1.2.2" - resolved "https://registry.yarnpkg.com/address/-/address-1.2.2.tgz#2b5248dac5485a6390532c6a517fda2e3faac89e" - integrity sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA== +address@^2.0.1: + version "2.0.3" + resolved "https://registry.yarnpkg.com/address/-/address-2.0.3.tgz#e910900615db3d8a20c040d4c710631062fc4ba8" + integrity sha512-XNAb/a6TCqou+TufU8/u11HCu9x1gYvOoxLwtlXgIqmkrYQADVv6ljyW2zwiPhHz9R1gItAWpuDrdJMmrOBFEA== aggregate-error@^3.0.0: version "3.1.0" @@ -2963,10 +3992,10 @@ aggregate-error@^3.0.0: clean-stack "^2.0.0" indent-string "^4.0.0" -ajv-formats@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-2.1.1.tgz#6e669400659eb74973bbf2e33327180a0996b520" - integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== +ajv-formats@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-3.0.1.tgz#3d5dc762bca17679c3c2ea7e90ad6b7532309578" + integrity sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ== dependencies: ajv "^8.0.0" @@ -2983,51 +4012,51 @@ ajv-keywords@^5.1.0: fast-deep-equal "^3.1.3" ajv@^6.12.5: - version "6.12.6" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" - integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + version "6.15.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.15.0.tgz#07e982c74626167aa7a2495c53817892d7139492" + integrity sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw== dependencies: fast-deep-equal "^3.1.1" fast-json-stable-stringify "^2.0.0" json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ajv@^8.0.0, ajv@^8.9.0: - version "8.17.1" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.17.1.tgz#37d9a5c776af6bc92d7f4f9510eba4c0a60d11a6" - integrity sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g== +ajv@^8.0.0, ajv@^8.20.0: + version "8.20.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.20.0.tgz#304b3636add88ba7d936760dd50ece006dea95f9" + integrity sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA== dependencies: fast-deep-equal "^3.1.3" fast-uri "^3.0.1" json-schema-traverse "^1.0.0" require-from-string "^2.0.2" -algoliasearch-helper@^3.22.6: - version "3.26.0" - resolved "https://registry.yarnpkg.com/algoliasearch-helper/-/algoliasearch-helper-3.26.0.tgz#d6e283396a9fc5bf944f365dc3b712570314363f" - integrity sha512-Rv2x3GXleQ3ygwhkhJubhhYGsICmShLAiqtUuJTUkr9uOCOXyF2E71LVT4XDnVffbknv8XgScP4U0Oxtgm+hIw== +algoliasearch-helper@^3.26.0: + version "3.29.3" + resolved "https://registry.yarnpkg.com/algoliasearch-helper/-/algoliasearch-helper-3.29.3.tgz#dc21f119320acbdd5890a21021846b5730d11e03" + integrity sha512-gVOMbbPVrCO3Xs+B+BLAIGFqIQow6qHMTYCEeBqLQB9m4ZmKUqMwkEumlal2iyyezHEd4Y0FvFTLbCRutCutIQ== dependencies: "@algolia/events" "^4.0.1" -algoliasearch@^5.14.2, algoliasearch@^5.17.1: - version "5.37.0" - resolved "https://registry.yarnpkg.com/algoliasearch/-/algoliasearch-5.37.0.tgz#73dc4a09654e6e02b529300018d639706b95b47b" - integrity sha512-y7gau/ZOQDqoInTQp0IwTOjkrHc4Aq4R8JgpmCleFwiLl+PbN2DMWoDUWZnrK8AhNJwT++dn28Bt4NZYNLAmuA== - dependencies: - "@algolia/abtesting" "1.3.0" - "@algolia/client-abtesting" "5.37.0" - "@algolia/client-analytics" "5.37.0" - "@algolia/client-common" "5.37.0" - "@algolia/client-insights" "5.37.0" - "@algolia/client-personalization" "5.37.0" - "@algolia/client-query-suggestions" "5.37.0" - "@algolia/client-search" "5.37.0" - "@algolia/ingestion" "1.37.0" - "@algolia/monitoring" "1.37.0" - "@algolia/recommend" "5.37.0" - "@algolia/requester-browser-xhr" "5.37.0" - "@algolia/requester-fetch" "5.37.0" - "@algolia/requester-node-http" "5.37.0" +algoliasearch@^5.37.0: + version "5.59.0" + resolved "https://registry.yarnpkg.com/algoliasearch/-/algoliasearch-5.59.0.tgz#c4d592b6d99fd0fa9929eaf40077b75824f45a68" + integrity sha512-wUXzaeI7B526W4y1gFg3lcxgDZ67XSgRJIiellYWOas/pLpO7rOtxm9Gr2E/C8aiSDXIgx1q5TdSsvK67Uakqw== + dependencies: + "@algolia/abtesting" "1.25.0" + "@algolia/client-abtesting" "5.59.0" + "@algolia/client-analytics" "5.59.0" + "@algolia/client-common" "5.59.0" + "@algolia/client-insights" "5.59.0" + "@algolia/client-personalization" "5.59.0" + "@algolia/client-query-suggestions" "5.59.0" + "@algolia/client-search" "5.59.0" + "@algolia/ingestion" "1.59.0" + "@algolia/monitoring" "1.59.0" + "@algolia/recommend" "5.59.0" + "@algolia/requester-browser-xhr" "5.59.0" + "@algolia/requester-fetch" "5.59.0" + "@algolia/requester-node-http" "5.59.0" ansi-align@^3.0.1: version "3.0.1" @@ -3036,13 +4065,6 @@ ansi-align@^3.0.1: dependencies: string-width "^4.1.0" -ansi-escapes@^4.3.2: - version "4.3.2" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" - integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== - dependencies: - type-fest "^0.21.3" - ansi-html-community@^0.0.8: version "0.0.8" resolved "https://registry.yarnpkg.com/ansi-html-community/-/ansi-html-community-0.0.8.tgz#69fbc4d6ccbe383f9736934ae34c3f8290f1bf41" @@ -3053,12 +4075,12 @@ ansi-regex@^5.0.1: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== -ansi-regex@^6.0.1: - version "6.2.2" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.2.2.tgz#60216eea464d864597ce2832000738a0589650c1" - integrity sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg== +ansi-regex@^6.2.2: + version "6.3.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.3.0.tgz#247c8e7b70a1a43b10ce14c0226fcbf58e8815d5" + integrity sha512-WpDfL7NO6j7tH88IDBNVdUJxDh9nmCteAVW9dsep846XdwF4naCBK+/tGLX3KJgcpgMRXCFlTM2hKGoK9FsdrQ== -ansi-styles@^4.0.0, ansi-styles@^4.1.0: +ansi-styles@^4.1.0: version "4.3.0" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== @@ -3070,6 +4092,11 @@ ansi-styles@^6.1.0: resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.3.tgz#c044d5dcc521a076413472597a1acb1f103c4041" integrity sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg== +ansis@^3.2.0: + version "3.17.0" + resolved "https://registry.yarnpkg.com/ansis/-/ansis-3.17.0.tgz#fa8d9c2a93fe7d1177e0c17f9eeb562a58a832d7" + integrity sha512-0qWUglt9JEqLFr3w1I1pbrChn1grhaiAR2ocX1PP/flRmxgtwTzPFFFnfIlD6aMOLQZgSuCRlidD70lvx8yhzg== + anymatch@~3.1.2: version "3.1.3" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" @@ -3083,13 +4110,6 @@ arg@^5.0.0: resolved "https://registry.yarnpkg.com/arg/-/arg-5.0.2.tgz#c81433cc427c92c4dcf4865142dbca6f15acd59c" integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg== -argparse@^1.0.7: - version "1.0.10" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" - integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== - dependencies: - sprintf-js "~1.0.2" - argparse@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" @@ -3105,23 +4125,36 @@ array-union@^2.1.0: resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== +asn1js@^3.0.10, asn1js@^3.0.6: + version "3.0.10" + resolved "https://registry.yarnpkg.com/asn1js/-/asn1js-3.0.10.tgz#df26c874c8a8b41ca605efea47b2ad07551013dd" + integrity sha512-S2s3aOytiKdFRdulw2qPE51MzjzVOisppcVv7jVFR+Kw0kxwvFrDcYA0h7Ndqbmj0HkMIXYWaoj7fli8kgx1eg== + dependencies: + pvtsutils "^1.3.6" + pvutils "^1.1.5" + tslib "^2.8.1" + astring@^1.8.0: version "1.9.0" resolved "https://registry.yarnpkg.com/astring/-/astring-1.9.0.tgz#cc73e6062a7eb03e7d19c22d8b0b3451fd9bfeef" integrity sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg== -autoprefixer@^10.4.19, autoprefixer@^10.4.21: - version "10.4.21" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.21.tgz#77189468e7a8ad1d9a37fbc08efc9f480cf0a95d" - integrity sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ== +autoprefixer@^10.4.19, autoprefixer@^10.4.23: + version "10.6.0" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.6.0.tgz#b68112d055f87aff2a2ea58877b510c6847bea27" + integrity sha512-A26d6qs9kqGgkmImIXMYvXTzqb4Qv7AVgpY1NXzr9Y659J8qHHnLOO/zE8ewIGFMprOolAoRAQYDgNryXIJKBw== dependencies: - browserslist "^4.24.4" - caniuse-lite "^1.0.30001702" - fraction.js "^4.3.7" - normalize-range "^0.1.2" + browserslist "^4.28.9" + caniuse-lite "^1.0.30001810" + fraction.js "^5.3.4" picocolors "^1.1.1" postcss-value-parser "^4.2.0" +b4a@^1.6.4, b4a@^1.8.1: + version "1.9.0" + resolved "https://registry.yarnpkg.com/b4a/-/b4a-1.9.0.tgz#6336313b6e76b299c397afa68676ec6ebc788845" + integrity sha512-dpfcF9fDNR6++cthXR67iyhgqWy9CBouAvIWhIntzBG6cvK/cnIPiZQjBwi/ZqjjBEDGfoNDtmB0kTjroOJ3pQ== + babel-loader@^9.2.1: version "9.2.1" resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-9.2.1.tgz#04c7835db16c246dd19ba0914418f3937797587b" @@ -3146,13 +4179,13 @@ babel-plugin-macros@^3.1.0: cosmiconfig "^7.0.0" resolve "^1.19.0" -babel-plugin-polyfill-corejs2@^0.4.14: - version "0.4.14" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.14.tgz#8101b82b769c568835611542488d463395c2ef8f" - integrity sha512-Co2Y9wX854ts6U8gAAPXfn0GmAyctHuK8n0Yhfjd6t30g7yvKjspvvOo9yG+z52PZRgFErt7Ka2pYnXCjLKEpg== +babel-plugin-polyfill-corejs2@^0.4.14, babel-plugin-polyfill-corejs2@^0.4.15: + version "0.4.17" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.17.tgz#198f970f1c99a856b466d1187e88ce30bd199d91" + integrity sha512-aTyf30K/rqAsNwN76zYrdtx8obu0E4KoUME29B1xj+B3WxgvWkp943vYQ+z8Mv3lw9xHXMHpvSPOBxzAkIa94w== dependencies: - "@babel/compat-data" "^7.27.7" - "@babel/helper-define-polyfill-provider" "^0.6.5" + "@babel/compat-data" "^7.28.6" + "@babel/helper-define-polyfill-provider" "^0.6.8" semver "^6.3.1" babel-plugin-polyfill-corejs3@^0.13.0: @@ -3163,12 +4196,20 @@ babel-plugin-polyfill-corejs3@^0.13.0: "@babel/helper-define-polyfill-provider" "^0.6.5" core-js-compat "^3.43.0" -babel-plugin-polyfill-regenerator@^0.6.5: - version "0.6.5" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.5.tgz#32752e38ab6f6767b92650347bf26a31b16ae8c5" - integrity sha512-ISqQ2frbiNU9vIJkzg7dlPpznPZ4jOiUQ1uSmB0fEHeowtN3COYRsXr/xexn64NpU13P06jc/L5TgiJXOgrbEg== +babel-plugin-polyfill-corejs3@^0.14.0: + version "0.14.2" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.14.2.tgz#6ac08d2f312affb70c4c69c0fbba4cb417ee5587" + integrity sha512-coWpDLJ410R781Npmn/SIBZEsAetR4xVi0SxLMXPaMO4lSf1MwnkGYMtkFxew0Dn8B3/CpbpYxN0JCgg8mn67g== dependencies: - "@babel/helper-define-polyfill-provider" "^0.6.5" + "@babel/helper-define-polyfill-provider" "^0.6.8" + core-js-compat "^3.48.0" + +babel-plugin-polyfill-regenerator@^0.6.5, babel-plugin-polyfill-regenerator@^0.6.6: + version "0.6.8" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.8.tgz#8a6bfd5dd54239362b3d06ce47ac52b2d95d7721" + integrity sha512-M762rNHfSF1EV3SLtnCJXFoQbbIIz0OyRwnCmV0KPC7qosSfCO0QLTSuJX3ayAebubhE6oYBAYPrBA5ljowaZg== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.6.8" bail@^2.0.0: version "2.0.2" @@ -3180,10 +4221,57 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== -baseline-browser-mapping@^2.8.3: - version "2.8.5" - resolved "https://registry.yarnpkg.com/baseline-browser-mapping/-/baseline-browser-mapping-2.8.5.tgz#3147fe6b01a0c49ce1952daebcfc2057fc43fedb" - integrity sha512-TiU4qUT9jdCuh4aVOG7H1QozyeI2sZRqoRPdqBIaslfNt4WUSanRBueAwl2x5jt4rXBMim3lIN2x6yT8PDi24Q== +balanced-match@^4.0.2: + version "4.0.4" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-4.0.4.tgz#bfb10662feed8196a2c62e7c68e17720c274179a" + integrity sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA== + +bare-events@^2.5.4, bare-events@^2.7.0: + version "2.9.2" + resolved "https://registry.yarnpkg.com/bare-events/-/bare-events-2.9.2.tgz#01d377b64c3c7167b28b52da7add3221aecf2d7f" + integrity sha512-AIPKioV7/Y/8KfZ3AAhjPJxLLbY49S64Ym5DakZlUg75qQiTgUq9hEJoEwa4eUezPUlXRy/i5NpsKvo9jgKmoA== + +bare-fs@^4.0.1, bare-fs@^4.5.5: + version "4.8.1" + resolved "https://registry.yarnpkg.com/bare-fs/-/bare-fs-4.8.1.tgz#1a946560b45844dc37120c00330eae7c8a1c44cf" + integrity sha512-N1nnXdHZAOSstz0XiHikGS4HGMH4CnSwhqWdGQQMqqdvp4Jybm9sE3R1WVnpWVd4SFkc8ryPDBLViNLwiEqECg== + dependencies: + bare-events "^2.5.4" + bare-path "^3.0.0" + bare-stream "^2.6.4" + bare-url "^2.2.2" + fast-fifo "^1.3.2" + +bare-path@^3.0.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/bare-path/-/bare-path-3.1.2.tgz#67261bc74a9ba0105ba139b8638f218c09e8d82e" + integrity sha512-ZyKbsuuqK6Ag0K8pX6V5Txq6XeJRvY+wXucnFGRjiyVYP9YWDpIQugk/b+enRYrEYBJaqLzghRQpXPMR7341Nw== + +bare-stream@^2.6.4: + version "2.13.4" + resolved "https://registry.yarnpkg.com/bare-stream/-/bare-stream-2.13.4.tgz#61d448a268d1efd992103aae6bd729332f278ac0" + integrity sha512-PcrQ8lVLbiJscNm1Kez+Yp4Gy4AHGcN1lzwjvf5NybWen7VvEgUfyfnXYJ2zNqWnzOfCb1Abq6lH8ti0syQszA== + dependencies: + b4a "^1.8.1" + streamx "^2.25.0" + teex "^1.0.1" + +bare-url@^2.2.2: + version "2.5.4" + resolved "https://registry.yarnpkg.com/bare-url/-/bare-url-2.5.4.tgz#10ab50f39b50335e2aa7672d5941043dbfc7749e" + integrity sha512-Gxa7UVWBr0/edU1b+TJhn/AZvMQUj9OGspvYsaTYQrAbZA4BOTZGL3LiZxvD+CeMlDH4juwD84+eTAp/bLYW5g== + dependencies: + bare-path "^3.0.0" + +base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +baseline-browser-mapping@^2.11.20: + version "2.11.23" + resolved "https://registry.yarnpkg.com/baseline-browser-mapping/-/baseline-browser-mapping-2.11.23.tgz#304c980a35de0f460cf12985359d6e11494c1ab4" + integrity sha512-le521dGVfxM7yRX0EikCoSz+rOK+hHzdDt/E7mG1jOJB/6WAAUuwVroLwaB7ApaUsz5Q0kFlDXLSA9MheUIfRQ== batch@0.6.1: version "0.6.1" @@ -3200,28 +4288,37 @@ binary-extensions@^2.0.0: resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== -body-parser@1.20.3: - version "1.20.3" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.3.tgz#1953431221c6fb5cd63c4b36d53fab0928e548c6" - integrity sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g== +bl@^4.0.3: + version "4.1.0" + resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" + integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== dependencies: - bytes "3.1.2" + buffer "^5.5.0" + inherits "^2.0.4" + readable-stream "^3.4.0" + +body-parser@~1.20.5: + version "1.20.8" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.8.tgz#328d51ce46cb19c983f3d9661016df2765283a37" + integrity sha512-JNcyFQ64OiijEkPzUBTCe+hyPXUD/3LEldGQ6iF5LR1w00mx9o7xtDWHXBY2iItjdCFGoilOLNQbH943ut7pHA== + dependencies: + bytes "~3.1.2" content-type "~1.0.5" debug "2.6.9" depd "2.0.0" - destroy "1.2.0" - http-errors "2.0.0" - iconv-lite "0.4.24" - on-finished "2.4.1" - qs "6.13.0" - raw-body "2.5.2" + destroy "~1.2.0" + http-errors "~2.0.1" + iconv-lite "~0.4.24" + on-finished "~2.4.1" + qs "~6.16.0" + raw-body "~2.5.3" type-is "~1.6.18" - unpipe "1.0.0" + unpipe "~1.0.0" -bonjour-service@^1.0.11: - version "1.3.0" - resolved "https://registry.yarnpkg.com/bonjour-service/-/bonjour-service-1.3.0.tgz#80d867430b5a0da64e82a8047fc1e355bdb71722" - integrity sha512-3YuAUiSkWykd+2Azjgyxei8OWf8thdn8AITIog2M4UICzoqfjlqr64WIjEXZllf/W6vK1goqleSR6brGomxQqA== +bonjour-service@^1.2.1: + version "1.4.4" + resolved "https://registry.yarnpkg.com/bonjour-service/-/bonjour-service-1.4.4.tgz#8ff5b85fa0641e0996bf40bcf61fc0c6727b66d3" + integrity sha512-jCZcVv7eoc4QesRscwEZtSROBen+6LpKAmBIsQYQrsAeVHLyMXWX/t6eIV5KiRZYNUBl8eVqImEEMQ8L5+c/Kw== dependencies: fast-deep-equal "^3.1.3" multicast-dns "^7.2.5" @@ -3260,13 +4357,20 @@ boxen@^7.0.0: wrap-ansi "^8.1.0" brace-expansion@^1.1.7: - version "1.1.12" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.12.tgz#ab9b454466e5a8cc3a187beaad580412a9c5b843" - integrity sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg== + version "1.1.18" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.18.tgz#3ce74d89885136be1535341f8c3d4425c29a5cab" + integrity sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw== dependencies: balanced-match "^1.0.0" concat-map "0.0.1" +brace-expansion@^5.0.8: + version "5.0.9" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-5.0.9.tgz#7c72438809b5fa5babf54199a1f1c281a6984fcf" + integrity sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg== + dependencies: + balanced-match "^4.0.2" + braces@^3.0.3, braces@~3.0.2: version "3.0.3" resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" @@ -3274,32 +4378,52 @@ braces@^3.0.3, braces@~3.0.2: dependencies: fill-range "^7.1.1" -browserslist@^4.0.0, browserslist@^4.23.0, browserslist@^4.24.0, browserslist@^4.24.4, browserslist@^4.25.1, browserslist@^4.25.3: - version "4.26.2" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.26.2.tgz#7db3b3577ec97f1140a52db4936654911078cef3" - integrity sha512-ECFzp6uFOSB+dcZ5BK/IBaGWssbSYBHvuMeMt3MMFyhI0Z8SqGgEkBLARgpRH3hutIgPVsALcMwbDrJqPxQ65A== +browserslist@^4.0.0, browserslist@^4.23.0, browserslist@^4.24.0, browserslist@^4.24.2, browserslist@^4.28.1, browserslist@^4.28.7, browserslist@^4.28.9: + version "4.28.9" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.28.9.tgz#07ce6b449b90af880eb9bfb7cd39372cc4f71c8c" + integrity sha512-EWazOblFYUvlGZcfGhPUPmYh3nikUxBVb+y9MJun5f3hBi812X+8MSQTujLBtgK3cf51fJWbWfOjyeO954d+Eg== dependencies: - baseline-browser-mapping "^2.8.3" - caniuse-lite "^1.0.30001741" - electron-to-chromium "^1.5.218" - node-releases "^2.0.21" - update-browserslist-db "^1.1.3" + baseline-browser-mapping "^2.11.20" + caniuse-lite "^1.0.30001810" + electron-to-chromium "^1.5.420" + node-releases "^2.0.54" + update-browserslist-db "^1.3.2" buffer-from@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== +buffer@^5.5.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + +bundle-name@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/bundle-name/-/bundle-name-4.1.0.tgz#f3b96b34160d6431a19d7688135af7cfb8797889" + integrity sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q== + dependencies: + run-applescript "^7.0.0" + bytes@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" integrity sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw== -bytes@3.1.2: +bytes@3.1.2, bytes@~3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== +bytestreamjs@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/bytestreamjs/-/bytestreamjs-2.0.1.tgz#a32947c7ce389a6fa11a09a9a563d0a45889535e" + integrity sha512-U1Z/ob71V/bXfVABvNr/Kumf5VyeQRBEm6Txb0PQ6S7V5GpBM3w4Cbqz/xPDicR5tN0uvDifng8C+5qECeGwyQ== + cacheable-lookup@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz#3476a8215d046e5a3202a9209dd13fec1f933a27" @@ -3318,7 +4442,7 @@ cacheable-request@^10.2.8: normalize-url "^8.0.0" responselike "^3.0.0" -call-bind-apply-helpers@^1.0.0, call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2: +call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz#4b5428c222be985d79c3d82657479dbe0b59b2d6" integrity sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ== @@ -3327,13 +4451,13 @@ call-bind-apply-helpers@^1.0.0, call-bind-apply-helpers@^1.0.1, call-bind-apply- function-bind "^1.1.2" call-bind@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.8.tgz#0736a9660f537e3388826f440d5ec45f744eaa4c" - integrity sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww== + version "1.0.9" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.9.tgz#39a644700c80bc7d0ca9102fc6d1d43b2fd7eee7" + integrity sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ== dependencies: - call-bind-apply-helpers "^1.0.0" - es-define-property "^1.0.0" - get-intrinsic "^1.2.4" + call-bind-apply-helpers "^1.0.2" + es-define-property "^1.0.1" + get-intrinsic "^1.3.0" set-function-length "^1.2.2" call-bound@^1.0.2, call-bound@^1.0.3: @@ -3377,10 +4501,10 @@ caniuse-api@^3.0.0: lodash.memoize "^4.1.2" lodash.uniq "^4.5.0" -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001702, caniuse-lite@^1.0.30001741: - version "1.0.30001743" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001743.tgz#50ff91a991220a1ee2df5af00650dd5c308ea7cd" - integrity sha512-e6Ojr7RV14Un7dz6ASD0aZDmQPT/A+eZU+nuTNfjqmRrmkmQlnTNWH0SKmqagx9PeW87UVqapSurtAXifmtdmw== +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001810: + version "1.0.30001810" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001810.tgz#4970b477dea3278374de9bc43aa8f5d39fc3cda2" + integrity sha512-TITQPUkaz+aVk5GL6NhOdwk1aEaNTSDPsGFWrTuhKGtjTF70jL/Oht2W4c6rXUe5fu7Ie19VIahAXHIIiWWNeg== ccount@^2.0.0: version "2.0.1" @@ -3450,7 +4574,19 @@ cheerio@1.0.0-rc.12: parse5 "^7.0.0" parse5-htmlparser2-tree-adapter "^7.0.0" -chokidar@^3.5.3: +chevrotain@~11.1.2: + version "11.1.2" + resolved "https://registry.yarnpkg.com/chevrotain/-/chevrotain-11.1.2.tgz#1db446bdeb63fe42d366508a34280c2e3c0c4f62" + integrity sha512-opLQzEVriiH1uUQ4Kctsd49bRoFDXGGSC4GUqj7pGyxM3RehRhvTlZJc1FL/Flew2p5uwxa1tUDWKzI4wNM8pg== + dependencies: + "@chevrotain/cst-dts-gen" "11.1.2" + "@chevrotain/gast" "11.1.2" + "@chevrotain/regexp-to-ast" "11.1.2" + "@chevrotain/types" "11.1.2" + "@chevrotain/utils" "11.1.2" + lodash-es "4.17.23" + +chokidar@^3.5.3, chokidar@^3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== @@ -3465,6 +4601,11 @@ chokidar@^3.5.3: optionalDependencies: fsevents "~2.3.2" +chownr@^1.1.1: + version "1.1.4" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" + integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== + chrome-trace-event@^1.0.2: version "1.0.4" resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz#05bffd7ff928465093314708c93bdfa9bd1f0f5b" @@ -3536,15 +4677,31 @@ color-convert@^2.0.1: dependencies: color-name "~1.1.4" -color-name@~1.1.4: +color-name@^1.0.0, color-name@~1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== +color-string@^1.9.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.9.1.tgz#4467f9146f036f855b764dfb5bf8582bf342c7a4" + integrity sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg== + dependencies: + color-name "^1.0.0" + simple-swizzle "^0.2.2" + +color@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/color/-/color-4.2.3.tgz#d781ecb5e57224ee43ea9627560107c0e0c6463a" + integrity sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A== + dependencies: + color-convert "^2.0.1" + color-string "^1.9.0" + colord@^2.9.3: - version "2.9.3" - resolved "https://registry.yarnpkg.com/colord/-/colord-2.9.3.tgz#4f8ce919de456f1d5c1c368c307fe20f3e59fb43" - integrity sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw== + version "2.10.0" + resolved "https://registry.yarnpkg.com/colord/-/colord-2.10.0.tgz#56c9050e6b06b4b6c62ddec366a48d65ef57e860" + integrity sha512-AidJptpBJmjTclAp9BkLwJi0T93fo5epJnbaZslpg6QVzpHjAiveF55mE9AcUJiGMqRHgMDY8soMsQtuNYMHfw== colorette@^2.0.10: version "2.0.20" @@ -3561,6 +4718,11 @@ comma-separated-tokens@^2.0.0: resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz#4e89c9458acb61bc8fef19f4529973b2392839ee" integrity sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg== +commander@7, commander@^7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" + integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== + commander@^10.0.0: version "10.0.1" resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06" @@ -3576,11 +4738,6 @@ commander@^5.1.0: resolved "https://registry.yarnpkg.com/commander/-/commander-5.1.0.tgz#46abbd1652f8e059bddaef99bbdcb2ad9cf179ae" integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg== -commander@^7.2.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" - integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== - commander@^8.3.0: version "8.3.0" resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" @@ -3598,14 +4755,15 @@ compressible@~2.0.18: dependencies: mime-db ">= 1.43.0 < 2" -compression@^1.7.4: - version "1.8.1" - resolved "https://registry.yarnpkg.com/compression/-/compression-1.8.1.tgz#4a45d909ac16509195a9a28bd91094889c180d79" - integrity sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w== +compression@^1.8.1: + version "1.8.2" + resolved "https://registry.yarnpkg.com/compression/-/compression-1.8.2.tgz#781397127ae2da00c0c5f7c76bda5b2a9b32a49f" + integrity sha512-o8vI5RE5A6EVVOd9o41jKp41aJom+QTEO/Bx8MYNjexMo/Bv2WOjUfZr+aL0WnYSgymUy6zeguqLTsIhV0gMvQ== dependencies: bytes "3.1.2" compressible "~2.0.18" debug "2.6.9" + destroy "1.2.0" negotiator "~0.6.4" on-headers "~1.1.0" safe-buffer "5.2.1" @@ -3650,7 +4808,7 @@ content-disposition@0.5.2: resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" integrity sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA== -content-disposition@0.5.4: +content-disposition@~0.5.4: version "0.5.4" resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== @@ -3672,20 +4830,20 @@ convert-source-map@^2.0.0: resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== -cookie-signature@1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" - integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== +cookie-signature@~1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.7.tgz#ab5dd7ab757c54e60f37ef6550f481c426d10454" + integrity sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA== -cookie@0.7.1: - version "0.7.1" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.7.1.tgz#2f73c42142d5d5cf71310a74fc4ae61670e5dbc9" - integrity sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w== +cookie@~0.7.1: + version "0.7.2" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.7.2.tgz#556369c472a2ba910f2979891b526b3436237ed7" + integrity sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w== copy-text-to-clipboard@^3.2.0: - version "3.2.1" - resolved "https://registry.yarnpkg.com/copy-text-to-clipboard/-/copy-text-to-clipboard-3.2.1.tgz#01c3656d6c81a6aa713aa0a8d361214a1eeac6ae" - integrity sha512-3am6cw+WOicd0+HyzhC4kYS02wHJUiVQXmAADxfUARKsHBkWl1Vl3QQEiILlSs8YcPS/C0+y/urCNEYQk+byWA== + version "3.2.2" + resolved "https://registry.yarnpkg.com/copy-text-to-clipboard/-/copy-text-to-clipboard-3.2.2.tgz#99bc79db3f2d355ec33a08d573aff6804491ddb9" + integrity sha512-T6SqyLd1iLuqPA90J5N4cTalrtovCySh58iiZDGJ6FGznbclKh4UI+FGacQSgFzwKG77W7XT5gwbVEbd9cIH1A== copy-webpack-plugin@^11.0.0: version "11.0.0" @@ -3699,28 +4857,37 @@ copy-webpack-plugin@^11.0.0: schema-utils "^4.0.0" serialize-javascript "^6.0.0" -core-js-compat@^3.43.0: - version "3.45.1" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.45.1.tgz#424f3f4af30bf676fd1b67a579465104f64e9c7a" - integrity sha512-tqTt5T4PzsMIZ430XGviK4vzYSoeNJ6CXODi6c/voxOT6IZqBht5/EKaSNnYiEjjRYxjVz7DQIsOsY0XNi8PIA== +core-js-compat@^3.43.0, core-js-compat@^3.48.0: + version "3.50.0" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.50.0.tgz#d5922c2a692ab1cba6078c920e7c5567421ae08e" + integrity sha512-XGpFGbMLHwSt74YLTKho7Ib242qi6O8MSX+sRokV4oz7iKXvQWGYZthjIhjRGMxjzVkAubBO512dKGYcefmX3Q== dependencies: - browserslist "^4.25.3" - -core-js-pure@^3.43.0: - version "3.45.1" - resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.45.1.tgz#b129d86a5f7f8380378577c7eaee83608570a05a" - integrity sha512-OHnWFKgTUshEU8MK+lOs1H8kC8GkTi9Z1tvNkxrCcw9wl3MJIO7q2ld77wjWn4/xuGrVu2X+nME1iIIPBSdyEQ== + browserslist "^4.28.7" core-js@^3.31.1: - version "3.45.1" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.45.1.tgz#5810e04a1b4e9bc5ddaa4dd12e702ff67300634d" - integrity sha512-L4NPsJlCfZsPeXukyzHFlg/i7IIVwHSItR0wg0FLNqYClJ4MQYTYLbC7EkjKYRLZF2iof2MUgN0EGy7MdQFChg== + version "3.50.0" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.50.0.tgz#a18646fcb0097650189b4504c803e887bcae4c0a" + integrity sha512-BRWgOLKkFeCgRudR6zrs8p9XJZcE14grzKMMssoYrk6krtuEZ7MTKPIY5RzOnqsEKIR9kst7wNzphttraT+Yqw== core-util-is@~1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== +cose-base@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/cose-base/-/cose-base-1.0.3.tgz#650334b41b869578a543358b80cda7e0abe0a60a" + integrity sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg== + dependencies: + layout-base "^1.0.0" + +cose-base@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/cose-base/-/cose-base-2.2.0.tgz#1c395c35b6e10bb83f9769ca8b817d614add5c01" + integrity sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g== + dependencies: + layout-base "^2.0.0" + cosmiconfig@^7.0.0: version "7.1.0" resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.1.0.tgz#1443b9afa596b670082ea46cbd8f6a62b84635f6" @@ -3766,9 +4933,9 @@ css-blank-pseudo@^7.0.1: postcss-selector-parser "^7.0.0" css-declaration-sorter@^7.2.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-7.2.0.tgz#6dec1c9523bc4a643e088aab8f09e67a54961024" - integrity sha512-h70rUM+3PNFuaBDTLe8wF/cdWu+dOZmb7pJt8Z2sedYbAcQVQV/tEchueg3GWxwqS0cxtbxmaHEdkNACqcvsow== + version "7.4.0" + resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-7.4.0.tgz#9c215fbda2dcf4083bae69f125688158ae847deb" + integrity sha512-LTuzjPoyA2vMGKKcaOqKSp7Ub2eGrNfKiZH4LpezxpNrsICGCSFvsQOI29psISxNZtaXibkC2CXzrQ5enMeGGw== css-has-pseudo@^7.0.3: version "7.0.3" @@ -3853,10 +5020,10 @@ css-what@^6.0.1, css-what@^6.1.0: resolved "https://registry.yarnpkg.com/css-what/-/css-what-6.2.2.tgz#cdcc8f9b6977719fdfbd1de7aec24abf756b9dea" integrity sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA== -cssdb@^8.4.0: - version "8.4.0" - resolved "https://registry.yarnpkg.com/cssdb/-/cssdb-8.4.0.tgz#232a1aa7751983ed2b40331634902d4c93f0456c" - integrity sha512-lyATYGyvXwQ8h55WeQeEHXhI+47rl52pXSYkFK/ZrCbAJSgVIaPFjYc3RM8TpRHKk7W3wsAZImmLps+P5VyN9g== +cssdb@^8.6.0: + version "8.11.0" + resolved "https://registry.yarnpkg.com/cssdb/-/cssdb-8.11.0.tgz#e03c9cdc9c5e99d8cddf64a917bfc427b20c143a" + integrity sha512-VzY/8kcK5M8oCVr/cwh24J8XVlCOITpmzCizKBC28o7Z1s23MMojXoJ3q7a+TQQoMKvxC3YlG0Z9yU10kJF1uQ== cssesc@^3.0.0: version "3.0.0" @@ -3932,10 +5099,313 @@ csso@^5.0.5: dependencies: css-tree "~2.2.0" -csstype@^3.0.2, csstype@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81" - integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== +csstype@^3.0.2, csstype@^3.2.2, csstype@^3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.2.3.tgz#ec48c0f3e993e50648c86da559e2610995cf989a" + integrity sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ== + +cytoscape-cose-bilkent@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/cytoscape-cose-bilkent/-/cytoscape-cose-bilkent-4.1.0.tgz#762fa121df9930ffeb51a495d87917c570ac209b" + integrity sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ== + dependencies: + cose-base "^1.0.0" + +cytoscape-fcose@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/cytoscape-fcose/-/cytoscape-fcose-2.2.0.tgz#e4d6f6490df4fab58ae9cea9e5c3ab8d7472f471" + integrity sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ== + dependencies: + cose-base "^2.2.0" + +cytoscape@^3.34.0: + version "3.34.3" + resolved "https://registry.yarnpkg.com/cytoscape/-/cytoscape-3.34.3.tgz#1503996ba0b59b901d86310a1f612e92dc464f51" + integrity sha512-yfYGhRcGAntq6YBD583j4n0Eg3jIxvWmZtz/5uz9UYkeIStSlMxuUja+ec5j3iBD8nv1rwaOAYMW09tBdkSeaQ== + +"d3-array@1 - 2": + version "2.12.1" + resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-2.12.1.tgz#e20b41aafcdffdf5d50928004ececf815a465e81" + integrity sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ== + dependencies: + internmap "^1.0.0" + +"d3-array@2 - 3", "d3-array@2.10.0 - 3", "d3-array@2.5.0 - 3", d3-array@3, d3-array@^3.2.0: + version "3.2.4" + resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-3.2.4.tgz#15fec33b237f97ac5d7c986dc77da273a8ed0bb5" + integrity sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg== + dependencies: + internmap "1 - 2" + +d3-axis@3: + version "3.0.0" + resolved "https://registry.yarnpkg.com/d3-axis/-/d3-axis-3.0.0.tgz#c42a4a13e8131d637b745fc2973824cfeaf93322" + integrity sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw== + +d3-brush@3: + version "3.0.0" + resolved "https://registry.yarnpkg.com/d3-brush/-/d3-brush-3.0.0.tgz#6f767c4ed8dcb79de7ede3e1c0f89e63ef64d31c" + integrity sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ== + dependencies: + d3-dispatch "1 - 3" + d3-drag "2 - 3" + d3-interpolate "1 - 3" + d3-selection "3" + d3-transition "3" + +d3-chord@3: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-chord/-/d3-chord-3.0.1.tgz#d156d61f485fce8327e6abf339cb41d8cbba6966" + integrity sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g== + dependencies: + d3-path "1 - 3" + +"d3-color@1 - 3", d3-color@3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/d3-color/-/d3-color-3.1.0.tgz#395b2833dfac71507f12ac2f7af23bf819de24e2" + integrity sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA== + +d3-contour@4: + version "4.0.2" + resolved "https://registry.yarnpkg.com/d3-contour/-/d3-contour-4.0.2.tgz#bb92063bc8c5663acb2422f99c73cbb6c6ae3bcc" + integrity sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA== + dependencies: + d3-array "^3.2.0" + +d3-delaunay@6: + version "6.0.4" + resolved "https://registry.yarnpkg.com/d3-delaunay/-/d3-delaunay-6.0.4.tgz#98169038733a0a5babbeda55054f795bb9e4a58b" + integrity sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A== + dependencies: + delaunator "5" + +"d3-dispatch@1 - 3", d3-dispatch@3: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-dispatch/-/d3-dispatch-3.0.1.tgz#5fc75284e9c2375c36c839411a0cf550cbfc4d5e" + integrity sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg== + +"d3-drag@2 - 3", d3-drag@3: + version "3.0.0" + resolved "https://registry.yarnpkg.com/d3-drag/-/d3-drag-3.0.0.tgz#994aae9cd23c719f53b5e10e3a0a6108c69607ba" + integrity sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg== + dependencies: + d3-dispatch "1 - 3" + d3-selection "3" + +"d3-dsv@1 - 3", d3-dsv@3: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-dsv/-/d3-dsv-3.0.1.tgz#c63af978f4d6a0d084a52a673922be2160789b73" + integrity sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q== + dependencies: + commander "7" + iconv-lite "0.6" + rw "1" + +"d3-ease@1 - 3", d3-ease@3: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-ease/-/d3-ease-3.0.1.tgz#9658ac38a2140d59d346160f1f6c30fda0bd12f4" + integrity sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w== + +d3-fetch@3: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-fetch/-/d3-fetch-3.0.1.tgz#83141bff9856a0edb5e38de89cdcfe63d0a60a22" + integrity sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw== + dependencies: + d3-dsv "1 - 3" + +d3-force@3: + version "3.0.0" + resolved "https://registry.yarnpkg.com/d3-force/-/d3-force-3.0.0.tgz#3e2ba1a61e70888fe3d9194e30d6d14eece155c4" + integrity sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg== + dependencies: + d3-dispatch "1 - 3" + d3-quadtree "1 - 3" + d3-timer "1 - 3" + +"d3-format@1 - 3", d3-format@3: + version "3.1.2" + resolved "https://registry.yarnpkg.com/d3-format/-/d3-format-3.1.2.tgz#01fdb46b58beb1f55b10b42ad70b6e344d5eb2ae" + integrity sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg== + +d3-geo@3: + version "3.1.1" + resolved "https://registry.yarnpkg.com/d3-geo/-/d3-geo-3.1.1.tgz#6027cf51246f9b2ebd64f99e01dc7c3364033a4d" + integrity sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q== + dependencies: + d3-array "2.5.0 - 3" + +d3-hierarchy@3: + version "3.1.2" + resolved "https://registry.yarnpkg.com/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz#b01cd42c1eed3d46db77a5966cf726f8c09160c6" + integrity sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA== + +"d3-interpolate@1 - 3", "d3-interpolate@1.2.0 - 3", d3-interpolate@3: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-interpolate/-/d3-interpolate-3.0.1.tgz#3c47aa5b32c5b3dfb56ef3fd4342078a632b400d" + integrity sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g== + dependencies: + d3-color "1 - 3" + +d3-path@1: + version "1.0.9" + resolved "https://registry.yarnpkg.com/d3-path/-/d3-path-1.0.9.tgz#48c050bb1fe8c262493a8caf5524e3e9591701cf" + integrity sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg== + +"d3-path@1 - 3", d3-path@3, d3-path@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/d3-path/-/d3-path-3.1.0.tgz#22df939032fb5a71ae8b1800d61ddb7851c42526" + integrity sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ== + +d3-polygon@3: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-polygon/-/d3-polygon-3.0.1.tgz#0b45d3dd1c48a29c8e057e6135693ec80bf16398" + integrity sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg== + +"d3-quadtree@1 - 3", d3-quadtree@3: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-quadtree/-/d3-quadtree-3.0.1.tgz#6dca3e8be2b393c9a9d514dabbd80a92deef1a4f" + integrity sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw== + +d3-random@3: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-random/-/d3-random-3.0.1.tgz#d4926378d333d9c0bfd1e6fa0194d30aebaa20f4" + integrity sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ== + +d3-sankey@^0.12.3: + version "0.12.3" + resolved "https://registry.yarnpkg.com/d3-sankey/-/d3-sankey-0.12.3.tgz#b3c268627bd72e5d80336e8de6acbfec9d15d01d" + integrity sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ== + dependencies: + d3-array "1 - 2" + d3-shape "^1.2.0" + +d3-scale-chromatic@3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz#34c39da298b23c20e02f1a4b239bd0f22e7f1314" + integrity sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ== + dependencies: + d3-color "1 - 3" + d3-interpolate "1 - 3" + +d3-scale@4: + version "4.0.2" + resolved "https://registry.yarnpkg.com/d3-scale/-/d3-scale-4.0.2.tgz#82b38e8e8ff7080764f8dcec77bd4be393689396" + integrity sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ== + dependencies: + d3-array "2.10.0 - 3" + d3-format "1 - 3" + d3-interpolate "1.2.0 - 3" + d3-time "2.1.1 - 3" + d3-time-format "2 - 4" + +"d3-selection@2 - 3", d3-selection@3, d3-selection@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/d3-selection/-/d3-selection-3.0.0.tgz#c25338207efa72cc5b9bd1458a1a41901f1e1b31" + integrity sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ== + +d3-shape@3: + version "3.2.0" + resolved "https://registry.yarnpkg.com/d3-shape/-/d3-shape-3.2.0.tgz#a1a839cbd9ba45f28674c69d7f855bcf91dfc6a5" + integrity sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA== + dependencies: + d3-path "^3.1.0" + +d3-shape@^1.2.0: + version "1.3.7" + resolved "https://registry.yarnpkg.com/d3-shape/-/d3-shape-1.3.7.tgz#df63801be07bc986bc54f63789b4fe502992b5d7" + integrity sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw== + dependencies: + d3-path "1" + +"d3-time-format@2 - 4", d3-time-format@4: + version "4.1.0" + resolved "https://registry.yarnpkg.com/d3-time-format/-/d3-time-format-4.1.0.tgz#7ab5257a5041d11ecb4fe70a5c7d16a195bb408a" + integrity sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg== + dependencies: + d3-time "1 - 3" + +"d3-time@1 - 3", "d3-time@2.1.1 - 3", d3-time@3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/d3-time/-/d3-time-3.1.0.tgz#9310db56e992e3c0175e1ef385e545e48a9bb5c7" + integrity sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q== + dependencies: + d3-array "2 - 3" + +"d3-timer@1 - 3", d3-timer@3: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-timer/-/d3-timer-3.0.1.tgz#6284d2a2708285b1abb7e201eda4380af35e63b0" + integrity sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA== + +"d3-transition@2 - 3", d3-transition@3, d3-transition@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-transition/-/d3-transition-3.0.1.tgz#6869fdde1448868077fdd5989200cb61b2a1645f" + integrity sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w== + dependencies: + d3-color "1 - 3" + d3-dispatch "1 - 3" + d3-ease "1 - 3" + d3-interpolate "1 - 3" + d3-timer "1 - 3" + +d3-zoom@3: + version "3.0.0" + resolved "https://registry.yarnpkg.com/d3-zoom/-/d3-zoom-3.0.0.tgz#d13f4165c73217ffeaa54295cd6969b3e7aee8f3" + integrity sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw== + dependencies: + d3-dispatch "1 - 3" + d3-drag "2 - 3" + d3-interpolate "1 - 3" + d3-selection "2 - 3" + d3-transition "2 - 3" + +d3@^7.9.0: + version "7.9.0" + resolved "https://registry.yarnpkg.com/d3/-/d3-7.9.0.tgz#579e7acb3d749caf8860bd1741ae8d371070cd5d" + integrity sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA== + dependencies: + d3-array "3" + d3-axis "3" + d3-brush "3" + d3-chord "3" + d3-color "3" + d3-contour "4" + d3-delaunay "6" + d3-dispatch "3" + d3-drag "3" + d3-dsv "3" + d3-ease "3" + d3-fetch "3" + d3-force "3" + d3-format "3" + d3-geo "3" + d3-hierarchy "3" + d3-interpolate "3" + d3-path "3" + d3-polygon "3" + d3-quadtree "3" + d3-random "3" + d3-scale "4" + d3-scale-chromatic "3" + d3-selection "3" + d3-shape "3" + d3-time "3" + d3-time-format "4" + d3-timer "3" + d3-transition "3" + d3-zoom "3" + +dagre-d3-es@7.0.14: + version "7.0.14" + resolved "https://registry.yarnpkg.com/dagre-d3-es/-/dagre-d3-es-7.0.14.tgz#1272276e26457cf3b97dac569f8f0531ec33c377" + integrity sha512-P4rFMVq9ESWqmOgK+dlXvOtLwYg0i7u0HBGJER0LZDJT2VHIPAMZ/riPxqJceWMStH5+E61QxFra9kIS3AqdMg== + dependencies: + d3 "^7.9.0" + lodash-es "^4.17.21" + +dayjs@^1.11.21: + version "1.11.23" + resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.23.tgz#b0a363506dde5f36cf5075e42ebe8115165a8c79" + integrity sha512-QDTCU0M0MxR3hQfnlDJfwekQiaanm1ubOD231u73WBckQ/fsamwRLiE2GBz6D3a/xF1NgfiDLJjXBa1hYOYTtQ== debounce@^1.2.1: version "1.2.1" @@ -3949,7 +5419,7 @@ debug@2.6.9: dependencies: ms "2.0.0" -debug@4, debug@^4.0.0, debug@^4.1.0, debug@^4.3.1, debug@^4.4.1: +debug@^4.0.0, debug@^4.1.0, debug@^4.3.1, debug@^4.4.3: version "4.4.3" resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.3.tgz#c6ae432d9bd9662582fce08709b038c58e9e3d6a" integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA== @@ -3957,9 +5427,9 @@ debug@4, debug@^4.0.0, debug@^4.1.0, debug@^4.3.1, debug@^4.4.1: ms "^2.1.3" decode-named-character-reference@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/decode-named-character-reference/-/decode-named-character-reference-1.2.0.tgz#25c32ae6dd5e21889549d40f676030e9514cc0ed" - integrity sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q== + version "1.3.0" + resolved "https://registry.yarnpkg.com/decode-named-character-reference/-/decode-named-character-reference-1.3.0.tgz#3e40603760874c2e5867691b599d73a7da25b53f" + integrity sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q== dependencies: character-entities "^2.0.0" @@ -3980,12 +5450,18 @@ deepmerge@^4.3.1: resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== -default-gateway@^6.0.3: - version "6.0.3" - resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-6.0.3.tgz#819494c888053bdb743edbf343d6cdf7f2943a71" - integrity sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg== +default-browser-id@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/default-browser-id/-/default-browser-id-5.0.1.tgz#f7a7ccb8f5104bf8e0f71ba3b1ccfa5eafdb21e8" + integrity sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q== + +default-browser@^5.2.1: + version "5.5.1" + resolved "https://registry.yarnpkg.com/default-browser/-/default-browser-5.5.1.tgz#1790affc52680fbb11e17cab2752d69aa2a37d2c" + integrity sha512-m1pAzaJgZ/gssEqlOhJkPJp8Xly7QyW6xcrkUa2KKcDeDSEMP7X8xipU3snUcfisTQx0w1AGae+9UtJSfVnXGw== dependencies: - execa "^5.0.0" + bundle-name "^4.1.0" + default-browser-id "^5.0.0" defer-to-connect@^2.0.1: version "2.0.1" @@ -4006,6 +5482,11 @@ define-lazy-prop@^2.0.0: resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== +define-lazy-prop@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz#dbb19adfb746d7fc6d734a06b72f4a00d021255f" + integrity sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg== + define-properties@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" @@ -4015,12 +5496,19 @@ define-properties@^1.2.1: has-property-descriptors "^1.0.0" object-keys "^1.1.1" +delaunator@5: + version "5.1.0" + resolved "https://registry.yarnpkg.com/delaunator/-/delaunator-5.1.0.tgz#d13271fbf3aff6753f9ea6e235557f20901046ea" + integrity sha512-AGrQ4QSgssa1NGmWmLPqN5NY2KajF5MqxetNEO+o0n3ZwZZeTmt7bBnvzHWrmkZFxGgr4HdyFgelzgi06otLuQ== + dependencies: + robust-predicates "^3.0.2" + delegate@^3.1.2: version "3.2.0" resolved "https://registry.yarnpkg.com/delegate/-/delegate-3.2.0.tgz#b66b71c3158522e8ab5744f720d8ca0c2af59166" integrity sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw== -depd@2.0.0: +depd@2.0.0, depd@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== @@ -4035,23 +5523,27 @@ dequal@^2.0.0: resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== -destroy@1.2.0: +destroy@1.2.0, destroy@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== +detect-libc@^2.0.0, detect-libc@^2.0.2, detect-libc@^2.0.3: + version "2.1.2" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.1.2.tgz#689c5dcdc1900ef5583a4cb9f6d7b473742074ad" + integrity sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ== + detect-node@^2.0.4: version "2.1.0" resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1" integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== -detect-port@^1.5.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/detect-port/-/detect-port-1.6.1.tgz#45e4073997c5f292b957cb678fb0bb8ed4250a67" - integrity sha512-CmnVc+Hek2egPx1PeTFVta2W78xy2K/9Rkf6cC4T59S50tVnzKj+tnx5mmx5lwvCkujZ4uRrpRSuV+IVs3f90Q== +detect-port@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/detect-port/-/detect-port-2.1.0.tgz#03d72644891fa451ca5609b83107a8a0ebd03f91" + integrity sha512-epZuWb/6Q62L+nDHJc/hQAqf8pylsqgk3BpZXVBx1CDnr3nkrVNn73Uu1rXcFzkNcc+hkP3whuOg7JZYaQB65Q== dependencies: - address "^1.0.1" - debug "4" + address "^2.0.1" devlop@^1.0.0, devlop@^1.1.0: version "1.1.0" @@ -4126,6 +5618,13 @@ domhandler@^5.0.2, domhandler@^5.0.3: dependencies: domelementtype "^2.3.0" +dompurify@^3.4.12: + version "3.4.15" + resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-3.4.15.tgz#30351b34513894f428c13bddb28bff0a027ae804" + integrity sha512-EUBjM+B+lkDE41iE82DDSCfkoPGfXx8IxFxPMjNzm/Uk4xDet77rTN9wqlxlVg71kK7XGuUMv6wUxJUwwv+Xyw== + optionalDependencies: + "@types/trusted-types" "^2.0.7" + domutils@^2.5.2, domutils@^2.8.0: version "2.8.0" resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135" @@ -4183,10 +5682,15 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== -electron-to-chromium@^1.5.218: - version "1.5.221" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.221.tgz#bd98014b2a247701c4ebd713080448d539545d79" - integrity sha512-/1hFJ39wkW01ogqSyYoA4goOXOtMRy6B+yvA1u42nnsEGtHzIzmk93aPISumVQeblj47JUHLC9coCjUxb1EvtQ== +electron-to-chromium@^1.5.420: + version "1.5.427" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.427.tgz#f8693d109cf116d4a6efa98bc620b9fc7f265f67" + integrity sha512-n14zb3FdsChZ2BNobqNHAJMcP3ifFv4paox2LvCrfVAQcqGiSURgbJl+PfMpHVCNFkStnNc+RRVtPBTVW5PDgw== + +elkjs@^0.9.3: + version "0.9.3" + resolved "https://registry.yarnpkg.com/elkjs/-/elkjs-0.9.3.tgz#16711f8ceb09f1b12b99e971b138a8384a529161" + integrity sha512-f/ZeWvW/BCXbhGEf1Ujp29EASo/lk1FDnETgNKwJrsVvGZhUWCZyg3xLJjAsxfOmt8KjswHmI5EwCQcPMpOYhQ== emoji-regex@^8.0.0: version "8.0.0" @@ -4213,23 +5717,25 @@ emoticon@^4.0.1: resolved "https://registry.yarnpkg.com/emoticon/-/emoticon-4.1.0.tgz#d5a156868ee173095627a33de3f1e914c3dde79e" integrity sha512-VWZfnxqwNcc51hIy/sbOdEem6D+cVtpPzEEtVAFdaas30+1dgkyaOQ4sQ6Bp0tOMqWO1v+HQfYaoodOkdhK6SQ== -encodeurl@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" - integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== - encodeurl@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-2.0.0.tgz#7b8ea898077d7e409d3ac45474ea38eaf0857a58" integrity sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg== -enhanced-resolve@^5.17.3: - version "5.18.3" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz#9b5f4c5c076b8787c78fe540392ce76a88855b44" - integrity sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww== +end-of-stream@^1.1.0, end-of-stream@^1.4.1: + version "1.4.5" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.5.tgz#7344d711dea40e0b74abc2ed49778743ccedb08c" + integrity sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg== + dependencies: + once "^1.4.0" + +enhanced-resolve@^5.25.0: + version "5.25.1" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.25.1.tgz#9d919bfa898b116e58f20e95127c047693158771" + integrity sha512-nGXts5znJzmWPu+mIE9izCOzdg63oJca2mDzGWWTth7sr4aCToKcoyFVBQwN75Ij5Pf6p510EwkTqViTRzDV+w== dependencies: graceful-fs "^4.2.4" - tapable "^2.2.0" + tapable "^2.3.3" entities@^2.0.0: version "2.2.0" @@ -4263,18 +5769,23 @@ es-errors@^1.3.0: resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== -es-module-lexer@^1.2.1: - version "1.7.0" - resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.7.0.tgz#9159601561880a85f2734560a9099b2c31e5372a" - integrity sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA== +es-module-lexer@^2.1.0: + version "2.3.2" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-2.3.2.tgz#311fa4f40168c1975c505477c51b23234d41ad55" + integrity sha512-poHGpORABojJJucnV9KbOavETW8lBVnphkW77ER5/BQ5Fz7oXSoCNek7IH3vR5nRjdsEz926ibFYX8KtLQmdyw== es-object-atoms@^1.0.0, es-object-atoms@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz#1c4f2c4837327597ce69d2ca190a7fdd172338c1" - integrity sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA== + version "1.1.2" + resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.1.2.tgz#a2d0b373205724dfa525d23b0c3e1b1ca582c99b" + integrity sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw== dependencies: es-errors "^1.3.0" +es-toolkit@^1.45.1: + version "1.52.0" + resolved "https://registry.yarnpkg.com/es-toolkit/-/es-toolkit-1.52.0.tgz#71eaf1a8b18834ef77637eccbb885ba4c03cd6dd" + integrity sha512-XTNEJQh1tY1ZJVcf6ayP/2n4ZPyaHlW2FWs7xvw5ddPuhUVjLD3olQVQS7kf58JbAB48iL0uL/jerTrjtV3lDA== + esast-util-from-estree@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/esast-util-from-estree/-/esast-util-from-estree-2.0.0.tgz#8d1cfb51ad534d2f159dc250e604f3478a79f1ad" @@ -4310,11 +5821,6 @@ escape-html@^1.0.3, escape-html@~1.0.3: resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== -escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== - escape-string-regexp@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" @@ -4325,36 +5831,6 @@ escape-string-regexp@^5.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz#4683126b500b61762f2dbebace1806e8be31b1c8" integrity sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw== -eslint-scope@5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" - integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== - dependencies: - esrecurse "^4.3.0" - estraverse "^4.1.1" - -esprima@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" - integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== - -esrecurse@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" - integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== - dependencies: - estraverse "^5.2.0" - -estraverse@^4.1.1: - version "4.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" - integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== - -estraverse@^5.2.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" - integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== - estree-util-attach-comments@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/estree-util-attach-comments/-/estree-util-attach-comments-3.0.0.tgz#344bde6a64c8a31d15231e5ee9e297566a691c2d" @@ -4378,9 +5854,9 @@ estree-util-is-identifier-name@^3.0.0: integrity sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg== estree-util-scope@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/estree-util-scope/-/estree-util-scope-1.0.0.tgz#9cbdfc77f5cb51e3d9ed4ad9c4adbff22d43e585" - integrity sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ== + version "1.0.1" + resolved "https://registry.yarnpkg.com/estree-util-scope/-/estree-util-scope-1.0.1.tgz#28e1e124b5d792f463f43ef3d1690236434b05ea" + integrity sha512-B0np3dcdxqILX5e9nEi5/Fr4K7gL4oYFVPV1zRa2e9wRCbQoZZNWOZFYyoInvXUPJXBXjss+QXlWLJChDEHDkA== dependencies: "@types/estree" "^1.0.0" devlop "^1.0.0" @@ -4395,9 +5871,9 @@ estree-util-to-js@^2.0.0: source-map "^0.7.0" estree-util-value-to-estree@^3.0.1: - version "3.4.0" - resolved "https://registry.yarnpkg.com/estree-util-value-to-estree/-/estree-util-value-to-estree-3.4.0.tgz#827122e40c3a756d3c4cf5d5d296fa06026a1a4f" - integrity sha512-Zlp+gxis+gCfK12d3Srl2PdX2ybsEA8ZYy6vQGVQTNNYLEGRQQ56XB64bjemN8kxIKXP1nC9ip4Z+ILy9LGzvQ== + version "3.5.0" + resolved "https://registry.yarnpkg.com/estree-util-value-to-estree/-/estree-util-value-to-estree-3.5.0.tgz#cd70cf37e7f78eae3e110d66a3436ce0d18a8f80" + integrity sha512-aMV56R27Gv3QmfmF1MY12GWkGzzeAezAX+UplqHVASfjc9wNzI/X6hC0S9oxq61WT4aQesLGslWP9tKk6ghRZQ== dependencies: "@types/estree" "^1.0.0" @@ -4444,12 +5920,19 @@ eventemitter3@^4.0.0, eventemitter3@^4.0.4: resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== +events-universal@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/events-universal/-/events-universal-1.0.1.tgz#b56a84fd611b6610e0a2d0f09f80fdf931e2dfe6" + integrity sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw== + dependencies: + bare-events "^2.7.0" + events@^3.2.0: version "3.3.0" resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== -execa@5.1.1, execa@^5.0.0: +execa@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== @@ -4464,39 +5947,44 @@ execa@5.1.1, execa@^5.0.0: signal-exit "^3.0.3" strip-final-newline "^2.0.0" -express@^4.17.3: - version "4.21.2" - resolved "https://registry.yarnpkg.com/express/-/express-4.21.2.tgz#cf250e48362174ead6cea4a566abef0162c1ec32" - integrity sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA== +expand-template@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-2.0.3.tgz#6e14b3fcee0f3a6340ecb57d2e8918692052a47c" + integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg== + +express@^4.22.1: + version "4.22.3" + resolved "https://registry.yarnpkg.com/express/-/express-4.22.3.tgz#e8f898d3c17582b1e311dd2c5cd6d8deff84724b" + integrity sha512-Bdcs4+3qlpVlx2NRn6fgX2Ue2/gGRaPeawebgclM0ERSCqDpA+owF1fdPwjJUTAJWMTuAaxjDf+hzb0/4eKvvw== dependencies: accepts "~1.3.8" array-flatten "1.1.1" - body-parser "1.20.3" - content-disposition "0.5.4" + body-parser "~1.20.5" + content-disposition "~0.5.4" content-type "~1.0.4" - cookie "0.7.1" - cookie-signature "1.0.6" + cookie "~0.7.1" + cookie-signature "~1.0.6" debug "2.6.9" depd "2.0.0" encodeurl "~2.0.0" escape-html "~1.0.3" etag "~1.8.1" - finalhandler "1.3.1" - fresh "0.5.2" - http-errors "2.0.0" + finalhandler "~1.3.1" + fresh "~0.5.2" + http-errors "~2.0.0" merge-descriptors "1.0.3" methods "~1.1.2" - on-finished "2.4.1" + on-finished "~2.4.1" parseurl "~1.3.3" - path-to-regexp "0.1.12" + path-to-regexp "~0.1.13" proxy-addr "~2.0.7" - qs "6.13.0" + qs "~6.16.0" range-parser "~1.2.1" safe-buffer "5.2.1" - send "0.19.0" - serve-static "1.16.2" + send "~0.19.0" + serve-static "~1.16.2" setprototypeof "1.2.0" - statuses "2.0.1" + statuses "~2.0.1" type-is "~1.6.18" utils-merge "1.0.1" vary "~1.1.2" @@ -4518,6 +6006,11 @@ fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== +fast-fifo@^1.2.0, fast-fifo@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/fast-fifo/-/fast-fifo-1.3.2.tgz#286e31de96eb96d38a97899815740ba2a4f3640c" + integrity sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ== + fast-glob@^3.2.11, fast-glob@^3.2.9, fast-glob@^3.3.0: version "3.3.3" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.3.tgz#d06d585ce8dba90a16b0505c543c3ccfb3aeb818" @@ -4535,14 +6028,14 @@ fast-json-stable-stringify@^2.0.0: integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== fast-uri@^3.0.1: - version "3.1.0" - resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.1.0.tgz#66eecff6c764c0df9b762e62ca7edcfb53b4edfa" - integrity sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA== + version "3.1.7" + resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.1.7.tgz#743157d957f3cbb4c65310e033dc2ad4ad7dc60a" + integrity sha512-dOvZVzjdZdz7phd9v6jCbwxrBW3fK6n8Rc0CtdmM4bumzMnxywBYhuph6J819RRw/ku+rLbelwfMunktuzVVHg== fastq@^1.6.0: - version "1.19.1" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.19.1.tgz#d50eaba803c8846a883c16492821ebcd2cda55f5" - integrity sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ== + version "1.20.3" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.20.3.tgz#7ab8731e647b56abcfeee997dae333ca3ee1d04d" + integrity sha512-XKv5nnLs6nLF71NgiKJLIZFLkPyIEuOselLG7ujZnGrRfQK8HpvY+WqKhAJUAdLomwVHErVS4LfxFlPq0/FTAw== dependencies: reusify "^1.0.4" @@ -4567,13 +6060,6 @@ feed@^4.2.2: dependencies: xml-js "^1.6.11" -figures@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" - integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== - dependencies: - escape-string-regexp "^1.0.5" - file-loader@^6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-6.2.0.tgz#baef7cf8e1840df325e4390b4484879480eebe4d" @@ -4589,17 +6075,17 @@ fill-range@^7.1.1: dependencies: to-regex-range "^5.0.1" -finalhandler@1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.3.1.tgz#0c575f1d1d324ddd1da35ad7ece3df7d19088019" - integrity sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ== +finalhandler@~1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.3.2.tgz#1ebc2228fc7673aac4a472c310cc05b77d852b88" + integrity sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg== dependencies: debug "2.6.9" encodeurl "~2.0.0" escape-html "~1.0.3" - on-finished "2.4.1" + on-finished "~2.4.1" parseurl "~1.3.3" - statuses "2.0.1" + statuses "~2.0.2" unpipe "~1.0.0" find-cache-dir@^4.0.0: @@ -4629,9 +6115,9 @@ flat@^5.0.2: integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== follow-redirects@^1.0.0: - version "1.15.11" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.11.tgz#777d73d72a92f8ec4d2e410eb47352a56b8e8340" - integrity sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ== + version "1.16.0" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.16.0.tgz#28474a159d3b9d11ef62050a14ed60e4df6d61bc" + integrity sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw== form-data-encoder@^2.1.2: version "2.1.4" @@ -4648,35 +6134,30 @@ forwarded@0.2.0: resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== -fraction.js@^4.3.7: - version "4.3.7" - resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.3.7.tgz#06ca0085157e42fda7f9e726e79fefc4068840f7" - integrity sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew== +fraction.js@^5.3.4: + version "5.3.4" + resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-5.3.4.tgz#8c0fcc6a9908262df4ed197427bdeef563e0699a" + integrity sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ== -fresh@0.5.2: +fresh@~0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== +fs-constants@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" + integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== + fs-extra@^11.1.1, fs-extra@^11.2.0: - version "11.3.2" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.3.2.tgz#c838aeddc6f4a8c74dd15f85e11fe5511bfe02a4" - integrity sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A== + version "11.4.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.4.0.tgz#f88ed6d180ac9e14b61b08e679468f0b1b6b4730" + integrity sha512-EQsFzMUJkCKGr1ePqlYADkIUmHW1s3ZXr5Yqy6wbGrfUCphpl2maM/kyOIRA2HpP3AaFQTZXD4ldjek+nccddA== dependencies: graceful-fs "^4.2.0" jsonfile "^6.0.1" universalify "^2.0.0" -fs-monkey@^1.0.4: - version "1.1.0" - resolved "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-1.1.0.tgz#632aa15a20e71828ed56b24303363fb1414e5997" - integrity sha512-QMUezzXWII9EV5aTFXW1UBVUO77wYPpjqIF8/AviUCThNeSYZykpoTixUeaNNBwmCev0AMDWMAni+f8Hxb1IFw== - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== - fsevents@~2.3.2: version "2.3.3" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" @@ -4726,6 +6207,11 @@ get-stream@^6.0.0, get-stream@^6.0.1: resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== +github-from-package@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce" + integrity sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw== + github-slugger@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/github-slugger/-/github-slugger-1.5.0.tgz#17891bbc73232051474d68bd867a34625c955f7d" @@ -4745,22 +6231,19 @@ glob-parent@^6.0.1: dependencies: is-glob "^4.0.3" -glob-to-regexp@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" - integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== +glob-to-regex.js@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/glob-to-regex.js/-/glob-to-regex.js-1.3.1.tgz#2f9fe8821218b18e6dcced9bcb4413932162db4b" + integrity sha512-zhWhMRsgnOym+1txhUmYJGD6eUsbUdrZv55gCYKuJX8t2p3+M8My23PD09bEIsreGUs5pnSa/idmcfp2/IlqGg== -glob@^7.1.3: - version "7.2.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" - integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== +glob@^13.0.0, glob@^13.0.3: + version "13.0.6" + resolved "https://registry.yarnpkg.com/glob/-/glob-13.0.6.tgz#078666566a425147ccacfbd2e332deb66a2be71d" + integrity sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw== dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.1.1" - once "^1.3.0" - path-is-absolute "^1.0.0" + minimatch "^10.2.2" + minipass "^7.1.3" + path-scurry "^2.0.2" global-dirs@^3.0.0: version "3.0.1" @@ -4831,16 +6314,6 @@ graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.11, resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== -gray-matter@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/gray-matter/-/gray-matter-4.0.3.tgz#e893c064825de73ea1f5f7d88c7a9f7274288798" - integrity sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q== - dependencies: - js-yaml "^3.13.1" - kind-of "^6.0.2" - section-matter "^1.0.0" - strip-bom-string "^1.0.0" - gzip-size@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-6.0.0.tgz#065367fd50c239c0671cbcbad5be3e2eeb10e462" @@ -4848,6 +6321,11 @@ gzip-size@^6.0.0: dependencies: duplexer "^0.1.2" +hachure-fill@^0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/hachure-fill/-/hachure-fill-0.5.2.tgz#d19bc4cc8750a5962b47fb1300557a85fcf934cc" + integrity sha512-3GKBOn+m2LX9iq+JC1064cSFprJY4jL1jCXTcpnfER5HYE2l/4EfWSGzkPa/ZDBmYI0ZOEj5VHV/eKnPGkHuOg== + handle-thing@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e" @@ -4875,10 +6353,10 @@ has-yarn@^3.0.0: resolved "https://registry.yarnpkg.com/has-yarn/-/has-yarn-3.0.0.tgz#c3c21e559730d1d3b57e28af1f30d06fac38147d" integrity sha512-IrsVwUHhEULx3R8f/aA8AHuEzAorplsab/v8HBzEiIukwq5i/EC+xmOW+HfP1OaDP+2JkgT1yILHN2O3UFIbcA== -hasown@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" - integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== +hasown@^2.0.2, hasown@^2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.4.tgz#8c62d8cb90beb2aad5d0a5b67581ad9854c3f003" + integrity sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A== dependencies: function-bind "^1.1.2" @@ -4966,14 +6444,14 @@ hast-util-to-jsx-runtime@^2.0.0: vfile-message "^4.0.0" hast-util-to-parse5@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/hast-util-to-parse5/-/hast-util-to-parse5-8.0.0.tgz#477cd42d278d4f036bc2ea58586130f6f39ee6ed" - integrity sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw== + version "8.0.1" + resolved "https://registry.yarnpkg.com/hast-util-to-parse5/-/hast-util-to-parse5-8.0.1.tgz#95aa391cc0514b4951418d01c883d1038af42f5d" + integrity sha512-MlWT6Pjt4CG9lFCjiz4BH7l9wmrMkfkJYCxFwKQic8+RTZgWPuWxwAfjJElsXkex7DJjfSJsQIt931ilUgmwdA== dependencies: "@types/hast" "^3.0.0" comma-separated-tokens "^2.0.0" devlop "^1.0.0" - property-information "^6.0.0" + property-information "^7.0.0" space-separated-tokens "^2.0.0" web-namespaces "^2.0.0" zwitch "^2.0.0" @@ -5030,11 +6508,6 @@ hpack.js@^2.1.6: readable-stream "^2.0.1" wbuf "^1.1.0" -html-entities@^2.3.2: - version "2.6.0" - resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-2.6.0.tgz#7c64f1ea3b36818ccae3d3fb48b6974208e984f8" - integrity sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ== - html-escaper@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" @@ -5077,9 +6550,9 @@ html-void-elements@^3.0.0: integrity sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg== html-webpack-plugin@^5.6.0: - version "5.6.4" - resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-5.6.4.tgz#d8cb0f7edff7745ae7d6cccb0bff592e9f7f7959" - integrity sha512-V/PZeWsqhfpE27nKeX9EO2sbR+D17A+tLf6qU+ht66jdUsN0QLKJN27Z+1+gHrVMKgndBahes0PU6rRihDgHTw== + version "5.6.8" + resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-5.6.8.tgz#5425dbc63eb533ffa59e92342be94894a125fc23" + integrity sha512-MZmKQcTnhEh1SPSyMiEytIeDZDUoBZVorNHivQGXMASHf/BSGGOrKa2xQ5bGx3TCe1n109ecCt+cpww7wwWhKA== dependencies: "@types/html-minifier-terser" "^6.0.0" html-minifier-terser "^6.0.2" @@ -5117,36 +6590,37 @@ http-deceiver@^1.2.7: resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" integrity sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw== -http-errors@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" - integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== +http-errors@~1.8.0: + version "1.8.1" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.8.1.tgz#7c3f28577cbc8a207388455dbd62295ed07bd68c" + integrity sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g== dependencies: - depd "2.0.0" + depd "~1.1.2" inherits "2.0.4" setprototypeof "1.2.0" - statuses "2.0.1" + statuses ">= 1.5.0 < 2" toidentifier "1.0.1" -http-errors@~1.6.2: - version "1.6.3" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" - integrity sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A== +http-errors@~2.0.0, http-errors@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.1.tgz#36d2f65bc909c8790018dd36fb4d93da6caae06b" + integrity sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ== dependencies: - depd "~1.1.2" - inherits "2.0.3" - setprototypeof "1.1.0" - statuses ">= 1.4.0 < 2" + depd "~2.0.0" + inherits "~2.0.4" + setprototypeof "~1.2.0" + statuses "~2.0.2" + toidentifier "~1.0.1" http-parser-js@>=0.5.1: version "0.5.10" resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.10.tgz#b3277bd6d7ed5588e20ea73bf724fcbe44609075" integrity sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA== -http-proxy-middleware@^2.0.3: - version "2.0.9" - resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.9.tgz#e9e63d68afaa4eee3d147f39149ab84c0c2815ef" - integrity sha512-c1IyJYLYppU574+YI7R4QyX2ystMtVXZwIdzazUIPIJsHuWNd+mho2j+bKoHftndicGj9yh+xjd+l0yj7VeT1Q== +http-proxy-middleware@^2.0.9: + version "2.0.10" + resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.10.tgz#b2df7b705203d7a8c269ac8450cf96b00c532f94" + integrity sha512-RKzRWNPxUZqbuk3BC5mGVJbBnWgr+diEnjJexIOytFbBzDy88Fbh/YvBr3DsNrl1jYAfjWfpATEv0NO35FDuPQ== dependencies: "@types/http-proxy" "^1.17.8" http-proxy "^1.18.1" @@ -5176,7 +6650,19 @@ human-signals@^2.1.0: resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== -iconv-lite@0.4.24: +hyperdyperid@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/hyperdyperid/-/hyperdyperid-1.2.0.tgz#59668d323ada92228d2a869d3e474d5a33b69e6b" + integrity sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A== + +iconv-lite@0.6: + version "0.6.3" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" + integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + +iconv-lite@~0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== @@ -5188,6 +6674,11 @@ icss-utils@^5.0.0, icss-utils@^5.1.0: resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-5.1.0.tgz#c6be6858abd013d768e98366ae47e25d5887b1ae" integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== +ieee754@^1.1.13: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + ignore@^5.2.0, ignore@^5.2.4: version "5.3.2" resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" @@ -5211,6 +6702,11 @@ import-lazy@^4.0.0: resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-4.0.0.tgz#e8eb627483a0a43da3c03f3e35548be5cb0cc153" integrity sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw== +import-meta-resolve@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/import-meta-resolve/-/import-meta-resolve-4.2.0.tgz#08cb85b5bd37ecc8eb1e0f670dc2767002d43734" + integrity sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg== + imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" @@ -5226,24 +6722,11 @@ infima@0.2.0-alpha.45: resolved "https://registry.yarnpkg.com/infima/-/infima-0.2.0-alpha.45.tgz#542aab5a249274d81679631b492973dd2c1e7466" integrity sha512-uyH0zfr1erU1OohLk0fT4Rrb94AOhguWNOcD9uGrSpRvNB+6gZXUoJX5J0NtvzBO10YZ9PgvA4NFgt+fYg8ojw== -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.3: +inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3, inherits@~2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== -inherits@2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" - integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw== - ini@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ini/-/ini-2.0.0.tgz#e5fd556ecdd5726be978fa1001862eacb0a94bc5" @@ -5254,10 +6737,20 @@ ini@^1.3.4, ini@~1.3.0: resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== -inline-style-parser@0.2.4: - version "0.2.4" - resolved "https://registry.yarnpkg.com/inline-style-parser/-/inline-style-parser-0.2.4.tgz#f4af5fe72e612839fcd453d989a586566d695f22" - integrity sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q== +inline-style-parser@0.2.7: + version "0.2.7" + resolved "https://registry.yarnpkg.com/inline-style-parser/-/inline-style-parser-0.2.7.tgz#b1fc68bfc0313b8685745e4464e37f9376b9c909" + integrity sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA== + +"internmap@1 - 2": + version "2.0.3" + resolved "https://registry.yarnpkg.com/internmap/-/internmap-2.0.3.tgz#6685f23755e43c524e251d29cbc97248e3061009" + integrity sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg== + +internmap@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/internmap/-/internmap-1.0.1.tgz#0017cc8a3b99605f0302f2b198d272e015e5df95" + integrity sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw== invariant@^2.2.4: version "2.2.4" @@ -5271,10 +6764,10 @@ ipaddr.js@1.9.1: resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== -ipaddr.js@^2.0.1: - version "2.2.0" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-2.2.0.tgz#d33fa7bac284f4de7af949638c9d68157c6b92e8" - integrity sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA== +ipaddr.js@^2.1.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-2.5.0.tgz#7d4b6c39f9392fb61cf807de6e425e22c10e061f" + integrity sha512-aq+t5NAc+cS6rZQQVWC2x98CPqGtKKTMDd4Gaodv0wShnItdKg/51djkGJ1hqH+Oy0ivDftCbSLCQob8zso01w== is-alphabetical@^2.0.0: version "2.0.1" @@ -5294,6 +6787,11 @@ is-arrayish@^0.2.1: resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== +is-arrayish@^0.3.1: + version "0.3.4" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.4.tgz#1ee5553818511915685d33bb13d31bf854e5059d" + integrity sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA== + is-binary-path@~2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" @@ -5308,12 +6806,12 @@ is-ci@^3.0.1: dependencies: ci-info "^3.2.0" -is-core-module@^2.16.0: - version "2.16.1" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.16.1.tgz#2a98801a849f43e2add644fbb6bc6229b19a4ef4" - integrity sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w== +is-core-module@^2.16.1: + version "2.16.2" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.16.2.tgz#3e07450a8080ebce3fbf0cac494f4d2ab324e082" + integrity sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA== dependencies: - hasown "^2.0.2" + hasown "^2.0.3" is-decimal@^2.0.0: version "2.0.1" @@ -5325,6 +6823,11 @@ is-docker@^2.0.0, is-docker@^2.1.1: resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== +is-docker@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-3.0.0.tgz#90093aa3106277d8a77a5910dbae71747e15a200" + integrity sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ== + is-extendable@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" @@ -5352,6 +6855,13 @@ is-hexadecimal@^2.0.0: resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz#86b5bf668fca307498d319dfc03289d781a90027" integrity sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg== +is-inside-container@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-inside-container/-/is-inside-container-1.0.0.tgz#e81fba699662eb31dbdaf26766a61d4814717ea4" + integrity sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA== + dependencies: + is-docker "^3.0.0" + is-installed-globally@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.4.0.tgz#9a0fd407949c30f86eb6959ef1b7994ed0b7b520" @@ -5360,6 +6870,11 @@ is-installed-globally@^0.4.0: global-dirs "^3.0.0" is-path-inside "^3.0.2" +is-network-error@^1.0.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/is-network-error/-/is-network-error-1.3.2.tgz#9460bc30f8419a4bca77114f4de88a3ee5e0c519" + integrity sha512-PhBY86zaxNZUuWP6h13Vu5oFe0XY6/UlKzQnYFELzGVHygP3MxmvTfYSG7GN3aIab/iWudSMgjSnG9Dq+nHrgA== + is-npm@^6.0.0: version "6.1.0" resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-6.1.0.tgz#f70e0b6c132dfc817ac97d3badc0134945b098d3" @@ -5424,6 +6939,13 @@ is-wsl@^2.2.0: dependencies: is-docker "^2.0.0" +is-wsl@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-3.1.1.tgz#327897b26832a3eb117da6c27492d04ca132594f" + integrity sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw== + dependencies: + is-inside-container "^1.0.0" + is-yarn-global@^0.4.0: version "0.4.1" resolved "https://registry.yarnpkg.com/is-yarn-global/-/is-yarn-global-0.4.1.tgz#b312d902b313f81e4eaf98b6361ba2b45cd694bb" @@ -5486,9 +7008,9 @@ jiti@^1.20.0: integrity sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A== joi@^17.9.2: - version "17.13.3" - resolved "https://registry.yarnpkg.com/joi/-/joi-17.13.3.tgz#0f5cc1169c999b30d344366d384b12d92558bcec" - integrity sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA== + version "17.13.8" + resolved "https://registry.yarnpkg.com/joi/-/joi-17.13.8.tgz#92069d521eea09fd709d8abbb86b0ef02862224f" + integrity sha512-iPKOGmiRw1jxf/JOPwxmCcUQAOdF359mdzYiP2DJ+TMX0YK2zjK3D+zYOaGjpumWxOFF/l2xVWjRVK5bGSLdEw== dependencies: "@hapi/hoek" "^9.3.0" "@hapi/topo" "^5.1.0" @@ -5501,37 +7023,24 @@ joi@^17.9.2: resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -js-yaml@^3.13.1: - version "3.14.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" - integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - js-yaml@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" - integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + version "4.3.2" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.3.2.tgz#8e44fb14a2643c59726bb15787b5f1512cb3d3fb" + integrity sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA== dependencies: argparse "^2.0.1" -jsesc@^3.0.2: +jsesc@^3.0.2, jsesc@~3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.1.0.tgz#74d335a234f67ed19907fdadfac7ccf9d409825d" integrity sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA== -jsesc@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.0.2.tgz#bb8b09a6597ba426425f2e4a07245c3d00b9343e" - integrity sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g== - json-buffer@3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== -json-parse-even-better-errors@^2.3.0, json-parse-even-better-errors@^2.3.1: +json-parse-even-better-errors@^2.3.0: version "2.3.1" resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== @@ -5552,14 +7061,21 @@ json5@^2.1.2, json5@^2.2.3: integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== jsonfile@^6.0.1: - version "6.2.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.2.0.tgz#7c265bd1b65de6977478300087c99f1c84383f62" - integrity sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg== + version "6.2.1" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.2.1.tgz#b6e31717f22cc37330b081ce0051ed5de53af2f6" + integrity sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q== dependencies: universalify "^2.0.0" optionalDependencies: graceful-fs "^4.1.6" +katex@^0.16.47: + version "0.16.47" + resolved "https://registry.yarnpkg.com/katex/-/katex-0.16.47.tgz#0a13a42c2deb4f74e61f162d440b9165a548030f" + integrity sha512-Eeo8Ys1doU1z+x8AZsPpQu+p/QcZBI5PeOo7QGQdy2x2m0MU/hYagBbGOmXwr5KVbEfVuWv9LpnQWeehogurjg== + dependencies: + commander "^8.3.0" + keyv@^4.5.3: version "4.5.4" resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" @@ -5567,7 +7083,12 @@ keyv@^4.5.3: dependencies: json-buffer "3.0.1" -kind-of@^6.0.0, kind-of@^6.0.2: +khroma@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/khroma/-/khroma-2.1.0.tgz#45f2ce94ce231a437cf5b63c2e886e6eb42bbbb1" + integrity sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw== + +kind-of@^6.0.0, kind-of@^6.0.2, kind-of@^6.0.3: version "6.0.3" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== @@ -5584,19 +7105,103 @@ latest-version@^7.0.0: dependencies: package-json "^8.1.0" -launch-editor@^2.6.0: - version "2.11.1" - resolved "https://registry.yarnpkg.com/launch-editor/-/launch-editor-2.11.1.tgz#61a0b7314a42fd84a6cbb564573d9e9ffcf3d72b" - integrity sha512-SEET7oNfgSaB6Ym0jufAdCeo3meJVeCaaDyzRygy0xsp2BFKCprcfHljTq4QkzTLUxEKkFK6OK4811YM2oSrRg== +launch-editor@^2.14.1: + version "2.14.1" + resolved "https://registry.yarnpkg.com/launch-editor/-/launch-editor-2.14.1.tgz#f7e0da3f58aaea03fea01074d840b5f739ed7ddc" + integrity sha512-QWBrQsMpH7gPr965dsKD/3cKWiNoTjpATQf++Xq63N6sKRGMwlVXz41O1IZTMfZQgBctD/K5Zt06+/I6pP6+HA== dependencies: picocolors "^1.1.1" - shell-quote "^1.8.3" + shell-quote "^1.8.4" + +layout-base@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/layout-base/-/layout-base-1.0.2.tgz#1291e296883c322a9dd4c5dd82063721b53e26e2" + integrity sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg== + +layout-base@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/layout-base/-/layout-base-2.0.1.tgz#d0337913586c90f9c2c075292069f5c2da5dd285" + integrity sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg== leven@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== +lightningcss-android-arm64@1.33.0: + version "1.33.0" + resolved "https://registry.yarnpkg.com/lightningcss-android-arm64/-/lightningcss-android-arm64-1.33.0.tgz#9a6841f88ae50fc83502903892b41af41bc2b907" + integrity sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg== + +lightningcss-darwin-arm64@1.33.0: + version "1.33.0" + resolved "https://registry.yarnpkg.com/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.33.0.tgz#c0f2c31c0bfd19fa4dd3f18e957a1f1a152097d6" + integrity sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg== + +lightningcss-darwin-x64@1.33.0: + version "1.33.0" + resolved "https://registry.yarnpkg.com/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.33.0.tgz#cb0705965acb538c6683949ce6925fb3cdf7c361" + integrity sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ== + +lightningcss-freebsd-x64@1.33.0: + version "1.33.0" + resolved "https://registry.yarnpkg.com/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.33.0.tgz#763538828b26bab2680dadafcc84ee78b0eb502b" + integrity sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg== + +lightningcss-linux-arm-gnueabihf@1.33.0: + version "1.33.0" + resolved "https://registry.yarnpkg.com/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.33.0.tgz#6862e3176a331aedbdec1ed352b4d7d0dd0784de" + integrity sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ== + +lightningcss-linux-arm64-gnu@1.33.0: + version "1.33.0" + resolved "https://registry.yarnpkg.com/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.33.0.tgz#c6a3a2ed15141daf6bdc2628930f8e39bdf473aa" + integrity sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg== + +lightningcss-linux-arm64-musl@1.33.0: + version "1.33.0" + resolved "https://registry.yarnpkg.com/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.33.0.tgz#7fa1334971fc82845f9827df6ef8a0b20914bac6" + integrity sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ== + +lightningcss-linux-x64-gnu@1.33.0: + version "1.33.0" + resolved "https://registry.yarnpkg.com/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.33.0.tgz#8b927862ea8c2bbc6831a46509244b50d9936e55" + integrity sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg== + +lightningcss-linux-x64-musl@1.33.0: + version "1.33.0" + resolved "https://registry.yarnpkg.com/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.33.0.tgz#0c525bb077dfd94404c059cfe42dad797e96aeaf" + integrity sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw== + +lightningcss-win32-arm64-msvc@1.33.0: + version "1.33.0" + resolved "https://registry.yarnpkg.com/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.33.0.tgz#850ee1103dac989cfab50e3ac22d1a69e394e63d" + integrity sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA== + +lightningcss-win32-x64-msvc@1.33.0: + version "1.33.0" + resolved "https://registry.yarnpkg.com/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.33.0.tgz#e343ae152eed3609dc6e11949d1a3bf39a1c946f" + integrity sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA== + +lightningcss@^1.27.0: + version "1.33.0" + resolved "https://registry.yarnpkg.com/lightningcss/-/lightningcss-1.33.0.tgz#c08867d71a79385c6e190214fd72fef3e5f95f0b" + integrity sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA== + dependencies: + detect-libc "^2.0.3" + optionalDependencies: + lightningcss-android-arm64 "1.33.0" + lightningcss-darwin-arm64 "1.33.0" + lightningcss-darwin-x64 "1.33.0" + lightningcss-freebsd-x64 "1.33.0" + lightningcss-linux-arm-gnueabihf "1.33.0" + lightningcss-linux-arm64-gnu "1.33.0" + lightningcss-linux-arm64-musl "1.33.0" + lightningcss-linux-x64-gnu "1.33.0" + lightningcss-linux-x64-musl "1.33.0" + lightningcss-win32-arm64-msvc "1.33.0" + lightningcss-win32-x64-msvc "1.33.0" + lilconfig@^3.1.1: version "3.1.3" resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-3.1.3.tgz#a1bcfd6257f9585bf5ae14ceeebb7b559025e4c4" @@ -5607,11 +7212,6 @@ lines-and-columns@^1.1.6: resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== -loader-runner@^4.2.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.3.0.tgz#c1b4a163b99f614830353b16755e7149ac2314e1" - integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== - loader-utils@^2.0.0: version "2.0.4" resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.4.tgz#8b5cb38b5c34a9a018ee1fc0e6a066d1dfcc528c" @@ -5628,6 +7228,16 @@ locate-path@^7.1.0: dependencies: p-locate "^6.0.0" +lodash-es@4.17.23: + version "4.17.23" + resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.23.tgz#58c4360fd1b5d33afc6c0bbd3d1149349b1138e0" + integrity sha512-kVI48u3PZr38HdYz98UmfPnXl2DXrpdctLrFLCd3kOx1xUkOmpFPx7gCWWM5MPkL/fD8zb+Ph0QzjGFs4+hHWg== + +lodash-es@^4.17.21: + version "4.18.1" + resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.18.1.tgz#b962eeb80d9d983a900bf342961fb7418ca10b1d" + integrity sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A== + lodash.debounce@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" @@ -5644,9 +7254,9 @@ lodash.uniq@^4.5.0: integrity sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ== lodash@^4.17.20, lodash@^4.17.21: - version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + version "4.18.1" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.18.1.tgz#ff2b66c1f6326d59513de2407bf881439812771c" + integrity sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q== longest-streak@^3.0.0: version "3.1.0" @@ -5672,6 +7282,11 @@ lowercase-keys@^3.0.0: resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-3.0.0.tgz#c5e7d442e37ead247ae9db117a9d0a467c89d4f2" integrity sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ== +lru-cache@^11.0.0: + version "11.5.2" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-11.5.2.tgz#00e16665c90c620fba14a3c368732a976493f760" + integrity sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g== + lru-cache@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" @@ -5684,18 +7299,16 @@ markdown-extensions@^2.0.0: resolved "https://registry.yarnpkg.com/markdown-extensions/-/markdown-extensions-2.0.0.tgz#34bebc83e9938cae16e0e017e4a9814a8330d3c4" integrity sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q== -markdown-table@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/markdown-table/-/markdown-table-2.0.0.tgz#194a90ced26d31fe753d8b9434430214c011865b" - integrity sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A== - dependencies: - repeat-string "^1.0.0" - markdown-table@^3.0.0: version "3.0.4" resolved "https://registry.yarnpkg.com/markdown-table/-/markdown-table-3.0.4.tgz#fe44d6d410ff9d6f2ea1797a3f60aa4d2b631c2a" integrity sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw== +marked@^16.3.0: + version "16.4.2" + resolved "https://registry.yarnpkg.com/marked/-/marked-16.4.2.tgz#4959a64be6c486f0db7467ead7ce288de54290a3" + integrity sha512-TI3V8YYWvkVf3KJe1dRkpnjs68JUPyEa5vjKrp1XEEJUAOaQc+Qj+L1qWbPd0SJuAdQkFU0h73sXXqwDYxsiDA== + math-intrinsics@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9" @@ -5727,9 +7340,9 @@ mdast-util-find-and-replace@^3.0.0, mdast-util-find-and-replace@^3.0.1: unist-util-visit-parents "^6.0.0" mdast-util-from-markdown@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.2.tgz#4850390ca7cf17413a9b9a0fbefcd1bc0eb4160a" - integrity sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA== + version "2.0.3" + resolved "https://registry.yarnpkg.com/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.3.tgz#c95822b91aab75f18a4cbe8b2f51b873ed2cf0c7" + integrity sha512-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q== dependencies: "@types/mdast" "^4.0.0" "@types/unist" "^3.0.0" @@ -5883,9 +7496,9 @@ mdast-util-phrasing@^4.0.0: unist-util-is "^6.0.0" mdast-util-to-hast@^13.0.0: - version "13.2.0" - resolved "https://registry.yarnpkg.com/mdast-util-to-hast/-/mdast-util-to-hast-13.2.0.tgz#5ca58e5b921cc0a3ded1bc02eed79a4fe4fe41f4" - integrity sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA== + version "13.2.1" + resolved "https://registry.yarnpkg.com/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz#d7ff84ca499a57e2c060ae67548ad950e689a053" + integrity sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA== dependencies: "@types/hast" "^3.0.0" "@types/mdast" "^4.0.0" @@ -5934,12 +7547,25 @@ media-typer@0.3.0: resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== -memfs@^3.4.3: - version "3.6.0" - resolved "https://registry.yarnpkg.com/memfs/-/memfs-3.6.0.tgz#d7a2110f86f79dd950a8b6df6d57bc984aa185f6" - integrity sha512-EGowvkkgbMcIChjMTMkESFDbZeSh8xZ7kNSF0hAiAN4Jh6jgHCRS0Ga/+C8y6Au+oqpezRHCfPsmJ2+DwAgiwQ== - dependencies: - fs-monkey "^1.0.4" +memfs@^4.17.0, memfs@^4.43.1: + version "4.78.0" + resolved "https://registry.yarnpkg.com/memfs/-/memfs-4.78.0.tgz#b6b6d033c88b2b666a8489a5a696fdd899aee0b0" + integrity sha512-gX14RGPP+fyNodL8g9jc5DfKtWNCronEMItOKDyZatTI3CPpMZDPtm7rAbftDqQAFovP4nzR0RO80sESSEnI4g== + dependencies: + "@jsonjoy.com/fs-core" "4.78.0" + "@jsonjoy.com/fs-fsa" "4.78.0" + "@jsonjoy.com/fs-node" "4.78.0" + "@jsonjoy.com/fs-node-builtins" "4.78.0" + "@jsonjoy.com/fs-node-to-fsa" "4.78.0" + "@jsonjoy.com/fs-node-utils" "4.78.0" + "@jsonjoy.com/fs-print" "4.78.0" + "@jsonjoy.com/fs-snapshot" "4.78.0" + "@jsonjoy.com/json-pack" "^1.11.0" + "@jsonjoy.com/util" "^1.9.0" + glob-to-regex.js "^1.3.1" + thingies "^2.5.0" + tree-dump "^1.0.3" + tslib "^2.0.0" merge-descriptors@1.0.3: version "1.0.3" @@ -5956,6 +7582,35 @@ merge2@^1.3.0, merge2@^1.4.1: resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== +mermaid@>=11.6.0: + version "12.0.0" + resolved "https://registry.yarnpkg.com/mermaid/-/mermaid-12.0.0.tgz#3c4cdf54fd24110c988b90def857127055eb842b" + integrity sha512-/wQXC9iBxoGV8p3erbvaXs9h77VyLDBH6GdayVjj3hEcSQhFU4N1WUhUppotCEqlIxI2pRMwjwBSwTB1MfZBgQ== + dependencies: + "@braintree/sanitize-url" "^7.1.2" + "@iconify/utils" "^3.0.2" + "@mermaid-js/parser" "^2.0.0" + "@types/d3" "^7.4.3" + "@upsetjs/venn.js" "^2.0.0" + chevrotain "~11.1.2" + cytoscape "^3.34.0" + cytoscape-cose-bilkent "^4.1.0" + cytoscape-fcose "^2.2.0" + d3 "^7.9.0" + d3-sankey "^0.12.3" + dagre-d3-es "7.0.14" + dayjs "^1.11.21" + dompurify "^3.4.12" + elkjs "^0.9.3" + es-toolkit "^1.45.1" + katex "^0.16.47" + khroma "^2.1.0" + marked "^16.3.0" + roughjs "^4.6.6" + stylis "^4.3.6" + ts-dedent "^2.2.0" + uuid "^11.1.0 || ^12 || ^13 || ^14.0.0" + methods@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" @@ -6043,9 +7698,9 @@ micromark-extension-gfm-strikethrough@^2.0.0: micromark-util-types "^2.0.0" micromark-extension-gfm-table@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz#fac70bcbf51fe65f5f44033118d39be8a9b5940b" - integrity sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg== + version "2.1.2" + resolved "https://registry.yarnpkg.com/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.2.tgz#54dc246873c0c0bebd84600e578aeb8a5f5de78d" + integrity sha512-pRzm4kDTu0MjlmBkxmS9yYhw60nncfcEwu9NNdPFSQEFXS95ZKyIIyTSHu/o3ReBUrLKYEq+7YaXCRn/bPB4MA== dependencies: devlop "^1.0.0" micromark-factory-space "^2.0.0" @@ -6390,7 +8045,7 @@ mime-db@1.52.0: resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== -"mime-db@>= 1.43.0 < 2": +"mime-db@>= 1.43.0 < 2", mime-db@^1.54.0: version "1.54.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.54.0.tgz#cddb3ee4f9c64530dff640236661d42cb6a314f5" integrity sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ== @@ -6407,13 +8062,20 @@ mime-types@2.1.18: dependencies: mime-db "~1.33.0" -mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.17, mime-types@~2.1.24, mime-types@~2.1.34: +mime-types@^2.1.27, mime-types@~2.1.24, mime-types@~2.1.34, mime-types@~2.1.35: version "2.1.35" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== dependencies: mime-db "1.52.0" +mime-types@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-3.0.2.tgz#39002d4182575d5af036ffa118100f2524b2e2ab" + integrity sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A== + dependencies: + mime-db "^1.54.0" + mime@1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" @@ -6435,9 +8097,9 @@ mimic-response@^4.0.0: integrity sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg== mini-css-extract-plugin@^2.9.2: - version "2.9.4" - resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.4.tgz#cafa1a42f8c71357f49cd1566810d74ff1cb0200" - integrity sha512-ZWYT7ln73Hptxqxk2DxPU9MmapXRhxkJD6tkSR04dnQxm8BGu2hzgKLugK5yySD97u/8yy7Ma7E76k9ZdvtjkQ== + version "2.10.2" + resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-2.10.2.tgz#5c85ec9450c05d26e32531b465a15a08c3a57253" + integrity sha512-AOSS0IdEB95ayVkxn5oGzNQwqAi2J0Jb/kKm43t7H73s8+f5873g0yuj0PNvK4dO75mu5DHg4nlgp4k6Kga8eg== dependencies: schema-utils "^4.0.0" tapable "^2.2.1" @@ -6447,18 +8109,45 @@ minimalistic-assert@^1.0.0: resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== -minimatch@3.1.2, minimatch@^3.1.1: - version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== +minimatch@3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.5.tgz#580c88f8d5445f2bd6aa8f3cadefa0de79fbd69e" + integrity sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w== dependencies: brace-expansion "^1.1.7" -minimist@^1.2.0: +minimatch@^10.2.2: + version "10.2.6" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-10.2.6.tgz#fd956bbe0b77241e9f15ac5dccb1c638060968ef" + integrity sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A== + dependencies: + brace-expansion "^5.0.8" + +minimist@^1.2.0, minimist@^1.2.3: version "1.2.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== +minimizer-webpack-plugin@^5.7.0: + version "5.10.1" + resolved "https://registry.yarnpkg.com/minimizer-webpack-plugin/-/minimizer-webpack-plugin-5.10.1.tgz#333ad27a53fcd51bbd868252a4733ee08480b021" + integrity sha512-+dsZEyTcy1lkq41lxdiOqvb26gXbYGgwY+30w37f9PqUVkuEBejBLDotsHOTjuga9xJyGLW2DqzKDUyJ4W/PMQ== + dependencies: + "@jridgewell/trace-mapping" "^0.3.31" + jest-worker "^27.4.5" + schema-utils "^4.3.3" + terser "^5.51.0" + +minipass@^7.1.2, minipass@^7.1.3: + version "7.1.3" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.3.tgz#79389b4eb1bb2d003a9bba87d492f2bd37bdc65b" + integrity sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A== + +mkdirp-classic@^0.5.2, mkdirp-classic@^0.5.3: + version "0.5.3" + resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" + integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== + mrmime@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/mrmime/-/mrmime-2.0.1.tgz#bc3e87f7987853a54c9850eeb1f1078cd44adddc" @@ -6482,10 +8171,15 @@ multicast-dns@^7.2.5: dns-packet "^5.2.2" thunky "^1.0.2" -nanoid@^3.3.11: - version "3.3.11" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.11.tgz#4f4f112cefbe303202f2199838128936266d185b" - integrity sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w== +nanoid@^3.3.18: + version "3.3.19" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.19.tgz#336d4aa4bcd4fb24d2cddede7ffeae40bec03f0a" + integrity sha512-Y2tUNy4ouw6tq5oDSKeQYGOyhkUBhNOcGV/02KC+6kd9eDGqdZd++mjMiIDilrBYvjEnCYvVtsuHCuP+okSfug== + +napi-build-utils@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/napi-build-utils/-/napi-build-utils-2.0.0.tgz#13c22c0187fcfccce1461844136372a47ddc027e" + integrity sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA== negotiator@0.6.3: version "0.6.3" @@ -6497,11 +8191,6 @@ negotiator@~0.6.4: resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.4.tgz#777948e2452651c570b712dd01c23e262713fff7" integrity sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w== -neo-async@^2.6.2: - version "2.6.2" - resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" - integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== - no-case@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" @@ -6510,6 +8199,18 @@ no-case@^3.0.4: lower-case "^2.0.2" tslib "^2.0.3" +node-abi@^3.3.0: + version "3.96.0" + resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.96.0.tgz#8b038bc6cca97d6cec2e9aafdb81b900da1ff80d" + integrity sha512-rebQ/lz7i0EkoLzUVSrKRzA69zMkwLp95kKMWoMDkkM00Suxz0D7zEQPwRml5fQum24mj7bPvmlgLAmu2JCiYg== + dependencies: + semver "^7.3.5" + +node-addon-api@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-6.1.0.tgz#ac8470034e58e67d0c6f1204a18ae6995d9c0d76" + integrity sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA== + node-emoji@^2.1.0: version "2.2.0" resolved "https://registry.yarnpkg.com/node-emoji/-/node-emoji-2.2.0.tgz#1d000e3c76e462577895be1b436f4aa2d6760eb0" @@ -6520,30 +8221,20 @@ node-emoji@^2.1.0: emojilib "^2.4.0" skin-tone "^2.0.0" -node-forge@^1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.3.1.tgz#be8da2af243b2417d5f646a770663a92b7e9ded3" - integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA== - -node-releases@^2.0.21: - version "2.0.21" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.21.tgz#f59b018bc0048044be2d4c4c04e4c8b18160894c" - integrity sha512-5b0pgg78U3hwXkCM8Z9b2FJdPZlr9Psr9V2gQPESdGHqbntyFJKFW4r5TeWGFzafGY3hzs1JC62VEQMbl1JFkw== +node-releases@^2.0.54: + version "2.0.55" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.55.tgz#c52faedb68001dcfe77495b5ed1ac5827a1788fc" + integrity sha512-mIrE/Cw9y+9Au6dS5vDKDhQza9YvG6w+ZrS6X+ZzA7yFW/soAeaups4Qzn1bL6g5FVy8WtP79+0j82oPIbqRjQ== normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== -normalize-range@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" - integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== - normalize-url@^8.0.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-8.1.0.tgz#d33504f67970decf612946fd4880bc8c0983486d" - integrity sha512-X06Mfd/5aKsRHc0O0J5CUedwnPmnDtLF2+nq+KN9KSDlJHkPuh0JUviWjEWMe0SW/9TDdSLVPuk7L5gGTIA1/w== + version "8.1.1" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-8.1.1.tgz#751a20c8520e5725404c06015fea21d7567f25ef" + integrity sha512-JYc0DPlpGWB40kH5g07gGTrYuMqV653k3uBKY6uITPWds3M0ov3GaWGp9lbE3Bzngx8+XkfzgvASb9vk9JDFXQ== npm-run-path@^4.0.1: version "4.0.1" @@ -6577,7 +8268,7 @@ object-assign@^4.1.1: resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== -object-inspect@^1.13.3: +object-inspect@^1.13.3, object-inspect@^1.13.4: version "1.13.4" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.4.tgz#8375265e21bc20d0fa582c22e1b13485d6e00213" integrity sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew== @@ -6604,7 +8295,7 @@ obuf@^1.0.0, obuf@^1.1.2: resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== -on-finished@2.4.1: +on-finished@^2.4.1, on-finished@~2.4.1: version "2.4.1" resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== @@ -6616,7 +8307,7 @@ on-headers@~1.1.0: resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.1.0.tgz#59da4f91c45f5f989c6e4bcedc5a3b0aed70ff65" integrity sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A== -once@^1.3.0: +once@^1.3.1, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== @@ -6630,7 +8321,17 @@ onetime@^5.1.2: dependencies: mimic-fn "^2.1.0" -open@^8.0.9, open@^8.4.0: +open@^10.0.3: + version "10.2.0" + resolved "https://registry.yarnpkg.com/open/-/open-10.2.0.tgz#b9d855be007620e80b6fb05fac98141fe62db73c" + integrity sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA== + dependencies: + default-browser "^5.2.1" + define-lazy-prop "^3.0.0" + is-inside-container "^1.0.0" + wsl-utils "^0.1.0" + +open@^8.4.0: version "8.4.2" resolved "https://registry.yarnpkg.com/open/-/open-8.4.2.tgz#5b5ffe2a8f793dcd2aad73e550cb87b59cb084f9" integrity sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ== @@ -6683,12 +8384,13 @@ p-queue@^6.6.2: eventemitter3 "^4.0.4" p-timeout "^3.2.0" -p-retry@^4.5.0: - version "4.6.2" - resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-4.6.2.tgz#9baae7184057edd4e17231cee04264106e092a16" - integrity sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ== +p-retry@^6.2.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-6.2.1.tgz#81828f8dc61c6ef5a800585491572cc9892703af" + integrity sha512-hEt02O4hUct5wtwg4H4KcWgDdm+l1bOaEy/hWzd8xtXB9BqxTWBBhb+2ImAtH4Cv4rPjV76xN3Zumqk3k3AhhQ== dependencies: - "@types/retry" "0.12.0" + "@types/retry" "0.12.2" + is-network-error "^1.0.0" retry "^0.13.1" p-timeout@^3.2.0: @@ -6698,6 +8400,11 @@ p-timeout@^3.2.0: dependencies: p-finally "^1.0.0" +package-json-from-dist@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz#4f1471a010827a86f94cfd9b0727e36d267de505" + integrity sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw== + package-json@^8.1.0: version "8.1.1" resolved "https://registry.yarnpkg.com/package-json/-/package-json-8.1.1.tgz#3e9948e43df40d1e8e78a85485f1070bf8f03dc8" @@ -6708,6 +8415,11 @@ package-json@^8.1.0: registry-url "^6.0.0" semver "^7.3.7" +package-manager-detector@^1.7.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/package-manager-detector/-/package-manager-detector-1.8.0.tgz#70c9a2c4bd1a513dcd6cad006a9fcebec22a1253" + integrity sha512-yQA4H19AmPEoMUeavPMDIe1higySl/gH/yaQrkT/s07Qp+7pp2hYz30N3z2l5BkjVkF9Ow6o0wjJamm2y7Sn0A== + param-case@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/param-case/-/param-case-3.0.4.tgz#7d17fe4aa12bde34d4a77d91acfb6219caad01c5" @@ -6766,7 +8478,7 @@ parse5@^7.0.0: dependencies: entities "^6.0.0" -parseurl@~1.3.2, parseurl@~1.3.3: +parseurl@~1.3.3: version "1.3.3" resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== @@ -6779,16 +8491,16 @@ pascal-case@^3.1.2: no-case "^3.0.4" tslib "^2.0.3" +path-data-parser@0.1.0, path-data-parser@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/path-data-parser/-/path-data-parser-0.1.0.tgz#8f5ba5cc70fc7becb3dcefaea08e2659aba60b8c" + integrity sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w== + path-exists@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-5.0.0.tgz#a6aad9489200b21fab31e49cf09277e5116fb9e7" integrity sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ== -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== - path-is-inside@1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" @@ -6804,10 +8516,13 @@ path-parse@^1.0.7: resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== -path-to-regexp@0.1.12: - version "0.1.12" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.12.tgz#d5e1a12e478a976d432ef3c58d534b9923164bb7" - integrity sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ== +path-scurry@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-2.0.2.tgz#6be0d0ee02a10d9e0de7a98bae65e182c9061f85" + integrity sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg== + dependencies: + lru-cache "^11.0.0" + minipass "^7.1.2" path-to-regexp@3.3.0: version "3.3.0" @@ -6821,6 +8536,11 @@ path-to-regexp@^1.7.0: dependencies: isarray "0.0.1" +path-to-regexp@~0.1.13: + version "0.1.13" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.13.tgz#9b22ec16bc3ab88d05a0c7e369869421401ab17d" + integrity sha512-A/AGNMFN3c8bOlvV9RreMdrv7jsmF9XIfDeCd87+I8RNg6s78BhJxMu69NEMHBSJFxKidViTEdruRwEk/WIKqA== + path-type@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" @@ -6832,9 +8552,9 @@ picocolors@^1.0.0, picocolors@^1.1.1: integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3, picomatch@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" - integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + version "2.3.2" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.2.tgz#5a942915e26b372dc0f0e6753149a16e6b1c5601" + integrity sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA== pkg-dir@^7.0.0: version "7.0.0" @@ -6843,6 +8563,31 @@ pkg-dir@^7.0.0: dependencies: find-up "^6.3.0" +pkijs@^3.3.3: + version "3.4.0" + resolved "https://registry.yarnpkg.com/pkijs/-/pkijs-3.4.0.tgz#d9164def30ff6d97be2d88966d5e36192499ca9c" + integrity sha512-emEcLuomt2j03vxD54giVB4SxTjnsqkU692xZOZXHDVoYyypEm+b3jpiTcc+Cf+myooc+/Ly0z01jqeNHVgJGw== + dependencies: + "@noble/hashes" "1.4.0" + asn1js "^3.0.6" + bytestreamjs "^2.0.1" + pvtsutils "^1.3.6" + pvutils "^1.1.3" + tslib "^2.8.1" + +points-on-curve@0.2.0, points-on-curve@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/points-on-curve/-/points-on-curve-0.2.0.tgz#7dbb98c43791859434284761330fa893cb81b4d1" + integrity sha512-0mYKnYYe9ZcqMCWhUjItv/oHjvgEsfKvnUTg8sAtnHr3GVy7rGkXCb6d5cSyqrWqL4k81b9CPg3urd+T7aop3A== + +points-on-path@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/points-on-path/-/points-on-path-0.2.1.tgz#553202b5424c53bed37135b318858eacff85dd52" + integrity sha512-25ClnWWuw7JbWZcgqY/gJ4FQWadKxGWk+3kR/7kD0tCaDtPPMj7oHu2ToLaVhfpnHrZzYby2w6tUA0eOIuUg8g== + dependencies: + path-data-parser "0.1.0" + points-on-curve "0.2.0" + postcss-attribute-case-insensitive@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-7.0.1.tgz#0c4500e3bcb2141848e89382c05b5a31c23033a3" @@ -6865,15 +8610,15 @@ postcss-clamp@^4.1.0: dependencies: postcss-value-parser "^4.2.0" -postcss-color-functional-notation@^7.0.11: - version "7.0.11" - resolved "https://registry.yarnpkg.com/postcss-color-functional-notation/-/postcss-color-functional-notation-7.0.11.tgz#ad6b3d2e71fedd94a932f96260b596c33c53c6a5" - integrity sha512-zfqoUSaHMko/k2PA9xnaydVTHqYv5vphq5Q2AHcG/dCdv/OkHYWcVWfVTBKZ526uzT8L7NghuvSw3C9PxlKnLg== +postcss-color-functional-notation@^7.0.12: + version "7.0.12" + resolved "https://registry.yarnpkg.com/postcss-color-functional-notation/-/postcss-color-functional-notation-7.0.12.tgz#9a3df2296889e629fde18b873bb1f50a4ecf4b83" + integrity sha512-TLCW9fN5kvO/u38/uesdpbx3e8AkTYhMvDZYa9JpmImWuTE99bDQ7GU7hdOADIZsiI9/zuxfAJxny/khknp1Zw== dependencies: "@csstools/css-color-parser" "^3.1.0" "@csstools/css-parser-algorithms" "^3.0.5" "@csstools/css-tokenizer" "^3.0.4" - "@csstools/postcss-progressive-custom-properties" "^4.2.0" + "@csstools/postcss-progressive-custom-properties" "^4.2.1" "@csstools/utilities" "^2.0.0" postcss-color-hex-alpha@^10.0.0: @@ -6975,12 +8720,12 @@ postcss-discard-unused@^6.0.5: dependencies: postcss-selector-parser "^6.0.16" -postcss-double-position-gradients@^6.0.3: - version "6.0.3" - resolved "https://registry.yarnpkg.com/postcss-double-position-gradients/-/postcss-double-position-gradients-6.0.3.tgz#d8c4b126af89855a3aa6687e5b1a0d5460d4a5b7" - integrity sha512-Dl0Z9sdbMwrPslgOaGBZRGo3TASmmgTcqcUODr82MTYyJk6devXZM6MlQjpQKMJqlLJ6oL1w78U7IXFdPA5+ug== +postcss-double-position-gradients@^6.0.4: + version "6.0.4" + resolved "https://registry.yarnpkg.com/postcss-double-position-gradients/-/postcss-double-position-gradients-6.0.4.tgz#b482d08b5ced092b393eb297d07976ab482d4cad" + integrity sha512-m6IKmxo7FxSP5nF2l63QbCC3r+bWpFUWmZXZf096WxG0m7Vl1Q1+ruFOhpdDRmKrRS+S3Jtk+TVk/7z0+BVK6g== dependencies: - "@csstools/postcss-progressive-custom-properties" "^4.2.0" + "@csstools/postcss-progressive-custom-properties" "^4.2.1" "@csstools/utilities" "^2.0.0" postcss-value-parser "^4.2.0" @@ -7016,15 +8761,15 @@ postcss-image-set-function@^7.0.0: "@csstools/utilities" "^2.0.0" postcss-value-parser "^4.2.0" -postcss-lab-function@^7.0.11: - version "7.0.11" - resolved "https://registry.yarnpkg.com/postcss-lab-function/-/postcss-lab-function-7.0.11.tgz#455934181eea130f8e649c1f54692e1768046f6a" - integrity sha512-BEA4jId8uQe1gyjZZ6Bunb6ZsH2izks+v25AxQJDBtigXCjTLmCPWECwQpLTtcxH589MVxhs/9TAmRC6lUEmXQ== +postcss-lab-function@^7.0.12: + version "7.0.12" + resolved "https://registry.yarnpkg.com/postcss-lab-function/-/postcss-lab-function-7.0.12.tgz#eb555ac542607730eb0a87555074e4a5c6eef6e4" + integrity sha512-tUcyRk1ZTPec3OuKFsqtRzW2Go5lehW29XA21lZ65XmzQkz43VY2tyWEC202F7W3mILOjw0voOiuxRGTsN+J9w== dependencies: "@csstools/css-color-parser" "^3.1.0" "@csstools/css-parser-algorithms" "^3.0.5" "@csstools/css-tokenizer" "^3.0.4" - "@csstools/postcss-progressive-custom-properties" "^4.2.0" + "@csstools/postcss-progressive-custom-properties" "^4.2.1" "@csstools/utilities" "^2.0.0" postcss-loader@^7.3.4: @@ -7233,26 +8978,27 @@ postcss-place@^10.0.0: postcss-value-parser "^4.2.0" postcss-preset-env@^10.2.1: - version "10.3.1" - resolved "https://registry.yarnpkg.com/postcss-preset-env/-/postcss-preset-env-10.3.1.tgz#f3799f0f7a7ea384b3c16e073055c231d11bb3bf" - integrity sha512-8ZOOWVwQ0iMpfEYkYo+U6W7fE2dJ/tP6dtEFwPJ66eB5JjnFupfYh+y6zo+vWDO72nGhKOVdxwhTjfzcSNRg4Q== + version "10.6.1" + resolved "https://registry.yarnpkg.com/postcss-preset-env/-/postcss-preset-env-10.6.1.tgz#df30cfc54e90af2dcff5f94104e6f272359c9f65" + integrity sha512-yrk74d9EvY+W7+lO9Aj1QmjWY9q5NsKjK2V9drkOPZB/X6KZ0B3igKsHUYakb7oYVhnioWypQX3xGuePf89f3g== dependencies: - "@csstools/postcss-alpha-function" "^1.0.0" + "@csstools/postcss-alpha-function" "^1.0.1" "@csstools/postcss-cascade-layers" "^5.0.2" - "@csstools/postcss-color-function" "^4.0.11" - "@csstools/postcss-color-function-display-p3-linear" "^1.0.0" - "@csstools/postcss-color-mix-function" "^3.0.11" - "@csstools/postcss-color-mix-variadic-function-arguments" "^1.0.1" - "@csstools/postcss-content-alt-text" "^2.0.7" + "@csstools/postcss-color-function" "^4.0.12" + "@csstools/postcss-color-function-display-p3-linear" "^1.0.1" + "@csstools/postcss-color-mix-function" "^3.0.12" + "@csstools/postcss-color-mix-variadic-function-arguments" "^1.0.2" + "@csstools/postcss-content-alt-text" "^2.0.8" + "@csstools/postcss-contrast-color-function" "^2.0.12" "@csstools/postcss-exponential-functions" "^2.0.9" "@csstools/postcss-font-format-keywords" "^4.0.0" "@csstools/postcss-gamut-mapping" "^2.0.11" - "@csstools/postcss-gradients-interpolation-method" "^5.0.11" - "@csstools/postcss-hwb-function" "^4.0.11" - "@csstools/postcss-ic-unit" "^4.0.3" + "@csstools/postcss-gradients-interpolation-method" "^5.0.12" + "@csstools/postcss-hwb-function" "^4.0.12" + "@csstools/postcss-ic-unit" "^4.0.4" "@csstools/postcss-initial" "^2.0.1" "@csstools/postcss-is-pseudo-class" "^5.0.3" - "@csstools/postcss-light-dark-function" "^2.0.10" + "@csstools/postcss-light-dark-function" "^2.0.11" "@csstools/postcss-logical-float-and-clear" "^3.0.0" "@csstools/postcss-logical-overflow" "^2.0.0" "@csstools/postcss-logical-overscroll-behavior" "^2.0.0" @@ -7261,39 +9007,43 @@ postcss-preset-env@^10.2.1: "@csstools/postcss-media-minmax" "^2.0.9" "@csstools/postcss-media-queries-aspect-ratio-number-values" "^3.0.5" "@csstools/postcss-nested-calc" "^4.0.0" - "@csstools/postcss-normalize-display-values" "^4.0.0" - "@csstools/postcss-oklab-function" "^4.0.11" - "@csstools/postcss-progressive-custom-properties" "^4.2.0" + "@csstools/postcss-normalize-display-values" "^4.0.1" + "@csstools/postcss-oklab-function" "^4.0.12" + "@csstools/postcss-position-area-property" "^1.0.0" + "@csstools/postcss-progressive-custom-properties" "^4.2.1" + "@csstools/postcss-property-rule-prelude-list" "^1.0.0" "@csstools/postcss-random-function" "^2.0.1" - "@csstools/postcss-relative-color-syntax" "^3.0.11" + "@csstools/postcss-relative-color-syntax" "^3.0.12" "@csstools/postcss-scope-pseudo-class" "^4.0.1" "@csstools/postcss-sign-functions" "^1.1.4" "@csstools/postcss-stepped-value-functions" "^4.0.9" + "@csstools/postcss-syntax-descriptor-syntax-production" "^1.0.1" + "@csstools/postcss-system-ui-font-family" "^1.0.0" "@csstools/postcss-text-decoration-shorthand" "^4.0.3" "@csstools/postcss-trigonometric-functions" "^4.0.9" "@csstools/postcss-unset-value" "^4.0.0" - autoprefixer "^10.4.21" - browserslist "^4.25.1" + autoprefixer "^10.4.23" + browserslist "^4.28.1" css-blank-pseudo "^7.0.1" css-has-pseudo "^7.0.3" css-prefers-color-scheme "^10.0.0" - cssdb "^8.4.0" + cssdb "^8.6.0" postcss-attribute-case-insensitive "^7.0.1" postcss-clamp "^4.1.0" - postcss-color-functional-notation "^7.0.11" + postcss-color-functional-notation "^7.0.12" postcss-color-hex-alpha "^10.0.0" postcss-color-rebeccapurple "^10.0.0" postcss-custom-media "^11.0.6" postcss-custom-properties "^14.0.6" postcss-custom-selectors "^8.0.5" postcss-dir-pseudo-class "^9.0.1" - postcss-double-position-gradients "^6.0.3" + postcss-double-position-gradients "^6.0.4" postcss-focus-visible "^10.0.1" postcss-focus-within "^9.0.1" postcss-font-variant "^5.0.0" postcss-gap-properties "^6.0.0" postcss-image-set-function "^7.0.0" - postcss-lab-function "^7.0.11" + postcss-lab-function "^7.0.12" postcss-logical "^8.1.0" postcss-nesting "^13.0.2" postcss-opacity-percentage "^3.0.0" @@ -7346,17 +9096,17 @@ postcss-selector-not@^8.0.1: postcss-selector-parser "^7.0.0" postcss-selector-parser@^6.0.11, postcss-selector-parser@^6.0.16: - version "6.1.2" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz#27ecb41fb0e3b6ba7a1ec84fff347f734c7929de" - integrity sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg== + version "6.1.4" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.1.4.tgz#fdec4ca80f5781bd216ca9bf89a2a0fccfffa5f0" + integrity sha512-bIoJLOmjCO1S9XdY/DcnR5hJxvrDir1PbGChrzXG3vw0/FOliy/fA3dmdhQ441kah4gKv+TwckGzex6wNS5cnQ== dependencies: cssesc "^3.0.0" util-deprecate "^1.0.2" postcss-selector-parser@^7.0.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz#4d6af97eba65d73bc4d84bcb343e865d7dd16262" - integrity sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA== + version "7.1.6" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-7.1.6.tgz#45e970f2d93d4547d6754167ed1132f43012c4bf" + integrity sha512-7qASPzhKF2l2KLboRZux8CCTRMdGiV08vWmyKzPz22qZ7ZjQBOeY7rNzNoCLSUiftJ7HUq0GERHmxw/t0dCdMw== dependencies: cssesc "^3.0.0" util-deprecate "^1.0.2" @@ -7394,14 +9144,32 @@ postcss-zindex@^6.0.2: integrity sha512-5BxW9l1evPB/4ZIc+2GobEBoKC+h8gPGCMi+jxsYvd2x0mjq7wazk6DrP71pStqxE9Foxh5TVnonbWpFZzXaYg== postcss@^8.4.21, postcss@^8.4.24, postcss@^8.4.33, postcss@^8.5.4: - version "8.5.6" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.6.tgz#2825006615a619b4f62a9e7426cc120b349a8f3c" - integrity sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg== + version "8.5.28" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.28.tgz#da4563a99a06e62d6c1cd1acae363224bcaed6e9" + integrity sha512-RRuzqDtt5Y9h3quz5hWhK+TPnsmVs6WwSU6LkJMeY4HstUEDuYTG8UJSdawMRzmzAtV+KEoG8N3Qg2qLy5vM/A== dependencies: - nanoid "^3.3.11" + nanoid "^3.3.18" picocolors "^1.1.1" source-map-js "^1.2.1" +prebuild-install@^7.1.1: + version "7.1.3" + resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-7.1.3.tgz#d630abad2b147443f20a212917beae68b8092eec" + integrity sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug== + dependencies: + detect-libc "^2.0.0" + expand-template "^2.0.3" + github-from-package "0.0.0" + minimist "^1.2.3" + mkdirp-classic "^0.5.3" + napi-build-utils "^2.0.0" + node-abi "^3.3.0" + pump "^3.0.0" + rc "^1.2.7" + simple-get "^4.0.0" + tar-fs "^2.0.0" + tunnel-agent "^0.6.0" + pretty-error@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-4.0.0.tgz#90a703f46dd7234adb46d0f84823e9d1cb8f10d6" @@ -7450,15 +9218,10 @@ prop-types@^15.6.2, prop-types@^15.7.2, prop-types@^15.8.1: object-assign "^4.1.1" react-is "^16.13.1" -property-information@^6.0.0: - version "6.5.0" - resolved "https://registry.yarnpkg.com/property-information/-/property-information-6.5.0.tgz#6212fbb52ba757e92ef4fb9d657563b933b7ffec" - integrity sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig== - property-information@^7.0.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/property-information/-/property-information-7.1.0.tgz#b622e8646e02b580205415586b40804d3e8bfd5d" - integrity sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ== + version "7.2.0" + resolved "https://registry.yarnpkg.com/property-information/-/property-information-7.2.0.tgz#0809b34264e995c0bfcd3227028a1e35210af80a" + integrity sha512-IAtzIB6sUiWaJYrX9smp3V46pBGbBeLFRGdh25kg1334VcBlD8HzhPeNIWQH9zhGmo2itIe25EHt9dQP7G5hmg== proto-list@~1.2.1: version "1.2.4" @@ -7473,6 +9236,14 @@ proxy-addr@~2.0.7: forwarded "0.2.0" ipaddr.js "1.9.1" +pump@^3.0.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.4.tgz#1f313430527fa8b905622ebd22fe1444e757ab3c" + integrity sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + punycode@^2.1.0: version "2.3.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" @@ -7485,12 +9256,25 @@ pupa@^3.1.0: dependencies: escape-goat "^4.0.0" -qs@6.13.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.13.0.tgz#6ca3bd58439f7e245655798997787b0d88a51906" - integrity sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg== +pvtsutils@^1.3.6: + version "1.3.6" + resolved "https://registry.yarnpkg.com/pvtsutils/-/pvtsutils-1.3.6.tgz#ec46e34db7422b9e4fdc5490578c1883657d6001" + integrity sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg== + dependencies: + tslib "^2.8.1" + +pvutils@^1.1.3, pvutils@^1.1.5: + version "1.2.0" + resolved "https://registry.yarnpkg.com/pvutils/-/pvutils-1.2.0.tgz#4b5487a9cccd52d275b0538775790a3ca982bc22" + integrity sha512-BbubeCEyTuQjVMakvJQ/Sxbc93F2pwmbsxONT/ZRrwU7Ua38d8unYTwXpTVLAKJ4BDuH9IGztCjQcd/N/39Dvg== + +qs@~6.16.0: + version "6.16.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.16.0.tgz#c22c723a28a920f3aacdce8289fabd43eccb79fd" + integrity sha512-h6fhOIaRrID2CbEY2fqs+7t+UXZo+MLAnU5gRIq85uFtdiUPCdsApMlHhXogKVM4HM2DVbIjGNTTYH2OcmP1vA== dependencies: - side-channel "^1.0.6" + es-define-property "^1.0.1" + side-channel "^1.1.1" queue-microtask@^1.2.2: version "1.2.3" @@ -7514,22 +9298,27 @@ range-parser@1.2.0: resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" integrity sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A== -range-parser@^1.2.1, range-parser@~1.2.1: +range-parser@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.3.0.tgz#d7f19be812bb62721472b45d3be219ef09572b47" + integrity sha512-hek2mFQpPuI4E1BBKrSto+BU3e3x4xuarsbiwr3+lf7p44juvFMV0XFWQAP3xUyqXA4RrXLIoaSUGbSt056ZMw== + +range-parser@~1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== -raw-body@2.5.2: - version "2.5.2" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.2.tgz#99febd83b90e08975087e8f1f9419a149366b68a" - integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA== +raw-body@~2.5.3: + version "2.5.3" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.3.tgz#11c6650ee770a7de1b494f197927de0c923822e2" + integrity sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA== dependencies: - bytes "3.1.2" - http-errors "2.0.0" - iconv-lite "0.4.24" - unpipe "1.0.0" + bytes "~3.1.2" + http-errors "~2.0.1" + iconv-lite "~0.4.24" + unpipe "~1.0.0" -rc@1.2.8: +rc@1.2.8, rc@^1.2.7: version "1.2.8" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== @@ -7540,11 +9329,11 @@ rc@1.2.8: strip-json-comments "~2.0.1" react-dom@^19.0.0: - version "19.1.1" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-19.1.1.tgz#2daa9ff7f3ae384aeb30e76d5ee38c046dc89893" - integrity sha512-Dlq/5LAZgF0Gaz6yiqZCf6VCcZs1ghAJyrsu84Q/GT0gV+mCxbfmKNoGRKBYMJ8IEdGPqu49YWXD02GCknEDkw== + version "19.3.0" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-19.3.0.tgz#a0ff19161d7f4e9be5469a07278b0c06e00f9001" + integrity sha512-JDk8dgif51OjFoDE70+OT9ICyYr+69HlmihNwp1+Nsfbna3t5sIiCa9ZJktDmQ4/1b/rn26hIAR2uYXDMr5r0Q== dependencies: - scheduler "^0.26.0" + scheduler "^0.28.0" react-fast-compare@^3.2.0: version "3.2.2" @@ -7567,20 +9356,20 @@ react-is@^16.13.1, react-is@^16.6.0, react-is@^16.7.0: resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== -react-is@^19.1.1: - version "19.1.1" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-19.1.1.tgz#038ebe313cf18e1fd1235d51c87360eb87f7c36a" - integrity sha512-tr41fA15Vn8p4X9ntI+yCyeGSf1TlYaY5vlTZfQmeLBrFo3psOPX6HhTDnFNL9uj3EhP0KAQ80cugCl4b4BERA== +react-is@^19.2.3: + version "19.3.0" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-19.3.0.tgz#716028d67e9993d23a2d353c6d08a3c1ef2bbeb4" + integrity sha512-UpMYezM4v5/18F28aC66AEsjXIgE02kyEMH6yLdgLXu/UTfa1Ntwck/nNLrbqJsEXW7gPb0coNO9FQse9WTovA== react-json-view-lite@^2.3.0: version "2.5.0" resolved "https://registry.yarnpkg.com/react-json-view-lite/-/react-json-view-lite-2.5.0.tgz#c7ff011c7cc80e9900abc7aa4916c6a5c6d6c1c6" integrity sha512-tk7o7QG9oYyELWHL8xiMQ8x4WzjCzbWNyig3uexmkLb54r8jO0yH3WCWx8UZS0c49eSA4QUmG5caiRJ8fAn58g== -react-loadable-ssr-addon-v5-slorber@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/react-loadable-ssr-addon-v5-slorber/-/react-loadable-ssr-addon-v5-slorber-1.0.1.tgz#2cdc91e8a744ffdf9e3556caabeb6e4278689883" - integrity sha512-lq3Lyw1lGku8zUEJPDxsNm1AfYHBrO9Y1+olAYwpUJ2IGFBskM0DMKok97A6LWUpHm+o7IvQBOWu9MLenp9Z+A== +react-loadable-ssr-addon-v5-slorber@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/react-loadable-ssr-addon-v5-slorber/-/react-loadable-ssr-addon-v5-slorber-1.0.3.tgz#bb3791bf481222c63a5bc6b96ee23f68cb5614b9" + integrity sha512-GXfh9VLwB5ERaCsU6RULh7tkemeX15aNh6wuMEBtfdyMa7fFG8TXrhXlx1SoEK2Ty/l6XIkzzYIQmyaWW3JgdQ== dependencies: "@babel/runtime" "^7.10.3" @@ -7637,9 +9426,9 @@ react-transition-group@^4.4.5: prop-types "^15.6.2" react@^19.0.0: - version "19.1.1" - resolved "https://registry.yarnpkg.com/react/-/react-19.1.1.tgz#06d9149ec5e083a67f9a1e39ce97b06a03b644af" - integrity sha512-w8nqGImo45dmMIfljjMwOGtbmC/mk4CMYhWIicdSflH91J9TyCyczcPFXJzrZ/ZXcgGRFeP6BU0BEJTw6tZdfQ== + version "19.3.0" + resolved "https://registry.yarnpkg.com/react/-/react-19.3.0.tgz#e20aa3a14687075ce863351b5878b0608c3fbfb2" + integrity sha512-E8LUcbtBWt20bbl2YoHfx4ZDBdxVTfOKtCZn9cDSJ4l6/nuoApcpIBcj47t2wZoVX8g2ZHuMHbiShgCR1T5Sog== readable-stream@^2.0.1: version "2.3.8" @@ -7654,7 +9443,7 @@ readable-stream@^2.0.1: string_decoder "~1.1.1" util-deprecate "~1.0.1" -readable-stream@^3.0.6: +readable-stream@^3.0.6, readable-stream@^3.1.1, readable-stream@^3.4.0: version "3.6.2" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== @@ -7710,6 +9499,11 @@ recma-stringify@^1.0.0: unified "^11.0.0" vfile "^6.0.0" +reflect-metadata@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.2.2.tgz#400c845b6cba87a21f2c65c4aeb158f4fa4d9c5b" + integrity sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q== + regenerate-unicode-properties@^10.2.2: version "10.2.2" resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.2.tgz#aa113812ba899b630658c7623466be71e1f86f66" @@ -7722,24 +9516,24 @@ regenerate@^1.4.2: resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== -regexpu-core@^6.2.0: - version "6.3.1" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-6.3.1.tgz#fb8b707d0efe18e9464d3ae76ae1e3c96c8467ae" - integrity sha512-DzcswPr252wEr7Qz8AyAVbfyBDKLoYp6eRA1We2Fa9qirRFSdtkP5sHr3yglDKy2BbA0fd2T+j/CUSKes3FeVQ== +regexpu-core@^6.3.1: + version "6.4.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-6.4.0.tgz#3580ce0c4faedef599eccb146612436b62a176e5" + integrity sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA== dependencies: regenerate "^1.4.2" regenerate-unicode-properties "^10.2.2" regjsgen "^0.8.0" - regjsparser "^0.12.0" + regjsparser "^0.13.0" unicode-match-property-ecmascript "^2.0.0" unicode-match-property-value-ecmascript "^2.2.1" registry-auth-token@^5.0.1: - version "5.1.0" - resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-5.1.0.tgz#3c659047ecd4caebd25bc1570a3aa979ae490eca" - integrity sha512-GdekYuwLXLxMuFTwAPg5UKGLW/UXzQrZvH/Zj791BQif5T05T0RsaLfHc9q3ZOKi7n+BoprPD9mJ0O0k4xzUlw== + version "5.1.1" + resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-5.1.1.tgz#f1ff69c8e492e7edee07110b4752dd0a8aa82853" + integrity sha512-P7B4+jq8DeD2nMsAcdfaqHbssgHtZ7Z5+++a5ask90fvmJ8p5je4mOa+wzu+DB4vQ5tdJV/xywY+UnVFeQLV5Q== dependencies: - "@pnpm/npm-conf" "^2.1.0" + "@pnpm/npm-conf" "^3.0.2" registry-url@^6.0.0: version "6.0.1" @@ -7753,12 +9547,12 @@ regjsgen@^0.8.0: resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.8.0.tgz#df23ff26e0c5b300a6470cad160a9d090c3a37ab" integrity sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q== -regjsparser@^0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.12.0.tgz#0e846df6c6530586429377de56e0475583b088dc" - integrity sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ== +regjsparser@^0.13.0: + version "0.13.2" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.13.2.tgz#f654734b5c588b22ba3e21693b30523417180808" + integrity sha512-NgRBy2Nx/bE+9F27nVHnqcN5HjyLmecqsqx2PJHu3/IEtADD4WuxuXIVExD5PoSDFVrl78dOonfcOe5O+5nbzQ== dependencies: - jsesc "~3.0.2" + jsesc "~3.1.0" rehype-raw@^7.0.0: version "7.0.0" @@ -7875,11 +9669,6 @@ renderkid@^3.0.0: lodash "^4.17.21" strip-ansi "^6.0.1" -repeat-string@^1.0.0: - version "1.6.1" - resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" - integrity sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w== - require-from-string@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" @@ -7910,12 +9699,13 @@ resolve-pathname@^3.0.0: resolved "https://registry.yarnpkg.com/resolve-pathname/-/resolve-pathname-3.0.0.tgz#99d02224d3cf263689becbb393bc560313025dcd" integrity sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng== -resolve@^1.19.0, resolve@^1.22.10: - version "1.22.10" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.10.tgz#b663e83ffb09bbf2386944736baae803029b8b39" - integrity sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w== +resolve@^1.19.0, resolve@^1.22.11: + version "1.22.12" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.12.tgz#f5b2a680897c69c238a13cd16b15671f8b73549f" + integrity sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA== dependencies: - is-core-module "^2.16.0" + es-errors "^1.3.0" + is-core-module "^2.16.1" path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" @@ -7936,12 +9726,28 @@ reusify@^1.0.4: resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.1.0.tgz#0fe13b9522e1473f51b558ee796e08f11f9b489f" integrity sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw== -rimraf@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" - integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== +rimraf@^6.0.1: + version "6.1.3" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-6.1.3.tgz#afbee236b3bd2be331d4e7ce4493bac1718981af" + integrity sha512-LKg+Cr2ZF61fkcaK1UdkH2yEBBKnYjTyWzTJT6KNPcSPaiT7HSdhtMXQuN5wkTX0Xu72KQ1l8S42rlmexS2hSA== + dependencies: + glob "^13.0.3" + package-json-from-dist "^1.0.1" + +robust-predicates@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/robust-predicates/-/robust-predicates-3.0.3.tgz#1099061b3349e2c5abec6c2ab0acd440d24d4062" + integrity sha512-NS3levdsRIUOmiJ8FZWCP7LG3QpJyrs/TE0Zpf1yvZu8cAJJ6QMW92H1c7kWpdIHo8RvmLxN/o2JXTKHp74lUA== + +roughjs@^4.6.6: + version "4.6.6" + resolved "https://registry.yarnpkg.com/roughjs/-/roughjs-4.6.6.tgz#1059f49a5e0c80dee541a005b20cc322b222158b" + integrity sha512-ZUz/69+SYpFN/g/lUlo2FXcIjRkSu3nDarreVdGGndHEBJ6cXPdKguS8JGxwj5HA5xIbVKSmLgr5b3AWxtRfvQ== dependencies: - glob "^7.1.3" + hachure-fill "^0.5.2" + path-data-parser "^0.1.0" + points-on-curve "^0.2.0" + points-on-path "^0.2.1" rtlcss@^4.1.0: version "4.3.0" @@ -7953,6 +9759,11 @@ rtlcss@^4.1.0: postcss "^8.4.21" strip-json-comments "^3.1.1" +run-applescript@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/run-applescript/-/run-applescript-7.1.0.tgz#2e9e54c4664ec3106c5b5630e249d3d6595c4911" + integrity sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q== + run-parallel@^1.1.9: version "1.2.0" resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" @@ -7960,7 +9771,12 @@ run-parallel@^1.1.9: dependencies: queue-microtask "^1.2.2" -safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.1.0, safe-buffer@~5.2.0: +rw@1: + version "1.3.3" + resolved "https://registry.yarnpkg.com/rw/-/rw-1.3.3.tgz#3f862dfa91ab766b14885ef4d01124bfda074fb4" + integrity sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ== + +safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== @@ -7970,20 +9786,20 @@ safe-buffer@~5.1.0, safe-buffer@~5.1.1: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -"safer-buffer@>= 2.1.2 < 3": +"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0": version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -sax@^1.2.4: - version "1.4.1" - resolved "https://registry.yarnpkg.com/sax/-/sax-1.4.1.tgz#44cc8988377f126304d3b3fc1010c733b929ef0f" - integrity sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg== +sax@^1.2.4, sax@^1.5.0: + version "1.6.1" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.6.1.tgz#4c23cf608c0b693ab54b4b5888e92cfe977b9843" + integrity sha512-42tBVwLWnaQvW5zc4HbZrTuWccECCZfBi92FDuwtqxasH+JbPB3/FOKb1m222K42R4WxuxzzMsTswfzgtSu64Q== -scheduler@^0.26.0: - version "0.26.0" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.26.0.tgz#4ce8a8c2a2095f13ea11bf9a445be50c555d6337" - integrity sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA== +scheduler@^0.28.0: + version "0.28.0" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.28.0.tgz#03d3ca348aeaf8b7502f64468f217b27523f9695" + integrity sha512-juorfCmIkIw8tT+p5BXSm6PJjQF/ycEYmKyzURCIt/RaZIhL+PulbQ9Yu2z1HdOJDdqDTlxA1+xKBmHXJsczAw== schema-dts@^1.1.2: version "1.1.5" @@ -7999,14 +9815,14 @@ schema-utils@^3.0.0: ajv "^6.12.5" ajv-keywords "^3.5.2" -schema-utils@^4.0.0, schema-utils@^4.0.1, schema-utils@^4.3.0, schema-utils@^4.3.2: - version "4.3.2" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.3.2.tgz#0c10878bf4a73fd2b1dfd14b9462b26788c806ae" - integrity sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ== +schema-utils@^4.0.0, schema-utils@^4.0.1, schema-utils@^4.2.0, schema-utils@^4.3.0, schema-utils@^4.3.3, schema-utils@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.5.0.tgz#aaf8d588bd2b19511175175a5222baef648c009c" + integrity sha512-zJlMCZ0cAR5p/Y4oVpRoqioDMJcGxaXRrQ/4rP4WyR84vc5z/DolXdbvXeDpTwbtocDFr2rhPqHPErDCUtz2kA== dependencies: - "@types/json-schema" "^7.0.9" - ajv "^8.9.0" - ajv-formats "^2.1.1" + "@types/json-schema" "^7.0.15" + ajv "^8.20.0" + ajv-formats "^3.0.1" ajv-keywords "^5.1.0" section-matter@^1.0.0: @@ -8027,13 +9843,13 @@ select@^1.1.2: resolved "https://registry.yarnpkg.com/select/-/select-1.1.2.tgz#0e7350acdec80b1108528786ec1d4418d11b396d" integrity sha512-OwpTSOfy6xSs1+pwcNrv0RBMOzI39Lp3qQKUTPVVPRjCdNa5JH/oPRiqsesIskK8TVgmRiHwO4KXlV2Li9dANA== -selfsigned@^2.1.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-2.4.1.tgz#560d90565442a3ed35b674034cec4e95dceb4ae0" - integrity sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q== +selfsigned@^5.5.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-5.5.0.tgz#4c9ab7c7c9f35f18fb6a9882c253eb0e6bd6557b" + integrity sha512-ftnu3TW4+3eBfLRFnDEkzGxSF/10BJBkaLJuBHZX0kiPS7bRdlpZGu6YGt4KngMkdTwJE6MbjavFpqHvqVt+Ew== dependencies: - "@types/node-forge" "^1.3.0" - node-forge "^1" + "@peculiar/x509" "^1.14.2" + pkijs "^3.3.3" semver-diff@^4.0.0: version "4.0.0" @@ -8048,71 +9864,71 @@ semver@^6.3.1: integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== semver@^7.3.5, semver@^7.3.7, semver@^7.5.4: - version "7.7.2" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.2.tgz#67d99fdcd35cec21e6f8b87a7fd515a33f982b58" - integrity sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA== + version "7.8.5" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.8.5.tgz#39b646037dd50c14fb451e7e4cac58ed8b863f69" + integrity sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA== -send@0.19.0: - version "0.19.0" - resolved "https://registry.yarnpkg.com/send/-/send-0.19.0.tgz#bbc5a388c8ea6c048967049dbeac0e4a3f09d7f8" - integrity sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw== +send@~0.19.0, send@~0.19.1: + version "0.19.2" + resolved "https://registry.yarnpkg.com/send/-/send-0.19.2.tgz#59bc0da1b4ea7ad42736fd642b1c4294e114ff29" + integrity sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg== dependencies: debug "2.6.9" depd "2.0.0" destroy "1.2.0" - encodeurl "~1.0.2" + encodeurl "~2.0.0" escape-html "~1.0.3" etag "~1.8.1" - fresh "0.5.2" - http-errors "2.0.0" + fresh "~0.5.2" + http-errors "~2.0.1" mime "1.6.0" ms "2.1.3" - on-finished "2.4.1" + on-finished "~2.4.1" range-parser "~1.2.1" - statuses "2.0.1" + statuses "~2.0.2" -serialize-javascript@^6.0.0, serialize-javascript@^6.0.1, serialize-javascript@^6.0.2: +serialize-javascript@^6.0.0, serialize-javascript@^6.0.1: version "6.0.2" resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.2.tgz#defa1e055c83bf6d59ea805d8da862254eb6a6c2" integrity sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g== dependencies: randombytes "^2.1.0" -serve-handler@^6.1.6: - version "6.1.6" - resolved "https://registry.yarnpkg.com/serve-handler/-/serve-handler-6.1.6.tgz#50803c1d3e947cd4a341d617f8209b22bd76cfa1" - integrity sha512-x5RL9Y2p5+Sh3D38Fh9i/iQ5ZK+e4xuXRd/pGbM4D13tgo/MGwbttUk8emytcr1YYzBYs+apnUngBDFYfpjPuQ== +serve-handler@^6.1.7: + version "6.1.7" + resolved "https://registry.yarnpkg.com/serve-handler/-/serve-handler-6.1.7.tgz#e9bb864e87ee71e8dab874cde44d146b77e3fb78" + integrity sha512-CinAq1xWb0vR3twAv9evEU8cNWkXCb9kd5ePAHUKJBkOsUpR1wt/CvGdeca7vqumL1U5cSaeVQ6zZMxiJ3yWsg== dependencies: bytes "3.0.0" content-disposition "0.5.2" mime-types "2.1.18" - minimatch "3.1.2" + minimatch "3.1.5" path-is-inside "1.0.2" path-to-regexp "3.3.0" range-parser "1.2.0" serve-index@^1.9.1: - version "1.9.1" - resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" - integrity sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw== + version "1.9.2" + resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.2.tgz#2988e3612106d78a5e4849ddff552ce7bd3d9bcb" + integrity sha512-KDj11HScOaLmrPxl70KYNW1PksP4Nb/CLL2yvC+Qd2kHMPEEpfc4Re2e4FOay+bC/+XQl/7zAcWON3JVo5v3KQ== dependencies: - accepts "~1.3.4" + accepts "~1.3.8" batch "0.6.1" debug "2.6.9" escape-html "~1.0.3" - http-errors "~1.6.2" - mime-types "~2.1.17" - parseurl "~1.3.2" + http-errors "~1.8.0" + mime-types "~2.1.35" + parseurl "~1.3.3" -serve-static@1.16.2: - version "1.16.2" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.16.2.tgz#b6a5343da47f6bdd2673848bf45754941e803296" - integrity sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw== +serve-static@~1.16.2: + version "1.16.3" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.16.3.tgz#a97b74d955778583f3862a4f0b841eb4d5d78cf9" + integrity sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA== dependencies: encodeurl "~2.0.0" escape-html "~1.0.3" parseurl "~1.3.3" - send "0.19.0" + send "~0.19.1" set-function-length@^1.2.2: version "1.2.2" @@ -8126,12 +9942,7 @@ set-function-length@^1.2.2: gopd "^1.0.1" has-property-descriptors "^1.0.2" -setprototypeof@1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" - integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== - -setprototypeof@1.2.0: +setprototypeof@1.2.0, setprototypeof@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== @@ -8148,6 +9959,20 @@ shallowequal@^1.1.0: resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8" integrity sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ== +sharp@^0.32.3: + version "0.32.6" + resolved "https://registry.yarnpkg.com/sharp/-/sharp-0.32.6.tgz#6ad30c0b7cd910df65d5f355f774aa4fce45732a" + integrity sha512-KyLTWwgcR9Oe4d9HwCwNM2l7+J0dUQwn/yf7S0EnTtb0eVS4RxO0eUSvxPtzT4F3SY+C4K6fqdv/DO27sJ/v/w== + dependencies: + color "^4.2.3" + detect-libc "^2.0.2" + node-addon-api "^6.1.0" + prebuild-install "^7.1.1" + semver "^7.5.4" + simple-get "^4.0.1" + tar-fs "^3.0.4" + tunnel-agent "^0.6.0" + shebang-command@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" @@ -8160,18 +9985,18 @@ shebang-regex@^3.0.0: resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== -shell-quote@^1.8.3: - version "1.8.3" - resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.3.tgz#55e40ef33cf5c689902353a3d8cd1a6725f08b4b" - integrity sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw== +shell-quote@^1.8.4: + version "1.10.0" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.10.0.tgz#482033e192e4f5c07151521ffa03400ec71b1b0f" + integrity sha512-w1aiOKwKuRgtwAReIIj89puqg+I7GvX4IbLrvmhXbzQsj1+Zwi4VO3+fa6ZF91TWSjIxoEkKnMeHcLEODK5ZXA== -side-channel-list@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/side-channel-list/-/side-channel-list-1.0.0.tgz#10cb5984263115d3b7a0e336591e290a830af8ad" - integrity sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA== +side-channel-list@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/side-channel-list/-/side-channel-list-1.0.1.tgz#c2e0b5a14a540aebee3bbc6c3f8666cc9b509127" + integrity sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w== dependencies: es-errors "^1.3.0" - object-inspect "^1.13.3" + object-inspect "^1.13.4" side-channel-map@^1.0.1: version "1.0.1" @@ -8194,14 +10019,14 @@ side-channel-weakmap@^1.0.2: object-inspect "^1.13.3" side-channel-map "^1.0.1" -side-channel@^1.0.6: - version "1.1.0" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.1.0.tgz#c3fcff9c4da932784873335ec9765fa94ff66bc9" - integrity sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw== +side-channel@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.1.1.tgz#ea02c62e05dc4bea67d4442f0fb71ee192f8e0ab" + integrity sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ== dependencies: es-errors "^1.3.0" - object-inspect "^1.13.3" - side-channel-list "^1.0.0" + object-inspect "^1.13.4" + side-channel-list "^1.0.1" side-channel-map "^1.0.1" side-channel-weakmap "^1.0.2" @@ -8210,6 +10035,27 @@ signal-exit@^3.0.2, signal-exit@^3.0.3: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== +simple-concat@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f" + integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q== + +simple-get@^4.0.0, simple-get@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-4.0.1.tgz#4a39db549287c979d352112fa03fd99fd6bc3543" + integrity sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA== + dependencies: + decompress-response "^6.0.0" + once "^1.3.1" + simple-concat "^1.0.0" + +simple-swizzle@^0.2.2: + version "0.2.4" + resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.4.tgz#a8d11a45a11600d6a1ecdff6363329e3648c3667" + integrity sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw== + dependencies: + is-arrayish "^0.3.1" + sirv@^2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/sirv/-/sirv-2.0.4.tgz#5dd9a725c578e34e449f332703eb2a74e46a29b0" @@ -8225,9 +10071,9 @@ sisteransi@^1.0.5: integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== sitemap@^7.1.1: - version "7.1.2" - resolved "https://registry.yarnpkg.com/sitemap/-/sitemap-7.1.2.tgz#6ce1deb43f6f177c68bc59cf93632f54e3ae6b72" - integrity sha512-ARCqzHJ0p4gWt+j7NlU5eDlIO9+Rkr/JhPFZKKQ1l5GCus7rJH4UdrlVAh0xC/gDS/Qir2UMxqYNHtsKr2rpCw== + version "7.1.3" + resolved "https://registry.yarnpkg.com/sitemap/-/sitemap-7.1.3.tgz#2b756f79f0b77527c0eaba280c722e4c66c08886" + integrity sha512-tAjEd+wt/YwnEbfNB2ht51ybBJxbEWwe5ki/Z//Wh0rpBFTCUSj46GnxUKEWzhfuJTsee8x3lybHxFgUMig2hw== dependencies: "@types/node" "^17.0.5" "@types/sax" "^1.2.1" @@ -8329,30 +10175,34 @@ spdy@^4.0.2: select-hose "^2.0.0" spdy-transport "^3.0.0" -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== - srcset@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/srcset/-/srcset-4.0.0.tgz#336816b665b14cd013ba545b6fe62357f86e65f4" integrity sha512-wvLeHgcVHKO8Sc/H/5lkGreJQVeYMm9rlmt8PuR1xE31rIuXhuzznUUqAt8MqLhB3MqJdFzlNAfpcWnxiFUcPw== -statuses@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" - integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== - -"statuses@>= 1.4.0 < 2": +"statuses@>= 1.5.0 < 2": version "1.5.0" resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== +statuses@~2.0.1, statuses@~2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.2.tgz#8f75eecef765b5e1cfcdc080da59409ed424e382" + integrity sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw== + std-env@^3.7.0: - version "3.9.0" - resolved "https://registry.yarnpkg.com/std-env/-/std-env-3.9.0.tgz#1a6f7243b339dca4c9fd55e1c7504c77ef23e8f1" - integrity sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw== + version "3.10.0" + resolved "https://registry.yarnpkg.com/std-env/-/std-env-3.10.0.tgz#d810b27e3a073047b2b5e40034881f5ea6f9c83b" + integrity sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg== + +streamx@^2.12.5, streamx@^2.15.0, streamx@^2.25.0: + version "2.28.1" + resolved "https://registry.yarnpkg.com/streamx/-/streamx-2.28.1.tgz#376cd42a089505a69bec0efdb5189aa45586141f" + integrity sha512-zEzXb0s5Cds7tqMH6rhZ05lcJydCWiQPEwiNngVqzsxCc962vLY4Uw+mW7od8kDH258k2Uz/JrOkdIAAhSh9VA== + dependencies: + events-universal "^1.0.0" + fast-fifo "^1.3.2" + text-decoder "^1.1.0" string-width@^4.1.0, string-width@^4.2.0: version "4.2.3" @@ -8403,7 +10253,7 @@ stringify-object@^3.3.0: is-obj "^1.0.1" is-regexp "^1.0.0" -strip-ansi@^6.0.0, strip-ansi@^6.0.1: +strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -8411,11 +10261,11 @@ strip-ansi@^6.0.0, strip-ansi@^6.0.1: ansi-regex "^5.0.1" strip-ansi@^7.0.1: - version "7.1.2" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.2.tgz#132875abde678c7ea8d691533f2e7e22bb744dba" - integrity sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA== + version "7.2.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.2.0.tgz#d22a269522836a627af8d04b5c3fd2c7fa3e32e3" + integrity sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w== dependencies: - ansi-regex "^6.0.1" + ansi-regex "^6.2.2" strip-bom-string@^1.0.0: version "1.0.0" @@ -8438,18 +10288,18 @@ strip-json-comments@~2.0.1: integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== style-to-js@^1.0.0: - version "1.1.17" - resolved "https://registry.yarnpkg.com/style-to-js/-/style-to-js-1.1.17.tgz#488b1558a8c1fd05352943f088cc3ce376813d83" - integrity sha512-xQcBGDxJb6jjFCTzvQtfiPn6YvvP2O8U1MDIPNfJQlWMYfktPy+iGsHE7cssjs7y84d9fQaK4UF3RIJaAHSoYA== + version "1.1.21" + resolved "https://registry.yarnpkg.com/style-to-js/-/style-to-js-1.1.21.tgz#2908941187f857e79e28e9cd78008b9a0b3e0e8d" + integrity sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ== dependencies: - style-to-object "1.0.9" + style-to-object "1.0.14" -style-to-object@1.0.9: - version "1.0.9" - resolved "https://registry.yarnpkg.com/style-to-object/-/style-to-object-1.0.9.tgz#35c65b713f4a6dba22d3d0c61435f965423653f0" - integrity sha512-G4qppLgKu/k6FwRpHiGiKPaPTFcG3g4wNVX/Qsfu+RqQM30E7Tyu/TEgxcL9PNLF5pdRLwQdE3YKKf+KF2Dzlw== +style-to-object@1.0.14: + version "1.0.14" + resolved "https://registry.yarnpkg.com/style-to-object/-/style-to-object-1.0.14.tgz#1d22f0e7266bb8c6d8cae5caf4ec4f005e08f611" + integrity sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw== dependencies: - inline-style-parser "0.2.4" + inline-style-parser "0.2.7" stylehacks@^6.1.1: version "6.1.1" @@ -8464,6 +10314,11 @@ stylis@4.2.0: resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.2.0.tgz#79daee0208964c8fe695a42fcffcac633a211a51" integrity sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw== +stylis@^4.3.6: + version "4.4.0" + resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.4.0.tgz#c5846c9345f4bfc51bd0cbd7ca35a0744f485a5d" + integrity sha512-5Z9ZpRzfuH6l/UAvCPAPUo3665Nk2wLaZU3x+TLHKVzIz33+sbJqbtrYoC3KD4/uVOr2Zp+L0LySezP9OHV9yA== + supports-color@^7.1.0: version "7.2.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" @@ -8484,49 +10339,116 @@ supports-preserve-symlinks-flag@^1.0.0: integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== svg-parser@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/svg-parser/-/svg-parser-2.0.4.tgz#fdc2e29e13951736140b76cb122c8ee6630eb6b5" - integrity sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ== + version "2.1.0" + resolved "https://registry.yarnpkg.com/svg-parser/-/svg-parser-2.1.0.tgz#f808c50953207b230fea6200d866697af61617a4" + integrity sha512-bwLf38YmY+TDYHJw1Ex0Co8c4yeXuJAo8YnXGZrscxrvYoVVIvLeniEkV1Ks/54VteMnL4FtyN1+P+TZJdUPmQ== svgo@^3.0.2, svgo@^3.2.0: - version "3.3.2" - resolved "https://registry.yarnpkg.com/svgo/-/svgo-3.3.2.tgz#ad58002652dffbb5986fc9716afe52d869ecbda8" - integrity sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw== + version "3.3.5" + resolved "https://registry.yarnpkg.com/svgo/-/svgo-3.3.5.tgz#8a3d9557ab2f386eca7e24760385849554985a1c" + integrity sha512-8SQMzdrvWaD8deUmrnYB+ASyxBVgWUOilg+A75nE/76WdLpj6LopCwiAVvkzkcqy/9b7t2Mg7faFLjg0ZRcZ3w== dependencies: - "@trysound/sax" "0.2.0" commander "^7.2.0" css-select "^5.1.0" css-tree "^2.3.1" css-what "^6.1.0" csso "^5.0.5" picocolors "^1.0.0" + sax "^1.5.0" -tapable@^2.0.0, tapable@^2.1.1, tapable@^2.2.0, tapable@^2.2.1: - version "2.2.3" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.3.tgz#4b67b635b2d97578a06a2713d2f04800c237e99b" - integrity sha512-ZL6DDuAlRlLGghwcfmSn9sK3Hr6ArtyudlSAiCqQ6IfE+b+HHbydbYDIG15IfS5do+7XQQBdBiubF/cV2dnDzg== +swc-loader@^0.2.6: + version "0.2.7" + resolved "https://registry.yarnpkg.com/swc-loader/-/swc-loader-0.2.7.tgz#2d1611ab314c5d8342d74aa5e5901b3fbf490de2" + integrity sha512-nwYWw3Fh9ame3Rtm7StS9SBLpHRRnYcK7bnpF3UKZmesAK0gw2/ADvlURFAINmPvKtDLzp+GBiP9yLoEjg6S9w== + dependencies: + "@swc/counter" "^0.1.3" + +tapable@^2.0.0, tapable@^2.2.1, tapable@^2.3.0, tapable@^2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.3.3.tgz#5da7c9992c46038221267985ab28421a8879f160" + integrity sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A== + +tar-fs@^2.0.0: + version "2.1.5" + resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.5.tgz#33e9c29413dce0c58ada7ff77db4e5a30afffe70" + integrity sha512-OboTd8mmMhZDNPV+UjQcK9yKAatXu2aJ+r1w4im1Otd4M4fl2hwvdoXUxIYHFTHWK/3y3FarBP70v3vwmGlOxw== + dependencies: + chownr "^1.1.1" + mkdirp-classic "^0.5.2" + pump "^3.0.0" + tar-stream "^2.1.4" + +tar-fs@^3.0.4: + version "3.1.3" + resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-3.1.3.tgz#05668cc68a30741c3813f9c16593b8dec7dcbcd1" + integrity sha512-/hU4AXnIdZu+Gvl1pk0oI5f5HxWsCJRtY2aFaJdk9VvyL48DWU6iU5WAIPG+wIi1YvWA6eTJvIviP/tMAZZNwQ== + dependencies: + pump "^3.0.0" + tar-stream "^3.1.5" + optionalDependencies: + bare-fs "^4.0.1" + bare-path "^3.0.0" + +tar-stream@^2.1.4: + version "2.2.0" + resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" + integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== + dependencies: + bl "^4.0.3" + end-of-stream "^1.4.1" + fs-constants "^1.0.0" + inherits "^2.0.3" + readable-stream "^3.1.1" + +tar-stream@^3.1.5: + version "3.2.1" + resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-3.2.1.tgz#952d72f7aba68ce5cb802ef2e0b19f1bd989140d" + integrity sha512-nqsEO8zLZJvrOMdEwkA0QdCLFbetHMn95Zqu4fKwX+hkaTWJPZZOrxx/PwtxoK0MMGQmBQNRW3CPs8IFYQz4cQ== + dependencies: + b4a "^1.6.4" + bare-fs "^4.5.5" + fast-fifo "^1.2.0" + streamx "^2.15.0" + +teex@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/teex/-/teex-1.0.1.tgz#b8fa7245ef8e8effa8078281946c85ab780a0b12" + integrity sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg== + dependencies: + streamx "^2.12.5" -terser-webpack-plugin@^5.3.11, terser-webpack-plugin@^5.3.9: - version "5.3.14" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.14.tgz#9031d48e57ab27567f02ace85c7d690db66c3e06" - integrity sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw== +terser-webpack-plugin@^5.3.9: + version "5.6.1" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.6.1.tgz#47bc41bd8b8fab8383b62ec763b7394829097e7b" + integrity sha512-201R5j+sJpK8nFWwKVyNfZot8FaJbLZDq5evriVzbV1wDtSXDjRUDRfJzHpAaxFDMEhsZL1QkeqM61wgsS3KaQ== dependencies: "@jridgewell/trace-mapping" "^0.3.25" jest-worker "^27.4.5" schema-utils "^4.3.0" - serialize-javascript "^6.0.2" terser "^5.31.1" -terser@^5.10.0, terser@^5.15.1, terser@^5.31.1: - version "5.44.0" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.44.0.tgz#ebefb8e5b8579d93111bfdfc39d2cf63879f4a82" - integrity sha512-nIVck8DK+GM/0Frwd+nIhZ84pR/BX7rmXMfYwyg+Sri5oGVE99/E3KvXqpC2xHFxyqXyGHTKBSioxxplrO4I4w== +terser@^5.10.0, terser@^5.15.1, terser@^5.31.1, terser@^5.51.0: + version "5.51.2" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.51.2.tgz#555912425a7f2ff7737425c3718fa76c7069f6ef" + integrity sha512-bWnjSNscmuI+GJze6ZupnHP8G/cTcsJF+bXCeQknk2SHQsgbNJnLrqiH9jZ2W4STPVXH2mDKKRX3iwPhc9Cn/Q== dependencies: "@jridgewell/source-map" "^0.3.3" acorn "^8.15.0" commander "^2.20.0" source-map-support "~0.5.20" +text-decoder@^1.1.0: + version "1.2.7" + resolved "https://registry.yarnpkg.com/text-decoder/-/text-decoder-1.2.7.tgz#5d073a9a74b9c0a9d28dfadcab96b604af57d8ba" + integrity sha512-vlLytXkeP4xvEq2otHeJfSQIRyWxo/oZGEbXrtEEF9Hnmrdly59sUbzZ/QgyWuLYHctCHxFF4tRQZNQ9k60ExQ== + dependencies: + b4a "^1.6.4" + +thingies@^2.5.0: + version "2.6.1" + resolved "https://registry.yarnpkg.com/thingies/-/thingies-2.6.1.tgz#4eb28e2585a75288f1765a0b08f1dfa020357a6f" + integrity sha512-cV/CMGTK3M4MlnJ/0At6ismOw/A0EEniDNScajjz/Br3c1sqE72YD01rGpPTKwd27wAxI5Pr+6+0w8yofzFRYw== + thunky@^1.0.2: version "1.1.0" resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d" @@ -8547,6 +10469,11 @@ tiny-warning@^1.0.0: resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754" integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== +tinyexec@^1.2.4: + version "1.3.1" + resolved "https://registry.yarnpkg.com/tinyexec/-/tinyexec-1.3.1.tgz#16a2e3c6e23fafce72640e678e651db36145b9c6" + integrity sha512-GCvB3aoys96IuDFBMcTB46JOR6mdMtAToqwiW8JlWhsoh1mhHi/xn9ss/Dg7N555GiJyEt2qzoG/NHCwM6h1EA== + tinypool@^1.0.2: version "1.1.1" resolved "https://registry.yarnpkg.com/tinypool/-/tinypool-1.1.1.tgz#059f2d042bd37567fbc017d3d426bdd2a2612591" @@ -8559,7 +10486,7 @@ to-regex-range@^5.0.1: dependencies: is-number "^7.0.0" -toidentifier@1.0.1: +toidentifier@1.0.1, toidentifier@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== @@ -8569,6 +10496,11 @@ totalist@^3.0.0: resolved "https://registry.yarnpkg.com/totalist/-/totalist-3.0.1.tgz#ba3a3d600c915b1a97872348f79c127475f6acf8" integrity sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ== +tree-dump@^1.0.3, tree-dump@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/tree-dump/-/tree-dump-1.1.0.tgz#ab29129169dc46004414f5a9d4a3c6e89f13e8a4" + integrity sha512-rMuvhU4MCDbcbnleZTFezWsaZXRFemSqAM+7jPnzUl1fo9w3YEKOxAeui0fz3OI4EU4hf23iyA7uQRVko+UaBA== + trim-lines@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/trim-lines/-/trim-lines-3.0.1.tgz#d802e332a07df861c48802c04321017b1bd87338" @@ -8579,15 +10511,34 @@ trough@^2.0.0: resolved "https://registry.yarnpkg.com/trough/-/trough-2.2.0.tgz#94a60bd6bd375c152c1df911a4b11d5b0256f50f" integrity sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw== -tslib@^2.0.3, tslib@^2.6.0: +ts-dedent@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/ts-dedent/-/ts-dedent-2.3.0.tgz#8fac36c7902b541c154ac13a27ac467997af11f8" + integrity sha512-JfJeIHke7y2egdGGgRAvpCwYFUsHlM2gPcrVOxFkznt/4uzQ7HFmvE63iFHVLBJNDuyDOQgijDK/tXH/f6Msjg== + +tslib@^1.9.3: + version "1.14.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + +tslib@^2.0.0, tslib@^2.0.3, tslib@^2.4.0, tslib@^2.6.0, tslib@^2.8.1: version "2.8.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== -type-fest@^0.21.3: - version "0.21.3" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" - integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== +tsyringe@^4.10.0: + version "4.10.0" + resolved "https://registry.yarnpkg.com/tsyringe/-/tsyringe-4.10.0.tgz#d0c95815d584464214060285eaaadd94aa03299c" + integrity sha512-axr3IdNuVIxnaK5XGEUFTu3YmAQ6lllgrvqfEoR16g/HGnYY/6We4oWENtAnzK6/LpJ2ur9PAb80RBt7/U4ugw== + dependencies: + tslib "^1.9.3" + +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + integrity sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w== + dependencies: + safe-buffer "^5.0.1" type-fest@^1.0.1: version "1.4.0" @@ -8614,10 +10565,10 @@ typedarray-to-buffer@^3.1.5: dependencies: is-typedarray "^1.0.0" -undici-types@~7.12.0: - version "7.12.0" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-7.12.0.tgz#15c5c7475c2a3ba30659529f5cdb4674b622fafb" - integrity sha512-goOacqME2GYyOZZfb5Lgtu+1IDmAlAEu5xnD3+xTzS10hT0vzpf0SPjkXwAw9Jm+4n/mQGDP3LO8CPbYROeBfQ== +undici-types@~8.9.0: + version "8.9.0" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-8.9.0.tgz#e240d97c8b5d85e5347ce73d25865c7906c1ec9f" + integrity sha512-KTDyRTYX8sWmKXAikPHHSyc63CRPETMctyjKFupcC6OBLXT3xsN0e9aF7m+mIXutFWpUXuedtowG7iLOzp0kQg== unicode-canonical-property-names-ecmascript@^2.0.0: version "2.0.1" @@ -8668,9 +10619,9 @@ unique-string@^3.0.0: crypto-random-string "^4.0.0" unist-util-is@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-6.0.0.tgz#b775956486aff107a9ded971d996c173374be424" - integrity sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw== + version "6.0.1" + resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-6.0.1.tgz#d0a3f86f2dd0db7acd7d8c2478080b5c67f9c6a9" + integrity sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g== dependencies: "@types/unist" "^3.0.0" @@ -8696,17 +10647,17 @@ unist-util-stringify-position@^4.0.0: "@types/unist" "^3.0.0" unist-util-visit-parents@^6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz#4d5f85755c3b8f0dc69e21eca5d6d82d22162815" - integrity sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw== + version "6.0.2" + resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz#777df7fb98652ce16b4b7cd999d0a1a40efa3a02" + integrity sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ== dependencies: "@types/unist" "^3.0.0" unist-util-is "^6.0.0" unist-util-visit@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-5.0.0.tgz#a7de1f31f72ffd3519ea71814cccf5fd6a9217d6" - integrity sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg== + version "5.1.0" + resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-5.1.0.tgz#9a2a28b0aa76a15e0da70a08a5863a2f060e2468" + integrity sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg== dependencies: "@types/unist" "^3.0.0" unist-util-is "^6.0.0" @@ -8717,15 +10668,15 @@ universalify@^2.0.0: resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d" integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== -unpipe@1.0.0, unpipe@~1.0.0: +unpipe@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== -update-browserslist-db@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz#348377dd245216f9e7060ff50b15a1b740b75420" - integrity sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw== +update-browserslist-db@^1.3.2: + version "1.3.3" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.3.3.tgz#197e21fb2561fa89f8b94fad605a2b296a18993a" + integrity sha512-pJ2sYawQS0R/WI928Gj5GlPhTGzbMelq0+4INtSYNDV9ErKJcX6xjGWkoG/VnB3dpUm00zALaqkrUD77pO5TDQ== dependencies: escalade "^3.2.0" picocolors "^1.1.1" @@ -8786,10 +10737,10 @@ utils-merge@1.0.1: resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== -uuid@^8.3.2: - version "8.3.2" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" - integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== +uuid@^11.0.0, "uuid@^11.1.0 || ^12 || ^13 || ^14.0.0", uuid@^8.3.2: + version "11.1.1" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-11.1.1.tgz#f6d81d2e1c65d00762e5e29b16c5d2d995e208ad" + integrity sha512-vIYxrBCC/N/K+Js3qSN88go7kIfNPssr/hHCesKCQNAjmgvYS2oqr69kIufEG+O4+PfezOH4EbIeHCfFov8ZgQ== value-equal@^1.0.1: version "1.0.1" @@ -8825,12 +10776,11 @@ vfile@^6.0.0, vfile@^6.0.1: "@types/unist" "^3.0.0" vfile-message "^4.0.0" -watchpack@^2.4.1: - version "2.4.4" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.4.tgz#473bda72f0850453da6425081ea46fc0d7602947" - integrity sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA== +watchpack@^2.5.2: + version "2.5.2" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.5.2.tgz#e12e82d84674266fc1c6dbfe38891b92ff0522ec" + integrity sha512-6i/00NBjP4yGPs+caKSyRfpTF/8Torsu0MOW3mMzIbhgISFder8i7xbqgHlLMwJrdiN8ndBV3UA1/AfzPSr+jg== dependencies: - glob-to-regexp "^0.4.1" graceful-fs "^4.1.2" wbuf@^1.1.0, wbuf@^1.7.3: @@ -8863,52 +10813,51 @@ webpack-bundle-analyzer@^4.10.2: sirv "^2.0.3" ws "^7.3.1" -webpack-dev-middleware@^5.3.4: - version "5.3.4" - resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-5.3.4.tgz#eb7b39281cbce10e104eb2b8bf2b63fce49a3517" - integrity sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q== +webpack-dev-middleware@^7.4.2: + version "7.4.6" + resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-7.4.6.tgz#c27229cb157842882732ee5125fa217a2c6466dc" + integrity sha512-yBWCMvIfUmuhAE8vdqUKzH0vg9kuWN0KeG4vBnqRplUFHRU7lMQjkiJWxVQzvo2BTewqhPhDlMB41rAt2jVA9A== dependencies: colorette "^2.0.10" - memfs "^3.4.3" - mime-types "^2.1.31" + memfs "^4.43.1" + mime-types "^3.0.1" + on-finished "^2.4.1" range-parser "^1.2.1" schema-utils "^4.0.0" -webpack-dev-server@^4.15.2: - version "4.15.2" - resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-4.15.2.tgz#9e0c70a42a012560860adb186986da1248333173" - integrity sha512-0XavAZbNJ5sDrCbkpWL8mia0o5WPOd2YGtxrEiZkBK9FjLppIUK2TgxK6qGD2P3hUXTJNNPVibrerKcx5WkR1g== - dependencies: - "@types/bonjour" "^3.5.9" - "@types/connect-history-api-fallback" "^1.3.5" - "@types/express" "^4.17.13" - "@types/serve-index" "^1.9.1" - "@types/serve-static" "^1.13.10" - "@types/sockjs" "^0.3.33" - "@types/ws" "^8.5.5" +webpack-dev-server@^5.2.2: + version "5.2.6" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-5.2.6.tgz#3a5d41233cbb7504f814d19e59a59173fb8ae23d" + integrity sha512-HNLRmamRvVavZQ+avceZifmv8hmdUjg43t6MI4SqJDwFdW7RPQwH5vzGhDRZSX59SgfbeHhLnq3g+uooWo7pVw== + dependencies: + "@types/bonjour" "^3.5.13" + "@types/connect-history-api-fallback" "^1.5.4" + "@types/express" "^4.17.25" + "@types/express-serve-static-core" "^4.17.21" + "@types/serve-index" "^1.9.4" + "@types/serve-static" "^1.15.5" + "@types/sockjs" "^0.3.36" + "@types/ws" "^8.5.10" ansi-html-community "^0.0.8" - bonjour-service "^1.0.11" - chokidar "^3.5.3" + bonjour-service "^1.2.1" + chokidar "^3.6.0" colorette "^2.0.10" - compression "^1.7.4" + compression "^1.8.1" connect-history-api-fallback "^2.0.0" - default-gateway "^6.0.3" - express "^4.17.3" + express "^4.22.1" graceful-fs "^4.2.6" - html-entities "^2.3.2" - http-proxy-middleware "^2.0.3" - ipaddr.js "^2.0.1" - launch-editor "^2.6.0" - open "^8.0.9" - p-retry "^4.5.0" - rimraf "^3.0.2" - schema-utils "^4.0.0" - selfsigned "^2.1.1" + http-proxy-middleware "^2.0.9" + ipaddr.js "^2.1.0" + launch-editor "^2.14.1" + open "^10.0.3" + p-retry "^6.2.0" + schema-utils "^4.2.0" + selfsigned "^5.5.0" serve-index "^1.9.1" sockjs "^0.3.24" spdy "^4.0.2" - webpack-dev-middleware "^5.3.4" - ws "^8.13.0" + webpack-dev-middleware "^7.4.2" + ws "^8.18.0" webpack-merge@^5.9.0: version "5.10.0" @@ -8928,60 +10877,48 @@ webpack-merge@^6.0.1: flat "^5.0.2" wildcard "^2.0.1" -webpack-sources@^3.3.3: - version "3.3.3" - resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.3.3.tgz#d4bf7f9909675d7a070ff14d0ef2a4f3c982c723" - integrity sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg== +webpack-sources@^3.5.1: + version "3.5.1" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.5.1.tgz#76c2418486dcc02b2aa0694c104176c2858fe84a" + integrity sha512-jyuiGJdtvY434z5bUZrjz67v76/ePNvFZTp9Mdz29IlH4+GPsgyGjiv0fKI+M7BdkU6ADjulUcKAd3tUK3WlEw== webpack@^5.88.1, webpack@^5.95.0: - version "5.101.3" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.101.3.tgz#3633b2375bb29ea4b06ffb1902734d977bc44346" - integrity sha512-7b0dTKR3Ed//AD/6kkx/o7duS8H3f1a4w3BYpIriX4BzIhjkn4teo05cptsxvLesHFKK5KObnadmCHBwGc+51A== + version "5.111.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.111.0.tgz#65e7e0044d69373ea0129ef401c0299aaba52764" + integrity sha512-A2R74kfE6b3eLKS91iZiol03Ebx7avmJJBOyiP+4LePW9NNeNJGQkKeSQos4dk6R4H0YAMYlv+aOrs1CyWT3eA== dependencies: - "@types/eslint-scope" "^3.7.7" "@types/estree" "^1.0.8" "@types/json-schema" "^7.0.15" "@webassemblyjs/ast" "^1.14.1" "@webassemblyjs/wasm-edit" "^1.14.1" "@webassemblyjs/wasm-parser" "^1.14.1" - acorn "^8.15.0" - acorn-import-phases "^1.0.3" - browserslist "^4.24.0" + browserslist "^4.28.1" chrome-trace-event "^1.0.2" - enhanced-resolve "^5.17.3" - es-module-lexer "^1.2.1" - eslint-scope "5.1.1" + enhanced-resolve "^5.25.0" + es-module-lexer "^2.1.0" events "^3.2.0" - glob-to-regexp "^0.4.1" graceful-fs "^4.2.11" - json-parse-even-better-errors "^2.3.1" - loader-runner "^4.2.0" - mime-types "^2.1.27" - neo-async "^2.6.2" - schema-utils "^4.3.2" - tapable "^2.1.1" - terser-webpack-plugin "^5.3.11" - watchpack "^2.4.1" - webpack-sources "^3.3.3" - -webpackbar@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/webpackbar/-/webpackbar-6.0.1.tgz#5ef57d3bf7ced8b19025477bc7496ea9d502076b" - integrity sha512-TnErZpmuKdwWBdMoexjio3KKX6ZtoKHRVvLIU0A47R0VVBDtx3ZyOJDktgYixhoJokZTYTt1Z37OkO9pnGJa9Q== + mime-db "^1.54.0" + minimizer-webpack-plugin "^5.7.0" + schema-utils "^4.5.0" + tapable "^2.3.0" + watchpack "^2.5.2" + webpack-sources "^3.5.1" + +webpackbar@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/webpackbar/-/webpackbar-7.0.0.tgz#7228d32881af2392381b6514499ddea73cdf218a" + integrity sha512-aS9soqSO2iCHgqHoCrj4LbfGQUboDCYJPSFOAchEK+9psIjNrfSWW4Y0YEz67MKURNvMmfo0ycOg9d/+OOf9/Q== dependencies: - ansi-escapes "^4.3.2" - chalk "^4.1.2" + ansis "^3.2.0" consola "^3.2.3" - figures "^3.2.0" - markdown-table "^2.0.0" pretty-time "^1.1.0" std-env "^3.7.0" - wrap-ansi "^7.0.0" websocket-driver@>=0.5.1, websocket-driver@^0.7.4: - version "0.7.4" - resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.4.tgz#89ad5295bbf64b480abcba31e4953aca706f5760" - integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg== + version "0.7.5" + resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.5.tgz#569d22764ab21f2de20af0e74b411e8ae5a0fa46" + integrity sha512-ZL2+3c7kMBdIRCMz6l8jQMHyGVxj+UL+xVk74Ombiciboca8rHa15L86B19E5oh1pL9Ii/uj54gtsIrZGMo6zA== dependencies: http-parser-js ">=0.5.1" safe-buffer ">=5.1.0" @@ -9011,15 +10948,6 @@ wildcard@^2.0.0, wildcard@^2.0.1: resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.1.tgz#5ab10d02487198954836b6349f74fff961e10f67" integrity sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ== -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - wrap-ansi@^8.0.1, wrap-ansi@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" @@ -9045,14 +10973,21 @@ write-file-atomic@^3.0.3: typedarray-to-buffer "^3.1.5" ws@^7.3.1: - version "7.5.10" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.10.tgz#58b5c20dc281633f6c19113f39b349bd8bd558d9" - integrity sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ== + version "7.5.13" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.13.tgz#12aa507eaca76c295c278b1aebf4698ab2c1845f" + integrity sha512-rsKI6xDBFVf4r/x8XyChGK04QR/XHroxs/jUcoWvtEZM8TPU/X/uIY9B1CsSzYws9ZJb/6bbBu7dPhFW00CAoA== -ws@^8.13.0: - version "8.18.3" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.18.3.tgz#b56b88abffde62791c639170400c93dcb0c95472" - integrity sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg== +ws@^8.18.0: + version "8.21.3" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.21.3.tgz#660b4faddb6a3e575c86e078126919961f4de4fc" + integrity sha512-201TZ/kPWxoPr/OKWjquZR1SWKXcvxdH+e1xrx89b3YbmzLMFCLfnaG1HFIgWzJOEWZ7MvpK++odZufgYR50Rw== + +wsl-utils@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/wsl-utils/-/wsl-utils-0.1.0.tgz#8783d4df671d4d50365be2ee4c71917a0557baab" + integrity sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw== + dependencies: + is-wsl "^3.1.0" xdg-basedir@^5.0.1, xdg-basedir@^5.1.0: version "5.1.0" @@ -9072,14 +11007,14 @@ yallist@^3.0.2: integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== yaml@^1.10.0: - version "1.10.2" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" - integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== + version "1.10.3" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.3.tgz#76e407ed95c42684fb8e14641e5de62fe65bbcb3" + integrity sha512-vIYeF1u3CjlhAFekPPAk2h/Kv4T3mAkMox5OymRiJQB0spDP10LHvt+K7G9Ny6NuuMAb25/6n1qyUjAcGNf/AA== yocto-queue@^1.0.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-1.2.1.tgz#36d7c4739f775b3cbc28e6136e21aa057adec418" - integrity sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg== + version "1.2.2" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-1.2.2.tgz#3e09c95d3f1aa89a58c114c99223edf639152c00" + integrity sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ== zwitch@^2.0.0: version "2.0.4" From 6c22db6f8a1080a04a01d92e5ffc258e9e9ce18f Mon Sep 17 00:00:00 2001 From: Jeffrey Aven Date: Tue, 15 Sep 2026 09:00:56 +1000 Subject: [PATCH 2/3] vercel refresh --- website/README.md | 42 ++---------- website/docusaurus.config.js | 4 ++ .../src/components/HomepageFeatures/index.js | 64 ------------------ .../HomepageFeatures/styles.module.css | 11 --- .../src/components/SchemaTable/SchemaTable.js | 49 -------------- .../SchemaTable/SchemaTable.module.css | 27 -------- website/static/img/docusaurus-social-card.jpg | Bin 55746 -> 0 bytes website/static/img/favicon-16x16.png | Bin 872 -> 0 bytes website/static/img/favicon-32x32.png | Bin 1533 -> 0 bytes website/static/img/favicon.ico | Bin 15086 -> 0 bytes website/static/img/logo.svg | 1 - website/static/img/stackql-cover.png | Bin 29955 -> 0 bytes 12 files changed, 10 insertions(+), 188 deletions(-) delete mode 100644 website/src/components/HomepageFeatures/index.js delete mode 100644 website/src/components/HomepageFeatures/styles.module.css delete mode 100644 website/src/components/SchemaTable/SchemaTable.js delete mode 100644 website/src/components/SchemaTable/SchemaTable.module.css delete mode 100644 website/static/img/docusaurus-social-card.jpg delete mode 100644 website/static/img/favicon-16x16.png delete mode 100644 website/static/img/favicon-32x32.png delete mode 100644 website/static/img/favicon.ico delete mode 100644 website/static/img/logo.svg delete mode 100644 website/static/img/stackql-cover.png diff --git a/website/README.md b/website/README.md index b28211a..2ff9152 100644 --- a/website/README.md +++ b/website/README.md @@ -1,41 +1,11 @@ -# Website +# vercel provider microsite -This website is built using [Docusaurus](https://docusaurus.io/), a modern static website generator. +Docusaurus 3.10 site for `vercel-provider.stackql.io`. Shared navbar, footer, theme and plugin configuration is vendored from [`stackql/docusaurus-config`](https://github.com/stackql/docusaurus-config) into `.shared-config/` by the `vendor-config` script before every start and build; site-local files are the provider identity (`provider.js`), the thin `docusaurus.config.js` wrapper, the shared components and theme overrides under `src/`, and the static assets (registry logos, the provider featured image, favicons, `CNAME`). -## Installation +The docs under `docs/` are generated - do not edit them by hand. From the repository root: ```bash -yarn +make docs # generate docs from the provider, then sanitize for MDX +make website # yarn install && yarn build +make website-start # dev server ``` - -## Local Development - -```bash -yarn start -``` - -This command starts a local development server and opens up a browser window. Most changes are reflected live without having to restart the server. - -## Build - -```bash -yarn build -``` - -This command generates static content into the `build` directory and can be served using any static contents hosting service. - -## Deployment - -Using SSH: - -```bash -USE_SSH=true yarn deploy -``` - -Not using SSH: - -```bash -GIT_USER= yarn deploy -``` - -If you are using GitHub pages for hosting, this command is a convenient way to build the website and push to the `gh-pages` branch. diff --git a/website/docusaurus.config.js b/website/docusaurus.config.js index 1c65881..7aaa431 100644 --- a/website/docusaurus.config.js +++ b/website/docusaurus.config.js @@ -24,6 +24,10 @@ const config = createConfig({ // history; the shared config leaves this off. config.presets[0][1].docs.showLastUpdateTime = true; +// Social card: the shared config expects a generic img/stackql-featured-image.png; +// this site ships only its own provider image. +config.themeConfig.image = 'img/stackql-vercel-provider-featured-image.png'; + // Use the locally vendored registry-branded logos (STACKQL>> | REGISTRY) // instead of the shared config's hotlinked main-site wordmark - self-contained // assets, no cross-origin fetch. global.css swaps in the -mobile variants diff --git a/website/src/components/HomepageFeatures/index.js b/website/src/components/HomepageFeatures/index.js deleted file mode 100644 index acc7621..0000000 --- a/website/src/components/HomepageFeatures/index.js +++ /dev/null @@ -1,64 +0,0 @@ -import clsx from 'clsx'; -import Heading from '@theme/Heading'; -import styles from './styles.module.css'; - -const FeatureList = [ - { - title: 'Easy to Use', - Svg: require('@site/static/img/undraw_docusaurus_mountain.svg').default, - description: ( - <> - Docusaurus was designed from the ground up to be easily installed and - used to get your website up and running quickly. - - ), - }, - { - title: 'Focus on What Matters', - Svg: require('@site/static/img/undraw_docusaurus_tree.svg').default, - description: ( - <> - Docusaurus lets you focus on your docs, and we'll do the chores. Go - ahead and move your docs into the docs directory. - - ), - }, - { - title: 'Powered by React', - Svg: require('@site/static/img/undraw_docusaurus_react.svg').default, - description: ( - <> - Extend or customize your website layout by reusing React. Docusaurus can - be extended while reusing the same header and footer. - - ), - }, -]; - -function Feature({Svg, title, description}) { - return ( -
-
- -
-
- {title} -

{description}

-
-
- ); -} - -export default function HomepageFeatures() { - return ( -
-
-
- {FeatureList.map((props, idx) => ( - - ))} -
-
-
- ); -} diff --git a/website/src/components/HomepageFeatures/styles.module.css b/website/src/components/HomepageFeatures/styles.module.css deleted file mode 100644 index b248eb2..0000000 --- a/website/src/components/HomepageFeatures/styles.module.css +++ /dev/null @@ -1,11 +0,0 @@ -.features { - display: flex; - align-items: center; - padding: 2rem 0; - width: 100%; -} - -.featureSvg { - height: 200px; - width: 200px; -} diff --git a/website/src/components/SchemaTable/SchemaTable.js b/website/src/components/SchemaTable/SchemaTable.js deleted file mode 100644 index 2553353..0000000 --- a/website/src/components/SchemaTable/SchemaTable.js +++ /dev/null @@ -1,49 +0,0 @@ -import React, { useState } from 'react'; -import styles from './SchemaTable.module.css'; - -function SchemaRow({ name, type, description, children, depth = 0 }) { - const [expanded, setExpanded] = useState(false); - const hasChildren = children && children.length > 0; - - return ( - <> - - - {hasChildren && ( - setExpanded(!expanded)} - > - {expanded ? 'â–Ľ' : 'â–¶'} - - )} - {name} - - {type} - - - {expanded && children?.map((child, idx) => ( - - ))} - - ); -} - -export default function SchemaTable({ fields }) { - return ( - - - - - - - - - - {fields.map((field, idx) => ( - - ))} - -
NameDatatypeDescription
- ); -} \ No newline at end of file diff --git a/website/src/components/SchemaTable/SchemaTable.module.css b/website/src/components/SchemaTable/SchemaTable.module.css deleted file mode 100644 index ed4ef36..0000000 --- a/website/src/components/SchemaTable/SchemaTable.module.css +++ /dev/null @@ -1,27 +0,0 @@ -.schemaTable { - width: 100%; - border-collapse: collapse; -} - -.schemaTable th, -.schemaTable td { - border: 1px solid var(--ifm-table-border-color); - padding: 8px 12px; - text-align: left; -} - -.schemaTable th { - background: var(--ifm-table-head-background); -} - -.row:hover { - background: var(--ifm-table-stripe-background); -} - -.expander { - cursor: pointer; - margin-right: 8px; - user-select: none; - color: var(--ifm-color-primary); - font-size: 10px; -} \ No newline at end of file diff --git a/website/static/img/docusaurus-social-card.jpg b/website/static/img/docusaurus-social-card.jpg deleted file mode 100644 index ffcb448210e1a456cb3588ae8b396a597501f187..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 55746 zcmbq(by$^M)9+14OPA6h5)#tgAkrW$rF5rshja^@6p-$cZlt9Iq*J;!NH?5&>+^i? zd%l0pA7}Qy_I1b1tTi)h&HByS>tW_$1;CblCG!e^g989K@B=)|13|!}zl4PJ2n7Wh z1qB@q6%`E~2jemL!Fh^}hYfz85|I!R5RwovP?C~TGO*Io(y{V!aPUb>O6%!)!~Op% zc=!h3pup!KRwBSr0q{6*2sm&L-2e})oA3y5u+IKNa7f6Ak5CX$;b9M9ul{`jn)3(= z0TCG<li6i8=o)3kSrx^3DjJi7W8(8t_%PJ~8lVjC z2VTPD&_&_>060+qq1c&?u#iAbP9wbT2jg5_aX>LlOOXw|dQJ8p&2XYYDc|J+YUT?3|Fxm{f?d*1vFWPGwXt8P3T#_TQB*NSP3+0+ndOe%v- zTZotCfofsS06&ki{<`Cj8{s5jFZc&1dl<{IBW%#V_!JjOm6+#&aRi;8ODL(?0fENIOtiNXjMhdO24CeDB#rNcC*<=TwpueFfx=2=r z-lt`qW^;vEFji%7kO25#YkwjKyZ93WFbbY!Q6-@Jz!9kqj>xgp2VhEYyMJwMYyHZV zG;7!MV>54LS*F?==$6(Z9S zfrEy``J-iu6G?#+q=$58MlrE}+C~G-hEMn#CuNuuVV;8#FHuD_feqmtfw~Ran|V#C zy+f^&q>|d(X{ubCVWs3Ai;Fz>-kAk`yX{^Qj_xV#NEV8oxtfCsq3%uYN0U4+Kcu%j z?Rzr+fnu%QVSgx7Z8;iqDfklVK3tl(C|B5~_ywyQf&|IJgyoV|q( z<1`6^2G=2%pTX$m#~!Q-7f>sA;n6 zsy{fJ>o;yxpRCMtZFb#E)dl;n&K%g;H?#HaC_HvnHuqN*d+9vB7ZNpfqqTsk*(((>8<~)=+HX!*Ss3~|# zShAf@XL@`g)$G$rAA9cU; zk+0v$7Rl=PDs_rN&*@^DQ<3}LIqeDu_8cvBZoZQK#xaB*@qDhG^d_fYSBG@Y_wC5B zy{FTF=4jI`H0PRGXlulcwJ$*KBs^);$y@AfTWB!przp%+gn+%ZU2qD$Eml|2m?K;y zsAx49(J!Aq5lqX4u5Rlh{1hD6V?uI0-0}%=eSBZT$;aWCJrM*G=&(~P~7QxUJFlHF+63{SfFhWU%gt&D(4Z~X54CH?JsJEHzO9{;5# z5f-P_*$Y>=CXYL(i4Vw1)$Y&DwihU}jeLyuS2hQ>zS%^7!rET)y)?ZI;W^c(neZ5; zcYHr@l=i48ImXZ(y)o<7>Av^Nw!8t!KDn{67gef*G5f-&iZ;`G@ej`@uBTkn0_QVc zw|RGr%!y|LdrjWk$H6iyi9+o%)D%pY)DHt@e}~ z-ryeSdskl$jkA%Gje(z=CvGUb4lqb$@>K02q8; zBpGv48m)G3Jz8nD`*7z;ch+s~JId9q{~KmJV4qG#VyhtwGh1U7ZW~XgF&CHVcfjI@4|IAMzt7B{D4ttmRhW76WO-cP6HX>7cPSIon_Pic=YB^cwH;qqm2b=+@OjfH55;lLt@>%R&7MejNBW98rLJXZZQtF zmm<7wrV(U^X%O}rZp($;Nb;(nTO##-Fk_K%y2c4)Yt?EsKDLVz&SyIxmRvPYUf)~A zkMkfE4X%Dz8*f>*I$-5J)wLSdUUaV&xP%U!WXidR7*F!E3|fu1supvKyq>T*84`M& z=Dt)zp4h*&a^3bbAWSy|{$~mRt znU?J9X@W)z1+)2SKH;RDEk{C{F~PxzePOC4k2I22=OxAKZEhYTo#jZLnzJRvL-#I` z%_%U{YhbA5LxSuc7mb|<#t0l8BZHy-cvj?r(|M5YOMU0wJ}PLj6z+91PP@u~sUN(0 zoPkUiqj+}m^;#5WI-p1sl3!d`><`0$1U4*Tus{#@{oJ~C_^ll&fIY{RWHLB)Iw~-5 z_trhoc*;Xx|5u&|7Q=~%>SU9dJXt>XnSP z$}G4aR=bB#EC~i5U_z8$Olb|B1Ec2J6a`$P64P%*8UxnscnAmYxki;vGRSH!M<=El z7AwT}?l;S3Ju)fk9NDaW<~K*9J6DCaimLP@Zry38*StONeVaYg4GMSV1sb;$0#63E znXJh6$=|17p)3iget{zQI-ZcSA4kztpbVusXh9 z97)P(^GVx?9}T_w+?VG}Hu2dxs!PdI;c!Skm{8crbnUpgGsmO6Y~0f~`3af#=;}JO zs+>jl(}Ww@TF9nIIp*io9|Ar+SXKeoJ2p0xqq^dDIUaz_3UMRe!*?g>RKH02EKY^8E=Ov%mKqCKc_O8|58B$F z2nPy$8uP`nq5-GE>)_IseB*$*+;W_EcowmS_|Q%w=6aW(&AB z%OtxG-1&Xrq>E%{bjzK4kBw z>Fssz$u`@4(H4(yPd(wlj>oT~6v>IV?P zZDj-meBV3Xh&lOz7Q@p@Wg;VMtEtz0tWmBTlY%+n#pR{sF{)xA5u*BuDd zu~BvH^44yI-2poCTSulFIMHH|6$HIN2!U|l513rs>o5b7&T060H4stH!Rj6uhJ>*c z|EXULN z@Ms{ehhc57nJbz5tP(eS6gqwNx4;1P!wL~Xzd!0hhz^)}wUrh90P!E%NrcHnd5moayrW^mwAO&F9eVphr}#sl@u5#&@cZG3Pef_5ki2d4No`s`w>3E)~NzQq~(%!wQ~iX zS=!>QgW*;6d%-30eCYi-s{}L5+4xRvjRMVc-|_!cJZOOW|D`V>G$9BAul9zT%D`1W z9M}_f^IBfCT+$nV07$(ZMgM6Q>awY7HarX62K->7rWiZ>Plf%@Tc$X)SUE~YSzKHO zOo@t904vq~)2~8z9N~Y(5ghjQaweijSq9}$13ISo#S19Gyn+S8<}IqydMB*M2Fv(F;m*Z^NjCKA@hf(byh~F_Wz8Y|LB9G zj>CREj|u0+^+~|!q^Z4wYAm~DH8vU0K5hJLx;^WW) zn1WdmfwUxh0&F)Ge zJJ$CZ;Gif2pJe@g3jR{7X$9eG;iwp*gh^4;#?q$usU`sYWi;VGk9zUsuxLCqS?i4> zU*!nKB+RzHh&TF;OaYU1boXkFHseTZ9^7*ClUf6WeOAm2`Zgc?XVxs@; z3fyjS*rbEGB3x27NK$sQDLqTsoYX+=I47hKrjQhxw>;|F(o#M)1Zs3=vHf+{4*=lU zQU(~L2n)P!C zOzn-%j;-zdo*A78MJ(b}aNl*Pd%bH4<%$K3cP@a%?zXvnXr7tnRf8PyxM=h2%x6XV zGm+MfF#t#t=FVq6y^o&};nl4gZ1=OgS0W6oT4??aAn_EswVeD=G?0*F3Ky5X?YMg! z*>m;`U68Bw-j3*NS)Xv59AyM$#IrAaBLy!3%T~RztCkOyD`0Oh)~c45m`f(fWkn+8 zFDQ?ehB?iesKfXr>kR(d+^nK;|$bJ0BgK9l#= zSZkY0hNH`T%pTpu&S<)sN$BmKep32<*GjviX5<~dm2S)BRn}Za<=11?iR0CbzUy=Y zs!S!r=YBKN!Hvrz2HB~apVp)gQ@jZ_C@MZHwF>*RQt`RvqEl`)rFXy;*9O;aJ^+IS zAuxBFkwxDhrD+zs6}YE;!WWE7N;x=xxy(hv8tOrT%;~evWtP_;i-tw#{=|s|_1gD} z+$ZPC>;C15y?f=k!B)}XV?@W+W5Jl7E#au2n|eXFYo52!7iV_nr>%rHTLnmp5t__ zeQ~n3Y!)Mwq>pgU`A+DOtI(5{uM`!T&#y7{XqPhrZyx}q50{b`55VTpH9@&go43WC zqZc?IJ_ikEfm4 zqiap;*teY3XjF&M`E)w#v0j2fK8>&^=3ARl7X5?sL7($cGUyT(&GjZ}T7K}UWUq6o zgZIm=(`C|a=eg_1ZeQ8aAv^V`3$rbeo%f|J-#teM&do=aJ4+|bCGzXl53;$~hV*A0ZA5ycpm&br> z1s-woGI3ag*H2HL@1`7`+#zk!nQo^`L}FmXBF9_OVvslb3Qd{^lg7NlT6j-eh)ldq zIsckeM z_udDHz~0vrwpZ3KkTG;-vI!dRfSCp$d>Y)?cj8N5Tr%KDYlI~&_w+W~Esn4I>jEK8 zFVT=y$0H**Z{;PZsC?US7QBb(=tZKtCHDjvqV8L^j>>H?^4A4kTvR^*B7Ecb4?qFk z;I3A-%I#4)i|WCd)!jLZw1itTxsZ$F`MsNa(gzoB&z!Z262^le=~~4I&U`Eb`C+z^ z-VqlxQ;MGC=e90n>dE>aoHV5TkqviF0s?l+z${VoH%t8KFvbH=8^6e$^AlVGU~39o z`MtfitBvEM13&NqqE=`^fHwS_HEw#UDbHmBR+1A|sO+c44k$ zHR9{S!q-(m1a+=}nRGQkrWg-S#Cg;_7%!4Ry2VnE5r>E(^0Gl4^r-P`1z2qO@^9(pRjEp!;DAe7B)FZP$pa4?IWYcn*v>YZ(G2ETw zy|C4)s}8H`Ddud6ogaW9O%*z&O_X=V^6P+mS%uG2EcbTZmk$RT3*(0o4D%(Ts3kn3 zR^3eYF*}KjX-S8m()tqnj4;!Sp!Ho z(7&2M@h1HM;%Et+(u{~Toh0sg@7K`vuJ8O(-mWug9HRvjKP2RmGqWQF%DK(bM_*a0 z>f3#KhBt~#=bL&FWEC}JiXdh?Q9fn5e)7$+{?1Bdf8>;*vDW!BMGjU0?$JBadm(AQ zHAmi$WF|HJ@r5-F$f^VPE+X>suAfbT1DUvi%}6k2#y?ZFyltx!?p zAr?D|oG4gh_c+U9sb>u3LP&?IzmiCo$x4%SP!Q8Q(jEtG(-GPNIhRV_K5L z7Q77k6Jdl2*V9zOs=X@?=vUZ(27Ngc&%L;RjmxGl273=|7++0XC*K z9Zp<^Y~Pm)w3D*jwEo<^OkS4Y<#>lqUb=O)W%Fa5t!Yi<%z$TRIO#_Z7Q3QZ2H5BD@(x_63h;Y($5taTf_%0;ZvK_v)P3}%^YaRF4ri60UEoVB z9tvN{)Jtntfs9Z(yp!blwx06#5$P9W8ouO?r4Ila4@;@S!F4qL>h!`rvxwm8$-&c` zq^<(9nR=GK@B4e0qjX45ZoSs3?|jeZ@13@KMK0R)%1IlSsLp0DH)BFK20FoEM2kwW zSasI{O!BwCJ+a#u@A3ot$06uqU?n&`1G^@J*u|t@Fqwmwe+Wf0fpg%{_PCq6A2+)j z2hE=ehK9p~efCY}}Fj~mMr1Qr~qOdueZ6a_2SDwHZ*lG#r|D%`UFa~RYpuWgUN;*|PxsXBBeqTj`RJnU2 z9PE7zrU|}#_j#k%TQeT63k<&b?|z^RNGOSfltB4MjA|mxqLrdoZ?;jS1BSRxcR{3 z&%l5U(~v7ESy(7pNhyb$1x}p^+*ny$*~6KoZMdfentT6QH1Dr`Dd@U^^%MTqyRNen zJ1b!yKUiiizxRn-n~&g}YvqM*{G%USoM1&>P*AuSldPnqET|FpU!M=af1wNq_3z-J zu56ng_&fk$SpR2Tg&VxTY(oJPP3gAh>wSjZ5#J1#nHbkU`Cof;dA1dQz?$+;E7aQf zK?$L1IL6d(9>vPMi+iISD+SJz*W!e)X$i&Pwc(XN-;gZPke+O!zgm29u4?v!xUP9C zcK48Y@K`NN;M7x{1@te z=@S`oF&M(3^!G8wji3Z4u|IZUp?p~QVc?q&l}!U>SAWC+@B3Q=M8Gx8SMIb+e*r+q z{Yg@g$}_Sz-mgRV1*RA!0Rj$rc-W8!5u7m!h@?;r;RvN(6Nx9m1}wb6UV=69pH!1u4ND1C3^0#GV9Vk5v%jLF1iBkM+~_oe#(k6e04;|1 zqVxcTK}B~<8@cW$rb+NWw4LZ7KVGkN-UHS;bD^cK+2-3`Rj^V98<9f`kPTuKt;S`5 z?|)V)15P$Dy~TG^p+BRJpbTIN2fb57!5|jT#s_X^pnNi>exLT+xuR}kI zLTF>DrKH5As1d;xUMq}JD`rE#xm<3PV^bKt~*|K(@>_s$+l6?PG9c;I$Y$I9Wx zA;xF_MZf_#OaTl`qJ^-80rMXYZnX;yHMnC5N`v2j=zq5Pz&RPG92*Z}aj95Z+R(pq z5>Xr9FJ8qsGy#`dMOy$X4%|!w<&^&whNI5zri}lV6#?4!$Ljbv_f0<2-3Nu?974eOh|NodBrc6s{g264H^#+vv zkI(-F!??JN@B<(iW`KcV-0ngu+-@)j;0A>UFo`kAQKI6|7gl5B1rI>b2tj!?@U%?! zpFY4#g}oL@l|*Hrm#l)1qwa_0RO)Vc;oKlpABihvuq26}r$$LgB-%uwqRxuRrpyG- z63Ji#aENg52nfiiNRQwVk-^yt-aSGBkWsL4aPbK7DcQKVMb!z2h+ndEs=YI%qUPWc zQ>IZ-)zB2Te@6Q%>$!xa)SLHy;OQb1@YE3;2Jiq}T8Nyd)7_1XLd)Qqf~l-gf<mu~bv_xL2)jRuX@t1;#}dEe+$KYBs8Ozc8vKSmQMe zW+znS+=sB{$!eWdtEK&;U{CqQ65Mz$g8{KO3091K?+PmZnxe)Uj z+Qa!s1zBptH)^y=Y^r;+YwUV(!nv}S<^CwP->`OJJ9$f5gUG$;btdeT%D1lTQVA%c1zi!li^! zRC4P;e}Vde23*`#o$}dkJ+39wA!C@gdHJNz_ROozn%~qZ35{gxr zfiN+FJmv8BeiZfN4}PZY+~4(EHI@`4GB%VeN^dL-nxv{!>bS=G=d1&YuW4g(RYo?9 z1bQp@-L75k9jgsahz$6&S+Al>N$6|(Uspyh?G^CV(>yb-uEMv?{QHK7y|JZHbV$py z%-C#HQ^wHzF5_m4mG%K(t4T}wM0ZA{r9PYV^B7{;x3r!Xhwb>CR?<2{=4)iW>-lFp zYAZW-ff6Srzcmf>ey26kFp~2&CwAle919+v=b#GbfQ_k(^GDH^U5h6Ij_hJl+$cY7 z`$l|J9)NY0%G=H3-AiTp4`ibZCebLFOx0X*^9LW5S-jM98V1l7TC$z>H_cy3Z}AyT z7cVLl@}RT$dt1%R4$rYgTUqZJB_<@D5gGBnLzk|&Ap3rHOWJjl)n=4BT|4ZgqT{Y# zt8otJt6vZPNdUZ->2VQc|t#}@1f$zuiGu7Z`2Eq_iUO7kLfvf z3+3l;rJH=!P82eCED=AEqW3F^^w0nBW|fbIo$+A)nzK!N%82P?SXGa`4vSNK00<2u zG?U_{jq8ikbd8p@c-wd;R3TJ+v(c9o9< z15te~^)#o6%yp?zaR-=9=hVgU2)|jpPHt`JGmCnIB+qepbmFikm>#nfBmU{7vA8^z zhTK~#rjjnUOtV*azuR=2pq%=qDo}!HCW$#qTWyAliZ8Xa(cAZ0uV^tvuLjr-#E|<6 zgACc9`oD!F+lpA=rLNEf$nCx{x6Vg$hB|ia>mt1(@zkT4(zdKQrNiynVbyP`+<(GC zZSyg_F+eKZ$i9krPDP!?9!-GQV7-#k7*{YGhxdf%D@)yd=P%=c?r60bP2qytty%-G zh7;7A?%TTQIkk;cPgbW*m6aq{m1>`^R}`Bmi$Y$X?QaEJ3_Auk*q^L1i~N3dGM6CL zP<_JeZDBHK(^_7!@i}$(_U*t}@%hy|H{~Q{;gP|bU)fn%xGdctI%`>elX|Q^@vKaK z!d+`Jp@j=)v%^wXH{7|-__X;}-BP#uIY3=_0IGNc zu~4o%m8|B~5EtZ$^}=3sv!lGEYU+H?Y3%_wM6P8#*6#HJvT!3ul#<{n9ja- zRGu5okTwJ1Zmk}BqcGi4_;~IURanbdr+P5iXG<{exUhhs+*pLQ^{jA#EZ#>o0{+2Mh|5& za#ugek0I`(zQL#5eLDARVY*Xa(DwdUqkel}vhN3?;f0iO-H(xqufvN&!zQI78i>uE z8>&m)ewHaoGgtXPku_dEb6PORWr~;1cC<+G5K=KBl%`A&gp6C>lB)v5Ri$FsN;P4>0AbJz7kC<~Dg6Mg7fXVHmZhEHpA*eA&u za?3ON*{!W8PYLPoTR+cR&PxuH$lp`AWkTjWWz)Zkn3TIiCEofih+Lm=9GE(9)!Yfc zt(H1<`s=^*222e=?7hC0lh4e7B}PtVI_{cAdxGNtdfZX}Ca>Ti9YS^NB6cCtzFtR} zgaj!>#THZKLuuFqeb58ou+VPMIV94Az9}?pq(nm5%Nr@`CDh7dQqUo_(1Ka~Jk;oawETtB8>b`mRyBtgh zO#hV*Tx!lPBM`YD{&wUnqnt2DkRmgRC{h$?KYyR zNy|HI%;HhKQrs~er!LN>c2+qWT)k%E+~E5H9eFKV;EhkieNbfqMTavz)YO`;;q)r^ zRKcAY}gLEwaGA zNB*t;%C<*Y+tgCdcJX-=MUjGgyz~ESiO9#&b61{-h<+|2 zO;mjRZ}0|pCLmN$E}rD#(9h}~)QpVO*=OQA z#Y%e{>N&D?0uC{dY5L(<8J1$SoXTWsj~6x5e9=~^#nEWa^lWqnid)H7wg`B&H>nuf zicIgRBoFD2ii?SfJ43AUH&TVFO^DDYcT;;?zvOP%hwr9IDk(8n^Rrc$KG_W$S^CCU zJn=ZugG;lxxPrOnJdw}Typ5n~t5&$I{si5!MLacZa-r_WCh{j~l7-Op=$9TV5idhN zglm&=R)0UNEvq|kz+%&#x}Q{2@c3ZLBldp!yX7N~c^eZPht|o%1isQe*+RisbVF_% zc)4$!;>pF);4JrP4@@UX#!&8hI;B{0l7;+j>*r10Q|es&1NFKQ)-tV2$Om$A@O-## zCLqC6viD-87K8StG^Ws5ct0&olMkYox>$?+Dv3O{NlG}G;g5QSmf4?q;BsuQo`^U|{x}>ACKXRkdd^tU`U+|LS znWy0^S2)LcB@0!EdDt(Vij$36^78r3tM}C?KI}e^X9-D}*M!iFT%zNr0Gf&Ck7!`A>(uLE(OdeRwb4qX3EiMVz=vWC3?2PE%-wA%a1ap0C zl~rRJyzSkY8Ag$Lm-Lq^*t1^}+zs%@8si;z!Aaw5c$|~Vez}RpL6m1>KPeiGJ-kE2 zbc5&X&fJgVtRw*RtiMc#4#s3H)KgHzHqg{R3E#R(bk3b8<&|L5d#($dxdtH$sL)Ko zW+BbDfPQKTs#e36Joca~N!pf`_Le7~Lv03)(7sml@e{h^6)?B<b% z4<^3n;sOFVdZ|+>M(^LPJA^2T?>N`FCB!o7f5xo^osCpJG~aJR*pRaJ`|hF>b2{X( z4aKEJ#QV2I?XR1|0J3}|ZH&ySn!Nm=`P+m<#hI$;xz?{pkF56P+%fUR#QbB?5vU@D z`>PliKDIXEyl0$1ZZC5zk$jU4dGg+)S}VQJ{2eA&|CmIoN#1+}`@$?!Mu3F2+9T02 ze0p5ot83?2=!y%bJ6DW(u9o4&WO$pZ4(odr6?FoB7XL4e)f!oeU;7hCto!x9u^3y2 z_p)OlA3aa{6K=F7$1_8Kool5Rz84;b!W+-X$m#2JgTdGR`~%<5^BB{h$tmHspv zRGNoo-aTFhEpL1CiLM*gJ|XE30ntfqZ6RW8RmFz7r7ZSdo2F`+dbIqX^P95F?^XML zEd;Je?~!LW2b^bUTSOUq6$IdZfuOEh#~DDY>}8&v?k$U}JNqeWBw+k5RaOv)s}jE= zQ}Q=>D-=P$ONyT$s*Ds6LSFrpWZV z9vm@*jijy=tPX3=aU<`d%SuI}+t_(ucyRkiyAE)B^U$L7DbCd`ZfC1GSJ8C#vU2#vSFtvhw(~TDanF;rn!a zWgH2WF*ekmAnI0Qm{vS{Le0(+uM5o()7|2IRkMwT_#?fPo-fNKuG}%_?WB5XSGAlb zor5}ub|f^JD<-m8x~AHfvW<5`F`lhl67hM38YaG)q~vy{D&^Yntrm?>4z^ZOsgY#Q z1rH+LbV>KeLE_&Mx4guoLMo);;h{zA@6Vg{<*=;A?ow0;2nhIdN=lYmb%EU~F+?HH zLaoso&FKfglw9l+vgl0wD}L>5CraD=W3%oYoYELRdWj9p+A0?Z!6LgiDg#Eu>Ssf0 z&g1y!IZG_R=3hb@lHbRp(1j)&W)S7%^q<5B2`lgE5Sih9hn&%pLfAg~&g4O!dAzEw zr6}!RX6}Ey-TL;=D!pNqHJX2g5o#)RC9PgCs$st=+TNbHeB0ziMr46BDXhn3@+9lb zakzM5tAy8y(qP%tE{ZSGapnb4Z^LN!*_y7=s>e||+mVpl^pnes7OO}vC4KH*VY&(u zBMQ9fD2JG^z22EVkkJ~(SO;UACk7d9{ug7_|C8~{@mt)aT#ZU+DQOUbF#6axF}^Fd zmhtBwd{#Y3lNT?|FIsK&gZ~-#n-Y__6Paff`W5$GI_?&4)>Y6wNn%X>=Sz?np7Qyo zZH9g7Vq#S+Wke2_L1>5intVG>$_RV=;j_%`e4O#OwWIFnFw^vf``;Nw$R9Y&G7L@Q zEpjyn?t&uTR?$ToG6e_w*elUbNC~oP3@8{6T6R7*{BS$ppthlyGy84Q%jeFbF-1n> zO)SGM6LD+T;r0urWn8w~gEyVb*0_W98_BXWEHC7aW9+`WLmR`7N+r~9=L(~xq$Jgb zc0`M~DlkIF1Q$x214|&HJK67p$TCg(T6J$4SH->xR%+&~^((0Nxq2lp^|OY^7-4i; zBL#gyG5+ECIpe3%Ik#hK5FP>?%G+Pa7_Z}b`G(asWH1;##`0)}=0g~DiAQ%12Cj5i z28T%p_C$R@L_1|{@r`H-3@utWDI40LfR4i!SA32m0qYI@45{@x~z)w#KlJvgXw}%|m zRo=DGsu9QXI-g+Tl7VIjr}mX;4fZ(YL6iQz z`lznb+}yW8^|YL;n26~KwXN#Dv2^Jf8J;RGE5MC0?77MSdMq!OZES zr@rC*vXhutbr*g#pI;TJ7-h(_N3>Ax$cW*Hvendxf#T2KHpKfFv0s*GVYIHa#ER76 zH)fn1{!z7-v31;4FFC;np`(vIh~mi%Kk6K0qRrbY_10$&xciNpno*F#wFH=MCWkdaFgK=U$FHh6#XJ6e393;9h_D1Zj72KeX!pg_>9E<8*a-g z^}Kf2k*_7=T(WO~W~`LQ`#b^ur_5KjDOs!UUZE)a4ErIxiW)A?ryWE_hQ{K-z66() zy-hd_Wf6g>qeoGlrK;PChpG^jPZRHd1~2MDVv*}eCafA~rLyFEm7f|EuG-#T2SgA< zQulXvo;0LIo^229Q9ItQ+RBrWH?~QpcDh9k(_=n;aXhtJh!9kR$kCNj9kJ=~BEU51 ziIB~(jdq=S3*TzWE4mQ!!I|ecuJydbjIPp*Xw5Ghu@wSqzc$S6Ix+3baF**T>Mt41 zK!k+2I%~h$4?s4Ot~MGVS3+Ob?$pC%AG>el2v|PfPf#)JsHx(Ctgl_0O>zUrPSn=nDj;t;8OUo=NMf=eZW`H&)xh@0RbL zug`wD9%>dDMf!g1Mmbzz7-EO^Yys;ref6{S7=chPEbgzvK3Ygwd;HLVo?}5(#ACVb zWsLd8mLOML?j@oEu`Ybe-Ndygs{ANWu zTYi}_YQ<948Jzmju!q^KwWli0(I_g&4zh3T`JS8oyS-JxRIlxlOkv13y^u$ebFvDyZKo49C5A{;Tr}MGMfceW3vqv{k;$^5ymBa8D>MecFsutjT zA|2ncpoEfZ3}EUt@Ng34X@75@l=LMd z^xZ7gESH4|2|k980z_jCp=#YZA)wxX8X~1diHoFqFvh?^Q;)oZcQ^W-l}yf5-ITM^aKZ zdfcjKlYl-&+8kEemP6lOR$P)7OO`b%yP(T25cq|hroP0p;{1@NydW2?&Uu!(^E(fD z#^%)iOUjTB^}P|c>sOo(_ivgq!yorSoV_H}q{tDvSL(K+bRbh52yrU?;o;#a1$BI; zG0RiGi1qO#MDdZ{{&bK@3)dmD(0ps&@XAgmQ$@l-h4Gx@t|NQC$u0q^d(ku>t~*n- zd~721PFdAKA^EX@ux5Tar!^~Q?kN4Q#)8B>%mcd&9luSEH|o>s^4tryTublkdEEI{ zKR#&=Y~)FcH*t4`M?g&TY~~}M>#}&vt3FYW)XMt2n{6+LCM@Vc2}fP)OONUg_(3`R zRab{`pOc0H4Vwb&4_9$Hs=7gmE~%pp$%I+QRt~Z=N*)eeji{_PhDB=gEL1PPqQmXj ziAC29F0k*5&JI!cBe@oy3-j>BSk^9W)qi|x9siuq!?B_AiaL9Ia3GgP?P`@aa0sC%Vx~ z4_H;|sIZ_baSi_@V?ArUq-+ig)fyk1eXqmTJP^R3h2&8I=PKcQB=1Si$Yi>2^`ec` zWhT-zHa%mNK+fB?4Hfg(dl$9ssVh57orM0LPj=M|2|5Z33$ZS1MD#ToTy?*a5E<)o zZ^vgVRHt{{s?S|cu9e|pBs<_KW^^?c+z zVk*-fa)Av4H$i8mAsYz;V>N#~@y4qSwKG%ox#ZW_-xaK$Fo)u_7H+~xDQI%!Bh|re zEIa^~TT?%8*jT^u!yxl1>%qYTu)I_Iwf#Cm!)=kQd!PDS6W_)FgT0q+ohn_P|7b-8%kc;m zg1^9mPpG^{HSkKoxNcleZ|3O*V?9Y(hvnWYam7N)*3PotcW%Kd$xrtzn4cx+@DGp{ zFPwjuW6B=Zy)W%}`8}SIrnZJ4SEixC`5nMMSLxD`jCML$)Oa|F+)t9}6J=&fRyZ_^ z*(>evV$1-$K&$Aa2X9j!@6ZDeqAYa1l-8b9FTg}aF(uUeG0nO9eI}>KD(22{Y3iez z8sj(PllCVvngk!res$*`DI4Nz8|c28;b3g=9C+P-zJQd-I3R2Rjn*zpn2l7K`Dk-4 zq4GHFR>DRKlZC)XE(X!Rv+KEpkgX@Ph)0`3j~T?RfLQbFSRt^V`+L0ShrurdA)6#R zbvLEIWqYfi#>&qP=f_x+*)14zkd8ci08%!rf(xnWtQ7*>#*Q3lqkb5ZF8F>;{gl*e(oha^!C7JqB6_d~123dt*fdvJq(?6p*0LOR6U zl~o@(cjQPyT3~|OL^gOFW$f2uVn7?jn#?#D74*G0zSOzzEpH3+v@4X!>%a#ZdTNAo z02SDS+U^x)AN~i#!qbx+7~#+diA%C-494h3`5HW7V|SpXT!d-y6K;E6??0eZ_5aM0iGa7jgD1?z-2)tt(?%)HrV0P2IbUwxg)d%!3 z4(Qq8t4L!w^x)eVTb&7NdkTc^eWb9hI4uNo=4Vx(!X0`ZmUUTkqhL%zXoLtLh)Z5V zt{c8kL1$SYHBbFM)7D;w($|K!o|>Tg+asAc(_eT~?!65~_r`GLc;t~??0R+=C$8+% zSU9dXJbLgR#?h~h;~9v{d|1ty%Q<2)Xi_iT>Z%Bt?C^@A1-{?xP6+qny4pNWax8sr zh$_z;Rh0)xfA?_O?hY?gv-D6ddJNR4@Y&jc|MeC)wpLV5P2%7;{EV$#ZcqAzo!qmx z?ntfHdsSvdZRqSGv5P*ec0FDX*}Bmbt}B=gb58YCcP~YrMboq0D&KRi(a*1$I=D`) z(2;{aX$+9#~ce9s7Dc;AlEy)1ge>u4P`ls#tV!AH}{Mrf3Ev0g>k_on;O1VUFJ zja5^PD~MNp_xa--s%kd#tw&d-JDVyx?UVu)d+29O8LvL)y+8u|%P4{5!jguGKBVVX zp!?(Q-W+--0V4ud;Ga3@%BC&Ar4xVyW%TLQs?ySqbxoXLB9 zegDO|`1jpj(`&Du>guZMs^_U@SzO2wiCx{s6}xlc&#oh~?+TXf7P=r0OSNAfr7?9= z+=L&!eF>@TAe>!T(a=TM0@E)Zl#UnR35M&^|&$%M!ToyO7X*>OO8DdjGdIhHXPX z?svWHw5|YD^yy!Ed6saf6-1ZQANVTlA1J0y8BhWitD!fgc0O*ZogU?W{Bt5=|3G*4 z0jq4((3_~e7hRJuRM`){U|z**Fm`udnq^RoEE9-!$k5NS%TzM(uPX~_hfO9JTpe|K z%R@gT`}pR!(lNGD0G4yAhj zMEi$N{5aLE!7mDWy`(!%x!PN3{hv3%S)|U`OK02zn;mkigLW|8Cqk||nYC#RM3piP z1hL@Q<|b|GXjZHE1wYf7mwb8HTsHNp&aOo8IRTPw{J4rdTvT7LGO=6`h|uC8t^tE^ z2nXn^x%`~8UdLhe>F%x^KudaWuj^CIgH|`GNqTS1huhCeAzR|zcVN*+D^GZvg@t6{ zt%Jlv;t+k^cO{`*Oyu4vy&A6z3MJqkIX9c1AKljGEZooh3;N(+_BT<651L-I+e8z) zJj{Ug6s~`2z968B!3)qy`JqVw0XcMz?Z)C-ni;Puf&MR5s_EUj`9^N zc;)D0ekKK2F19`-g_u62@O@lqzi$?uQmFd1QaNobI;MW=A>yG|U2xA+(&{n4;JspG zJ-vAO_MWK+!A_SoceK(e*pjJyX<)UFz?T`Y9-H}d$jADsFSt4t`-_TXMgbZ8=s-uI zN}uEaz=#(l8|*5;4k$FC@p&!SWuo}TbavOrfL;Xic}AxxdwTfr^OtTM9$#(&gBgL1 zCgRm~-OP9kaZ(%GS-8HpsZuFAHf+g8Ui_asA_>2N z{}WoY+y{;)wte$I9;{JE2LYtY*L*^DeR{mjQxi_YwYJXSbXjlVYbWV!4!n?iElyk& zy^M>mx?ICf@W0anrFqwS(ZZjxm2p{Ct18%;%=`5whuQRB?n4Dp#-@jXfH)`T4>T}@ z(>zL!clT~7L2ehKJ&TDg2W)5kvy+LcyuryarP5q}=lE*g1$Wvc=HHClGs`X=cHYVQ zV}5aV#pFaKx{*62j~+E^{o=!<`%)BcQ1;0AmTT>}S>h0q=-1Jorgo9}7wS1Vyu?Kz`8EX1p_-4{J;lNJ2x?N3deQ?__Q4X`u)~;kVttI`SSwqY})U zf!AS6{dh$TKArl?Vs+3KubJMLAtooil(z? zH&-|YJnm*^mH@3dxDfSU*-TRgaxN1LCP6qu6!CF@J3Oh0=h9*XU1M@+6Ladmu>#JL zivIKXm3}!-e;8OYA`>woR4Cl#xB3fxB-`Hfqdc^pNib+J^$P$`DP<2hsrEp}I zQ_(``<1Ijf%natpKc5HM-Rbhu=J%eJL$8^zKwH{4agt`@cU1m zpuThV^OMMoOu|w6wC==YEgygQfoIad0O`QgblvY9_mqR|jApUcdy(Lkr*{YU$F~Ua zvVw5Wf>5GNfOcC6tG6U_>qy0qoKn(JYXY~@{Ms4=6*zcF8aRn@6ME~GsrJ;*92N6^ zY&>yh34%;EV*Zw;eUAUiZ&wupmR#g{_0^$e6Jn*c<*U&c;U$E65sQ5)%m&SUYzMv% zL@{=a8s{6R;#~Aq!_0ZP+Tc)HXZ5ttQ41tW7Sc)-6RcWb|JVmk8IeRFVEm!eAw1hE z38h>Y8j7T!0u5>#PY-3{)X9)G95$Wv?EN>(`ptIATg601g<1x!fptG-rH!E8_D@^y z1dNbQ@fN$x9!1XHW+PoaRWA7IS^)5E@W13I|A?-6U)7!w%dBI^uO*pI%56K)#`Thv z-ykObUb-b&0wAUMakr6}NE zsL^B24*0tdMdL@1LP5fH`2~=$lzpVC69|=}~RgpfhWupn~ZWk?Y`?*YnkT_6$PAm99BukW^KI)qfJ>l z7gXMiPUofoC9Bro+CW7mC0xY!TbAfh0b1`nTbEap3tQFSf^P~N%gc}L-aK4q7FyV7 z-@5mo0)~jBS5zmee1R-;UOJh> z6|SRB=#IA`W&$$?_C^Vd&&Iv7(>d?yU;US>%S-BE#sGTl9D^{`XhF(sl)+s)nO|&? ze4$V+tST@VS}vAD#eC`K%Zkygf8sG>Pkk)Z^}zOVizMU#CQ8@4t$~e;W)dyD-enef^M{H?8TfvnQ52E(dj(=QWa6&O0Hv@R6& zpj@3*{UYB9a;QNv9v$&h2&FMY3{H@X_2m2D0qm|zED*}8veH-axyoutqwF+`s)m|j zar8t1hZeL@p<%kzlZ}vgS;u%!PwYlakwmV{6rHdH6q~lQx|_r;Y%Ugs)4647*q_6- zwwzIk*Nalst^J^^%Bw8uzG*yzsz3`;;iL@i*opd5c?gEWnV1H?)A63{rHAr_EeJa! zvLVTlcpd~f@!0}a1uC}NP)0oLH_psD)Bjj%z?;CVe~Ob-vUkv+@w|UkHrAF6MB^bW zXERG#+UDPn6}LdfiHN*L4Y63-QVWLf!d<@>3DgG5QHbSQ0JwNPO~03wt&=#W40a`s znR6ty-#LlsAr&j8WQN5p%Z(NJ26hwHL~*DZ#|M_0tKqlLJC0TPJ6p-04~_mvsh2yJ zcF|vIuCXa-`NLj43JP}KqP;}qDCMonly(h@e*0Mh66D5NoA6m#T_!NLI=5w|`!(Ki0SOZ$ zAkviwBa7y?yDKq$8j(Iryu&3z*5dMo_^O$^eVtYvG5y>wBjjSkU=jo>qer@qPsa{4_M z(Xibqwva-z)kVxKEJq4Xr}L8~Cea8ByVGjJxFPv1my_RMIXt})#m?ixGH;vQLnGs& z(%FW1e$SO?YtGfHiyh}F)3FgT*q%X`S4URO%=#xn@3tOVYJ8{~sR?|^irvM{_V*at zT}D$9Hho10>?JS#r@W#HExX0O;Wi%j-mV4;`RymI_fb#wWcsYLnJnWd4+R zQTCq409!kbtSIN$TtcWjf>tL_i%h(cneO6VujA%+V$YUuQNPitngyJsBYmT?m*Ew)fQL(Vb{TWhqd;;-aCMu8Jqy zw2Yd4`Iz-T{h?>b=3Q-OxR>m>!p8lX-+x@r`JYI8mIyx0sOg>cvh<4&)gh4hba2An zmR(mU>;-6VwQc7Xa@K?Gzs5RDL)+B7sH@|A+w)j!YwDZLn}&KJI*N59c#fg7>AE=i zINsqY>+;Z6qnqY*iv1VLEcom0AhDH{^4ovv?*(W=TKE((gi)J1#w**@D^sPqAJ0Z^ z$j~1H?&D{nlhjt!m+STEj0Qt@%!(D8{b_$=V*B5$ zHD`O^3SIt%ifHf~oz})(b3JpS2zs40H@I9~Uii*uhH}v@Y~*(dvxFpw zA+1~<>mw=oBLbi^HIV`mbpE*1zc|AKIGkV{vP6dakoiot8>A z4!wuo%14@qFmIw*7bgnXj!kmRyL%p#H&@EfeAD#S@6H6OJ&LhiV{HA!) zQ8Y`L$Bq9Tg)GEP$gy?S^oPqB1^qt zJMHL~Uk18aQ&>09jAbl$r2d*J!NI)XdVmo{RWDpYz_TPN^D#*p!zvS2^PUf-Z`G5nB9L zSnclzT+*fn7R5oMKo14@r@pE`I ze3}FQ5~U+Xv;woLD?&R1@SMdKn`3N0%}d>SwkoGzP}bmzboU+(ZNONteR?hP#JA9zYRE}5ryhmi9r+hJ}$VsJ66eF~hT_rk;{+D>g#GN`L(iD)H$%URv4H-v_z zS8NRLobH1LD(Vn>O8?W?juDIdbm`_;YC+B)1Uot(VJV@yVyEpYT*ztMXMPbjVW8}s zm5yBhVX3%jNNmB6FX15?X~x&$8R~&CKro?`7e;CJVecI@#=9J?J&k1Q^zj%F84qTP zbPUJI4atIQxEPyO2mpT|-1O;d9>CnVUAH11ws;v8$ccDV}ac2<q3&_&!wTy->U&lk5cVKJxb9R0Iig(AXDxJKGq4N#1xnY{BZl`vUHL;ndgi>@XYSTCgUxaNIFXF0C@0)X7TNicC_GjvQ ztr@xX9n#fJzpT7HS-e#ry?SurQZh;zH%PMWs>_Q+ei|7D16dA89Ot^8%zgP*V-v;V z=UU|U2G|-D8cN~^u(ut)Rh_yuZ}zoAT;cspnTQ{#fT*Eg*#53NQJgvbq0%VMGSDbB zpb12ox#9fUH9M8l()~6kFyoVTD4>7o((h*{n^hL83_%gyHLpBs2$HvORIcz zeCP>s?ytt!8_cs@Kg(fmNgZDKmHV0dwaV7N6|UkBG!>1)20n)#j(JYa%t$>0zji+} za(I*i?l~5PWHk;{KLKT^rnEG~8l^h^YHg=X0+8S;iFhD;M&s5W?zLD*NAI+~f6yf} zKsOhU;09vj)lK8lKuBOASqSsTD7D-#En9kwA@-+-bRERwB3TUftK_4_Gm?`W+rJ!c z8V*JIk;*wSu&`-(aKZz7DE<=O?H%1}`%`rBr zj`aar@#AMRq6?B}^4GFhz(Rlf(G}q@E_-E(N2^4H4!m)stH`W-#k?bK%{74=H4{x? zB6Sf18yibRl+kUyIyX#xSlTo!%M^xGb_^_!6y?X^k$#TFQI(WqH{T2PZMF2=p?MaK z2f!Y}ERcH7vn^|tZDLR;0H-Q^tbyZ?G?7UlIkYr6KLrPnMT&w8A=at-$*^CUQv$la zp*9NVcNaT)Z4*HU@}|f)v~;r1TiNK{CzI(r&Ce|YW^v0?QWB=GA|{?GZx%-c9-R17 zFIQ(Ho+B8)3+Qc6%zd&1h6YkP-6YVeQyuPFU$C)p3rLVssmFk34c79jC=rG=fH_L} z^Y#K1?Mb0x)=!J||1f;^50rWdxXAD`3LnH{VPjo8ZIU;CtkU)`gRuK(SmaFPNsB?h0arwM+5SUmvL&Q%t z85E>Z5&~)b2YQ3}A8^Anl4O#Q@7JY9uv|(8MfPz@rOe0;uCAy?;gwAQjVi0yGES_p z?h;`bIU-*q3wf!=5{2HAS(DdEVOAT5ktuKFsN8)J)Y{zvD( zr(Est_{Q#>jx-F`7Sx_j`{92xv^}bPxiykDTFQ7~dhc4A)ww_DiR`WAxzl>{`o9N( z23n=16>qh~Uek0wAtr-93J#q}{)OT_uu%z*yL|am1DU7rKoo%Cg8&XS^;dh8k40{m zE=(7&Eip3z6LBvq!&2ENm480+ewx!>8(vQr6mXVD_?ehccU1DFeJ7Q2ad{f(;^Fkv z_~G?yb;CeO%B=tU3D!-NNs+Yg+aH!2&dZYQMC~r|yH+W)S$rG*8rtKGb#O3CEpl^1 zSh5~E6-$!GS;vmz1S#jKVxJn_e|1i^#X3hK|2)_+Kg3m46!vITR(~Ad3(8S4wzuY( zA;t(*RNzdUbA{*q60*myOKCfZ zSSAEwT-~zu*X>h2S~ZU{TrIutUC)Y4){tO$t$tCTRF~NRP*E=~Y~GJ|U90UU14#;S zGlsxY?~zzZ-Q~ECZxsCiarmZ3iQd5$o&UJZ{ze1gP*l`P|}5>3^b#oXr3*IAUlL2je^D^~`l@z_vZ0u{S%M$&)aS*Ij! z-hNtY`2m7T{0c%9|7%sFe=RsVD`#s|FqQD7t3d;di(Lj|YHU}Qc*d$<$J=VPXT>6B z3OU;=WJVhDIq*|VAFqnsn}13D!LHm&D&u8PG(5yyF{(^`e(D=p=Oq90U*n3qEJ&2G zpti}lu$a4dBmQsh1T1Hdtcc{D~%)d5FjW%D3q_w1^wDc{5;~1iM3c$bb ziJQs-Loo06jkNuWrh>(DsmpA1L12D+XMxS{ERq)f@ZtAINzybplW5i2;}=KW_=G3* z#>w(6BIiecp~@#>B+daN?Ao??)o#UGYVLxg&$*(b>wsS7=$Wd=@Z7&p@^8}U3e}2I z&g_oikS81WguVK^CTR-3(7l#(1>}LSVCd>55Y_z~W@bYElp0Mq%K~P51c>4+RYI}# zpHXYgig7oHso2kqR5CT>4Vog>TkDZ1;`D_O$+AiB30ftzWGbmUT>wr5G@@Rc3$vp% zwdPLsKfcn3JmVIMPKP(X+q4WaR%_kR*l_QkFEq(l06CN)lu03-g|Ut+8I`MPPiltK zUwhM@^z=`bUARfFT!x4ff^N_3hREaZ#Iedfq2eVISz$jaT$2!k3k*Sw^Pq(Ou-M_EdYrJSmwf?&JJNH!_h z-&nn%za86-q5g$ZFcdR-`E&#G7iw-Pp71@j%fI)|O_)H9>d{R@v1Bk4E3&^lL&z65 z`3F^p>MQ_bmEhhsR+N8LEp|bjUJVh#-Cctu^UNw-{z9>z=PvyT{0n6dp>%6tLBT-7 zKyHLUMngn^hlhsrkbr@O!iK}b!KDO>Nd?+E=P?XvLpD4QvuD;_jeuoU_ zdTp8HsN%CkkDWX31pK(5KTPPoK)qkZ`gd|CNDHIW1XVYb9qXU(_}v9vU!H=*47UB$ z*$cZhOzSf#glqL0HAK2;FZCmX%5-pt!mg?>kr_5M^hu1!>8{L`ol;qZV_Sc_sY|nNi*)U(D*Xv7rj{`V!YA62maFW)Vpu|rqFC}$p5&0|Kpp+-+8Wlgw7 zAQZzc&Ci8mdQQset|dG**wvXDu|ml7hKXO9efs42=9dusiH~G#^M#Gy=eC?4R@ov1 zJ4fKK+_7vJ^)Y9!;xZ1Q*AJQ^e%i3HQ>76`>C+u*zSGf7?4W9w6AiS z{*B=>e%(MRyo{x>>`#_6pxkvxuG8H92y^(dkWbd2AiqI5D9!~#X1t&74A4Q;@x!ag zp(~3(KLdM(*s1MVeb+jg%F1G^u=x|=$zPwK)g zuZVuc^RjBB{duk~!{6{nx4v0l@&8dulgc(YTL!P)2I^c*(#Sy)T}E_xO={>vLE9fo zDS4r6X);W{Vubd45iK6*n)ezQ{>a`P{wico?6@lm<1yl1o3|Ird6>Eiwa>$xDl8fA zjFw0y=?Jh2N4W_EjGemBg!I%smb8Z&vox@8d5*|s339AStKf9EMUadr{cmY}9+3(N zB&YiZ2dLxFALeEIWAE3eLmUBq0k!jVfbnGdUU*0dtk+NxCF>hZYhmMrhX35)&ki5< zRKD=;(}eFDD6zICwOjjo4(3+Z*o*>q=Yy{~=hZp+cPw}Xfbu`v?hL+OCj}}k3%CN^ za&G0;z4*D?xv86kMhJE3+F1A(Y@h56I#S7q>L}JoPw^k#(hfA^eKQp)8ctVr;tQX5n(wuC4>kK@S(aHHUirpOekHpjGJxdjR!jmLzfy*fo- z{YS#~|0H|~_wJGwD7lOeKu`C~?!x~wqfY|UO?@^=h36)OWMaxhtSi22FgnLc9Q@^A zd@C#cd(B!UK~Dqc&Nzx^p`@+1GFUDZtKdv-1(Cld;55%WQWuXVQu81wyEm8a`^$|r z?Ipi{w-@&=Mfk^jBH$!fn64N-@Z8Lik7PGy(9K+WT7BmMe-ehgUTh67LNl(+e8(86 z28`2V&HTG8o{C|uf(1dE(9#qNHaR2FS*?|Wr1p4xkn)3``BsuUh5?#^Ro5J!p)xv~ z64E&ugeoFvk8wDxv0+UE(YQFf|DkZ13t0&&sP%UT?*fV;+c`sJtj(WV4rR7S*OR!} ze4;W@_5(1%`E^C|MShYGaWHW$zgFPjV?ys|zw^u)|mp zzZW@8AK3(#)WH~G<;aq4UyCnJPZjD`|KPIx3zcGfApP~X&2xa+8MM(ojn(Popz(Qh z7LG&zWPViDV}{J>c)!JXK3RV9G|@|#S6)(M^44FdY@Zo?KI^^N>16@>h=gV5YxNKC zt%4U8djc{e>f-tJ=JpK#?4uW9#L)@1iZN!!>c`KH41fNk0y}{qA^&mO_5+Xn-sN;{16^U3|i^_$7(e>3CjR*S7Qh z-mmCR%`tAs|zS#Rkr16}7&uyK*XNwU$%GAwx$C8-|d_cgGnyx0WU(pT3CT!&mTp zWBoGJqLPYmBJ>c^8d`?a<_E??^-Ti@hT)~TYLICauV8jGC#<8)4ii}I{b#p$82XoN z%5mXx5|{dBy}@jMw$WV230l~>3h42FD;|c-XS_dbGEtfX$+wxY21XHsb5V68*q&geyI&{ zy*^xJUJ9U{Q$06$n$w_}=ecFqIxIwAw2+E_F(m=sH< zPMV=Un^53GazGVHYZQPz>+7va$>6C6!_XiuUQee(~nJ_cz!L9acq+1SWfk&Z+1iAR*D_6J*f1! zQPQ7tK(uHUane||)U8SSB$Dfl2s{4q4Hd=-x1B;G@JI4@f-V%60@uF_Q2$0>Qimm zs5YcBp${DH<$NXM=zy(r?kI7@oD~dpszm+>%BXCTSm$U3u4j)`1j1Ua9P_ms^?zzAxdspPHo>g%$ZYb`dF-ZNrrx^6Mt4KiV>?b0pL)nYE~_ zP$NYeGJGE%|B*; z360 z=oF>sY+arM$80X*tGzsw7EB*>n+4SniQp>A$lxp75~+-xSL~p^JiDx2V-V3xY@;$O z%NdIb#SY#8v#?`ld6Tg{OmAq?i@GwZP~S=LWiP-DO2 zfPQfik0+e)UhF2jS_}+b2F1xi5y*zbJ#vULGVD8G8!5#cpJ{*>FEGjEQ~`dQ zcOU0y^v1QfPn5adbKorrTEV`n1jZ+_CsbJ?7Kr{!{MaVr<5I+;lH8( zlWWm?@-3xS25%g{URt*s)5O45P+KHTQmBiS5l41G*l2XM69dicDjS8R&7MI?rhX$| z9OeEVX^1FAvg=?cGlm5GH&pt&yd*=Av8$S^(AY%ltYRug)@W2>D^WA(SW;|dj#Bb* zPY9}ZL!MjVzPnal92|C{3IUIgvC$FM07?EV&8XVOsA2{>=keTXV!WOswB5r0g)(
sH`pxVp$E*LSx0bY$^ho1gZ(Ce+BX zgV-v@;O*LCgouh%LTJjh>6fNe1i)!k?_(K>@#hAJi=BY zGE;k|p=-ghx5_WRZ|zIf2wi`nNO=!AA^h@IFVd>=cc9tAO;Z$>jb7>?tb6ny`W{KE z@4c#}i7OkeEN~Kt%gx{BlP5$=yT6^}6F42x4XRhqN%6t?;^?rmV5dyeoKLqcsOHK2 zbb#$ru$;PP7F>-8@AY=H`&w$0QopRgaXn7;V8}$bm*lMCBkc85YEVhMoV!yFW|9fq zOOmzYH%4z?uXN91iF#K}mflTpD~cK^sdvEd|BV->>NLNJv8A%AlG31C6zsX}U(Y-$ zZwF~!_}FM_&U^rCK^~wXBnkagUjoVFg9|^`O?Sx!Zea>pf;c8<%({Q|nH^JacOn1z zeADz)ALFn#kY)z$^0QBF!@D0pPDEp@pW1(>)BE4M#(XVf)^jdx86Y`CCpVU>tB zuWv)APNSav7T`?DGY-4Nv|7{Snoz5!!&0eVGg@vN53J3Ee_3g#hG{28yjf!D{fT1E zpg%UfmE;4?O=&gw@ZDbf3Hai_OYc~H3~3&%p!09Y^Dod7$$qC>#(szjxJE8nhoW^b zyHTy4i$#2Ft$oO_M0HjPEsBbN7v4b>>76ZMU^64jzyQgDIvRU(8vw zWPJAM{3hPn^}8Sq7x3jCh>#A0#0LkcK;;6~LD|#%`NK@4|3rICT1gYuQz2?o{Y!3t{~rZg8TZEN4}C z0NFhS4PVz}Y>K%r9px4qj2)fe-bF0^YHjv9n(WTJK5}pczXS&VM!l-6Fb>;jtTbAc zK>wvDj2JFDuA*@Qh}BhoWY_h{4$zT9GX>R%Nz*M!2arbiK*p^`yCvbGMUsmhg)T~` zogo2NWbfPXr~}*^P`(nPi=GphNo*`lsV|mWNcALV zT9G=LCo(Lc$(c{p)vLpUgeC#3E!-5SI2<4q|L5aG>&KDQ6FuD;dD&Is2 zkhb{2IeyUMrXlL3Ba;z9Ch9BN|Oh{&lpP3T)V)to~umT2O}(UETHGV#M=KbH!v$e0++(+CsN zSl4jZIVZ1@nNopF65IvlxKhF>5$T-|oFbj-96=Jh9ctiE1@X35d7DPBaSD)+;H0*g6&q6ycF7_o7Ecw|X6Ib0dkC_CeD&2k z4?8=&aA-}O)<}TCveL}yP3kxGgUUoI;yiH&aiWuC5M_T*)_gbr}=-st| zZJZ9OO_)~7+%}NDF!kg;Xf>^I7$qw`T-gJy4AHH+g(f9~Yxw(2pl-SRg!wfr8=mMO zCV?;L;%ft?iQ)j@x|yb=-9tNF>u8~|kQNpK7`dl5y417E$Ynes8{9URCTU895-IJ5 zXfeN$gmepw!q10Mxeweej^snobY3zU8wjP`Z4wJ<@b@jSL5`$!bslp5J**O@Yq>%d z_0hQbLdi?M!t9H9mHsEW9WxV>jiGKMeQ!=g11Yf_90%3xV6v_G>rUWzaJ=|>#w6Gt z!7>DF1j_a~&rQ84Qn+njH9Y0@^rEgU;RTPsTLbVLq$5sDYi4iv7pfSYk zd_X9gsDx|AO^DW24B~@?;DVWf=pZLF6g$J!A2^X~-$QzCY`9=kG+Yy0qnw*_=_~EN zmvYy&A-eT751Sl#79(PY&mVc)jF^}V$sWk(4;x?qGTBP>v}D_%V|3P5Q`KS5v8b{c=sf7;8 zFqg%9AX3{CQ8=vcoli2JJISLN>1js61v%7CNzMThI}#;JFoE~YZVWlH2&RkFfePwL zBC^c9cfypX9rvfb?57aJ6EZ_D5mra$NvyCy!xp?Lb-5yfL}CO8w=pD8^(npBqbtWe z0xUCvv>QNXDu@&m73$6t98wT%g8dU~(ucaHlfk$P7=<%SWg&vjyO`+Hl9|^Z7$A zOeO(-ugx8&LSF<0ZU{UYi$(r=E)z>S{3BcrF%?<<@A04krSP9aY&X{NJ*GFAU~Q`F zNp2ioI&(wWsc32Nd<&ggwXsqM(GTlAYEbad$|0uUnUksjzg3*x5Yc&Xb8vjKnM?>! zeF#^==usY-oz_FiVY|77gsk8r|G95&P2beFjv@L;uh@|)xJzj4aebFyE>LydpS;AD7Kmxcxl$Oc>#b9|?L=2Rh2C6xE zG!vK>JSXB`qb3?siIObloPr!}Ofs{EC#G+aQ~>t#!QGX!-OA zf#wb~D}+LF_GHM{J#CA8gfsC=llm~MJPCZ*5_RI6@5?mIa_Wiw4B5Dv}6#;FrRVu8jR zQ|+?GOQ9jvK@6*Cv+GW&!C8o4Q56s=%jKop=|6|B&CB5mKC>W1A3vz>k1ILtRO+cr;txw^|Xo7o4;1vI6I zA&x~YuD~?WRJ`lK*kG?PX+sv)HOUaUsmtw& z{ctGOOL3U4rz&j>uVP`l3tM8SEILA*^pL?ZaA@R_k_V?32mH)j0@U@J+?Gx!(Wd^w zI{)2K(vy=Us;57#LIjbWB|e)O+E#;H%DNrEe{_@$K&(}{)-vmwp^>XD?2CyX6{Lhy za!(R2Q$+KF-6fUr?s({!w4@$2Dggwpg`!?@Us5R)ic z08>>Z7#koZArTNXuS$mrlK>S+4a8m-{t3dHnKQk{ovDKfN3}$BhGK7s_R6T|S7ZMR z#d>?Gs$3g5+|N0|MJDBs7#%NfIJ8Lr?{*!TV+aK(mQIFwGKUd}%}YnaYZcDHmUls; zS#KH5QZE}E@72DIWZ zPDrZtVaRC?ff+sIP+_6#|j?V(2=p@p+rvTQt+G`62yXR5@5@B(b$-7-lj3+#&Deo1XCzPC>y*N3}&uX0<*I5PeO-4)iJc@c~< zx)tZNom4Dw^Nm(2y^EI>Gu^J&4&|cOwGd=fnl$LGy!#_PD3YeTk~BID%?Yi2hm{%b z2i4A&VXyz|$~)|>Ep7~d{0=UXUY-KDajD~JQ-3~tbfC}oRS+rn^3#ZiGBl2>aXSy3 z=kE{c+u4kIqR2Y}4Sj#O;urUZsUhW=y&vVEt*0_`OwyDc*JT?t%Au`m4bn+-N)kSv zK91 {ReJKDzsq0S-SERkON=-c09|2#}%+_b0t3Ya`yJPygodggISBkbAcyLjE*Yb3t~UOjgkC_x9x z0%ciuS;!aTIaZoh3#Ky z{Mn*dN(JR&aE6UjX}(iKdiHtp)?Dn+DT-#nTL!|b0~qQwX}hrXNf8(CFUUz3Ck@ZO zJr(~a$g9DPz8~o<709L)cO9H&>>POetiuW*8k;I$=Ny)+Qs(gZi0C>6uk}eX-yo2u z_Q?nPbZb&5ZAQ%xm3P5`a##*2TCphkfJs_WqJZj*G(~2M8EXJEwmy^-`Ohh+P)o8d z32-I3#1_iA1go*xr0xoVszj#v7K+l0sS|8GX(C^BPqg!rz>xH+2_DDrF2nbthIsV< zH#H9BPA2g(B$J;T3)c(AivPyJfRi z+O=6D@RCc02uj|UQPXi!$ED@sxGcSV0|n% zESt|!TTYS4n&=IT7>A!CxHRwu+mfH3gAvO8qtFqES*XOFv7wd=(p#vB_9p|lJGH#< zpqSTvztq@Vj38pJ1E@?*IZalBhiY7qD8lr9he#B2TuHSjNRe7gSNXyK0PN+vgGpJs zkbLPNQfDEW2OTT{tZkrJ@nZ(^`bK0RxEf-n_Qzz3q-$Mdh=Fz>d(I~bjhXwkwAbE#ajxzb1>IY4l z^bvM+z;j4T3J$DIIy7VdwwZsMK|r*zVIa~_TNNHxo0tP0S2=I_2a(-eij8|P=HCyvL?}NiRhz4V3H4+rb))2ccB9ciWLS?WQN^W zPT(mTz8B~sAx80&B>sLON)#-(m#)9@TmbJyu#(!n`HrE>x_o5LGmLwS=iWUCJ z$va2Lku;fU^K=pV9ZU+GEgLg3-USwpMBrAY=I;WH;6Yi0ua;BiM1;*Za$JT2 zc${@R6iaXXO$zt4A$&3Y+u%vBVd)u=eplj0mn}wMdkiGxc9f9m>u^Lp+UW{zO)C4HEw?2#b*6zx8Zr=L62x~jL8Fw9ewU#DT6 z2*_z8*r)u>2`PabRe88wRb&m|lG7)<>6lSQFjIkaL9Q23Uzt>(=JC^`hy_&9mX3S3g ze17Fpzc(+phd*xqX+PyJRJCh^kJjAyxsC#TvjI!a!vE8&T6n(QgS`~w2z%4=KOB=O zOc^0f#tPmk7=p}tBKZ9L2|iK0{8##~GllmA*&iR^$fziT2@EISxQ zGLAN1)CgHfd88>D^ZAr(@ERBCxbY(--zfXMfN5Buyr+Gu)4y(Soad?6Z8R#)^yd-d1Gau#{Ee~Msa8J!f(4)&Iuag*7dFBY{{PO+n0{8c6LZW zXc0MwtoFq-a*0id_%Bpyoo9GGkr%%MVY0J2^%QkbqN@4u?s?hn+AH`F13?4^#A;Mb>1;*iQ3? zWVEXstG~!WJRHWQDK;f|Fk)?ICjzhBxTBHAdvK6uhENYbMuF6@1MTCxZvsw3zrQ$J zOz5FIQ%d)e#61y$oe{ac&>Lpoui@i13&d%*oI~2`;BF^@9lE)TaSd!h)6Zmvnvkzv0aQ!JPe2 zQYfgY&U8F5gc)97Dyo>h3{uNTN;HUU=Ks(RQ>BZpSyX6Z0_y8r-Rw;uq9K7`?XU-A zN&TrP0B4W#eMpL3Z2WUCwyS)=%^hu6L{T=aXqbHpi8DML_%mjFVMj_&iaJhG)D@fl zqo#;3tB55bT78Boy=Cx(j zo3jc`p8rPKTR_F}E&ZZ{Cb+u>cOTr{-Q8_)Cj@tQm*DR1?(QDkEl7Ys2)UF0Ip25B zefPa@t+!Us(0g{%T~)hk_m-+(&9K%l1z=o53Xca5dU8UBr(u%i*&Tki4>N}JEuo5N zC)XxjPCN}pufXoP=W3PQ&0n}ZgqpJ4D34aE8(!8Psn%03 z=)^oHDl?{M#*$Lz#s)xnQ-!BRVF|X9F5H(Wt6i$v1kg=7eB>LzqO~iUP2*|&}=PoYMg6(K!GRgs+J#QqOoi;Sa7Q;5Co|fI_S}ucxvP=_qicnw#6kW@3 zkp{zDnL_T3_or*9ODt z)x^)|EDIxq5q1-Ul-hD}%ES%rB~f;2FMx;d_CZAv8I*Y@WU_m9Dcb7ng$K)r#ymf* zI8#4L@%SVu%SJZZ$>31FO?neEFnH-NaEu^j-s}fO4J+jH`q<>B1PPl4Kq8r%B>A1f zai{)={(nNQCWh?fO zr|<&7Sx$3Wb%jBIFqi^ko)!m~=5g}@VHJg6q+EkZR;06zVq92iQDQG;7oLS`b)TU+ zjjnfkmIptt)LjYP98~MrQP7jbywS>2e#pU%vVb`Vhqa7F$uWQ{KUD7{wr-WD&nQ$F zt}XSKsR(mZ5eL|Po0c=OSA>fkZ-VU7sDhnDi@(`5{-Im%U?#DxZ)*u;oMs&{9+66s zgHqF{XSq!cPg*Tsk_)GHxiYVXdpoJWu}rM-;SXRc=uT+C!&kRxqT#Kj^F)>I%8)7d zm8@U)gs%V*7_@Awv5**8Z!o;HHo3wF(93^F|Aa#vKs$jZMHI{eyG9W#JK0#=%Fr>| zAH=8=rpo0h{az8703Fi#bn>9fYGeaU<4fo z+M?-Xb7oo)%YES`ZN)L{Tu;J3dSb%=pKiO;V}AGG-o@yjK0CO>F;WCEj6IK1yzXEI zml$D+C()I-XLI!PknLXM?%a}~uhEC1ho7=qowQGOuH~KxD4Bl%GmJhZ*#4PduTy0% zXqsBIxQn=+Nh4kQ?JKP+V6kE6n8^;F@FtWaVUcwm*%w+!qq|{if{&K$LwJJbS+PoF z!_Eh+nDa);R&W;PQ#a3U0zO)RKLA1Rxf)IcvD4d-THHSXEAh1&Y@u4Z`90p_qHTTu za@%Jyq)S-CLs`~|1+S#2n_gr)W~xNkRC**K$ncrLSiIMD3^lPKR$or?p@w4-i#kuA z0-qn(hNsk<_f<;43*MXVwP;)$^MdY9UmSHc<2!!4thEy@KB5?2m;elX|rt;kR12=94?mIjUMAP zOg4QW=h2+RjQ$pJSf*D6<$ltKTb76jX+5MJxX*U#JdX|V+!plLGTfKBJec|xGeaJm zXqsrJ{<5c>dORc-3U3+EyV8^jLq{9(AV@Z-^UVViH33u0HA%YOPO`$84ROdpT=z!W zt05xj%Bikeh{LjBGBR!m%91CY=FE?6RS*M~8Y5;}G*PhZBRR9dXsYwi%r@AF9g0(C zgNf0!9HjYKcDaSf{NeqaRGk7J^fs(-{#Qw|50N>=otYS0HDr&g2%J9Fnx?m9mjEr; zKyr+bcob-gDo4?X&JokwI(!rAA?O(Pc!sP|`G)+1L$mQBof3flz4^@q@+_xB6y$7J zl2$qbC-$hc>r(+3V|10+fG_ikGS47r9}YsZUWSSUQt7z~y!Mu!h~2FH-d-gUaGBOK zI`%oO&W&ZK-eOq%b^>pGf^^2@9JVX`o7~_PkTvusM)J{F)wEraBlmXbRfhT0{AK`I z-!2**CYNAtON9@tv@B{AJSWHS9ePnilhnQfAxrWQkl-gum=t=kK*z66Q7(M*M%8jH z%R*ElJFvGBOsN*vCDg>qDE(}>7u*qQrZUPTnIcC%7|<0PK)2SJp`_dLJN);y#t^|u zn|Gu~8uqt+g47@QA(kT)n$%oQpCZa3&w(9@Fh9f*Zum4O{w% z;;7-1J8)V@84Inu%($l(UhDej9k?!_lhP@$G`@Td_Va%I(+Iy}QBJffXT2wy99+UF zsz?JMP&=Ve?2bakv0D}0G>HXHdGrX?IziVP%^jjceWy?q!8+A7=L!%&A56SrHM9&0 zl3UT|L%D=uV~dwAUk_7j#sU_wp$}tGO1G21#|`R)$H@@ z;lO?X1(A?oKhb=ZO*%DCc{BqE0StHo(^#{hl7om5=q?{KL$N@8tL)Lb(_9Wc-<)Fob6JDKd z?^EL=JS+VT<4mX`c*h%urcs`z^N(bBxMC>9Qp%)pG^WZCQJn$Gobde&gTx;wY@C60 zxy4dHTjI6Fx7nn31_`#fBqQ&t@WRqj$Ui|0%9gf`%O~Zt?>`lsxr{5u$dQ%0 zx1OA$`6v(cXKa9X*VjYZeBL#!qXUqmku zPL#k85!YCT3@nFG8(o+}j3Oe!)vkg9a|(_>ASf>HHA%qGeq+e6xm#-gA{i%Qin8f*G*!VAOR`Bly{6&{#s?qMH^)GH&P^Du_aFb$f5S1zN$R@JJ8ro9m6k=!1e8=?Jg>Qqy_%Hf7s3;6)Dh z=Qb#9p9=7+0>>h7E)VU7Sb?km!>dB}uU7>pQ3B!O<`nI{$lqyY*jQW0AAsS2)@uAu z{2|2&Shva(_j+DcoRI@4Dr`6lTzAt_yA^85k4QBYhe#9%RJjScBa=0bQg2AYPnMjF zvMlgDl-Z)(RQW3hLEE?c#(#DlS+FU+&J`lahDpLk3sg91pb|7j-Ne61SD>;zka&Zq zm$v3K1|I9z4d3)!hX}vd7RmoS;xmw(_m-M8krZ_bxBLtNa{WH}MSHZ(!9=bhpgaDw zZRjpU*69sONb0@3uE<}oH}>uImFwa1Y#txVKJWa&^hpKmI#~tsi_D zOKpL;&rA^S`xVZa5T*$`j8-27IWSwC{>mv=8$aDz^+iCMcK;;wxFvRmIiA4QXCQpDaY}!G^hp-#`q#Y5y;gC0FC_f=u zlPn$-v%BA6wgS#Y2-y67_lr%x6CKCs3G`8*U6SinzZE+l^Vtj0T1FAvfXZwFUi}txH8QiGXsoL-_^E$5FG~n??LUN{{}|KN#6T zO+__B%BLbZ@}j&~MUN1Kd?>!1zk27d@zYC?u*~>~&@ybPCm!!PiT`8Zs`t-OqF|S} zPx5w^g-2P~tYXblliPiCvm0df(DyYi$pl)sS(chRv;q1Ck-k;B8M3#zti;f~jt z@@PD8xb+{v1wA+dixUkTfdvHt4F?Ge1%LtvVEq$;1r37+4#8rB#UlO0!paU*#u3KE zCgTthB^NWMbV~SF22Dr^h>zfr>s1&vkqHy$%x>jf^LmaM60%egD_e7#VoVG;W8>|* zqiw^whg&)!eDpfl*{yzO#Z0HV>0qQo{T%cinKJdU=Z#F8I+Qw0J5PI)mLj%q-wAw) z0rOG)MsPQX?`Nyk{=WI?VuM#E8=^rnT&%=mBQEsEMP0ifI3^3}qP9U@@uFx!>`4v2 zbk4=i$pslPBuimnVr$&$o)nQ(REzbYSwd^vrn>gU7A|~v&bqEmiNSgXgx8badJxp4 zJ>!qXT6;t>Z`)1G6ds$JBI%7#5%h_k9tyNdR(PNVR=+ITy}emX!p62U795 zM66??@Z~c%n6cXQdu=>pRaFlw+_FZM-5wHPhGs{T18d{IPr2m74(d>;UsPcoj_U?cPs;H^i8*FRcAKrB1=Uz#>Xj* zoE(BG&mvzdtx(;Yy+W|`{QpXC=&$sKNp7X-?lJh0qbA2?>)UhHX&9#6EfSYfPtt^; z79q<6b|3yjh+Kb#*l1RD-Y9gfH0c4)CsGKk`S33Z8vK=DSNql{13ID72~d%lyfbhS zdkO#0N-8e>NTr$#ycJkfq(*dJA`p74JNHCv!B@AeN9T?4O1xThWrz=azZe7%9z1^+EGo-qn^-d{$SNrTJGuuUZYME7aa@9;)JZ(<-1kAAi(jg2Gdgddm^&z(CX{{~L;7TC5IT19E;a6pj8J&|USY-=JzA-sECEIeCcdN_h;b+eZ~E4ptm^Vx|NsjPoFyW&HlS?N8+@HZpooFP1F zSl-}w2~w0Qt}krV;p>i@{l(G|5{tchgxZgmFezdht2+50eJ^14J#W}9?J_$%k=_8)k+nyVRQew~Q&F=icqwTq=X%B7kK5{?s1Y7k=~TKKIkJD%+-t#g4G^&5uqr@*q9@>Y<|sHe zz8^pA*S2)fXy|mL9M%5{9PWG4S0~TnBk;;J@Y6jsR9#wlK3aJDeSP^3R47-#Yo_j{%W?rwh`H-ZYVeaZJK(nwekV{igcgP!FswRKQ!1v zu*QPYPVEK~Rjc!94OTW6Sl0Vtix$DFY^oo1K(ZpLcv#6pE!OS%Y*S2{D1984^1Wc5 z{JUCjxUk~Gr)zjjB#aWM8mJu!&~6Pze*U-LS8kYum%Dq0{qxgfgDt%J{eA~V2bsdM z)Y>D^1Sz=}gN0DN>B}7XIJ}_*ubNrX9AM8gwmNTC6n2>cQ|Wn`?IQ2lVjI#ccuf8? z@3myDr+mK0f@zS_ioyvDXBHB{>uO;0QvZZL)pvjwX)0+%G5Tnn;HJ^R*Mzm#5oFo; ziAv@Z@cnbH#a1|cRgA7HloCqt0km2^x@c!2-=(OvScj$eaSlC4Dq2@PfNkHO$(C3 z5fZwdh~mfj1MZ(8Zyl8{#+Aq|%#1WJ zTDtR~8f$tHT@>DV@6})fkeg&ie&P`d^_zdwDY@L>Lq_UtZO?-)MF|(;N7t*7i)U86Jb` zTv~#r&8?=^C8($LL1WoQ2m*fgj3FvNi3p#k9jA_Jl0D=28CvY8Zl%IJ^mhm1G_o9L+b`ZO zsREn&1mSuihjP4mm(HL5}(0?X$mJ5kX8u{`_JrecCzqt`C(I_KsMi=Lm_T)p#l z@74-{Gm!m%{z$&XF%#AWtSd3|IZLpy$54Vuh=9VK%ojE{g<-Xq*jF;?pw<& zZZdE4%WVzq?X6=9udCyRjxf%|)3cCFGHS=N#~<&#U)Ppi6S-Y@HHq-`OOhy4yK0`1 zm6{3sbHk_YGHmmgTHJ;{aUOwkx6AkTGXZ&^95*9VLyrD!b3+1vMye+Q{og2Fd!DeD(O@ z#GMAiLz^bdVqMU^w-moue{+t$XpPoCtO!aqxe_LeP&jXIO@R0lCffc{Vl>=Io)*( z(P^-Lj8J8L>m46P?LK*cXwaeS&_Vq@udb{1e>{p}yWT14`y?n`a21oyDPa0&-NOFs zQ*`F%y$(C(=HLVU$?k3n0$m0S^&1Xe)RP+d0{~A;h0wtBP)Hb9L>MUOe`cis2mmA$ z8Y&nSLf=m7gYJljwf5 zhXXsg2_7$JR1ZPn|G!@AowaipoK|iZUM<0g zjesU`D(WF(hOwD9jsl;?Od?JfGQ@aO84;L}Wxhaa)jR{oS9llrQ429V6qEz_E?U|Q z(N6nC3ogk4UgAih7E8$#3yrMChJ3&n$C75*alzK7YL^*MgN1Y~;mnPpqR9;R1bIs+Y5cWOst;kSP>7p`vlaQ~{h=U6SwboDT z9Ha0wE&jR!4{#?i6)O5$1Xb6RJBYIy@@fP>RyXgm`3a%K`bId2iH<%18(^NJ_~V`n z^Io`ce!l)+Pl;|atA6?yYb5xq%t8`hw0t3Zt}%_^2BU-DQw*PpB@vo1ZMn``1lFb@ zh?ZG+(4B3b^5s(w6e05q0;~s2Y1iwuW05vsVw7zCr0pF8l3q;G{fge`3p)(ZnhlVa z4c8W`y>XeQRmyh@m!BoY@j~|2c9yOc;%ne15(*x;;aB#sf`-)^j2rL?8WC{wmXXcb zh~F<^uvuV{kKJ^B2Gjufeq=6~nS{L;y)ma2|Ag@-A6D7qe#T#$eQFynPwbZ3K-V2h zpl&e63L}}%uLUqFeKwSHmu=|BiquxXv(U6&L4b+SRtp-ob{MCru^M7(Hf=W(^WaDV zrxbK<8MEbI5_P2Rg&es3P7iH3xWwD4GvLPPflEczZufHAmdxbgi z+B2{qv_Fy`DZLbRREKYdgniZ-C4A1ch zU1-#JBel800)sTv7%#R!jz&xKBVv#=(eC`~vF_?x&zD&k!$qw8pu!i~=wmwOl=5EH zB5&E)|9uMnl`Exus2lBZi8CxIPo%Gc*rcKis?FD%ci>Ca+E)GTHhXb=RJX`#fG9+)YDz z!=}8$C0#~XWK1rIO{0t|0*xw6ikeT#J{XwEzlsjH$lBC*HI(^K39@ne`^a=)oiZ@edc`tiBOeM3p#bohJrt9Gr#uNH&dF~6A5IC*KH%{hEw)7uy~+GHtg zVrRNfd`wElk?XH#ZoP*9z?`RbzBQPKrkjE{D!iEoU_JEnm80WKqE3 zhsMPw{D{6N5XM9+#S#98YwK~Bfa9=(;=5)K_7QShYYui}|3ZVJHGV{2`ClPsdC1{Y z$(Mrp1+PD$iu(|xh)3JLpVPQlZ^9pPiGf}Q(ZW**POxh^e+W^I?t~w;Z_U4@6MQB~ zB0Xx4j7Chzju8gPf1n`D2cf6ycfhz{Ed=K4R?`pf^9If&_1h0 zQ~e~eGB}rTElFg?*0Rf_q@StzYQ|P&K-{j~8+~$|tYeF;y=?7G3-k34AnM?&(Vf29 z~%e(~sow#P{}S4R?r z$V3=)|KtanXDljM@WgN|I#z@H6Dl@F$VJv^Z{JHbU%$SiT7b|GKe^Z*lnLjyf)^$* ze-t7U&KTHug(5QqKP$4i*pmOX%N1#;GaKZ_&tJTK6EA4=9n+B z#Pbey+X&?jD?_*!?=N%L(XeL`-IeedE&Mm-0Ja?Y&>)au^p5nR<*0&Ns3L(zhr`^+ zPY0(o^)d>c8UEPM1jz}2iN((aL)ZNQhzn2DnR5jW!7wJweJOZ4deN$ldvd% z84!7Z`7n+7|9Xl8?K%r_MWTv>b2Q{A5yT+WdGH6IN%D({`O)MLpz+^@kLzYQ;wG=? z1qwIk{0R}RH~sz*egE1~fPjVsK*4-~hWOXm4H^vU1_OXaMFXN^V6w1dVUx0P2rGYL zr4xUd(LF%mnW_6V06rl^(I|BHM8M9ON(0OZZ zw%h#dp6cK{J$)(NWi#{M7N0I1oyHz>J1HlM46(omdCTc9-wpTd(i09$ zNOs2*5`iyG#7!wdO*p`&6tyk*!*|b&8#$N;G;E^9BCb2a)^P|Zq9IinDYui5{T^?0WGBxO>`Em}0X3DYC7tC1IYFYle z(6nq@19>^_ggU6YM|Gb>zwRaS3@FXXK(Y@PSE+|jx9x_Kada}vYfEs@Q zDm61%eplGyUpx17&*bsS74i}E_4a4nLW5?hjv6^>iW3*d&&`vh=9kz;j5wZ`l|$jt z>50#F)>>)NwF?tT9{PZaX*aOGCOT!la5^2*mDG`0gq|}BIxLfd*nGoOUL<9c zbv0?g?NhBR1|Au`Yq7)75m1Y3%$fF6N4zUh>1171Vs!WCJ(yZSZzeV?&9WLD|!cQk@3N5yA!LvX8%>3kPsoHU_A z*DSS}>50FBTSe|~tHjQ!u>*~?yEltZq!W+DX$3Ou^tV1q#K_e1@D+|GGacPj#(KhQ zqkit+Ok?>OAQvf+ZjlTwL+`h^w7@gj{t=O*EY& z4mv-!kny!+!z!frdtXyCYaSil4G9SP9?@^{dJ^{>2dHP? zR(SQ=@g74hbAM1;?$LES%Q(P0oA5OQ6*qQz5=cVOKGsigj5$zBpK_4Z*eOVevdg@R zxq3bJ&wy$nhCaX0vqe{H9)DG+->)X4#PUaaUakh$Xx{Gjz;72{VtI2Y)-?62Vd$0Fos^iH{g>KMorU%iiJbaKM!D5Fb3F~A+S9$RsN9hd z+n*pKT=YxW-VtzO*S!pI+Ub>@F1p0(uv)U?1_{9Th5a>zmNokSGK5|N$@*W^Uh@&e z&gR->GpZwx&rsCcn~xamnlCf^Zn_^4yJ)F60!kT#8o)gy6G>V#GJT+owVChlFw5%UlQn@z7Qtnh1|<>2ukCZCE68d@rDn z4MlPfHms%k5G6h@B>Va43NQVhA^k&#+a6h#Dnc?tD)#WB0`)o4%;8$yB%UgL)G3oA zJK3BOvdUxBcGGz)Auuo0XvkOTapf4Z0%-)a#&w=(qz4JM>0ZJGjI1QwQZQazE2v)m zSpp7YmDVg#@L;PvGZou;wbR|_DI>9Jo#Ox{y*mr{EB}J{c#$2e6oE&%k61Jt>rIrT z^n6^vLM9(`yvgVvz+q8vUo#p@`4{10v8bq=1@~<3OpKsxi>5GELJFf^1RN)pJCo|0 z7&`vK7JD6LFd{muIoe@pmgjtGws^>h4Y`^&Flgh+LPN5!ax-DDS|03206aCJGAOg$ z9O9_h_?8W;O+e)3noPc3=bF>0v`COWZChQNj(^HJ<0G+kNlb1|wm2xqZb|#Yz_g9w z)jk}_szB>@mrNt5RbN80k`AV0rJIVsDw=wWgjKQl66oFRIU(t~4+iG=ZC)(MM>jxi z`D(5Jt-|7!X0sRhj~oWPK<*cHYUWcAUyQ{?;v_(+RYMv`x*Jm-Mz96z3R9t^wiXFj z`;9S0o3b~k!!IXMR3sQC+~b*l`>%G`+88r}c>Z&;8>6g#St5Pg-{tN>J6cE3@(eX; zPz;JfO$X9}htog57XSX#(GpRjE_-t8lp7T>>5ijaGbNa9GNf~+@y6MJ*{RCM&rf2S zJ<6M0t+6jw-w;9cFhIIA16_n~?BE)fWmA^8s8AkIrXP3wE1D%H;XZH9>T9Hd@$pdr zC|O{}JI2h+OnVlmxl#HVn?6yuGOnhaYEbfsWei$ngji3LZQ5ZJ^V6sChB?4PDwz}v zqZ;Ug;i{pAkG%PnEdT9zgG|k$9A<=#rp79|cFvP+(JZ%ltILOoa>^h*SuuJFPyV7c zDke=uT{1Ekg|Gs97~2sB)&6HGrYk%K-Zq> znhLf>ODW_T9ddel3HYqWNqXJq3F9?>sEj#tJYvLU0jYw%|zYRUir8~$++-)D8M*WlNiz);jY>+s%E|N z>DZ}y$O8{gTD_+J0AM5}PRC!c#ikM&u5yj%Uq)Rs^@Y84K>@k<#j2fnW~mkas^yv2 zuQ^Y@6@C251p3tSb}Qx_mrvU+*tZ^eu3uxo6%y`R?1?pR!{6PU(OP%+K72R5lKqsmCR{)xUu)dZkXHvg7h;oC#Hpv$sH_hc@lqOZGMc6 z?wacSY9+fia1S`Q0tv=UZHoR1yALsi9_|pW)Rx0;eW3JT5M!p2e4J^$4kV zc08;a^=Oh@rRBl5o_V$~^EyKuB^6p#s*@_VZkc`6BI!snjt86945Re*D--Eus@uLs z+@ZM(l~nRBD<`y(1R3;~yI`AnL0b%ZWb#b|8<|vSlUN=U^4BXmU!c<7z%X z?%CZ`CD}`2mnq^7^|^1Uz=pT#Fq&Sa4jb}bZ&F7Rbl!v_-}f;C_|ej~36RDONSEdc z)63ZEoBaC)p81T+%X34@vxesSP}@c_HMZt@>COGx{<;DuQDxr8Udo?XYH2RNd0yJA zq;(n_zGRh>Uj<1#ERDA`h85#Qrzre5Vyx60a|LRcQ+;%}x3k4Zv8bnSDcwLQ*F(p< zgCX+kxA8%1iT60uXVYud{k9_&Z2SPst&bMd$BS7S2_Di3@rb`lGENP;1x zOB@@;CGU?#d z{T7=viWw{Fn6ySuxW=KgseC)T+xiDUT3EcIG}EZ*)9zXyR%yLgt0h0Y@+p}k#mI7p zPiU-9$ttC9=9*pYUCA>592?8d;Gg#aJdte&WgiFCJ69DI*U3&cz)TW(uYqGvHEbMe z>TySwR`441M!U!twnFKsvECcBu$-NR>?Dq(UrU)M!Or`mT*tFJ|R={uh5Nn6vFj$Rxsm7+sM zeI^BOS8V5cS##dG+*+&7Br%UX-D}R^9V@Hr^T=Lbp{ZX*^eYwfROD+L!S7Nsa_?GJ z?+1Bt$%lIn-ZM=gu-DBJ2d9kaTeW|)4=`EK`e{OKIUa=OD^drVN=#&*4a%#wS&s0W zjYd}20@w?%gOfbfIZNx-lOE;{vylc7Yt0~tfpxzP=LpF zHt5=j0D4$*1YDKi$WOTSkOI{QPAd}TM5hQB}A)j1;A$TyZAS$cbg2xGnV7ftz^5iw zKjH-Hk3J(`$MvL90A71adzZ@)h%ZgxsQcOJYCg1K$plYtF#PT1UYb8CT4eOBh5LDV zp8owhu=s}na2~jp?UG-PmlzmW-X}lw@~fg?bE~{~KiV~}F3NChw(fs!M5>c84@o=Z zuueS$CFe>3i&_SB>}!cJH!akuF+M4!D0y=>nIwn^eA|L0=KDk`WXHfARpZy=Z@7As zdWZOhqP4UZKTzHJ%M|i%JbT-59gd6Ji_j&}FT zFT1|Bb$sTvp=N4&M+49$3WO}b8oc9IYqKJ1$+CvEN%%KkNmop(x;4G3?{p3t*beYM zR&(N3^r!Kq5W9(siz_u5(*F8O1XqCpP@jV1x&Sdhtc?*w5wBS3fz#Za`YXm4yu1%{C;K7E_4JwWAQeduPZDwF62*>o4ULj_eP^q9 zyK?Jh=oxJUM$mO{iB=q{!l4^~ZM|IKVHj>2)spWo=~G}`8qzUsZNT!UY?kfi_9#)g zu18C<2zMOI+P%c`~_RU z>P>%VbIcQvjQ_LxPCL_op_<$FyQ^Jl#S3F@Pd0X4Mjt#`-C0&YI+XU#bKLm*$fwI8 zO?dGn)7=-wS|%lAqlTq?9YzxBq4wFt6;6Iwrnd#tx00We3U-xwrf>MxppWe6--BIP zsd&+{tD+k7&e!g3!HIbFl!*-W4j*tLAQX)C$;J86qM?-~h96Ao&{Zw+Y~;vfjO0Hw z4Vn?Xhy?@Ggr!71(W?^Sple_Up^D-@glY?w4P} zb(<5<)|OVGRM3m~em3<*^Zjfz-6Fu6ZX+>n&+Iu??Cm$)I0b{-)PWb#B>uYPLPEg6 zBSJ%efcP)BTr_lO@D8X71{s@(s+x&&!vZ;ru&A<2U}8aG;{d68(jaC~(LM~jv1vkb zlbG4R*VO*m1yn zNUS(Z?+ZH40x;@vlM?YXtv~)&tTU1|*va`ywlU6%4pg`DV&<&#(|*wo{mEH`4M(W~ zqKu8z!*uGZc`EP06_S9ltD;djxWG9S5N#a1n>=DO(X*{4M&+@S^Fyj~**@|CCXH#@ z;Uwm8e)3f}8DKbzHE(Dlu*5y}zdwLoJLiM3Fr_?@UIqv}b4aS85C_!qMwE?V23>q9 z%Kmiz% zBI#^-ld_G?4{6`$Ijs)=Iz5$nKCem4+vK%KFsg7niRqqZ8bibV3{#%eiWqL2#kV0M zwn?u_Yqm`DEjOCDNo!kq9ij+B*#wuA7sJO$1=DU)LulJtPnXYf4%@EMq3W?2|KdvEj*4U($6&Z7v{_58Y$(b@ z)+l{o$2Wng6ZmVsK~>}u(|;;A;DYquY$pE)oBap~UAeOKOgiHB9;z8$HAOPD@_n|a zf@54viUUSj(HB@XF5Vw6hq9?;ta6>dEpuY=2K0!N$4L&5F$EB4leM3!|MuDKOL+)u zrQQ`{zSa+|<7C?{-?|n(Bqo3Bx*AerBXP)jpcK0Sj%N6)3}t{~crJY(8K=b8r4*Vq zMTCA^rc_na6r-6kFzOfS|MEcGzI<8}`Xyn@0&!zzbbPLLhRFEY-Oa>l(gDd_xjV)| zCxy#iJc5%3ps9eF*9m)Fok?zmZQ3jh&`;LK$=vuHS?lGY#reCiL*Ylxmc{Ruxe`A^ zqv8{S^CPO?a6Nb(Y`?2=1j7HDy%!slb|a1e3sfrDm`hSyvV0x0VFCo(_Ud5jm{Kt-w59*5 zb$tA)=pg4S#r0R~!s}0tC)Vj7RD4C-nL?FRunVjrC%GCUp>4^E->E*;nD6`GXBW)h zCR_=s&El_r{qpY9N4HLD&- z>9G{s7#}1`TnT;4`L@TGd2UE&f55~=pnWluj645w?){Qq=vp7)4w*E2N}{=VJ|dfN&_(5b&gH(HuQ`=r};x=%Hpvku^QPCjsP z9yZA4D`vLGK*Ce%F(l63ob@2^>=LG0yJ!G_XgLOsHOWY+_m9(Kx zadThtSgElE4ez>^mgPOsR(O;Qo9_;z`efN9Qn2VR7h+FQr=ssQH}=+Xr!V6qwx^4I z%*>0fE(8}m9c=HLD_!}&B{y0^6X#m{wN46O!@lHFD#S5sp-QjAV|+oX*1iJPXtO+d zD{@E4Cnpan;k*Y83#4i-HreSa`A4A3)aA8vkhA z9{_qgfn+7QSJy&IdniGY3~&y4@_>!@X?>xI7MdtTtx*xj7gyE6e@k>dHr1OB2>%~K z=w3_oSN?Dh@8QjC(Z<)s5_4-4^Smytgtjah@EqIM{gbwNlGpJ6RsV z7=d*CffvhMaFR9W8j^6R+ss?_(D9W(Yx|*UUfXKeSw^m0v+M?+VA3=F=6o6542*r3! zspTVpk5SNQ)%dCjFNF^Dcz_ygSp8%yS5T> z#_YE$<<6e#kZAmv3a9~c&||DQj~KnuCuqrGRNed}PImnds>RVr&23V8Xwrr#oXQ+} zWhOId^0^9w^$p3t!1fkVt5!?|QfcJP#sVh+VPn%Cw-vB*NGHltx9mszf0^ z`4PE92Kzi8zMeFA6iIR}8C{ker+$3}4bJyRh@-lu978n1=6GmajpfQaNlGEZq)rwU z0A6)^UK#*-l+^N$lj^_tdxe0!vSlR@+A*%)6##~-UY36$C-`5LU1>NJY}+2$daa3J z9!trLWsqv@j3t?2EMbVoIzsj>#A68+VT>`Dq>^Pu4Tdab>&Z?=v`CZe4U)0TGI`NA zy~q3g|Gt0casRuH`@HV!Jns8G&Xb&)Xe8_)t2<+f+(eE9E8TYxBAcD@>C*M#SkMX& zI!HmY8?|fzTrcyGetZe8SASt6a~|S}{V%Z>f%z})W&f&X#8K0W-a&oGZ;GV;0F4$? zxYm;+9i5_RE-B zj&jqfkP zX(b)A#Ga`oyt(VkO7Ot&R4jpEqyg~bmbhn|`4u^zhuQ*ty@ab&=*-C;FS!Z% zP00}ekL^c<-zClw7}6GmMI#NkEX_maIqI)%cMD0MBlki%Th}}bugJ~G#fs0KW*2WH zzF&W0Iy3~q!Y7WYC;h5$5~;fAh7Miqgo6mVM(@4rt-RR;kU5&6U;FRV0_N)R90FEBWm}huS0^1RH!+Ql>)Dd)-k!nz{Y;?mU(Ll;)4vng|hhX?kp*8nw^rGH;-=Q$fz7Eixxn6FY7;?n1! zm$H@(k^hEWjORKKGudEUuQg4RE_`cd4t}@vVkbsc=hpmfsmncRcPFz*EdGT!vvt9E zE?GtDxNenpqnuf3#(ZCM7ncyZG~Wy=lvkdOC8-YD_GM7L+vjB7M_8(NFCdGL5zn0^ z64xST;(HL4;0p_A>WxmOB>xq}@pQ0;qbbH!~>^>dJ{hCjTp0>F9>XOOg#lj0>ED3 zQg6vafv^X(s~S%o`=MZ%JfCx9f;dH`LSXp7pl!wbLPr6CUrh?RJYtcx=#()0Pw5YT z;=qn6cT*{%L}~Kv0N<}oS*1l9X5@1sZ9K0ZrSK%Ly>W}c{;dBaM}I>mv#Etj~Ewh%m_!Gu$?c;G*lAl z5J{~Ru37T3f$LLxXYa7|yFrP1=M2m|LWB#+!QbKi@t~LE) zT$LN_07xkKqJP@Erg4`+@7Mtz{RWgb^=*HFc5IN_i|PmX6=OsL%Q~F?dGabyo0K6f zWbg^Nev9bERIsIIcD1_hNlv&ck(!V2!wl8M$ldw1K zyMH;vvYbH(K&4iD3#u&ESFeY5 z71fX|XPe^lh4z-i#NHdJ6zi00Ewnsf(eo^XsqBo$uy5`gwHfhp-s`Qct-w4pWrKy| z+$CXc^fQ_`S9D5C^JNY^0vC5)U^NSRB&W~Uu7nMJD1)s2$?p}VGjoHYGo5hTsTi15 z>Et!(wkn>i3*SrYX!rHa9@Sn*a7J*$FPew=pzSqsB{tm#L^F*=lvHq^OG_Y&@Y|7M zm@AvWKC0N>vwm;9Bd{hR9^|QiwN2ME51#*cyRCX48itr^MYbiq@% z4=(ktY`;>~lh<4L4M>(EjXNvOgJjnU_Ow^~;Zu(PnwLCg2=hFuEAv*Eo)9TF5%)&8 z)l=H8&gLB`@V>7g{P)P1E4R;-k?^KHnw;5;Lgs3g>Rk#NIcqldK_My5h3%)}*DeDM_3+e-(|7+*K~X1G(iFaCtRA?39O|vA6_50Zd_Fh{38*N_DdmOK zmxU-ebBi`(p9y6AXGNWwMpMF`-+6K#>Otm3kO9Se7@)*Ee;aQAh!h^&^zaQtq*Mst zxk}E)BlFCDxf9j>OzRZ(*Mh|@4~~DrEd7wcc<4oT9FN{X4-y0#;dg}qs!VunMV`J^ zK|kMtfQx7zQ^ZnIZv{~aaS}nl1L(?`vp>7!=DKg0bmTauLxEE*1<=0>7&Euu$j+ND2K8G0TYxmgMx(@$vZ8xZ1?{SGOusNl(auW*Aqp5YVDJ+06E1ch!KR^K@QHMe!ZO+s%u-(u8yt=7~Xu>#Gz zG1hB0!u&;y>+J`bP^S8pmF!(-PP+CDPR6O~ScgYQ;mgFR|K*It14@*i)Um}04*kU2 z8_uzmlYH3@mhEi0By+~)a%bD0<3k9#+l~NX&fy@)1aGl9)KWaxfEzF4LDsZELHBzD zwz`tKL-(roRVBqSCtctt>sesRcKE^84P$=J^r$baw0)wpAylw`A6YmB;nT2TWNt6q`#w zbji@}RbsG|ibh~gY#7({&YjEO#bll;Ak~c4C(u?LX%uTFiUmTb-3}Vx&)z$sTTWLE zz({#C$(7?!nm8>&?F27MXAPwnc0SPE@EqFaxp3WGd2XL1UB1*~Y*L|Xad|~7dV$Vy zbP$z>%hvwU8K=~WPpSF;S6aNQEdjpE9uCU?hE7zqOG9l`8UvMkblzKUH2be^y8jp& zbC771OK}nw)19PaBi-tbjGh$wS@7`7cC0f?gaQ@E#vY0K`GKBBT^l>z`6{-Xat;i` z-hwr^^5L^=@N3$Nr7jJ9y-uOal1a*MD(gUzn!@E~>N?MZHOw!oj7G@~qZOVq@^E@^gVoL`1~+`zrg4GH=q zhUR8rZV6ybF}5Kn|Ijy1xVyqnCbXR|s(F&j6nTT2I&B@6U)Momn zl~40vbNl+;CPGgwrXWGeRz#vo^va=%#z!&v-QX>;r?CzDmF&wICs&t^gjb+HbyAlu zMj$fEW+#&V8gGY(KVE`c>Cwx4@n%%k0e}1*(>b4BUJnY1Zgl-#TGDp0Kkn<2!w5~g zvI66hkuJCqL^qCJr{ynR-v56Ayn?5WKTl%wvo~rR^I$L2G3XIr$!y>eANg-P#SqaU fgzs%Vr*-jYG(YMS<ttdtee# diff --git a/website/static/img/favicon-16x16.png b/website/static/img/favicon-16x16.png deleted file mode 100644 index 178c10711387dbff479e5b5d2fa6966ee4c540b3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 872 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl<6e(pbstU$g(vPY0F z14ES>14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>`T@Ck7(s%#9%Yz)b6 zEUj(~%4`hFZgfv+@}!4j(%Kk>69%8&fnd8=5}8HhV3VAOj~!%Id6uvf0LMZL({z7J5Jn4?O3fA z(dm@fq!`j>n9#2h+U}Uxq#V@r|NsBS>FYRvfhblIG z%v{JRkdTy?FmZ|#)1@^$MnRiSH1GyH_;`i+$(;xaVBy|i+;LJ{bM=YUr&g`Z&d54> zs)&JgOKHj1FHd<(c(3+6abyaLk~*fgYgyVev1wt~xD*&8U0tQ4t*hDH)zigYCp4^{ zy}Nz+^zHrY=kGW3=w4OnkPuMdkr7eRvWzJ}AxQgFOju}`nH5_KXMjSOR~X|H2G$N{ zOUb0I0WqhJ9?Cy&nOiTJ zTUc4xd$I_#u!2j2$>9`c<;@`qr*B+2apcSqnIr6{8$1?x=`p+#7cBYYWI7dS1%s!n KpUXO@geCwPM^2Og diff --git a/website/static/img/favicon-32x32.png b/website/static/img/favicon-32x32.png deleted file mode 100644 index f1efee03ab3cbef83577a5b041c102fb9d599fe9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1533 zcmZ`%dpwj`82(Uchjz8tNl{ZFmeHsPT{ap&cO%BNW*f$kA~Tv{#wFkR$X!?>*DfpD zg?2C%)-|lz&@Rm)^HUl>>qo6?|Gm1Jn#EF=Z|v|ogA&UV76l*2-;#} zO>{;PC*7On&`c~&`W=N0{^kzm5LBL~AokuUZPKir9Uv%N8-n0i2wFiYcnX5p1PGd@ zLXg>Y2*NT7YEB)6AlYOmd$Q#i4~|8^l^B2kX+%eZOW}YM2>|>rgVvFkKeu4u86+*( z5gm7sxY(fHE37zP*| z5W)qven8h1(R4wy$cQ!>*+)hQo`_o@u=4|Ij)=rn@&K(t&C z0}qr3ny&F?{#oiyF<5(8$1};qFB5AI3_X!;_Q1?PvwKi<`$>mAyKv{JSbJ7s@5r0$ zzqVNh=Ni#62F7RB*VpG4K9)6fyGQ-Jha88sgNebpuV)vg=NF5sI!R$Sb~#_M4#_X9 ze75*;xmwWY6L(MBJ<*ACqon5f%)7;Ri%aECgiP<%YWO+sWxUKhluVhu*=%eSZJ!$JZ8Fc+SJGi-PXmn~`*DEO?xvai( zU~y^L)GrfHNo8hKw04gyEw2iMqj*Zn{vT6WS(VRv##UCv5{V@FPQwmTOjKS~*MLYY zUK6iLghNxHsK(eg!t!z%CNayyv&}P>>Q$w}hZD;22tjbBVhU z3idc7=h@(Z7joz{qUVMjJBv660Cf_w`xN342uvsl-W|z#B(op=ulg)!M;8>KusccBM) zmW_j@{KTejs8nzI3-e7i;f%)TO@9a)Tg!r}35qEx-i0v)=4)^-PLF}vqL7x5l61A4{~;w+ zA&q2hA5uwlqt4_Ne2Xp0%Ptxfsify#(@6m!5eP-s$Cgxb$?x zt!nOgiSfR9dj69@N(HCu@!XK3^(c?#&slo-D&lBiVBOMNh2dywKlzDlRyxa+GsQdN z(J?3JqP3A)RB#pxnoi)(s;>WCk0#mm7lzpaCR3!J?me2Qbdsn_Y^tuT%8V(S6|gn6yDX7}v<=ZnWH_twmRL zH8OGPJpnl|@j-qNti4Yt64&$5C)Z+Gda!)GS#&d62pt9J0O0@uPcX(C8j%SH%?O5O zhQ@k?17-xmkrr^_KZ2lO-vB@E{|jt$O?y#+dpOyHM-?TM=rmJ#&?_JtOGn~E3o7ytz75d- diff --git a/website/static/img/favicon.ico b/website/static/img/favicon.ico deleted file mode 100644 index 0145fbfbd5b887d60a9edca52036888a7d3cbd0d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15086 zcmeHOX>?Ro5^l#CJ@aSAIdc>o(20nsFerM|;|!ysqXS})Eri8ELVyHF!X5}DguahO z!j6P}7eqlpQG~DvVMq2o5SAn?VF?KkLK3po)K{-xr#s#0yoLtCIrKS|`}*bGcfVV= zs&3t?YK!F&%cGWh^(@@_S-yS2VtLDAvH1DfzCU5HoaTE^aEt$U{k_F9f**K^pW!Z+ zAST?GPffjX_g7i1k1>6yl$xrPwvFka59kQLBb6!52Xuh3#WTh?n11It2mbz~vZ^uM zUQyAJr22)D>J{Vz>OiVTJ5muopgx^R#SAE6oT-d6l<6_df!javy;&+YrbKlQAT6*C zY0aJ`t!Z`N(5KZ%^940~hP1ZzNc9dT#(aY**oHqs4T;TFA^tkvCQtKtf2*9-q$+7G zo+pL1P%4S%P@CoQkm}c!wC2w-=1Pp+;3?+t*_)&WM;Ec&MDsj~RcI5^Dl^{=>_*GH zR{g_y4YXgBbqHx4-)H0poslFk=zgZ1o{6P&KJp8bc2L6r@@!wO~gZw<` z{CAZ92Tp#f>-(4?{|}u0GJg0szz_Qw{DDXNqx`Fqx&!;FcyCeuReWck*|#ahZzZks zf8FB8xZ^t1qo3pZ(WH=n@-x8U-99m_`Lp!H*l?N`)trX6_&ZrKk2~Ef&EjXQle_+# zZe(4e%=4#d)8g?oHLL**ZCcGVKY{u9Z)+$&=Q;@Y93eq~l+$_vgR)xi@$|t7*v>ohh!(i_#zK?3MjBi=W>+ z_VZWh#O`%eRB+3V0T(&fGHCy=i|MQA02&eST)F%l+N?SyE*e9**;k$V7v9RFl!IGn z`Gj6HrhQ$JOVc`L62HNdQSEBe_oKSnjCw*5li4(&iATfg9zpTk@D z(VWO8v}@%&%Fevt)W4{(fX*lHqg69vXhQHCVkaupF)#6BeIX|!18dSEtvwyt@-yY- zTyw%vkav?#?MZ>$6C25^jM=|}SiwWNJ(zoDF~mkkKgLe9=4?V?|%44`pAuQ3js zze>+T25;j->kC$3E@te;2Xo50kS24S-t$A&F+O)W^q1?~#qaPQ%wrgz>1Ou%n11_d zmgqGz)PNzF&K=uBlS2RH*5>Ma%F`k<2`oG3PwXeilH=z_=0#e{a_h1VKEQAA1n-7D zof7sQZTx1e$c2I7R&I{iDa_S)zHAGf#aza=e}#S=--A*QZKL9%LgN*@Mk8g-o%;C_ zKV<5YDs0nh&^N3bXOni@$2Nl>xMY6JgJ}^T(4N%`oowCu1z+41{Dw}CYWFfN9o>yi z?pe>a>82e!F0y(3p|39MFLJ2s6848V{hQG4Rr6hJQ*ludt(qR=Q~btykNf;p@hj4f z>~P{2aOYgR!h6FKn$LR!@Hwu%G4BxpHE6-$*0Lwx%+5kL`={_$zR1x}6MKs-bMZHB zLw*c>o7nj+T0PrJ=_e05$tiUAdd7L$xuWdetlJ&~cU+rVv}8mu9ovyW`8Tuem~nB7 z_vYlCYw5d@U1(I>mxS-==Qw}4_6EQ7uSS!*y(9Z*#@Q28Qe12wx1^+4e51`vCeqaK z_ucwNShF$z`-kY~>HV9iAV1gM9~ao04{iK`zP7fr`$leY8}`pEe#Q~O)%^q56f^#oBmT>2$7#dDIN=F!xwlKDd$n8an1fmVGhd;vdlDAX;^7_HKdV)~ zP8qx@(*i%v4Qp8EP5WnM-r+J2llakZDEkP&AZzT-7F0M^HSw>-?s||j7mS|X>ji$V z-dpaNZfsz=&-zY&e1qKt9&hKuHcjSFIR4PkZT#VZ zz^^pYLOJ*1E8X%|7H;c#2mT9w*H$OFTEqE4W1DCbX|&q?=JK0M%u4-;6M)S!NhU(J;qYV6=bB{|5-z6OjB zxudXF$iZhYHDs#Fb4ZZ7hoJZL+5yZF_Ovn)hSlq zTmw<0`g9@{@`>(KATQu63Te#yB=0j`lRqK9uEN`pis}izXEWAu-2MgFjSqjX#`lM_ zKBTZ*ah-=1&-#v(g1+4@m2lrorUb?m$n-}8_cdJn*9W zhkw1`fECX&|BN;f-Q zF4eeqV*>}q|BQ1&kcG(Z_hEeI^?e<`63o9H$LIzROm@Hiw!FLf!D5)0e#^m*g0q1XkpyE}uCr&mw+(a_nvB3+c4oS`q zxy1C72Pk1?tW&%YIkNb!^(Fq9aVA+}*~r(OIl7Zp#7AOg$e-Er zDR>{=i#Rc2{Tsd>E%8>p=0UGRK^!w-#$ZZ6ae#9eMVt@dSo-P1v}TTyc&RZrkrBK6 zIj_I{8Jnztf8e8$k2)dwC_PtxDK$xA^jHV<(=k`!b*f9q(WD;SD)D73PTJuedOja> zH!=URIDlbD<0oa#$F{GM^+tYTT7+vJ%=*bwEQ3!;9R2ix&GPJ3j;$MUUT?<7+`xlL zA#c;V`NQc_%28b&IG35i^RvGb^Jk2}J*E4*oHHFqSI(W}^(qz_PTIbbMsvM^$fJq* z%ez>%riM2l4N;5bYj;! z&O3#OO|kQ|g7J}inAxWh?c{ot>??X*19GOvcC4nwBZ4W;9&fKIwJLL?n$g}hi=_4g zs6 zpVu3?dE^0iulh=CYkBoJ;QQ=;{scYP{=+o$c^ePoBVGZ!4;x%z4v61_y#lg{wKe3= zzRrBl?X}18(TDdm_$cM|cf8Nmq8rVn9@AouL^>BP%e;fa!BXhOZY)8QpcWZSw?uq}8-x>@$ z%yp&-5|=@oQZN9=T_lW+SXV?_#4aW=)n`3SQi$WUdRg}c;g5Pl0jxh9gQ}Qb)PL&| z9>`~(nDsn%4ci&`T|SQ{szH4V)qo!4HL(suk4#ZaR3^uh=JD9IFm@tG4Xk=3=AK4l zFeb)EoC0A9KPG#ef`4mP_M-+x2C4AC<18yTn6jOz@eS4G<6NdZTWehBaa@688c|L8 zjGwMG_w!!H@w=XgcKh_-lH8t-s8Ihb=`V5(KhgC)`aReCqLU%$k6P@fCFhO$3fwpR zPF&;6V4Rm+bh%68EG-y*BF+}Cvmdic>MW*l4VA_|7JS9Eb2O>l!FdO@JWgjATYu;! zY9(j(ZX~sRs43gIVh+vXT0i*d@b^#cOO$gHYTn>83x0?G_zu4Tgt{EmAftvEK2Pk& zf0bHO`0zKcXG%R1p3@xrGY?QV03T=f%K386fPV;|40A)xAZmF~3yd?Q@YR?<>pn1{ zHU{Sj)b*i$2>bWcd z#4qdST4Ms7GFSe;@XWF8(kM&o^by}LM?M^%b$8vl;T`v9{kbT=AN1BXv(Bloz+-Hi idZ}*BG9ZWU=|ep>kDR{)sjz@F_7mD$@4z~t@Bab!?d6{U diff --git a/website/static/img/logo.svg b/website/static/img/logo.svg deleted file mode 100644 index 9db6d0d..0000000 --- a/website/static/img/logo.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/website/static/img/stackql-cover.png b/website/static/img/stackql-cover.png deleted file mode 100644 index 872999ade8cefbb87d897c0662d8a9b41c0eae5e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29955 zcmeFZcQ~7G_&%(=)q!eC&7!3>OYPZVv{kD_Y(*7STf_=&joR9(y{VNT_Kc{JXeo-u z9wjAaBKAu1K0e>yd%VZ{|NGZ_eE)FpM0oD|ey;nv&g(qSJCXXjT9+9)7#SECET^IRzl3_BKb<~7)xKKc z=_I1=f~;G1gO9AfXO=pYsvgdAAp5miqkgPPrj7-aIh3_z_0v>mYNy;TUI50%AhlhJ z3qAq-a8vuF=xrr zO}k#Am1!&K9PdPiEQlC3G2$ZHe-6e*3}=p?U?INyoAIE07-Xl2^F@zfgXKVWn5kV1 z`%r>aqv8H`5G$^LJIh*m8d|gwFhQU8>LH(E=n(jR@|hYn-nuXmds(WlqhR; zs$;H5QsOti2eEb)II-f2BC(Bpa^P&OIQY=Clf~<{DPl6}soqiP0bJRxo5$%z_@VUV zz$l6`%|k{~ng3JGW_;+Avu)1!doN}Hai~suv zNs9{VHRp^O*??~cs(}Ci3uOoyI-_w)wBPyK^61ruks6g;!y0S-kpvZ3-pTD zNaA73vPg#=)2N80|G}(NbIha26*7nKOtd7evw!7+y?Lq$n#c|N{!Q9zgSW^-X~#7M zI{LBvd41WG{#e7Q+-5EQ5(GyMon(#~As2NLh8SE3ViXZ4@tx!FK z2yU6Tzp;W+ta!0sJ}<*)^J{TCdShiqC)uL;^`A$`T=fR{#%#jStl>^^?ThNfpeq&2 zjHtYgH$P3aUb9$X_y2A741XmA)&Or^Rk8_Gr0FDdZ@$odXsvYGguy!+c8>k=+#L1W zMU>d7_t7Zx1Q%bB?Md!_kM5=9!V(8jQ4uVAz=8y(mIAKjN83NhVB`NgMd-XZbWXfk zp?O`n^UFelctc%a9Lr4?TD-L^jTf=r)&u!-)kWg9yS>!0%>n8^^<-4t}6h#(4;x~cGRnEfi~ zVI{ig$^cRD;6|){C7gg}e(!UGar=9yLYCcr#u?MZ#$`@eGVk?2ELIv}V^><~XdJ9b z;sdfiBfwtq->O8xit&{BzH{m0(?1-<%?!AbvqeHgFW!#ulEGK1FUdeywOkJ7+KCY+;Y5iHl)<#%2PU`+3a3W&?HZ=Xyk){?EBY~ zw9f>n{J!ELF7MwqST#Uj2;MF67XqI1oa>k9e#JL`+L8Ti3Djb%sGmV<&vor$c>Vi8 z^X$QSOmU{+4pTU-!Db1wB*9*+>uFSWt1Fa%q_Mr<`7( z!As&9uZg$U_}&jz6;qp(XwKn4wcfqoiA!Qc3rYRi9ZqvrPoeK0RIkl~C3c#YjV5zH z(XOfZHRYmN9kO>jA|l}y8Cp40{mBak20KY!80p{rB@~scyZ){C8&+%E-I*LSOIeFh z(5$YX5E{38U=TwYyI8L4Al~%zMU|vDu6;(lSwu&9DQ_c zk_#U9?|+$h7ufpUs{FYxj5)iv~8)ps4eNWnK-BHJ4g&QG3Q`sg8ZpMlLm*F^b&m5f_y=-<7)0> zI(DAz7}9&K?jRrgc^yJPj0=D6?B0}cB%W&I`;-2uy@i~woip2{ zsmkJt9IBLma2Cw$%$YDL8mp8Uo zh2NFqfkL(>ql9r*Y&IHW^b$%+CATeB5~S0*avr6drJ%qa@ZG8%dFgzmqaaRe>u1^@ zlPhd0EZaXhFpCM$4UL|jaI(SdP6MOdqVS39TMa2WTZY?DL=52D?K1(c1QzPQIcG>R z+jxG#L`yxw*myjHdYd)i8D*L|5yHs>M^iGF)!m`f86kr{mb$1=$m3`);%dB>iIY_C zZ~h;OtCJ!_x!A_p?m3exF4sN&A5o0;k(=Ve_L>KyE*%d2MI5AZkh z?<@5l`T+YD+)6^F(M;j9Pv>V2|4oJr-TkO1PKSfy0*0nzQHyf<+?|@_GM#uASLJ0f z7UNE#6}=c+h7@E%^k#oS5%<9Mv)ln`cB?6B$4AbY65UWprFX@|EFL`5(2RZ>d13DN z*#KMW_@JO!L^zpDo2;sey2F79AhTl{&eA95VJhI+I-mTP%x`L@-0+_s=>_y=^yBLS z?>#Ca%+x^A6zt=>5m~mW!)q(Dh4#)QiDVZje_DO8+kjK7R%RsT0pxl@wyW>@fRON% z&@mtxr|o8s_!^-`XCxo4)s3ocN-YwugMyN?g478H;YrzSD0SW z6kwO%dG~bbB6c*`IC*EthPSEet*a%T^nWV)gu`k`U-Q9E6<9q}C3$X=%65NR|13>O zxm9U|Gk>0m7WnW0A53qe6!W-EdL?g>QWK)R7D$##S8Pg|Up{0q$1KpKooR!({N>KD zUquT%76G3OrafGH;qyhyYoVqFy&yQmlZ`D6Jk25{JeC%AlA6AMt*@lb|lg72#DOt zQn6mumoF5Zhqt7IinxVUf*0~QPYmZk(62sjwdL>Xba7X}{D-Sgo9dq-U-{iJH#CL7 zh6RYyS2RI=;@HlcCriL=zqEJ76_=gxR*@&y%!uVl;yw;6pX#^ zdFeyr=MIF>jFKKRqXnBC7}l<2)MnqD%H1Snyfm8eV~fr1R@hM7o%nRG_%XG$^`jY= zBem_QAe*ExNv@E~GfXOn+Dmn{9GLjdmmRy7afjXqDdA-O3%~}fNCeHuhzSPCN%(5r z5QUl_^`&@E!}gc#QDtQzqP-J`kVO0&@SVd|X-uDG{ecyhQor1u(4AA#xA{2Kc31jC z>8z+-$k~m$XPQ0Yg9Cf8Mzo;M} zn!^3ic&g`~Kuj>iBgh>Y94>P3>c5&9>tK;oF4`w{pm^DuE1oE3nF=IYL;L2?%kj!q z`;8npMqt>*CdLC!OeMy74-Xwbs#6a8vs9=z9u5PE;x1h~IFd0BA$$SZWbnW!#By72 zYAIRv>VRBnobWF(jhRMHHgx`_WMr|X69fP^m7aTlR5)gwT<)Qx?%9_5Nul2;mp^+u zWD+IIF$?w`2^+zyI;kEmIxY2W5{Iu_xVYT=VFqtQ*X$yF%C}*f>Fbk zZaK_*A5LboZq~G)IWI=jG-|NSh_kAwDRpPP^vL0~$?yC;7SBZ6!DPei0`61g=&u~07F%~7PG6Dy@V1kk83^7IK{6VNoWOE zK0ECq*BktC9r4IRR0BM?$E{WO&8tDR^{Ct|`3i0&y5IxRJD1~)x!^Uj(~NSkt0Jv8 zVC3MCp2yBB_`_&6cg|ONC0b-Kw2>{bCs9syL%rWfgt!>qjIlOu;0DmvDUd7TcCOe- z(M1C$<3JlVuMJWxYU66csOuIX?=UawUeXGf&;LHwBoa3VzC*rcOu0HGoCtrG3c%_w?Y%co}2x-bbX$1yj_+%mOnrpRt5=wBW? zyfQI3ljY-kV{jN+R8^I?#R(h1TuP`ENa~=jRW%QGCWs3sSI$s7v|>;!dkZQ|s;09( z1GUKQpC7Ituc|Cq*{|%)KB#78jxoJJt7G21Z>|qTpGm&fL>7(c$L$Y2o%eu1 zBDN`5k%YM`%gmQ&cHv}ud(h`_vHcwAwX1J-Yb?9w^oH(2Wb%~%Wx)fo6CI%5gLe8#Ip6IprV4x}HO6{P1C zCBf^;vjiXRsqSy*9anr^6v81P{GEz!q_)~n6GVmoM5@+WGRA#;*2#a%i8E}ze2x9> z9)^gH9s;Gx1=2}uy1GQ3=3sxy#U?MU-@2Ej16!#-8Rag|%r2cad2o07UaooG2|uu% z_@iVo?p8eEvx&Yze7P_le<=LnyTmJFzuMY1W|5?r>AlKgG)DkTuE^tqV>%Z=1(ck+DyCgc8>;t->TlYIG zwwZFozi)-Opv$}K!WN!WmbGZirc|-0vsTPni&d@ReAnDdYqiapX<3`2xTVdaU(cB= zw`o;TiyAi|EO6VUZfToo4XlC)B4PsoWC8T2PHP21MV!P|0q)9vp0Tqb147QYkC+U> zU$Kn!W??ormxN$TcBEw&Z&D-t4(Q%|2~pw=f4yh>0esiW*yjovWl?&NLw{x5-{gC1R- zBI?-Jw;^r+gYt$t0bmRuadZD8B7JNx_~j~4o8vhkl(Jp|KY^M&^~d-0c1e}O0VQ@} z%{;o01h(waLX}&H*C&@Xwo<@Q+oit%(;>t2IUmZ&QznLvdP!Uz8>&h<3R3mAmcf)i zGqTg%2A3y-CZudexQFiE7h*g7Hcmtb_U=|+Vq#A6ZQ)x$S< z9S^ef5O21Mz}Ew7zFE{K+L3ISALWQ_u3O;ez_cFb**iVTpAE2tadAgB)cKCs(C?SE zY<;cSS~Yc|KP6OOI!j2QwQn?ctD06C-6x$c(YsF7eRoC$QEr~06(KWUqunDopPz ziL}TITg}cT?M?ms?W(&`$*$Sg)j zbAdgt3T84(h-+_rtCS;Y*VyK#+;9@?Lkwd*Kq#c!hjAJ`1V$({^Ur+b0%Gp=|U5KRAD1)E02J{)ePt`vd4@o^nVg#b0 zS3XOSY5+Yh;LUkQrj$QJEmQojO8v_NyAIBY$#4kFDM}`>X@Uk~FHRd6v&^$EXo3u+ z183$(^%6(28f63H=fjdSqy$v95_gN3xSNAHvX?g69ruD(g)oZxvp&(`zB z-1&`qDtRiyNA&>hz4ZavgAld3-U0Op>-|09GDsuwrJgV`uRIW+`6P%>RBV^X4DS_rG#c&vjhh?F)3KIVLTF1YU!zGzm zv4hojMPr2XTB8b?w9A+>G$@t0m>6) zLz>i}cf9YAz=$s&kJu42Db`~=0|}D4ZZrJn{`JB$*jJdiDCPr*^kdYc=jaLU!-0SB zk5Pilm7x*{Tg{HC${NJn%ASepXouG!1~dycvcgM_{g6R3db|ZIKwOHRRkLv&7Cv=q zj#{}j;^M2$TPi7>#AfB${mWBf62RM1`Wk=s=$=>MRkjL~oc#@=6X9f=9a_TRMm$fp zt7spxi?;y=1WtbY8oHpq$TE)Von~&)rM6xHj9K=0%s{`4a=Br1f1v0V!r+PmfFpOA z=;@wSw}0oQ7Eeb<7YlREeDgaTo+J0BR0RN=&oa;w3VxMYoKMFG1;n`pYKWihKsE>O zxf7J|k-vonO@X48yUf^e!)>%oBB_fc$Cm_`;W4^ZSG&J5dYv3gPNS%0Bly!&h#T!t zPF{G`?4ia;`BS}D<3i5ajyb$-f7=a*8oNl@R!1L{MJ9oE*^1mG&)xFUsmW#S?B$uI zrvPm6Fwl@3xAknX&jEqV0Ggx`?VNV|W2obAvqZ=4$w=egX(bjFv}|nqM*2D4fIJFV zCQlK&(T4uRZKW{}2IC{ZB8NR-<@oXXlux^lBW+G!rkEiD@7muk@e{cW6oLJ&I6auv zJy=fEoeqLvQb#5g3!4ARmF6Svj=}SIKxUN|Z-VXxMXjF9IdvX|P(F*ej!y;aJ>8w~vY5F<@f8E}ROlTwGbQ;JULe3k zkr6yi%T#;NK(tgD|1zi&?GBVPHsTEIo50SPz(h0KBNRZ(#7FBn5M+NUa9*m(d$eL- zt+xN_v2X0Fu5g6Eb(l|jy_-t|-PL?<`z^`S-UbgcVYO~dI1&~Rvh=kyQ_}1}R@BW+ zd(N+{<)2VpN>nmF@Fbb=YJW+5S?S_oc>}D@1Z-~)c;kO1%g+WCF&}2Fy7|M?Z`LVT zR^#4zfm;AS!`xEgY4U6|Ztoksg74^F&0Bm+ZRZ7+e_M|QHg(rFzL0jqOASr!#nfJ2 z>)dFcP*ZZqdAgszX<;=gV(T}1M2Eh-@e2NCn$Ky(F~`m8Q5S$Dg~U~;5uScvROE6g zlZDS_f{n4!>!ozO8se?L>fook?oV?5{@b3^cE`!1_YR7i8=(J4?g^8qb@{%M#@!|E z^Nz@XF9|+yC+m5Y!{G|9!9&qZUpwi$YEafnfCxuP0o1MP}BWJ|qJ;Vwdn=u9Ukzl4+pvO>cM|yV0(# zoBEmOp!;y>V;t46=VI=0*O}T-Yyxz@iLzxpVl1zEtpm-|JjV-2FGub8y-TJ3Dv)#n z3Odx!{Wh7&j*tEcnQXg8U zAyu%`<)4;#+V^-=1>G0yhXo7jqR^clLxT>nS!bK$7sQMf|vx?=dnY*XCi7! zMd*aLr$hSd(9F+(<+GDCZ6$9EiIgec&@qUG4u*}$@_ep#^t4L!ic6i|LvVB%`zou) zqjY2>C=((F=Fxy_A24MnU~6UFWC`F8DZ z4kCSmDhtA5{D9kddGN8o?x0}?!KY1G*gK~fx3S$L0MKC)4M09HVm6){5=(1?_)&NF z8Ob#bVjhlV*Ja_`c==;Wfu z{Vn{|_1Wx({gZZC3>R?`jxSZ%Uma6(dNZ18q)F(Xqk>qie}&!CkYh2)?;Wces#~~J zq%{aOK56$Jk>zOz5nYQ7GEtC$X4kC5B^uu_t_@URg9g5=CWl%YdFq#ZOuc=M(Jlw;9mRd$a+_Ks|-L!w*on z<-xDba;n1+R$?tD56kIKWdJ+=(tlS2KuHPW&v=`cjUV=$|B836*W4bz?F6LarQur6 zLAS3KZA0fPUS3LXSc$W*-fg?LlHkRpn~*o78y_(rT4@m*Xkjty*#rod5~oHK)eZNA zyAE!Tl$St1C^(J0iSJPwhOkKurYE5=5@IH3sp$DT6KbvF!aW~()=)|?Rd)D}aG(m+ z-HT1rT9kE?+!8%#-q*-)xnD~*6P7<&`FuU2_0TMh9q&xk+D-tgmR{o_X z3?VKq6nsq1NWGrrp+0tBWOuprj^PNC2$ST`DE&&|u93-VF$5FxDo6}MHH4zz&R{+H z5m#R$jdMCX_Adi_iS%n7sZJ6O3;kv3(t`61jx>>9;>^J8D6E)`f?wp5gPY)lB!#c zmTt*DYS;UvV8W+)?pUiGCG8{{8r{NOCC5vYkzq`MPdt3bUB9~Oz!n=Jg^A8`MzXkk zGhZqIi>kBm69Pw@J>+K&Rz6+@ZEcr%mH2eh2_o1nxh13Snv4E3cG^Z+tB9!V z1}hg)&ijYJ&b{ocEC0)e+L67efqQhs^2uha>ukm8JQI_?MwwFIOZWWYrbfm8 zpklqU>b}sSBi2EMuICcuEYp!1u}6z36>-B|Y4cKJjMf%`pQ?_^54F~|jc)H~u=UO-brNm z_@-?kGJ8-f?hARKQ!V)%@y$*--8JJz^CH&P=IEs9OzHBOb;mJOc{k)i|FlB#%Zi9_baH+J(Z0X;1nILv-JrYR;MW)4-tLfbc+_2Z2plUg2*G5~$uIC02Ro#)dTPhZZ<+w%k2W z2;$x?R=I=ywok23Uonq*;CvJ(@kSXjy?O>xq!aI>_Gwxosphx`pR}R0X(3S&t4WH& zbA=#Q2p$rOoiRxl%=GqXRHimL-pZOyZxgYqdffEyPpT8uzNpYEJ~hi~>qxm{WYG<} zf$iy8u8r4BI4rj6S#Q~1{Ey7p+Vg%)Q3WVcHPZg=;TWBhqB$afuDeJyg2)U{xvueIr!b+xxbqGYx&#bcxsAtAH!R=NL&y045K=b^HzYQ?|R{J|^z^eG$+0V2S5 zx=^}$-i;-P-*rGyBj%KwY5Na9fG{3LvjdO?3QY1noAwBk;#>yF!npRL1ui4=j%|~=o%cPq7T&OzzcQ-KDXn-+VR3uZr@E2wy>pm`yp1(p za`U0C{(G70SgAIcbxo;-;9e!tRVSV<+M09w7j5Y2(t(gj=*|x*$H+JI_sg}~gQaJ* zhssjLS!0%KO?(<%XYVc<0;Q#yw8h`03I`f-Z_DSHx$^hm=%;K`tg!5uoN$Mz+hss9 z-<~LpQ*yz1u);ag4UoKB?mxi`SUAQX>1|wl*c0Q0dhVt`jPjlz!KB;&zS_3DYWudlW$RDXi{SBZ z4Ub<35u}qYWU=ayh?akftqz|i@zTEbi0h>qoQ0g~5nm}84jbVAeo|Az$X27D)qmtR z0+kju{Ss_Fp?PXTv3!Lnfe|Z%{~f^PA8GiG$B$n|orTYJh7A6?8*DN0p&~&XEnYVD zyM^hj?Ty)A9FI!Re^oOv=2+mh#g1C(bHzhXU+&`4j}bdzJQK~ByP5ZS53MOcfwF`z z$n6L??*A=yaso15Pk~D_sphd5*-ZdSRADM4hMh_D6e!>g!&I2j%{TVK~iq(zp zBd@1cc{Bl2KulVyAp#|st2B3V{}~>lqhW7|rxxTTTi{^=TmXqs;I!FF3>FBDXG=IN zDY71ifs!);7Itn1@8{57Jh}KiBHP!pYPDQbuLLJ2b&ZH0%WhCqG3Yq$ zH#3KpbQyNm3?g;xH2yN zUn#>XtdBoWpZw_fi-%g~nn90~hNCRE>+{G!@EY8A8Y!BwjGp$GA8ADrO*mDpJGeOj z)uScpsiRQ|muFvc)s;%yrxQoF>l5EUdoFx%yHn9`;h*d){rtW00 z#ddC52(sr%227qHXKC8)aFO4!@ofm9Fe4`3!k{3WSOPl-0C?t|6n_f zW*ozP+*nBFMo+lLgC`sg?pmoe{Tr`T>Qk%)j8#sC*q*6niy+ST`sIAX#AvUHr)*Y- zug>V47BTEM8Qp}B0)8s1C3F>E0D-fE8GeS)7Ydby#=94ovo==8ryBP--?&8ZMBA-d z2a=k+Ej=*BcC1=AeSc+>z!Q5phy0HF?HlxT!7Oi&G?`$hrn1%4BnNj;>==1(b+YPs zDiU2D4M2@Mg?H`>5{7Sy)E8#IYI=STF>)Qf`Mt(EjSDkOIdBo&=HrR+>^+L;0+nd_glzf2%$!XMXU0+>?NoH$|c$NE1N-B)Tcv%|6&R zE0ha}pcz-LN^w+Y`*(ib;^!Te3O}|aSX5zO6r2w)%m{K)^cv`$$9j|}{m1Xh_}mds zDbAjTWJbE%dttk5rsN(*Ft5ZDEmDljk#!#-MRP~nNnQk!X>XSWD%_-tTi*rztJ&eX zE)Xa|uL+!>!v}21f8n!R9nLHBSNVp4+LS!I;b>e|I--0;{3KGMBhyFzzM^L~;4lR6$dCf=;P z1(2BYyej3TR?+s!9MvI!E#lE+?VTiH7ctU@y5m+ECfzOe!wk@zyAMY?r8t&lOqR49 z#2f1llw^ZE``T)CFP#+zV~nPA-KG0@J>u>>uCetTh&x|dXJIREjBQBS>h@1-Vmhlf z<+#k#Qo;YN%qvF1q)Lk0la%O0$e%*pp&o5C54Hi26Ju`Jk9SVzp|!%zh<3`f6Ez{Q*g1_kD8q16%Hw z78^xP$4xa@#9nw6s@m1ERO>Vu2Y3U_V^_#cYLwDvRkZ=*mTrw5Il)F|*M z322-O`>mS`H<(=qMPR}rpXVBl3zAQky5r?Yx|`y~WYT-UYvSv1iEJ5=_&t|sm1?Z{ zV9yiOP}&y&7s~O*%@poCU>0gVB4ZVzvCDqN+!JHC7Bh-HgRzGK@PgrT)L5!hJUq ze5NWdEzPauKFSB!S$-E`!41HzD;)3_57lKif=1w-PZ;n0ofjFzj+B+JD!ARPb4G`^ zM6FpA$iCP+W_noAQA8SGlk2&$#vpQFj=ikBlPRz3ex?Ip=XkDXuNqHj zztQ&i%)_=40AeFiwi~zs1M@XDsmC`mGBo4A>R|u1n)hP7O7uDY#Ge?x4cJwCd=Xc* z&-M5D?*GlnXR~PO<-BzX5?UrXiz0lHNprS_%zCY{fx}H&*k6V%HeLfgheoV%qVh?R zE>qh4hZ>>6*7DSda@`o@l?s0>5NwHLJE+7VM;U|j4A4<@p`B3Wq25!{94Cy?bgs>! zghA_H8OrVsnvI}K=?oYBO#=D3Z3aw|%(uadT@1+O%A}z${jc*r-1D~qF9l$oc_AIn z@xqCZ`)Dsr_uGaNd*mdPpq-$*EgUbgqoaVC#;GGeUJheecEfPziFTi2)lO7)Q?mL_ zQzXl9&}wM81o`Sqyb`II`=v%OvY0t)CC(L0ff~x4DqVB~zDT|$mq$j2-p33yk+@ohmb?9cZId3X`AJ2o%dw=hRY;I zjI5eB-fWJu+_8;x;pPW8%3;xjQL)ZfqQWv=O~)>s>%;8-#7wHHj$Rg!I9T|G?_WT% zm!B_Jm3KBXYhC{{cjT@uC+X9!dnYN zDsL@j*zEvTMDc-`hVIJihhm5{|DP1M@#c+-2dF@5b1VwMhIc`V%a`on##?T-Bkg8t zk}sHc*kCJReXC9-<*P)1;1W5!Ijj@0{WY>(B%F_<+S+sZ*VbPMt*Vq+Do9h1qZ$Rs zlHP`|b?j7`aU3FYmR$R1xUHD~I*i<@|f*fMCY>f*7nsP0tw+*P6Ak1 z(4&BhW|}w4HTpAT#LApSns zJm9GEsPx!!C4nfZhxFx1dQW~=_tj9!YsGVCXQsQ}5eeM_SfWL@+P|6S5_`n^RbKmZ z@b-wi=q_>`52d)29U0qWXWIn$t+ra0zi11WZ$&@Ig&-Gff9W86pH2gX5!qs`|CZcP zKocVJC=0e{jB2rr_ht;5_ZT&c;jn<$4k5M|$*E>h^;QQ$dd9~4IuNh`&R1ntN_{-) z%n0d@isz2nRcC)@ai5C)C8uo4cMa6|A!#<6W}K}CeLa>!{UacFG2Z4YP#Ml)UD6@e zzAxrkmouhQOtd+`@P+RSeIwY772sCyA&y-(bB06{ zMV3Sm3u&wR{4#$<_1lVo@+07cfxRm@5y1b0s?}nwUF5A- zVZZMh@ckid&mO}gOFD>hw0Ii5GtTve}!F%909R@DZZW)Al~Ss zLqG!F^A>52yl#P{hsJkF>+CSlT4C{D^l^C|@1(?%x5`I(DQ2QKxG;+X;GK&|8&}!U zKUBFX6YWvvhikFCN~&Uk{VYx&RTpDx$)S{`tRCH!!)2*(31Dy02M9xQ5-Iof`CesQ zGPi&MZP2;a4O*3b7;g2`u_XOI#iZ*S;D{^!!Ld8Y%|X{AN4-fdZi*VwfN9XvOs0(! z8*au>$Cz~E3Y20|$QMvlrH}f}K*AAgw-Sgn67tYknFwafFxr6{KxI6w<=570Ah9}A zGtgP6rPDH|;5=Zh^fpu6O`!%z{fPRDP}YoA1FY)QU2g{xy){xa4tFb%gVa5Z*J zLIJAjzupsUD*HP4GtKyu7%;xi|G`U+aa^agDwtf0C{0PhdBx8^K$L50i8>=+OrDXz zy;h5mY;?oE*PC4O_|LP{B$D(Ad%6+wp;W#I>lI5Z9Rbcxh?Z2B1RO1ShJ&+Uwx%|x zO|#Qr?i{UzXkgNqInsxaHn7pt?pvcTEQa9j!!=v_M&~nwLTSbV*J8(7H`@L)sXP@z z@7ErfKV$;5(Cny4CnF(su<_T2M6TD^O%4mjYiw&IDS3Za>(-Lel;RggV%rJl{~>n% zlS1)}?3b$M*kk6i6f#Bf@}!flc6mj6rENY|;a@Ge->JCNzA^|1{#oYZAk^B_eZist zaU~f`IH}Yd@cLCThTFzu%Mo+7T6*TF2mQiKt*~aBlDOttqg`iCNV;hUm0++?a>4Ufc*+k-YeCy_SZwrc*d6!gmhpM+dAdrWb zLq=oks$c7fOmO|Ntlj(#xQ}|Qn_8YBqm;KKuscT`wgKZgzY|WI+`}b;7y4!&WW*75~0y9=(THyV4n z$&RZN&76QiH+PLqR}G!yzJvhuDj`evwFI55RzDiLW(0|7jkY<;ij7yE_LcToHIE^9 zifTV%Xwp2EAw=aOqIb_ltA*4*i0@k4S{g&9gkBL><5(@R`^mJGeZDsDjs3mfPDCyi zo8G@Vf^$dAiSksg*F(*K@=ZF&b9d&P8laZ>&;93Qh1L7|ImO<-72S1%O!X2@ zzeK1rOo z4xDkn^QaVP7vwV67g`J@>OY(9eiv|>Z;E{iVPOEyy8t(~IhYu_qL-Z!@T6b%alF#i zzLcuw*Cd8ldaN)82KHQ~VYg>m5)Dm7Y0bO=-@gGK=J+T5SFKL`J_Q`-V$gqoeEM&C zyK!Z(yOy)cErur%lAYpJvCjA|3*gQf-Z8=he|Ad;Q(VS&5)ay!J{A$KjP_JLWbltV zUTEPYJDK5zWYVW&tM@U<|7DT!ofU8jkl|gL#dd7%@zITf*m%|Hy}m{H6~N#7N1*WA zS}@%&mdx&0UiTk@o9@odb!fapNxaTVqRyay;{8GgeFt3^7pumnZa% zg=H=VwBu*!K~05wLl+O$wiy_{n*d?WPRKL6+n(W5bGWN%*xJIw!0_PRnR^Sh2%}{g z>W)9K?kBE)PuXps+0Vp5sJZ|B%bUQTZCY)f3)Y`bMR6Ni*Le|;f!h-+zy~t`5B{2} zGV~1rnG481lNVS4pYZ>gnIbT=rN178q5YvAX9R zng_$8e5bQ&4rV_NJytt3^J^ef}lzEczQKCd47n?1|SHn@C4?>Q_j=IlyiY@=?c z$2Hr)D;$BA67g#N!9j#(ztIg}4rzH((JI=Dpk!ybrGIGPp*!iBaV3i>gH=(^H*4wu zE_g8Ll07Eby6vUnSw9s`kVo0o^LF~gdHrU^Qb6=6&lgt-w#{>`lHzkJxtzn-h~%-sj(VPdX*@e_qGWPsH;dLmStP2H& z$7XY~-7o9Z(4Cwj6;JuB_~t?XZOl92ub*hE3w*V#y3~1rl_Nf!*it`bhAGVLbT*;X zsRiRYl^!JnQ9JBg<03FN%yN3tVzqfRxU8-tiT_r_jMBEfQt|}G655(2b{SLWc)itr zPvL8u-O}H^p*Cj@;4q9p^vL*X?@!&6(tb$>)6 z*fXzIjO-MX`dPR6Y`sH<1MgdcvXZYw=Q&mZ>Qu96lPI>P$Hiz2`b3I~eW79b=YW+qwMA{a7G}^Z4DC z66fwN%Uk|#z-~{GM$b?`Vxo2EiqEnUbUP-pQr2ZFc zICsQ8vH2Ib^H#1n;-x?wQYD%|y+7m1GY!7om&t2dE36~7W7pgd?aN{{JA0a9rsz?e`?sC#tQWNJp>D`P3seJGG2a&jPF{1>U%_nJ4MN`$lIxz%)!{<{Y~Dn{RAo z<~ZC{(rPEtxp1zr_KX6C0+KSp1qDaLO3xr&LuUYM-PJ4($wd)J(E z@+@U@j#ziK%>bzvLx9HJVvmW0h!{K^5v!zMIXFbsUBZvcupg9Z#43XI80$`Y?7Y>Xz``L(m3?Z_!+ zj9F8dTw|HoI&y=HaKBhhE{-YDR-VZ(x3RVw+fsF?Zwk7`@srW@Q%|nCY4w#B4`e(+hmXE9v7U>q|!HxPfJrYj!HQK;-R;%&4btPUn^F%({!2 z)t9F%PASZ}+uti*Dq>!NW940HpQ9`*>9*$a_`5&dJ91vnjYiDJL9|AH?^%I^c97Od z{c?yq;e^iO_BSj%8t%%IMDCuhv@-%BJ>y<+sI%?J`K3Nyx|dj&hG_E2tH{?zmQ=8Z zcwk;$cZs}EU-NvD%^4?iGs@pWDXzx+NnQNg5?@z}e|{ci#O}_W{iWc`p%7>KytOc= z7jFaHUcr?IEe%MWba=PYXx2%krx+7vFJ=LyM+5)2AL zGXG!gefL+A{r`VED@SIIa^32k-JxlY+@sXAVVWsuE*y6`0m%e6t=l~+@3fq$IRa5h z1-F%gr75W?DyRvmIS>&yDxa(O_k6zR`#*f&KXN#SbDfLV>vcWW^Kk_&K21!mij%5} zGI-==o9hO~hT*nATeeQ8%;4;nDnSOtc}$XjW-T;j)2L%3g$=Pu0Iv>XIC#<;5O5Q! zV!p!N4|JwQsG^b4R^N0P7s_7`m-Zc=n=XG45M6Z?sh<8bTq8=9z3l|8fF;f-bUrAf z8Wa6+nDsU1HY0w?6LHVFrmt8>8>ykHy5}G zsxq$ykfM=0TV3rqLLe}AXJ!!=$$^mu8*@Vpl&!9v2R#H1YcV6yn^KYzbco}q#97;~ zk(*uz&d#d|pCF=uI$7z#{B*RRJw6_>X4?A}xulf^i!>PrQ8&zZo(_uSZ4s(4Zq2z(f_e4rJ z!2QcksCV>dh1(%#$n~tBKMI!N5#)kGB8KGIIi&ortX=p;1}mVRMa*G7j(RJCwYg!! zp$h9flD*wTTEua%lV~Avh;H38t&Ile zq?)hMH<0Te?|ECQUsLRDD9O?AubDebv0|*=@4I~1bkp-VOPO*l+Mj@D%c7No*V|KE z@|__ybzJu%?4oH^)K~^}YMI%_QOoaqs>fO00RE?!oJZ`GZ$hy%vFyyWcHA(hueoht zX&Et8q2PGqh|OH452IFAom_9ILg{&Q*z6*F_osb-hm1aKp)6gBf6p<8b%@f)PReNT zJ-GF`ThncL18a&@()D9@XuFJT`CQ0+3~ba^cHE5k^$Md%6szxB(cZO?C?PT@e3Mtu z_$u|`k9Nm0Jq1&b6@|oBb9O?3EGfk7ZT++H_ieY`y{rpx;l1nwI!YSNIjc=c3fJ+U zp4D$8j;pd0>=7*GpuY&|w6A8R0Tbmyip8JGU%#q{>iAl-`iOOr8im5|l3-(9KZxlC z(!SMs6XxYunuHJYR7~%v!xZwJTana z@{X;MFLc^%|9e=Tx_nA#dsGr_BNN{%ayMj~rI>Xi)TklHH9Vx3K?K<_{YZ1vupV!n z{_j~~QrMTi(_2$F&#tf+=>}$^o1GYc!!OB4);9;rvgo0IIY_S4aL#qYr_GFEkw*8| z$K1?F9#S593)R5%{b^{tnEmS)YwD`S^!vN$R@3T&?Cr{M`wd%eGkt`kmJ~|Pb%O_N zF%XgS^sbqKt+LcK1GDk^zmWqU{#4x|XwoC(*QHnsbBfz<4B#A1&Niu5W}SbM)jHUg zy#AbYk`?NkJk8b8F!wOYx@WF~En!m5<1@F&{k_zaGmCztVH#4usr+b=UyAj?)#p{? zcoVUfr3NZ28vTYFwQ@aqJPN-Rd2=LSX65zHy5|0mFw>f2r&;wQygT=QdC#U2QjLVD zLng~t8~$Bs%TdoT{y%^SPrNg{x_o7}Ew16G2JvGib*Czc73ntlcS=tCF4eqLBu8K0 zRM2Wd>4_c4hG&HDgeC)zVJWmi3R1#%$&h**y06E;!b>a9s|!qH?@hm~0@-1Y)dG=hnYHs2L&M6na9aj#L> zgi-vb)4~zii5E)lgo8`sV~3iR&r;ltC&4m|H9`SPq9u#wZ+9g+7#f0zVbPkN?N6=C2fLD_d^K&f2x*BS^XFKXeuen4h9|aUl49fp zf*u5)r;FP_@CO=pPfXs#eRyY*CT3g_5H2}>C#5rIVvAVYE+w%73z$KR+Q_v#T;_gb zM34<<-mSmh&~XZvoVLXmw_N&8;k#R9reSaJWmvEz&B z$uvIAvGnaAnH&Cb7n8kquJ;amyUB$z4Dw2YMfhqhb{#L`w!mJyZ}%D~+6HoSS!g2m z(`ljn*l&>VRcFW2Qk+=M^Ly-8{=g^Pk_|cHR|>7Qve|lM{Vt}q=lB_m%zw!BX-E?| zzyJ!!yQwrqMY-s(>91w-w7dT}u{f}ETQBMwCH^*q?=Ij2Cd^0IP>TQIMf!g7d26v> zZe;Ja+-IC*6>aIru1N2dN^w9IDimHa{%CD$Hk$VU-MEc^S?+(w!S;Ck(Sva(sKt4p z7bu)N0BTVd6_CrG2ZXqd*@?HXc~f`9@7G4=If(z8EWK;TOPsx>?3I{Ih9}2-1N|W! zCU2irHQ%i0s-qRFX}t8NwDWdzoXhxN?~6+K$^o2f!%g}tT}o_{Z|mUSnnY(Ow+^Cw zkVLzInewXu;zgC(tq`rf2t6eIw%iP|6|uI?l9L5r2ivXqU~IqxN-Q)x+?*nlfSFjB zAV(PWp26pb1`m`!4PIL>;y{|{I)3dD<_Rzly($E671|o>(f#Z%5Q~Tq&lUxxuj_$k zi?XZl2#qW*ca?vBt>bOcJt0jE`r;jLdfq+x2Pl6&uO`hdo>IT~L~G!kjGDMMc^*N6 zx+cWl!>>`x)^ajY;p4p1>DkFUym#f5fxe7wYfH5Mb)ZA(`_y51_trw9nno}E2x9d0 z0!hsxU+7?*gnO;y5vfAUCSdw@gOA4wS=i3SouIem0TnJzMK6Du4%t4vn|A;cmYjH} zti{XPv1Z5MFG_$%r(+6h$T4^A-^-uA$Bbs@b_Q+EzjLH-HMP{5TjE0g_;)7G=Y8Lo z2bx5-n&-wRN-;qRwB!o5xH9;42&{s)Is?J&2^(xrua&eS77MHSV$!`HV|<*v>o(R2 zR=B}6(35lujeepNiL0(~wz_)D=FHd|7nF>*pAJWT%}tJz7fdZbl*~idT>5)eMNB^i zrjHo?uKh>i%+TC=@cGP*)QMRBdqqbl9qU2JSwU;Tzc&n%Sz9CW8ee4P^n2EN1)#N? zO)-6kb^r+PuF%x8)|t)RxfXq}=LitcPdZjK`Sdg=W~V^6HLwzUZ_&X}mx0YeJ+5`h zG>~JfKMGpq)88cpf_tRs4TIzeQcga=3x|~KRx*;zy!whOu!P%LC`uo3%cD*utqdaF zM!?{XCNR_P;z0u9ceof4#lJhn%rDq}%N_hyBycSAwtgDRiDA!gDZBX7Zj%3O9{E#~ zLcdHlINhrkASrakcLh|G9-fxxlpu0u99LB3SyKRb6uG>($Z`m>vp|%xXcjAV+ zu}A^a0;dp>B^qWJrrW_YN*fq0rieR zaExTZ_s;$%c;LDyOv}3HW2~-gx~!P3$9n_$hUkb91PGfpddF-;MC%&7B=0&F7O)b%#hrMmi{FK9?@p%l^_*XGOt|3V)`ltPAkK|98ROl5oL_=jOfeP0H zV&;Jk@{$GHMD6cDPrz)?cL04J_wEf*eIh{1i^gzjIVgBOPU5Vc9OUKo=#b-_7)1@rC5HE^ zWa_PXorztDR_SgX`%(~3GnqT$BTOFS5-;wKZVoJnCM!{9h--evw5#G?Q;Lq$LHCjF zVrV|OKHwrHt#xt>mX?Uxt!;ebV+cPD-4F1YeMZZl^fD8`-hXC%Fs7GhN05(M>%CTl z>nxwY@@zQpy+mOzQPmjPy>QRxg$|?Z&GUpK+cu?(1L3;b;(_EpRWq|}J)^-5KdWUsr3r2dbBC9%78aGde6xc6dU)_mUur(1Pf zon&61cx>uR-c=7ziO$sv=`Syy-^v2T^c&;^*DR~F%+p@hGk)ndl=x%tlSl+0Ov`Zepsszt! zTV1Ii>Hl=xl*qK_bU5!<^j9|xw$2{*u9=4@e>M84xNA06kF+Gn+vpTwsri^CX8uvN zP@WAL37fx+0bHXPKfaz>Lj|_#+ts?7pYZu=Q0ALj*Tw;O`%a@(LLC!^@r)2FanalC zl~g;OJ~!BVJI^k&=EByfp}y5buICA`LSEX(`w={$!*Dr8)dcFv!kf9Y99T}d#@MoG z@%|oq+r)#c71!0lH^U10&8x847|in7fcT?PM&zg;3^({SwDm}Fx`K(}P_5JkwQQu4Q0^=c< zebib)Oja|7%kV$%!~LC&(O|~tC1~CAn}5+qGQ+y->~BTHH%jd#Pt9{8?%!_vD-!w= z3UfQ4HPzoiVR=5F1VOVP@}|Z+J!S}7U{CX~k>@cD%S0tv&$elDu^T~(L#CfT+^0_% z3#`uC={Wa+|N!71Gu5AL+#do`Iq)R2b@AU+Y!#v&c0GpB<( z%Q|~%w>FVw4gN!8U!$Oct(9?FODk|>Ie3J9GvAH@D9&O`rvTy7y-;)(ta}PkGFC9r z%S$~rDfFa>W2?ItcF%xM$}2G5kh50)H1LaeBBqNOX5;eB4qAl2ay5cS-)-jpdX0@V zjf$PckecbgpYFN~vMLLXa`yPh26a&EuF}oe*ybVs2aJUt6VLfUau9o^Xk(i~7+vrK z_|H8quPKVuJ(;A14nbDbH7;$AAK}Oh$$tQfRAxRyvLIr;uj!D`c@z=Dc)1ABFH|ie zy>WNz!A!cKf$L8nA22wq&u@^Z+_)WC^u?o2Is6VZxO-A}x$=`nvPMvZeidr{O4+@O zL}blG>`Y(HfQDxHURv7azI8^g|g&`wFcncgW2pkUoX=9x77_KsNWt?@T+??`M2B_K9xNI+2}E~@U3 zbo2~;YO{1iOJZ^XDm|0qhrS@?HxXjlsFL=Ns`>f~MFuhRAH6j*^_!vr(rzoy8{UMD z*$JAB6Oqk^$ImCn=**tcoSm!Rd#D^xVEoIC>2)V0rcfFhHhc|tvwdo!wFzHsVy%nn=Ptwzt2$g1m&PWGnv@Gai`7MYx|;G|X$u9C zZmX#pk6l>3i_f}5!E@q^cUS=%=&wI#yRe0Ns#o=40C@R1n(5!`@wNYSdZWtL-mqn3 z6)O$F&4bJhf8xbr3oh<_CS?_;0^OO@!&U=br7+)a-iPN+>~SI(V*&Umr3T`n4V;}by5=TMW5i>NO(`Cjp!NdXi*X8^WE!HnPGS2t${@k4fEzmu$z*DlO_1ndwKWZZnm48 zqJzgtD#D=fj+`S$jbft-Mg+fGa2xzvS&pSP?wr%or~)0^_6t70FU4|~tJn|4H`bVR zcC4jOh+mFMnH8Ie@N+)fAih8;m`u8$2KqNXQ~@X<$;0pgFgCJJ4(C=WXOah^;5*h0wk>%DOUn}oPHzmR=3bavm7zuE zuaS|U!t0EW)fMAG1k5;w-?h@A8QT~By>-~0V9Vut@6ugfoZ{pVz9M5-ExMqOzH*&W zvmvn>D<}R#DktTT${QB=(5iUv8b;lT}sDYIDRPP<8SV)OH@+ zHngj{K6Mv@tgt~4;$3rPmH$p`la@%tk|W-NFP-d~iQHLM$|@q)^FL$3Q*UQTlJF^j zTy_LroK59jdJ1Bzzm`9_(^mA}D}alba07%&t&VJo9)>Jb%w|DgcY3fhHlJ7Lmc2Ic z+Z>r)7Sd{}HP!rU&9_-v_|Un$B--~mcopE8enY1QNh-$~#1$(}>Km8easwpkfm!*2&3LH=ikTjJUo=I9@;is`zt-p$ygt6;`;k@`AmDAKDQDuv>c)e z7|KM+liS^xUBAt9-VtTFK9<|qVGYgAmI*b|N0MNQu(H|I<_3=k)SY@S!A>`O_?>g} zkAJ3kGL`=03e+eAp90b-L|lmIct@(c%Ev;!(2fBz^BfSIN9pF& zhR&5gXmc*9Ai_OwWb>L>mFr-*ZmmEdVgI%mHPM1U^8ISZMzU{n9_XXNbg{jIZdO{u zS7NV--x$&+vZ5!n{muG=Z_oJgWK`k=t?NUm2XwK@AWJ0Q&zz4(l!=Waqv$O7w;zV} zgEfq@4P$64XM81Ds5L&&sL;2dW5ST1gEql4bv-dDyeGcbTyp5= za|LV!N%&8r5$U`ng49mJ=;jY!H?s}%iEj>1xK#`^v~e-sJa{u(ak$xVr|O7AAfi%{ zzYs$bQGdc8w~xKONdL9D+AY`(i-Z#dESJDFVdg}EW6D2}$)&H(Em*mD`e?fNzRHM= z=b4iMxovG*Pag5mPsO=4#MoGeG2+6b!(H4{_yfB&TGPJ46I;cKC9kWZ!G@J|abH$e z+bILFx>2aP`Wh{Z(?T+^G4nLrovOk(nvt3mBL2kha?`u-HXd7S4Ep>`&C_i=f8$hq z%ks+r{)`#=GkfJU#} zhUFqgPi06;Rgu78XWf4|Z~L}~x{!{+6OW9EqA)MU_M2hR{d}!h){WS8bb+1}=RDEx z07MI}p_cYYu+0%@v?E68iy0FzUq%OYGiMOz8uwVsb9`;i8At)FHxsGy-)=De zIlg6Uj8>|!w6%h4Z_?>=gAVH+LZt84R$U~E_MP7{5TS(>AaG5~0DUGoT>ftB?oMnB zf|tfB-4md09k4IRYsIkobik{Thpt>YIq691 zAU3=kE?~PyQ-XRnHJ-A!Q!Xp!H`*H!Ub)a>`s7&;x?Yf9YHkKOpGCK-t#ekpn>-(V z@AVKmOz!Vke^7XRu4bULOa+a=++q8V{}XcSDZ(LUXjU5=ZtsEqWNeiEloUGCep$a| z6&66v=Csm!J=i|)hD6EyOHKk|vn<7(1-~g&GH~$ImV1i*%8)lLR)q44uFr9^)7Q&K zH*LAC-@lj{F9^1MUHO`V{-Jrfcm8&*Kdalb$44$$$Dc?k&SWFkO;kMvo2DQl%uQE^8SzRNEX+jlKA&C~L7YPdAeg=2KH+(F18I zvIZ+53CH;Xp*>1>ay9Ar@FY-{!T7u=0TMjw1bJ3xY*FmJ(QhdR#O60Q(w0Ej@1qf` z1^IgTwV466qLJ8K`W!Gt%CKr9j~mr|{Pi14I^BIG@$y1X=KU$J3msTol2UebCvfeK z|JY^OrPTsuG)%{pM)Se+J@1lAO4=oTTPo+OJ|3@KtgfRQ9g!6~MQc~eNfpO8NpV{sAoTPlnGB{SWj6{pjtNGD*0z;i>Ii_SaC<>y4on;(!r)U*R)0yEhw6g5=TIS9$iSIs35ndk@EyPi z9i(fhFbcG+4`XMrV$~MGIUtLQ@Rqxnx@^^qzLTazOI^jP+bchlLc@*G&%Qb^!YapL z<6kDm`i;-p`p>Hhao6X74w}RZyi`qov1_dTf!A7bXGK+(5))&#>6YlRx_;k3GPSLt zgh`XK1y_uR?=ZA%e1QGa=j~%=y9~`-2aoW8NT` z<_tOgMiJP!vI0Q$@4w;Mf8T@>`s&s~76gM>wlhYbL|q12qkeOY8@k&HcEiUp=DTCr zBc1_vL@YBcdw+g9QL$|Ug~jDdq4ChJzJ+xwH4^+|h5lA4mO zfl=Y@s&lc6SNF{f+x11w;Zj5V{*>4Ww{w;@Kf5IbaTo~$WC`b1lAJs}_?5XPC{p>7 z+_g7S${kzN6~zP1i5W%;np`<4g>bKk*4Zp;rnt7}*0g@s-k61g=W>?f+E?mj6d$7c z_p=?zu`$RDq&TO9;9g7HZ|P6*5GthBhDv`@?8&2T1inEy=-Q@ELHmG~Bc=$lAgiT9 zxI+2DsaY%I#a}~nc2Q$g+VLu5&Ccdu+}`wUm1{6ZJr)KA9fhHZwGYZb?3Z zwnbTk7B^OCILJi>m|OF%o!X*L^w^yg+#_RQiXJ>B>tlIG;>1NDOC}cOMq7=HJJF^| zdC*KLOe;Q~F>qfF{6PI5BWRFuXW%wtV-w%uvay6U9_Yu%ddkfMCbj|fr*fwGOV-+C ze0=jxtf6%>ArgpK+0WlWIkD_QdYq6mO~d&F43i;G4RiC!$(*U6L!h`s!W&7VMA>fl77_zwghPDjDA&}+x_UJz?ryO7`|tA8!b#RWH{5g!tBSH* z7^duYoU=JQ?I}T?W%;oD+5FJ_n5#*ZL8*_N$#DIER}D%I4=IEI}u+g(BD?jBdJS=!8r z9?D^=K0VuvLQG65`pE0aWGxhv!`;`b1V%r3>DTc9xzy47tzdM=%_NJN)~+2tOT4yH znZ!ogb4M39zu3nuP^IbjmYN}HQ{pK(8!d_+HAd&p^`3FdpYV~j9@vx)n=IXPAsZNR z@iP*sCQ2bvkk56?lS1BR1@CP6z8Iyx)G9usTHE&vbz?_w2qG;}cUkMpmy+8Who8_( zo!264YY#u6LHO_8_6`k2vKe)&hFcwGD3WqT?3fbN!7n%BqdWLX?s2p@B9JeklR?uZiu#3B^*?2w+87B!OD^;qX zo@;^t)h&U`J>fk)cPxZrC?_l)_W2%}96piCBn4-hxuX?KqpZ+F`yUc69sExq9b3gr zi&PP*VlF-m8}k<1vjw#0@7ZItGJ?QFeWp*7)E1>S0d3EdqqfH%m>>tfx^-n0%uzmF=CHFk|{Cnfd0oDkR=Jog;TTt7BU3m`1^>1PLBp?miv{l`{VlpRT z&L6Dm?~&Cn&C!S1qIWks146msZbh`gfAgT3(^l;$wCsV0-v0@qAB?UIpM%|DPc5?<@cB$N!Br|MzbEcQO3mjQf8V!+#gU|L==Iy+j~Z Y#5x*y>S=)4?+3-TD|S|u7G9742QxT=#{d8T From c52622a5e12eb1265978913f71d573d9e2d38001 Mon Sep 17 00:00:00 2001 From: Jeffrey Aven Date: Tue, 15 Sep 2026 09:07:06 +1000 Subject: [PATCH 3/3] ci updates --- .github/workflows/build-and-test.yml | 14 +- .gitignore | 10 +- CLAUDE.md | 2 +- NOTES.md | 2 +- README.md | 4 +- provider-dev/downloaded/openapi.json | 248684 ++++++++++++++++++++++++ 6 files changed, 248703 insertions(+), 13 deletions(-) create mode 100644 provider-dev/downloaded/openapi.json diff --git a/.github/workflows/build-and-test.yml b/.github/workflows/build-and-test.yml index 7afca16..20b2713 100644 --- a/.github/workflows/build-and-test.yml +++ b/.github/workflows/build-and-test.yml @@ -40,10 +40,16 @@ jobs: - name: stackql version run: stackql --version - # The spec is unversioned upstream; a hash change alone is not a - # failure. New or removed operations surface in validate-mappings. - - name: Fetch the spec (reports drift against the recorded pin) - run: make fetch-spec + # Build from the COMMITTED spec snapshot so the run is reproducible + # (Vercel republishes its unversioned document continuously). Upstream + # drift is reported as a warning here; the spec-drift job below opens + # the review issue. Refresh locally with `make build` and commit the + # snapshot, pin, manifest and generated provider together. + - name: Check the committed spec snapshot against upstream (warns on drift) + run: | + if ! make check-spec; then + echo "::warning title=Vercel OpenAPI spec drift::The served document no longer matches provider-dev/config/spec_pin.json - run 'make build && make test' locally, review the diff, and commit. Building from the committed snapshot." + fi - name: Split, merge and validate the mapping manifest run: make split mappings validate-mappings diff --git a/.gitignore b/.gitignore index e24a5bb..8b32ae6 100644 --- a/.gitignore +++ b/.gitignore @@ -36,11 +36,11 @@ website/.shared-config/ *.tmp *.bak -# The Vercel OpenAPI document is large (~10 MB) and unversioned upstream; -# it is fetched by `make fetch-spec` and recorded by hash, version and -# operation counts in provider-dev/config/spec_pin.json (committed). -provider-dev/downloaded/* -!provider-dev/downloaded/.gitkeep +# The Vercel OpenAPI document snapshot in provider-dev/downloaded/ IS +# committed: Vercel serves a single unversioned document that changes +# continuously, so the snapshot (plus the hash pin in +# provider-dev/config/spec_pin.json) is what makes a CI build reproducible +# and every refresh a reviewable diff. # transient analyze output merged into all_services.csv by `make mappings` provider-dev/config/.analyze/ diff --git a/CLAUDE.md b/CLAUDE.md index 0789507..e0117ef 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -21,7 +21,7 @@ bin/ # fetch-spec.sh, start-server.sh, stop-server.sh, provider-dev/ config/all_services.csv # THE durable operation -> resource/method/verb manifest (hand-maintained, checked in) config/spec_pin.json # what the provider was built from (date, hash, counts) - downloaded/openapi.json # fetched spec (gitignored, ~10 MB) + downloaded/openapi.json # committed spec snapshot (~10 MB); CI builds from it, `make fetch-spec` refreshes it source/ # split per-service specs (build artifacts) openapi/src/vercel/ # generated provider (checked in) scripts/svc-discriminator.mjs # tag -> service map for the split diff --git a/NOTES.md b/NOTES.md index 7e6219e..56280c1 100644 --- a/NOTES.md +++ b/NOTES.md @@ -4,7 +4,7 @@ Findings recorded while building the refreshed `vercel` provider (September 2026 ## Spec source -- Vercel serves one unversioned OpenAPI 3.0.3 document at `https://openapi.vercel.sh/` (`info.version` is `0.0.1`). It changes continuously; `bin/fetch-spec.sh` records the sha256, date and counts in `provider-dev/config/spec_pin.json` rather than committing the 10 MB document. Snapshot used for this build: 297 paths, 417 operations, 42 tags. +- Vercel serves one unversioned OpenAPI 3.0.3 document at `https://openapi.vercel.sh/` (`info.version` is `0.0.1`). It changes continuously - schema-only changes to eight services landed within hours of the first build - so the snapshot in `provider-dev/downloaded/openapi.json` is committed alongside the sha256, date and counts in `provider-dev/config/spec_pin.json`, and CI builds from the snapshot (drift is a warning on push and an issue from the weekly job). Snapshot used for this build: 297 paths, 417 operations, 42 tags. - Four HEAD operations (artifact exists, marketplace experimentation config, container registry blob and manifest heads) are outside the generator's verb set and are not mapped. - 8 operations carry no tag (`/domains/records`, `/api-keys`, `/v2/observability/*`, `/speed-insights/toggle`, `/web/insights/toggle`); the discriminator routes them by path prefix. diff --git a/README.md b/README.md index 3b033d7..97f6488 100644 --- a/README.md +++ b/README.md @@ -47,7 +47,7 @@ VERCEL_TEAM_ID=... # optional; the token's default team is used otherwise make fetch-spec # or: npm run fetch-spec ``` -Downloads the OpenAPI document into `provider-dev/downloaded/openapi.json` (gitignored, about 10 MB) and records the fetch date, stated version, path / operation / tag counts and sha256 in `provider-dev/config/spec_pin.json`. Drift from the recorded pin is reported, not fatal: the mapping validation below is what turns upstream change into a reviewed decision. `make check-spec` fails on drift for CI. +Downloads the OpenAPI document into `provider-dev/downloaded/openapi.json` and records the fetch date, stated version, path / operation / tag counts and sha256 in `provider-dev/config/spec_pin.json`. Both are committed: Vercel republishes a single unversioned document continuously, so the snapshot is what makes a build reproducible and a refresh a reviewable diff. Drift from the recorded pin is reported, not fatal: the mapping validation below is what turns upstream change into a reviewed decision. `make check-spec` fails on drift (the scheduled CI job uses it). After a refresh, commit the snapshot, the pin, the manifest and the generated provider together. ## 1. Split into service specs @@ -152,7 +152,7 @@ SELECT id, name, framework FROM vercel.projects.projects WHERE team_id = 'team_x ### CI -[.github/workflows/build-and-test.yml](.github/workflows/build-and-test.yml): fetch the spec, split, merge mappings, validate, normalize, generate and fail on uncommitted generation drift; offline validation, meta-route suite and docs generation on every push and pull request; the secret-gated live smoke suite on pushes; and a weekly spec-drift job that opens an issue when upstream adds or removes operations. The web workflows build and deploy the microsite from `main`. +[.github/workflows/build-and-test.yml](.github/workflows/build-and-test.yml): build from the committed spec snapshot (warning only if upstream has drifted), split, merge mappings, validate, normalize, generate and fail on uncommitted generation drift; offline validation, meta-route suite and docs generation on every push and pull request; the secret-gated live smoke suite on pushes; and a weekly spec-drift job that opens an issue when the served document changes. The web workflows build and deploy the microsite from `main`. ## 6. Publish the provider diff --git a/provider-dev/downloaded/openapi.json b/provider-dev/downloaded/openapi.json new file mode 100644 index 0000000..00e5143 --- /dev/null +++ b/provider-dev/downloaded/openapi.json @@ -0,0 +1,248684 @@ +{ + "openapi": "3.0.3", + "info": { + "title": "Vercel API", + "description": "Vercel combines the best developer experience with an obsessive focus on end-user performance. Our platform enables frontend teams to do their best work.", + "contact": { + "email": "support@vercel.com", + "name": "Vercel Support", + "url": "https://vercel.com/support" + }, + "version": "0.0.1" + }, + "servers": [ + { + "url": "https://api.vercel.com", + "description": "Production API" + } + ], + "paths": { + "/v1/access-groups/{idOrName}": { + "get": { + "description": "Allows to read an access group", + "operationId": "readAccessGroup", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Reads an access group", + "tags": [ + "access-groups" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "teamPermissions": { + "items": { + "type": "string", + "enum": [ + "AiGatewayApiKeyOwnedBySelf", + "AiGatewayBudgetManager", + "AiGatewayCredits", + "AiGatewaySettings", + "AiGatewayTranscriptsManager", + "AiGatewayTranscriptsViewer", + "ConnectorManager", + "CreateProject", + "EnvVariableManager", + "EnvironmentManager", + "FullProductionDeployment", + "IntegrationManager", + "OrgAdmin", + "OrgViewer", + "UsageViewer", + "V0Builder", + "V0Chatter", + "V0Viewer", + "WorkflowDecryptor" + ] + }, + "type": "array" + }, + "entitlements": { + "items": { + "type": "string", + "enum": [ + "v0" + ] + }, + "type": "array" + }, + "isDsyncManaged": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "name": { + "type": "string", + "description": "The name of this access group.", + "example": "my-access-group" + }, + "createdAt": { + "type": "string", + "description": "Timestamp in milliseconds when the access group was created.", + "example": 1588720733602 + }, + "teamId": { + "type": "string", + "description": "ID of the team that this access group belongs to.", + "example": "team_123a6c5209bc3778245d011443644c8d27dc2c50" + }, + "updatedAt": { + "type": "string", + "description": "Timestamp in milliseconds when the access group was last updated.", + "example": 1588720733602 + }, + "accessGroupId": { + "type": "string", + "description": "ID of the access group.", + "example": "ag_123a6c5209bc3778245d011443644c8d27dc2c50" + }, + "membersCount": { + "type": "number", + "description": "Number of members in the access group.", + "example": 5 + }, + "projectsCount": { + "type": "number", + "description": "Number of projects in the access group.", + "example": 2 + }, + "teamRoles": { + "items": { + "type": "string" + }, + "type": "array", + "description": "Roles that the team has in the access group.", + "example": [ + "DEVELOPER", + "BILLING" + ] + } + }, + "required": [ + "accessGroupId", + "createdAt", + "isDsyncManaged", + "membersCount", + "name", + "projectsCount", + "teamId", + "updatedAt" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "410": { + "description": "" + } + }, + "x-vercel-cli": { + "supportedSubcommands": true, + "supportedProduction": false, + "aliases": [ + "read", + "get" + ] + }, + "parameters": [ + { + "name": "idOrName", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "x-vercel-cli": { + "kind": "argument" + }, + "examples": { + "id": { + "summary": "Access group ID", + "value": "ag_1a2b3c4d5e6f7g8h9i0j" + }, + "name": { + "summary": "Access group name", + "value": "My Access Group" + } + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + }, + "post": { + "description": "Allows to update an access group metadata", + "operationId": "updateAccessGroup", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Update an access group", + "tags": [ + "access-groups" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "entitlements": { + "items": { + "type": "string", + "enum": [ + "v0" + ] + }, + "type": "array" + }, + "name": { + "type": "string", + "description": "The name of this access group.", + "example": "my-access-group" + }, + "createdAt": { + "type": "string", + "description": "Timestamp in milliseconds when the access group was created.", + "example": 1588720733602 + }, + "teamId": { + "type": "string", + "description": "ID of the team that this access group belongs to.", + "example": "team_123a6c5209bc3778245d011443644c8d27dc2c50" + }, + "updatedAt": { + "type": "string", + "description": "Timestamp in milliseconds when the access group was last updated.", + "example": 1588720733602 + }, + "accessGroupId": { + "type": "string", + "description": "ID of the access group.", + "example": "ag_123a6c5209bc3778245d011443644c8d27dc2c50" + }, + "membersCount": { + "type": "number", + "description": "Number of members in the access group.", + "example": 5 + }, + "projectsCount": { + "type": "number", + "description": "Number of projects in the access group.", + "example": 2 + }, + "teamRoles": { + "items": { + "type": "string" + }, + "type": "array", + "description": "Roles that the team has in the access group.", + "example": [ + "DEVELOPER", + "BILLING" + ] + }, + "teamPermissions": { + "items": { + "type": "string" + }, + "type": "array", + "description": "Permissions that the team has in the access group.", + "example": [ + "CreateProject" + ] + } + }, + "required": [ + "accessGroupId", + "createdAt", + "entitlements", + "membersCount", + "name", + "projectsCount", + "teamId", + "updatedAt" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid.\nOne of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "idOrName", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "additionalProperties": false, + "properties": { + "name": { + "type": "string", + "description": "The name of the access group", + "maxLength": 50, + "pattern": "^[A-z0-9_ -]+$", + "example": "My access group" + }, + "projects": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "required": [ + "role", + "projectId" + ], + "properties": { + "projectId": { + "type": "string", + "maxLength": 256, + "example": "prj_ndlgr43fadlPyCtREAqxxdyFK", + "description": "The ID of the project." + }, + "role": { + "type": "string", + "example": "ADMIN", + "description": "The project role that will be added to this Access Group. \"null\" will remove this project level role.", + "nullable": true, + "enum": [ + "ADMIN", + "PROJECT_VIEWER", + "PROJECT_DEVELOPER", + null + ] + } + } + } + }, + "membersToAdd": { + "description": "List of members to add to the access group.", + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "usr_1a2b3c4d5e6f7g8h9i0j", + "usr_2b3c4d5e6f7g8h9i0j1k" + ] + }, + "membersToRemove": { + "description": "List of members to remove from the access group.", + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "usr_1a2b3c4d5e6f7g8h9i0j", + "usr_2b3c4d5e6f7g8h9i0j1k" + ] + } + } + } + } + }, + "required": true + } + }, + "delete": { + "description": "Allows to delete an access group", + "operationId": "deleteAccessGroup", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Deletes an access group", + "tags": [ + "access-groups" + ], + "responses": { + "200": { + "description": "" + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "idOrName", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + } + }, + "/v1/access-groups/{idOrName}/members": { + "get": { + "description": "List members of an access group", + "operationId": "listAccessGroupMembers", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "List members of an access group", + "tags": [ + "access-groups" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "members": { + "items": { + "properties": { + "avatar": { + "type": "string" + }, + "email": { + "type": "string" + }, + "uid": { + "type": "string" + }, + "username": { + "type": "string" + }, + "name": { + "type": "string" + }, + "createdAt": { + "type": "string" + }, + "teamRole": { + "type": "string", + "enum": [ + "BILLING", + "CONTRIBUTOR", + "DEVELOPER", + "MEMBER", + "OWNER", + "SECURITY", + "VIEWER", + "VIEWER_FOR_PLUS" + ] + } + }, + "required": [ + "email", + "teamRole", + "uid", + "username" + ], + "type": "object" + }, + "type": "array" + }, + "pagination": { + "properties": { + "count": { + "type": "number" + }, + "next": { + "nullable": true, + "type": "string" + } + }, + "required": [ + "count", + "next" + ], + "type": "object" + } + }, + "required": [ + "members", + "pagination" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "idOrName", + "description": "The ID or name of the Access Group.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "description": "The ID or name of the Access Group.", + "example": "ag_pavWOn1iLObbXLRiwVvzmPrTWyTf" + } + }, + { + "name": "limit", + "description": "Limit how many access group members should be returned.", + "in": "query", + "required": false, + "schema": { + "description": "Limit how many access group members should be returned.", + "example": 20, + "type": "integer", + "minimum": 1, + "maximum": 100 + } + }, + { + "name": "next", + "description": "Continuation cursor to retrieve the next page of results.", + "in": "query", + "required": false, + "schema": { + "description": "Continuation cursor to retrieve the next page of results.", + "type": "string" + } + }, + { + "name": "search", + "description": "Search project members by their name, username, and email.", + "in": "query", + "required": false, + "schema": { + "description": "Search project members by their name, username, and email.", + "type": "string" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + } + }, + "/v1/access-groups": { + "get": { + "description": "List access groups", + "operationId": "listAccessGroups", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "List access groups for a team, project or member", + "tags": [ + "access-groups" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "oneOf": [ + { + "type": "object" + }, + { + "properties": { + "accessGroups": { + "items": { + "properties": { + "members": { + "items": { + "type": "string" + }, + "type": "array" + }, + "projects": { + "items": { + "type": "string" + }, + "type": "array" + }, + "entitlements": { + "items": { + "type": "string" + }, + "type": "array" + }, + "teamPermissions": { + "items": { + "type": "string" + }, + "type": "array" + }, + "isDsyncManaged": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "name": { + "type": "string", + "description": "The name of this access group.", + "example": "my-access-group" + }, + "createdAt": { + "type": "string", + "description": "Timestamp in milliseconds when the access group was created.", + "example": 1588720733602 + }, + "teamId": { + "type": "string", + "description": "ID of the team that this access group belongs to.", + "example": "team_123a6c5209bc3778245d011443644c8d27dc2c50" + }, + "updatedAt": { + "type": "string", + "description": "Timestamp in milliseconds when the access group was last updated.", + "example": 1588720733602 + }, + "accessGroupId": { + "type": "string", + "description": "ID of the access group.", + "example": "ag_123a6c5209bc3778245d011443644c8d27dc2c50" + }, + "membersCount": { + "type": "number", + "description": "Number of members in the access group.", + "example": 5 + }, + "projectsCount": { + "type": "number", + "description": "Number of projects in the access group.", + "example": 2 + }, + "teamRoles": { + "items": { + "type": "string" + }, + "type": "array", + "description": "Roles that the team has in the access group.", + "example": [ + "DEVELOPER", + "BILLING" + ] + } + }, + "required": [ + "accessGroupId", + "createdAt", + "isDsyncManaged", + "membersCount", + "name", + "projectsCount", + "teamId", + "updatedAt" + ], + "type": "object" + }, + "type": "array" + }, + "pagination": { + "properties": { + "count": { + "type": "number" + }, + "next": { + "nullable": true, + "type": "string" + } + }, + "required": [ + "count", + "next" + ], + "type": "object" + } + }, + "required": [ + "accessGroups", + "pagination" + ], + "type": "object" + } + ] + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "410": { + "description": "" + } + }, + "x-vercel-cli": { + "supportedSubcommands": true, + "supportedProduction": false, + "aliases": [ + "list" + ] + }, + "parameters": [ + { + "name": "projectId", + "description": "Filter access groups by project.", + "in": "query", + "schema": { + "description": "Filter access groups by project.", + "example": "prj_pavWOn1iLObbx3RowVvzmPrTWyTf", + "type": "string" + } + }, + { + "name": "search", + "description": "Search for access groups by name.", + "in": "query", + "schema": { + "description": "Search for access groups by name.", + "example": "example", + "type": "string" + } + }, + { + "name": "membersLimit", + "description": "Number of members to include in the response.", + "in": "query", + "schema": { + "description": "Number of members to include in the response.", + "example": 20, + "type": "integer", + "minimum": 1, + "maximum": 100 + } + }, + { + "name": "projectsLimit", + "description": "Number of projects to include in the response.", + "in": "query", + "schema": { + "description": "Number of projects to include in the response.", + "example": 20, + "type": "integer", + "minimum": 1, + "maximum": 100 + } + }, + { + "name": "limit", + "description": "Limit how many access group should be returned.", + "in": "query", + "schema": { + "description": "Limit how many access group should be returned.", + "example": 20, + "type": "integer", + "minimum": 1, + "maximum": 100 + } + }, + { + "name": "next", + "description": "Continuation cursor to retrieve the next page of results.", + "in": "query", + "schema": { + "description": "Continuation cursor to retrieve the next page of results.", + "type": "string" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + }, + "post": { + "description": "Allows to create an access group", + "operationId": "createAccessGroup", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Creates an access group", + "tags": [ + "access-groups" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "entitlements": { + "items": { + "type": "string", + "enum": [ + "v0" + ] + }, + "type": "array" + }, + "membersCount": { + "type": "number" + }, + "projectsCount": { + "type": "number" + }, + "name": { + "type": "string", + "description": "The name of this access group.", + "example": "my-access-group" + }, + "createdAt": { + "type": "string", + "description": "Timestamp in milliseconds when the access group was created.", + "example": 1588720733602 + }, + "teamId": { + "type": "string", + "description": "ID of the team that this access group belongs to.", + "example": "team_123a6c5209bc3778245d011443644c8d27dc2c50" + }, + "updatedAt": { + "type": "string", + "description": "Timestamp in milliseconds when the access group was last updated.", + "example": 1588720733602 + }, + "accessGroupId": { + "type": "string", + "description": "ID of the access group.", + "example": "ag_123a6c5209bc3778245d011443644c8d27dc2c50" + }, + "teamRoles": { + "items": { + "type": "string" + }, + "type": "array", + "description": "Roles that the team has in the access group.", + "example": [ + "DEVELOPER", + "BILLING" + ] + }, + "teamPermissions": { + "items": { + "type": "string" + }, + "type": "array", + "description": "Permissions that the team has in the access group.", + "example": [ + "CreateProject" + ] + } + }, + "required": [ + "accessGroupId", + "createdAt", + "entitlements", + "membersCount", + "name", + "projectsCount", + "teamId", + "updatedAt" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "additionalProperties": false, + "required": [ + "name" + ], + "properties": { + "name": { + "type": "string", + "description": "The name of the access group", + "maxLength": 50, + "pattern": "^[A-z0-9_ -]+$", + "example": "My access group" + }, + "projects": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "required": [ + "role", + "projectId" + ], + "properties": { + "projectId": { + "type": "string", + "maxLength": 256, + "example": "prj_ndlgr43fadlPyCtREAqxxdyFK", + "description": "The ID of the project." + }, + "role": { + "type": "string", + "example": "ADMIN", + "description": "The project role that will be added to this Access Group. \"null\" will remove this project level role.", + "nullable": true, + "enum": [ + "ADMIN", + "PROJECT_VIEWER", + "PROJECT_DEVELOPER", + null + ] + } + } + } + }, + "membersToAdd": { + "description": "List of members to add to the access group.", + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "usr_1a2b3c4d5e6f7g8h9i0j", + "usr_2b3c4d5e6f7g8h9i0j1k" + ] + } + } + } + } + }, + "required": true + } + } + }, + "/v1/access-groups/{idOrName}/projects": { + "get": { + "description": "List projects of an access group", + "operationId": "listAccessGroupProjects", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "List projects of an access group", + "tags": [ + "access-groups" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "projects": { + "items": { + "properties": { + "projectId": { + "type": "string" + }, + "role": { + "type": "string", + "enum": [ + "ADMIN", + "PROJECT_DEVELOPER", + "PROJECT_GUEST", + "PROJECT_VIEWER" + ] + }, + "createdAt": { + "type": "string" + }, + "updatedAt": { + "type": "string" + }, + "project": { + "properties": { + "name": { + "type": "string" + }, + "framework": { + "nullable": true, + "type": "string" + }, + "latestDeploymentId": { + "type": "string" + } + }, + "type": "object" + } + }, + "required": [ + "createdAt", + "project", + "projectId", + "role", + "updatedAt" + ], + "type": "object" + }, + "type": "array" + }, + "pagination": { + "properties": { + "count": { + "type": "number" + }, + "next": { + "nullable": true, + "type": "string" + } + }, + "required": [ + "count", + "next" + ], + "type": "object" + } + }, + "required": [ + "pagination", + "projects" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "idOrName", + "description": "The ID or name of the Access Group.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "description": "The ID or name of the Access Group.", + "example": "ag_pavWOn1iLObbXLRiwVvzmPrTWyTf" + } + }, + { + "name": "limit", + "description": "Limit how many access group projects should be returned.", + "in": "query", + "required": false, + "schema": { + "description": "Limit how many access group projects should be returned.", + "example": 20, + "type": "integer", + "minimum": 1, + "maximum": 100 + } + }, + { + "name": "next", + "description": "Continuation cursor to retrieve the next page of results.", + "in": "query", + "required": false, + "schema": { + "description": "Continuation cursor to retrieve the next page of results.", + "type": "string" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + } + }, + "/v1/access-groups/{accessGroupIdOrName}/projects": { + "post": { + "description": "Allows creation of an access group project", + "operationId": "createAccessGroupProject", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Create an access group project", + "tags": [ + "access-groups" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "teamId": { + "type": "string" + }, + "accessGroupId": { + "type": "string" + }, + "projectId": { + "type": "string" + }, + "role": { + "type": "string", + "enum": [ + "ADMIN", + "PROJECT_DEVELOPER", + "PROJECT_GUEST", + "PROJECT_VIEWER" + ] + }, + "createdAt": { + "type": "string" + }, + "updatedAt": { + "type": "string" + } + }, + "required": [ + "accessGroupId", + "createdAt", + "projectId", + "role", + "teamId", + "updatedAt" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid.\nOne of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "accessGroupIdOrName", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "additionalProperties": false, + "required": [ + "role", + "projectId" + ], + "properties": { + "projectId": { + "type": "string", + "maxLength": 256, + "example": "prj_ndlgr43fadlPyCtREAqxxdyFK", + "description": "The ID of the project." + }, + "role": { + "type": "string", + "example": "ADMIN", + "description": "The project role that will be added to this Access Group.", + "enum": [ + "ADMIN", + "PROJECT_VIEWER", + "PROJECT_DEVELOPER" + ] + } + } + } + } + }, + "required": true + } + } + }, + "/v1/access-groups/{accessGroupIdOrName}/projects/{projectId}": { + "get": { + "description": "Allows reading an access group project", + "operationId": "readAccessGroupProject", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Reads an access group project", + "tags": [ + "access-groups" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "teamId": { + "type": "string" + }, + "accessGroupId": { + "type": "string" + }, + "projectId": { + "type": "string" + }, + "role": { + "type": "string", + "enum": [ + "ADMIN", + "PROJECT_DEVELOPER", + "PROJECT_GUEST", + "PROJECT_VIEWER" + ] + }, + "createdAt": { + "type": "string" + }, + "updatedAt": { + "type": "string" + } + }, + "required": [ + "accessGroupId", + "createdAt", + "projectId", + "role", + "teamId", + "updatedAt" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "accessGroupIdOrName", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "examples": { + "id": { + "summary": "Access group ID", + "value": "ag_1a2b3c4d5e6f7g8h9i0j" + }, + "name": { + "summary": "Access group name", + "value": "My Access Group" + } + } + }, + { + "name": "projectId", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "example": "prj_ndlgr43fadlPyCtREAqxxdyFK" + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + }, + "patch": { + "description": "Allows update of an access group project", + "operationId": "updateAccessGroupProject", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Update an access group project", + "tags": [ + "access-groups" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "teamId": { + "type": "string" + }, + "accessGroupId": { + "type": "string" + }, + "projectId": { + "type": "string" + }, + "role": { + "type": "string", + "enum": [ + "ADMIN", + "PROJECT_DEVELOPER", + "PROJECT_GUEST", + "PROJECT_VIEWER" + ] + }, + "createdAt": { + "type": "string" + }, + "updatedAt": { + "type": "string" + } + }, + "required": [ + "accessGroupId", + "createdAt", + "projectId", + "role", + "teamId", + "updatedAt" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid.\nOne of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "accessGroupIdOrName", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "examples": { + "id": { + "summary": "Access group ID", + "value": "ag_1a2b3c4d5e6f7g8h9i0j" + }, + "name": { + "summary": "Access group name", + "value": "My Access Group" + } + } + }, + { + "name": "projectId", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "example": "prj_ndlgr43fadlPyCtREAqxxdyFK" + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "additionalProperties": false, + "required": [ + "role" + ], + "properties": { + "role": { + "type": "string", + "example": "ADMIN", + "description": "The project role that will be added to this Access Group.", + "enum": [ + "ADMIN", + "PROJECT_VIEWER", + "PROJECT_DEVELOPER", + null + ] + } + } + } + } + }, + "required": true + } + }, + "delete": { + "description": "Allows deletion of an access group project", + "operationId": "deleteAccessGroupProject", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Delete an access group project", + "tags": [ + "access-groups" + ], + "responses": { + "200": { + "description": "" + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "accessGroupIdOrName", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "examples": { + "id": { + "summary": "Access group ID", + "value": "ag_1a2b3c4d5e6f7g8h9i0j" + }, + "name": { + "summary": "Access group name", + "value": "My Access Group" + } + } + }, + { + "name": "projectId", + "in": "path", + "required": true, + "schema": { + "type": "string" + }, + "example": "prj_ndlgr43fadlPyCtREAqxxdyFK" + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + } + }, + "/v1/ai-gateway/virtual-model-configs": { + "post": { + "description": "Create a virtual model config (VMC)", + "operationId": "createAiGatewayVirtualModelConfig", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Create virtual model config", + "tags": [ + "api-ai-gateway" + ], + "responses": { + "201": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AiGatewayVirtualModelConfig" + } + } + } + }, + "400": { + "description": "" + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "409": { + "description": "" + }, + "410": { + "description": "" + }, + "429": { + "description": "" + }, + "500": { + "description": "" + } + }, + "parameters": [ + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + }, + "get": { + "description": "Get a virtual model config", + "operationId": "getAiGatewayVirtualModelConfig", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Get virtual model config", + "tags": [ + "api-ai-gateway" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "oneOf": [ + { + "$ref": "#/components/schemas/AiGatewayVirtualModelConfig" + }, + { + "$ref": "#/components/schemas/AiGatewayVirtualModelConfigList" + } + ] + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + }, + "500": { + "description": "" + } + }, + "parameters": [ + { + "name": "ownerId", + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "virtualModelSlug", + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "limit", + "in": "query", + "schema": { + "type": "integer", + "minimum": 1 + } + }, + { + "name": "cursor", + "in": "query", + "schema": { + "type": "string" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + }, + "patch": { + "description": "Update a virtual model config", + "operationId": "updateAiGatewayVirtualModelConfig", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Update virtual model config", + "tags": [ + "api-ai-gateway" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AiGatewayVirtualModelConfig" + } + } + } + }, + "400": { + "description": "" + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + }, + "500": { + "description": "" + } + }, + "parameters": [ + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + }, + "delete": { + "description": "Delete a virtual model config (soft delete)", + "operationId": "deleteAiGatewayVirtualModelConfig", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Delete virtual model config", + "tags": [ + "api-ai-gateway" + ], + "responses": { + "204": { + "description": "", + "content": { + "application/json": { + "schema": { + "nullable": true + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + }, + "500": { + "description": "" + } + }, + "parameters": [ + { + "name": "ownerId", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "virtualModelSlug", + "in": "query", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "updatedBy", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "actingIp", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "actingUserAgent", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + } + }, + "/v1/ai-gateway/virtual-model-configs/list": { + "get": { + "description": "List virtual model configs. With `ownerId`, returns all of that team's VMCs. Without it, pages through VMCs across all teams (newest-first, `limit`/`cursor`).", + "operationId": "listAiGatewayVirtualModelConfigs", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "List virtual model configs", + "tags": [ + "api-ai-gateway" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AiGatewayVirtualModelConfigList" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "410": { + "description": "" + }, + "500": { + "description": "" + } + }, + "parameters": [ + { + "name": "ownerId", + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "limit", + "in": "query", + "schema": { + "type": "integer", + "minimum": 1 + } + }, + { + "name": "cursor", + "in": "query", + "schema": { + "type": "string" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + } + }, + "/v1/ai-gateway/virtual-model-configs/{vmcSlug}": { + "get": { + "description": "Get a virtual model config by path slug", + "operationId": "getAiGatewayVirtualModelConfigBySlug", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Get virtual model config", + "tags": [ + "api-ai-gateway" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AiGatewayVirtualModelConfig" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + }, + "500": { + "description": "" + } + }, + "parameters": [ + { + "name": "ownerId", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "vmcSlug", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + }, + "patch": { + "description": "Update a virtual model config by path slug", + "operationId": "updateAiGatewayVirtualModelConfigBySlug", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Update virtual model config", + "tags": [ + "api-ai-gateway" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AiGatewayVirtualModelConfig" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + }, + "500": { + "description": "" + } + }, + "parameters": [ + { + "name": "vmcSlug", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + }, + "delete": { + "description": "Delete a virtual model config by path slug (soft delete)", + "operationId": "deleteAiGatewayVirtualModelConfigBySlug", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Delete virtual model config", + "tags": [ + "api-ai-gateway" + ], + "responses": { + "204": { + "description": "", + "content": { + "application/json": { + "schema": { + "nullable": true + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + }, + "500": { + "description": "" + } + }, + "parameters": [ + { + "name": "ownerId", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "vmcSlug", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "updatedBy", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "actingIp", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "actingUserAgent", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + } + }, + "/v1/ai-gateway/rules": { + "post": { + "description": "Create a routing rule", + "operationId": "createAiGatewayRule", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Create rule", + "tags": [ + "ai-gateway" + ], + "responses": { + "201": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AiGatewayRule" + } + } + } + }, + "400": { + "description": "" + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "409": { + "description": "" + }, + "410": { + "description": "" + }, + "500": { + "description": "" + } + }, + "parameters": [ + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + }, + "get": { + "description": "List the authenticated team's routing rules", + "operationId": "listAiGatewayRules", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "List rules", + "tags": [ + "ai-gateway" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AiGatewayRuleList" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "410": { + "description": "" + }, + "500": { + "description": "" + } + }, + "parameters": [ + { + "name": "includeDisabled", + "in": "query", + "schema": { + "type": "string", + "enum": [ + "true", + "false" + ] + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + }, + "patch": { + "description": "Update a routing rule (enabled, action, or description)", + "operationId": "updateAiGatewayRule", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Update rule", + "tags": [ + "ai-gateway" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AiGatewayRule" + } + } + } + }, + "400": { + "description": "" + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + }, + "500": { + "description": "" + } + }, + "parameters": [ + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + }, + "delete": { + "description": "Delete a routing rule (soft delete)", + "operationId": "deleteAiGatewayRule", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Delete rule", + "tags": [ + "ai-gateway" + ], + "responses": { + "204": { + "description": "", + "content": { + "application/json": { + "schema": { + "nullable": true + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + }, + "500": { + "description": "" + } + }, + "parameters": [ + { + "name": "ruleId", + "in": "query", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + } + }, + "/v8/artifacts/events": { + "post": { + "description": "Records an artifacts cache usage event. The body of this request is an array of cache usage events. The supported event types are `HIT` and `MISS`. The source is either `LOCAL` the cache event was on the users filesystem cache or `REMOTE` if the cache event is for a remote cache. When the event is a `HIT` the request also accepts a number `duration` which is the time taken to generate the artifact in the cache.", + "operationId": "recordEvents", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Record an artifacts cache usage event", + "tags": [ + "artifacts" + ], + "responses": { + "200": { + "description": "Success. Event recorded." + }, + "400": { + "description": "One of the provided values in the request body is invalid.\nOne of the provided values in the headers is invalid" + }, + "401": { + "description": "The request is not authorized." + }, + "402": { + "description": "The account is missing a payment so payment method must be updated" + }, + "403": { + "description": "The customer has reached their spend cap limit and has been paused. An owner can disable the cap or raise the limit in settings.\nThe Remote Caching usage limit has been reached for this account for this billing cycle.\nRemote Caching has been disabled for this team or user. An owner can enable it in the billing settings.\nYou do not have permission to access this resource." + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "in": "header", + "description": "The continuous integration or delivery environment where this artifact is downloaded.", + "schema": { + "type": "string", + "description": "The continuous integration or delivery environment where this artifact is downloaded.", + "example": "VERCEL", + "maxLength": 50 + }, + "name": "x-artifact-client-ci" + }, + { + "in": "header", + "description": "1 if the client is an interactive shell. Otherwise 0", + "schema": { + "type": "integer", + "description": "1 if the client is an interactive shell. Otherwise 0", + "example": 0, + "minimum": 0, + "maximum": 1 + }, + "name": "x-artifact-client-interactive" + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "required": [ + "sessionId", + "source", + "hash", + "event" + ], + "properties": { + "sessionId": { + "type": "string", + "description": "A UUID (universally unique identifer) for the session that generated this event." + }, + "source": { + "type": "string", + "enum": [ + "LOCAL", + "REMOTE" + ], + "description": "One of `LOCAL` or `REMOTE`. `LOCAL` specifies that the cache event was from the user's filesystem cache. `REMOTE` specifies that the cache event is from a remote cache." + }, + "event": { + "type": "string", + "enum": [ + "HIT", + "MISS" + ], + "description": "One of `HIT` or `MISS`. `HIT` specifies that a cached artifact for `hash` was found in the cache. `MISS` specifies that a cached artifact with `hash` was not found." + }, + "hash": { + "type": "string", + "example": "12HKQaOmR5t5Uy6vdcQsNIiZgHGB", + "description": "The artifact hash" + }, + "duration": { + "type": "number", + "description": "The time taken to generate the artifact. This should be sent as a body parameter on `HIT` events.", + "example": 400 + } + } + } + } + } + }, + "required": true + } + } + }, + "/v8/artifacts/status": { + "get": { + "description": "Check the status of Remote Caching for this principal. Returns a JSON-encoded status indicating if Remote Caching is enabled, disabled, or disabled due to usage limits.", + "operationId": "status", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Get status of Remote Caching for this principal", + "tags": [ + "artifacts" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "oneOf": [ + { + "properties": { + "status": { + "type": "string" + } + }, + "required": [ + "status" + ], + "type": "object" + }, + { + "properties": { + "status": { + "type": "string", + "enum": [ + "disabled", + "enabled", + "over_limit", + "paused" + ] + } + }, + "required": [ + "status" + ], + "type": "object" + } + ] + } + } + } + }, + "400": { + "description": "" + }, + "401": { + "description": "The request is not authorized." + }, + "402": { + "description": "The account is missing a payment so payment method must be updated" + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + } + }, + "/v8/artifacts/{hash}": { + "put": { + "description": "Uploads a cache artifact identified by the `hash` specified on the path. The cache artifact can then be downloaded with the provided `hash`.", + "operationId": "uploadArtifact", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Upload a cache artifact", + "tags": [ + "artifacts" + ], + "responses": { + "202": { + "description": "File successfully uploaded", + "content": { + "application/json": { + "schema": { + "properties": { + "urls": { + "items": { + "type": "string" + }, + "type": "array", + "description": "Array of URLs where the artifact was updated", + "example": [ + "https://api.vercel.com/v2/now/artifact/12HKQaOmR5t5Uy6vdcQsNIiZgHGB" + ] + } + }, + "required": [ + "urls" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid.\nOne of the provided values in the headers is invalid\nFile size is not valid" + }, + "401": { + "description": "The request is not authorized." + }, + "402": { + "description": "The account is missing a payment so payment method must be updated" + }, + "403": { + "description": "The customer has reached their spend cap limit and has been paused. An owner can disable the cap or raise the limit in settings.\nThe Remote Caching usage limit has been reached for this account for this billing cycle.\nRemote Caching has been disabled for this team or user. An owner can enable it in the billing settings.\nYou do not have permission to access this resource." + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "in": "header", + "description": "The artifact size in bytes", + "required": true, + "schema": { + "description": "The artifact size in bytes", + "type": "number" + }, + "name": "Content-Length" + }, + { + "in": "header", + "description": "The time taken to generate the uploaded artifact in milliseconds.", + "required": false, + "schema": { + "type": "number", + "description": "The time taken to generate the uploaded artifact in milliseconds.", + "example": 400 + }, + "name": "x-artifact-duration" + }, + { + "in": "header", + "description": "The continuous integration or delivery environment where this artifact was generated.", + "required": false, + "schema": { + "type": "string", + "description": "The continuous integration or delivery environment where this artifact was generated.", + "example": "VERCEL", + "maxLength": 50 + }, + "name": "x-artifact-client-ci" + }, + { + "in": "header", + "description": "1 if the client is an interactive shell. Otherwise 0", + "required": false, + "schema": { + "type": "integer", + "description": "1 if the client is an interactive shell. Otherwise 0", + "example": 0, + "minimum": 0, + "maximum": 1 + }, + "name": "x-artifact-client-interactive" + }, + { + "in": "header", + "description": "The base64 encoded tag for this artifact. The value is sent back to clients when the artifact is downloaded as the header `x-artifact-tag`", + "required": false, + "schema": { + "type": "string", + "description": "The base64 encoded tag for this artifact. The value is sent back to clients when the artifact is downloaded as the header `x-artifact-tag`", + "example": "Tc0BmHvJYMIYJ62/zx87YqO0Flxk+5Ovip25NY825CQ=", + "maxLength": 600 + }, + "name": "x-artifact-tag" + }, + { + "in": "header", + "description": "The SHA of the source control revision that generated this artifact.", + "required": false, + "schema": { + "type": "string", + "description": "The SHA of the source control revision that generated this artifact.", + "maxLength": 200 + }, + "name": "x-artifact-sha" + }, + { + "in": "header", + "description": "A hash representing uncommitted changes in the working directory when this artifact was generated.", + "required": false, + "schema": { + "type": "string", + "description": "A hash representing uncommitted changes in the working directory when this artifact was generated.", + "maxLength": 200 + }, + "name": "x-artifact-dirty-hash" + }, + { + "name": "hash", + "description": "The artifact hash", + "in": "path", + "required": true, + "schema": { + "example": "12HKQaOmR5t5Uy6vdcQsNIiZgHGB", + "description": "The artifact hash", + "type": "string" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/octet-stream": { + "schema": { + "type": "string", + "format": "binary" + } + } + }, + "required": true + }, + "x-speakeasy-test": false + }, + "get": { + "description": "Downloads a cache artifact indentified by its `hash` specified on the request path. The artifact is downloaded as an octet-stream. The client should verify the content-length header and response body.", + "operationId": "downloadArtifact", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Download a cache artifact", + "tags": [ + "artifacts" + ], + "responses": { + "200": { + "description": "The artifact was found and is downloaded as a stream. Content-Length should be verified.", + "content": { + "application/json": { + "schema": { + "type": "string", + "format": "binary", + "description": "An octet stream response that will be piped to the response stream." + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid.\nOne of the provided values in the headers is invalid" + }, + "401": { + "description": "The request is not authorized." + }, + "402": { + "description": "The account is missing a payment so payment method must be updated" + }, + "403": { + "description": "The customer has reached their spend cap limit and has been paused. An owner can disable the cap or raise the limit in settings.\nThe Remote Caching usage limit has been reached for this account for this billing cycle.\nRemote Caching has been disabled for this team or user. An owner can enable it in the billing settings.\nYou do not have permission to access this resource." + }, + "404": { + "description": "The artifact was not found" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "in": "header", + "description": "The continuous integration or delivery environment where this artifact is downloaded.", + "schema": { + "type": "string", + "description": "The continuous integration or delivery environment where this artifact is downloaded.", + "example": "VERCEL", + "maxLength": 50 + }, + "name": "x-artifact-client-ci" + }, + { + "in": "header", + "description": "1 if the client is an interactive shell. Otherwise 0", + "schema": { + "type": "integer", + "description": "1 if the client is an interactive shell. Otherwise 0", + "example": 0, + "minimum": 0, + "maximum": 1 + }, + "name": "x-artifact-client-interactive" + }, + { + "name": "hash", + "description": "The artifact hash", + "in": "path", + "required": true, + "schema": { + "example": "12HKQaOmR5t5Uy6vdcQsNIiZgHGB", + "description": "The artifact hash", + "type": "string" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + }, + "head": { + "description": "Check that a cache artifact with the given `hash` exists. This request returns response headers only and is equivalent to a `GET` request to this endpoint where the response contains no body.", + "operationId": "artifactExists", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Check if a cache artifact exists", + "tags": [ + "artifacts" + ], + "responses": { + "200": { + "description": "The artifact was found and headers are returned" + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "402": { + "description": "The account is missing a payment so payment method must be updated" + }, + "403": { + "description": "The customer has reached their spend cap limit and has been paused. An owner can disable the cap or raise the limit in settings.\nThe Remote Caching usage limit has been reached for this account for this billing cycle.\nRemote Caching has been disabled for this team or user. An owner can enable it in the billing settings.\nYou do not have permission to access this resource." + }, + "404": { + "description": "The artifact was not found" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "hash", + "description": "The artifact hash", + "in": "path", + "required": true, + "schema": { + "example": "12HKQaOmR5t5Uy6vdcQsNIiZgHGB", + "description": "The artifact hash", + "type": "string" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + } + }, + "/v8/artifacts": { + "post": { + "description": "Query information about an array of artifacts.", + "operationId": "artifactQuery", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Query information about an artifact", + "tags": [ + "artifacts" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "additionalProperties": { + "nullable": true, + "oneOf": [ + { + "properties": { + "size": { + "type": "number" + }, + "taskDurationMs": { + "type": "number" + }, + "tag": { + "type": "string" + }, + "sha": { + "type": "string" + }, + "dirtyHash": { + "type": "string" + } + }, + "required": [ + "size", + "taskDurationMs" + ], + "type": "object" + }, + { + "properties": { + "error": { + "properties": { + "message": { + "type": "string" + } + }, + "required": [ + "message" + ], + "type": "object" + } + }, + "required": [ + "error" + ], + "type": "object" + } + ] + }, + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "402": { + "description": "The account is missing a payment so payment method must be updated" + }, + "403": { + "description": "The customer has reached their spend cap limit and has been paused. An owner can disable the cap or raise the limit in settings.\nThe Remote Caching usage limit has been reached for this account for this billing cycle.\nRemote Caching has been disabled for this team or user. An owner can enable it in the billing settings.\nYou do not have permission to access this resource." + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "hashes" + ], + "properties": { + "hashes": { + "items": { + "type": "string" + }, + "description": "artifact hashes", + "type": "array", + "example": [ + "12HKQaOmR5t5Uy6vdcQsNIiZgHGB", + "34HKQaOmR5t5Uy6vasdasdasdasd" + ] + } + } + } + } + }, + "required": true + } + }, + "delete": { + "description": "Deletes all cache artifacts stored for the authenticated team or user, clearing the Remote Cache. Subsequent builds will re-populate the cache.", + "operationId": "deleteAllArtifacts", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Delete all cache artifacts", + "tags": [ + "artifacts" + ], + "responses": { + "200": { + "description": "Success. All cache artifacts for the account were deleted.", + "content": { + "application/json": { + "schema": { + "properties": { + "deletedCount": { + "type": "number" + } + }, + "required": [ + "deletedCount" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "" + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + } + }, + "/v1/billing/charges": { + "get": { + "description": "Returns the billing charge data in FOCUS v1.3 JSONL format for a specified Vercel team, within a date range specified by `from` and `to` query parameters. Supports 1-day granularity with a maximum date range of 1 year. The response is streamed as newline-delimited JSON (JSONL) and can be optionally compressed with gzip if the `Accept-Encoding: gzip` header is provided. This is only available for Owner, Member, Developer, Security, Billing, and Enterprise Viewer roles for the supplied team.", + "operationId": "listBillingCharges", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "List FOCUS billing charges", + "tags": [ + "billing" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/jsonl": { + "schema": { + "properties": { + "BilledCost": { + "type": "number", + "description": "Charge amount serving as the basis for invoicing" + }, + "BillingCurrency": { + "type": "string", + "enum": [ + "USD" + ], + "description": "Currency used for billing (ISO 4217)" + }, + "ChargeCategory": { + "type": "string", + "enum": [ + "Adjustment", + "Credit", + "Purchase", + "Tax", + "Usage" + ], + "description": "Classification of the charge" + }, + "ChargePeriodStart": { + "type": "string", + "description": "Inclusive start of the charge period (ISO 8601 UTC)" + }, + "ChargePeriodEnd": { + "type": "string", + "description": "Exclusive end of the charge period (ISO 8601 UTC) - Required in v1.3" + }, + "ConsumedQuantity": { + "nullable": true, + "type": "number", + "description": "Volume of resource consumed. Null when a charge does not involve measurable consumption quantity." + }, + "ConsumedUnit": { + "nullable": true, + "type": "string", + "description": "Unit of measurement for consumed quantity. Null when the charge is not measured in units." + }, + "EffectiveCost": { + "type": "number", + "description": "Amortized cost representation including discounts, pre-commitment credit purchase amount, etc." + }, + "RegionId": { + "type": "string", + "description": "Provider-assigned region identifier" + }, + "RegionName": { + "type": "string", + "description": "Display name for the region" + }, + "ServiceName": { + "type": "string", + "description": "Display name for the service/product" + }, + "ServiceCategory": { + "type": "string", + "enum": [ + "AI and Machine Learning", + "Analytics", + "Business Applications", + "Compute", + "Databases", + "Developer Tools", + "Identity", + "Integration", + "Internet of Things", + "Management and Governance", + "Media", + "Migration", + "Mobile", + "Multicloud", + "Networking", + "Other", + "Security", + "Storage", + "Web" + ], + "description": "High-level category of the service" + }, + "ServiceProviderName": { + "type": "string", + "description": "Entity making the resource/service available for purchase (v1.3)" + }, + "Tags": { + "additionalProperties": { + "type": "string" + }, + "type": "object", + "description": "Charge metadata including the Vercel ProjectId and ProjectName information" + }, + "PricingCategory": { + "type": "string", + "enum": [ + "Committed", + "Dynamic", + "Other", + "Standard" + ], + "description": "Pricing model used for the charge." + }, + "PricingCurrency": { + "type": "string", + "enum": [ + "USD" + ] + }, + "PricingQuantity": { + "type": "number" + }, + "PricingUnit": { + "type": "string" + } + }, + "required": [ + "BilledCost", + "BillingCurrency", + "ChargeCategory", + "ChargePeriodEnd", + "ChargePeriodStart", + "ConsumedQuantity", + "ConsumedUnit", + "EffectiveCost", + "PricingCategory", + "PricingCurrency", + "PricingQuantity", + "PricingUnit", + "ServiceName", + "ServiceProviderName", + "Tags" + ], + "type": "object", + "description": "Extension of the base schema for Focus charges. Includes pricing information for all customers." + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + }, + "500": { + "description": "" + }, + "503": { + "description": "" + } + }, + "parameters": [ + { + "name": "from", + "description": "Inclusive start of the date range as an ISO 8601 date-time string in UTC.", + "in": "query", + "required": true, + "schema": { + "type": "string", + "description": "Inclusive start of the date range as an ISO 8601 date-time string in UTC.", + "example": "2025-01-01T00:00:00.000Z" + } + }, + { + "name": "to", + "description": "Exclusive end of the date range as an ISO 8601 date-time string in UTC.", + "in": "query", + "required": true, + "schema": { + "type": "string", + "description": "Exclusive end of the date range as an ISO 8601 date-time string in UTC.", + "example": "2025-01-31T00:00:00.000Z" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "x-codeSamples": [ + { + "lang": "curl", + "label": "cURL", + "source": "curl -N --request GET \\\n --url 'https://api.vercel.com/v1/billing/charges?teamId=\u003cteam\u003e\u0026from=\u003cfrom_date\u003e\u0026to=\u003cto_date\u003e' \\\n --header 'Authorization: Bearer \u003ctoken\u003e' \\\n --header 'Accept-Encoding: gzip' \\\n --compressed\n" + } + ] + } + }, + "/v1/billing/contract-commitments": { + "get": { + "description": "Returns commitment allocations per contract period in FOCUS v1.3 JSONL format for a specified Vercel team. The response is streamed as newline-delimited JSON (JSONL). This endpoint is only applicable to Enterprise Vercel customers. An empty response is returned for non-Enterprise (Pro/Flex) customers.", + "operationId": "listContractCommitments", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "List FOCUS contract commitments", + "tags": [ + "billing" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/jsonl": { + "schema": { + "properties": { + "ContractCommitmentCategory": { + "type": "string", + "enum": [ + "Spend", + "Usage" + ], + "description": "Highest-level classification of the contract commitment. 'Spend' for Pro ($20/month), 'Usage' for Enterprise (MIU allocation)." + }, + "ContractCommitmentCost": { + "type": "number", + "description": "Monetary value of the contract commitment (in BillingCurrency). Required when ContractCommitmentCategory is 'Spend'. For Pro: 20 (USD)" + }, + "ContractCommitmentDescription": { + "type": "string", + "description": "Self-contained summary of the contract commitment's terms" + }, + "ContractCommitmentId": { + "type": "string", + "description": "Unique identifier for a single contract term within a contract. Maps to specific commitment period or allocation ID." + }, + "ContractCommitmentPeriodStart": { + "type": "string", + "description": "Inclusive start of the commitment term period (ISO 8601 UTC)" + }, + "ContractCommitmentPeriodEnd": { + "type": "string", + "description": "Exclusive end of the commitment term period (ISO 8601 UTC)" + }, + "ContractCommitmentQuantity": { + "type": "number", + "description": "Amount associated with the commitment (in ContractCommitmentUnit). Required when ContractCommitmentCategory is 'Usage'. For Enterprise: MIU allocation amount." + }, + "ContractCommitmentType": { + "type": "string", + "description": "Service-provider-assigned name identifying the commitment type. 'Pro' or 'Enterprise' for Vercel." + }, + "ContractCommitmentUnit": { + "type": "string", + "description": "Measurement unit for ContractCommitmentQuantity. 'MIUs' for Enterprise, 'USD' for Pro spend commitments." + }, + "ContractId": { + "type": "string", + "description": "Service-provider-assigned identifier for a contract. Maps to Orb Subscription ID for Vercel." + }, + "ContractPeriodStart": { + "type": "string", + "description": "Inclusive start of the overall contract period (ISO 8601 UTC)" + }, + "ContractPeriodEnd": { + "type": "string", + "description": "Exclusive end of the overall contract period (ISO 8601 UTC)" + }, + "BillingCurrency": { + "type": "string" + } + }, + "required": [ + "BillingCurrency", + "ContractCommitmentCategory", + "ContractCommitmentId", + "ContractCommitmentPeriodEnd", + "ContractCommitmentPeriodStart", + "ContractCommitmentType", + "ContractCommitmentUnit", + "ContractId", + "ContractPeriodEnd", + "ContractPeriodStart" + ], + "type": "object", + "description": "Contract commitment information describing terms within a contract. New in FOCUS v1.3 - tracks commitment terms separate from cost/usage rows. For Vercel: - Pro: $20 monthly spend commitment - Enterprise: MIU allocation per period (usage commitment)" + } + } + } + }, + "400": { + "description": "" + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + } + }, + "/v1/billing/buy": { + "post": { + "description": "Purchases credits for a Vercel team using the default payment method on file. The purchase is charged immediately via Stripe invoice. Supported credit types are `v0`, `gateway`, and `agent`. The `amount` field specifies the number of credits to purchase and must be a positive integer. An optional `source` query parameter can be provided to identify the caller. Defaults to `api` if not specified. This is only available for Owner, Member, Developer, Security, and Billing roles for the supplied team.", + "operationId": "buyCredits", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Purchase credits", + "tags": [ + "billing" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "oneOf": [ + { + "properties": { + "checkoutSessionId": { + "type": "string" + }, + "checkoutSessionUrl": { + "type": "string" + } + }, + "required": [ + "checkoutSessionId", + "checkoutSessionUrl" + ], + "type": "object" + }, + { + "properties": { + "purchaseIntent": { + "properties": { + "id": { + "type": "string", + "description": "The unique ID of a Purchase Intent. Uses the format `pur_*`" + }, + "configuration": { + "oneOf": [ + { + "properties": { + "options": { + "properties": { + "amount": { + "type": "string", + "description": "The amount of currency to buy" + }, + "currency": { + "type": "string", + "enum": [ + "ai_credits", + "ai_gateway_credits", + "copper_test_units", + "v0_user_credits", + "vercel_agent_credits" + ], + "description": "The currency being purchased" + }, + "expirationDate": { + "type": "string", + "description": "The expiration date of the credits being purchased" + } + }, + "required": [ + "amount", + "currency" + ], + "type": "object", + "description": "Purchase configuration specific options" + }, + "output": { + "nullable": true + }, + "type": { + "type": "string", + "enum": [ + "credit_topup" + ] + } + }, + "required": [ + "options", + "output", + "type" + ], + "type": "object", + "description": "The configuration for a credit purchase" + }, + { + "properties": { + "options": { + "properties": { + "items": { + "items": { + "properties": { + "name": { + "type": "string" + }, + "subtotal": { + "type": "string", + "description": "The subtotal of the domain name purchase" + }, + "type": { + "type": "string", + "enum": [ + "purchase", + "renewal", + "transfer" + ] + }, + "years": { + "type": "number", + "description": "The number of years to purchase" + } + }, + "required": [ + "name", + "subtotal", + "type", + "years" + ], + "type": "object" + }, + "type": "array" + }, + "orderId": { + "type": "string", + "description": "The order ID of the domain name purchase" + } + }, + "required": [ + "items", + "orderId" + ], + "type": "object" + }, + "output": { + "nullable": true + }, + "type": { + "type": "string", + "enum": [ + "domain_name" + ] + } + }, + "required": [ + "options", + "output", + "type" + ], + "type": "object", + "description": "The configuration for a credit purchase" + }, + { + "properties": { + "options": { + "properties": { + "effectiveDate": { + "oneOf": [ + { + "type": "object", + "description": "The effective date of the plan change" + }, + { + "type": "string", + "enum": [ + "end_of_subscription_term", + "immediate" + ] + } + ] + }, + "orbSubscriptionId": { + "type": "string", + "description": "The ID of the Orb subscription to change" + }, + "alignBillingWithPlanChangeDate": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether or not to reset the billing cycle" + }, + "couponRedemptionCode": { + "type": "string", + "description": "The coupon redemption code to apply to the plan change" + }, + "externalPlanId": { + "type": "string", + "description": "The ID of the external plan to change to" + }, + "replacePrices": { + "items": { + "properties": { + "fixedPriceQuantity": { + "type": "number", + "description": "The quantity for the fixed price" + }, + "replacesPriceId": { + "type": "string", + "description": "The ID of the price to replace" + } + }, + "required": [ + "fixedPriceQuantity", + "replacesPriceId" + ], + "type": "object", + "description": "The prices to replace in the subscription" + }, + "type": "array", + "description": "The prices to replace in the subscription" + } + }, + "required": [ + "effectiveDate", + "orbSubscriptionId" + ], + "type": "object" + }, + "output": { + "properties": { + "pendingSubscriptionChangeId": { + "type": "string", + "description": "The ID of the pending subscription change" + } + }, + "required": [ + "pendingSubscriptionChangeId" + ], + "type": "object" + }, + "type": { + "type": "string", + "enum": [ + "orb_plan_change" + ] + } + }, + "required": [ + "options", + "output", + "type" + ], + "type": "object", + "description": "The configuration for a credit purchase" + }, + { + "properties": { + "options": { + "type": "object" + }, + "output": { + "properties": { + "pendingSubscriptionChangeId": { + "type": "string", + "description": "The ID of the pending subscription change" + } + }, + "required": [ + "pendingSubscriptionChangeId" + ], + "type": "object" + }, + "type": { + "type": "string", + "enum": [ + "orb_price_interval" + ] + } + }, + "required": [ + "options", + "output", + "type" + ], + "type": "object", + "description": "The configuration for a credit purchase" + }, + { + "properties": { + "options": { + "properties": { + "externalPlanId": { + "type": "string", + "description": "The external plan ID of the Orb plan to subscribe to" + }, + "addPrices": { + "items": { + "oneOf": [ + { + "properties": { + "priceId": { + "type": "string", + "description": "The ID of the price to add" + } + }, + "required": [ + "priceId" + ], + "type": "object", + "description": "The prices to add to the subscription" + }, + { + "type": "object", + "description": "The prices to add to the subscription" + } + ] + }, + "type": "array", + "description": "The prices to add to the subscription" + }, + "alignBillingWithSubscriptionStartDate": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether to align the subscription start date with the billing subscription start date" + }, + "couponRedemptionCode": { + "type": "string", + "description": "The coupon redemption code to apply to the subscription" + }, + "initialPhaseOrder": { + "type": "number", + "description": "The initial phase order to use for the subscription" + }, + "metadata": { + "additionalProperties": { + "nullable": true, + "type": "string", + "description": "Optional metadata to associate with the subscription" + }, + "type": "object", + "description": "Optional metadata to associate with the subscription" + }, + "removePrices": { + "items": { + "properties": { + "priceId": { + "type": "string", + "description": "The ID of the price to remove" + } + }, + "required": [ + "priceId" + ], + "type": "object", + "description": "The prices to remove in the subscription" + }, + "type": "array", + "description": "The prices to remove in the subscription" + }, + "replacePrices": { + "items": { + "properties": { + "fixedPriceQuantity": { + "type": "number", + "description": "The quantity for the fixed price" + }, + "replacesPriceId": { + "type": "string", + "description": "The ID of the price to replace" + } + }, + "required": [ + "fixedPriceQuantity", + "replacesPriceId" + ], + "type": "object", + "description": "The prices to replace in the subscription" + }, + "type": "array", + "description": "The prices to replace in the subscription" + }, + "startDate": { + "type": "string", + "description": "The start date of the subscription" + } + }, + "required": [ + "externalPlanId" + ], + "type": "object" + }, + "output": { + "properties": { + "pendingSubscriptionChangeId": { + "type": "string", + "description": "The ID of the pending subscription change" + } + }, + "required": [ + "pendingSubscriptionChangeId" + ], + "type": "object" + }, + "type": { + "type": "string", + "enum": [ + "orb_subscription" + ] + } + }, + "required": [ + "options", + "output", + "type" + ], + "type": "object", + "description": "The configuration for a credit purchase" + }, + { + "properties": { + "options": { + "properties": { + "orbCustomerId": { + "type": "string", + "description": "The ID of the Orb customer to create" + }, + "orbExternalCustomerId": { + "type": "string", + "description": "The external ID of the Orb customer to create" + }, + "orbExternalPlanId": { + "type": "string", + "description": "The external ID of the Orb plan to create" + }, + "orbPlanId": { + "type": "string", + "description": "The ID of the Orb plan to create" + }, + "orbSubscriptionId": { + "type": "string", + "description": "The ID of the Orb subscription to create" + }, + "lineItems": { + "items": { + "properties": { + "id": { + "type": "string", + "description": "The ID of the line item" + }, + "description": { + "type": "string", + "description": "The description of the line item" + }, + "name": { + "type": "string", + "description": "The name of the line item" + }, + "productId": { + "type": "string", + "description": "The ID of the product being purchased" + }, + "quantity": { + "type": "string", + "description": "The quantity of the line item" + }, + "unitAmount": { + "type": "string", + "description": "The unit amount of the line item" + }, + "metadata": { + "additionalProperties": { + "type": "string" + }, + "type": "object", + "description": "Optional metadata for the line item" + }, + "productAlias": { + "type": "string", + "description": "The alias of the product being purchased" + }, + "refund": { + "type": "string", + "description": "The amount of the line item that has been refunded" + } + }, + "required": [ + "description", + "id", + "name", + "productId", + "quantity", + "unitAmount" + ], + "type": "object", + "description": "The line items that make up the Purchase Intent." + }, + "type": "array", + "description": "The line items that make up the Purchase Intent." + }, + "orbPendingSubscriptionChangeId": { + "type": "string", + "description": "The ID of the pending subscription change" + } + }, + "required": [ + "orbCustomerId", + "orbExternalCustomerId", + "orbExternalPlanId", + "orbPlanId", + "orbSubscriptionId" + ], + "type": "object" + }, + "output": { + "properties": { + "pendingSubscriptionChangeId": { + "type": "string", + "description": "The ID of the pending subscription change" + } + }, + "type": "object" + }, + "type": { + "type": "string", + "enum": [ + "orb_subscription_intent" + ] + } + }, + "required": [ + "options", + "output", + "type" + ], + "type": "object", + "description": "The configuration for a credit purchase" + }, + { + "properties": { + "options": { + "properties": { + "planId": { + "type": "string", + "description": "The ID of the plan to subscribe to" + }, + "fromPlan": { + "properties": { + "currentCycleEndDate": { + "type": "string", + "description": "The end of the current plan billing cycle" + }, + "orbSubscriptionId": { + "type": "string", + "description": "The Orb subscription ID currently active for the owner on the source plan" + }, + "planId": { + "type": "string", + "description": "The ID of the plan currently assigned" + }, + "planItemQuantities": { + "items": { + "properties": { + "planItemId": { + "type": "string", + "description": "The ID of the current plan item to set the quantity for" + }, + "quantity": { + "type": "number", + "description": "The nonnegative integer quantity for the current plan item" + }, + "resourceIds": { + "items": { + "type": "string" + }, + "type": "array", + "description": "The resource IDs associated with the current plan item quantity" + } + }, + "required": [ + "planItemId", + "quantity" + ], + "type": "object", + "description": "The current plan item quantities" + }, + "type": "array", + "description": "The current plan item quantities" + }, + "rateVariantKey": { + "type": "string", + "description": "The rate variant currently assigned" + } + }, + "required": [ + "currentCycleEndDate", + "orbSubscriptionId", + "planId" + ], + "type": "object", + "description": "The current plan being replaced by this purchase" + }, + "planItemQuantities": { + "items": { + "properties": { + "planItemId": { + "type": "string", + "description": "The ID of the plan item to set the quantity for" + }, + "quantity": { + "type": "number", + "description": "The nonnegative integer quantity for the plan item" + }, + "resourceIds": { + "items": { + "type": "string" + }, + "type": "array", + "description": "The resource IDs to associate with the plan item quantity" + } + }, + "required": [ + "planItemId", + "quantity" + ], + "type": "object", + "description": "The plan item quantities to set for the subscription" + }, + "type": "array", + "description": "The plan item quantities to set for the subscription" + }, + "rateVariantKey": { + "type": "string", + "description": "The rate variant key to apply to the subscription" + } + }, + "required": [ + "planId" + ], + "type": "object", + "description": "Purchase configuration specific options" + }, + "output": { + "properties": { + "planChangeId": { + "type": "string", + "description": "The committed Plan revision used to calculate the purchase price" + } + }, + "type": "object" + }, + "type": { + "type": "string", + "enum": [ + "subscription" + ] + } + }, + "required": [ + "options", + "output", + "type" + ], + "type": "object", + "description": "The configuration for a credit purchase" + } + ] + }, + "createdAt": { + "type": "string", + "description": "The datetime when the Purchase Intent was created." + }, + "currency": { + "type": "string", + "enum": [ + "miu", + "usd" + ], + "description": "The currency for the purchase intent" + }, + "ownerId": { + "type": "string", + "description": "The ID of the owner of the Purchase Intent." + }, + "provider": { + "properties": { + "resourceId": { + "type": "string", + "description": "Provider resource id" + }, + "type": { + "type": "string", + "enum": [ + "apple_in_app_purchase", + "orb_ledger", + "stripe_elements", + "stripe_hosted", + "stripe_invoice_deferred", + "stripe_invoice_elements", + "stripe_invoice_immediate", + "tackle_aws_marketplace" + ], + "description": "The type of the purchase provider" + }, + "currencyConversionRate": { + "type": "string", + "description": "The currency conversion rate used by the provider" + }, + "stripeSharedPaymentTokenUsed": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether a Stripe Shared Payment Token was used for this purchase. Only applicable when type is stripe_invoice_immediate." + } + }, + "required": [ + "resourceId", + "type" + ], + "type": "object" + }, + "status": { + "type": "string", + "enum": [ + "failed", + "pending", + "succeeded" + ], + "description": "The status of the Purchase Intent." + }, + "subtotal": { + "type": "string", + "description": "The subtotal of the Purchase Intent." + }, + "tax": { + "type": "string", + "description": "The tax due on the Purchase Intent." + }, + "total": { + "type": "string", + "description": "The total balance due on the Purchase Intent." + }, + "updatedAt": { + "type": "string", + "description": "The datetime when the Purchase Intent was last updated." + }, + "dispute": { + "properties": { + "id": { + "type": "string", + "description": "The unique ID of the dispute entity." + }, + "amount": { + "type": "string", + "description": "The disputed amount." + }, + "createdAt": { + "type": "string", + "description": "When the dispute was first recorded." + }, + "currency": { + "type": "string", + "description": "The dispute currency." + }, + "providerId": { + "type": "string", + "description": "The external provider dispute ID (e.g. Stripe dispute ID)." + }, + "reason": { + "nullable": true, + "type": "string", + "description": "The dispute reason." + }, + "status": { + "type": "string", + "description": "The dispute status." + }, + "updatedAt": { + "type": "string", + "description": "When the dispute was last updated." + } + }, + "required": [ + "amount", + "createdAt", + "currency", + "id", + "providerId", + "reason", + "status", + "updatedAt" + ], + "type": "object", + "description": "The dispute details, if any." + }, + "lineItems": { + "items": { + "properties": { + "id": { + "type": "string", + "description": "The ID of the line item" + }, + "description": { + "type": "string", + "description": "The description of the line item" + }, + "name": { + "type": "string", + "description": "The name of the line item" + }, + "productId": { + "type": "string", + "description": "The ID of the product being purchased" + }, + "quantity": { + "type": "string", + "description": "The quantity of the line item" + }, + "unitAmount": { + "type": "string", + "description": "The unit amount of the line item" + }, + "metadata": { + "additionalProperties": { + "type": "string" + }, + "type": "object", + "description": "Optional metadata for the line item" + }, + "productAlias": { + "type": "string", + "description": "The alias of the product being purchased" + }, + "refund": { + "type": "string", + "description": "The amount of the line item that has been refunded" + } + }, + "required": [ + "description", + "id", + "name", + "productId", + "quantity", + "unitAmount" + ], + "type": "object", + "description": "The line items that make up the Purchase Intent." + }, + "type": "array", + "description": "The line items that make up the Purchase Intent." + }, + "metadata": { + "additionalProperties": { + "type": "string" + }, + "type": "object", + "description": "Optional metadata associated with the purchase intent" + }, + "refund": { + "type": "string", + "description": "The amount of the purchase intent that has been refunded" + }, + "returnUrl": { + "type": "string", + "description": "The URL to redirect to after the purchase is complete" + } + }, + "required": [ + "configuration", + "createdAt", + "currency", + "id", + "ownerId", + "provider", + "status", + "subtotal", + "tax", + "total", + "updatedAt" + ], + "type": "object", + "description": "The created purchase intent" + } + }, + "required": [ + "purchaseIntent" + ], + "type": "object" + }, + { + "properties": { + "orbSubscriptionIntent": { + "properties": { + "id": { + "type": "string", + "description": "The ID of the Orb subscription intent with the format `orbsubint_`." + }, + "configuration": { + "oneOf": [ + { + "properties": { + "options": { + "properties": { + "productAlias": { + "type": "string", + "description": "The alias of the product to set quantity for." + }, + "quantity": { + "type": "number", + "description": "The quantity to set for the plan item." + }, + "resourceIds": { + "items": { + "type": "string" + }, + "type": "array", + "description": "The resource IDs for the plan item. Only set if SKU requires resource entitlements." + } + }, + "required": [ + "productAlias", + "quantity" + ], + "type": "object", + "description": "Configuration input options for setting plan item quantity." + }, + "output": { + "properties": { + "effectiveBehavior": { + "type": "string", + "enum": [ + "end_of_term", + "immediate" + ], + "description": "When the subscription change should take effect." + }, + "orbPriceId": { + "type": "string", + "description": "The Orb price ID for the subscription item being modified." + }, + "pricingSource": { + "type": "string", + "enum": [ + "copper", + "orb" + ], + "description": "The source used as the authoritative price for this intent." + }, + "productId": { + "type": "string", + "description": "The product ID associated with this intent." + }, + "changedResources": { + "items": { + "properties": { + "productAlias": { + "type": "string", + "description": "The alias of the product that was changed." + }, + "productId": { + "type": "string", + "description": "The ID of the product that was changed." + }, + "quantity": { + "type": "number", + "description": "The resulting quantity after this change." + }, + "addedResourceIds": { + "items": { + "type": "string" + }, + "type": "array", + "description": "Resource IDs that were added." + }, + "effectiveAt": { + "type": "string", + "description": "When this resource change should take effect for downstream consumers." + }, + "removedResourceIds": { + "items": { + "type": "string" + }, + "type": "array", + "description": "Resource IDs that were removed." + }, + "resourceIds": { + "items": { + "type": "string" + }, + "type": "array", + "description": "The full set of resource IDs after the change." + } + }, + "required": [ + "productAlias", + "productId", + "quantity" + ], + "type": "object", + "description": "Resources that were changed as part of this intent. Tracks all logical changes including the primary change and any side effects." + }, + "type": "array", + "description": "Resources that were changed as part of this intent. Tracks all logical changes including the primary change and any side effects." + }, + "metadata": { + "additionalProperties": { + "type": "string" + }, + "type": "object", + "description": "Optional metadata associated with the intent to update the Orb subscription with." + }, + "pendingSubscriptionChangeId": { + "type": "string", + "description": "The ID of the pending subscription change if there is one." + } + }, + "required": [ + "effectiveBehavior", + "orbPriceId", + "pricingSource", + "productId" + ], + "type": "object", + "description": "Output returned after configuring an OrbSubscriptionIntent." + }, + "type": { + "type": "string", + "enum": [ + "set_plan_item_quantity" + ] + } + }, + "required": [ + "options", + "output", + "type" + ], + "type": "object", + "description": "Configuration for the Orb subscription intent." + }, + { + "properties": { + "options": { + "properties": { + "productAlias": { + "type": "string", + "description": "The alias of the product to increase quantity for." + }, + "resourceIds": { + "items": { + "type": "string" + }, + "type": "array", + "description": "The resource IDs to incrementally add. The quantity of the plan item will be increased by the number of resource IDs." + } + }, + "required": [ + "productAlias", + "resourceIds" + ], + "type": "object", + "description": "Configuration input options for increasing plan item quantity." + }, + "output": { + "properties": { + "effectiveBehavior": { + "type": "string", + "enum": [ + "end_of_term", + "immediate" + ], + "description": "When the subscription change should take effect." + }, + "orbPriceId": { + "type": "string", + "description": "The Orb price ID for the subscription item being modified." + }, + "pricingSource": { + "type": "string", + "enum": [ + "copper", + "orb" + ], + "description": "The source used as the authoritative price for this intent." + }, + "productId": { + "type": "string", + "description": "The product ID associated with this intent." + }, + "changedResources": { + "items": { + "properties": { + "productAlias": { + "type": "string", + "description": "The alias of the product that was changed." + }, + "productId": { + "type": "string", + "description": "The ID of the product that was changed." + }, + "quantity": { + "type": "number", + "description": "The resulting quantity after this change." + }, + "addedResourceIds": { + "items": { + "type": "string" + }, + "type": "array", + "description": "Resource IDs that were added." + }, + "effectiveAt": { + "type": "string", + "description": "When this resource change should take effect for downstream consumers." + }, + "removedResourceIds": { + "items": { + "type": "string" + }, + "type": "array", + "description": "Resource IDs that were removed." + }, + "resourceIds": { + "items": { + "type": "string" + }, + "type": "array", + "description": "The full set of resource IDs after the change." + } + }, + "required": [ + "productAlias", + "productId", + "quantity" + ], + "type": "object", + "description": "Resources that were changed as part of this intent. Tracks all logical changes including the primary change and any side effects." + }, + "type": "array", + "description": "Resources that were changed as part of this intent. Tracks all logical changes including the primary change and any side effects." + }, + "metadata": { + "additionalProperties": { + "type": "string" + }, + "type": "object", + "description": "Optional metadata associated with the intent to update the Orb subscription with." + }, + "pendingSubscriptionChangeId": { + "type": "string", + "description": "The ID of the pending subscription change if there is one." + } + }, + "required": [ + "effectiveBehavior", + "orbPriceId", + "pricingSource", + "productId" + ], + "type": "object", + "description": "Output returned after configuring an OrbSubscriptionIntent." + }, + "type": { + "type": "string", + "enum": [ + "increase_plan_item_quantity" + ] + } + }, + "required": [ + "options", + "output", + "type" + ], + "type": "object", + "description": "Configuration for the Orb subscription intent." + }, + { + "properties": { + "options": { + "properties": { + "productAlias": { + "type": "string", + "description": "The alias of the product to decrease quantity for." + }, + "resourceIds": { + "items": { + "type": "string" + }, + "type": "array", + "description": "The resource IDs to decrementally remove. The quantity of the plan item will be decreased by the number of resource IDs." + } + }, + "required": [ + "productAlias", + "resourceIds" + ], + "type": "object", + "description": "Configuration input options for decreasing plan item quantity." + }, + "output": { + "properties": { + "effectiveBehavior": { + "type": "string", + "enum": [ + "end_of_term", + "immediate" + ], + "description": "When the subscription change should take effect." + }, + "orbPriceId": { + "type": "string", + "description": "The Orb price ID for the subscription item being modified." + }, + "pricingSource": { + "type": "string", + "enum": [ + "copper", + "orb" + ], + "description": "The source used as the authoritative price for this intent." + }, + "productId": { + "type": "string", + "description": "The product ID associated with this intent." + }, + "changedResources": { + "items": { + "properties": { + "productAlias": { + "type": "string", + "description": "The alias of the product that was changed." + }, + "productId": { + "type": "string", + "description": "The ID of the product that was changed." + }, + "quantity": { + "type": "number", + "description": "The resulting quantity after this change." + }, + "addedResourceIds": { + "items": { + "type": "string" + }, + "type": "array", + "description": "Resource IDs that were added." + }, + "effectiveAt": { + "type": "string", + "description": "When this resource change should take effect for downstream consumers." + }, + "removedResourceIds": { + "items": { + "type": "string" + }, + "type": "array", + "description": "Resource IDs that were removed." + }, + "resourceIds": { + "items": { + "type": "string" + }, + "type": "array", + "description": "The full set of resource IDs after the change." + } + }, + "required": [ + "productAlias", + "productId", + "quantity" + ], + "type": "object", + "description": "Resources that were changed as part of this intent. Tracks all logical changes including the primary change and any side effects." + }, + "type": "array", + "description": "Resources that were changed as part of this intent. Tracks all logical changes including the primary change and any side effects." + }, + "metadata": { + "additionalProperties": { + "type": "string" + }, + "type": "object", + "description": "Optional metadata associated with the intent to update the Orb subscription with." + }, + "pendingSubscriptionChangeId": { + "type": "string", + "description": "The ID of the pending subscription change if there is one." + } + }, + "required": [ + "effectiveBehavior", + "orbPriceId", + "pricingSource", + "productId" + ], + "type": "object", + "description": "Output returned after configuring an OrbSubscriptionIntent." + }, + "type": { + "type": "string", + "enum": [ + "decrease_plan_item_quantity" + ] + } + }, + "required": [ + "options", + "output", + "type" + ], + "type": "object", + "description": "Configuration for the Orb subscription intent." + }, + { + "properties": { + "options": { + "properties": { + "addedResourceIds": { + "items": { + "type": "string" + }, + "type": "array", + "description": "The resource IDs to incrementally add. The quantity of the plan item will be increased by the number of resource IDs." + }, + "productAlias": { + "type": "string", + "description": "The alias of the product to adjust quantity for." + }, + "removedResourceIds": { + "items": { + "type": "string" + }, + "type": "array", + "description": "The resource IDs to incrementally remove. The quantity of the plan item will be decreased by the number of resource IDs." + } + }, + "required": [ + "addedResourceIds", + "productAlias", + "removedResourceIds" + ], + "type": "object", + "description": "Configuration input options for adjusting plan item quantity." + }, + "output": { + "properties": { + "effectiveBehavior": { + "type": "string", + "enum": [ + "end_of_term", + "immediate" + ], + "description": "When the subscription change should take effect." + }, + "orbPriceId": { + "type": "string", + "description": "The Orb price ID for the subscription item being modified." + }, + "pricingSource": { + "type": "string", + "enum": [ + "copper", + "orb" + ], + "description": "The source used as the authoritative price for this intent." + }, + "productId": { + "type": "string", + "description": "The product ID associated with this intent." + }, + "changedResources": { + "items": { + "properties": { + "productAlias": { + "type": "string", + "description": "The alias of the product that was changed." + }, + "productId": { + "type": "string", + "description": "The ID of the product that was changed." + }, + "quantity": { + "type": "number", + "description": "The resulting quantity after this change." + }, + "addedResourceIds": { + "items": { + "type": "string" + }, + "type": "array", + "description": "Resource IDs that were added." + }, + "effectiveAt": { + "type": "string", + "description": "When this resource change should take effect for downstream consumers." + }, + "removedResourceIds": { + "items": { + "type": "string" + }, + "type": "array", + "description": "Resource IDs that were removed." + }, + "resourceIds": { + "items": { + "type": "string" + }, + "type": "array", + "description": "The full set of resource IDs after the change." + } + }, + "required": [ + "productAlias", + "productId", + "quantity" + ], + "type": "object", + "description": "Resources that were changed as part of this intent. Tracks all logical changes including the primary change and any side effects." + }, + "type": "array", + "description": "Resources that were changed as part of this intent. Tracks all logical changes including the primary change and any side effects." + }, + "metadata": { + "additionalProperties": { + "type": "string" + }, + "type": "object", + "description": "Optional metadata associated with the intent to update the Orb subscription with." + }, + "pendingSubscriptionChangeId": { + "type": "string", + "description": "The ID of the pending subscription change if there is one." + } + }, + "required": [ + "effectiveBehavior", + "orbPriceId", + "pricingSource", + "productId" + ], + "type": "object", + "description": "Output returned after configuring an OrbSubscriptionIntent." + }, + "type": { + "type": "string", + "enum": [ + "adjust_plan_item_quantity" + ] + } + }, + "required": [ + "options", + "output", + "type" + ], + "type": "object", + "description": "Configuration for the Orb subscription intent." + } + ] + }, + "createdAt": { + "type": "string", + "description": "The ISO 8601 date-time that the intent was created." + }, + "orbSubscriptionId": { + "type": "string", + "description": "The Orb subscription ID this intent is associated with." + }, + "orbUpdate": { + "oneOf": [ + { + "properties": { + "mode": { + "type": "string", + "enum": [ + "sync" + ] + } + }, + "required": [ + "mode" + ], + "type": "object", + "description": "How the subscription change is applied to Orb." + }, + { + "properties": { + "mode": { + "type": "string", + "enum": [ + "async" + ] + }, + "status": { + "type": "string", + "enum": [ + "canceled", + "failed", + "pending", + "running" + ] + } + }, + "required": [ + "mode", + "status" + ], + "type": "object", + "description": "How the subscription change is applied to Orb." + }, + { + "properties": { + "appliedAt": { + "type": "string", + "description": "The ISO 8601 date-time that the subscription change was applied to Orb." + }, + "mode": { + "type": "string", + "enum": [ + "async" + ] + }, + "status": { + "type": "string", + "enum": [ + "succeeded" + ] + } + }, + "required": [ + "appliedAt", + "mode", + "status" + ], + "type": "object", + "description": "How the subscription change is applied to Orb." + } + ] + }, + "ownerId": { + "type": "string", + "description": "The owner ID for this intent (e.g., team or user ID)." + }, + "status": { + "type": "string", + "enum": [ + "failed", + "pending", + "succeeded" + ], + "description": "The status of the Orb subscription intent." + }, + "updatedAt": { + "type": "string", + "description": "The ISO 8601 date-time that the intent was last updated." + }, + "purchaseIntentId": { + "type": "string", + "description": "Optional purchase intent ID if this is associated with a purchase." + } + }, + "required": [ + "configuration", + "createdAt", + "id", + "orbSubscriptionId", + "orbUpdate", + "ownerId", + "status", + "updatedAt" + ], + "type": "object" + } + }, + "required": [ + "orbSubscriptionIntent" + ], + "type": "object" + } + ] + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "402": { + "description": "" + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "409": { + "description": "" + }, + "410": { + "description": "" + }, + "500": { + "description": "" + } + }, + "parameters": [ + { + "name": "source", + "description": "The source of the purchase request. Defaults to `api` if not specified.", + "in": "query", + "schema": { + "type": "string", + "description": "The source of the purchase request. Defaults to `api` if not specified." + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "item" + ], + "properties": { + "item": { + "type": "object", + "required": [ + "type", + "creditType", + "amount" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "credits" + ], + "description": "The type of item to purchase." + }, + "creditType": { + "type": "string", + "enum": [ + "v0", + "gateway", + "agent" + ], + "description": "The type of credits to purchase." + }, + "amount": { + "type": "integer", + "minimum": 1, + "description": "The amount of credits to purchase." + } + } + } + } + } + } + } + }, + "x-codeSamples": [ + { + "lang": "curl", + "label": "cURL", + "source": "curl --request POST \\\n --url 'https://api.vercel.com/v1/billing/buy?teamId=\u003cteam\u003e' \\\n --header 'Authorization: Bearer \u003ctoken\u003e' \\\n --header 'Content-Type: application/json' \\\n --data '{\"item\":{\"type\":\"credits\",\"creditType\":\"v0\",\"amount\":100}}'\n" + } + ] + } + }, + "/v1/bulk-redirects": { + "put": { + "description": "Stages new redirects for a project and returns the new version.", + "operationId": "stageRedirects", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Stages new redirects for a project.", + "tags": [ + "bulk-redirects" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "alias": { + "nullable": true, + "type": "string" + }, + "version": { + "properties": { + "id": { + "type": "string", + "description": "The unique identifier for the version." + }, + "key": { + "type": "string", + "description": "The key of the version. The key may be duplicated across versions if the contents are the same as a different version." + }, + "lastModified": { + "type": "number" + }, + "createdBy": { + "type": "string" + }, + "name": { + "type": "string", + "description": "Optional name for the version. If not provided, defaults to an ISO timestamp string." + }, + "isStaging": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether this version has not been promoted to production yet and is not serving end users." + }, + "isLive": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether this version is currently live in production." + }, + "redirectCount": { + "type": "number", + "description": "The number of redirects in this version." + }, + "alias": { + "type": "string", + "description": "The staging link for previewing redirects in this version." + } + }, + "required": [ + "createdBy", + "id", + "key", + "lastModified" + ], + "type": "object" + } + }, + "required": [ + "alias", + "version" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "410": { + "description": "" + }, + "500": { + "description": "" + } + }, + "parameters": [ + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "projectId", + "teamId" + ], + "properties": { + "projectId": { + "type": "string" + }, + "teamId": { + "type": "string" + }, + "overwrite": { + "type": "boolean" + }, + "name": { + "type": "string", + "maxLength": 256 + }, + "redirects": { + "type": "array", + "default": [], + "items": { + "type": "object", + "required": [ + "source", + "destination" + ], + "properties": { + "source": { + "type": "string", + "maxLength": 2048 + }, + "destination": { + "type": "string", + "maxLength": 2048 + }, + "statusCode": { + "oneOf": [ + { + "type": "number" + }, + { + "type": "string" + } + ] + }, + "permanent": { + "type": "boolean" + }, + "caseSensitive": { + "type": "boolean" + }, + "query": { + "type": "boolean" + }, + "preserveQueryParams": { + "type": "boolean" + } + } + } + } + } + } + } + } + } + }, + "get": { + "description": "Get the version history for a project's bulk redirects", + "operationId": "getRedirects", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Gets project-level redirects.", + "tags": [ + "bulk-redirects" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "oneOf": [ + { + "type": "object", + "additionalProperties": true + }, + { + "properties": { + "version": { + "properties": { + "id": { + "type": "string", + "description": "The unique identifier for the version." + }, + "key": { + "type": "string", + "description": "The key of the version. The key may be duplicated across versions if the contents are the same as a different version." + }, + "lastModified": { + "type": "number" + }, + "createdBy": { + "type": "string" + }, + "name": { + "type": "string", + "description": "Optional name for the version. If not provided, defaults to an ISO timestamp string." + }, + "isStaging": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether this version has not been promoted to production yet and is not serving end users." + }, + "isLive": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether this version is currently live in production." + }, + "redirectCount": { + "type": "number", + "description": "The number of redirects in this version." + }, + "alias": { + "type": "string", + "description": "The staging link for previewing redirects in this version." + } + }, + "required": [ + "createdBy", + "id", + "key", + "lastModified" + ], + "type": "object" + }, + "redirects": { + "items": { + "properties": { + "statusCode": { + "type": "number" + }, + "permanent": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "sensitive": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "caseSensitive": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "query": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "preserveQueryParams": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "destination": { + "type": "string" + }, + "source": { + "type": "string" + } + }, + "required": [ + "destination", + "source" + ], + "type": "object" + }, + "type": "array" + }, + "pagination": { + "properties": { + "page": { + "type": "number" + }, + "per_page": { + "type": "number" + }, + "numPages": { + "type": "number" + } + }, + "required": [ + "numPages", + "page", + "per_page" + ], + "type": "object" + } + }, + "required": [ + "pagination", + "redirects" + ], + "type": "object" + }, + { + "properties": { + "version": { + "properties": { + "id": { + "type": "string", + "description": "The unique identifier for the version." + }, + "key": { + "type": "string", + "description": "The key of the version. The key may be duplicated across versions if the contents are the same as a different version." + }, + "lastModified": { + "type": "number" + }, + "createdBy": { + "type": "string" + }, + "name": { + "type": "string", + "description": "Optional name for the version. If not provided, defaults to an ISO timestamp string." + }, + "isStaging": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether this version has not been promoted to production yet and is not serving end users." + }, + "isLive": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether this version is currently live in production." + }, + "redirectCount": { + "type": "number", + "description": "The number of redirects in this version." + }, + "alias": { + "type": "string", + "description": "The staging link for previewing redirects in this version." + } + }, + "required": [ + "createdBy", + "id", + "key", + "lastModified" + ], + "type": "object" + }, + "redirects": { + "items": { + "properties": { + "statusCode": { + "type": "number" + }, + "permanent": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "sensitive": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "caseSensitive": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "query": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "preserveQueryParams": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "destination": { + "type": "string" + }, + "source": { + "type": "string" + } + }, + "required": [ + "destination", + "source" + ], + "type": "object" + }, + "type": "array" + }, + "pagination": { + "properties": { + "page": { + "type": "number" + }, + "per_page": { + "type": "number" + }, + "numPages": { + "type": "number" + } + }, + "required": [ + "numPages", + "page", + "per_page" + ], + "type": "object" + } + }, + "required": [ + "pagination", + "redirects", + "version" + ], + "type": "object" + } + ] + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "projectId", + "in": "query", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "versionId", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "q", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "diff", + "in": "query", + "required": false, + "schema": { + "oneOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "only" + ] + } + ] + } + }, + { + "name": "page", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "minimum": 1 + } + }, + { + "name": "per_page", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "minimum": 10, + "maximum": 250 + } + }, + { + "name": "sort_by", + "in": "query", + "required": false, + "schema": { + "type": "string", + "enum": [ + "source", + "destination", + "statusCode" + ] + } + }, + { + "name": "sort_order", + "in": "query", + "required": false, + "schema": { + "type": "string", + "enum": [ + "asc", + "desc" + ] + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + }, + "delete": { + "description": "Deletes the provided redirects from the latest version of the projects' bulk redirects. Stages a new change with the new redirects and returns the alias for the new version in the response.", + "operationId": "deleteRedirects", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Delete project-level redirects.", + "tags": [ + "bulk-redirects" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "oneOf": [ + { + "properties": { + "alias": { + "type": "string" + }, + "version": { + "properties": { + "id": { + "type": "string", + "description": "The unique identifier for the version." + }, + "key": { + "type": "string", + "description": "The key of the version. The key may be duplicated across versions if the contents are the same as a different version." + }, + "lastModified": { + "type": "number" + }, + "createdBy": { + "type": "string" + }, + "name": { + "type": "string", + "description": "Optional name for the version. If not provided, defaults to an ISO timestamp string." + }, + "isStaging": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether this version has not been promoted to production yet and is not serving end users." + }, + "isLive": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether this version is currently live in production." + }, + "redirectCount": { + "type": "number", + "description": "The number of redirects in this version." + }, + "alias": { + "type": "string", + "description": "The staging link for previewing redirects in this version." + } + }, + "required": [ + "createdBy", + "id", + "key", + "lastModified" + ], + "type": "object" + } + }, + "required": [ + "version" + ], + "type": "object" + }, + { + "properties": { + "alias": { + "nullable": true + }, + "version": { + "properties": { + "id": { + "type": "string", + "description": "The unique identifier for the version." + }, + "key": { + "type": "string", + "description": "The key of the version. The key may be duplicated across versions if the contents are the same as a different version." + }, + "lastModified": { + "type": "number" + }, + "createdBy": { + "type": "string" + }, + "name": { + "type": "string", + "description": "Optional name for the version. If not provided, defaults to an ISO timestamp string." + }, + "isStaging": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether this version has not been promoted to production yet and is not serving end users." + }, + "isLive": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether this version is currently live in production." + }, + "redirectCount": { + "type": "number", + "description": "The number of redirects in this version." + }, + "alias": { + "type": "string", + "description": "The staging link for previewing redirects in this version." + } + }, + "required": [ + "createdBy", + "id", + "key", + "lastModified" + ], + "type": "object" + } + }, + "required": [ + "alias", + "version" + ], + "type": "object" + }, + { + "properties": { + "alias": { + "nullable": true, + "type": "string" + }, + "version": { + "properties": { + "id": { + "type": "string", + "description": "The unique identifier for the version." + }, + "key": { + "type": "string", + "description": "The key of the version. The key may be duplicated across versions if the contents are the same as a different version." + }, + "lastModified": { + "type": "number" + }, + "createdBy": { + "type": "string" + }, + "name": { + "type": "string", + "description": "Optional name for the version. If not provided, defaults to an ISO timestamp string." + }, + "isStaging": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether this version has not been promoted to production yet and is not serving end users." + }, + "isLive": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether this version is currently live in production." + }, + "redirectCount": { + "type": "number", + "description": "The number of redirects in this version." + }, + "alias": { + "type": "string", + "description": "The staging link for previewing redirects in this version." + } + }, + "required": [ + "createdBy", + "id", + "key", + "lastModified" + ], + "type": "object" + } + }, + "required": [ + "alias", + "version" + ], + "type": "object" + } + ] + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid.\nOne of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + }, + "500": { + "description": "" + } + }, + "parameters": [ + { + "name": "projectId", + "in": "query", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "name": { + "type": "string", + "maxLength": 256 + }, + "redirects": { + "description": "The redirects to delete. The source of the redirect is used to match the redirect to delete.", + "type": "array", + "minItems": 1, + "items": { + "type": "string" + } + } + }, + "required": [ + "redirects" + ] + } + } + } + } + }, + "patch": { + "description": "Edits a single redirect identified by its source path. Stages a new change with the modified redirect and returns the alias for the new version in the response.", + "operationId": "editRedirect", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Edit a project-level redirect.", + "tags": [ + "bulk-redirects" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "alias": { + "nullable": true, + "type": "string" + }, + "version": { + "properties": { + "id": { + "type": "string", + "description": "The unique identifier for the version." + }, + "key": { + "type": "string", + "description": "The key of the version. The key may be duplicated across versions if the contents are the same as a different version." + }, + "lastModified": { + "type": "number" + }, + "createdBy": { + "type": "string" + }, + "name": { + "type": "string", + "description": "Optional name for the version. If not provided, defaults to an ISO timestamp string." + }, + "isStaging": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether this version has not been promoted to production yet and is not serving end users." + }, + "isLive": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether this version is currently live in production." + }, + "redirectCount": { + "type": "number", + "description": "The number of redirects in this version." + }, + "alias": { + "type": "string", + "description": "The staging link for previewing redirects in this version." + } + }, + "required": [ + "createdBy", + "id", + "key", + "lastModified" + ], + "type": "object" + } + }, + "required": [ + "alias", + "version" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid.\nOne of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + }, + "500": { + "description": "" + } + }, + "parameters": [ + { + "name": "projectId", + "in": "query", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "name": { + "type": "string", + "maxLength": 256 + }, + "redirect": { + "description": "The redirect object to edit. The source field is used to match the redirect to modify.", + "type": "object", + "properties": { + "source": { + "type": "string" + }, + "destination": { + "type": "string" + }, + "statusCode": { + "type": "number" + }, + "permanent": { + "type": "boolean" + }, + "caseSensitive": { + "type": "boolean" + }, + "query": { + "type": "boolean" + }, + "preserveQueryParams": { + "type": "boolean" + } + }, + "required": [ + "source" + ], + "additionalProperties": false + }, + "restore": { + "description": "If true, restores the redirect from the latest production version to staging.", + "type": "boolean" + } + }, + "required": [ + "redirect" + ] + } + } + } + } + } + }, + "/v1/bulk-redirects/restore": { + "post": { + "description": "Restores the provided redirects in the staging version to the value in the production version. If no production version exists, removes the redirects from staging.", + "operationId": "restoreRedirects", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Restore staged project-level redirects to their production version.", + "tags": [ + "bulk-redirects" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "version": { + "properties": { + "id": { + "type": "string", + "description": "The unique identifier for the version." + }, + "key": { + "type": "string", + "description": "The key of the version. The key may be duplicated across versions if the contents are the same as a different version." + }, + "lastModified": { + "type": "number" + }, + "createdBy": { + "type": "string" + }, + "name": { + "type": "string", + "description": "Optional name for the version. If not provided, defaults to an ISO timestamp string." + }, + "isStaging": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether this version has not been promoted to production yet and is not serving end users." + }, + "isLive": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether this version is currently live in production." + }, + "redirectCount": { + "type": "number", + "description": "The number of redirects in this version." + }, + "alias": { + "type": "string", + "description": "The staging link for previewing redirects in this version." + } + }, + "required": [ + "createdBy", + "id", + "key", + "lastModified" + ], + "type": "object" + }, + "restored": { + "items": { + "type": "string" + }, + "type": "array" + }, + "failedToRestore": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "failedToRestore", + "restored", + "version" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid.\nOne of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + }, + "500": { + "description": "" + } + }, + "parameters": [ + { + "name": "projectId", + "in": "query", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "name": { + "type": "string", + "maxLength": 256 + }, + "redirects": { + "description": "The redirects to restore. The source of the redirect is used to match the redirect to restore.", + "type": "array", + "minItems": 1, + "maxItems": 100, + "items": { + "type": "string" + } + } + }, + "required": [ + "redirects" + ] + } + } + } + } + } + }, + "/v1/bulk-redirects/versions": { + "get": { + "description": "Get the version history for a project's bulk redirects", + "operationId": "getVersions", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Get the version history for a project's redirects.", + "tags": [ + "bulk-redirects" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "versions": { + "items": { + "properties": { + "id": { + "type": "string", + "description": "The unique identifier for the version." + }, + "key": { + "type": "string", + "description": "The key of the version. The key may be duplicated across versions if the contents are the same as a different version." + }, + "lastModified": { + "type": "number" + }, + "createdBy": { + "type": "string" + }, + "name": { + "type": "string", + "description": "Optional name for the version. If not provided, defaults to an ISO timestamp string." + }, + "isStaging": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether this version has not been promoted to production yet and is not serving end users." + }, + "isLive": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether this version is currently live in production." + }, + "redirectCount": { + "type": "number", + "description": "The number of redirects in this version." + }, + "alias": { + "type": "string", + "description": "The staging link for previewing redirects in this version." + } + }, + "required": [ + "createdBy", + "id", + "key", + "lastModified" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "versions" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "410": { + "description": "" + }, + "500": { + "description": "" + } + }, + "parameters": [ + { + "name": "projectId", + "in": "query", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + }, + "post": { + "description": "Update a version by promoting staging to production or restoring a previous production version", + "operationId": "updateVersion", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Promote a staging version to production or restore a previous production version.", + "tags": [ + "bulk-redirects" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "version": { + "properties": { + "id": { + "type": "string", + "description": "The unique identifier for the version." + }, + "key": { + "type": "string", + "description": "The key of the version. The key may be duplicated across versions if the contents are the same as a different version." + }, + "lastModified": { + "type": "number" + }, + "createdBy": { + "type": "string" + }, + "name": { + "type": "string", + "description": "Optional name for the version. If not provided, defaults to an ISO timestamp string." + }, + "isStaging": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether this version has not been promoted to production yet and is not serving end users." + }, + "isLive": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether this version is currently live in production." + }, + "redirectCount": { + "type": "number", + "description": "The number of redirects in this version." + }, + "alias": { + "type": "string", + "description": "The staging link for previewing redirects in this version." + } + }, + "required": [ + "createdBy", + "id", + "key", + "lastModified" + ], + "type": "object" + } + }, + "required": [ + "version" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid.\nOne of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + }, + "500": { + "description": "" + } + }, + "parameters": [ + { + "name": "projectId", + "in": "query", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "id", + "action" + ], + "properties": { + "id": { + "type": "string" + }, + "action": { + "type": "string", + "enum": [ + "promote", + "restore", + "discard" + ] + }, + "name": { + "type": "string", + "maxLength": 256 + } + } + } + } + } + } + } + }, + "/v2/projects/{projectIdOrName}/checks": { + "get": { + "description": "List all checks for a project, optionally filtered by target.", + "operationId": "listProjectChecks", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "List all checks for a project", + "tags": [ + "checks-v2" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "checks": { + "items": { + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "ownerId": { + "type": "string" + }, + "projectId": { + "type": "string" + }, + "isRerequestable": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "requires": { + "type": "string", + "enum": [ + "build-ready", + "deployment-url", + "none" + ] + }, + "source": { + "oneOf": [ + { + "properties": { + "kind": { + "type": "string", + "enum": [ + "integration" + ] + }, + "integrationId": { + "type": "string" + }, + "integrationConfigurationId": { + "type": "string" + }, + "resourceId": { + "type": "string" + }, + "externalResourceId": { + "type": "string" + } + }, + "required": [ + "integrationConfigurationId", + "integrationId", + "kind" + ], + "type": "object" + }, + { + "properties": { + "kind": { + "type": "string", + "enum": [ + "webhook" + ] + }, + "webhookId": { + "type": "string" + } + }, + "required": [ + "kind" + ], + "type": "object" + }, + { + "properties": { + "kind": { + "type": "string", + "enum": [ + "git-provider" + ] + }, + "provider": { + "type": "string", + "enum": [ + "bitbucket", + "github", + "gitlab" + ] + }, + "externalCheckName": { + "type": "string" + } + }, + "required": [ + "externalCheckName", + "kind", + "provider" + ], + "type": "object" + } + ] + }, + "blocks": { + "type": "string", + "enum": [ + "build-start", + "deployment-alias", + "deployment-promotion", + "deployment-start", + "none" + ] + }, + "targets": { + "items": { + "type": "string" + }, + "type": "array" + }, + "sourceKind": { + "type": "string", + "enum": [ + "git-provider", + "integration", + "vercel", + "webhook", + "integration", + "webhook", + "git-provider" + ] + }, + "sourceIntegrationConfigurationId": { + "type": "string" + }, + "timeout": { + "type": "number" + }, + "createdAt": { + "type": "number" + }, + "updatedAt": { + "type": "number" + }, + "deletedAt": { + "type": "number" + } + }, + "required": [ + "blocks", + "createdAt", + "id", + "isRerequestable", + "name", + "ownerId", + "projectId", + "requires", + "source", + "sourceKind", + "targets", + "timeout", + "updatedAt" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "checks" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "410": { + "description": "" + }, + "500": { + "description": "" + } + }, + "parameters": [ + { + "name": "projectIdOrName", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "blocks", + "in": "query", + "required": false, + "schema": { + "type": "string", + "enum": [ + "build-start", + "deployment-start", + "deployment-alias", + "deployment-promotion", + "none" + ] + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + }, + "post": { + "description": "Creates a new check for a project.", + "operationId": "createProjectCheck", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Create a check", + "tags": [ + "checks-v2" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "ownerId": { + "type": "string" + }, + "projectId": { + "type": "string" + }, + "isRerequestable": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "requires": { + "type": "string", + "enum": [ + "build-ready", + "deployment-url", + "none" + ] + }, + "source": { + "oneOf": [ + { + "properties": { + "kind": { + "type": "string", + "enum": [ + "integration" + ] + }, + "integrationId": { + "type": "string" + }, + "integrationConfigurationId": { + "type": "string" + }, + "resourceId": { + "type": "string" + }, + "externalResourceId": { + "type": "string" + } + }, + "required": [ + "integrationConfigurationId", + "integrationId", + "kind" + ], + "type": "object" + }, + { + "properties": { + "kind": { + "type": "string", + "enum": [ + "webhook" + ] + }, + "webhookId": { + "type": "string" + } + }, + "required": [ + "kind" + ], + "type": "object" + }, + { + "properties": { + "kind": { + "type": "string", + "enum": [ + "git-provider" + ] + }, + "provider": { + "type": "string", + "enum": [ + "bitbucket", + "github", + "gitlab" + ] + }, + "externalCheckName": { + "type": "string" + } + }, + "required": [ + "externalCheckName", + "kind", + "provider" + ], + "type": "object" + } + ] + }, + "blocks": { + "type": "string", + "enum": [ + "build-start", + "deployment-alias", + "deployment-promotion", + "deployment-start", + "none" + ] + }, + "targets": { + "items": { + "type": "string" + }, + "type": "array" + }, + "sourceKind": { + "type": "string", + "enum": [ + "git-provider", + "integration", + "vercel", + "webhook", + "integration", + "webhook", + "git-provider" + ] + }, + "sourceIntegrationConfigurationId": { + "type": "string" + }, + "timeout": { + "type": "number" + }, + "createdAt": { + "type": "number" + }, + "updatedAt": { + "type": "number" + }, + "deletedAt": { + "type": "number" + } + }, + "required": [ + "blocks", + "createdAt", + "id", + "isRerequestable", + "name", + "ownerId", + "projectId", + "requires", + "source", + "sourceKind", + "targets", + "timeout", + "updatedAt" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid.\nOne of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "410": { + "description": "" + }, + "500": { + "description": "" + } + }, + "parameters": [ + { + "name": "projectIdOrName", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "name": { + "type": "string" + }, + "isRerequestable": { + "type": "boolean" + }, + "requires": { + "type": "string", + "enum": [ + "build-ready", + "deployment-url", + "none" + ], + "default": "deployment-url" + }, + "targets": { + "type": "array", + "items": { + "type": "string" + }, + "uniqueItems": true + }, + "blocks": { + "type": "string", + "enum": [ + "build-start", + "deployment-start", + "deployment-alias", + "deployment-promotion", + "none" + ], + "default": "deployment-alias" + }, + "source": { + "type": "object", + "oneOf": [ + { + "properties": { + "kind": { + "type": "string", + "default": "integration" + }, + "externalResourceId": { + "type": "string" + } + } + }, + { + "properties": { + "kind": { + "type": "string" + }, + "webhookId": { + "type": "string" + } + }, + "required": [ + "kind" + ] + }, + { + "properties": { + "kind": { + "type": "string" + }, + "externalCheckName": { + "type": "string" + }, + "provider": { + "type": "string", + "enum": [ + "github" + ] + } + }, + "required": [ + "kind", + "externalCheckName", + "provider" + ] + } + ] + }, + "timeout": { + "type": "number", + "default": 300 + } + }, + "required": [ + "name", + "requires" + ], + "type": "object" + } + } + } + } + } + }, + "/v2/projects/{projectIdOrName}/checks/{checkId}": { + "get": { + "description": "Return a detailed response for a single check.", + "operationId": "getProjectCheck", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Get a check", + "tags": [ + "checks-v2" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "ownerId": { + "type": "string" + }, + "projectId": { + "type": "string" + }, + "isRerequestable": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "requires": { + "type": "string", + "enum": [ + "build-ready", + "deployment-url", + "none" + ] + }, + "source": { + "oneOf": [ + { + "properties": { + "kind": { + "type": "string", + "enum": [ + "integration" + ] + }, + "integrationId": { + "type": "string" + }, + "integrationConfigurationId": { + "type": "string" + }, + "resourceId": { + "type": "string" + }, + "externalResourceId": { + "type": "string" + } + }, + "required": [ + "integrationConfigurationId", + "integrationId", + "kind" + ], + "type": "object" + }, + { + "properties": { + "kind": { + "type": "string", + "enum": [ + "webhook" + ] + }, + "webhookId": { + "type": "string" + } + }, + "required": [ + "kind" + ], + "type": "object" + }, + { + "properties": { + "kind": { + "type": "string", + "enum": [ + "git-provider" + ] + }, + "provider": { + "type": "string", + "enum": [ + "bitbucket", + "github", + "gitlab" + ] + }, + "externalCheckName": { + "type": "string" + } + }, + "required": [ + "externalCheckName", + "kind", + "provider" + ], + "type": "object" + } + ] + }, + "blocks": { + "type": "string", + "enum": [ + "build-start", + "deployment-alias", + "deployment-promotion", + "deployment-start", + "none" + ] + }, + "targets": { + "items": { + "type": "string" + }, + "type": "array" + }, + "sourceKind": { + "type": "string", + "enum": [ + "git-provider", + "integration", + "vercel", + "webhook", + "integration", + "webhook", + "git-provider" + ] + }, + "sourceIntegrationConfigurationId": { + "type": "string" + }, + "timeout": { + "type": "number" + }, + "createdAt": { + "type": "number" + }, + "updatedAt": { + "type": "number" + }, + "deletedAt": { + "type": "number" + } + }, + "required": [ + "blocks", + "createdAt", + "id", + "isRerequestable", + "name", + "ownerId", + "projectId", + "requires", + "source", + "sourceKind", + "targets", + "timeout", + "updatedAt" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "410": { + "description": "" + }, + "500": { + "description": "" + } + }, + "parameters": [ + { + "name": "projectIdOrName", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "checkId", + "description": "The ID of the resource that will be updated.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "description": "The ID of the resource that will be updated.", + "example": "stf_89ha9sdhh9a9" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + }, + "patch": { + "description": "Update an existing check.", + "operationId": "updateProjectCheck", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Update a check", + "tags": [ + "checks-v2" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "ownerId": { + "type": "string" + }, + "projectId": { + "type": "string" + }, + "isRerequestable": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "requires": { + "type": "string", + "enum": [ + "build-ready", + "deployment-url", + "none" + ] + }, + "source": { + "oneOf": [ + { + "properties": { + "kind": { + "type": "string", + "enum": [ + "integration" + ] + }, + "integrationId": { + "type": "string" + }, + "integrationConfigurationId": { + "type": "string" + }, + "resourceId": { + "type": "string" + }, + "externalResourceId": { + "type": "string" + } + }, + "required": [ + "integrationConfigurationId", + "integrationId", + "kind" + ], + "type": "object" + }, + { + "properties": { + "kind": { + "type": "string", + "enum": [ + "webhook" + ] + }, + "webhookId": { + "type": "string" + } + }, + "required": [ + "kind" + ], + "type": "object" + }, + { + "properties": { + "kind": { + "type": "string", + "enum": [ + "git-provider" + ] + }, + "provider": { + "type": "string", + "enum": [ + "bitbucket", + "github", + "gitlab" + ] + }, + "externalCheckName": { + "type": "string" + } + }, + "required": [ + "externalCheckName", + "kind", + "provider" + ], + "type": "object" + } + ] + }, + "blocks": { + "type": "string", + "enum": [ + "build-start", + "deployment-alias", + "deployment-promotion", + "deployment-start", + "none" + ] + }, + "targets": { + "items": { + "type": "string" + }, + "type": "array" + }, + "sourceKind": { + "type": "string", + "enum": [ + "git-provider", + "integration", + "vercel", + "webhook", + "integration", + "webhook", + "git-provider" + ] + }, + "sourceIntegrationConfigurationId": { + "type": "string" + }, + "timeout": { + "type": "number" + }, + "createdAt": { + "type": "number" + }, + "updatedAt": { + "type": "number" + }, + "deletedAt": { + "type": "number" + } + }, + "required": [ + "blocks", + "createdAt", + "id", + "isRerequestable", + "name", + "ownerId", + "projectId", + "requires", + "source", + "sourceKind", + "targets", + "timeout", + "updatedAt" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid.\nOne of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + }, + "500": { + "description": "" + } + }, + "parameters": [ + { + "name": "projectIdOrName", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "checkId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "name": { + "type": "string" + }, + "isRerequestable": { + "type": "boolean" + }, + "requires": { + "type": "string", + "enum": [ + "build-ready", + "deployment-url" + ], + "default": "deployment-url" + }, + "targets": { + "type": "array", + "items": { + "type": "string" + } + }, + "blocks": { + "type": "string", + "enum": [ + "build-start", + "deployment-start", + "deployment-alias", + "deployment-promotion", + "none" + ], + "default": "deployment-alias" + }, + "timeout": { + "type": "number", + "default": 300 + } + }, + "type": "object" + } + } + } + } + }, + "delete": { + "description": "Delete an existing check and all of its runs.", + "operationId": "deleteProjectCheck", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Delete a check", + "tags": [ + "checks-v2" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "success": { + "type": "boolean", + "enum": [ + true + ] + } + }, + "required": [ + "success" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + }, + "500": { + "description": "" + } + }, + "parameters": [ + { + "name": "projectIdOrName", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "checkId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + } + }, + "/v2/projects/{projectIdOrName}/checks/{checkId}/runs": { + "get": { + "description": "List all runs associated with a given check.", + "operationId": "listCheckRuns", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "List runs for a check", + "tags": [ + "checks-v2" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "runs": { + "items": { + "oneOf": [ + { + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "ownerId": { + "type": "string" + }, + "deploymentId": { + "type": "string" + }, + "projectId": { + "type": "string" + }, + "requires": { + "type": "string", + "enum": [ + "build-ready", + "deployment-url", + "none" + ] + }, + "blocks": { + "type": "string", + "enum": [ + "build-start", + "deployment-alias", + "deployment-promotion", + "deployment-start", + "none" + ] + }, + "targets": { + "items": { + "type": "string" + }, + "type": "array" + }, + "status": { + "type": "string", + "enum": [ + "completed", + "queued", + "running" + ] + }, + "conclusion": { + "type": "string", + "enum": [ + "canceled", + "failed", + "neutral", + "skipped", + "succeeded", + "timeout" + ] + }, + "conclusionText": { + "type": "string" + }, + "externalId": { + "type": "string" + }, + "externalUrl": { + "type": "string" + }, + "output": { + "additionalProperties": true, + "type": "object" + }, + "timeout": { + "type": "number" + }, + "createdAt": { + "type": "number" + }, + "updatedAt": { + "type": "number" + }, + "completedAt": { + "type": "number" + }, + "checkId": { + "type": "string" + }, + "source": { + "oneOf": [ + { + "properties": { + "kind": { + "type": "string", + "enum": [ + "integration" + ] + }, + "integrationId": { + "type": "string" + }, + "integrationConfigurationId": { + "type": "string" + }, + "resourceId": { + "type": "string" + }, + "externalResourceId": { + "type": "string" + } + }, + "required": [ + "integrationConfigurationId", + "integrationId", + "kind" + ], + "type": "object" + }, + { + "properties": { + "kind": { + "type": "string", + "enum": [ + "webhook" + ] + }, + "webhookId": { + "type": "string" + } + }, + "required": [ + "kind" + ], + "type": "object" + }, + { + "properties": { + "kind": { + "type": "string", + "enum": [ + "git-provider" + ] + }, + "provider": { + "type": "string", + "enum": [ + "bitbucket", + "github", + "gitlab" + ] + }, + "externalCheckName": { + "type": "string" + } + }, + "required": [ + "externalCheckName", + "kind", + "provider" + ], + "type": "object" + }, + { + "properties": { + "subKind": { + "type": "string", + "enum": [ + "vercel-native-check" + ] + }, + "origin": { + "type": "string", + "enum": [ + "api", + "platform" + ] + } + }, + "type": "object", + "description": "Native Vercel checks — check definition and check run `source`." + } + ] + } + }, + "required": [ + "checkId", + "createdAt", + "deploymentId", + "id", + "name", + "ownerId", + "source", + "status", + "timeout", + "updatedAt" + ], + "type": "object", + "description": "Check run backed by a project-level `check` definition." + }, + { + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "ownerId": { + "type": "string" + }, + "deploymentId": { + "type": "string" + }, + "projectId": { + "type": "string" + }, + "requires": { + "type": "string", + "enum": [ + "build-ready", + "deployment-url", + "none" + ] + }, + "blocks": { + "type": "string", + "enum": [ + "build-start", + "deployment-alias", + "deployment-promotion", + "deployment-start", + "none" + ] + }, + "targets": { + "items": { + "type": "string" + }, + "type": "array" + }, + "status": { + "type": "string", + "enum": [ + "completed", + "queued", + "running" + ] + }, + "conclusion": { + "type": "string", + "enum": [ + "canceled", + "failed", + "neutral", + "skipped", + "succeeded", + "timeout" + ] + }, + "conclusionText": { + "type": "string" + }, + "externalId": { + "type": "string" + }, + "externalUrl": { + "type": "string" + }, + "output": { + "additionalProperties": true, + "type": "object" + }, + "timeout": { + "type": "number" + }, + "createdAt": { + "type": "number" + }, + "updatedAt": { + "type": "number" + }, + "completedAt": { + "type": "number" + }, + "source": { + "oneOf": [ + { + "properties": { + "subKind": { + "type": "string", + "enum": [ + "vercel-ci" + ] + }, + "origin": { + "type": "string", + "enum": [ + "config" + ] + }, + "invocationId": { + "type": "string" + }, + "invocationAttempt": { + "type": "number" + }, + "jobDefinitionId": { + "type": "string" + } + }, + "required": [ + "invocationId", + "jobDefinitionId", + "origin", + "subKind" + ], + "type": "object", + "description": "Config-driven CI task — check run `source` only (no parent check)." + }, + { + "properties": { + "subKind": { + "type": "string", + "enum": [ + "vercel-ci-sentinel" + ] + }, + "origin": { + "type": "string", + "enum": [ + "platform" + ] + } + }, + "required": [ + "origin", + "subKind" + ], + "type": "object", + "description": "CI sentinel — check run `source` only (no parent check)." + } + ] + } + }, + "required": [ + "createdAt", + "deploymentId", + "id", + "name", + "ownerId", + "source", + "status", + "timeout", + "updatedAt" + ], + "type": "object", + "description": "Vercel CI check run without a parent `check` (no `checkId` field)." + } + ] + }, + "type": "array" + } + }, + "required": [ + "runs" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "410": { + "description": "" + }, + "500": { + "description": "" + } + }, + "parameters": [ + { + "name": "projectIdOrName", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "checkId", + "description": "The ID of the resource that will be updated.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "description": "The ID of the resource that will be updated.", + "example": "ckr_89ha9sdhh9a9" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + } + }, + "/v2/deployments/{deploymentId}/check-runs": { + "get": { + "description": "List all check runs for a deployment.", + "operationId": "listDeploymentCheckRuns", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "List check runs for a deployment", + "tags": [ + "checks-v2" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "runs": { + "items": { + "oneOf": [ + { + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "ownerId": { + "type": "string" + }, + "deploymentId": { + "type": "string" + }, + "projectId": { + "type": "string" + }, + "requires": { + "type": "string", + "enum": [ + "build-ready", + "deployment-url", + "none" + ] + }, + "blocks": { + "type": "string", + "enum": [ + "build-start", + "deployment-alias", + "deployment-promotion", + "deployment-start", + "none" + ] + }, + "targets": { + "items": { + "type": "string" + }, + "type": "array" + }, + "status": { + "type": "string", + "enum": [ + "completed", + "queued", + "running" + ] + }, + "conclusion": { + "type": "string", + "enum": [ + "canceled", + "failed", + "neutral", + "skipped", + "succeeded", + "timeout" + ] + }, + "conclusionText": { + "type": "string" + }, + "externalId": { + "type": "string" + }, + "externalUrl": { + "type": "string" + }, + "output": { + "additionalProperties": true, + "type": "object" + }, + "timeout": { + "type": "number" + }, + "createdAt": { + "type": "number" + }, + "updatedAt": { + "type": "number" + }, + "completedAt": { + "type": "number" + }, + "checkId": { + "type": "string" + }, + "source": { + "oneOf": [ + { + "properties": { + "kind": { + "type": "string", + "enum": [ + "integration" + ] + }, + "integrationId": { + "type": "string" + }, + "integrationConfigurationId": { + "type": "string" + }, + "resourceId": { + "type": "string" + }, + "externalResourceId": { + "type": "string" + } + }, + "required": [ + "integrationConfigurationId", + "integrationId", + "kind" + ], + "type": "object" + }, + { + "properties": { + "kind": { + "type": "string", + "enum": [ + "webhook" + ] + }, + "webhookId": { + "type": "string" + } + }, + "required": [ + "kind" + ], + "type": "object" + }, + { + "properties": { + "kind": { + "type": "string", + "enum": [ + "git-provider" + ] + }, + "provider": { + "type": "string", + "enum": [ + "bitbucket", + "github", + "gitlab" + ] + }, + "externalCheckName": { + "type": "string" + } + }, + "required": [ + "externalCheckName", + "kind", + "provider" + ], + "type": "object" + }, + { + "properties": { + "subKind": { + "type": "string", + "enum": [ + "vercel-native-check" + ] + }, + "origin": { + "type": "string", + "enum": [ + "api", + "platform" + ] + } + }, + "type": "object", + "description": "Native Vercel checks — check definition and check run `source`." + } + ] + } + }, + "required": [ + "checkId", + "createdAt", + "deploymentId", + "id", + "name", + "ownerId", + "source", + "status", + "timeout", + "updatedAt" + ], + "type": "object", + "description": "Check run backed by a project-level `check` definition." + }, + { + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "ownerId": { + "type": "string" + }, + "deploymentId": { + "type": "string" + }, + "projectId": { + "type": "string" + }, + "requires": { + "type": "string", + "enum": [ + "build-ready", + "deployment-url", + "none" + ] + }, + "blocks": { + "type": "string", + "enum": [ + "build-start", + "deployment-alias", + "deployment-promotion", + "deployment-start", + "none" + ] + }, + "targets": { + "items": { + "type": "string" + }, + "type": "array" + }, + "status": { + "type": "string", + "enum": [ + "completed", + "queued", + "running" + ] + }, + "conclusion": { + "type": "string", + "enum": [ + "canceled", + "failed", + "neutral", + "skipped", + "succeeded", + "timeout" + ] + }, + "conclusionText": { + "type": "string" + }, + "externalId": { + "type": "string" + }, + "externalUrl": { + "type": "string" + }, + "output": { + "additionalProperties": true, + "type": "object" + }, + "timeout": { + "type": "number" + }, + "createdAt": { + "type": "number" + }, + "updatedAt": { + "type": "number" + }, + "completedAt": { + "type": "number" + }, + "source": { + "oneOf": [ + { + "properties": { + "subKind": { + "type": "string", + "enum": [ + "vercel-ci" + ] + }, + "origin": { + "type": "string", + "enum": [ + "config" + ] + }, + "invocationId": { + "type": "string" + }, + "invocationAttempt": { + "type": "number" + }, + "jobDefinitionId": { + "type": "string" + } + }, + "required": [ + "invocationId", + "jobDefinitionId", + "origin", + "subKind" + ], + "type": "object", + "description": "Config-driven CI task — check run `source` only (no parent check)." + }, + { + "properties": { + "subKind": { + "type": "string", + "enum": [ + "vercel-ci-sentinel" + ] + }, + "origin": { + "type": "string", + "enum": [ + "platform" + ] + } + }, + "required": [ + "origin", + "subKind" + ], + "type": "object", + "description": "CI sentinel — check run `source` only (no parent check)." + } + ] + } + }, + "required": [ + "createdAt", + "deploymentId", + "id", + "name", + "ownerId", + "source", + "status", + "timeout", + "updatedAt" + ], + "type": "object", + "description": "Vercel CI check run without a parent `check` (no `checkId` field)." + } + ] + }, + "type": "array" + } + }, + "required": [ + "runs" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "410": { + "description": "" + }, + "500": { + "description": "" + } + }, + "parameters": [ + { + "name": "deploymentId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + }, + "post": { + "description": "Creates a new check run for a deployment.", + "operationId": "createDeploymentCheckRun", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Create a check run", + "tags": [ + "checks-v2" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "oneOf": [ + { + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "ownerId": { + "type": "string" + }, + "deploymentId": { + "type": "string" + }, + "projectId": { + "type": "string" + }, + "requires": { + "type": "string", + "enum": [ + "build-ready", + "deployment-url", + "none" + ] + }, + "blocks": { + "type": "string", + "enum": [ + "build-start", + "deployment-alias", + "deployment-promotion", + "deployment-start", + "none" + ] + }, + "targets": { + "items": { + "type": "string" + }, + "type": "array" + }, + "status": { + "type": "string", + "enum": [ + "completed", + "queued", + "running" + ] + }, + "conclusion": { + "type": "string", + "enum": [ + "canceled", + "failed", + "neutral", + "skipped", + "succeeded", + "timeout" + ] + }, + "conclusionText": { + "type": "string" + }, + "externalId": { + "type": "string" + }, + "externalUrl": { + "type": "string" + }, + "output": { + "additionalProperties": true, + "type": "object" + }, + "timeout": { + "type": "number" + }, + "createdAt": { + "type": "number" + }, + "updatedAt": { + "type": "number" + }, + "completedAt": { + "type": "number" + }, + "checkId": { + "type": "string" + }, + "source": { + "oneOf": [ + { + "properties": { + "kind": { + "type": "string", + "enum": [ + "integration" + ] + }, + "integrationId": { + "type": "string" + }, + "integrationConfigurationId": { + "type": "string" + }, + "resourceId": { + "type": "string" + }, + "externalResourceId": { + "type": "string" + } + }, + "required": [ + "integrationConfigurationId", + "integrationId", + "kind" + ], + "type": "object" + }, + { + "properties": { + "kind": { + "type": "string", + "enum": [ + "webhook" + ] + }, + "webhookId": { + "type": "string" + } + }, + "required": [ + "kind" + ], + "type": "object" + }, + { + "properties": { + "kind": { + "type": "string", + "enum": [ + "git-provider" + ] + }, + "provider": { + "type": "string", + "enum": [ + "bitbucket", + "github", + "gitlab" + ] + }, + "externalCheckName": { + "type": "string" + } + }, + "required": [ + "externalCheckName", + "kind", + "provider" + ], + "type": "object" + }, + { + "properties": { + "subKind": { + "type": "string", + "enum": [ + "vercel-native-check" + ] + }, + "origin": { + "type": "string", + "enum": [ + "api", + "platform" + ] + } + }, + "type": "object", + "description": "Native Vercel checks — check definition and check run `source`." + } + ] + } + }, + "required": [ + "checkId", + "createdAt", + "deploymentId", + "id", + "name", + "ownerId", + "source", + "status", + "timeout", + "updatedAt" + ], + "type": "object", + "description": "Check run backed by a project-level `check` definition." + }, + { + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "ownerId": { + "type": "string" + }, + "deploymentId": { + "type": "string" + }, + "projectId": { + "type": "string" + }, + "requires": { + "type": "string", + "enum": [ + "build-ready", + "deployment-url", + "none" + ] + }, + "blocks": { + "type": "string", + "enum": [ + "build-start", + "deployment-alias", + "deployment-promotion", + "deployment-start", + "none" + ] + }, + "targets": { + "items": { + "type": "string" + }, + "type": "array" + }, + "status": { + "type": "string", + "enum": [ + "completed", + "queued", + "running" + ] + }, + "conclusion": { + "type": "string", + "enum": [ + "canceled", + "failed", + "neutral", + "skipped", + "succeeded", + "timeout" + ] + }, + "conclusionText": { + "type": "string" + }, + "externalId": { + "type": "string" + }, + "externalUrl": { + "type": "string" + }, + "output": { + "additionalProperties": true, + "type": "object" + }, + "timeout": { + "type": "number" + }, + "createdAt": { + "type": "number" + }, + "updatedAt": { + "type": "number" + }, + "completedAt": { + "type": "number" + }, + "source": { + "oneOf": [ + { + "properties": { + "subKind": { + "type": "string", + "enum": [ + "vercel-ci" + ] + }, + "origin": { + "type": "string", + "enum": [ + "config" + ] + }, + "invocationId": { + "type": "string" + }, + "invocationAttempt": { + "type": "number" + }, + "jobDefinitionId": { + "type": "string" + } + }, + "required": [ + "invocationId", + "jobDefinitionId", + "origin", + "subKind" + ], + "type": "object", + "description": "Config-driven CI task — check run `source` only (no parent check)." + }, + { + "properties": { + "subKind": { + "type": "string", + "enum": [ + "vercel-ci-sentinel" + ] + }, + "origin": { + "type": "string", + "enum": [ + "platform" + ] + } + }, + "required": [ + "origin", + "subKind" + ], + "type": "object", + "description": "CI sentinel — check run `source` only (no parent check)." + } + ] + } + }, + "required": [ + "createdAt", + "deploymentId", + "id", + "name", + "ownerId", + "source", + "status", + "timeout", + "updatedAt" + ], + "type": "object", + "description": "Vercel CI check run without a parent `check` (no `checkId` field)." + } + ] + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid.\nOne of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + }, + "500": { + "description": "" + } + }, + "parameters": [ + { + "name": "deploymentId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "checkId": { + "type": "string" + } + }, + "required": [ + "checkId" + ], + "type": "object" + } + } + } + } + } + }, + "/v2/deployments/{deploymentId}/check-runs/{checkRunId}": { + "get": { + "description": "Return a detailed response for a single check run.", + "operationId": "getDeploymentCheckRun", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Get a check run", + "tags": [ + "checks-v2" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "oneOf": [ + { + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "ownerId": { + "type": "string" + }, + "deploymentId": { + "type": "string" + }, + "projectId": { + "type": "string" + }, + "requires": { + "type": "string", + "enum": [ + "build-ready", + "deployment-url", + "none" + ] + }, + "blocks": { + "type": "string", + "enum": [ + "build-start", + "deployment-alias", + "deployment-promotion", + "deployment-start", + "none" + ] + }, + "targets": { + "items": { + "type": "string" + }, + "type": "array" + }, + "status": { + "type": "string", + "enum": [ + "completed", + "queued", + "running" + ] + }, + "conclusion": { + "type": "string", + "enum": [ + "canceled", + "failed", + "neutral", + "skipped", + "succeeded", + "timeout" + ] + }, + "conclusionText": { + "type": "string" + }, + "externalId": { + "type": "string" + }, + "externalUrl": { + "type": "string" + }, + "output": { + "additionalProperties": true, + "type": "object" + }, + "timeout": { + "type": "number" + }, + "createdAt": { + "type": "number" + }, + "updatedAt": { + "type": "number" + }, + "completedAt": { + "type": "number" + }, + "checkId": { + "type": "string" + }, + "source": { + "oneOf": [ + { + "properties": { + "kind": { + "type": "string", + "enum": [ + "integration" + ] + }, + "integrationId": { + "type": "string" + }, + "integrationConfigurationId": { + "type": "string" + }, + "resourceId": { + "type": "string" + }, + "externalResourceId": { + "type": "string" + } + }, + "required": [ + "integrationConfigurationId", + "integrationId", + "kind" + ], + "type": "object" + }, + { + "properties": { + "kind": { + "type": "string", + "enum": [ + "webhook" + ] + }, + "webhookId": { + "type": "string" + } + }, + "required": [ + "kind" + ], + "type": "object" + }, + { + "properties": { + "kind": { + "type": "string", + "enum": [ + "git-provider" + ] + }, + "provider": { + "type": "string", + "enum": [ + "bitbucket", + "github", + "gitlab" + ] + }, + "externalCheckName": { + "type": "string" + } + }, + "required": [ + "externalCheckName", + "kind", + "provider" + ], + "type": "object" + }, + { + "properties": { + "subKind": { + "type": "string", + "enum": [ + "vercel-native-check" + ] + }, + "origin": { + "type": "string", + "enum": [ + "api", + "platform" + ] + } + }, + "type": "object", + "description": "Native Vercel checks — check definition and check run `source`." + } + ] + } + }, + "required": [ + "checkId", + "createdAt", + "deploymentId", + "id", + "name", + "ownerId", + "source", + "status", + "timeout", + "updatedAt" + ], + "type": "object", + "description": "Check run backed by a project-level `check` definition." + }, + { + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "ownerId": { + "type": "string" + }, + "deploymentId": { + "type": "string" + }, + "projectId": { + "type": "string" + }, + "requires": { + "type": "string", + "enum": [ + "build-ready", + "deployment-url", + "none" + ] + }, + "blocks": { + "type": "string", + "enum": [ + "build-start", + "deployment-alias", + "deployment-promotion", + "deployment-start", + "none" + ] + }, + "targets": { + "items": { + "type": "string" + }, + "type": "array" + }, + "status": { + "type": "string", + "enum": [ + "completed", + "queued", + "running" + ] + }, + "conclusion": { + "type": "string", + "enum": [ + "canceled", + "failed", + "neutral", + "skipped", + "succeeded", + "timeout" + ] + }, + "conclusionText": { + "type": "string" + }, + "externalId": { + "type": "string" + }, + "externalUrl": { + "type": "string" + }, + "output": { + "additionalProperties": true, + "type": "object" + }, + "timeout": { + "type": "number" + }, + "createdAt": { + "type": "number" + }, + "updatedAt": { + "type": "number" + }, + "completedAt": { + "type": "number" + }, + "source": { + "oneOf": [ + { + "properties": { + "subKind": { + "type": "string", + "enum": [ + "vercel-ci" + ] + }, + "origin": { + "type": "string", + "enum": [ + "config" + ] + }, + "invocationId": { + "type": "string" + }, + "invocationAttempt": { + "type": "number" + }, + "jobDefinitionId": { + "type": "string" + } + }, + "required": [ + "invocationId", + "jobDefinitionId", + "origin", + "subKind" + ], + "type": "object", + "description": "Config-driven CI task — check run `source` only (no parent check)." + }, + { + "properties": { + "subKind": { + "type": "string", + "enum": [ + "vercel-ci-sentinel" + ] + }, + "origin": { + "type": "string", + "enum": [ + "platform" + ] + } + }, + "required": [ + "origin", + "subKind" + ], + "type": "object", + "description": "CI sentinel — check run `source` only (no parent check)." + } + ] + } + }, + "required": [ + "createdAt", + "deploymentId", + "id", + "name", + "ownerId", + "source", + "status", + "timeout", + "updatedAt" + ], + "type": "object", + "description": "Vercel CI check run without a parent `check` (no `checkId` field)." + } + ] + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + }, + "500": { + "description": "" + } + }, + "parameters": [ + { + "name": "deploymentId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "checkRunId", + "description": "The ID of the resource that will be updated.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "description": "The ID of the resource that will be updated.", + "example": "ckr_89ha9sdhh9a9" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + }, + "patch": { + "description": "Update an existing check run for a deployment.", + "operationId": "updateDeploymentCheckRun", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Update a check run", + "tags": [ + "checks-v2" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "oneOf": [ + { + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "ownerId": { + "type": "string" + }, + "deploymentId": { + "type": "string" + }, + "projectId": { + "type": "string" + }, + "requires": { + "type": "string", + "enum": [ + "build-ready", + "deployment-url", + "none" + ] + }, + "blocks": { + "type": "string", + "enum": [ + "build-start", + "deployment-alias", + "deployment-promotion", + "deployment-start", + "none" + ] + }, + "targets": { + "items": { + "type": "string" + }, + "type": "array" + }, + "status": { + "type": "string", + "enum": [ + "completed", + "queued", + "running" + ] + }, + "conclusion": { + "type": "string", + "enum": [ + "canceled", + "failed", + "neutral", + "skipped", + "succeeded", + "timeout" + ] + }, + "conclusionText": { + "type": "string" + }, + "externalId": { + "type": "string" + }, + "externalUrl": { + "type": "string" + }, + "output": { + "additionalProperties": true, + "type": "object" + }, + "timeout": { + "type": "number" + }, + "createdAt": { + "type": "number" + }, + "updatedAt": { + "type": "number" + }, + "completedAt": { + "type": "number" + }, + "checkId": { + "type": "string" + }, + "source": { + "oneOf": [ + { + "properties": { + "kind": { + "type": "string", + "enum": [ + "integration" + ] + }, + "integrationId": { + "type": "string" + }, + "integrationConfigurationId": { + "type": "string" + }, + "resourceId": { + "type": "string" + }, + "externalResourceId": { + "type": "string" + } + }, + "required": [ + "integrationConfigurationId", + "integrationId", + "kind" + ], + "type": "object" + }, + { + "properties": { + "kind": { + "type": "string", + "enum": [ + "webhook" + ] + }, + "webhookId": { + "type": "string" + } + }, + "required": [ + "kind" + ], + "type": "object" + }, + { + "properties": { + "kind": { + "type": "string", + "enum": [ + "git-provider" + ] + }, + "provider": { + "type": "string", + "enum": [ + "bitbucket", + "github", + "gitlab" + ] + }, + "externalCheckName": { + "type": "string" + } + }, + "required": [ + "externalCheckName", + "kind", + "provider" + ], + "type": "object" + }, + { + "properties": { + "subKind": { + "type": "string", + "enum": [ + "vercel-native-check" + ] + }, + "origin": { + "type": "string", + "enum": [ + "api", + "platform" + ] + } + }, + "type": "object", + "description": "Native Vercel checks — check definition and check run `source`." + } + ] + } + }, + "required": [ + "checkId", + "createdAt", + "deploymentId", + "id", + "name", + "ownerId", + "source", + "status", + "timeout", + "updatedAt" + ], + "type": "object", + "description": "Check run backed by a project-level `check` definition." + }, + { + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "ownerId": { + "type": "string" + }, + "deploymentId": { + "type": "string" + }, + "projectId": { + "type": "string" + }, + "requires": { + "type": "string", + "enum": [ + "build-ready", + "deployment-url", + "none" + ] + }, + "blocks": { + "type": "string", + "enum": [ + "build-start", + "deployment-alias", + "deployment-promotion", + "deployment-start", + "none" + ] + }, + "targets": { + "items": { + "type": "string" + }, + "type": "array" + }, + "status": { + "type": "string", + "enum": [ + "completed", + "queued", + "running" + ] + }, + "conclusion": { + "type": "string", + "enum": [ + "canceled", + "failed", + "neutral", + "skipped", + "succeeded", + "timeout" + ] + }, + "conclusionText": { + "type": "string" + }, + "externalId": { + "type": "string" + }, + "externalUrl": { + "type": "string" + }, + "output": { + "additionalProperties": true, + "type": "object" + }, + "timeout": { + "type": "number" + }, + "createdAt": { + "type": "number" + }, + "updatedAt": { + "type": "number" + }, + "completedAt": { + "type": "number" + }, + "source": { + "oneOf": [ + { + "properties": { + "subKind": { + "type": "string", + "enum": [ + "vercel-ci" + ] + }, + "origin": { + "type": "string", + "enum": [ + "config" + ] + }, + "invocationId": { + "type": "string" + }, + "invocationAttempt": { + "type": "number" + }, + "jobDefinitionId": { + "type": "string" + } + }, + "required": [ + "invocationId", + "jobDefinitionId", + "origin", + "subKind" + ], + "type": "object", + "description": "Config-driven CI task — check run `source` only (no parent check)." + }, + { + "properties": { + "subKind": { + "type": "string", + "enum": [ + "vercel-ci-sentinel" + ] + }, + "origin": { + "type": "string", + "enum": [ + "platform" + ] + } + }, + "required": [ + "origin", + "subKind" + ], + "type": "object", + "description": "CI sentinel — check run `source` only (no parent check)." + } + ] + } + }, + "required": [ + "createdAt", + "deploymentId", + "id", + "name", + "ownerId", + "source", + "status", + "timeout", + "updatedAt" + ], + "type": "object", + "description": "Vercel CI check run without a parent `check` (no `checkId` field)." + } + ] + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid.\nOne of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "410": { + "description": "" + }, + "413": { + "description": "The output provided is too large" + }, + "500": { + "description": "" + } + }, + "parameters": [ + { + "name": "deploymentId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "checkRunId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "additionalProperties": false, + "properties": { + "externalId": { + "type": "string" + }, + "externalUrl": { + "type": "string", + "format": "uri", + "pattern": "^https?://|^sso:" + }, + "status": { + "type": "string", + "enum": [ + "queued", + "running", + "completed" + ] + }, + "output": { + "type": "object" + }, + "completedAt": { + "type": "number" + }, + "conclusion": { + "type": "string", + "enum": [ + "canceled", + "skipped", + "timeout", + "failed", + "neutral", + "succeeded" + ] + }, + "conclusionText": { + "type": "string" + } + }, + "type": "object" + } + } + } + } + } + }, + "/v1/deployments/{deploymentId}/checks": { + "post": { + "description": "Creates a new check. This endpoint must be called with an OAuth2 or it will produce a 400 error.", + "operationId": "createCheck", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Creates a new Check", + "tags": [ + "checks" + ], + "deprecated": true, + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "id": { + "type": "string", + "example": "chk_1a2b3c4d5e6f7g8h9i0j" + }, + "name": { + "type": "string", + "example": "Performance Check" + }, + "createdAt": { + "type": "number" + }, + "updatedAt": { + "type": "number" + }, + "deploymentId": { + "type": "string" + }, + "status": { + "type": "string", + "enum": [ + "completed", + "registered", + "running" + ], + "example": "completed" + }, + "conclusion": { + "type": "string", + "enum": [ + "canceled", + "failed", + "neutral", + "skipped", + "stale", + "succeeded" + ], + "example": "succeeded" + }, + "externalId": { + "type": "string" + }, + "output": { + "properties": { + "metrics": { + "properties": { + "FCP": { + "properties": { + "value": { + "nullable": true, + "type": "number" + }, + "previousValue": { + "type": "number" + }, + "source": { + "type": "string", + "enum": [ + "web-vitals" + ] + } + }, + "required": [ + "source", + "value" + ], + "type": "object" + }, + "LCP": { + "properties": { + "value": { + "nullable": true, + "type": "number" + }, + "previousValue": { + "type": "number" + }, + "source": { + "type": "string", + "enum": [ + "web-vitals" + ] + } + }, + "required": [ + "source", + "value" + ], + "type": "object" + }, + "CLS": { + "properties": { + "value": { + "nullable": true, + "type": "number" + }, + "previousValue": { + "type": "number" + }, + "source": { + "type": "string", + "enum": [ + "web-vitals" + ] + } + }, + "required": [ + "source", + "value" + ], + "type": "object" + }, + "TBT": { + "properties": { + "value": { + "nullable": true, + "type": "number" + }, + "previousValue": { + "type": "number" + }, + "source": { + "type": "string", + "enum": [ + "web-vitals" + ] + } + }, + "required": [ + "source", + "value" + ], + "type": "object" + }, + "virtualExperienceScore": { + "properties": { + "value": { + "nullable": true, + "type": "number" + }, + "previousValue": { + "type": "number" + }, + "source": { + "type": "string", + "enum": [ + "web-vitals" + ] + } + }, + "required": [ + "source", + "value" + ], + "type": "object" + } + }, + "required": [ + "CLS", + "FCP", + "LCP", + "TBT" + ], + "type": "object" + } + }, + "type": "object" + }, + "completedAt": { + "type": "number" + }, + "path": { + "type": "string", + "example": "/api/users" + }, + "blocking": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "detailsUrl": { + "type": "string" + }, + "integrationId": { + "type": "string" + }, + "startedAt": { + "type": "number" + }, + "rerequestable": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "blocking", + "createdAt", + "deploymentId", + "id", + "integrationId", + "name", + "status", + "updatedAt" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid.\nOne of the provided values in the request query is invalid.\nCannot create check for finished deployment\nThe provided token is not from an OAuth2 Client" + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "The deployment was not found" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "deploymentId", + "description": "The deployment to create the check for.", + "in": "path", + "required": true, + "schema": { + "description": "The deployment to create the check for.", + "example": "dpl_2qn7PZrx89yxY34vEZPD31Y9XVj6", + "type": "string" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "name": { + "description": "The name of the check being created", + "maxLength": 100, + "example": "Performance Check", + "type": "string" + }, + "path": { + "description": "Path of the page that is being checked", + "type": "string", + "maxLength": 255, + "example": "/" + }, + "blocking": { + "description": "Whether the check should block a deployment from succeeding", + "type": "boolean", + "example": true + }, + "detailsUrl": { + "description": "URL to display for further details", + "type": "string", + "example": "http://example.com" + }, + "externalId": { + "description": "An identifier that can be used as an external reference", + "type": "string", + "example": "1234abc" + }, + "rerequestable": { + "description": "Whether a user should be able to request for the check to be rerun if it fails", + "type": "boolean", + "example": true + } + }, + "required": [ + "name", + "blocking" + ], + "type": "object" + } + } + }, + "required": true + } + }, + "get": { + "description": "List all of the checks created for a deployment.", + "operationId": "getAllChecks", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Retrieve a list of all checks", + "tags": [ + "checks" + ], + "deprecated": true, + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "checks": { + "items": { + "properties": { + "completedAt": { + "type": "number" + }, + "conclusion": { + "type": "string", + "enum": [ + "canceled", + "failed", + "neutral", + "skipped", + "stale", + "succeeded" + ] + }, + "createdAt": { + "type": "number" + }, + "detailsUrl": { + "type": "string" + }, + "id": { + "type": "string" + }, + "integrationId": { + "type": "string" + }, + "name": { + "type": "string" + }, + "output": { + "properties": { + "metrics": { + "properties": { + "FCP": { + "properties": { + "value": { + "nullable": true, + "type": "number" + }, + "previousValue": { + "type": "number" + }, + "source": { + "type": "string", + "enum": [ + "web-vitals" + ] + } + }, + "required": [ + "source", + "value" + ], + "type": "object" + }, + "LCP": { + "properties": { + "value": { + "nullable": true, + "type": "number" + }, + "previousValue": { + "type": "number" + }, + "source": { + "type": "string", + "enum": [ + "web-vitals" + ] + } + }, + "required": [ + "source", + "value" + ], + "type": "object" + }, + "CLS": { + "properties": { + "value": { + "nullable": true, + "type": "number" + }, + "previousValue": { + "type": "number" + }, + "source": { + "type": "string", + "enum": [ + "web-vitals" + ] + } + }, + "required": [ + "source", + "value" + ], + "type": "object" + }, + "TBT": { + "properties": { + "value": { + "nullable": true, + "type": "number" + }, + "previousValue": { + "type": "number" + }, + "source": { + "type": "string", + "enum": [ + "web-vitals" + ] + } + }, + "required": [ + "source", + "value" + ], + "type": "object" + }, + "virtualExperienceScore": { + "properties": { + "value": { + "nullable": true, + "type": "number" + }, + "previousValue": { + "type": "number" + }, + "source": { + "type": "string", + "enum": [ + "web-vitals" + ] + } + }, + "required": [ + "source", + "value" + ], + "type": "object" + } + }, + "required": [ + "CLS", + "FCP", + "LCP", + "TBT" + ], + "type": "object" + } + }, + "type": "object" + }, + "path": { + "type": "string" + }, + "rerequestable": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "blocking": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "startedAt": { + "type": "number" + }, + "status": { + "type": "string", + "enum": [ + "completed", + "registered", + "running" + ] + }, + "updatedAt": { + "type": "number" + } + }, + "required": [ + "blocking", + "createdAt", + "id", + "integrationId", + "name", + "rerequestable", + "status", + "updatedAt" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "checks" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "The deployment was not found" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "deploymentId", + "description": "The deployment to get all checks for", + "in": "path", + "required": true, + "schema": { + "description": "The deployment to get all checks for", + "example": "dpl_2qn7PZrx89yxY34vEZPD31Y9XVj6", + "type": "string" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + } + }, + "/v1/deployments/{deploymentId}/checks/{checkId}": { + "get": { + "description": "Return a detailed response for a single check.", + "operationId": "getCheck", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Get a single check", + "tags": [ + "checks" + ], + "deprecated": true, + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "updatedAt": { + "type": "number" + }, + "deploymentId": { + "type": "string" + }, + "status": { + "type": "string", + "enum": [ + "completed", + "registered", + "running" + ] + }, + "conclusion": { + "type": "string", + "enum": [ + "canceled", + "failed", + "neutral", + "skipped", + "stale", + "succeeded" + ] + }, + "externalId": { + "type": "string" + }, + "output": { + "properties": { + "metrics": { + "properties": { + "FCP": { + "properties": { + "value": { + "nullable": true, + "type": "number" + }, + "previousValue": { + "type": "number" + }, + "source": { + "type": "string", + "enum": [ + "web-vitals" + ] + } + }, + "required": [ + "source", + "value" + ], + "type": "object" + }, + "LCP": { + "properties": { + "value": { + "nullable": true, + "type": "number" + }, + "previousValue": { + "type": "number" + }, + "source": { + "type": "string", + "enum": [ + "web-vitals" + ] + } + }, + "required": [ + "source", + "value" + ], + "type": "object" + }, + "CLS": { + "properties": { + "value": { + "nullable": true, + "type": "number" + }, + "previousValue": { + "type": "number" + }, + "source": { + "type": "string", + "enum": [ + "web-vitals" + ] + } + }, + "required": [ + "source", + "value" + ], + "type": "object" + }, + "TBT": { + "properties": { + "value": { + "nullable": true, + "type": "number" + }, + "previousValue": { + "type": "number" + }, + "source": { + "type": "string", + "enum": [ + "web-vitals" + ] + } + }, + "required": [ + "source", + "value" + ], + "type": "object" + }, + "virtualExperienceScore": { + "properties": { + "value": { + "nullable": true, + "type": "number" + }, + "previousValue": { + "type": "number" + }, + "source": { + "type": "string", + "enum": [ + "web-vitals" + ] + } + }, + "required": [ + "source", + "value" + ], + "type": "object" + } + }, + "required": [ + "CLS", + "FCP", + "LCP", + "TBT" + ], + "type": "object" + } + }, + "type": "object" + }, + "completedAt": { + "type": "number" + }, + "path": { + "type": "string" + }, + "blocking": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "detailsUrl": { + "type": "string" + }, + "integrationId": { + "type": "string" + }, + "startedAt": { + "type": "number" + }, + "rerequestable": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "blocking", + "createdAt", + "deploymentId", + "id", + "integrationId", + "name", + "status", + "updatedAt" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource.\nThe provided token is not from an OAuth2 Client that created the Check" + }, + "404": { + "description": "Check was not found\nThe deployment was not found" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "deploymentId", + "description": "The deployment to get the check for.", + "in": "path", + "required": true, + "schema": { + "description": "The deployment to get the check for.", + "example": "dpl_2qn7PZrx89yxY34vEZPD31Y9XVj6", + "type": "string" + } + }, + { + "name": "checkId", + "description": "The check to fetch", + "in": "path", + "required": true, + "schema": { + "description": "The check to fetch", + "example": "check_2qn7PZrx89yxY34vEZPD31Y9XVj6", + "type": "string" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + }, + "patch": { + "description": "Update an existing check. This endpoint must be called with an OAuth2 or it will produce a 400 error.", + "operationId": "updateCheck", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Update a check", + "tags": [ + "checks" + ], + "deprecated": true, + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "updatedAt": { + "type": "number" + }, + "deploymentId": { + "type": "string" + }, + "status": { + "type": "string", + "enum": [ + "completed", + "registered", + "running" + ] + }, + "conclusion": { + "type": "string", + "enum": [ + "canceled", + "failed", + "neutral", + "skipped", + "stale", + "succeeded" + ] + }, + "externalId": { + "type": "string" + }, + "output": { + "properties": { + "metrics": { + "properties": { + "FCP": { + "properties": { + "value": { + "nullable": true, + "type": "number" + }, + "previousValue": { + "type": "number" + }, + "source": { + "type": "string", + "enum": [ + "web-vitals" + ] + } + }, + "required": [ + "source", + "value" + ], + "type": "object" + }, + "LCP": { + "properties": { + "value": { + "nullable": true, + "type": "number" + }, + "previousValue": { + "type": "number" + }, + "source": { + "type": "string", + "enum": [ + "web-vitals" + ] + } + }, + "required": [ + "source", + "value" + ], + "type": "object" + }, + "CLS": { + "properties": { + "value": { + "nullable": true, + "type": "number" + }, + "previousValue": { + "type": "number" + }, + "source": { + "type": "string", + "enum": [ + "web-vitals" + ] + } + }, + "required": [ + "source", + "value" + ], + "type": "object" + }, + "TBT": { + "properties": { + "value": { + "nullable": true, + "type": "number" + }, + "previousValue": { + "type": "number" + }, + "source": { + "type": "string", + "enum": [ + "web-vitals" + ] + } + }, + "required": [ + "source", + "value" + ], + "type": "object" + }, + "virtualExperienceScore": { + "properties": { + "value": { + "nullable": true, + "type": "number" + }, + "previousValue": { + "type": "number" + }, + "source": { + "type": "string", + "enum": [ + "web-vitals" + ] + } + }, + "required": [ + "source", + "value" + ], + "type": "object" + } + }, + "required": [ + "CLS", + "FCP", + "LCP", + "TBT" + ], + "type": "object" + } + }, + "type": "object" + }, + "completedAt": { + "type": "number" + }, + "path": { + "type": "string" + }, + "blocking": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "detailsUrl": { + "type": "string" + }, + "integrationId": { + "type": "string" + }, + "startedAt": { + "type": "number" + }, + "rerequestable": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "blocking", + "createdAt", + "deploymentId", + "id", + "integrationId", + "name", + "status", + "updatedAt" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid.\nOne of the provided values in the request query is invalid.\nThe provided token is not from an OAuth2 Client" + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "Check was not found\nThe deployment was not found" + }, + "410": { + "description": "" + }, + "413": { + "description": "The output provided is too large" + } + }, + "parameters": [ + { + "name": "deploymentId", + "description": "The deployment to update the check for.", + "in": "path", + "required": true, + "schema": { + "description": "The deployment to update the check for.", + "example": "dpl_2qn7PZrx89yxY34vEZPD31Y9XVj6", + "type": "string" + } + }, + { + "name": "checkId", + "description": "The check being updated", + "in": "path", + "required": true, + "schema": { + "description": "The check being updated", + "example": "check_2qn7PZrx89yxY34vEZPD31Y9XVj6", + "type": "string" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "name": { + "description": "The name of the check being created", + "maxLength": 100, + "example": "Performance Check", + "type": "string" + }, + "path": { + "description": "Path of the page that is being checked", + "type": "string", + "maxLength": 255, + "example": "/" + }, + "status": { + "description": "The current status of the check", + "enum": [ + "running", + "completed" + ] + }, + "conclusion": { + "description": "The result of the check being run", + "enum": [ + "canceled", + "failed", + "neutral", + "succeeded", + "skipped" + ] + }, + "detailsUrl": { + "description": "A URL a user may visit to see more information about the check", + "type": "string", + "example": "https://example.com/check/run/1234abc" + }, + "output": { + "description": "The results of the check Run", + "type": "object", + "properties": { + "metrics": { + "type": "object", + "description": "Metrics about the page", + "required": [ + "FCP", + "LCP", + "CLS", + "TBT" + ], + "additionalProperties": false, + "properties": { + "FCP": { + "type": "object", + "required": [ + "value", + "source" + ], + "properties": { + "value": { + "type": "number", + "example": 1200, + "description": "First Contentful Paint value", + "nullable": true + }, + "previousValue": { + "type": "number", + "example": 900, + "description": "Previous First Contentful Paint value to display a delta" + }, + "source": { + "type": "string", + "enum": [ + "web-vitals" + ] + } + } + }, + "LCP": { + "type": "object", + "required": [ + "value", + "source" + ], + "properties": { + "value": { + "type": "number", + "example": 1200, + "description": "Largest Contentful Paint value", + "nullable": true + }, + "previousValue": { + "type": "number", + "example": 1000, + "description": "Previous Largest Contentful Paint value to display a delta" + }, + "source": { + "type": "string", + "enum": [ + "web-vitals" + ] + } + } + }, + "CLS": { + "type": "object", + "required": [ + "value", + "source" + ], + "properties": { + "value": { + "type": "number", + "example": 4, + "description": "Cumulative Layout Shift value", + "nullable": true + }, + "previousValue": { + "type": "number", + "example": 2, + "description": "Previous Cumulative Layout Shift value to display a delta" + }, + "source": { + "type": "string", + "enum": [ + "web-vitals" + ] + } + } + }, + "TBT": { + "type": "object", + "required": [ + "value", + "source" + ], + "properties": { + "value": { + "type": "number", + "example": 3000, + "description": "Total Blocking Time value", + "nullable": true + }, + "previousValue": { + "type": "number", + "example": 3500, + "description": "Previous Total Blocking Time value to display a delta" + }, + "source": { + "enum": [ + "web-vitals" + ] + } + } + }, + "virtualExperienceScore": { + "type": "object", + "required": [ + "value", + "source" + ], + "properties": { + "value": { + "type": "integer", + "maximum": 100, + "minimum": 0, + "example": 30, + "description": "The calculated Virtual Experience Score value, between 0 and 100", + "nullable": true + }, + "previousValue": { + "type": "integer", + "maximum": 100, + "minimum": 0, + "example": 35, + "description": "A previous Virtual Experience Score value to display a delta, between 0 and 100" + }, + "source": { + "enum": [ + "web-vitals" + ] + } + } + } + } + } + } + }, + "externalId": { + "description": "An identifier that can be used as an external reference", + "type": "string", + "example": "1234abc" + } + }, + "type": "object" + } + } + }, + "required": true + } + } + }, + "/v1/deployments/{deploymentId}/checks/{checkId}/rerequest": { + "post": { + "description": "Rerequest a selected check that has failed.", + "operationId": "rerequestCheck", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Rerequest a check", + "tags": [ + "checks" + ], + "deprecated": true, + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "The deployment was not found\nCheck was not found" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "deploymentId", + "description": "The deployment to rerun the check for.", + "in": "path", + "required": true, + "schema": { + "description": "The deployment to rerun the check for.", + "example": "dpl_2qn7PZrx89yxY34vEZPD31Y9XVj6", + "type": "string" + } + }, + { + "name": "checkId", + "description": "The check to rerun", + "in": "path", + "required": true, + "schema": { + "description": "The check to rerun", + "example": "check_2qn7PZrx89yxY34vEZPD31Y9XVj6", + "type": "string" + } + }, + { + "name": "autoUpdate", + "description": "Mark the check as running", + "in": "query", + "required": false, + "schema": { + "description": "Mark the check as running", + "type": "boolean" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + } + }, + "/v1/connect/networks": { + "get": { + "description": "Allows to list Secure Compute networks.", + "operationId": "listNetworks", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "List Secure Compute networks", + "tags": [ + "networking" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "items": { + "$ref": "#/components/schemas/Network" + }, + "type": "array" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "includeHostedZones", + "description": "Whether to include Hosted Zones in the response", + "in": "query", + "schema": { + "type": "boolean", + "description": "Whether to include Hosted Zones in the response", + "default": true + } + }, + { + "name": "includePeeringConnections", + "description": "Whether to include VPC Peering connections in the response", + "in": "query", + "schema": { + "type": "boolean", + "description": "Whether to include VPC Peering connections in the response", + "default": true + } + }, + { + "name": "includeProjects", + "description": "Whether to include projects in the response", + "in": "query", + "schema": { + "type": "boolean", + "description": "Whether to include projects in the response", + "default": true + } + }, + { + "name": "search", + "description": "The query to use as a filter for returned networks", + "in": "query", + "schema": { + "type": "string", + "description": "The query to use as a filter for returned networks", + "maxLength": 255 + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + }, + "post": { + "description": "Allows to create a Secure Compute network.", + "operationId": "createNetwork", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Create a Secure Compute network", + "tags": [ + "networking" + ], + "responses": { + "201": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Network" + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "402": { + "description": "The account is missing a payment so payment method must be updated" + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "409": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "additionalProperties": false, + "properties": { + "awsAvailabilityZoneIds": { + "type": "array", + "items": { + "type": "string", + "description": "An AWS Availability Zone ID to use for the network", + "example": "use1-az1" + }, + "minItems": 2, + "maxItems": 2 + }, + "cidr": { + "type": "string", + "description": "The CIDR block of the network", + "example": "192.168.0.0/16" + }, + "name": { + "type": "string", + "description": "The name of the network", + "maxLength": 255 + }, + "region": { + "type": "string", + "description": "The region where the network will be created", + "example": "iad1" + } + }, + "required": [ + "cidr", + "name", + "region" + ] + } + } + } + } + } + }, + "/v1/connect/networks/{networkId}": { + "delete": { + "description": "Allows to delete a Secure Compute network.", + "operationId": "deleteNetwork", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Delete a Secure Compute network", + "tags": [ + "networking" + ], + "responses": { + "204": { + "description": "" + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "402": { + "description": "" + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "409": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "networkId", + "description": "The ID of the network to delete", + "in": "path", + "required": true, + "schema": { + "type": "string", + "description": "The ID of the network to delete", + "example": "uzrmorq7bn05z-fz" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + }, + "patch": { + "description": "Allows to update a Secure Compute network.", + "operationId": "updateNetwork", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Update a Secure Compute network", + "tags": [ + "networking" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Network" + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid.\nOne of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "networkId", + "description": "The unique identifier of the Secure Compute network", + "in": "path", + "required": true, + "schema": { + "type": "string", + "description": "The unique identifier of the Secure Compute network", + "example": "uzrmorq7bn05z-fz" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "additionalProperties": false, + "properties": { + "name": { + "type": "string", + "description": "The name of the Secure Compute network", + "maxLength": 255 + } + }, + "required": [ + "name" + ] + } + } + } + } + }, + "get": { + "description": "Allows to read a Secure Compute network.", + "operationId": "readNetwork", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Read a Secure Compute network", + "tags": [ + "networking" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Network" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "networkId", + "description": "The unique identifier of the Secure Compute network", + "in": "path", + "required": true, + "schema": { + "type": "string", + "description": "The unique identifier of the Secure Compute network", + "example": "uzrmorq7bn05z-fz" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + } + }, + "/v1/networking/privatelink/endpoints": { + "post": { + "description": "Creates a PrivateLink endpoint for a project.", + "operationId": "createPrivateLinkEndpoint", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Create a PrivateLink endpoint", + "tags": [ + "networking" + ], + "responses": { + "201": { + "description": "The PrivateLink endpoint was created and is being provisioned.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PrivateLinkEndpoint" + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "409": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "additionalProperties": false, + "properties": { + "projectId": { + "type": "string", + "description": "The project ID to create the PrivateLink endpoint for.", + "example": "prj_a1b2c3d4e5f6g7h8" + }, + "name": { + "type": "string", + "description": "The name of the PrivateLink endpoint, used as its label in the Vercel dashboard.", + "example": "payments-db", + "maxLength": 255 + }, + "vercelRegion": { + "type": "string", + "description": "The Vercel region to provision the endpoint in. Advanced Networking must be enabled for the project in that region. The endpoint service itself may live in another AWS region.", + "example": "iad1" + }, + "awsServiceName": { + "type": "string", + "description": "The name of the AWS VPC endpoint service to connect to. Its AWS region is read from the name; when that region differs from the one behind `vercelRegion`, the service must allow cross-region access.", + "example": "com.amazonaws.vpce.us-east-1.vpce-svc-0123456789abcdef0" + }, + "enablePrivateDns": { + "type": "boolean", + "description": "Whether to resolve the endpoint service through its private DNS names, which are then returned in `privateDnsNames`. Defaults to `false`, in which case the endpoint is reachable through the DNS names in `awsDnsEntries`.", + "example": false + } + }, + "required": [ + "projectId", + "name", + "vercelRegion", + "awsServiceName" + ] + } + } + } + } + }, + "get": { + "description": "Lists all PrivateLink endpoints for a project.", + "operationId": "listPrivateLinkEndpoints", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "List PrivateLink endpoints", + "tags": [ + "networking" + ], + "responses": { + "200": { + "description": "The PrivateLink endpoints of the project.", + "content": { + "application/json": { + "schema": { + "items": { + "$ref": "#/components/schemas/PrivateLinkEndpoint" + }, + "type": "array" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "projectId", + "description": "The project ID to list PrivateLink endpoints for.", + "in": "query", + "required": true, + "schema": { + "type": "string", + "description": "The project ID to list PrivateLink endpoints for.", + "example": "prj_a1b2c3d4e5f6g7h8" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + } + }, + "/v1/networking/privatelink/endpoints/{endpointId}": { + "get": { + "description": "Reads a single PrivateLink endpoint.", + "operationId": "readPrivateLinkEndpoint", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Read a PrivateLink endpoint", + "tags": [ + "networking" + ], + "responses": { + "200": { + "description": "The requested PrivateLink endpoint.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PrivateLinkEndpoint" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "projectId", + "description": "The project ID the PrivateLink endpoint belongs to.", + "in": "query", + "required": true, + "schema": { + "type": "string", + "description": "The project ID the PrivateLink endpoint belongs to.", + "example": "prj_a1b2c3d4e5f6g7h8" + } + }, + { + "name": "endpointId", + "description": "The unique identifier of the PrivateLink endpoint.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "description": "The unique identifier of the PrivateLink endpoint.", + "example": "ple_a1b2c3d4e5f6g7h8" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + }, + "delete": { + "description": "Deletes a PrivateLink endpoint.", + "operationId": "deletePrivateLinkEndpoint", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Delete a PrivateLink endpoint", + "tags": [ + "networking" + ], + "responses": { + "204": { + "description": "The PrivateLink endpoint was deleted.", + "content": { + "application/json": { + "schema": { + "nullable": true + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "409": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "projectId", + "description": "The project ID the PrivateLink endpoint belongs to.", + "in": "query", + "required": true, + "schema": { + "type": "string", + "description": "The project ID the PrivateLink endpoint belongs to.", + "example": "prj_a1b2c3d4e5f6g7h8" + } + }, + { + "name": "endpointId", + "description": "The unique identifier of the PrivateLink endpoint.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "description": "The unique identifier of the PrivateLink endpoint.", + "example": "ple_a1b2c3d4e5f6g7h8" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + }, + "patch": { + "description": "Updates a PrivateLink endpoint (name, privateDns).", + "operationId": "updatePrivateLinkEndpoint", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Update a PrivateLink endpoint", + "tags": [ + "networking" + ], + "responses": { + "200": { + "description": "The updated PrivateLink endpoint.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PrivateLinkEndpoint" + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid.\nOne of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "409": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "projectId", + "description": "The project ID the PrivateLink endpoint belongs to.", + "in": "query", + "required": true, + "schema": { + "type": "string", + "description": "The project ID the PrivateLink endpoint belongs to.", + "example": "prj_a1b2c3d4e5f6g7h8" + } + }, + { + "name": "endpointId", + "description": "The unique identifier of the PrivateLink endpoint.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "description": "The unique identifier of the PrivateLink endpoint.", + "example": "ple_a1b2c3d4e5f6g7h8" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "additionalProperties": false, + "properties": { + "name": { + "type": "string", + "description": "A new name for the PrivateLink endpoint. When omitted, the current name is kept.", + "example": "payments-db", + "maxLength": 255 + }, + "enablePrivateDns": { + "type": "boolean", + "description": "When `true`, resolves the endpoint service through its private DNS names, which are then returned in `privateDnsNames`. When `false`, clears them. When omitted, the current setting is kept. At least one of `name` or `enablePrivateDns` must be provided.", + "example": false + } + } + } + } + } + } + } + }, + "/v2/connect/connectors": { + "get": { + "description": "List connectors that belong to a team.", + "operationId": "listConnectors", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "List connectors", + "tags": [ + "connect" + ], + "responses": { + "200": { + "description": "A page of connectors.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConnectConnectorList" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConnectError" + } + } + } + }, + "401": { + "description": "The request is not authorized.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConnectError" + } + } + } + }, + "403": { + "description": "You do not have permission to access this resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConnectError" + } + } + } + }, + "410": { + "description": "The requested resource is no longer available.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConnectError" + } + } + } + }, + "422": { + "description": "The request cannot be completed in the current state.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConnectError" + } + } + } + } + }, + "parameters": [ + { + "name": "limit", + "description": "Maximum number of connectors to return. Defaults to 20.", + "in": "query", + "schema": { + "type": "integer", + "minimum": 1, + "maximum": 100, + "description": "Maximum number of connectors to return. Defaults to 20." + } + }, + { + "name": "cursor", + "description": "Cursor from `pagination.next` on the previous response.", + "in": "query", + "schema": { + "type": "string", + "description": "Cursor from `pagination.next` on the previous response." + } + }, + { + "name": "projectId", + "description": "Return only connectors connected to this project.", + "in": "query", + "schema": { + "type": "string", + "description": "Return only connectors connected to this project." + } + }, + { + "name": "search", + "description": "Search connector names, UIDs, and services.", + "in": "query", + "schema": { + "type": "string", + "maxLength": 100, + "description": "Search connector names, UIDs, and services." + } + }, + { + "name": "type", + "description": "Comma-separated connector types: `slack`, `discord`, `github`, `linear`, `linq`, `salesforce`, `sendblue`, `snowflake`, `snowflake-wif`, `microsoft-entra`, `api-key`, `photon`, `oauth`, or `custom`.", + "in": "query", + "schema": { + "type": "string", + "description": "Comma-separated connector types: `slack`, `discord`, `github`, `linear`, `linq`, `salesforce`, `sendblue`, `snowflake`, `snowflake-wif`, `microsoft-entra`, `api-key`, `photon`, `oauth`, or `custom`." + } + }, + { + "name": "service", + "description": "Comma-separated provider or service identifiers.", + "in": "query", + "schema": { + "type": "string", + "description": "Comma-separated provider or service identifiers." + } + }, + { + "name": "sort", + "description": "Sort by name in ascending order, or by creation or update time in descending order.", + "in": "query", + "schema": { + "type": "string", + "enum": [ + "name", + "createdAt", + "updatedAt" + ], + "description": "Sort by name in ascending order, or by creation or update time in descending order." + } + }, + { + "description": "The team ID that scopes the request. Do not send it with slug. If both are omitted, Vercel uses the team associated with the token or the authenticated user's default team. The request returns 401 if no team can be selected.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The team slug that scopes the request. Do not send it with teamId. If both are omitted, Vercel uses the team associated with the token or the authenticated user's default team. The request returns 401 if no team can be selected.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + } + }, + "/v1/connect/connectors/{connector}": { + "get": { + "description": "Get the connector by ID. Accepts a dashboard/team requester or a deployment's project OIDC token; project requesters may only read connectors linked to their project and environment.", + "operationId": "getConnector", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Get a connector", + "tags": [ + "connect" + ], + "responses": { + "200": { + "description": "The connector.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConnectConnector" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConnectError" + } + } + } + }, + "401": { + "description": "The request is not authorized.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConnectError" + } + } + } + }, + "403": { + "description": "You do not have permission to access this resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConnectError" + } + } + } + }, + "404": { + "description": "The requested resource was not found.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConnectError" + } + } + } + }, + "410": { + "description": "The requested resource is no longer available.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConnectError" + } + } + } + }, + "422": { + "description": "The request cannot be completed in the current state.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConnectError" + } + } + } + } + }, + "parameters": [ + { + "name": "connector", + "description": "Stable connector ID or URL-encoded team-scoped UID. Examples: `scl_abc123` or `slack%2Fmy-bot`.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "description": "Stable connector ID or URL-encoded team-scoped UID. Examples: `scl_abc123` or `slack%2Fmy-bot`." + } + }, + { + "description": "The team ID that scopes the request. Do not send it with slug. If both are omitted, Vercel uses the team associated with the token or the authenticated user's default team. The request returns 401 if no team can be selected.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The team slug that scopes the request. Do not send it with teamId. If both are omitted, Vercel uses the team associated with the token or the authenticated user's default team. The request returns 401 if no team can be selected.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + }, + "delete": { + "description": "Delete a connector, its project connections, and its installation records.", + "operationId": "deleteConnector", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Delete a connector", + "tags": [ + "connect" + ], + "responses": { + "204": { + "description": "The connector, its project connections, and its installation records were deleted." + }, + "400": { + "description": "One of the provided values in the request query is invalid.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConnectError" + } + } + } + }, + "401": { + "description": "The request is not authorized.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConnectError" + } + } + } + }, + "403": { + "description": "You do not have permission to access this resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConnectError" + } + } + } + }, + "404": { + "description": "The requested resource was not found.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConnectError" + } + } + } + }, + "409": { + "description": "The request conflicts with the current resource state.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConnectError" + } + } + } + }, + "410": { + "description": "The requested resource is no longer available.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConnectError" + } + } + } + }, + "422": { + "description": "The request cannot be completed in the current state.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConnectError" + } + } + } + }, + "502": { + "description": "A dependency returned an invalid or unsuccessful response.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConnectError" + } + } + } + } + }, + "parameters": [ + { + "name": "connector", + "description": "Stable connector ID or URL-encoded team-scoped UID. Examples: `scl_abc123` or `slack%2Fmy-bot`.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "description": "Stable connector ID or URL-encoded team-scoped UID. Examples: `scl_abc123` or `slack%2Fmy-bot`." + } + }, + { + "description": "The team ID that scopes the request. Do not send it with slug. If both are omitted, Vercel uses the team associated with the token or the authenticated user's default team. The request returns 401 if no team can be selected.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The team slug that scopes the request. Do not send it with teamId. If both are omitted, Vercel uses the team associated with the token or the authenticated user's default team. The request returns 401 if no team can be selected.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + } + }, + "/v1/connect/connectors": { + "post": { + "description": "Create a connector and optionally link it to a project. Use `type` with complete provider data, or use `service` with `connectionMethod` so Connect can supply the type, endpoints, templates, and defaults.", + "operationId": "createConnector", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Create a connector", + "tags": [ + "connect" + ], + "responses": { + "201": { + "description": "The connector was created.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConnectConnectorCreateResult" + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConnectError" + } + } + } + }, + "401": { + "description": "The request is not authorized.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConnectError" + } + } + } + }, + "403": { + "description": "You do not have permission to access this resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConnectError" + } + } + } + }, + "404": { + "description": "The requested resource was not found.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConnectError" + } + } + } + }, + "409": { + "description": "The request conflicts with the current resource state.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConnectError" + } + } + } + }, + "410": { + "description": "The requested resource is no longer available.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConnectError" + } + } + } + }, + "422": { + "description": "The request cannot be completed in the current state.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConnectError" + } + } + } + }, + "500": { + "description": "An internal error occurred.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConnectError" + } + } + } + }, + "502": { + "description": "A dependency returned an invalid or unsuccessful response.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConnectError" + } + } + } + } + }, + "parameters": [ + { + "description": "The team ID that scopes the request. Do not send it with slug. If both are omitted, Vercel uses the team associated with the token or the authenticated user's default team. The request returns 401 if no team can be selected.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The team slug that scopes the request. Do not send it with teamId. If both are omitted, Vercel uses the team associated with the token or the authenticated user's default team. The request returns 401 if no team can be selected.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConnectCreateConnectorRequest" + } + } + } + } + } + }, + "/v2/connect/connectors/{connector}": { + "patch": { + "description": "Update a connector and return the connector with any service-side update signals that the caller must handle.", + "operationId": "updateConnector", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Update a connector", + "tags": [ + "connect" + ], + "responses": { + "200": { + "description": "The updated connector and any required service-side follow-up signals.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConnectConnectorUpdateResult" + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid.\nOne of the provided values in the request query is invalid.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConnectError" + } + } + } + }, + "401": { + "description": "The request is not authorized.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConnectError" + } + } + } + }, + "403": { + "description": "You do not have permission to access this resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConnectError" + } + } + } + }, + "404": { + "description": "The requested resource was not found.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConnectError" + } + } + } + }, + "409": { + "description": "The request conflicts with the current resource state.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConnectError" + } + } + } + }, + "410": { + "description": "The requested resource is no longer available.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConnectError" + } + } + } + }, + "422": { + "description": "The request cannot be completed in the current state.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConnectError" + } + } + } + }, + "502": { + "description": "A dependency returned an invalid or unsuccessful response.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConnectError" + } + } + } + } + }, + "parameters": [ + { + "name": "connector", + "description": "Stable connector ID or URL-encoded team-scoped UID. Examples: `scl_abc123` or `slack%2Fmy-bot`.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "description": "Stable connector ID or URL-encoded team-scoped UID. Examples: `scl_abc123` or `slack%2Fmy-bot`." + } + }, + { + "description": "The team ID that scopes the request. Do not send it with slug. If both are omitted, Vercel uses the team associated with the token or the authenticated user's default team. The request returns 401 if no team can be selected.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The team slug that scopes the request. Do not send it with teamId. If both are omitted, Vercel uses the team associated with the token or the authenticated user's default team. The request returns 401 if no team can be selected.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConnectUpdateConnectorRequest" + } + } + }, + "required": true + } + } + }, + "/v1/connect/connectors/{connector}/trigger-destinations": { + "patch": { + "description": "Replace the full set of destinations that receive trigger requests for a connector.", + "operationId": "replaceConnectorTriggerDestinations", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Update connector trigger destinations", + "tags": [ + "connect" + ], + "responses": { + "200": { + "description": "The connector with its replaced trigger destinations.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConnectConnector" + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid.\nOne of the provided values in the request query is invalid.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConnectError" + } + } + } + }, + "401": { + "description": "The request is not authorized.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConnectError" + } + } + } + }, + "403": { + "description": "You do not have permission to access this resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConnectError" + } + } + } + }, + "404": { + "description": "The requested resource was not found.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConnectError" + } + } + } + }, + "410": { + "description": "The requested resource is no longer available.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConnectError" + } + } + } + }, + "422": { + "description": "The request cannot be completed in the current state.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConnectError" + } + } + } + } + }, + "parameters": [ + { + "name": "connector", + "description": "Stable connector ID or URL-encoded team-scoped UID. Examples: `scl_abc123` or `slack%2Fmy-bot`.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "description": "Stable connector ID or URL-encoded team-scoped UID. Examples: `scl_abc123` or `slack%2Fmy-bot`." + } + }, + { + "description": "The team ID that scopes the request. Do not send it with slug. If both are omitted, Vercel uses the team associated with the token or the authenticated user's default team. The request returns 401 if no team can be selected.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The team slug that scopes the request. Do not send it with teamId. If both are omitted, Vercel uses the team associated with the token or the authenticated user's default team. The request returns 401 if no team can be selected.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConnectReplaceTriggerDestinationsRequest" + } + } + }, + "required": true + } + } + }, + "/v2/connect/connectors/{connector}/projects": { + "get": { + "description": "List the projects connected to a connector and the environments where each connection is available.", + "operationId": "listConnectorProjectConnections", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "List projects for a connector", + "tags": [ + "connect" + ], + "responses": { + "200": { + "description": "A page of project connections for the connector.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConnectConnectorProjectConnectionList" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConnectError" + } + } + } + }, + "401": { + "description": "The request is not authorized.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConnectError" + } + } + } + }, + "403": { + "description": "You do not have permission to access this resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConnectError" + } + } + } + }, + "404": { + "description": "The requested resource was not found.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConnectError" + } + } + } + }, + "410": { + "description": "The requested resource is no longer available.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConnectError" + } + } + } + }, + "422": { + "description": "The request cannot be completed in the current state.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConnectError" + } + } + } + } + }, + "parameters": [ + { + "name": "connector", + "description": "Stable connector ID or URL-encoded team-scoped UID. Examples: `scl_abc123` or `slack%2Fmy-bot`.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "description": "Stable connector ID or URL-encoded team-scoped UID. Examples: `scl_abc123` or `slack%2Fmy-bot`." + } + }, + { + "name": "limit", + "description": "Maximum number of project connections to return. Defaults to 50.", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "minimum": 1, + "maximum": 100, + "description": "Maximum number of project connections to return. Defaults to 50." + } + }, + { + "name": "cursor", + "description": "Cursor from `pagination.next` on the previous response.", + "in": "query", + "required": false, + "schema": { + "type": "string", + "description": "Cursor from `pagination.next` on the previous response." + } + }, + { + "description": "The team ID that scopes the request. Do not send it with slug. If both are omitted, Vercel uses the team associated with the token or the authenticated user's default team. The request returns 401 if no team can be selected.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The team slug that scopes the request. Do not send it with teamId. If both are omitted, Vercel uses the team associated with the token or the authenticated user's default team. The request returns 401 if no team can be selected.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + } + }, + "/v1/connect/connectors/{connector}/projects/{projectId}": { + "get": { + "description": "Get the configuration that connects a connector to a project.", + "operationId": "getConnectorProjectConnection", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Get a connector project connection", + "tags": [ + "connect" + ], + "responses": { + "200": { + "description": "The connector project connection.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConnectProjectConnection" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConnectError" + } + } + } + }, + "401": { + "description": "The request is not authorized.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConnectError" + } + } + } + }, + "403": { + "description": "You do not have permission to access this resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConnectError" + } + } + } + }, + "404": { + "description": "The requested resource was not found.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConnectError" + } + } + } + }, + "410": { + "description": "The requested resource is no longer available.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConnectError" + } + } + } + } + }, + "parameters": [ + { + "name": "connector", + "description": "Stable connector ID or URL-encoded team-scoped UID. Examples: `scl_abc123` or `slack%2Fmy-bot`.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "description": "Stable connector ID or URL-encoded team-scoped UID. Examples: `scl_abc123` or `slack%2Fmy-bot`." + } + }, + { + "name": "projectId", + "description": "Vercel project ID.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "description": "Vercel project ID." + } + }, + { + "description": "The team ID that scopes the request. Do not send it with slug. If both are omitted, Vercel uses the team associated with the token or the authenticated user's default team. The request returns 401 if no team can be selected.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The team slug that scopes the request. Do not send it with teamId. If both are omitted, Vercel uses the team associated with the token or the authenticated user's default team. The request returns 401 if no team can be selected.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + }, + "post": { + "description": "Connect a connector to a project, or replace the environments on an existing project connection.", + "operationId": "upsertConnectorProjectConnection", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Create or update a connector project connection", + "tags": [ + "connect" + ], + "responses": { + "200": { + "description": "The connector project connection was created or updated.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConnectProjectConnection" + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid.\nOne of the provided values in the request query is invalid.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConnectError" + } + } + } + }, + "401": { + "description": "The request is not authorized.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConnectError" + } + } + } + }, + "403": { + "description": "You do not have permission to access this resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConnectError" + } + } + } + }, + "404": { + "description": "The requested resource was not found.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConnectError" + } + } + } + }, + "410": { + "description": "The requested resource is no longer available.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConnectError" + } + } + } + } + }, + "parameters": [ + { + "name": "connector", + "description": "Stable connector ID or URL-encoded team-scoped UID. Examples: `scl_abc123` or `slack%2Fmy-bot`.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "description": "Stable connector ID or URL-encoded team-scoped UID. Examples: `scl_abc123` or `slack%2Fmy-bot`." + } + }, + { + "name": "projectId", + "description": "Vercel project ID.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "description": "Vercel project ID." + } + }, + { + "description": "The team ID that scopes the request. Do not send it with slug. If both are omitted, Vercel uses the team associated with the token or the authenticated user's default team. The request returns 401 if no team can be selected.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The team slug that scopes the request. Do not send it with teamId. If both are omitted, Vercel uses the team associated with the token or the authenticated user's default team. The request returns 401 if no team can be selected.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConnectUpsertProjectConnectionRequest" + } + } + }, + "required": true + } + }, + "delete": { + "description": "Disconnect a connector from a project.", + "operationId": "deleteConnectorProjectConnection", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Disconnect a connector from a project", + "tags": [ + "connect" + ], + "responses": { + "204": { + "description": "The connector was disconnected from the project." + }, + "400": { + "description": "One of the provided values in the request query is invalid.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConnectError" + } + } + } + }, + "401": { + "description": "The request is not authorized.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConnectError" + } + } + } + }, + "403": { + "description": "You do not have permission to access this resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConnectError" + } + } + } + }, + "404": { + "description": "The requested resource was not found.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConnectError" + } + } + } + }, + "410": { + "description": "The requested resource is no longer available.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConnectError" + } + } + } + } + }, + "parameters": [ + { + "name": "connector", + "description": "Stable connector ID or URL-encoded team-scoped UID. Examples: `scl_abc123` or `slack%2Fmy-bot`.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "description": "Stable connector ID or URL-encoded team-scoped UID. Examples: `scl_abc123` or `slack%2Fmy-bot`." + } + }, + { + "name": "projectId", + "description": "Vercel project ID.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "description": "Vercel project ID." + } + }, + { + "description": "The team ID that scopes the request. Do not send it with slug. If both are omitted, Vercel uses the team associated with the token or the authenticated user's default team. The request returns 401 if no team can be selected.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The team slug that scopes the request. Do not send it with teamId. If both are omitted, Vercel uses the team associated with the token or the authenticated user's default team. The request returns 401 if no team can be selected.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + } + }, + "/v2/connect/projects/{projectId}/connectors": { + "get": { + "description": "List the connectors connected to a project and the environments where each connection is available.", + "operationId": "listProjectConnectorConnections", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "List connectors for a project", + "tags": [ + "connect" + ], + "responses": { + "200": { + "description": "A page of connector connections for the project.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConnectProjectConnectorConnectionList" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConnectError" + } + } + } + }, + "401": { + "description": "The request is not authorized.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConnectError" + } + } + } + }, + "403": { + "description": "You do not have permission to access this resource.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConnectError" + } + } + } + }, + "404": { + "description": "The requested resource was not found.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConnectError" + } + } + } + }, + "410": { + "description": "The requested resource is no longer available.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConnectError" + } + } + } + } + }, + "parameters": [ + { + "name": "projectId", + "description": "Vercel project ID.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "description": "Vercel project ID." + } + }, + { + "name": "limit", + "description": "Maximum number of connector connections to return. Defaults to 50.", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "minimum": 1, + "maximum": 100, + "description": "Maximum number of connector connections to return. Defaults to 50." + } + }, + { + "name": "cursor", + "description": "Cursor from `pagination.next` on the previous response.", + "in": "query", + "required": false, + "schema": { + "type": "string", + "description": "Cursor from `pagination.next` on the previous response." + } + }, + { + "description": "The team ID that scopes the request. Do not send it with slug. If both are omitted, Vercel uses the team associated with the token or the authenticated user's default team. The request returns 401 if no team can be selected.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The team slug that scopes the request. Do not send it with teamId. If both are omitted, Vercel uses the team associated with the token or the authenticated user's default team. The request returns 401 if no team can be selected.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + } + }, + "/v1/connect/token/{connector}": { + "post": { + "description": "Get an access token for a connector identified by the path parameter and scoped to the requester.", + "operationId": "getConnectorToken", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Get a Connect token", + "tags": [ + "connect" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "token": { + "type": "string" + }, + "tokenId": { + "type": "string" + }, + "expiresAt": { + "type": "number" + }, + "connector": { + "properties": { + "id": { + "type": "string" + }, + "uid": { + "type": "string" + }, + "type": { + "type": "string" + } + }, + "required": [ + "id", + "type", + "uid" + ], + "type": "object" + }, + "name": { + "type": "string" + }, + "installationId": { + "type": "string" + }, + "tenantId": { + "type": "string" + }, + "externalSubject": { + "type": "string" + }, + "authorizationId": { + "type": "string", + "description": "Stable id correlating all tokens (including refreshes) back to the original authorization." + }, + "tokenGroupId": { + "type": "string", + "description": "Stable id that groups all tokens with the same parameters across refreshes." + }, + "claims": { + "additionalProperties": true, + "type": "object", + "description": "Claims extracted from the provider's tokens per the connector's `ForwardedClaims` allow-list. Currently sourced from the OIDC id_token only." + }, + "metadata": { + "additionalProperties": true, + "type": "object", + "description": "Driver-specific metadata (e.g., botUserId for Slack)." + } + }, + "required": [ + "connector", + "expiresAt", + "token", + "tokenId" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid.\nOne of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + }, + "422": { + "description": "" + }, + "429": { + "description": "" + } + }, + "parameters": [ + { + "name": "connector", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "subject": { + "anyOf": [ + { + "title": "type:app", + "type": "object", + "required": [ + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "app" + ] + } + }, + "additionalProperties": true + }, + { + "title": "type:user", + "type": "object", + "required": [ + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "user" + ] + }, + "id": { + "type": "string" + }, + "issuer": { + "type": "string" + } + }, + "additionalProperties": true + }, + { + "title": "type:jwt-bearer", + "type": "object", + "required": [ + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "jwt-bearer" + ] + }, + "sub": { + "type": "string" + }, + "iss": { + "type": "string" + }, + "aud": { + "type": "string" + }, + "additionalClaims": { + "type": "object", + "additionalProperties": true + } + }, + "additionalProperties": true + }, + { + "title": "type:token", + "type": "object", + "required": [ + "type", + "token" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "token" + ] + }, + "token": { + "type": "string" + } + }, + "additionalProperties": false + }, + { + "title": "type:other", + "type": "object", + "required": [ + "type" + ], + "properties": { + "type": { + "type": "string" + } + }, + "not": { + "properties": { + "type": { + "type": "string", + "enum": [ + "token" + ] + } + }, + "required": [ + "type" + ] + }, + "additionalProperties": true + } + ] + }, + "installationId": { + "type": "string" + }, + "audience": { + "type": "array", + "items": { + "type": "string" + } + }, + "scopes": { + "type": "array", + "items": { + "type": "string" + } + }, + "resources": { + "type": "array", + "items": { + "type": "string" + } + }, + "authorizationDetails": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type": { + "type": "string" + } + }, + "additionalProperties": true + } + }, + "validityBufferMs": { + "type": "number" + } + } + } + } + } + } + } + }, + "/v1/connect/authorize/{connector}": { + "post": { + "description": "Create an authorization request for a connector and return the URL and verifier details needed to complete the flow.", + "operationId": "createConnectorAuthorizationRequest", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Create a Connect authorization request", + "tags": [ + "connect" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "url": { + "type": "string" + }, + "request": { + "type": "string" + }, + "verifier": { + "type": "string" + }, + "deviceCode": { + "type": "string" + }, + "expiresAt": { + "type": "number" + }, + "connector": { + "properties": { + "id": { + "type": "string", + "description": "Client id (e.g. `scl_…`)." + }, + "uid": { + "type": "string", + "description": "Client uid (e.g. `salesforce/my-org`)." + }, + "type": { + "type": "string", + "description": "Client type (e.g. `oauth`, `salesforce`)." + }, + "service": { + "type": "string", + "description": "Resolved service id when known (e.g. `salesforce`), following the `stored.service ?? typeDef.service ?? stored.type` convention." + }, + "serviceName": { + "type": "string", + "description": "Curated display name of the resolved service (e.g. \"Salesforce\"), present when the service is a known service. Suited for end-user surfaces like \"Sign in with {serviceName}\"." + }, + "displayName": { + "type": "string", + "description": "Provider-facing display name when the connector type exposes one, falling back to the stored connector name." + }, + "name": { + "type": "string", + "description": "The connector's own name: the operator-given client name, falling back to the client type's name for legacy rows without one." + } + }, + "required": [ + "displayName", + "id", + "name", + "type", + "uid" + ], + "type": "object" + } + }, + "required": [ + "connector", + "expiresAt", + "request", + "url", + "verifier" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid.\nOne of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "connector", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "subject": { + "anyOf": [ + { + "title": "type:app", + "type": "object", + "required": [ + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "app" + ] + } + }, + "additionalProperties": true + }, + { + "title": "type:user", + "type": "object", + "required": [ + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "user" + ] + }, + "id": { + "type": "string" + }, + "issuer": { + "type": "string" + } + }, + "additionalProperties": true + }, + { + "title": "type:jwt-bearer", + "type": "object", + "required": [ + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "jwt-bearer" + ] + }, + "sub": { + "type": "string" + }, + "iss": { + "type": "string" + }, + "aud": { + "type": "string" + }, + "additionalClaims": { + "type": "object", + "additionalProperties": true + } + }, + "additionalProperties": true + }, + { + "title": "type:token", + "type": "object", + "required": [ + "type", + "token" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "token" + ] + }, + "token": { + "type": "string" + } + }, + "additionalProperties": false + }, + { + "title": "type:other", + "type": "object", + "required": [ + "type" + ], + "properties": { + "type": { + "type": "string" + } + }, + "not": { + "properties": { + "type": { + "type": "string", + "enum": [ + "token" + ] + } + }, + "required": [ + "type" + ] + }, + "additionalProperties": true + } + ] + }, + "installationId": { + "type": "string" + }, + "audience": { + "type": "array", + "items": { + "type": "string" + } + }, + "scopes": { + "type": "array", + "items": { + "type": "string" + } + }, + "resources": { + "type": "array", + "items": { + "type": "string" + } + }, + "authorizationDetails": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type": { + "type": "string" + } + }, + "additionalProperties": true + } + }, + "validityBufferMs": { + "type": "number" + }, + "returnUrl": { + "type": "string" + }, + "webhook": { + "type": "string" + }, + "prompt": { + "type": "string" + }, + "deviceCode": { + "type": "boolean" + }, + "expiresInMs": { + "type": "number" + }, + "additionalParams": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + } + } + } + } + } + } + }, + "/v3/deployments/{idOrUrl}/events": { + "get": { + "description": "Get the build logs of a deployment by deployment ID and build ID. It can work as an infinite stream of logs or as a JSON endpoint depending on the input parameters.", + "operationId": "getDeploymentEvents", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Get deployment events", + "tags": [ + "deployments" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "command", + "delimiter", + "deployment-state", + "edge-function-invocation", + "exit", + "fatal", + "metric", + "middleware", + "middleware-invocation", + "report", + "stderr", + "stdout" + ] + }, + "created": { + "type": "number" + }, + "payload": { + "properties": { + "deploymentId": { + "type": "string" + }, + "info": { + "properties": { + "type": { + "type": "string" + }, + "name": { + "type": "string" + }, + "entrypoint": { + "type": "string" + }, + "path": { + "type": "string" + }, + "step": { + "type": "string" + }, + "readyState": { + "type": "string" + }, + "serviceName": { + "type": "string" + } + }, + "required": [ + "name", + "type" + ], + "type": "object" + }, + "text": { + "type": "string" + }, + "id": { + "type": "string" + }, + "date": { + "type": "number" + }, + "serial": { + "type": "string" + }, + "created": { + "type": "number" + }, + "statusCode": { + "type": "number" + }, + "requestId": { + "type": "string" + }, + "proxy": { + "properties": { + "timestamp": { + "type": "number" + }, + "method": { + "type": "string" + }, + "host": { + "type": "string" + }, + "path": { + "type": "string" + }, + "statusCode": { + "type": "number" + }, + "userAgent": { + "items": { + "type": "string" + }, + "type": "array" + }, + "referer": { + "type": "string" + }, + "clientIp": { + "type": "string" + }, + "region": { + "type": "string" + }, + "scheme": { + "type": "string" + }, + "responseByteSize": { + "type": "number" + }, + "cacheId": { + "type": "string" + }, + "pathType": { + "type": "string" + }, + "pathTypeVariant": { + "type": "string" + }, + "vercelId": { + "type": "string" + }, + "vercelCache": { + "type": "string", + "enum": [ + "BYPASS", + "HIT", + "MISS", + "PRERENDER", + "REVALIDATED", + "STALE" + ] + }, + "lambdaRegion": { + "type": "string" + }, + "wafAction": { + "type": "string", + "enum": [ + "bypass", + "challenge", + "deny", + "log", + "rate_limit" + ] + }, + "wafRuleId": { + "type": "string" + } + }, + "required": [ + "host", + "method", + "timestamp" + ], + "type": "object" + } + }, + "required": [ + "date", + "deploymentId", + "id", + "serial" + ], + "type": "object" + } + }, + "required": [ + "created", + "payload", + "type" + ], + "type": "object" + }, + { + "properties": { + "created": { + "type": "number" + }, + "date": { + "type": "number" + }, + "deploymentId": { + "type": "string" + }, + "id": { + "type": "string" + }, + "info": { + "properties": { + "type": { + "type": "string" + }, + "name": { + "type": "string" + }, + "entrypoint": { + "type": "string" + }, + "path": { + "type": "string" + }, + "step": { + "type": "string" + }, + "readyState": { + "type": "string" + }, + "serviceName": { + "type": "string" + } + }, + "required": [ + "name", + "type" + ], + "type": "object" + }, + "serial": { + "type": "string" + }, + "text": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "command", + "delimiter", + "deployment-state", + "edge-function-invocation", + "exit", + "fatal", + "metric", + "middleware", + "middleware-invocation", + "report", + "stderr", + "stdout" + ] + }, + "level": { + "type": "string", + "enum": [ + "error", + "warning" + ] + } + }, + "required": [ + "created", + "date", + "deploymentId", + "id", + "info", + "serial", + "type" + ], + "type": "object" + }, + { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "command", + "delimiter", + "deployment-state", + "edge-function-invocation", + "exit", + "fatal", + "metric", + "middleware", + "middleware-invocation", + "report", + "stderr", + "stdout" + ] + }, + "created": { + "type": "number" + }, + "payload": { + "properties": { + "deploymentId": { + "type": "string" + }, + "info": { + "properties": { + "type": { + "type": "string" + }, + "name": { + "type": "string" + }, + "entrypoint": { + "type": "string" + }, + "path": { + "type": "string" + }, + "step": { + "type": "string" + }, + "readyState": { + "type": "string" + }, + "serviceName": { + "type": "string" + } + }, + "required": [ + "name", + "type" + ], + "type": "object" + }, + "text": { + "type": "string" + }, + "id": { + "type": "string" + }, + "date": { + "type": "number" + }, + "serial": { + "type": "string" + }, + "created": { + "type": "number" + }, + "statusCode": { + "type": "number" + }, + "requestId": { + "type": "string" + }, + "proxy": { + "properties": { + "timestamp": { + "type": "number" + }, + "method": { + "type": "string" + }, + "host": { + "type": "string" + }, + "path": { + "type": "string" + }, + "statusCode": { + "type": "number" + }, + "userAgent": { + "items": { + "type": "string" + }, + "type": "array" + }, + "referer": { + "type": "string" + }, + "clientIp": { + "type": "string" + }, + "region": { + "type": "string" + }, + "scheme": { + "type": "string" + }, + "responseByteSize": { + "type": "number" + }, + "cacheId": { + "type": "string" + }, + "pathType": { + "type": "string" + }, + "pathTypeVariant": { + "type": "string" + }, + "vercelId": { + "type": "string" + }, + "vercelCache": { + "type": "string", + "enum": [ + "BYPASS", + "HIT", + "MISS", + "PRERENDER", + "REVALIDATED", + "STALE" + ] + }, + "lambdaRegion": { + "type": "string" + }, + "wafAction": { + "type": "string", + "enum": [ + "bypass", + "challenge", + "deny", + "log", + "rate_limit" + ] + }, + "wafRuleId": { + "type": "string" + } + }, + "required": [ + "host", + "method", + "timestamp" + ], + "type": "object" + } + }, + "required": [ + "date", + "deploymentId", + "id", + "serial" + ], + "type": "object" + } + }, + "required": [ + "created", + "payload", + "type" + ], + "type": "object" + }, + { + "properties": { + "created": { + "type": "number" + }, + "date": { + "type": "number" + }, + "deploymentId": { + "type": "string" + }, + "id": { + "type": "string" + }, + "info": { + "properties": { + "type": { + "type": "string" + }, + "name": { + "type": "string" + }, + "entrypoint": { + "type": "string" + }, + "path": { + "type": "string" + }, + "step": { + "type": "string" + }, + "readyState": { + "type": "string" + }, + "serviceName": { + "type": "string" + } + }, + "required": [ + "name", + "type" + ], + "type": "object" + }, + "serial": { + "type": "string" + }, + "text": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "command", + "delimiter", + "deployment-state", + "edge-function-invocation", + "exit", + "fatal", + "metric", + "middleware", + "middleware-invocation", + "report", + "stderr", + "stdout" + ] + }, + "level": { + "type": "string", + "enum": [ + "error", + "warning" + ] + } + }, + "required": [ + "created", + "date", + "deploymentId", + "id", + "info", + "serial", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "alias-assigned" + ] + }, + "deploymentId": { + "type": "string" + }, + "date": { + "type": "number" + }, + "alias": { + "items": { + "type": "string" + }, + "type": "array" + }, + "aliasError": { + "nullable": true, + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" + }, + "aliasWarning": { + "nullable": true, + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + }, + "link": { + "type": "string" + }, + "action": { + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" + } + }, + "required": [ + "alias", + "aliasError", + "aliasWarning", + "date", + "deploymentId", + "type" + ], + "type": "object" + } + ] + } + ], + "nullable": true + }, + "nullable": true + } + }, + "application/stream+json": { + "schema": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "command", + "delimiter", + "deployment-state", + "edge-function-invocation", + "exit", + "fatal", + "metric", + "middleware", + "middleware-invocation", + "report", + "stderr", + "stdout" + ] + }, + "created": { + "type": "number" + }, + "payload": { + "properties": { + "deploymentId": { + "type": "string" + }, + "info": { + "properties": { + "type": { + "type": "string" + }, + "name": { + "type": "string" + }, + "entrypoint": { + "type": "string" + }, + "path": { + "type": "string" + }, + "step": { + "type": "string" + }, + "readyState": { + "type": "string" + }, + "serviceName": { + "type": "string" + } + }, + "required": [ + "name", + "type" + ], + "type": "object" + }, + "text": { + "type": "string" + }, + "id": { + "type": "string" + }, + "date": { + "type": "number" + }, + "serial": { + "type": "string" + }, + "created": { + "type": "number" + }, + "statusCode": { + "type": "number" + }, + "requestId": { + "type": "string" + }, + "proxy": { + "properties": { + "timestamp": { + "type": "number" + }, + "method": { + "type": "string" + }, + "host": { + "type": "string" + }, + "path": { + "type": "string" + }, + "statusCode": { + "type": "number" + }, + "userAgent": { + "items": { + "type": "string" + }, + "type": "array" + }, + "referer": { + "type": "string" + }, + "clientIp": { + "type": "string" + }, + "region": { + "type": "string" + }, + "scheme": { + "type": "string" + }, + "responseByteSize": { + "type": "number" + }, + "cacheId": { + "type": "string" + }, + "pathType": { + "type": "string" + }, + "pathTypeVariant": { + "type": "string" + }, + "vercelId": { + "type": "string" + }, + "vercelCache": { + "type": "string", + "enum": [ + "BYPASS", + "HIT", + "MISS", + "PRERENDER", + "REVALIDATED", + "STALE" + ] + }, + "lambdaRegion": { + "type": "string" + }, + "wafAction": { + "type": "string", + "enum": [ + "bypass", + "challenge", + "deny", + "log", + "rate_limit" + ] + }, + "wafRuleId": { + "type": "string" + } + }, + "required": [ + "host", + "method", + "timestamp" + ], + "type": "object" + } + }, + "required": [ + "date", + "deploymentId", + "id", + "serial" + ], + "type": "object" + } + }, + "required": [ + "created", + "payload", + "type" + ], + "type": "object" + }, + { + "properties": { + "created": { + "type": "number" + }, + "date": { + "type": "number" + }, + "deploymentId": { + "type": "string" + }, + "id": { + "type": "string" + }, + "info": { + "properties": { + "type": { + "type": "string" + }, + "name": { + "type": "string" + }, + "entrypoint": { + "type": "string" + }, + "path": { + "type": "string" + }, + "step": { + "type": "string" + }, + "readyState": { + "type": "string" + }, + "serviceName": { + "type": "string" + } + }, + "required": [ + "name", + "type" + ], + "type": "object" + }, + "serial": { + "type": "string" + }, + "text": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "command", + "delimiter", + "deployment-state", + "edge-function-invocation", + "exit", + "fatal", + "metric", + "middleware", + "middleware-invocation", + "report", + "stderr", + "stdout" + ] + }, + "level": { + "type": "string", + "enum": [ + "error", + "warning" + ] + } + }, + "required": [ + "created", + "date", + "deploymentId", + "id", + "info", + "serial", + "type" + ], + "type": "object" + }, + { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "command", + "delimiter", + "deployment-state", + "edge-function-invocation", + "exit", + "fatal", + "metric", + "middleware", + "middleware-invocation", + "report", + "stderr", + "stdout" + ] + }, + "created": { + "type": "number" + }, + "payload": { + "properties": { + "deploymentId": { + "type": "string" + }, + "info": { + "properties": { + "type": { + "type": "string" + }, + "name": { + "type": "string" + }, + "entrypoint": { + "type": "string" + }, + "path": { + "type": "string" + }, + "step": { + "type": "string" + }, + "readyState": { + "type": "string" + }, + "serviceName": { + "type": "string" + } + }, + "required": [ + "name", + "type" + ], + "type": "object" + }, + "text": { + "type": "string" + }, + "id": { + "type": "string" + }, + "date": { + "type": "number" + }, + "serial": { + "type": "string" + }, + "created": { + "type": "number" + }, + "statusCode": { + "type": "number" + }, + "requestId": { + "type": "string" + }, + "proxy": { + "properties": { + "timestamp": { + "type": "number" + }, + "method": { + "type": "string" + }, + "host": { + "type": "string" + }, + "path": { + "type": "string" + }, + "statusCode": { + "type": "number" + }, + "userAgent": { + "items": { + "type": "string" + }, + "type": "array" + }, + "referer": { + "type": "string" + }, + "clientIp": { + "type": "string" + }, + "region": { + "type": "string" + }, + "scheme": { + "type": "string" + }, + "responseByteSize": { + "type": "number" + }, + "cacheId": { + "type": "string" + }, + "pathType": { + "type": "string" + }, + "pathTypeVariant": { + "type": "string" + }, + "vercelId": { + "type": "string" + }, + "vercelCache": { + "type": "string", + "enum": [ + "BYPASS", + "HIT", + "MISS", + "PRERENDER", + "REVALIDATED", + "STALE" + ] + }, + "lambdaRegion": { + "type": "string" + }, + "wafAction": { + "type": "string", + "enum": [ + "bypass", + "challenge", + "deny", + "log", + "rate_limit" + ] + }, + "wafRuleId": { + "type": "string" + } + }, + "required": [ + "host", + "method", + "timestamp" + ], + "type": "object" + } + }, + "required": [ + "date", + "deploymentId", + "id", + "serial" + ], + "type": "object" + } + }, + "required": [ + "created", + "payload", + "type" + ], + "type": "object" + }, + { + "properties": { + "created": { + "type": "number" + }, + "date": { + "type": "number" + }, + "deploymentId": { + "type": "string" + }, + "id": { + "type": "string" + }, + "info": { + "properties": { + "type": { + "type": "string" + }, + "name": { + "type": "string" + }, + "entrypoint": { + "type": "string" + }, + "path": { + "type": "string" + }, + "step": { + "type": "string" + }, + "readyState": { + "type": "string" + }, + "serviceName": { + "type": "string" + } + }, + "required": [ + "name", + "type" + ], + "type": "object" + }, + "serial": { + "type": "string" + }, + "text": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "command", + "delimiter", + "deployment-state", + "edge-function-invocation", + "exit", + "fatal", + "metric", + "middleware", + "middleware-invocation", + "report", + "stderr", + "stdout" + ] + }, + "level": { + "type": "string", + "enum": [ + "error", + "warning" + ] + } + }, + "required": [ + "created", + "date", + "deploymentId", + "id", + "info", + "serial", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "alias-assigned" + ] + }, + "deploymentId": { + "type": "string" + }, + "date": { + "type": "number" + }, + "alias": { + "items": { + "type": "string" + }, + "type": "array" + }, + "aliasError": { + "nullable": true, + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" + }, + "aliasWarning": { + "nullable": true, + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + }, + "link": { + "type": "string" + }, + "action": { + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" + } + }, + "required": [ + "alias", + "aliasError", + "aliasWarning", + "date", + "deploymentId", + "type" + ], + "type": "object" + } + ] + } + ] + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "410": { + "description": "" + }, + "500": { + "description": "" + } + }, + "parameters": [ + { + "name": "idOrUrl", + "description": "The unique identifier or hostname of the deployment.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "example": "dpl_5WJWYSyB7BpgTj3EuwF37WMRBXBtPQ2iTMJHJBJyRfd", + "description": "The unique identifier or hostname of the deployment." + } + }, + { + "name": "direction", + "description": "Order of the returned events based on the timestamp.", + "in": "query", + "required": false, + "schema": { + "type": "string", + "enum": [ + "backward", + "forward" + ], + "default": "forward", + "example": "backward", + "description": "Order of the returned events based on the timestamp." + } + }, + { + "name": "follow", + "description": "When enabled, this endpoint will return live events as they happen.", + "in": "query", + "required": false, + "schema": { + "type": "number", + "enum": [ + 0, + 1 + ], + "example": 1, + "description": "When enabled, this endpoint will return live events as they happen." + } + }, + { + "name": "limit", + "description": "Maximum number of events to return. Provide `-1` to return all available logs.", + "in": "query", + "required": false, + "schema": { + "type": "number", + "example": 100, + "description": "Maximum number of events to return. Provide `-1` to return all available logs." + } + }, + { + "name": "name", + "description": "Deployment build ID.", + "in": "query", + "required": false, + "schema": { + "type": "string", + "example": "bld_cotnkcr76", + "description": "Deployment build ID." + } + }, + { + "name": "since", + "description": "Timestamp for when build logs should be pulled from.", + "in": "query", + "required": false, + "schema": { + "type": "number", + "example": 1540095775941, + "description": "Timestamp for when build logs should be pulled from." + } + }, + { + "name": "until", + "description": "Timestamp for when the build logs should be pulled up until.", + "in": "query", + "required": false, + "schema": { + "type": "number", + "example": 1540106318643, + "description": "Timestamp for when the build logs should be pulled up until." + } + }, + { + "name": "statusCode", + "description": "HTTP status code range to filter events by.", + "in": "query", + "required": false, + "schema": { + "example": "5xx", + "description": "HTTP status code range to filter events by.", + "oneOf": [ + { + "type": "number" + }, + { + "type": "string" + } + ] + } + }, + { + "name": "delimiter", + "in": "query", + "required": false, + "schema": { + "type": "number", + "enum": [ + 0, + 1 + ], + "example": 1 + } + }, + { + "name": "builds", + "in": "query", + "required": false, + "schema": { + "type": "number", + "enum": [ + 0, + 1 + ], + "example": 1 + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + } + }, + "/v1/deployments/{deploymentId}/integrations/{integrationConfigurationId}/resources/{resourceId}/actions/{action}": { + "patch": { + "description": "Updates the deployment integration action for the specified integration installation", + "operationId": "update-integration-deployment-action", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Update deployment integration action", + "tags": [ + "deployments", + "integrations" + ], + "responses": { + "202": { + "description": "" + }, + "400": { + "description": "One of the provided values in the request body is invalid.\nOne of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "deploymentId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "integrationConfigurationId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "resourceId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "action", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "status": { + "type": "string", + "enum": [ + "running", + "succeeded", + "failed" + ] + }, + "statusText": { + "type": "string" + }, + "statusUrl": { + "type": "string", + "format": "uri", + "pattern": "^https?://|^sso:" + }, + "outcomes": { + "type": "array", + "items": { + "oneOf": [ + { + "type": "object", + "properties": { + "kind": { + "type": "string" + }, + "secrets": { + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "required": [ + "name", + "value" + ], + "additionalProperties": false + } + } + }, + "required": [ + "kind", + "secrets" + ], + "additionalProperties": false + } + ] + } + } + }, + "additionalProperties": false + } + } + } + } + } + }, + "/v13/deployments/{idOrUrl}": { + "get": { + "description": "Retrieves information for a deployment either by supplying its ID (`id` property) or Hostname (`url` property). Additional details will be included when the authenticated user or team is an owner of the deployment.", + "operationId": "getDeployment", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Get a deployment by ID or URL", + "tags": [ + "deployments" + ], + "responses": { + "200": { + "description": "Returns a reduced view of the deployment with public information only. Private fields are omitted when the requester is not the deployment owner.\nReturns the deployment object for the authenticated owner, including private fields such as environment variables, build log URLs, and internal metadata.\nReturns the reduced deployment view for anonymous (`vcn_`) callers. Pool-team details are withheld.", + "content": { + "application/json": { + "schema": { + "oneOf": [ + { + "properties": { + "alias": { + "items": { + "type": "string" + }, + "type": "array" + }, + "aliasAssigned": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "id": { + "type": "string", + "description": "A string holding the unique ID of the deployment", + "example": "dpl_89qyp1cskzkLrVicDaZoDbjyHuDJ" + }, + "target": { + "nullable": true, + "type": "string", + "enum": [ + "production", + "staging", + null + ], + "description": "If defined, either `staging` if a staging alias in the format `\u003cproject\u003e.\u003cteam\u003e.now.sh` was assigned upon creation, or `production` if the aliases from `alias` were assigned. `null` value indicates the \"preview\" deployment.", + "example": null + }, + "readyState": { + "type": "string", + "enum": [ + "BLOCKED", + "BUILDING", + "CANCELED", + "ERROR", + "INITIALIZING", + "QUEUED", + "READY" + ], + "description": "The state of the deployment depending on the process of deploying, or if it is ready or in an error state", + "example": "READY" + }, + "aliasError": { + "nullable": true, + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object", + "description": "An object that will contain a `code` and a `message` when the aliasing fails, otherwise the value will be `null`", + "example": null + }, + "aliasWarning": { + "nullable": true, + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + }, + "link": { + "type": "string" + }, + "action": { + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" + }, + "errorCode": { + "type": "string" + }, + "errorMessage": { + "nullable": true, + "type": "string" + } + }, + "required": [ + "aliasAssigned", + "id", + "readyState" + ], + "type": "object", + "description": "Returns the reduced deployment view for anonymous (`vcn_`) callers. Pool-team details are withheld." + }, + { + "properties": { + "aliasAssignedAt": { + "nullable": true, + "oneOf": [ + { + "type": "number" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + } + ] + }, + "alwaysRefuseToBuild": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "build": { + "properties": { + "env": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "env" + ], + "type": "object" + }, + "buildArtifactUrls": { + "items": { + "type": "string" + }, + "type": "array" + }, + "builds": { + "items": { + "properties": { + "use": { + "type": "string" + }, + "src": { + "type": "string" + }, + "config": { + "additionalProperties": true, + "type": "object" + } + }, + "required": [ + "use" + ], + "type": "object" + }, + "type": "array" + }, + "env": { + "items": { + "type": "string" + }, + "type": "array" + }, + "resourceConfig": { + "properties": { + "buildMachine": { + "properties": { + "purchaseType": { + "type": "string", + "enum": [ + "basic", + "enhanced", + "standard", + "turbo" + ], + "description": "Machine type which was purchased/selected for this build. `basic` is the 2vCPU tier, recorded on the deployment so the build pipeline can detect a basic build without consulting the project." + }, + "defaultPurchaseType": { + "type": "string", + "enum": [ + "basic", + "enhanced", + "standard" + ], + "description": "The default plan type for the build machine — what the customer is *paying* for on their plan. For most customers, this is standard, but some customers have an entitlement for enhanced builds." + }, + "machineSelectionType": { + "type": "string", + "enum": [ + "elastic", + "fixed" + ], + "description": "Whether the build ran on a fixed or elastic machine. Used to drive billing for the build." + }, + "selectionSource": { + "type": "string", + "enum": [ + "elastic-algorithm", + "plan-default", + "project-setting", + "team-entitlement", + "team-setting" + ], + "description": "The setting which selected the build machine when the deployment was created. Frozen here so later project or team changes do not rewrite its history." + }, + "cores": { + "type": "number", + "description": "Number of cores the build machine ran with. Set at dispatch time once the build lands on a hive." + }, + "memory": { + "type": "number", + "description": "Memory, in MiB, the build machine ran with. Set at dispatch time once the build lands on a hive." + } + }, + "type": "object", + "description": "Build machine configuration recorded for this deployment's build. See {@link DeploymentBuildMachine}. Distinct from the team/user `resourceConfig.buildMachine`, which only carries `default`." + } + }, + "type": "object" + }, + "inspectorUrl": { + "nullable": true, + "type": "string" + }, + "isInConcurrentBuildsQueue": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "isInSystemBuildsQueue": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "projectSettings": { + "properties": { + "nodeVersion": { + "type": "string", + "enum": [ + "10.x", + "12.x", + "14.x", + "16.x", + "18.x", + "20.x", + "22.x", + "24.x", + "8.10.x" + ] + }, + "buildCommand": { + "nullable": true, + "type": "string" + }, + "devCommand": { + "nullable": true, + "type": "string" + }, + "framework": { + "nullable": true, + "type": "string", + "enum": [ + "actix-web", + "angular", + "ash", + "astro", + "axum", + "blitzjs", + "brunch", + "bun", + "container", + "create-react-app", + "django", + "docusaurus", + "docusaurus-2", + "dojo", + "eleventy", + "elysia", + "ember", + "eve", + "express", + "factory-eve", + "fastapi", + "fasthtml", + "fastify", + "flask", + "gatsby", + "go", + "gridsome", + "h3", + "hexo", + "hono", + "hugo", + "hydrogen", + "ionic-angular", + "ionic-react", + "jekyll", + "koa", + "mastra", + "middleman", + "nestjs", + "nextjs", + "nitro", + "node", + "nuxtjs", + "parcel", + "polymer", + "preact", + "python", + "react-router", + "redwoodjs", + "remix", + "ruby", + "rust", + "saber", + "sanity", + "sanity-v2", + "sapper", + "scully", + "services", + "solidstart", + "solidstart-1", + "stencil", + "storybook", + "svelte", + "sveltekit", + "sveltekit-1", + "tanstack-start", + "tanstack-start-lovable", + "umijs", + "vite", + "vitepress", + "vue", + "vuepress", + "xmcp", + "zola", + null + ] + }, + "commandForIgnoringBuildStep": { + "nullable": true, + "type": "string" + }, + "installCommand": { + "nullable": true, + "type": "string" + }, + "outputDirectory": { + "nullable": true, + "type": "string" + }, + "speedInsights": { + "properties": { + "id": { + "type": "string" + }, + "enabledAt": { + "type": "number" + }, + "disabledAt": { + "type": "number" + }, + "canceledAt": { + "type": "number" + }, + "hasData": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "dataReceivedAt": { + "type": "number", + "description": "When the first free (not Speed Insights Plus) production data point was observed, in ms. Set once by subscriber-analytics-events; projects that already had data before this field shipped get it backfilled on their next batch, so it reads \"first free data point observed\", not necessarily \"first ever\"." + }, + "paidAt": { + "type": "number" + } + }, + "required": [ + "id" + ], + "type": "object" + }, + "webAnalytics": { + "properties": { + "id": { + "type": "string" + }, + "disabledAt": { + "type": "number" + }, + "canceledAt": { + "type": "number" + }, + "enabledAt": { + "type": "number" + }, + "hasData": { + "type": "boolean", + "enum": [ + true + ] + } + }, + "required": [ + "id" + ], + "type": "object" + } + }, + "type": "object" + }, + "integrations": { + "properties": { + "status": { + "type": "string", + "enum": [ + "error", + "pending", + "ready", + "skipped", + "timeout" + ] + }, + "startedAt": { + "type": "number" + }, + "claimedAt": { + "type": "number" + }, + "completedAt": { + "type": "number" + }, + "skippedAt": { + "type": "number" + }, + "skippedBy": { + "type": "string" + } + }, + "required": [ + "startedAt", + "status" + ], + "type": "object" + }, + "images": { + "properties": { + "sizes": { + "items": { + "type": "number" + }, + "type": "array" + }, + "qualities": { + "items": { + "type": "number" + }, + "type": "array" + }, + "domains": { + "items": { + "type": "string" + }, + "type": "array" + }, + "remotePatterns": { + "items": { + "properties": { + "protocol": { + "type": "string", + "enum": [ + "http", + "https" + ], + "description": "Must be `http` or `https`." + }, + "hostname": { + "type": "string", + "description": "Can be literal or wildcard. Single `*` matches a single subdomain. Double `**` matches any number of subdomains." + }, + "port": { + "type": "string", + "description": "Can be literal port such as `8080` or empty string meaning no port." + }, + "pathname": { + "type": "string", + "description": "Can be literal or wildcard. Single `*` matches a single path segment. Double `**` matches any number of path segments." + }, + "search": { + "type": "string", + "description": "Can be literal query string such as `?v=1` or empty string meaning no query string." + } + }, + "required": [ + "hostname" + ], + "type": "object" + }, + "type": "array" + }, + "localPatterns": { + "items": { + "properties": { + "pathname": { + "type": "string", + "description": "Can be literal or wildcard. Single `*` matches a single path segment. Double `**` matches any number of path segments." + }, + "search": { + "type": "string", + "description": "Can be literal query string such as `?v=1` or empty string meaning no query string." + } + }, + "type": "object" + }, + "type": "array" + }, + "minimumCacheTTL": { + "type": "number" + }, + "formats": { + "items": { + "type": "string", + "enum": [ + "image/avif", + "image/webp" + ] + }, + "type": "array" + }, + "dangerouslyAllowSVG": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "contentSecurityPolicy": { + "type": "string" + }, + "contentDispositionType": { + "type": "string", + "enum": [ + "attachment", + "inline" + ] + } + }, + "type": "object" + }, + "alias": { + "items": { + "type": "string" + }, + "type": "array", + "description": "A list of all the aliases (default aliases, staging aliases and production aliases) that were assigned upon deployment creation", + "example": [] + }, + "aliasAssigned": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "A boolean that will be true when the aliases from the alias property were assigned successfully", + "example": true + }, + "bootedAt": { + "type": "number" + }, + "buildingAt": { + "type": "number" + }, + "buildContainerFinishedAt": { + "type": "number", + "description": "Since April 2025 it necessary for On-Demand Concurrency Minutes calculation" + }, + "buildSkipped": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "creator": { + "properties": { + "uid": { + "type": "string", + "description": "Stable creator id across principal types (user id, app id, integration configuration id, or `system`).", + "example": "96SnxkFiMyVKsK3pnoHfx3Hz" + }, + "type": { + "type": "string", + "enum": [ + "app", + "integration", + "system", + "user" + ], + "description": "Principal type of the deployment creator." + }, + "username": { + "type": "string", + "description": "The username of the user that created the deployment", + "example": "john-doe" + }, + "avatar": { + "type": "string", + "description": "The avatar of the user that created the deployment" + } + }, + "required": [ + "uid" + ], + "type": "object", + "description": "Information about the deployment creator" + }, + "initReadyAt": { + "type": "number" + }, + "isFirstBranchDeployment": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "lambdas": { + "items": { + "properties": { + "id": { + "type": "string" + }, + "readyState": { + "type": "string", + "enum": [ + "BUILDING", + "ERROR", + "INITIALIZING", + "READY" + ] + }, + "createdAt": { + "type": "number" + }, + "entrypoint": { + "nullable": true, + "type": "string" + }, + "readyStateAt": { + "type": "number" + }, + "output": { + "items": { + "properties": { + "path": { + "type": "string" + }, + "functionName": { + "type": "string" + } + }, + "required": [ + "functionName", + "path" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "id", + "output" + ], + "type": "object", + "description": "A partial representation of a Build used by the deployment endpoint." + }, + "type": "array" + }, + "public": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "A boolean representing if the deployment is public or not. By default this is `false`", + "example": false + }, + "ready": { + "type": "number" + }, + "status": { + "type": "string", + "enum": [ + "BLOCKED", + "BUILDING", + "CANCELED", + "ERROR", + "INITIALIZING", + "QUEUED", + "READY" + ] + }, + "team": { + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "slug": { + "type": "string" + }, + "avatar": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "slug" + ], + "type": "object", + "description": "The team that owns the deployment if any" + }, + "userAliases": { + "items": { + "type": "string" + }, + "type": "array", + "description": "An array of domains that were provided by the user when creating the Deployment.", + "example": [ + "sub1.example.com", + "sub2.example.com" + ] + }, + "previewCommentsEnabled": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether or not preview comments are enabled for the deployment", + "example": false + }, + "ttyBuildLogs": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "customEnvironment": { + "oneOf": [ + { + "properties": { + "id": { + "type": "string", + "description": "Unique identifier for the custom environment (format: env_*)" + }, + "slug": { + "type": "string", + "description": "URL-friendly name of the environment" + }, + "type": { + "type": "string", + "enum": [ + "development", + "preview", + "production" + ], + "description": "The type of environment (production, preview, or development)" + }, + "description": { + "type": "string", + "description": "Optional description of the environment's purpose" + }, + "branchMatcher": { + "properties": { + "type": { + "type": "string", + "enum": [ + "endsWith", + "equals", + "startsWith" + ], + "description": "The type of matching to perform" + }, + "pattern": { + "type": "string", + "description": "The pattern to match against branch names" + } + }, + "required": [ + "pattern", + "type" + ], + "type": "object", + "description": "Configuration for matching git branches to this environment" + }, + "domains": { + "items": { + "properties": { + "name": { + "type": "string" + }, + "apexName": { + "type": "string" + }, + "projectId": { + "type": "string" + }, + "redirect": { + "nullable": true, + "type": "string" + }, + "redirectStatusCode": { + "nullable": true, + "type": "number", + "enum": [ + 301, + 302, + 307, + 308, + null + ] + }, + "gitBranch": { + "nullable": true, + "type": "string" + }, + "customEnvironmentId": { + "nullable": true, + "type": "string" + }, + "updatedAt": { + "type": "number" + }, + "createdAt": { + "type": "number" + }, + "verified": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "`true` if the domain is verified for use with the project. If `false` it will not be used as an alias on this project until the challenge in `verification` is completed." + }, + "verification": { + "items": { + "properties": { + "type": { + "type": "string" + }, + "domain": { + "type": "string" + }, + "value": { + "type": "string" + }, + "reason": { + "type": "string" + } + }, + "required": [ + "domain", + "reason", + "type", + "value" + ], + "type": "object", + "description": "A list of verification challenges, one of which must be completed to verify the domain for use on the project. After the challenge is complete `POST /projects/:idOrName/domains/:domain/verify` to verify the domain. Possible challenges: - If `verification.type = TXT` the `verification.domain` will be checked for a TXT record matching `verification.value`." + }, + "type": "array", + "description": "A list of verification challenges, one of which must be completed to verify the domain for use on the project. After the challenge is complete `POST /projects/:idOrName/domains/:domain/verify` to verify the domain. Possible challenges: - If `verification.type = TXT` the `verification.domain` will be checked for a TXT record matching `verification.value`." + } + }, + "required": [ + "apexName", + "name", + "projectId", + "verified" + ], + "type": "object", + "description": "List of domains associated with this environment" + }, + "type": "array", + "description": "List of domains associated with this environment" + }, + "currentDeploymentAliases": { + "items": { + "type": "string" + }, + "type": "array", + "description": "List of aliases for the current deployment" + }, + "createdAt": { + "type": "number", + "description": "Timestamp when the environment was created" + }, + "updatedAt": { + "type": "number", + "description": "Timestamp when the environment was last updated" + } + }, + "required": [ + "createdAt", + "id", + "slug", + "type", + "updatedAt" + ], + "type": "object", + "description": "If the deployment was created using a Custom Environment, then this property contains information regarding the environment used." + }, + { + "properties": { + "id": { + "type": "string" + } + }, + "required": [ + "id" + ], + "type": "object", + "description": "If the deployment was created using a Custom Environment, then this property contains information regarding the environment used." + } + ] + }, + "oomReport": { + "type": "string", + "enum": [ + "out-of-memory" + ] + }, + "readyStateReason": { + "type": "string" + }, + "id": { + "type": "string", + "description": "A string holding the unique ID of the deployment", + "example": "dpl_89qyp1cskzkLrVicDaZoDbjyHuDJ" + }, + "target": { + "nullable": true, + "type": "string", + "enum": [ + "production", + "staging", + null + ], + "description": "If defined, either `staging` if a staging alias in the format `\u003cproject\u003e.\u003cteam\u003e.now.sh` was assigned upon creation, or `production` if the aliases from `alias` were assigned. `null` value indicates the \"preview\" deployment.", + "example": null + }, + "readyState": { + "type": "string", + "enum": [ + "BLOCKED", + "BUILDING", + "CANCELED", + "ERROR", + "INITIALIZING", + "QUEUED", + "READY" + ], + "description": "The state of the deployment depending on the process of deploying, or if it is ready or in an error state", + "example": "READY" + }, + "aliasError": { + "nullable": true, + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object", + "description": "An object that will contain a `code` and a `message` when the aliasing fails, otherwise the value will be `null`", + "example": null + }, + "aliasWarning": { + "nullable": true, + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + }, + "link": { + "type": "string" + }, + "action": { + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" + }, + "errorCode": { + "type": "string" + }, + "errorMessage": { + "nullable": true, + "type": "string" + }, + "createdAt": { + "type": "number", + "description": "A number containing the date when the deployment was created in milliseconds", + "example": 1540257589405 + }, + "name": { + "type": "string", + "description": "The name of the project associated with the deployment at the time that the deployment was created", + "example": "my-project" + }, + "type": { + "type": "string", + "enum": [ + "LAMBDAS" + ] + }, + "aliasFinal": { + "nullable": true, + "type": "string" + }, + "autoAssignCustomDomains": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "applies to custom domains only, defaults to `true`" + }, + "automaticAliases": { + "items": { + "type": "string" + }, + "type": "array" + }, + "buildErrorAt": { + "type": "number" + }, + "checksState": { + "type": "string", + "enum": [ + "completed", + "registered", + "running" + ] + }, + "checksConclusion": { + "type": "string", + "enum": [ + "canceled", + "failed", + "skipped", + "succeeded" + ] + }, + "deletedAt": { + "nullable": true, + "type": "number", + "description": "A number containing the date when the deployment was deleted at milliseconds", + "example": 1540257589405 + }, + "defaultRoute": { + "type": "string", + "description": "Computed field that is only available for deployments with a microfrontend configuration." + }, + "canceledAt": { + "type": "number" + }, + "errorLink": { + "type": "string" + }, + "errorStep": { + "type": "string" + }, + "passiveRegions": { + "items": { + "type": "string" + }, + "type": "array", + "description": "Since November 2023 this field defines a set of regions that we will deploy the lambda to passively Lambdas will be deployed to these regions but only invoked if all of the primary `regions` are marked as out of service" + }, + "gitSource": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "github" + ] + }, + "repoId": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "ref": { + "nullable": true, + "type": "string" + }, + "sha": { + "type": "string" + }, + "prId": { + "nullable": true, + "type": "number" + } + }, + "required": [ + "repoId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "github" + ] + }, + "org": { + "type": "string" + }, + "repo": { + "type": "string" + }, + "ref": { + "nullable": true, + "type": "string" + }, + "sha": { + "type": "string" + }, + "prId": { + "nullable": true, + "type": "number" + } + }, + "required": [ + "org", + "repo", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "github-custom-host" + ] + }, + "host": { + "type": "string" + }, + "repoId": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "ref": { + "nullable": true, + "type": "string" + }, + "sha": { + "type": "string" + }, + "prId": { + "nullable": true, + "type": "number" + } + }, + "required": [ + "host", + "repoId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "github-custom-host" + ] + }, + "host": { + "type": "string" + }, + "org": { + "type": "string" + }, + "repo": { + "type": "string" + }, + "ref": { + "nullable": true, + "type": "string" + }, + "sha": { + "type": "string" + }, + "prId": { + "nullable": true, + "type": "number" + } + }, + "required": [ + "host", + "org", + "repo", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "github-limited" + ] + }, + "repoId": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "ref": { + "nullable": true, + "type": "string" + }, + "sha": { + "type": "string" + }, + "prId": { + "nullable": true, + "type": "number" + } + }, + "required": [ + "repoId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "github-limited" + ] + }, + "org": { + "type": "string" + }, + "repo": { + "type": "string" + }, + "ref": { + "nullable": true, + "type": "string" + }, + "sha": { + "type": "string" + }, + "prId": { + "nullable": true, + "type": "number" + } + }, + "required": [ + "org", + "repo", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "gitlab" + ] + }, + "projectId": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "ref": { + "nullable": true, + "type": "string" + }, + "sha": { + "type": "string" + }, + "prId": { + "nullable": true, + "type": "number" + } + }, + "required": [ + "projectId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "bitbucket" + ] + }, + "workspaceUuid": { + "type": "string" + }, + "repoUuid": { + "type": "string" + }, + "ref": { + "nullable": true, + "type": "string" + }, + "sha": { + "type": "string" + }, + "prId": { + "nullable": true, + "type": "number" + } + }, + "required": [ + "repoUuid", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "bitbucket" + ] + }, + "owner": { + "type": "string" + }, + "slug": { + "type": "string" + }, + "ref": { + "nullable": true, + "type": "string" + }, + "sha": { + "type": "string" + }, + "prId": { + "nullable": true, + "type": "number" + } + }, + "required": [ + "owner", + "slug", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "vercel" + ] + }, + "org": { + "type": "string" + }, + "repo": { + "type": "string" + }, + "sha": { + "type": "string" + }, + "repoPushedAt": { + "type": "number" + }, + "ref": { + "nullable": true, + "type": "string" + }, + "prId": { + "nullable": true, + "type": "number" + } + }, + "required": [ + "sha", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "cursor-origin" + ] + }, + "repoId": { + "type": "string", + "description": "Origin repository id." + }, + "owner": { + "type": "string", + "description": "Owner (namespace) slug." + }, + "repo": { + "type": "string" + }, + "ref": { + "nullable": true, + "type": "string" + }, + "sha": { + "type": "string" + }, + "prId": { + "nullable": true, + "type": "number" + } + }, + "required": [ + "repoId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "custom" + ] + }, + "ref": { + "type": "string" + }, + "sha": { + "type": "string" + }, + "gitUrl": { + "type": "string" + } + }, + "required": [ + "gitUrl", + "ref", + "sha", + "type" + ], + "type": "object", + "description": "Allows custom git sources (local folder mounted to the container) in test mode" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "github" + ] + }, + "ref": { + "type": "string" + }, + "sha": { + "type": "string" + }, + "repoId": { + "type": "number" + }, + "org": { + "type": "string" + }, + "repo": { + "type": "string" + } + }, + "required": [ + "ref", + "repoId", + "sha", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "github-custom-host" + ] + }, + "host": { + "type": "string" + }, + "ref": { + "type": "string" + }, + "sha": { + "type": "string" + }, + "repoId": { + "type": "number" + }, + "org": { + "type": "string" + }, + "repo": { + "type": "string" + } + }, + "required": [ + "host", + "ref", + "repoId", + "sha", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "github-limited" + ] + }, + "ref": { + "type": "string" + }, + "sha": { + "type": "string" + }, + "repoId": { + "type": "number" + }, + "org": { + "type": "string" + }, + "repo": { + "type": "string" + } + }, + "required": [ + "ref", + "repoId", + "sha", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "gitlab" + ] + }, + "ref": { + "type": "string" + }, + "sha": { + "type": "string" + }, + "projectId": { + "type": "number" + } + }, + "required": [ + "projectId", + "ref", + "sha", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "bitbucket" + ] + }, + "ref": { + "type": "string" + }, + "sha": { + "type": "string" + }, + "owner": { + "type": "string" + }, + "slug": { + "type": "string" + }, + "workspaceUuid": { + "type": "string" + }, + "repoUuid": { + "type": "string" + } + }, + "required": [ + "ref", + "repoUuid", + "sha", + "type", + "workspaceUuid" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "vercel" + ] + }, + "ref": { + "type": "string" + }, + "sha": { + "type": "string" + }, + "org": { + "type": "string" + }, + "repo": { + "type": "string" + }, + "repoPushedAt": { + "type": "number" + } + }, + "required": [ + "org", + "ref", + "repo", + "sha", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "cursor-origin" + ] + }, + "ref": { + "type": "string" + }, + "sha": { + "type": "string" + }, + "repoId": { + "type": "string" + }, + "owner": { + "type": "string" + }, + "repo": { + "type": "string" + } + }, + "required": [ + "owner", + "ref", + "repo", + "repoId", + "sha", + "type" + ], + "type": "object" + } + ] + }, + "manualProvisioning": { + "properties": { + "state": { + "type": "string", + "enum": [ + "COMPLETE", + "PENDING", + "TIMEOUT" + ], + "description": "Current provisioning state" + }, + "completedAt": { + "type": "number", + "description": "Timestamp when manual provisioning completed" + } + }, + "required": [ + "state" + ], + "type": "object", + "description": "Present when deployment was created with manual provisioning enabled, either explicitly or via the experimental BYOC git flow. The deployment stays in INITIALIZING until /continue is called." + }, + "meta": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "originCacheRegion": { + "type": "string" + }, + "nodeVersion": { + "type": "string", + "enum": [ + "10.x", + "12.x", + "14.x", + "16.x", + "18.x", + "20.x", + "22.x", + "24.x", + "8.10.x" + ], + "description": "If set it overrides the `projectSettings.nodeVersion` for this deployment." + }, + "project": { + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "framework": { + "nullable": true, + "type": "string" + } + }, + "required": [ + "id", + "name" + ], + "type": "object", + "description": "The public project information associated with the deployment." + }, + "prebuilt": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "readySubstate": { + "type": "string", + "enum": [ + "PROMOTED", + "ROLLING", + "STAGED" + ], + "description": "Substate of deployment when readyState is 'READY' Tracks whether or not deployment has seen production traffic: - STAGED: never seen production traffic - ROLLING: in the process of having production traffic gradually transitioned. - PROMOTED: has seen production traffic" + }, + "regions": { + "items": { + "type": "string" + }, + "type": "array", + "description": "The regions the deployment exists in", + "example": [ + "sfo1" + ] + }, + "softDeletedByRetention": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "flag to indicate if the deployment was deleted by retention policy", + "example": "true" + }, + "source": { + "type": "string", + "enum": [ + "api-trigger-git-deploy", + "cli", + "clone/repo", + "drop", + "git", + "git-deploy-hook", + "import", + "import/repo", + "redeploy", + "v0-web" + ], + "description": "Where was the deployment created from. Best-effort guess for metrics only — not authoritative; do not gate behavior on it.", + "example": "cli" + }, + "undeletedAt": { + "type": "number", + "description": "A number containing the date when the deployment was undeleted at milliseconds", + "example": 1540257589405 + }, + "url": { + "type": "string", + "description": "A string with the unique URL of the deployment", + "example": "my-instant-deployment-3ij3cxz9qr.now.sh" + }, + "userConfiguredDeploymentId": { + "type": "string", + "description": "Since January 2025 User-configured deployment ID for skew protection with pre-built deployments. This is set when users configure a custom deploymentId in their next.config.js file. This allows Next.js to use skew protection even when deployments are pre-built outside of Vercel's build system.", + "example": "abc123" + }, + "version": { + "type": "number", + "enum": [ + 2 + ], + "description": "The platform version that was used to create the deployment.", + "example": 2 + }, + "oidcTokenClaims": { + "properties": { + "iss": { + "type": "string" + }, + "sub": { + "type": "string" + }, + "scope": { + "type": "string" + }, + "aud": { + "type": "string" + }, + "owner": { + "type": "string" + }, + "owner_id": { + "type": "string" + }, + "project": { + "type": "string" + }, + "project_id": { + "type": "string" + }, + "environment": { + "type": "string" + }, + "custom_environment_id": { + "type": "string" + }, + "mfe_group_ids": { + "items": { + "type": "string" + }, + "type": "array" + }, + "plan": { + "type": "string" + } + }, + "required": [ + "aud", + "environment", + "iss", + "owner", + "owner_id", + "project", + "project_id", + "scope", + "sub" + ], + "type": "object" + }, + "projectId": { + "type": "string" + }, + "plan": { + "type": "string", + "enum": [ + "enterprise", + "hobby", + "pro" + ] + }, + "connectBuildsEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "connectConfigurationId": { + "type": "string" + }, + "createdIn": { + "type": "string" + }, + "crons": { + "items": { + "properties": { + "schedule": { + "type": "string" + }, + "path": { + "type": "string" + } + }, + "required": [ + "path", + "schedule" + ], + "type": "object" + }, + "type": "array" + }, + "atproto": { + "oneOf": [ + { + "properties": { + "enabled": { + "type": "boolean", + "enum": [ + false + ] + } + }, + "required": [ + "enabled" + ], + "type": "object" + }, + { + "properties": { + "enabled": { + "type": "boolean", + "enum": [ + true + ] + }, + "subscription": { + "properties": { + "collections": { + "items": { + "type": "string" + }, + "type": "array" + }, + "dids": { + "items": { + "type": "string" + }, + "type": "array" + }, + "kinds": { + "items": { + "type": "string", + "enum": [ + "account", + "commit", + "identity", + "sync" + ] + }, + "type": "array" + }, + "path": { + "type": "string" + } + }, + "required": [ + "collections", + "path" + ], + "type": "object" + } + }, + "required": [ + "enabled", + "subscription" + ], + "type": "object" + } + ] + }, + "functions": { + "nullable": true, + "additionalProperties": { + "properties": { + "architecture": { + "type": "string", + "enum": [ + "arm64", + "x86_64" + ] + }, + "memory": { + "type": "number" + }, + "maxDuration": { + "oneOf": [ + { + "type": "number" + }, + { + "type": "string", + "enum": [ + "max" + ] + } + ] + }, + "affinity": { + "properties": { + "mode": { + "type": "string", + "enum": [ + "strict" + ] + } + }, + "required": [ + "mode" + ], + "type": "object" + }, + "maxConcurrency": { + "type": "number" + }, + "regions": { + "items": { + "type": "string" + }, + "type": "array" + }, + "functionFailoverRegions": { + "items": { + "type": "string" + }, + "type": "array" + }, + "runtime": { + "type": "string" + }, + "includeFiles": { + "type": "string" + }, + "excludeFiles": { + "type": "string" + }, + "experimentalTriggers": { + "items": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "queue/v1beta" + ], + "description": "Event type - must be \"queue/v1beta\" (REQUIRED)" + }, + "consumer": { + "type": "string", + "description": "Name of the consumer group for this trigger (REQUIRED)" + }, + "topic": { + "type": "string", + "description": "Name of the queue topic to consume from (REQUIRED)" + }, + "maxDeliveries": { + "type": "number", + "description": "Maximum number of delivery attempts for message processing (OPTIONAL) This represents the total number of times a message can be delivered, not the number of retries. Must be at least 1 if specified. Behavior when not specified depends on the server's default configuration." + }, + "retryAfterSeconds": { + "type": "number", + "description": "Delay in seconds before retrying failed executions (OPTIONAL) Behavior when not specified depends on the server's default configuration." + }, + "initialDelaySeconds": { + "type": "number", + "description": "Initial delay in seconds before first execution attempt (OPTIONAL) Must be 0 or greater. Use 0 for no initial delay. Behavior when not specified depends on the server's default configuration." + }, + "maxConcurrency": { + "type": "number", + "description": "Maximum number of concurrent executions for this consumer (OPTIONAL) Must be at least 1 if specified. Behavior when not specified depends on the server's default configuration." + } + }, + "required": [ + "consumer", + "topic", + "type" + ], + "type": "object", + "description": "Queue trigger input event for v1beta (from vercel.json config). Requires explicit consumer name." + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "queue/v2beta" + ], + "description": "Event type - must be \"queue/v2beta\" (REQUIRED)" + }, + "topic": { + "type": "string", + "description": "Name of the queue topic to consume from (REQUIRED)" + }, + "maxDeliveries": { + "type": "number", + "description": "Maximum number of delivery attempts for message processing (OPTIONAL) This represents the total number of times a message can be delivered, not the number of retries. Must be at least 1 if specified. Behavior when not specified depends on the server's default configuration." + }, + "retryAfterSeconds": { + "type": "number", + "description": "Delay in seconds before retrying failed executions (OPTIONAL) Behavior when not specified depends on the server's default configuration." + }, + "initialDelaySeconds": { + "type": "number", + "description": "Initial delay in seconds before first execution attempt (OPTIONAL) Must be 0 or greater. Use 0 for no initial delay. Behavior when not specified depends on the server's default configuration." + }, + "maxConcurrency": { + "type": "number", + "description": "Maximum number of concurrent executions for this consumer (OPTIONAL) Must be at least 1 if specified. Behavior when not specified depends on the server's default configuration." + } + }, + "required": [ + "topic", + "type" + ], + "type": "object", + "description": "Queue trigger input event for v2beta (from vercel.json config). Consumer name is implicitly derived from the function path. Only one trigger per function is allowed." + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "schedule/v1beta" + ], + "description": "Event type - must be \"schedule/v1beta\" (REQUIRED)" + } + }, + "required": [ + "type" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "supportsCancellation": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "type": "object" + }, + "type": "object" + }, + "isInstantStatic": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether this deployment completed through the instant static fast path." + }, + "monorepoManager": { + "nullable": true, + "type": "string" + }, + "ownerId": { + "type": "string" + }, + "passiveConnectConfigurationId": { + "type": "string", + "description": "Since November 2023 this field defines a Secure Compute network that will only be used to deploy passive lambdas to (as in passiveRegions)" + }, + "routes": { + "nullable": true, + "items": { + "oneOf": [ + { + "properties": { + "src": { + "type": "string" + }, + "dest": { + "type": "string" + }, + "headers": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "methods": { + "items": { + "type": "string" + }, + "type": "array" + }, + "continue": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "override": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "caseSensitive": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "check": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "important": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "status": { + "type": "number" + }, + "has": { + "items": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "host" + ] + }, + "value": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "eq": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "neq": { + "type": "string" + }, + "inc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "ninc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "pre": { + "type": "string" + }, + "suf": { + "type": "string" + }, + "re": { + "type": "string" + }, + "gt": { + "type": "number" + }, + "gte": { + "type": "number" + }, + "lt": { + "type": "number" + }, + "lte": { + "type": "number" + } + }, + "type": "object" + } + ] + } + }, + "required": [ + "type", + "value" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "cookie", + "header", + "query" + ] + }, + "key": { + "type": "string" + }, + "value": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "eq": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "neq": { + "type": "string" + }, + "inc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "ninc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "pre": { + "type": "string" + }, + "suf": { + "type": "string" + }, + "re": { + "type": "string" + }, + "gt": { + "type": "number" + }, + "gte": { + "type": "number" + }, + "lt": { + "type": "number" + }, + "lte": { + "type": "number" + } + }, + "type": "object" + } + ] + } + }, + "required": [ + "key", + "type" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "missing": { + "items": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "host" + ] + }, + "value": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "eq": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "neq": { + "type": "string" + }, + "inc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "ninc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "pre": { + "type": "string" + }, + "suf": { + "type": "string" + }, + "re": { + "type": "string" + }, + "gt": { + "type": "number" + }, + "gte": { + "type": "number" + }, + "lt": { + "type": "number" + }, + "lte": { + "type": "number" + } + }, + "type": "object" + } + ] + } + }, + "required": [ + "type", + "value" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "cookie", + "header", + "query" + ] + }, + "key": { + "type": "string" + }, + "value": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "eq": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "neq": { + "type": "string" + }, + "inc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "ninc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "pre": { + "type": "string" + }, + "suf": { + "type": "string" + }, + "re": { + "type": "string" + }, + "gt": { + "type": "number" + }, + "gte": { + "type": "number" + }, + "lt": { + "type": "number" + }, + "lte": { + "type": "number" + } + }, + "type": "object" + } + ] + } + }, + "required": [ + "key", + "type" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "mitigate": { + "properties": { + "action": { + "type": "string", + "enum": [ + "challenge", + "deny" + ] + } + }, + "required": [ + "action" + ], + "type": "object" + }, + "transforms": { + "items": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "request.headers", + "request.query", + "response.headers" + ] + }, + "op": { + "type": "string", + "enum": [ + "append", + "delete", + "set" + ] + }, + "target": { + "properties": { + "key": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "eq": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "neq": { + "type": "string" + }, + "inc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "ninc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "pre": { + "type": "string" + }, + "suf": { + "type": "string" + }, + "gt": { + "type": "number" + }, + "gte": { + "type": "number" + }, + "lt": { + "type": "number" + }, + "lte": { + "type": "number" + } + }, + "type": "object" + } + ] + } + }, + "required": [ + "key" + ], + "type": "object" + }, + "args": { + "oneOf": [ + { + "type": "string" + }, + { + "items": { + "type": "string" + }, + "type": "array" + } + ] + }, + "env": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "op", + "target", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "request.path" + ] + }, + "op": { + "type": "string", + "enum": [ + "set" + ] + }, + "args": { + "type": "string" + }, + "env": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "args", + "op", + "type" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "env": { + "items": { + "type": "string" + }, + "type": "array" + }, + "locale": { + "properties": { + "redirect": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "cookie": { + "type": "string" + } + }, + "type": "object" + }, + "source": { + "type": "string", + "description": "Aliases for `src`, `dest`, and `status`. These provide consistency with the `rewrites`, `redirects`, and `headers` fields which use `source`, `destination`, and `statusCode`. During normalization, the string forms are converted to their canonical forms (`src`, `dest`, `status`) and stripped from the route object. `destination` may also be a service-targeted object, in which case routing is delegated into the named service's internal route table and the object is preserved as-is (not folded into `dest`)." + }, + "destination": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "service" + ], + "description": "Optional explicit format marker. The destination is identified by the presence of `service`, so `type` is no longer required." + }, + "service": { + "type": "string" + }, + "path": { + "type": "string", + "description": "Routing-only path used to select a route inside the target service." + } + }, + "required": [ + "service" + ], + "type": "object" + } + ] + }, + "statusCode": { + "type": "number" + }, + "middlewarePath": { + "type": "string", + "description": "A middleware key within the `output` key under the build result. Overrides a `middleware` definition." + }, + "middlewareRawSrc": { + "items": { + "type": "string" + }, + "type": "array", + "description": "The original middleware matchers." + }, + "middleware": { + "type": "number", + "description": "A middleware index in the `middleware` key under the build result" + }, + "respectOriginCacheControl": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "src" + ], + "type": "object" + }, + { + "properties": { + "handle": { + "type": "string", + "enum": [ + "error", + "filesystem", + "hit", + "miss", + "resource", + "rewrite" + ] + }, + "src": { + "type": "string" + }, + "dest": { + "type": "string" + }, + "status": { + "type": "number" + } + }, + "required": [ + "handle" + ], + "type": "object" + }, + { + "properties": { + "src": { + "type": "string" + }, + "continue": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "middleware": { + "type": "number", + "enum": [ + 0 + ] + } + }, + "required": [ + "continue", + "middleware", + "src" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "services": { + "items": { + "oneOf": [ + { + "properties": { + "schema": { + "type": "string", + "enum": [ + "experimentalServices" + ] + }, + "name": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "cron", + "job", + "web", + "worker" + ] + }, + "trigger": { + "type": "string", + "enum": [ + "queue", + "schedule", + "workflow" + ] + }, + "group": { + "type": "string" + }, + "workspace": { + "type": "string" + }, + "entrypoint": { + "type": "string" + }, + "framework": { + "type": "string" + }, + "builder": { + "properties": { + "use": { + "type": "string" + }, + "src": { + "type": "string" + }, + "config": { + "properties": { + "bunVersion": { + "type": "string" + }, + "maxLambdaSize": { + "type": "string" + }, + "includeFiles": { + "oneOf": [ + { + "type": "string" + }, + { + "items": { + "type": "string" + }, + "type": "array" + } + ] + }, + "excludeFiles": { + "oneOf": [ + { + "type": "string" + }, + { + "items": { + "type": "string" + }, + "type": "array" + } + ] + }, + "bundle": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "ldsflags": { + "type": "string" + }, + "helpers": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "rust": { + "type": "string" + }, + "debug": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "zeroConfig": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "import": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "functions": { + "additionalProperties": { + "properties": { + "architecture": { + "type": "string", + "enum": [ + "arm64", + "x86_64" + ] + }, + "memory": { + "type": "number" + }, + "maxDuration": { + "oneOf": [ + { + "type": "number" + }, + { + "type": "string", + "enum": [ + "max" + ] + } + ] + }, + "affinity": { + "properties": { + "mode": { + "type": "string", + "enum": [ + "strict" + ] + } + }, + "required": [ + "mode" + ], + "type": "object" + }, + "maxConcurrency": { + "type": "number" + }, + "regions": { + "items": { + "type": "string" + }, + "type": "array" + }, + "functionFailoverRegions": { + "items": { + "type": "string" + }, + "type": "array" + }, + "runtime": { + "type": "string" + }, + "includeFiles": { + "type": "string" + }, + "excludeFiles": { + "type": "string" + }, + "experimentalTriggers": { + "items": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "queue/v1beta" + ], + "description": "Event type - must be \"queue/v1beta\" (REQUIRED)" + }, + "consumer": { + "type": "string", + "description": "Name of the consumer group for this trigger (REQUIRED)" + }, + "topic": { + "type": "string", + "description": "Name of the queue topic to consume from (REQUIRED)" + }, + "maxDeliveries": { + "type": "number", + "description": "Maximum number of delivery attempts for message processing (OPTIONAL) This represents the total number of times a message can be delivered, not the number of retries. Must be at least 1 if specified. Behavior when not specified depends on the server's default configuration." + }, + "retryAfterSeconds": { + "type": "number", + "description": "Delay in seconds before retrying failed executions (OPTIONAL) Behavior when not specified depends on the server's default configuration." + }, + "initialDelaySeconds": { + "type": "number", + "description": "Initial delay in seconds before first execution attempt (OPTIONAL) Must be 0 or greater. Use 0 for no initial delay. Behavior when not specified depends on the server's default configuration." + }, + "maxConcurrency": { + "type": "number", + "description": "Maximum number of concurrent executions for this consumer (OPTIONAL) Must be at least 1 if specified. Behavior when not specified depends on the server's default configuration." + } + }, + "required": [ + "consumer", + "topic", + "type" + ], + "type": "object", + "description": "Queue trigger input event for v1beta (from vercel.json config). Requires explicit consumer name." + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "queue/v2beta" + ], + "description": "Event type - must be \"queue/v2beta\" (REQUIRED)" + }, + "topic": { + "type": "string", + "description": "Name of the queue topic to consume from (REQUIRED)" + }, + "maxDeliveries": { + "type": "number", + "description": "Maximum number of delivery attempts for message processing (OPTIONAL) This represents the total number of times a message can be delivered, not the number of retries. Must be at least 1 if specified. Behavior when not specified depends on the server's default configuration." + }, + "retryAfterSeconds": { + "type": "number", + "description": "Delay in seconds before retrying failed executions (OPTIONAL) Behavior when not specified depends on the server's default configuration." + }, + "initialDelaySeconds": { + "type": "number", + "description": "Initial delay in seconds before first execution attempt (OPTIONAL) Must be 0 or greater. Use 0 for no initial delay. Behavior when not specified depends on the server's default configuration." + }, + "maxConcurrency": { + "type": "number", + "description": "Maximum number of concurrent executions for this consumer (OPTIONAL) Must be at least 1 if specified. Behavior when not specified depends on the server's default configuration." + } + }, + "required": [ + "topic", + "type" + ], + "type": "object", + "description": "Queue trigger input event for v2beta (from vercel.json config). Consumer name is implicitly derived from the function path. Only one trigger per function is allowed." + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "schedule/v1beta" + ], + "description": "Event type - must be \"schedule/v1beta\" (REQUIRED)" + } + }, + "required": [ + "type" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "supportsCancellation": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "type": "object" + }, + "type": "object" + }, + "projectSettings": { + "properties": { + "framework": { + "nullable": true, + "type": "string" + }, + "devCommand": { + "nullable": true, + "type": "string" + }, + "installCommand": { + "nullable": true, + "type": "string" + }, + "buildCommand": { + "nullable": true, + "type": "string" + }, + "outputDirectory": { + "nullable": true, + "type": "string" + }, + "rootDirectory": { + "nullable": true, + "type": "string" + }, + "nodeVersion": { + "type": "string" + }, + "monorepoManager": { + "nullable": true, + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "autoExposeSystemEnvs": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "sourceFilesOutsideRootDirectory": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "directoryListing": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "gitForkProtection": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "commandForIgnoringBuildStep": { + "nullable": true, + "type": "string" + } + }, + "type": "object" + }, + "outputDirectory": { + "type": "string" + }, + "installCommand": { + "type": "string" + }, + "buildCommand": { + "type": "string" + }, + "devCommand": { + "type": "string" + }, + "framework": { + "nullable": true, + "type": "string" + }, + "nodeVersion": { + "type": "string" + }, + "middleware": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "middlewareRuntime": { + "type": "string", + "enum": [ + "nodejs" + ], + "description": "Enforced runtime for explicitly configured Routing Middleware." + }, + "middlewareMatcher": { + "oneOf": [ + { + "type": "string" + }, + { + "items": { + "type": "string" + }, + "type": "array", + "description": "Matcher supplied outside of the middleware source module." + } + ] + }, + "serviceName": { + "type": "string", + "description": "Owning service name; scopes per-function config such as the v2beta consumer." + } + }, + "type": "object" + } + }, + "required": [ + "use" + ], + "type": "object" + }, + "runtime": { + "type": "string" + }, + "buildCommand": { + "type": "string" + }, + "installCommand": { + "type": "string" + }, + "preDeployCommand": { + "type": "string" + }, + "routePrefix": { + "type": "string" + }, + "routePrefixSource": { + "type": "string", + "enum": [ + "configured", + "generated" + ] + }, + "subdomain": { + "type": "string" + }, + "schedule": { + "oneOf": [ + { + "type": "string" + }, + { + "items": { + "type": "string" + }, + "type": "array" + } + ] + }, + "handlerFunction": { + "type": "string" + }, + "topics": { + "oneOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "items": { + "properties": { + "topic": { + "type": "string" + }, + "retryAfterSeconds": { + "type": "number" + }, + "initialDelaySeconds": { + "type": "number" + } + }, + "required": [ + "topic" + ], + "type": "object" + }, + "type": "array" + } + ] + }, + "env": { + "additionalProperties": { + "properties": { + "type": { + "type": "string", + "enum": [ + "service-ref" + ] + }, + "service": { + "type": "string" + } + }, + "required": [ + "service", + "type" + ], + "type": "object" + }, + "type": "object" + } + }, + "required": [ + "builder", + "name", + "schema", + "type", + "workspace" + ], + "type": "object", + "description": "Services detected during build from vercel.json experimentalServices or auto-detected from project structure. Used to inject service URLs as environment variables at runtime." + }, + { + "properties": { + "schema": { + "type": "string", + "enum": [ + "experimentalServicesV2" + ] + }, + "name": { + "type": "string" + }, + "root": { + "type": "string", + "description": "Path to the service root, relative to the project root." + }, + "framework": { + "type": "string" + }, + "runtime": { + "type": "string" + }, + "entrypoint": { + "type": "string", + "description": "Resolved entrypoint, relative to the service root." + }, + "command": { + "items": { + "type": "string" + }, + "type": "array", + "description": "Command override for `runtime: \"container\"` services." + }, + "builder": { + "properties": { + "use": { + "type": "string" + }, + "src": { + "type": "string" + }, + "config": { + "properties": { + "bunVersion": { + "type": "string" + }, + "maxLambdaSize": { + "type": "string" + }, + "includeFiles": { + "oneOf": [ + { + "type": "string" + }, + { + "items": { + "type": "string" + }, + "type": "array" + } + ] + }, + "excludeFiles": { + "oneOf": [ + { + "type": "string" + }, + { + "items": { + "type": "string" + }, + "type": "array" + } + ] + }, + "bundle": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "ldsflags": { + "type": "string" + }, + "helpers": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "rust": { + "type": "string" + }, + "debug": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "zeroConfig": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "import": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "functions": { + "additionalProperties": { + "properties": { + "architecture": { + "type": "string", + "enum": [ + "arm64", + "x86_64" + ] + }, + "memory": { + "type": "number" + }, + "maxDuration": { + "oneOf": [ + { + "type": "number" + }, + { + "type": "string", + "enum": [ + "max" + ] + } + ] + }, + "affinity": { + "properties": { + "mode": { + "type": "string", + "enum": [ + "strict" + ] + } + }, + "required": [ + "mode" + ], + "type": "object" + }, + "maxConcurrency": { + "type": "number" + }, + "regions": { + "items": { + "type": "string" + }, + "type": "array" + }, + "functionFailoverRegions": { + "items": { + "type": "string" + }, + "type": "array" + }, + "runtime": { + "type": "string" + }, + "includeFiles": { + "type": "string" + }, + "excludeFiles": { + "type": "string" + }, + "experimentalTriggers": { + "items": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "queue/v1beta" + ], + "description": "Event type - must be \"queue/v1beta\" (REQUIRED)" + }, + "consumer": { + "type": "string", + "description": "Name of the consumer group for this trigger (REQUIRED)" + }, + "topic": { + "type": "string", + "description": "Name of the queue topic to consume from (REQUIRED)" + }, + "maxDeliveries": { + "type": "number", + "description": "Maximum number of delivery attempts for message processing (OPTIONAL) This represents the total number of times a message can be delivered, not the number of retries. Must be at least 1 if specified. Behavior when not specified depends on the server's default configuration." + }, + "retryAfterSeconds": { + "type": "number", + "description": "Delay in seconds before retrying failed executions (OPTIONAL) Behavior when not specified depends on the server's default configuration." + }, + "initialDelaySeconds": { + "type": "number", + "description": "Initial delay in seconds before first execution attempt (OPTIONAL) Must be 0 or greater. Use 0 for no initial delay. Behavior when not specified depends on the server's default configuration." + }, + "maxConcurrency": { + "type": "number", + "description": "Maximum number of concurrent executions for this consumer (OPTIONAL) Must be at least 1 if specified. Behavior when not specified depends on the server's default configuration." + } + }, + "required": [ + "consumer", + "topic", + "type" + ], + "type": "object", + "description": "Queue trigger input event for v1beta (from vercel.json config). Requires explicit consumer name." + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "queue/v2beta" + ], + "description": "Event type - must be \"queue/v2beta\" (REQUIRED)" + }, + "topic": { + "type": "string", + "description": "Name of the queue topic to consume from (REQUIRED)" + }, + "maxDeliveries": { + "type": "number", + "description": "Maximum number of delivery attempts for message processing (OPTIONAL) This represents the total number of times a message can be delivered, not the number of retries. Must be at least 1 if specified. Behavior when not specified depends on the server's default configuration." + }, + "retryAfterSeconds": { + "type": "number", + "description": "Delay in seconds before retrying failed executions (OPTIONAL) Behavior when not specified depends on the server's default configuration." + }, + "initialDelaySeconds": { + "type": "number", + "description": "Initial delay in seconds before first execution attempt (OPTIONAL) Must be 0 or greater. Use 0 for no initial delay. Behavior when not specified depends on the server's default configuration." + }, + "maxConcurrency": { + "type": "number", + "description": "Maximum number of concurrent executions for this consumer (OPTIONAL) Must be at least 1 if specified. Behavior when not specified depends on the server's default configuration." + } + }, + "required": [ + "topic", + "type" + ], + "type": "object", + "description": "Queue trigger input event for v2beta (from vercel.json config). Consumer name is implicitly derived from the function path. Only one trigger per function is allowed." + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "schedule/v1beta" + ], + "description": "Event type - must be \"schedule/v1beta\" (REQUIRED)" + } + }, + "required": [ + "type" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "supportsCancellation": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "type": "object" + }, + "type": "object" + }, + "projectSettings": { + "properties": { + "framework": { + "nullable": true, + "type": "string" + }, + "devCommand": { + "nullable": true, + "type": "string" + }, + "installCommand": { + "nullable": true, + "type": "string" + }, + "buildCommand": { + "nullable": true, + "type": "string" + }, + "outputDirectory": { + "nullable": true, + "type": "string" + }, + "rootDirectory": { + "nullable": true, + "type": "string" + }, + "nodeVersion": { + "type": "string" + }, + "monorepoManager": { + "nullable": true, + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "autoExposeSystemEnvs": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "sourceFilesOutsideRootDirectory": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "directoryListing": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "gitForkProtection": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "commandForIgnoringBuildStep": { + "nullable": true, + "type": "string" + } + }, + "type": "object" + }, + "outputDirectory": { + "type": "string" + }, + "installCommand": { + "type": "string" + }, + "buildCommand": { + "type": "string" + }, + "devCommand": { + "type": "string" + }, + "framework": { + "nullable": true, + "type": "string" + }, + "nodeVersion": { + "type": "string" + }, + "middleware": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "middlewareRuntime": { + "type": "string", + "enum": [ + "nodejs" + ], + "description": "Enforced runtime for explicitly configured Routing Middleware." + }, + "middlewareMatcher": { + "oneOf": [ + { + "type": "string" + }, + { + "items": { + "type": "string" + }, + "type": "array", + "description": "Matcher supplied outside of the middleware source module." + } + ] + }, + "serviceName": { + "type": "string", + "description": "Owning service name; scopes per-function config such as the v2beta consumer." + } + }, + "type": "object" + } + }, + "required": [ + "use" + ], + "type": "object", + "description": "Builder selected by the resolver." + }, + "installCommand": { + "type": "string" + }, + "buildCommand": { + "type": "string" + }, + "devCommand": { + "type": "string" + }, + "ignoreCommand": { + "type": "string" + }, + "outputDirectory": { + "type": "string" + }, + "bindings": { + "items": { + "properties": { + "type": { + "type": "string", + "enum": [ + "service" + ], + "description": "If present, must be `\"service\"` for Service-to-Service HTTP bindings." + }, + "service": { + "type": "string", + "description": "Target service name from `services`." + }, + "format": { + "type": "string", + "enum": [ + "url" + ], + "description": "Generated value shape, must be `\"url\"`." + }, + "env": { + "type": "string", + "description": "Environment variable name that will store the generated value" + } + }, + "required": [ + "env", + "format", + "service" + ], + "type": "object", + "description": "Caller-side bindings to other services." + }, + "type": "array", + "description": "Caller-side bindings to other services." + }, + "functions": { + "additionalProperties": { + "properties": { + "architecture": { + "type": "string", + "enum": [ + "arm64", + "x86_64" + ] + }, + "memory": { + "type": "number" + }, + "maxDuration": { + "oneOf": [ + { + "type": "number" + }, + { + "type": "string", + "enum": [ + "max" + ] + } + ] + }, + "affinity": { + "properties": { + "mode": { + "type": "string", + "enum": [ + "strict" + ] + } + }, + "required": [ + "mode" + ], + "type": "object" + }, + "maxConcurrency": { + "type": "number" + }, + "regions": { + "items": { + "type": "string" + }, + "type": "array" + }, + "functionFailoverRegions": { + "items": { + "type": "string" + }, + "type": "array" + }, + "runtime": { + "type": "string" + }, + "includeFiles": { + "type": "string" + }, + "excludeFiles": { + "type": "string" + }, + "experimentalTriggers": { + "items": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "queue/v1beta" + ], + "description": "Event type - must be \"queue/v1beta\" (REQUIRED)" + }, + "consumer": { + "type": "string", + "description": "Name of the consumer group for this trigger (REQUIRED)" + }, + "topic": { + "type": "string", + "description": "Name of the queue topic to consume from (REQUIRED)" + }, + "maxDeliveries": { + "type": "number", + "description": "Maximum number of delivery attempts for message processing (OPTIONAL) This represents the total number of times a message can be delivered, not the number of retries. Must be at least 1 if specified. Behavior when not specified depends on the server's default configuration." + }, + "retryAfterSeconds": { + "type": "number", + "description": "Delay in seconds before retrying failed executions (OPTIONAL) Behavior when not specified depends on the server's default configuration." + }, + "initialDelaySeconds": { + "type": "number", + "description": "Initial delay in seconds before first execution attempt (OPTIONAL) Must be 0 or greater. Use 0 for no initial delay. Behavior when not specified depends on the server's default configuration." + }, + "maxConcurrency": { + "type": "number", + "description": "Maximum number of concurrent executions for this consumer (OPTIONAL) Must be at least 1 if specified. Behavior when not specified depends on the server's default configuration." + } + }, + "required": [ + "consumer", + "topic", + "type" + ], + "type": "object", + "description": "Queue trigger input event for v1beta (from vercel.json config). Requires explicit consumer name." + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "queue/v2beta" + ], + "description": "Event type - must be \"queue/v2beta\" (REQUIRED)" + }, + "topic": { + "type": "string", + "description": "Name of the queue topic to consume from (REQUIRED)" + }, + "maxDeliveries": { + "type": "number", + "description": "Maximum number of delivery attempts for message processing (OPTIONAL) This represents the total number of times a message can be delivered, not the number of retries. Must be at least 1 if specified. Behavior when not specified depends on the server's default configuration." + }, + "retryAfterSeconds": { + "type": "number", + "description": "Delay in seconds before retrying failed executions (OPTIONAL) Behavior when not specified depends on the server's default configuration." + }, + "initialDelaySeconds": { + "type": "number", + "description": "Initial delay in seconds before first execution attempt (OPTIONAL) Must be 0 or greater. Use 0 for no initial delay. Behavior when not specified depends on the server's default configuration." + }, + "maxConcurrency": { + "type": "number", + "description": "Maximum number of concurrent executions for this consumer (OPTIONAL) Must be at least 1 if specified. Behavior when not specified depends on the server's default configuration." + } + }, + "required": [ + "topic", + "type" + ], + "type": "object", + "description": "Queue trigger input event for v2beta (from vercel.json config). Consumer name is implicitly derived from the function path. Only one trigger per function is allowed." + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "schedule/v1beta" + ], + "description": "Event type - must be \"schedule/v1beta\" (REQUIRED)" + } + }, + "required": [ + "type" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "supportsCancellation": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "type": "object", + "description": "Function configuration scoped to this service." + }, + "type": "object", + "description": "Function configuration scoped to this service." + }, + "headers": { + "items": { + "properties": { + "source": { + "type": "string" + }, + "headers": { + "items": { + "properties": { + "key": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "required": [ + "key", + "value" + ], + "type": "object" + }, + "type": "array" + }, + "has": { + "items": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "host" + ] + }, + "value": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "eq": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "neq": { + "type": "string" + }, + "inc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "ninc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "pre": { + "type": "string" + }, + "suf": { + "type": "string" + }, + "re": { + "type": "string" + }, + "gt": { + "type": "number" + }, + "gte": { + "type": "number" + }, + "lt": { + "type": "number" + }, + "lte": { + "type": "number" + } + }, + "type": "object" + } + ] + } + }, + "required": [ + "type", + "value" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "cookie", + "header", + "query" + ] + }, + "key": { + "type": "string" + }, + "value": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "eq": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "neq": { + "type": "string" + }, + "inc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "ninc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "pre": { + "type": "string" + }, + "suf": { + "type": "string" + }, + "re": { + "type": "string" + }, + "gt": { + "type": "number" + }, + "gte": { + "type": "number" + }, + "lt": { + "type": "number" + }, + "lte": { + "type": "number" + } + }, + "type": "object" + } + ] + } + }, + "required": [ + "key", + "type" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "missing": { + "items": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "host" + ] + }, + "value": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "eq": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "neq": { + "type": "string" + }, + "inc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "ninc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "pre": { + "type": "string" + }, + "suf": { + "type": "string" + }, + "re": { + "type": "string" + }, + "gt": { + "type": "number" + }, + "gte": { + "type": "number" + }, + "lt": { + "type": "number" + }, + "lte": { + "type": "number" + } + }, + "type": "object" + } + ] + } + }, + "required": [ + "type", + "value" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "cookie", + "header", + "query" + ] + }, + "key": { + "type": "string" + }, + "value": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "eq": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "neq": { + "type": "string" + }, + "inc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "ninc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "pre": { + "type": "string" + }, + "suf": { + "type": "string" + }, + "re": { + "type": "string" + }, + "gt": { + "type": "number" + }, + "gte": { + "type": "number" + }, + "lt": { + "type": "number" + }, + "lte": { + "type": "number" + } + }, + "type": "object" + } + ] + } + }, + "required": [ + "key", + "type" + ], + "type": "object" + } + ] + }, + "type": "array" + } + }, + "required": [ + "headers", + "source" + ], + "type": "object" + }, + "type": "array" + }, + "redirects": { + "items": { + "properties": { + "source": { + "type": "string" + }, + "destination": { + "type": "string" + }, + "permanent": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "statusCode": { + "type": "number" + }, + "has": { + "items": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "host" + ] + }, + "value": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "eq": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "neq": { + "type": "string" + }, + "inc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "ninc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "pre": { + "type": "string" + }, + "suf": { + "type": "string" + }, + "re": { + "type": "string" + }, + "gt": { + "type": "number" + }, + "gte": { + "type": "number" + }, + "lt": { + "type": "number" + }, + "lte": { + "type": "number" + } + }, + "type": "object" + } + ] + } + }, + "required": [ + "type", + "value" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "cookie", + "header", + "query" + ] + }, + "key": { + "type": "string" + }, + "value": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "eq": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "neq": { + "type": "string" + }, + "inc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "ninc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "pre": { + "type": "string" + }, + "suf": { + "type": "string" + }, + "re": { + "type": "string" + }, + "gt": { + "type": "number" + }, + "gte": { + "type": "number" + }, + "lt": { + "type": "number" + }, + "lte": { + "type": "number" + } + }, + "type": "object" + } + ] + } + }, + "required": [ + "key", + "type" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "missing": { + "items": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "host" + ] + }, + "value": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "eq": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "neq": { + "type": "string" + }, + "inc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "ninc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "pre": { + "type": "string" + }, + "suf": { + "type": "string" + }, + "re": { + "type": "string" + }, + "gt": { + "type": "number" + }, + "gte": { + "type": "number" + }, + "lt": { + "type": "number" + }, + "lte": { + "type": "number" + } + }, + "type": "object" + } + ] + } + }, + "required": [ + "type", + "value" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "cookie", + "header", + "query" + ] + }, + "key": { + "type": "string" + }, + "value": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "eq": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "neq": { + "type": "string" + }, + "inc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "ninc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "pre": { + "type": "string" + }, + "suf": { + "type": "string" + }, + "re": { + "type": "string" + }, + "gt": { + "type": "number" + }, + "gte": { + "type": "number" + }, + "lt": { + "type": "number" + }, + "lte": { + "type": "number" + } + }, + "type": "object" + } + ] + } + }, + "required": [ + "key", + "type" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "env": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "destination", + "source" + ], + "type": "object" + }, + "type": "array" + }, + "rewrites": { + "items": { + "properties": { + "source": { + "type": "string" + }, + "destination": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "service" + ], + "description": "Optional explicit format marker. The destination is identified by the presence of `service`, so `type` is no longer required." + }, + "service": { + "type": "string" + }, + "path": { + "type": "string", + "description": "Routing-only path used to select a route inside the target service." + } + }, + "required": [ + "service" + ], + "type": "object" + } + ] + }, + "transforms": { + "items": { + "properties": { + "type": { + "type": "string", + "enum": [ + "request.path" + ] + }, + "op": { + "type": "string", + "enum": [ + "set" + ] + }, + "args": { + "type": "string" + }, + "env": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "args", + "op", + "type" + ], + "type": "object" + }, + "type": "array" + }, + "has": { + "items": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "host" + ] + }, + "value": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "eq": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "neq": { + "type": "string" + }, + "inc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "ninc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "pre": { + "type": "string" + }, + "suf": { + "type": "string" + }, + "re": { + "type": "string" + }, + "gt": { + "type": "number" + }, + "gte": { + "type": "number" + }, + "lt": { + "type": "number" + }, + "lte": { + "type": "number" + } + }, + "type": "object" + } + ] + } + }, + "required": [ + "type", + "value" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "cookie", + "header", + "query" + ] + }, + "key": { + "type": "string" + }, + "value": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "eq": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "neq": { + "type": "string" + }, + "inc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "ninc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "pre": { + "type": "string" + }, + "suf": { + "type": "string" + }, + "re": { + "type": "string" + }, + "gt": { + "type": "number" + }, + "gte": { + "type": "number" + }, + "lt": { + "type": "number" + }, + "lte": { + "type": "number" + } + }, + "type": "object" + } + ] + } + }, + "required": [ + "key", + "type" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "missing": { + "items": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "host" + ] + }, + "value": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "eq": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "neq": { + "type": "string" + }, + "inc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "ninc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "pre": { + "type": "string" + }, + "suf": { + "type": "string" + }, + "re": { + "type": "string" + }, + "gt": { + "type": "number" + }, + "gte": { + "type": "number" + }, + "lt": { + "type": "number" + }, + "lte": { + "type": "number" + } + }, + "type": "object" + } + ] + } + }, + "required": [ + "type", + "value" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "cookie", + "header", + "query" + ] + }, + "key": { + "type": "string" + }, + "value": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "eq": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "neq": { + "type": "string" + }, + "inc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "ninc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "pre": { + "type": "string" + }, + "suf": { + "type": "string" + }, + "re": { + "type": "string" + }, + "gt": { + "type": "number" + }, + "gte": { + "type": "number" + }, + "lt": { + "type": "number" + }, + "lte": { + "type": "number" + } + }, + "type": "object" + } + ] + } + }, + "required": [ + "key", + "type" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "statusCode": { + "type": "number" + }, + "env": { + "items": { + "type": "string" + }, + "type": "array" + }, + "respectOriginCacheControl": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "destination", + "source" + ], + "type": "object" + }, + "type": "array" + }, + "routes": { + "items": { + "oneOf": [ + { + "properties": { + "src": { + "type": "string" + }, + "dest": { + "type": "string" + }, + "headers": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "methods": { + "items": { + "type": "string" + }, + "type": "array" + }, + "continue": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "override": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "caseSensitive": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "check": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "important": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "status": { + "type": "number" + }, + "has": { + "items": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "host" + ] + }, + "value": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "eq": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "neq": { + "type": "string" + }, + "inc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "ninc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "pre": { + "type": "string" + }, + "suf": { + "type": "string" + }, + "re": { + "type": "string" + }, + "gt": { + "type": "number" + }, + "gte": { + "type": "number" + }, + "lt": { + "type": "number" + }, + "lte": { + "type": "number" + } + }, + "type": "object" + } + ] + } + }, + "required": [ + "type", + "value" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "cookie", + "header", + "query" + ] + }, + "key": { + "type": "string" + }, + "value": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "eq": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "neq": { + "type": "string" + }, + "inc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "ninc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "pre": { + "type": "string" + }, + "suf": { + "type": "string" + }, + "re": { + "type": "string" + }, + "gt": { + "type": "number" + }, + "gte": { + "type": "number" + }, + "lt": { + "type": "number" + }, + "lte": { + "type": "number" + } + }, + "type": "object" + } + ] + } + }, + "required": [ + "key", + "type" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "missing": { + "items": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "host" + ] + }, + "value": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "eq": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "neq": { + "type": "string" + }, + "inc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "ninc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "pre": { + "type": "string" + }, + "suf": { + "type": "string" + }, + "re": { + "type": "string" + }, + "gt": { + "type": "number" + }, + "gte": { + "type": "number" + }, + "lt": { + "type": "number" + }, + "lte": { + "type": "number" + } + }, + "type": "object" + } + ] + } + }, + "required": [ + "type", + "value" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "cookie", + "header", + "query" + ] + }, + "key": { + "type": "string" + }, + "value": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "eq": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "neq": { + "type": "string" + }, + "inc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "ninc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "pre": { + "type": "string" + }, + "suf": { + "type": "string" + }, + "re": { + "type": "string" + }, + "gt": { + "type": "number" + }, + "gte": { + "type": "number" + }, + "lt": { + "type": "number" + }, + "lte": { + "type": "number" + } + }, + "type": "object" + } + ] + } + }, + "required": [ + "key", + "type" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "mitigate": { + "properties": { + "action": { + "type": "string", + "enum": [ + "challenge", + "deny" + ] + } + }, + "required": [ + "action" + ], + "type": "object" + }, + "transforms": { + "items": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "request.headers", + "request.query", + "response.headers" + ] + }, + "op": { + "type": "string", + "enum": [ + "append", + "delete", + "set" + ] + }, + "target": { + "properties": { + "key": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "eq": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "neq": { + "type": "string" + }, + "inc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "ninc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "pre": { + "type": "string" + }, + "suf": { + "type": "string" + }, + "gt": { + "type": "number" + }, + "gte": { + "type": "number" + }, + "lt": { + "type": "number" + }, + "lte": { + "type": "number" + } + }, + "type": "object" + } + ] + } + }, + "required": [ + "key" + ], + "type": "object" + }, + "args": { + "oneOf": [ + { + "type": "string" + }, + { + "items": { + "type": "string" + }, + "type": "array" + } + ] + }, + "env": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "op", + "target", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "request.path" + ] + }, + "op": { + "type": "string", + "enum": [ + "set" + ] + }, + "args": { + "type": "string" + }, + "env": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "args", + "op", + "type" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "env": { + "items": { + "type": "string" + }, + "type": "array" + }, + "locale": { + "properties": { + "redirect": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "cookie": { + "type": "string" + } + }, + "type": "object" + }, + "source": { + "type": "string", + "description": "Aliases for `src`, `dest`, and `status`. These provide consistency with the `rewrites`, `redirects`, and `headers` fields which use `source`, `destination`, and `statusCode`. During normalization, the string forms are converted to their canonical forms (`src`, `dest`, `status`) and stripped from the route object. `destination` may also be a service-targeted object, in which case routing is delegated into the named service's internal route table and the object is preserved as-is (not folded into `dest`)." + }, + "destination": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "service" + ], + "description": "Optional explicit format marker. The destination is identified by the presence of `service`, so `type` is no longer required." + }, + "service": { + "type": "string" + }, + "path": { + "type": "string", + "description": "Routing-only path used to select a route inside the target service." + } + }, + "required": [ + "service" + ], + "type": "object" + } + ] + }, + "statusCode": { + "type": "number" + }, + "middlewarePath": { + "type": "string", + "description": "A middleware key within the `output` key under the build result. Overrides a `middleware` definition." + }, + "middlewareRawSrc": { + "items": { + "type": "string" + }, + "type": "array", + "description": "The original middleware matchers." + }, + "middleware": { + "type": "number", + "description": "A middleware index in the `middleware` key under the build result" + }, + "respectOriginCacheControl": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "src" + ], + "type": "object" + }, + { + "properties": { + "handle": { + "type": "string", + "enum": [ + "error", + "filesystem", + "hit", + "miss", + "resource", + "rewrite" + ] + }, + "src": { + "type": "string" + }, + "dest": { + "type": "string" + }, + "status": { + "type": "number" + } + }, + "required": [ + "handle" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "cleanUrls": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "trailingSlash": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "builder", + "name", + "root", + "schema" + ], + "type": "object", + "description": "Services detected during build from vercel.json experimentalServices or auto-detected from project structure. Used to inject service URLs as environment variables at runtime." + } + ] + }, + "type": "array", + "description": "Services detected during build from vercel.json experimentalServices or auto-detected from project structure. Used to inject service URLs as environment variables at runtime." + }, + "gitRepo": { + "nullable": true, + "oneOf": [ + { + "properties": { + "namespace": { + "type": "string" + }, + "projectId": { + "type": "number" + }, + "type": { + "type": "string", + "enum": [ + "gitlab" + ] + }, + "url": { + "type": "string" + }, + "path": { + "type": "string" + }, + "defaultBranch": { + "type": "string" + }, + "name": { + "type": "string" + }, + "private": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "ownerType": { + "type": "string", + "enum": [ + "team", + "user" + ] + } + }, + "required": [ + "defaultBranch", + "name", + "namespace", + "ownerType", + "path", + "private", + "projectId", + "type", + "url" + ], + "type": "object" + }, + { + "properties": { + "org": { + "type": "string" + }, + "repo": { + "type": "string" + }, + "repoId": { + "type": "number" + }, + "type": { + "type": "string", + "enum": [ + "github" + ] + }, + "repoOwnerId": { + "type": "number" + }, + "path": { + "type": "string" + }, + "defaultBranch": { + "type": "string" + }, + "name": { + "type": "string" + }, + "private": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "ownerType": { + "type": "string", + "enum": [ + "team", + "user" + ] + } + }, + "required": [ + "defaultBranch", + "name", + "org", + "ownerType", + "path", + "private", + "repo", + "repoId", + "repoOwnerId", + "type" + ], + "type": "object" + }, + { + "properties": { + "owner": { + "type": "string" + }, + "repoUuid": { + "type": "string" + }, + "slug": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "bitbucket" + ] + }, + "workspaceUuid": { + "type": "string" + }, + "path": { + "type": "string" + }, + "defaultBranch": { + "type": "string" + }, + "name": { + "type": "string" + }, + "private": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "ownerType": { + "type": "string", + "enum": [ + "team", + "user" + ] + } + }, + "required": [ + "defaultBranch", + "name", + "owner", + "ownerType", + "path", + "private", + "repoUuid", + "slug", + "type", + "workspaceUuid" + ], + "type": "object" + }, + { + "properties": { + "org": { + "type": "string" + }, + "repo": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "vercel" + ] + }, + "path": { + "type": "string" + }, + "defaultBranch": { + "type": "string" + }, + "name": { + "type": "string" + }, + "private": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "ownerType": { + "type": "string", + "enum": [ + "team", + "user" + ] + } + }, + "required": [ + "defaultBranch", + "name", + "org", + "ownerType", + "path", + "private", + "repo", + "type" + ], + "type": "object" + }, + { + "properties": { + "owner": { + "type": "string", + "description": "Owner (namespace) slug." + }, + "repo": { + "type": "string" + }, + "repoId": { + "type": "string", + "description": "Origin repository id." + }, + "type": { + "type": "string", + "enum": [ + "cursor-origin" + ] + }, + "path": { + "type": "string" + }, + "defaultBranch": { + "type": "string" + }, + "name": { + "type": "string" + }, + "private": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "ownerType": { + "type": "string", + "enum": [ + "team", + "user" + ] + } + }, + "required": [ + "defaultBranch", + "name", + "owner", + "ownerType", + "path", + "private", + "repo", + "repoId", + "type" + ], + "type": "object" + } + ] + }, + "flags": { + "oneOf": [ + { + "properties": { + "definitions": { + "additionalProperties": { + "properties": { + "options": { + "items": { + "properties": { + "value": { + "$ref": "#/components/schemas/FlagJSONValue" + }, + "label": { + "type": "string" + } + }, + "required": [ + "value" + ], + "type": "object" + }, + "type": "array" + }, + "url": { + "type": "string" + }, + "description": { + "type": "string" + } + }, + "type": "object" + }, + "type": "object" + } + }, + "required": [ + "definitions" + ], + "type": "object", + "description": "Flags defined in the Build Output API, used by this deployment. Primarily used by the Toolbar to know about the used flags." + }, + { + "items": { + "type": "object", + "description": "Flags defined in the Build Output API, used by this deployment. Primarily used by the Toolbar to know about the used flags." + }, + "type": "array", + "description": "Flags defined in the Build Output API, used by this deployment. Primarily used by the Toolbar to know about the used flags." + } + ] + }, + "microfrontends": { + "oneOf": [ + { + "properties": { + "isDefaultApp": { + "type": "boolean", + "enum": [ + false + ] + }, + "defaultAppProjectName": { + "type": "string", + "description": "The project name of the default app of this deployment's microfrontends group." + }, + "defaultRoute": { + "type": "string", + "description": "A path that is used to take screenshots and as the default path in preview links when a domain for this microfrontend is shown in the UI." + }, + "groupIds": { + "type": "array", + "items": { + "type": "string" + }, + "minItems": 1, + "description": "The group of microfrontends that this project belongs to. Each microfrontend project must belong to a microfrontends group that is the set of microfrontends that are used together." + } + }, + "required": [ + "defaultAppProjectName", + "groupIds" + ], + "type": "object" + }, + { + "properties": { + "isDefaultApp": { + "type": "boolean", + "enum": [ + true + ] + }, + "mfeConfigUploadState": { + "type": "string", + "enum": [ + "no_config", + "success", + "waiting_on_build" + ], + "description": "The result of the microfrontends config upload during deployment creation / build. Only set for default app deployments. The config upload is attempted during deployment create, and then again during the build. If the config is not in the root directory, or the deployment is prebuilt, the config cannot be uploaded during deployment create. The upload during deployment build finds the config even if it's not in the root directory, as it has access to all files. Uploading the config during create is ideal, as then all child deployments are guaranteed to have access to the default app deployment config even if the default app has not yet started building. If the config is not uploaded, the child app will show as building until the config has been uploaded during the default app build. - `success` - The config was uploaded successfully, either when the deployment was created or during the build. - `waiting_on_build` - The config could not be uploaded during deployment create, will be attempted again during the build. - `no_config` - No config was found. Only set once the build has not found the config in any of the deployment's files. - `undefined` - Legacy deployments, or there was an error uploading the config during deployment create." + }, + "defaultAppProjectName": { + "type": "string", + "description": "The project name of the default app of this deployment's microfrontends group." + }, + "defaultRoute": { + "type": "string", + "description": "A path that is used to take screenshots and as the default path in preview links when a domain for this microfrontend is shown in the UI." + }, + "groupIds": { + "type": "array", + "items": { + "type": "string" + }, + "minItems": 1, + "description": "The group of microfrontends that this project belongs to. Each microfrontend project must belong to a microfrontends group that is the set of microfrontends that are used together." + } + }, + "required": [ + "defaultAppProjectName", + "groupIds", + "isDefaultApp" + ], + "type": "object" + } + ] + }, + "platform": { + "properties": { + "source": { + "properties": { + "name": { + "type": "string", + "description": "Display name of the platform." + } + }, + "required": [ + "name" + ], + "type": "object", + "description": "The external platform that created the deployment (e.g. its display name)." + }, + "origin": { + "properties": { + "type": { + "type": "string", + "enum": [ + "id", + "url" + ], + "description": "Whether the value is an opaque identifier or a URL." + }, + "value": { + "type": "string", + "description": "The identifier or URL pointing to the originating entity." + } + }, + "required": [ + "type", + "value" + ], + "type": "object", + "description": "Reference back to the entity on the platform that initiated the deployment." + }, + "creator": { + "properties": { + "name": { + "type": "string", + "description": "Display name of the platform user." + }, + "avatar": { + "type": "string", + "description": "URL of the platform user's avatar image." + } + }, + "required": [ + "name" + ], + "type": "object", + "description": "The user on the external platform who triggered the deployment." + }, + "meta": { + "additionalProperties": { + "type": "string" + }, + "type": "object", + "description": "Arbitrary key-value metadata provided by the platform." + } + }, + "required": [ + "creator", + "origin", + "source" + ], + "type": "object", + "description": "Metadata about the source platform that triggered the deployment. Allows us to map a deployment back to a platform (e.g. the chat that created it)" + }, + "config": { + "properties": { + "version": { + "type": "number" + }, + "functionType": { + "type": "string", + "enum": [ + "fluid", + "standard" + ] + }, + "functionMemoryType": { + "type": "string", + "enum": [ + "performance", + "performance_xl", + "standard", + "standard_legacy" + ] + }, + "functionTimeout": { + "nullable": true, + "type": "number" + }, + "secureComputePrimaryRegion": { + "nullable": true, + "type": "string" + }, + "secureComputeFallbackRegion": { + "nullable": true, + "type": "string" + }, + "isUsingActiveCPU": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "resourceConfig": { + "properties": { + "buildQueue": { + "properties": { + "configuration": { + "type": "string", + "enum": [ + "SKIP_NAMESPACE_QUEUE", + "WAIT_FOR_NAMESPACE_QUEUE" + ], + "description": "Build resource configuration snapshot for this deployment." + } + }, + "type": "object", + "description": "Build resource configuration snapshot for this deployment." + }, + "elasticConcurrency": { + "type": "string", + "enum": [ + "PROJECT_SETTING", + "SKIP_QUEUE", + "TEAM_SETTING" + ], + "description": "When elastic concurrency is used for this deployment, a value is set. The value tells the reason where the setting was coming from. - TEAM_SETTING: Inherited from team settings - PROJECT_SETTING: Inherited from project settings - SKIP_QUEUE: Manually triggered by user to skip the queues" + }, + "buildMachine": { + "properties": { + "purchaseType": { + "nullable": true, + "type": "string", + "enum": [ + "basic", + "enhanced", + "standard", + "turbo", + null + ], + "description": "Machine type that was used for the build." + } + }, + "type": "object" + } + }, + "type": "object", + "description": "Build resource configuration snapshot for this deployment." + } + }, + "required": [ + "functionMemoryType", + "functionTimeout", + "functionType", + "secureComputeFallbackRegion", + "secureComputePrimaryRegion" + ], + "type": "object", + "description": "Since February 2025 the configuration must include snapshot data at the time of deployment creation to capture properties for the /deployments/:id/config endpoint utilized for displaying Deployment Configuration on the frontend This is optional because older deployments may not have this data captured" + }, + "checks": { + "properties": { + "deployment-alias": { + "properties": { + "state": { + "type": "string", + "enum": [ + "failed", + "pending", + "succeeded" + ] + }, + "startedAt": { + "type": "number" + }, + "completedAt": { + "type": "number" + } + }, + "required": [ + "startedAt", + "state" + ], + "type": "object", + "description": "Condensed check data. Retrieve individual check and check run data using api-checks v2 routes." + } + }, + "required": [ + "deployment-alias" + ], + "type": "object" + }, + "seatBlock": { + "properties": { + "blockCode": { + "type": "string", + "enum": [ + "COMMIT_AUTHOR_REQUIRED", + "TEAM_ACCESS_REQUIRED" + ], + "description": "The NSNB decision code for the seat block. TODO: We should consolidate block types." + }, + "userId": { + "type": "string", + "description": "The blocked vercel user ID." + }, + "isVerified": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Determines if the user was verified during the block. In the git integration case, the commit sender was the author." + }, + "gitUserId": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "gitProvider": { + "type": "string", + "enum": [ + "bitbucket", + "github", + "gitlab" + ], + "description": "The git provider type associated with gitUserId." + } + }, + "required": [ + "blockCode" + ], + "type": "object", + "description": "NSNB Blocked metadata" + }, + "attribution": { + "properties": { + "commitMeta": { + "properties": { + "email": { + "type": "string", + "description": "Email from git commit author" + }, + "name": { + "type": "string", + "description": "Name from git commit author" + }, + "isVerified": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether the commit was signed/verified (GitHub only, others return undefined)" + } + }, + "type": "object", + "description": "Commit metadata from the git commit author" + }, + "gitUser": { + "properties": { + "id": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "login": { + "type": "string", + "description": "Git provider username/login" + }, + "type": { + "type": "string", + "description": "User type" + }, + "provider": { + "type": "string", + "description": "The git provider (github, gitlab, bitbucket)" + } + }, + "required": [ + "id", + "login" + ], + "type": "object", + "description": "Git provider user associated with the commit author email (only set if resolved)" + }, + "vercelUser": { + "properties": { + "id": { + "type": "string", + "description": "Vercel user ID" + }, + "username": { + "type": "string", + "description": "Vercel username" + }, + "teamRoles": { + "items": { + "type": "string" + }, + "type": "array", + "description": "Team roles at time of deployment" + } + }, + "required": [ + "id", + "username" + ], + "type": "object", + "description": "Vercel user linked to the git provider account (only set if resolved)" + } + }, + "type": "object", + "description": "Attribution metadata for the deployment, linking commit author to git and Vercel users. Only populated when the `enable-deployment-attribution` flag is enabled." + } + }, + "required": [ + "aliasAssigned", + "bootedAt", + "build", + "buildSkipped", + "buildingAt", + "createdAt", + "createdIn", + "creator", + "env", + "id", + "inspectorUrl", + "isInConcurrentBuildsQueue", + "isInSystemBuildsQueue", + "meta", + "name", + "ownerId", + "plan", + "projectId", + "projectSettings", + "public", + "readyState", + "regions", + "routes", + "status", + "type", + "url", + "version" + ], + "type": "object", + "description": "Returns the deployment object for the authenticated owner, including private fields such as environment variables, build log URLs, and internal metadata." + }, + { + "properties": { + "alias": { + "items": { + "type": "string" + }, + "type": "array", + "description": "A list of all the aliases (default aliases, staging aliases and production aliases) that were assigned upon deployment creation", + "example": [] + }, + "aliasAssigned": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "A boolean that will be true when the aliases from the alias property were assigned successfully", + "example": true + }, + "bootedAt": { + "type": "number" + }, + "buildingAt": { + "type": "number" + }, + "buildContainerFinishedAt": { + "type": "number", + "description": "Since April 2025 it necessary for On-Demand Concurrency Minutes calculation" + }, + "buildSkipped": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "creator": { + "properties": { + "uid": { + "type": "string", + "description": "Stable creator id across principal types (user id, app id, integration configuration id, or `system`).", + "example": "96SnxkFiMyVKsK3pnoHfx3Hz" + }, + "type": { + "type": "string", + "enum": [ + "app", + "integration", + "system", + "user" + ], + "description": "Principal type of the deployment creator." + }, + "username": { + "type": "string", + "description": "The username of the user that created the deployment", + "example": "john-doe" + }, + "avatar": { + "type": "string", + "description": "The avatar of the user that created the deployment" + } + }, + "required": [ + "uid" + ], + "type": "object", + "description": "Information about the deployment creator" + }, + "initReadyAt": { + "type": "number" + }, + "isFirstBranchDeployment": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "lambdas": { + "items": { + "properties": { + "id": { + "type": "string" + }, + "readyState": { + "type": "string", + "enum": [ + "BUILDING", + "ERROR", + "INITIALIZING", + "READY" + ] + }, + "createdAt": { + "type": "number" + }, + "entrypoint": { + "nullable": true, + "type": "string" + }, + "readyStateAt": { + "type": "number" + }, + "output": { + "items": { + "properties": { + "path": { + "type": "string" + }, + "functionName": { + "type": "string" + } + }, + "required": [ + "functionName", + "path" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "id", + "output" + ], + "type": "object", + "description": "A partial representation of a Build used by the deployment endpoint." + }, + "type": "array" + }, + "public": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "A boolean representing if the deployment is public or not. By default this is `false`", + "example": false + }, + "ready": { + "type": "number" + }, + "status": { + "type": "string", + "enum": [ + "BLOCKED", + "BUILDING", + "CANCELED", + "ERROR", + "INITIALIZING", + "QUEUED", + "READY" + ] + }, + "team": { + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "slug": { + "type": "string" + }, + "avatar": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "slug" + ], + "type": "object", + "description": "The team that owns the deployment if any" + }, + "userAliases": { + "items": { + "type": "string" + }, + "type": "array", + "description": "An array of domains that were provided by the user when creating the Deployment.", + "example": [ + "sub1.example.com", + "sub2.example.com" + ] + }, + "previewCommentsEnabled": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether or not preview comments are enabled for the deployment", + "example": false + }, + "ttyBuildLogs": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "customEnvironment": { + "oneOf": [ + { + "properties": { + "id": { + "type": "string", + "description": "Unique identifier for the custom environment (format: env_*)" + }, + "slug": { + "type": "string", + "description": "URL-friendly name of the environment" + }, + "type": { + "type": "string", + "enum": [ + "development", + "preview", + "production" + ], + "description": "The type of environment (production, preview, or development)" + }, + "description": { + "type": "string", + "description": "Optional description of the environment's purpose" + }, + "branchMatcher": { + "properties": { + "type": { + "type": "string", + "enum": [ + "endsWith", + "equals", + "startsWith" + ], + "description": "The type of matching to perform" + }, + "pattern": { + "type": "string", + "description": "The pattern to match against branch names" + } + }, + "required": [ + "pattern", + "type" + ], + "type": "object", + "description": "Configuration for matching git branches to this environment" + }, + "domains": { + "items": { + "properties": { + "name": { + "type": "string" + }, + "apexName": { + "type": "string" + }, + "projectId": { + "type": "string" + }, + "redirect": { + "nullable": true, + "type": "string" + }, + "redirectStatusCode": { + "nullable": true, + "type": "number", + "enum": [ + 301, + 302, + 307, + 308, + null + ] + }, + "gitBranch": { + "nullable": true, + "type": "string" + }, + "customEnvironmentId": { + "nullable": true, + "type": "string" + }, + "updatedAt": { + "type": "number" + }, + "createdAt": { + "type": "number" + }, + "verified": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "`true` if the domain is verified for use with the project. If `false` it will not be used as an alias on this project until the challenge in `verification` is completed." + }, + "verification": { + "items": { + "properties": { + "type": { + "type": "string" + }, + "domain": { + "type": "string" + }, + "value": { + "type": "string" + }, + "reason": { + "type": "string" + } + }, + "required": [ + "domain", + "reason", + "type", + "value" + ], + "type": "object", + "description": "A list of verification challenges, one of which must be completed to verify the domain for use on the project. After the challenge is complete `POST /projects/:idOrName/domains/:domain/verify` to verify the domain. Possible challenges: - If `verification.type = TXT` the `verification.domain` will be checked for a TXT record matching `verification.value`." + }, + "type": "array", + "description": "A list of verification challenges, one of which must be completed to verify the domain for use on the project. After the challenge is complete `POST /projects/:idOrName/domains/:domain/verify` to verify the domain. Possible challenges: - If `verification.type = TXT` the `verification.domain` will be checked for a TXT record matching `verification.value`." + } + }, + "required": [ + "apexName", + "name", + "projectId", + "verified" + ], + "type": "object", + "description": "List of domains associated with this environment" + }, + "type": "array", + "description": "List of domains associated with this environment" + }, + "currentDeploymentAliases": { + "items": { + "type": "string" + }, + "type": "array", + "description": "List of aliases for the current deployment" + }, + "createdAt": { + "type": "number", + "description": "Timestamp when the environment was created" + }, + "updatedAt": { + "type": "number", + "description": "Timestamp when the environment was last updated" + } + }, + "required": [ + "createdAt", + "id", + "slug", + "type", + "updatedAt" + ], + "type": "object", + "description": "If the deployment was created using a Custom Environment, then this property contains information regarding the environment used." + }, + { + "properties": { + "id": { + "type": "string" + } + }, + "required": [ + "id" + ], + "type": "object", + "description": "If the deployment was created using a Custom Environment, then this property contains information regarding the environment used." + } + ] + }, + "oomReport": { + "type": "string", + "enum": [ + "out-of-memory" + ] + }, + "readyStateReason": { + "type": "string" + }, + "id": { + "type": "string", + "description": "A string holding the unique ID of the deployment", + "example": "dpl_89qyp1cskzkLrVicDaZoDbjyHuDJ" + }, + "target": { + "nullable": true, + "type": "string", + "enum": [ + "production", + "staging", + null + ], + "description": "If defined, either `staging` if a staging alias in the format `\u003cproject\u003e.\u003cteam\u003e.now.sh` was assigned upon creation, or `production` if the aliases from `alias` were assigned. `null` value indicates the \"preview\" deployment.", + "example": null + }, + "readyState": { + "type": "string", + "enum": [ + "BLOCKED", + "BUILDING", + "CANCELED", + "ERROR", + "INITIALIZING", + "QUEUED", + "READY" + ], + "description": "The state of the deployment depending on the process of deploying, or if it is ready or in an error state", + "example": "READY" + }, + "aliasError": { + "nullable": true, + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object", + "description": "An object that will contain a `code` and a `message` when the aliasing fails, otherwise the value will be `null`", + "example": null + }, + "aliasWarning": { + "nullable": true, + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + }, + "link": { + "type": "string" + }, + "action": { + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" + }, + "errorCode": { + "type": "string" + }, + "errorMessage": { + "nullable": true, + "type": "string" + }, + "createdAt": { + "type": "number", + "description": "A number containing the date when the deployment was created in milliseconds", + "example": 1540257589405 + }, + "name": { + "type": "string", + "description": "The name of the project associated with the deployment at the time that the deployment was created", + "example": "my-project" + }, + "type": { + "type": "string", + "enum": [ + "LAMBDAS" + ] + }, + "aliasFinal": { + "nullable": true, + "type": "string" + }, + "autoAssignCustomDomains": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "applies to custom domains only, defaults to `true`" + }, + "automaticAliases": { + "items": { + "type": "string" + }, + "type": "array" + }, + "buildErrorAt": { + "type": "number" + }, + "checksState": { + "type": "string", + "enum": [ + "completed", + "registered", + "running" + ] + }, + "checksConclusion": { + "type": "string", + "enum": [ + "canceled", + "failed", + "skipped", + "succeeded" + ] + }, + "deletedAt": { + "nullable": true, + "type": "number", + "description": "A number containing the date when the deployment was deleted at milliseconds", + "example": 1540257589405 + }, + "defaultRoute": { + "type": "string", + "description": "Computed field that is only available for deployments with a microfrontend configuration." + }, + "canceledAt": { + "type": "number" + }, + "errorLink": { + "type": "string" + }, + "errorStep": { + "type": "string" + }, + "passiveRegions": { + "items": { + "type": "string" + }, + "type": "array", + "description": "Since November 2023 this field defines a set of regions that we will deploy the lambda to passively Lambdas will be deployed to these regions but only invoked if all of the primary `regions` are marked as out of service" + }, + "gitSource": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "github" + ] + }, + "repoId": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "ref": { + "nullable": true, + "type": "string" + }, + "sha": { + "type": "string" + }, + "prId": { + "nullable": true, + "type": "number" + } + }, + "required": [ + "repoId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "github" + ] + }, + "org": { + "type": "string" + }, + "repo": { + "type": "string" + }, + "ref": { + "nullable": true, + "type": "string" + }, + "sha": { + "type": "string" + }, + "prId": { + "nullable": true, + "type": "number" + } + }, + "required": [ + "org", + "repo", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "github-custom-host" + ] + }, + "host": { + "type": "string" + }, + "repoId": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "ref": { + "nullable": true, + "type": "string" + }, + "sha": { + "type": "string" + }, + "prId": { + "nullable": true, + "type": "number" + } + }, + "required": [ + "host", + "repoId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "github-custom-host" + ] + }, + "host": { + "type": "string" + }, + "org": { + "type": "string" + }, + "repo": { + "type": "string" + }, + "ref": { + "nullable": true, + "type": "string" + }, + "sha": { + "type": "string" + }, + "prId": { + "nullable": true, + "type": "number" + } + }, + "required": [ + "host", + "org", + "repo", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "github-limited" + ] + }, + "repoId": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "ref": { + "nullable": true, + "type": "string" + }, + "sha": { + "type": "string" + }, + "prId": { + "nullable": true, + "type": "number" + } + }, + "required": [ + "repoId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "github-limited" + ] + }, + "org": { + "type": "string" + }, + "repo": { + "type": "string" + }, + "ref": { + "nullable": true, + "type": "string" + }, + "sha": { + "type": "string" + }, + "prId": { + "nullable": true, + "type": "number" + } + }, + "required": [ + "org", + "repo", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "gitlab" + ] + }, + "projectId": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "ref": { + "nullable": true, + "type": "string" + }, + "sha": { + "type": "string" + }, + "prId": { + "nullable": true, + "type": "number" + } + }, + "required": [ + "projectId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "bitbucket" + ] + }, + "workspaceUuid": { + "type": "string" + }, + "repoUuid": { + "type": "string" + }, + "ref": { + "nullable": true, + "type": "string" + }, + "sha": { + "type": "string" + }, + "prId": { + "nullable": true, + "type": "number" + } + }, + "required": [ + "repoUuid", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "bitbucket" + ] + }, + "owner": { + "type": "string" + }, + "slug": { + "type": "string" + }, + "ref": { + "nullable": true, + "type": "string" + }, + "sha": { + "type": "string" + }, + "prId": { + "nullable": true, + "type": "number" + } + }, + "required": [ + "owner", + "slug", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "vercel" + ] + }, + "org": { + "type": "string" + }, + "repo": { + "type": "string" + }, + "sha": { + "type": "string" + }, + "repoPushedAt": { + "type": "number" + }, + "ref": { + "nullable": true, + "type": "string" + }, + "prId": { + "nullable": true, + "type": "number" + } + }, + "required": [ + "sha", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "cursor-origin" + ] + }, + "repoId": { + "type": "string", + "description": "Origin repository id." + }, + "owner": { + "type": "string", + "description": "Owner (namespace) slug." + }, + "repo": { + "type": "string" + }, + "ref": { + "nullable": true, + "type": "string" + }, + "sha": { + "type": "string" + }, + "prId": { + "nullable": true, + "type": "number" + } + }, + "required": [ + "repoId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "custom" + ] + }, + "ref": { + "type": "string" + }, + "sha": { + "type": "string" + }, + "gitUrl": { + "type": "string" + } + }, + "required": [ + "gitUrl", + "ref", + "sha", + "type" + ], + "type": "object", + "description": "Allows custom git sources (local folder mounted to the container) in test mode" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "github" + ] + }, + "ref": { + "type": "string" + }, + "sha": { + "type": "string" + }, + "repoId": { + "type": "number" + }, + "org": { + "type": "string" + }, + "repo": { + "type": "string" + } + }, + "required": [ + "ref", + "repoId", + "sha", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "github-custom-host" + ] + }, + "host": { + "type": "string" + }, + "ref": { + "type": "string" + }, + "sha": { + "type": "string" + }, + "repoId": { + "type": "number" + }, + "org": { + "type": "string" + }, + "repo": { + "type": "string" + } + }, + "required": [ + "host", + "ref", + "repoId", + "sha", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "github-limited" + ] + }, + "ref": { + "type": "string" + }, + "sha": { + "type": "string" + }, + "repoId": { + "type": "number" + }, + "org": { + "type": "string" + }, + "repo": { + "type": "string" + } + }, + "required": [ + "ref", + "repoId", + "sha", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "gitlab" + ] + }, + "ref": { + "type": "string" + }, + "sha": { + "type": "string" + }, + "projectId": { + "type": "number" + } + }, + "required": [ + "projectId", + "ref", + "sha", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "bitbucket" + ] + }, + "ref": { + "type": "string" + }, + "sha": { + "type": "string" + }, + "owner": { + "type": "string" + }, + "slug": { + "type": "string" + }, + "workspaceUuid": { + "type": "string" + }, + "repoUuid": { + "type": "string" + } + }, + "required": [ + "ref", + "repoUuid", + "sha", + "type", + "workspaceUuid" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "vercel" + ] + }, + "ref": { + "type": "string" + }, + "sha": { + "type": "string" + }, + "org": { + "type": "string" + }, + "repo": { + "type": "string" + }, + "repoPushedAt": { + "type": "number" + } + }, + "required": [ + "org", + "ref", + "repo", + "sha", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "cursor-origin" + ] + }, + "ref": { + "type": "string" + }, + "sha": { + "type": "string" + }, + "repoId": { + "type": "string" + }, + "owner": { + "type": "string" + }, + "repo": { + "type": "string" + } + }, + "required": [ + "owner", + "ref", + "repo", + "repoId", + "sha", + "type" + ], + "type": "object" + } + ] + }, + "manualProvisioning": { + "properties": { + "state": { + "type": "string", + "enum": [ + "COMPLETE", + "PENDING", + "TIMEOUT" + ], + "description": "Current provisioning state" + }, + "completedAt": { + "type": "number", + "description": "Timestamp when manual provisioning completed" + } + }, + "required": [ + "state" + ], + "type": "object", + "description": "Present when deployment was created with manual provisioning enabled, either explicitly or via the experimental BYOC git flow. The deployment stays in INITIALIZING until /continue is called." + }, + "meta": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "originCacheRegion": { + "type": "string" + }, + "nodeVersion": { + "type": "string", + "enum": [ + "10.x", + "12.x", + "14.x", + "16.x", + "18.x", + "20.x", + "22.x", + "24.x", + "8.10.x" + ], + "description": "If set it overrides the `projectSettings.nodeVersion` for this deployment." + }, + "project": { + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "framework": { + "nullable": true, + "type": "string" + } + }, + "required": [ + "id", + "name" + ], + "type": "object", + "description": "The public project information associated with the deployment." + }, + "prebuilt": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "readySubstate": { + "type": "string", + "enum": [ + "PROMOTED", + "ROLLING", + "STAGED" + ], + "description": "Substate of deployment when readyState is 'READY' Tracks whether or not deployment has seen production traffic: - STAGED: never seen production traffic - ROLLING: in the process of having production traffic gradually transitioned. - PROMOTED: has seen production traffic" + }, + "regions": { + "items": { + "type": "string" + }, + "type": "array", + "description": "The regions the deployment exists in", + "example": [ + "sfo1" + ] + }, + "softDeletedByRetention": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "flag to indicate if the deployment was deleted by retention policy", + "example": "true" + }, + "source": { + "type": "string", + "enum": [ + "api-trigger-git-deploy", + "cli", + "clone/repo", + "drop", + "git", + "git-deploy-hook", + "import", + "import/repo", + "redeploy", + "v0-web" + ], + "description": "Where was the deployment created from. Best-effort guess for metrics only — not authoritative; do not gate behavior on it.", + "example": "cli" + }, + "undeletedAt": { + "type": "number", + "description": "A number containing the date when the deployment was undeleted at milliseconds", + "example": 1540257589405 + }, + "url": { + "type": "string", + "description": "A string with the unique URL of the deployment", + "example": "my-instant-deployment-3ij3cxz9qr.now.sh" + }, + "userConfiguredDeploymentId": { + "type": "string", + "description": "Since January 2025 User-configured deployment ID for skew protection with pre-built deployments. This is set when users configure a custom deploymentId in their next.config.js file. This allows Next.js to use skew protection even when deployments are pre-built outside of Vercel's build system.", + "example": "abc123" + }, + "version": { + "type": "number", + "enum": [ + 2 + ], + "description": "The platform version that was used to create the deployment.", + "example": 2 + }, + "oidcTokenClaims": { + "properties": { + "iss": { + "type": "string" + }, + "sub": { + "type": "string" + }, + "scope": { + "type": "string" + }, + "aud": { + "type": "string" + }, + "owner": { + "type": "string" + }, + "owner_id": { + "type": "string" + }, + "project": { + "type": "string" + }, + "project_id": { + "type": "string" + }, + "environment": { + "type": "string" + }, + "custom_environment_id": { + "type": "string" + }, + "mfe_group_ids": { + "items": { + "type": "string" + }, + "type": "array" + }, + "plan": { + "type": "string" + } + }, + "required": [ + "aud", + "environment", + "iss", + "owner", + "owner_id", + "project", + "project_id", + "scope", + "sub" + ], + "type": "object" + } + }, + "required": [ + "aliasAssigned", + "bootedAt", + "buildSkipped", + "buildingAt", + "createdAt", + "creator", + "id", + "meta", + "name", + "public", + "readyState", + "regions", + "status", + "type", + "url", + "version" + ], + "type": "object", + "description": "Returns a reduced view of the deployment with public information only. Private fields are omitted when the requester is not the deployment owner." + } + ] + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "The deployment was not found" + }, + "410": { + "description": "" + }, + "429": { + "description": "" + } + }, + "x-vercel-cli": { + "supportedSubcommands": true, + "supportedProduction": false, + "aliases": [ + "inspect", + "get" + ] + }, + "parameters": [ + { + "name": "idOrUrl", + "description": "The unique identifier or hostname of the deployment.", + "in": "path", + "required": true, + "schema": { + "example": "dpl_89qyp1cskzkLrVicDaZoDbjyHuDJ", + "description": "The unique identifier or hostname of the deployment.", + "type": "string" + } + }, + { + "name": "withGitRepoInfo", + "description": "When `true`, the response includes the `gitSource` object with the commit SHA, branch name, and connected repository metadata. Defaults to `false`.", + "in": "query", + "required": false, + "schema": { + "description": "When `true`, the response includes the `gitSource` object with the commit SHA, branch name, and connected repository metadata. Defaults to `false`.", + "type": "string", + "example": "true" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + } + }, + "/v13/deployments": { + "post": { + "description": "Creates a new deployment for the authenticated team or user. For non-git deployments, upload files first via the file upload API, then reference them here by SHA — or inline small files directly in the request body. To redeploy an existing deployment, provide its `deploymentId`; all settings are inherited unless explicitly overridden. The deployment begins building immediately and transitions through `QUEUED` → `INITIALIZING` → `BUILDING` before reaching `READY` or `ERROR`.", + "operationId": "createDeployment", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Create a new deployment", + "tags": [ + "deployments" + ], + "responses": { + "200": { + "description": "Returns the newly created deployment object. Poll `readyState` to track build progress. See https://vercel.com/docs/deployments/deployment-states for possible states.\nReturns the reduced deployment view for anonymous (`vcn_`) callers. Pool-team details are withheld.", + "content": { + "application/json": { + "schema": { + "oneOf": [ + { + "properties": { + "alias": { + "items": { + "type": "string" + }, + "type": "array" + }, + "aliasAssigned": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "id": { + "type": "string", + "description": "A string holding the unique ID of the deployment", + "example": "dpl_89qyp1cskzkLrVicDaZoDbjyHuDJ" + }, + "target": { + "nullable": true, + "type": "string", + "enum": [ + "production", + "staging", + null + ], + "description": "If defined, either `staging` if a staging alias in the format `\u003cproject\u003e.\u003cteam\u003e.now.sh` was assigned upon creation, or `production` if the aliases from `alias` were assigned. `null` value indicates the \"preview\" deployment.", + "example": null + }, + "readyState": { + "type": "string", + "enum": [ + "BLOCKED", + "BUILDING", + "CANCELED", + "ERROR", + "INITIALIZING", + "QUEUED", + "READY" + ], + "description": "The state of the deployment depending on the process of deploying, or if it is ready or in an error state", + "example": "READY" + }, + "aliasError": { + "nullable": true, + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object", + "description": "An object that will contain a `code` and a `message` when the aliasing fails, otherwise the value will be `null`", + "example": null + }, + "aliasWarning": { + "nullable": true, + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + }, + "link": { + "type": "string" + }, + "action": { + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" + }, + "errorCode": { + "type": "string" + }, + "errorMessage": { + "nullable": true, + "type": "string" + } + }, + "required": [ + "aliasAssigned", + "id", + "readyState" + ], + "type": "object", + "description": "Returns the reduced deployment view for anonymous (`vcn_`) callers. Pool-team details are withheld." + }, + { + "properties": { + "aliasAssignedAt": { + "nullable": true, + "oneOf": [ + { + "type": "number" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + } + ] + }, + "alwaysRefuseToBuild": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "build": { + "properties": { + "env": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "env" + ], + "type": "object" + }, + "buildArtifactUrls": { + "items": { + "type": "string" + }, + "type": "array" + }, + "builds": { + "items": { + "properties": { + "use": { + "type": "string" + }, + "src": { + "type": "string" + }, + "config": { + "additionalProperties": true, + "type": "object" + } + }, + "required": [ + "use" + ], + "type": "object" + }, + "type": "array" + }, + "env": { + "items": { + "type": "string" + }, + "type": "array" + }, + "resourceConfig": { + "properties": { + "buildMachine": { + "properties": { + "purchaseType": { + "type": "string", + "enum": [ + "basic", + "enhanced", + "standard", + "turbo" + ], + "description": "Machine type which was purchased/selected for this build. `basic` is the 2vCPU tier, recorded on the deployment so the build pipeline can detect a basic build without consulting the project." + }, + "defaultPurchaseType": { + "type": "string", + "enum": [ + "basic", + "enhanced", + "standard" + ], + "description": "The default plan type for the build machine — what the customer is *paying* for on their plan. For most customers, this is standard, but some customers have an entitlement for enhanced builds." + }, + "machineSelectionType": { + "type": "string", + "enum": [ + "elastic", + "fixed" + ], + "description": "Whether the build ran on a fixed or elastic machine. Used to drive billing for the build." + }, + "selectionSource": { + "type": "string", + "enum": [ + "elastic-algorithm", + "plan-default", + "project-setting", + "team-entitlement", + "team-setting" + ], + "description": "The setting which selected the build machine when the deployment was created. Frozen here so later project or team changes do not rewrite its history." + }, + "cores": { + "type": "number", + "description": "Number of cores the build machine ran with. Set at dispatch time once the build lands on a hive." + }, + "memory": { + "type": "number", + "description": "Memory, in MiB, the build machine ran with. Set at dispatch time once the build lands on a hive." + } + }, + "type": "object", + "description": "Build machine configuration recorded for this deployment's build. See {@link DeploymentBuildMachine}. Distinct from the team/user `resourceConfig.buildMachine`, which only carries `default`." + } + }, + "type": "object" + }, + "inspectorUrl": { + "nullable": true, + "type": "string" + }, + "isInConcurrentBuildsQueue": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "isInSystemBuildsQueue": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "projectSettings": { + "properties": { + "nodeVersion": { + "type": "string", + "enum": [ + "10.x", + "12.x", + "14.x", + "16.x", + "18.x", + "20.x", + "22.x", + "24.x", + "8.10.x" + ] + }, + "buildCommand": { + "nullable": true, + "type": "string" + }, + "devCommand": { + "nullable": true, + "type": "string" + }, + "framework": { + "nullable": true, + "type": "string", + "enum": [ + "actix-web", + "angular", + "ash", + "astro", + "axum", + "blitzjs", + "brunch", + "bun", + "container", + "create-react-app", + "django", + "docusaurus", + "docusaurus-2", + "dojo", + "eleventy", + "elysia", + "ember", + "eve", + "express", + "factory-eve", + "fastapi", + "fasthtml", + "fastify", + "flask", + "gatsby", + "go", + "gridsome", + "h3", + "hexo", + "hono", + "hugo", + "hydrogen", + "ionic-angular", + "ionic-react", + "jekyll", + "koa", + "mastra", + "middleman", + "nestjs", + "nextjs", + "nitro", + "node", + "nuxtjs", + "parcel", + "polymer", + "preact", + "python", + "react-router", + "redwoodjs", + "remix", + "ruby", + "rust", + "saber", + "sanity", + "sanity-v2", + "sapper", + "scully", + "services", + "solidstart", + "solidstart-1", + "stencil", + "storybook", + "svelte", + "sveltekit", + "sveltekit-1", + "tanstack-start", + "tanstack-start-lovable", + "umijs", + "vite", + "vitepress", + "vue", + "vuepress", + "xmcp", + "zola", + null + ] + }, + "commandForIgnoringBuildStep": { + "nullable": true, + "type": "string" + }, + "installCommand": { + "nullable": true, + "type": "string" + }, + "outputDirectory": { + "nullable": true, + "type": "string" + }, + "speedInsights": { + "properties": { + "id": { + "type": "string" + }, + "enabledAt": { + "type": "number" + }, + "disabledAt": { + "type": "number" + }, + "canceledAt": { + "type": "number" + }, + "hasData": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "dataReceivedAt": { + "type": "number", + "description": "When the first free (not Speed Insights Plus) production data point was observed, in ms. Set once by subscriber-analytics-events; projects that already had data before this field shipped get it backfilled on their next batch, so it reads \"first free data point observed\", not necessarily \"first ever\"." + }, + "paidAt": { + "type": "number" + } + }, + "required": [ + "id" + ], + "type": "object" + }, + "webAnalytics": { + "properties": { + "id": { + "type": "string" + }, + "disabledAt": { + "type": "number" + }, + "canceledAt": { + "type": "number" + }, + "enabledAt": { + "type": "number" + }, + "hasData": { + "type": "boolean", + "enum": [ + true + ] + } + }, + "required": [ + "id" + ], + "type": "object" + } + }, + "type": "object" + }, + "integrations": { + "properties": { + "status": { + "type": "string", + "enum": [ + "error", + "pending", + "ready", + "skipped", + "timeout" + ] + }, + "startedAt": { + "type": "number" + }, + "claimedAt": { + "type": "number" + }, + "completedAt": { + "type": "number" + }, + "skippedAt": { + "type": "number" + }, + "skippedBy": { + "type": "string" + } + }, + "required": [ + "startedAt", + "status" + ], + "type": "object" + }, + "images": { + "properties": { + "sizes": { + "items": { + "type": "number" + }, + "type": "array" + }, + "qualities": { + "items": { + "type": "number" + }, + "type": "array" + }, + "domains": { + "items": { + "type": "string" + }, + "type": "array" + }, + "remotePatterns": { + "items": { + "properties": { + "protocol": { + "type": "string", + "enum": [ + "http", + "https" + ], + "description": "Must be `http` or `https`." + }, + "hostname": { + "type": "string", + "description": "Can be literal or wildcard. Single `*` matches a single subdomain. Double `**` matches any number of subdomains." + }, + "port": { + "type": "string", + "description": "Can be literal port such as `8080` or empty string meaning no port." + }, + "pathname": { + "type": "string", + "description": "Can be literal or wildcard. Single `*` matches a single path segment. Double `**` matches any number of path segments." + }, + "search": { + "type": "string", + "description": "Can be literal query string such as `?v=1` or empty string meaning no query string." + } + }, + "required": [ + "hostname" + ], + "type": "object" + }, + "type": "array" + }, + "localPatterns": { + "items": { + "properties": { + "pathname": { + "type": "string", + "description": "Can be literal or wildcard. Single `*` matches a single path segment. Double `**` matches any number of path segments." + }, + "search": { + "type": "string", + "description": "Can be literal query string such as `?v=1` or empty string meaning no query string." + } + }, + "type": "object" + }, + "type": "array" + }, + "minimumCacheTTL": { + "type": "number" + }, + "formats": { + "items": { + "type": "string", + "enum": [ + "image/avif", + "image/webp" + ] + }, + "type": "array" + }, + "dangerouslyAllowSVG": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "contentSecurityPolicy": { + "type": "string" + }, + "contentDispositionType": { + "type": "string", + "enum": [ + "attachment", + "inline" + ] + } + }, + "type": "object" + }, + "alias": { + "items": { + "type": "string" + }, + "type": "array", + "description": "A list of all the aliases (default aliases, staging aliases and production aliases) that were assigned upon deployment creation", + "example": [] + }, + "aliasAssigned": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "A boolean that will be true when the aliases from the alias property were assigned successfully", + "example": true + }, + "bootedAt": { + "type": "number" + }, + "buildingAt": { + "type": "number" + }, + "buildContainerFinishedAt": { + "type": "number", + "description": "Since April 2025 it necessary for On-Demand Concurrency Minutes calculation" + }, + "buildSkipped": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "creator": { + "properties": { + "uid": { + "type": "string", + "description": "Stable creator id across principal types (user id, app id, integration configuration id, or `system`).", + "example": "96SnxkFiMyVKsK3pnoHfx3Hz" + }, + "type": { + "type": "string", + "enum": [ + "app", + "integration", + "system", + "user" + ], + "description": "Principal type of the deployment creator." + }, + "username": { + "type": "string", + "description": "The username of the user that created the deployment", + "example": "john-doe" + }, + "avatar": { + "type": "string", + "description": "The avatar of the user that created the deployment" + } + }, + "required": [ + "uid" + ], + "type": "object", + "description": "Information about the deployment creator" + }, + "initReadyAt": { + "type": "number" + }, + "isFirstBranchDeployment": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "lambdas": { + "items": { + "properties": { + "id": { + "type": "string" + }, + "readyState": { + "type": "string", + "enum": [ + "BUILDING", + "ERROR", + "INITIALIZING", + "READY" + ] + }, + "createdAt": { + "type": "number" + }, + "entrypoint": { + "nullable": true, + "type": "string" + }, + "readyStateAt": { + "type": "number" + }, + "output": { + "items": { + "properties": { + "path": { + "type": "string" + }, + "functionName": { + "type": "string" + } + }, + "required": [ + "functionName", + "path" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "id", + "output" + ], + "type": "object", + "description": "A partial representation of a Build used by the deployment endpoint." + }, + "type": "array" + }, + "public": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "A boolean representing if the deployment is public or not. By default this is `false`", + "example": false + }, + "ready": { + "type": "number" + }, + "status": { + "type": "string", + "enum": [ + "BLOCKED", + "BUILDING", + "CANCELED", + "ERROR", + "INITIALIZING", + "QUEUED", + "READY" + ] + }, + "team": { + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "slug": { + "type": "string" + }, + "avatar": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "slug" + ], + "type": "object", + "description": "The team that owns the deployment if any" + }, + "userAliases": { + "items": { + "type": "string" + }, + "type": "array", + "description": "An array of domains that were provided by the user when creating the Deployment.", + "example": [ + "sub1.example.com", + "sub2.example.com" + ] + }, + "previewCommentsEnabled": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether or not preview comments are enabled for the deployment", + "example": false + }, + "ttyBuildLogs": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "customEnvironment": { + "oneOf": [ + { + "properties": { + "id": { + "type": "string", + "description": "Unique identifier for the custom environment (format: env_*)" + }, + "slug": { + "type": "string", + "description": "URL-friendly name of the environment" + }, + "type": { + "type": "string", + "enum": [ + "development", + "preview", + "production" + ], + "description": "The type of environment (production, preview, or development)" + }, + "description": { + "type": "string", + "description": "Optional description of the environment's purpose" + }, + "branchMatcher": { + "properties": { + "type": { + "type": "string", + "enum": [ + "endsWith", + "equals", + "startsWith" + ], + "description": "The type of matching to perform" + }, + "pattern": { + "type": "string", + "description": "The pattern to match against branch names" + } + }, + "required": [ + "pattern", + "type" + ], + "type": "object", + "description": "Configuration for matching git branches to this environment" + }, + "domains": { + "items": { + "properties": { + "name": { + "type": "string" + }, + "apexName": { + "type": "string" + }, + "projectId": { + "type": "string" + }, + "redirect": { + "nullable": true, + "type": "string" + }, + "redirectStatusCode": { + "nullable": true, + "type": "number", + "enum": [ + 301, + 302, + 307, + 308, + null + ] + }, + "gitBranch": { + "nullable": true, + "type": "string" + }, + "customEnvironmentId": { + "nullable": true, + "type": "string" + }, + "updatedAt": { + "type": "number" + }, + "createdAt": { + "type": "number" + }, + "verified": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "`true` if the domain is verified for use with the project. If `false` it will not be used as an alias on this project until the challenge in `verification` is completed." + }, + "verification": { + "items": { + "properties": { + "type": { + "type": "string" + }, + "domain": { + "type": "string" + }, + "value": { + "type": "string" + }, + "reason": { + "type": "string" + } + }, + "required": [ + "domain", + "reason", + "type", + "value" + ], + "type": "object", + "description": "A list of verification challenges, one of which must be completed to verify the domain for use on the project. After the challenge is complete `POST /projects/:idOrName/domains/:domain/verify` to verify the domain. Possible challenges: - If `verification.type = TXT` the `verification.domain` will be checked for a TXT record matching `verification.value`." + }, + "type": "array", + "description": "A list of verification challenges, one of which must be completed to verify the domain for use on the project. After the challenge is complete `POST /projects/:idOrName/domains/:domain/verify` to verify the domain. Possible challenges: - If `verification.type = TXT` the `verification.domain` will be checked for a TXT record matching `verification.value`." + } + }, + "required": [ + "apexName", + "name", + "projectId", + "verified" + ], + "type": "object", + "description": "List of domains associated with this environment" + }, + "type": "array", + "description": "List of domains associated with this environment" + }, + "currentDeploymentAliases": { + "items": { + "type": "string" + }, + "type": "array", + "description": "List of aliases for the current deployment" + }, + "createdAt": { + "type": "number", + "description": "Timestamp when the environment was created" + }, + "updatedAt": { + "type": "number", + "description": "Timestamp when the environment was last updated" + } + }, + "required": [ + "createdAt", + "id", + "slug", + "type", + "updatedAt" + ], + "type": "object", + "description": "If the deployment was created using a Custom Environment, then this property contains information regarding the environment used." + }, + { + "properties": { + "id": { + "type": "string" + } + }, + "required": [ + "id" + ], + "type": "object", + "description": "If the deployment was created using a Custom Environment, then this property contains information regarding the environment used." + } + ] + }, + "oomReport": { + "type": "string", + "enum": [ + "out-of-memory" + ] + }, + "readyStateReason": { + "type": "string" + }, + "id": { + "type": "string", + "description": "A string holding the unique ID of the deployment", + "example": "dpl_89qyp1cskzkLrVicDaZoDbjyHuDJ" + }, + "target": { + "nullable": true, + "type": "string", + "enum": [ + "production", + "staging", + null + ], + "description": "If defined, either `staging` if a staging alias in the format `\u003cproject\u003e.\u003cteam\u003e.now.sh` was assigned upon creation, or `production` if the aliases from `alias` were assigned. `null` value indicates the \"preview\" deployment.", + "example": null + }, + "readyState": { + "type": "string", + "enum": [ + "BLOCKED", + "BUILDING", + "CANCELED", + "ERROR", + "INITIALIZING", + "QUEUED", + "READY" + ], + "description": "The state of the deployment depending on the process of deploying, or if it is ready or in an error state", + "example": "READY" + }, + "aliasError": { + "nullable": true, + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object", + "description": "An object that will contain a `code` and a `message` when the aliasing fails, otherwise the value will be `null`", + "example": null + }, + "aliasWarning": { + "nullable": true, + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + }, + "link": { + "type": "string" + }, + "action": { + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" + }, + "errorCode": { + "type": "string" + }, + "errorMessage": { + "nullable": true, + "type": "string" + }, + "createdAt": { + "type": "number", + "description": "A number containing the date when the deployment was created in milliseconds", + "example": 1540257589405 + }, + "name": { + "type": "string", + "description": "The name of the project associated with the deployment at the time that the deployment was created", + "example": "my-project" + }, + "type": { + "type": "string", + "enum": [ + "LAMBDAS" + ] + }, + "aliasFinal": { + "nullable": true, + "type": "string" + }, + "autoAssignCustomDomains": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "applies to custom domains only, defaults to `true`" + }, + "automaticAliases": { + "items": { + "type": "string" + }, + "type": "array" + }, + "buildErrorAt": { + "type": "number" + }, + "checksState": { + "type": "string", + "enum": [ + "completed", + "registered", + "running" + ] + }, + "checksConclusion": { + "type": "string", + "enum": [ + "canceled", + "failed", + "skipped", + "succeeded" + ] + }, + "deletedAt": { + "nullable": true, + "type": "number", + "description": "A number containing the date when the deployment was deleted at milliseconds", + "example": 1540257589405 + }, + "defaultRoute": { + "type": "string", + "description": "Computed field that is only available for deployments with a microfrontend configuration." + }, + "canceledAt": { + "type": "number" + }, + "errorLink": { + "type": "string" + }, + "errorStep": { + "type": "string" + }, + "passiveRegions": { + "items": { + "type": "string" + }, + "type": "array", + "description": "Since November 2023 this field defines a set of regions that we will deploy the lambda to passively Lambdas will be deployed to these regions but only invoked if all of the primary `regions` are marked as out of service" + }, + "gitSource": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "github" + ] + }, + "repoId": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "ref": { + "nullable": true, + "type": "string" + }, + "sha": { + "type": "string" + }, + "prId": { + "nullable": true, + "type": "number" + } + }, + "required": [ + "repoId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "github" + ] + }, + "org": { + "type": "string" + }, + "repo": { + "type": "string" + }, + "ref": { + "nullable": true, + "type": "string" + }, + "sha": { + "type": "string" + }, + "prId": { + "nullable": true, + "type": "number" + } + }, + "required": [ + "org", + "repo", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "github-custom-host" + ] + }, + "host": { + "type": "string" + }, + "repoId": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "ref": { + "nullable": true, + "type": "string" + }, + "sha": { + "type": "string" + }, + "prId": { + "nullable": true, + "type": "number" + } + }, + "required": [ + "host", + "repoId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "github-custom-host" + ] + }, + "host": { + "type": "string" + }, + "org": { + "type": "string" + }, + "repo": { + "type": "string" + }, + "ref": { + "nullable": true, + "type": "string" + }, + "sha": { + "type": "string" + }, + "prId": { + "nullable": true, + "type": "number" + } + }, + "required": [ + "host", + "org", + "repo", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "github-limited" + ] + }, + "repoId": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "ref": { + "nullable": true, + "type": "string" + }, + "sha": { + "type": "string" + }, + "prId": { + "nullable": true, + "type": "number" + } + }, + "required": [ + "repoId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "github-limited" + ] + }, + "org": { + "type": "string" + }, + "repo": { + "type": "string" + }, + "ref": { + "nullable": true, + "type": "string" + }, + "sha": { + "type": "string" + }, + "prId": { + "nullable": true, + "type": "number" + } + }, + "required": [ + "org", + "repo", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "gitlab" + ] + }, + "projectId": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "ref": { + "nullable": true, + "type": "string" + }, + "sha": { + "type": "string" + }, + "prId": { + "nullable": true, + "type": "number" + } + }, + "required": [ + "projectId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "bitbucket" + ] + }, + "workspaceUuid": { + "type": "string" + }, + "repoUuid": { + "type": "string" + }, + "ref": { + "nullable": true, + "type": "string" + }, + "sha": { + "type": "string" + }, + "prId": { + "nullable": true, + "type": "number" + } + }, + "required": [ + "repoUuid", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "bitbucket" + ] + }, + "owner": { + "type": "string" + }, + "slug": { + "type": "string" + }, + "ref": { + "nullable": true, + "type": "string" + }, + "sha": { + "type": "string" + }, + "prId": { + "nullable": true, + "type": "number" + } + }, + "required": [ + "owner", + "slug", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "vercel" + ] + }, + "org": { + "type": "string" + }, + "repo": { + "type": "string" + }, + "sha": { + "type": "string" + }, + "repoPushedAt": { + "type": "number" + }, + "ref": { + "nullable": true, + "type": "string" + }, + "prId": { + "nullable": true, + "type": "number" + } + }, + "required": [ + "sha", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "cursor-origin" + ] + }, + "repoId": { + "type": "string", + "description": "Origin repository id." + }, + "owner": { + "type": "string", + "description": "Owner (namespace) slug." + }, + "repo": { + "type": "string" + }, + "ref": { + "nullable": true, + "type": "string" + }, + "sha": { + "type": "string" + }, + "prId": { + "nullable": true, + "type": "number" + } + }, + "required": [ + "repoId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "custom" + ] + }, + "ref": { + "type": "string" + }, + "sha": { + "type": "string" + }, + "gitUrl": { + "type": "string" + } + }, + "required": [ + "gitUrl", + "ref", + "sha", + "type" + ], + "type": "object", + "description": "Allows custom git sources (local folder mounted to the container) in test mode" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "github" + ] + }, + "ref": { + "type": "string" + }, + "sha": { + "type": "string" + }, + "repoId": { + "type": "number" + }, + "org": { + "type": "string" + }, + "repo": { + "type": "string" + } + }, + "required": [ + "ref", + "repoId", + "sha", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "github-custom-host" + ] + }, + "host": { + "type": "string" + }, + "ref": { + "type": "string" + }, + "sha": { + "type": "string" + }, + "repoId": { + "type": "number" + }, + "org": { + "type": "string" + }, + "repo": { + "type": "string" + } + }, + "required": [ + "host", + "ref", + "repoId", + "sha", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "github-limited" + ] + }, + "ref": { + "type": "string" + }, + "sha": { + "type": "string" + }, + "repoId": { + "type": "number" + }, + "org": { + "type": "string" + }, + "repo": { + "type": "string" + } + }, + "required": [ + "ref", + "repoId", + "sha", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "gitlab" + ] + }, + "ref": { + "type": "string" + }, + "sha": { + "type": "string" + }, + "projectId": { + "type": "number" + } + }, + "required": [ + "projectId", + "ref", + "sha", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "bitbucket" + ] + }, + "ref": { + "type": "string" + }, + "sha": { + "type": "string" + }, + "owner": { + "type": "string" + }, + "slug": { + "type": "string" + }, + "workspaceUuid": { + "type": "string" + }, + "repoUuid": { + "type": "string" + } + }, + "required": [ + "ref", + "repoUuid", + "sha", + "type", + "workspaceUuid" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "vercel" + ] + }, + "ref": { + "type": "string" + }, + "sha": { + "type": "string" + }, + "org": { + "type": "string" + }, + "repo": { + "type": "string" + }, + "repoPushedAt": { + "type": "number" + } + }, + "required": [ + "org", + "ref", + "repo", + "sha", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "cursor-origin" + ] + }, + "ref": { + "type": "string" + }, + "sha": { + "type": "string" + }, + "repoId": { + "type": "string" + }, + "owner": { + "type": "string" + }, + "repo": { + "type": "string" + } + }, + "required": [ + "owner", + "ref", + "repo", + "repoId", + "sha", + "type" + ], + "type": "object" + } + ] + }, + "manualProvisioning": { + "properties": { + "state": { + "type": "string", + "enum": [ + "COMPLETE", + "PENDING", + "TIMEOUT" + ], + "description": "Current provisioning state" + }, + "completedAt": { + "type": "number", + "description": "Timestamp when manual provisioning completed" + } + }, + "required": [ + "state" + ], + "type": "object", + "description": "Present when deployment was created with manual provisioning enabled, either explicitly or via the experimental BYOC git flow. The deployment stays in INITIALIZING until /continue is called." + }, + "meta": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "originCacheRegion": { + "type": "string" + }, + "nodeVersion": { + "type": "string", + "enum": [ + "10.x", + "12.x", + "14.x", + "16.x", + "18.x", + "20.x", + "22.x", + "24.x", + "8.10.x" + ], + "description": "If set it overrides the `projectSettings.nodeVersion` for this deployment." + }, + "project": { + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "framework": { + "nullable": true, + "type": "string" + } + }, + "required": [ + "id", + "name" + ], + "type": "object", + "description": "The public project information associated with the deployment." + }, + "prebuilt": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "readySubstate": { + "type": "string", + "enum": [ + "PROMOTED", + "ROLLING", + "STAGED" + ], + "description": "Substate of deployment when readyState is 'READY' Tracks whether or not deployment has seen production traffic: - STAGED: never seen production traffic - ROLLING: in the process of having production traffic gradually transitioned. - PROMOTED: has seen production traffic" + }, + "regions": { + "items": { + "type": "string" + }, + "type": "array", + "description": "The regions the deployment exists in", + "example": [ + "sfo1" + ] + }, + "softDeletedByRetention": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "flag to indicate if the deployment was deleted by retention policy", + "example": "true" + }, + "source": { + "type": "string", + "enum": [ + "api-trigger-git-deploy", + "cli", + "clone/repo", + "drop", + "git", + "git-deploy-hook", + "import", + "import/repo", + "redeploy", + "v0-web" + ], + "description": "Where was the deployment created from. Best-effort guess for metrics only — not authoritative; do not gate behavior on it.", + "example": "cli" + }, + "undeletedAt": { + "type": "number", + "description": "A number containing the date when the deployment was undeleted at milliseconds", + "example": 1540257589405 + }, + "url": { + "type": "string", + "description": "A string with the unique URL of the deployment", + "example": "my-instant-deployment-3ij3cxz9qr.now.sh" + }, + "userConfiguredDeploymentId": { + "type": "string", + "description": "Since January 2025 User-configured deployment ID for skew protection with pre-built deployments. This is set when users configure a custom deploymentId in their next.config.js file. This allows Next.js to use skew protection even when deployments are pre-built outside of Vercel's build system.", + "example": "abc123" + }, + "version": { + "type": "number", + "enum": [ + 2 + ], + "description": "The platform version that was used to create the deployment.", + "example": 2 + }, + "oidcTokenClaims": { + "properties": { + "iss": { + "type": "string" + }, + "sub": { + "type": "string" + }, + "scope": { + "type": "string" + }, + "aud": { + "type": "string" + }, + "owner": { + "type": "string" + }, + "owner_id": { + "type": "string" + }, + "project": { + "type": "string" + }, + "project_id": { + "type": "string" + }, + "environment": { + "type": "string" + }, + "custom_environment_id": { + "type": "string" + }, + "mfe_group_ids": { + "items": { + "type": "string" + }, + "type": "array" + }, + "plan": { + "type": "string" + } + }, + "required": [ + "aud", + "environment", + "iss", + "owner", + "owner_id", + "project", + "project_id", + "scope", + "sub" + ], + "type": "object" + }, + "projectId": { + "type": "string" + }, + "plan": { + "type": "string", + "enum": [ + "enterprise", + "hobby", + "pro" + ] + }, + "connectBuildsEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "connectConfigurationId": { + "type": "string" + }, + "createdIn": { + "type": "string" + }, + "crons": { + "items": { + "properties": { + "schedule": { + "type": "string" + }, + "path": { + "type": "string" + } + }, + "required": [ + "path", + "schedule" + ], + "type": "object" + }, + "type": "array" + }, + "atproto": { + "oneOf": [ + { + "properties": { + "enabled": { + "type": "boolean", + "enum": [ + false + ] + } + }, + "required": [ + "enabled" + ], + "type": "object" + }, + { + "properties": { + "enabled": { + "type": "boolean", + "enum": [ + true + ] + }, + "subscription": { + "properties": { + "collections": { + "items": { + "type": "string" + }, + "type": "array" + }, + "dids": { + "items": { + "type": "string" + }, + "type": "array" + }, + "kinds": { + "items": { + "type": "string", + "enum": [ + "account", + "commit", + "identity", + "sync" + ] + }, + "type": "array" + }, + "path": { + "type": "string" + } + }, + "required": [ + "collections", + "path" + ], + "type": "object" + } + }, + "required": [ + "enabled", + "subscription" + ], + "type": "object" + } + ] + }, + "functions": { + "nullable": true, + "additionalProperties": { + "properties": { + "architecture": { + "type": "string", + "enum": [ + "arm64", + "x86_64" + ] + }, + "memory": { + "type": "number" + }, + "maxDuration": { + "oneOf": [ + { + "type": "number" + }, + { + "type": "string", + "enum": [ + "max" + ] + } + ] + }, + "affinity": { + "properties": { + "mode": { + "type": "string", + "enum": [ + "strict" + ] + } + }, + "required": [ + "mode" + ], + "type": "object" + }, + "maxConcurrency": { + "type": "number" + }, + "regions": { + "items": { + "type": "string" + }, + "type": "array" + }, + "functionFailoverRegions": { + "items": { + "type": "string" + }, + "type": "array" + }, + "runtime": { + "type": "string" + }, + "includeFiles": { + "type": "string" + }, + "excludeFiles": { + "type": "string" + }, + "experimentalTriggers": { + "items": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "queue/v1beta" + ], + "description": "Event type - must be \"queue/v1beta\" (REQUIRED)" + }, + "consumer": { + "type": "string", + "description": "Name of the consumer group for this trigger (REQUIRED)" + }, + "topic": { + "type": "string", + "description": "Name of the queue topic to consume from (REQUIRED)" + }, + "maxDeliveries": { + "type": "number", + "description": "Maximum number of delivery attempts for message processing (OPTIONAL) This represents the total number of times a message can be delivered, not the number of retries. Must be at least 1 if specified. Behavior when not specified depends on the server's default configuration." + }, + "retryAfterSeconds": { + "type": "number", + "description": "Delay in seconds before retrying failed executions (OPTIONAL) Behavior when not specified depends on the server's default configuration." + }, + "initialDelaySeconds": { + "type": "number", + "description": "Initial delay in seconds before first execution attempt (OPTIONAL) Must be 0 or greater. Use 0 for no initial delay. Behavior when not specified depends on the server's default configuration." + }, + "maxConcurrency": { + "type": "number", + "description": "Maximum number of concurrent executions for this consumer (OPTIONAL) Must be at least 1 if specified. Behavior when not specified depends on the server's default configuration." + } + }, + "required": [ + "consumer", + "topic", + "type" + ], + "type": "object", + "description": "Queue trigger input event for v1beta (from vercel.json config). Requires explicit consumer name." + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "queue/v2beta" + ], + "description": "Event type - must be \"queue/v2beta\" (REQUIRED)" + }, + "topic": { + "type": "string", + "description": "Name of the queue topic to consume from (REQUIRED)" + }, + "maxDeliveries": { + "type": "number", + "description": "Maximum number of delivery attempts for message processing (OPTIONAL) This represents the total number of times a message can be delivered, not the number of retries. Must be at least 1 if specified. Behavior when not specified depends on the server's default configuration." + }, + "retryAfterSeconds": { + "type": "number", + "description": "Delay in seconds before retrying failed executions (OPTIONAL) Behavior when not specified depends on the server's default configuration." + }, + "initialDelaySeconds": { + "type": "number", + "description": "Initial delay in seconds before first execution attempt (OPTIONAL) Must be 0 or greater. Use 0 for no initial delay. Behavior when not specified depends on the server's default configuration." + }, + "maxConcurrency": { + "type": "number", + "description": "Maximum number of concurrent executions for this consumer (OPTIONAL) Must be at least 1 if specified. Behavior when not specified depends on the server's default configuration." + } + }, + "required": [ + "topic", + "type" + ], + "type": "object", + "description": "Queue trigger input event for v2beta (from vercel.json config). Consumer name is implicitly derived from the function path. Only one trigger per function is allowed." + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "schedule/v1beta" + ], + "description": "Event type - must be \"schedule/v1beta\" (REQUIRED)" + } + }, + "required": [ + "type" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "supportsCancellation": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "type": "object" + }, + "type": "object" + }, + "isInstantStatic": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether this deployment completed through the instant static fast path." + }, + "monorepoManager": { + "nullable": true, + "type": "string" + }, + "ownerId": { + "type": "string" + }, + "passiveConnectConfigurationId": { + "type": "string", + "description": "Since November 2023 this field defines a Secure Compute network that will only be used to deploy passive lambdas to (as in passiveRegions)" + }, + "routes": { + "nullable": true, + "items": { + "oneOf": [ + { + "properties": { + "src": { + "type": "string" + }, + "dest": { + "type": "string" + }, + "headers": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "methods": { + "items": { + "type": "string" + }, + "type": "array" + }, + "continue": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "override": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "caseSensitive": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "check": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "important": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "status": { + "type": "number" + }, + "has": { + "items": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "host" + ] + }, + "value": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "eq": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "neq": { + "type": "string" + }, + "inc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "ninc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "pre": { + "type": "string" + }, + "suf": { + "type": "string" + }, + "re": { + "type": "string" + }, + "gt": { + "type": "number" + }, + "gte": { + "type": "number" + }, + "lt": { + "type": "number" + }, + "lte": { + "type": "number" + } + }, + "type": "object" + } + ] + } + }, + "required": [ + "type", + "value" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "cookie", + "header", + "query" + ] + }, + "key": { + "type": "string" + }, + "value": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "eq": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "neq": { + "type": "string" + }, + "inc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "ninc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "pre": { + "type": "string" + }, + "suf": { + "type": "string" + }, + "re": { + "type": "string" + }, + "gt": { + "type": "number" + }, + "gte": { + "type": "number" + }, + "lt": { + "type": "number" + }, + "lte": { + "type": "number" + } + }, + "type": "object" + } + ] + } + }, + "required": [ + "key", + "type" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "missing": { + "items": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "host" + ] + }, + "value": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "eq": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "neq": { + "type": "string" + }, + "inc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "ninc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "pre": { + "type": "string" + }, + "suf": { + "type": "string" + }, + "re": { + "type": "string" + }, + "gt": { + "type": "number" + }, + "gte": { + "type": "number" + }, + "lt": { + "type": "number" + }, + "lte": { + "type": "number" + } + }, + "type": "object" + } + ] + } + }, + "required": [ + "type", + "value" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "cookie", + "header", + "query" + ] + }, + "key": { + "type": "string" + }, + "value": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "eq": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "neq": { + "type": "string" + }, + "inc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "ninc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "pre": { + "type": "string" + }, + "suf": { + "type": "string" + }, + "re": { + "type": "string" + }, + "gt": { + "type": "number" + }, + "gte": { + "type": "number" + }, + "lt": { + "type": "number" + }, + "lte": { + "type": "number" + } + }, + "type": "object" + } + ] + } + }, + "required": [ + "key", + "type" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "mitigate": { + "properties": { + "action": { + "type": "string", + "enum": [ + "challenge", + "deny" + ] + } + }, + "required": [ + "action" + ], + "type": "object" + }, + "transforms": { + "items": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "request.headers", + "request.query", + "response.headers" + ] + }, + "op": { + "type": "string", + "enum": [ + "append", + "delete", + "set" + ] + }, + "target": { + "properties": { + "key": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "eq": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "neq": { + "type": "string" + }, + "inc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "ninc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "pre": { + "type": "string" + }, + "suf": { + "type": "string" + }, + "gt": { + "type": "number" + }, + "gte": { + "type": "number" + }, + "lt": { + "type": "number" + }, + "lte": { + "type": "number" + } + }, + "type": "object" + } + ] + } + }, + "required": [ + "key" + ], + "type": "object" + }, + "args": { + "oneOf": [ + { + "type": "string" + }, + { + "items": { + "type": "string" + }, + "type": "array" + } + ] + }, + "env": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "op", + "target", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "request.path" + ] + }, + "op": { + "type": "string", + "enum": [ + "set" + ] + }, + "args": { + "type": "string" + }, + "env": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "args", + "op", + "type" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "env": { + "items": { + "type": "string" + }, + "type": "array" + }, + "locale": { + "properties": { + "redirect": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "cookie": { + "type": "string" + } + }, + "type": "object" + }, + "source": { + "type": "string", + "description": "Aliases for `src`, `dest`, and `status`. These provide consistency with the `rewrites`, `redirects`, and `headers` fields which use `source`, `destination`, and `statusCode`. During normalization, the string forms are converted to their canonical forms (`src`, `dest`, `status`) and stripped from the route object. `destination` may also be a service-targeted object, in which case routing is delegated into the named service's internal route table and the object is preserved as-is (not folded into `dest`)." + }, + "destination": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "service" + ], + "description": "Optional explicit format marker. The destination is identified by the presence of `service`, so `type` is no longer required." + }, + "service": { + "type": "string" + }, + "path": { + "type": "string", + "description": "Routing-only path used to select a route inside the target service." + } + }, + "required": [ + "service" + ], + "type": "object" + } + ] + }, + "statusCode": { + "type": "number" + }, + "middlewarePath": { + "type": "string", + "description": "A middleware key within the `output` key under the build result. Overrides a `middleware` definition." + }, + "middlewareRawSrc": { + "items": { + "type": "string" + }, + "type": "array", + "description": "The original middleware matchers." + }, + "middleware": { + "type": "number", + "description": "A middleware index in the `middleware` key under the build result" + }, + "respectOriginCacheControl": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "src" + ], + "type": "object" + }, + { + "properties": { + "handle": { + "type": "string", + "enum": [ + "error", + "filesystem", + "hit", + "miss", + "resource", + "rewrite" + ] + }, + "src": { + "type": "string" + }, + "dest": { + "type": "string" + }, + "status": { + "type": "number" + } + }, + "required": [ + "handle" + ], + "type": "object" + }, + { + "properties": { + "src": { + "type": "string" + }, + "continue": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "middleware": { + "type": "number", + "enum": [ + 0 + ] + } + }, + "required": [ + "continue", + "middleware", + "src" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "services": { + "items": { + "oneOf": [ + { + "properties": { + "schema": { + "type": "string", + "enum": [ + "experimentalServices" + ] + }, + "name": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "cron", + "job", + "web", + "worker" + ] + }, + "trigger": { + "type": "string", + "enum": [ + "queue", + "schedule", + "workflow" + ] + }, + "group": { + "type": "string" + }, + "workspace": { + "type": "string" + }, + "entrypoint": { + "type": "string" + }, + "framework": { + "type": "string" + }, + "builder": { + "properties": { + "use": { + "type": "string" + }, + "src": { + "type": "string" + }, + "config": { + "properties": { + "bunVersion": { + "type": "string" + }, + "maxLambdaSize": { + "type": "string" + }, + "includeFiles": { + "oneOf": [ + { + "type": "string" + }, + { + "items": { + "type": "string" + }, + "type": "array" + } + ] + }, + "excludeFiles": { + "oneOf": [ + { + "type": "string" + }, + { + "items": { + "type": "string" + }, + "type": "array" + } + ] + }, + "bundle": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "ldsflags": { + "type": "string" + }, + "helpers": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "rust": { + "type": "string" + }, + "debug": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "zeroConfig": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "import": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "functions": { + "additionalProperties": { + "properties": { + "architecture": { + "type": "string", + "enum": [ + "arm64", + "x86_64" + ] + }, + "memory": { + "type": "number" + }, + "maxDuration": { + "oneOf": [ + { + "type": "number" + }, + { + "type": "string", + "enum": [ + "max" + ] + } + ] + }, + "affinity": { + "properties": { + "mode": { + "type": "string", + "enum": [ + "strict" + ] + } + }, + "required": [ + "mode" + ], + "type": "object" + }, + "maxConcurrency": { + "type": "number" + }, + "regions": { + "items": { + "type": "string" + }, + "type": "array" + }, + "functionFailoverRegions": { + "items": { + "type": "string" + }, + "type": "array" + }, + "runtime": { + "type": "string" + }, + "includeFiles": { + "type": "string" + }, + "excludeFiles": { + "type": "string" + }, + "experimentalTriggers": { + "items": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "queue/v1beta" + ], + "description": "Event type - must be \"queue/v1beta\" (REQUIRED)" + }, + "consumer": { + "type": "string", + "description": "Name of the consumer group for this trigger (REQUIRED)" + }, + "topic": { + "type": "string", + "description": "Name of the queue topic to consume from (REQUIRED)" + }, + "maxDeliveries": { + "type": "number", + "description": "Maximum number of delivery attempts for message processing (OPTIONAL) This represents the total number of times a message can be delivered, not the number of retries. Must be at least 1 if specified. Behavior when not specified depends on the server's default configuration." + }, + "retryAfterSeconds": { + "type": "number", + "description": "Delay in seconds before retrying failed executions (OPTIONAL) Behavior when not specified depends on the server's default configuration." + }, + "initialDelaySeconds": { + "type": "number", + "description": "Initial delay in seconds before first execution attempt (OPTIONAL) Must be 0 or greater. Use 0 for no initial delay. Behavior when not specified depends on the server's default configuration." + }, + "maxConcurrency": { + "type": "number", + "description": "Maximum number of concurrent executions for this consumer (OPTIONAL) Must be at least 1 if specified. Behavior when not specified depends on the server's default configuration." + } + }, + "required": [ + "consumer", + "topic", + "type" + ], + "type": "object", + "description": "Queue trigger input event for v1beta (from vercel.json config). Requires explicit consumer name." + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "queue/v2beta" + ], + "description": "Event type - must be \"queue/v2beta\" (REQUIRED)" + }, + "topic": { + "type": "string", + "description": "Name of the queue topic to consume from (REQUIRED)" + }, + "maxDeliveries": { + "type": "number", + "description": "Maximum number of delivery attempts for message processing (OPTIONAL) This represents the total number of times a message can be delivered, not the number of retries. Must be at least 1 if specified. Behavior when not specified depends on the server's default configuration." + }, + "retryAfterSeconds": { + "type": "number", + "description": "Delay in seconds before retrying failed executions (OPTIONAL) Behavior when not specified depends on the server's default configuration." + }, + "initialDelaySeconds": { + "type": "number", + "description": "Initial delay in seconds before first execution attempt (OPTIONAL) Must be 0 or greater. Use 0 for no initial delay. Behavior when not specified depends on the server's default configuration." + }, + "maxConcurrency": { + "type": "number", + "description": "Maximum number of concurrent executions for this consumer (OPTIONAL) Must be at least 1 if specified. Behavior when not specified depends on the server's default configuration." + } + }, + "required": [ + "topic", + "type" + ], + "type": "object", + "description": "Queue trigger input event for v2beta (from vercel.json config). Consumer name is implicitly derived from the function path. Only one trigger per function is allowed." + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "schedule/v1beta" + ], + "description": "Event type - must be \"schedule/v1beta\" (REQUIRED)" + } + }, + "required": [ + "type" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "supportsCancellation": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "type": "object" + }, + "type": "object" + }, + "projectSettings": { + "properties": { + "framework": { + "nullable": true, + "type": "string" + }, + "devCommand": { + "nullable": true, + "type": "string" + }, + "installCommand": { + "nullable": true, + "type": "string" + }, + "buildCommand": { + "nullable": true, + "type": "string" + }, + "outputDirectory": { + "nullable": true, + "type": "string" + }, + "rootDirectory": { + "nullable": true, + "type": "string" + }, + "nodeVersion": { + "type": "string" + }, + "monorepoManager": { + "nullable": true, + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "autoExposeSystemEnvs": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "sourceFilesOutsideRootDirectory": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "directoryListing": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "gitForkProtection": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "commandForIgnoringBuildStep": { + "nullable": true, + "type": "string" + } + }, + "type": "object" + }, + "outputDirectory": { + "type": "string" + }, + "installCommand": { + "type": "string" + }, + "buildCommand": { + "type": "string" + }, + "devCommand": { + "type": "string" + }, + "framework": { + "nullable": true, + "type": "string" + }, + "nodeVersion": { + "type": "string" + }, + "middleware": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "middlewareRuntime": { + "type": "string", + "enum": [ + "nodejs" + ], + "description": "Enforced runtime for explicitly configured Routing Middleware." + }, + "middlewareMatcher": { + "oneOf": [ + { + "type": "string" + }, + { + "items": { + "type": "string" + }, + "type": "array", + "description": "Matcher supplied outside of the middleware source module." + } + ] + }, + "serviceName": { + "type": "string", + "description": "Owning service name; scopes per-function config such as the v2beta consumer." + } + }, + "type": "object" + } + }, + "required": [ + "use" + ], + "type": "object" + }, + "runtime": { + "type": "string" + }, + "buildCommand": { + "type": "string" + }, + "installCommand": { + "type": "string" + }, + "preDeployCommand": { + "type": "string" + }, + "routePrefix": { + "type": "string" + }, + "routePrefixSource": { + "type": "string", + "enum": [ + "configured", + "generated" + ] + }, + "subdomain": { + "type": "string" + }, + "schedule": { + "oneOf": [ + { + "type": "string" + }, + { + "items": { + "type": "string" + }, + "type": "array" + } + ] + }, + "handlerFunction": { + "type": "string" + }, + "topics": { + "oneOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "items": { + "properties": { + "topic": { + "type": "string" + }, + "retryAfterSeconds": { + "type": "number" + }, + "initialDelaySeconds": { + "type": "number" + } + }, + "required": [ + "topic" + ], + "type": "object" + }, + "type": "array" + } + ] + }, + "env": { + "additionalProperties": { + "properties": { + "type": { + "type": "string", + "enum": [ + "service-ref" + ] + }, + "service": { + "type": "string" + } + }, + "required": [ + "service", + "type" + ], + "type": "object" + }, + "type": "object" + } + }, + "required": [ + "builder", + "name", + "schema", + "type", + "workspace" + ], + "type": "object", + "description": "Services detected during build from vercel.json experimentalServices or auto-detected from project structure. Used to inject service URLs as environment variables at runtime." + }, + { + "properties": { + "schema": { + "type": "string", + "enum": [ + "experimentalServicesV2" + ] + }, + "name": { + "type": "string" + }, + "root": { + "type": "string", + "description": "Path to the service root, relative to the project root." + }, + "framework": { + "type": "string" + }, + "runtime": { + "type": "string" + }, + "entrypoint": { + "type": "string", + "description": "Resolved entrypoint, relative to the service root." + }, + "command": { + "items": { + "type": "string" + }, + "type": "array", + "description": "Command override for `runtime: \"container\"` services." + }, + "builder": { + "properties": { + "use": { + "type": "string" + }, + "src": { + "type": "string" + }, + "config": { + "properties": { + "bunVersion": { + "type": "string" + }, + "maxLambdaSize": { + "type": "string" + }, + "includeFiles": { + "oneOf": [ + { + "type": "string" + }, + { + "items": { + "type": "string" + }, + "type": "array" + } + ] + }, + "excludeFiles": { + "oneOf": [ + { + "type": "string" + }, + { + "items": { + "type": "string" + }, + "type": "array" + } + ] + }, + "bundle": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "ldsflags": { + "type": "string" + }, + "helpers": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "rust": { + "type": "string" + }, + "debug": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "zeroConfig": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "import": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "functions": { + "additionalProperties": { + "properties": { + "architecture": { + "type": "string", + "enum": [ + "arm64", + "x86_64" + ] + }, + "memory": { + "type": "number" + }, + "maxDuration": { + "oneOf": [ + { + "type": "number" + }, + { + "type": "string", + "enum": [ + "max" + ] + } + ] + }, + "affinity": { + "properties": { + "mode": { + "type": "string", + "enum": [ + "strict" + ] + } + }, + "required": [ + "mode" + ], + "type": "object" + }, + "maxConcurrency": { + "type": "number" + }, + "regions": { + "items": { + "type": "string" + }, + "type": "array" + }, + "functionFailoverRegions": { + "items": { + "type": "string" + }, + "type": "array" + }, + "runtime": { + "type": "string" + }, + "includeFiles": { + "type": "string" + }, + "excludeFiles": { + "type": "string" + }, + "experimentalTriggers": { + "items": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "queue/v1beta" + ], + "description": "Event type - must be \"queue/v1beta\" (REQUIRED)" + }, + "consumer": { + "type": "string", + "description": "Name of the consumer group for this trigger (REQUIRED)" + }, + "topic": { + "type": "string", + "description": "Name of the queue topic to consume from (REQUIRED)" + }, + "maxDeliveries": { + "type": "number", + "description": "Maximum number of delivery attempts for message processing (OPTIONAL) This represents the total number of times a message can be delivered, not the number of retries. Must be at least 1 if specified. Behavior when not specified depends on the server's default configuration." + }, + "retryAfterSeconds": { + "type": "number", + "description": "Delay in seconds before retrying failed executions (OPTIONAL) Behavior when not specified depends on the server's default configuration." + }, + "initialDelaySeconds": { + "type": "number", + "description": "Initial delay in seconds before first execution attempt (OPTIONAL) Must be 0 or greater. Use 0 for no initial delay. Behavior when not specified depends on the server's default configuration." + }, + "maxConcurrency": { + "type": "number", + "description": "Maximum number of concurrent executions for this consumer (OPTIONAL) Must be at least 1 if specified. Behavior when not specified depends on the server's default configuration." + } + }, + "required": [ + "consumer", + "topic", + "type" + ], + "type": "object", + "description": "Queue trigger input event for v1beta (from vercel.json config). Requires explicit consumer name." + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "queue/v2beta" + ], + "description": "Event type - must be \"queue/v2beta\" (REQUIRED)" + }, + "topic": { + "type": "string", + "description": "Name of the queue topic to consume from (REQUIRED)" + }, + "maxDeliveries": { + "type": "number", + "description": "Maximum number of delivery attempts for message processing (OPTIONAL) This represents the total number of times a message can be delivered, not the number of retries. Must be at least 1 if specified. Behavior when not specified depends on the server's default configuration." + }, + "retryAfterSeconds": { + "type": "number", + "description": "Delay in seconds before retrying failed executions (OPTIONAL) Behavior when not specified depends on the server's default configuration." + }, + "initialDelaySeconds": { + "type": "number", + "description": "Initial delay in seconds before first execution attempt (OPTIONAL) Must be 0 or greater. Use 0 for no initial delay. Behavior when not specified depends on the server's default configuration." + }, + "maxConcurrency": { + "type": "number", + "description": "Maximum number of concurrent executions for this consumer (OPTIONAL) Must be at least 1 if specified. Behavior when not specified depends on the server's default configuration." + } + }, + "required": [ + "topic", + "type" + ], + "type": "object", + "description": "Queue trigger input event for v2beta (from vercel.json config). Consumer name is implicitly derived from the function path. Only one trigger per function is allowed." + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "schedule/v1beta" + ], + "description": "Event type - must be \"schedule/v1beta\" (REQUIRED)" + } + }, + "required": [ + "type" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "supportsCancellation": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "type": "object" + }, + "type": "object" + }, + "projectSettings": { + "properties": { + "framework": { + "nullable": true, + "type": "string" + }, + "devCommand": { + "nullable": true, + "type": "string" + }, + "installCommand": { + "nullable": true, + "type": "string" + }, + "buildCommand": { + "nullable": true, + "type": "string" + }, + "outputDirectory": { + "nullable": true, + "type": "string" + }, + "rootDirectory": { + "nullable": true, + "type": "string" + }, + "nodeVersion": { + "type": "string" + }, + "monorepoManager": { + "nullable": true, + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "autoExposeSystemEnvs": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "sourceFilesOutsideRootDirectory": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "directoryListing": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "gitForkProtection": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "commandForIgnoringBuildStep": { + "nullable": true, + "type": "string" + } + }, + "type": "object" + }, + "outputDirectory": { + "type": "string" + }, + "installCommand": { + "type": "string" + }, + "buildCommand": { + "type": "string" + }, + "devCommand": { + "type": "string" + }, + "framework": { + "nullable": true, + "type": "string" + }, + "nodeVersion": { + "type": "string" + }, + "middleware": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "middlewareRuntime": { + "type": "string", + "enum": [ + "nodejs" + ], + "description": "Enforced runtime for explicitly configured Routing Middleware." + }, + "middlewareMatcher": { + "oneOf": [ + { + "type": "string" + }, + { + "items": { + "type": "string" + }, + "type": "array", + "description": "Matcher supplied outside of the middleware source module." + } + ] + }, + "serviceName": { + "type": "string", + "description": "Owning service name; scopes per-function config such as the v2beta consumer." + } + }, + "type": "object" + } + }, + "required": [ + "use" + ], + "type": "object", + "description": "Builder selected by the resolver." + }, + "installCommand": { + "type": "string" + }, + "buildCommand": { + "type": "string" + }, + "devCommand": { + "type": "string" + }, + "ignoreCommand": { + "type": "string" + }, + "outputDirectory": { + "type": "string" + }, + "bindings": { + "items": { + "properties": { + "type": { + "type": "string", + "enum": [ + "service" + ], + "description": "If present, must be `\"service\"` for Service-to-Service HTTP bindings." + }, + "service": { + "type": "string", + "description": "Target service name from `services`." + }, + "format": { + "type": "string", + "enum": [ + "url" + ], + "description": "Generated value shape, must be `\"url\"`." + }, + "env": { + "type": "string", + "description": "Environment variable name that will store the generated value" + } + }, + "required": [ + "env", + "format", + "service" + ], + "type": "object", + "description": "Caller-side bindings to other services." + }, + "type": "array", + "description": "Caller-side bindings to other services." + }, + "functions": { + "additionalProperties": { + "properties": { + "architecture": { + "type": "string", + "enum": [ + "arm64", + "x86_64" + ] + }, + "memory": { + "type": "number" + }, + "maxDuration": { + "oneOf": [ + { + "type": "number" + }, + { + "type": "string", + "enum": [ + "max" + ] + } + ] + }, + "affinity": { + "properties": { + "mode": { + "type": "string", + "enum": [ + "strict" + ] + } + }, + "required": [ + "mode" + ], + "type": "object" + }, + "maxConcurrency": { + "type": "number" + }, + "regions": { + "items": { + "type": "string" + }, + "type": "array" + }, + "functionFailoverRegions": { + "items": { + "type": "string" + }, + "type": "array" + }, + "runtime": { + "type": "string" + }, + "includeFiles": { + "type": "string" + }, + "excludeFiles": { + "type": "string" + }, + "experimentalTriggers": { + "items": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "queue/v1beta" + ], + "description": "Event type - must be \"queue/v1beta\" (REQUIRED)" + }, + "consumer": { + "type": "string", + "description": "Name of the consumer group for this trigger (REQUIRED)" + }, + "topic": { + "type": "string", + "description": "Name of the queue topic to consume from (REQUIRED)" + }, + "maxDeliveries": { + "type": "number", + "description": "Maximum number of delivery attempts for message processing (OPTIONAL) This represents the total number of times a message can be delivered, not the number of retries. Must be at least 1 if specified. Behavior when not specified depends on the server's default configuration." + }, + "retryAfterSeconds": { + "type": "number", + "description": "Delay in seconds before retrying failed executions (OPTIONAL) Behavior when not specified depends on the server's default configuration." + }, + "initialDelaySeconds": { + "type": "number", + "description": "Initial delay in seconds before first execution attempt (OPTIONAL) Must be 0 or greater. Use 0 for no initial delay. Behavior when not specified depends on the server's default configuration." + }, + "maxConcurrency": { + "type": "number", + "description": "Maximum number of concurrent executions for this consumer (OPTIONAL) Must be at least 1 if specified. Behavior when not specified depends on the server's default configuration." + } + }, + "required": [ + "consumer", + "topic", + "type" + ], + "type": "object", + "description": "Queue trigger input event for v1beta (from vercel.json config). Requires explicit consumer name." + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "queue/v2beta" + ], + "description": "Event type - must be \"queue/v2beta\" (REQUIRED)" + }, + "topic": { + "type": "string", + "description": "Name of the queue topic to consume from (REQUIRED)" + }, + "maxDeliveries": { + "type": "number", + "description": "Maximum number of delivery attempts for message processing (OPTIONAL) This represents the total number of times a message can be delivered, not the number of retries. Must be at least 1 if specified. Behavior when not specified depends on the server's default configuration." + }, + "retryAfterSeconds": { + "type": "number", + "description": "Delay in seconds before retrying failed executions (OPTIONAL) Behavior when not specified depends on the server's default configuration." + }, + "initialDelaySeconds": { + "type": "number", + "description": "Initial delay in seconds before first execution attempt (OPTIONAL) Must be 0 or greater. Use 0 for no initial delay. Behavior when not specified depends on the server's default configuration." + }, + "maxConcurrency": { + "type": "number", + "description": "Maximum number of concurrent executions for this consumer (OPTIONAL) Must be at least 1 if specified. Behavior when not specified depends on the server's default configuration." + } + }, + "required": [ + "topic", + "type" + ], + "type": "object", + "description": "Queue trigger input event for v2beta (from vercel.json config). Consumer name is implicitly derived from the function path. Only one trigger per function is allowed." + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "schedule/v1beta" + ], + "description": "Event type - must be \"schedule/v1beta\" (REQUIRED)" + } + }, + "required": [ + "type" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "supportsCancellation": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "type": "object", + "description": "Function configuration scoped to this service." + }, + "type": "object", + "description": "Function configuration scoped to this service." + }, + "headers": { + "items": { + "properties": { + "source": { + "type": "string" + }, + "headers": { + "items": { + "properties": { + "key": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "required": [ + "key", + "value" + ], + "type": "object" + }, + "type": "array" + }, + "has": { + "items": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "host" + ] + }, + "value": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "eq": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "neq": { + "type": "string" + }, + "inc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "ninc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "pre": { + "type": "string" + }, + "suf": { + "type": "string" + }, + "re": { + "type": "string" + }, + "gt": { + "type": "number" + }, + "gte": { + "type": "number" + }, + "lt": { + "type": "number" + }, + "lte": { + "type": "number" + } + }, + "type": "object" + } + ] + } + }, + "required": [ + "type", + "value" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "cookie", + "header", + "query" + ] + }, + "key": { + "type": "string" + }, + "value": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "eq": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "neq": { + "type": "string" + }, + "inc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "ninc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "pre": { + "type": "string" + }, + "suf": { + "type": "string" + }, + "re": { + "type": "string" + }, + "gt": { + "type": "number" + }, + "gte": { + "type": "number" + }, + "lt": { + "type": "number" + }, + "lte": { + "type": "number" + } + }, + "type": "object" + } + ] + } + }, + "required": [ + "key", + "type" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "missing": { + "items": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "host" + ] + }, + "value": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "eq": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "neq": { + "type": "string" + }, + "inc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "ninc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "pre": { + "type": "string" + }, + "suf": { + "type": "string" + }, + "re": { + "type": "string" + }, + "gt": { + "type": "number" + }, + "gte": { + "type": "number" + }, + "lt": { + "type": "number" + }, + "lte": { + "type": "number" + } + }, + "type": "object" + } + ] + } + }, + "required": [ + "type", + "value" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "cookie", + "header", + "query" + ] + }, + "key": { + "type": "string" + }, + "value": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "eq": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "neq": { + "type": "string" + }, + "inc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "ninc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "pre": { + "type": "string" + }, + "suf": { + "type": "string" + }, + "re": { + "type": "string" + }, + "gt": { + "type": "number" + }, + "gte": { + "type": "number" + }, + "lt": { + "type": "number" + }, + "lte": { + "type": "number" + } + }, + "type": "object" + } + ] + } + }, + "required": [ + "key", + "type" + ], + "type": "object" + } + ] + }, + "type": "array" + } + }, + "required": [ + "headers", + "source" + ], + "type": "object" + }, + "type": "array" + }, + "redirects": { + "items": { + "properties": { + "source": { + "type": "string" + }, + "destination": { + "type": "string" + }, + "permanent": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "statusCode": { + "type": "number" + }, + "has": { + "items": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "host" + ] + }, + "value": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "eq": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "neq": { + "type": "string" + }, + "inc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "ninc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "pre": { + "type": "string" + }, + "suf": { + "type": "string" + }, + "re": { + "type": "string" + }, + "gt": { + "type": "number" + }, + "gte": { + "type": "number" + }, + "lt": { + "type": "number" + }, + "lte": { + "type": "number" + } + }, + "type": "object" + } + ] + } + }, + "required": [ + "type", + "value" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "cookie", + "header", + "query" + ] + }, + "key": { + "type": "string" + }, + "value": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "eq": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "neq": { + "type": "string" + }, + "inc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "ninc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "pre": { + "type": "string" + }, + "suf": { + "type": "string" + }, + "re": { + "type": "string" + }, + "gt": { + "type": "number" + }, + "gte": { + "type": "number" + }, + "lt": { + "type": "number" + }, + "lte": { + "type": "number" + } + }, + "type": "object" + } + ] + } + }, + "required": [ + "key", + "type" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "missing": { + "items": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "host" + ] + }, + "value": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "eq": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "neq": { + "type": "string" + }, + "inc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "ninc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "pre": { + "type": "string" + }, + "suf": { + "type": "string" + }, + "re": { + "type": "string" + }, + "gt": { + "type": "number" + }, + "gte": { + "type": "number" + }, + "lt": { + "type": "number" + }, + "lte": { + "type": "number" + } + }, + "type": "object" + } + ] + } + }, + "required": [ + "type", + "value" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "cookie", + "header", + "query" + ] + }, + "key": { + "type": "string" + }, + "value": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "eq": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "neq": { + "type": "string" + }, + "inc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "ninc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "pre": { + "type": "string" + }, + "suf": { + "type": "string" + }, + "re": { + "type": "string" + }, + "gt": { + "type": "number" + }, + "gte": { + "type": "number" + }, + "lt": { + "type": "number" + }, + "lte": { + "type": "number" + } + }, + "type": "object" + } + ] + } + }, + "required": [ + "key", + "type" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "env": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "destination", + "source" + ], + "type": "object" + }, + "type": "array" + }, + "rewrites": { + "items": { + "properties": { + "source": { + "type": "string" + }, + "destination": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "service" + ], + "description": "Optional explicit format marker. The destination is identified by the presence of `service`, so `type` is no longer required." + }, + "service": { + "type": "string" + }, + "path": { + "type": "string", + "description": "Routing-only path used to select a route inside the target service." + } + }, + "required": [ + "service" + ], + "type": "object" + } + ] + }, + "transforms": { + "items": { + "properties": { + "type": { + "type": "string", + "enum": [ + "request.path" + ] + }, + "op": { + "type": "string", + "enum": [ + "set" + ] + }, + "args": { + "type": "string" + }, + "env": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "args", + "op", + "type" + ], + "type": "object" + }, + "type": "array" + }, + "has": { + "items": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "host" + ] + }, + "value": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "eq": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "neq": { + "type": "string" + }, + "inc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "ninc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "pre": { + "type": "string" + }, + "suf": { + "type": "string" + }, + "re": { + "type": "string" + }, + "gt": { + "type": "number" + }, + "gte": { + "type": "number" + }, + "lt": { + "type": "number" + }, + "lte": { + "type": "number" + } + }, + "type": "object" + } + ] + } + }, + "required": [ + "type", + "value" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "cookie", + "header", + "query" + ] + }, + "key": { + "type": "string" + }, + "value": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "eq": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "neq": { + "type": "string" + }, + "inc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "ninc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "pre": { + "type": "string" + }, + "suf": { + "type": "string" + }, + "re": { + "type": "string" + }, + "gt": { + "type": "number" + }, + "gte": { + "type": "number" + }, + "lt": { + "type": "number" + }, + "lte": { + "type": "number" + } + }, + "type": "object" + } + ] + } + }, + "required": [ + "key", + "type" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "missing": { + "items": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "host" + ] + }, + "value": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "eq": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "neq": { + "type": "string" + }, + "inc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "ninc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "pre": { + "type": "string" + }, + "suf": { + "type": "string" + }, + "re": { + "type": "string" + }, + "gt": { + "type": "number" + }, + "gte": { + "type": "number" + }, + "lt": { + "type": "number" + }, + "lte": { + "type": "number" + } + }, + "type": "object" + } + ] + } + }, + "required": [ + "type", + "value" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "cookie", + "header", + "query" + ] + }, + "key": { + "type": "string" + }, + "value": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "eq": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "neq": { + "type": "string" + }, + "inc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "ninc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "pre": { + "type": "string" + }, + "suf": { + "type": "string" + }, + "re": { + "type": "string" + }, + "gt": { + "type": "number" + }, + "gte": { + "type": "number" + }, + "lt": { + "type": "number" + }, + "lte": { + "type": "number" + } + }, + "type": "object" + } + ] + } + }, + "required": [ + "key", + "type" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "statusCode": { + "type": "number" + }, + "env": { + "items": { + "type": "string" + }, + "type": "array" + }, + "respectOriginCacheControl": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "destination", + "source" + ], + "type": "object" + }, + "type": "array" + }, + "routes": { + "items": { + "oneOf": [ + { + "properties": { + "src": { + "type": "string" + }, + "dest": { + "type": "string" + }, + "headers": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "methods": { + "items": { + "type": "string" + }, + "type": "array" + }, + "continue": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "override": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "caseSensitive": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "check": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "important": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "status": { + "type": "number" + }, + "has": { + "items": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "host" + ] + }, + "value": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "eq": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "neq": { + "type": "string" + }, + "inc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "ninc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "pre": { + "type": "string" + }, + "suf": { + "type": "string" + }, + "re": { + "type": "string" + }, + "gt": { + "type": "number" + }, + "gte": { + "type": "number" + }, + "lt": { + "type": "number" + }, + "lte": { + "type": "number" + } + }, + "type": "object" + } + ] + } + }, + "required": [ + "type", + "value" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "cookie", + "header", + "query" + ] + }, + "key": { + "type": "string" + }, + "value": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "eq": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "neq": { + "type": "string" + }, + "inc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "ninc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "pre": { + "type": "string" + }, + "suf": { + "type": "string" + }, + "re": { + "type": "string" + }, + "gt": { + "type": "number" + }, + "gte": { + "type": "number" + }, + "lt": { + "type": "number" + }, + "lte": { + "type": "number" + } + }, + "type": "object" + } + ] + } + }, + "required": [ + "key", + "type" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "missing": { + "items": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "host" + ] + }, + "value": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "eq": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "neq": { + "type": "string" + }, + "inc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "ninc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "pre": { + "type": "string" + }, + "suf": { + "type": "string" + }, + "re": { + "type": "string" + }, + "gt": { + "type": "number" + }, + "gte": { + "type": "number" + }, + "lt": { + "type": "number" + }, + "lte": { + "type": "number" + } + }, + "type": "object" + } + ] + } + }, + "required": [ + "type", + "value" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "cookie", + "header", + "query" + ] + }, + "key": { + "type": "string" + }, + "value": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "eq": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "neq": { + "type": "string" + }, + "inc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "ninc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "pre": { + "type": "string" + }, + "suf": { + "type": "string" + }, + "re": { + "type": "string" + }, + "gt": { + "type": "number" + }, + "gte": { + "type": "number" + }, + "lt": { + "type": "number" + }, + "lte": { + "type": "number" + } + }, + "type": "object" + } + ] + } + }, + "required": [ + "key", + "type" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "mitigate": { + "properties": { + "action": { + "type": "string", + "enum": [ + "challenge", + "deny" + ] + } + }, + "required": [ + "action" + ], + "type": "object" + }, + "transforms": { + "items": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "request.headers", + "request.query", + "response.headers" + ] + }, + "op": { + "type": "string", + "enum": [ + "append", + "delete", + "set" + ] + }, + "target": { + "properties": { + "key": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "eq": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "neq": { + "type": "string" + }, + "inc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "ninc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "pre": { + "type": "string" + }, + "suf": { + "type": "string" + }, + "gt": { + "type": "number" + }, + "gte": { + "type": "number" + }, + "lt": { + "type": "number" + }, + "lte": { + "type": "number" + } + }, + "type": "object" + } + ] + } + }, + "required": [ + "key" + ], + "type": "object" + }, + "args": { + "oneOf": [ + { + "type": "string" + }, + { + "items": { + "type": "string" + }, + "type": "array" + } + ] + }, + "env": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "op", + "target", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "request.path" + ] + }, + "op": { + "type": "string", + "enum": [ + "set" + ] + }, + "args": { + "type": "string" + }, + "env": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "args", + "op", + "type" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "env": { + "items": { + "type": "string" + }, + "type": "array" + }, + "locale": { + "properties": { + "redirect": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "cookie": { + "type": "string" + } + }, + "type": "object" + }, + "source": { + "type": "string", + "description": "Aliases for `src`, `dest`, and `status`. These provide consistency with the `rewrites`, `redirects`, and `headers` fields which use `source`, `destination`, and `statusCode`. During normalization, the string forms are converted to their canonical forms (`src`, `dest`, `status`) and stripped from the route object. `destination` may also be a service-targeted object, in which case routing is delegated into the named service's internal route table and the object is preserved as-is (not folded into `dest`)." + }, + "destination": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "service" + ], + "description": "Optional explicit format marker. The destination is identified by the presence of `service`, so `type` is no longer required." + }, + "service": { + "type": "string" + }, + "path": { + "type": "string", + "description": "Routing-only path used to select a route inside the target service." + } + }, + "required": [ + "service" + ], + "type": "object" + } + ] + }, + "statusCode": { + "type": "number" + }, + "middlewarePath": { + "type": "string", + "description": "A middleware key within the `output` key under the build result. Overrides a `middleware` definition." + }, + "middlewareRawSrc": { + "items": { + "type": "string" + }, + "type": "array", + "description": "The original middleware matchers." + }, + "middleware": { + "type": "number", + "description": "A middleware index in the `middleware` key under the build result" + }, + "respectOriginCacheControl": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "src" + ], + "type": "object" + }, + { + "properties": { + "handle": { + "type": "string", + "enum": [ + "error", + "filesystem", + "hit", + "miss", + "resource", + "rewrite" + ] + }, + "src": { + "type": "string" + }, + "dest": { + "type": "string" + }, + "status": { + "type": "number" + } + }, + "required": [ + "handle" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "cleanUrls": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "trailingSlash": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "builder", + "name", + "root", + "schema" + ], + "type": "object", + "description": "Services detected during build from vercel.json experimentalServices or auto-detected from project structure. Used to inject service URLs as environment variables at runtime." + } + ] + }, + "type": "array", + "description": "Services detected during build from vercel.json experimentalServices or auto-detected from project structure. Used to inject service URLs as environment variables at runtime." + }, + "gitRepo": { + "nullable": true, + "oneOf": [ + { + "properties": { + "namespace": { + "type": "string" + }, + "projectId": { + "type": "number" + }, + "type": { + "type": "string", + "enum": [ + "gitlab" + ] + }, + "url": { + "type": "string" + }, + "path": { + "type": "string" + }, + "defaultBranch": { + "type": "string" + }, + "name": { + "type": "string" + }, + "private": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "ownerType": { + "type": "string", + "enum": [ + "team", + "user" + ] + } + }, + "required": [ + "defaultBranch", + "name", + "namespace", + "ownerType", + "path", + "private", + "projectId", + "type", + "url" + ], + "type": "object" + }, + { + "properties": { + "org": { + "type": "string" + }, + "repo": { + "type": "string" + }, + "repoId": { + "type": "number" + }, + "type": { + "type": "string", + "enum": [ + "github" + ] + }, + "repoOwnerId": { + "type": "number" + }, + "path": { + "type": "string" + }, + "defaultBranch": { + "type": "string" + }, + "name": { + "type": "string" + }, + "private": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "ownerType": { + "type": "string", + "enum": [ + "team", + "user" + ] + } + }, + "required": [ + "defaultBranch", + "name", + "org", + "ownerType", + "path", + "private", + "repo", + "repoId", + "repoOwnerId", + "type" + ], + "type": "object" + }, + { + "properties": { + "owner": { + "type": "string" + }, + "repoUuid": { + "type": "string" + }, + "slug": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "bitbucket" + ] + }, + "workspaceUuid": { + "type": "string" + }, + "path": { + "type": "string" + }, + "defaultBranch": { + "type": "string" + }, + "name": { + "type": "string" + }, + "private": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "ownerType": { + "type": "string", + "enum": [ + "team", + "user" + ] + } + }, + "required": [ + "defaultBranch", + "name", + "owner", + "ownerType", + "path", + "private", + "repoUuid", + "slug", + "type", + "workspaceUuid" + ], + "type": "object" + }, + { + "properties": { + "org": { + "type": "string" + }, + "repo": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "vercel" + ] + }, + "path": { + "type": "string" + }, + "defaultBranch": { + "type": "string" + }, + "name": { + "type": "string" + }, + "private": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "ownerType": { + "type": "string", + "enum": [ + "team", + "user" + ] + } + }, + "required": [ + "defaultBranch", + "name", + "org", + "ownerType", + "path", + "private", + "repo", + "type" + ], + "type": "object" + }, + { + "properties": { + "owner": { + "type": "string", + "description": "Owner (namespace) slug." + }, + "repo": { + "type": "string" + }, + "repoId": { + "type": "string", + "description": "Origin repository id." + }, + "type": { + "type": "string", + "enum": [ + "cursor-origin" + ] + }, + "path": { + "type": "string" + }, + "defaultBranch": { + "type": "string" + }, + "name": { + "type": "string" + }, + "private": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "ownerType": { + "type": "string", + "enum": [ + "team", + "user" + ] + } + }, + "required": [ + "defaultBranch", + "name", + "owner", + "ownerType", + "path", + "private", + "repo", + "repoId", + "type" + ], + "type": "object" + } + ] + }, + "flags": { + "oneOf": [ + { + "properties": { + "definitions": { + "additionalProperties": { + "properties": { + "options": { + "items": { + "properties": { + "value": { + "$ref": "#/components/schemas/FlagJSONValue" + }, + "label": { + "type": "string" + } + }, + "required": [ + "value" + ], + "type": "object" + }, + "type": "array" + }, + "url": { + "type": "string" + }, + "description": { + "type": "string" + } + }, + "type": "object" + }, + "type": "object" + } + }, + "required": [ + "definitions" + ], + "type": "object", + "description": "Flags defined in the Build Output API, used by this deployment. Primarily used by the Toolbar to know about the used flags." + }, + { + "items": { + "type": "object", + "description": "Flags defined in the Build Output API, used by this deployment. Primarily used by the Toolbar to know about the used flags." + }, + "type": "array", + "description": "Flags defined in the Build Output API, used by this deployment. Primarily used by the Toolbar to know about the used flags." + } + ] + }, + "microfrontends": { + "oneOf": [ + { + "properties": { + "isDefaultApp": { + "type": "boolean", + "enum": [ + false + ] + }, + "defaultAppProjectName": { + "type": "string", + "description": "The project name of the default app of this deployment's microfrontends group." + }, + "defaultRoute": { + "type": "string", + "description": "A path that is used to take screenshots and as the default path in preview links when a domain for this microfrontend is shown in the UI." + }, + "groupIds": { + "type": "array", + "items": { + "type": "string" + }, + "minItems": 1, + "description": "The group of microfrontends that this project belongs to. Each microfrontend project must belong to a microfrontends group that is the set of microfrontends that are used together." + } + }, + "required": [ + "defaultAppProjectName", + "groupIds" + ], + "type": "object" + }, + { + "properties": { + "isDefaultApp": { + "type": "boolean", + "enum": [ + true + ] + }, + "mfeConfigUploadState": { + "type": "string", + "enum": [ + "no_config", + "success", + "waiting_on_build" + ], + "description": "The result of the microfrontends config upload during deployment creation / build. Only set for default app deployments. The config upload is attempted during deployment create, and then again during the build. If the config is not in the root directory, or the deployment is prebuilt, the config cannot be uploaded during deployment create. The upload during deployment build finds the config even if it's not in the root directory, as it has access to all files. Uploading the config during create is ideal, as then all child deployments are guaranteed to have access to the default app deployment config even if the default app has not yet started building. If the config is not uploaded, the child app will show as building until the config has been uploaded during the default app build. - `success` - The config was uploaded successfully, either when the deployment was created or during the build. - `waiting_on_build` - The config could not be uploaded during deployment create, will be attempted again during the build. - `no_config` - No config was found. Only set once the build has not found the config in any of the deployment's files. - `undefined` - Legacy deployments, or there was an error uploading the config during deployment create." + }, + "defaultAppProjectName": { + "type": "string", + "description": "The project name of the default app of this deployment's microfrontends group." + }, + "defaultRoute": { + "type": "string", + "description": "A path that is used to take screenshots and as the default path in preview links when a domain for this microfrontend is shown in the UI." + }, + "groupIds": { + "type": "array", + "items": { + "type": "string" + }, + "minItems": 1, + "description": "The group of microfrontends that this project belongs to. Each microfrontend project must belong to a microfrontends group that is the set of microfrontends that are used together." + } + }, + "required": [ + "defaultAppProjectName", + "groupIds", + "isDefaultApp" + ], + "type": "object" + } + ] + }, + "platform": { + "properties": { + "source": { + "properties": { + "name": { + "type": "string", + "description": "Display name of the platform." + } + }, + "required": [ + "name" + ], + "type": "object", + "description": "The external platform that created the deployment (e.g. its display name)." + }, + "origin": { + "properties": { + "type": { + "type": "string", + "enum": [ + "id", + "url" + ], + "description": "Whether the value is an opaque identifier or a URL." + }, + "value": { + "type": "string", + "description": "The identifier or URL pointing to the originating entity." + } + }, + "required": [ + "type", + "value" + ], + "type": "object", + "description": "Reference back to the entity on the platform that initiated the deployment." + }, + "creator": { + "properties": { + "name": { + "type": "string", + "description": "Display name of the platform user." + }, + "avatar": { + "type": "string", + "description": "URL of the platform user's avatar image." + } + }, + "required": [ + "name" + ], + "type": "object", + "description": "The user on the external platform who triggered the deployment." + }, + "meta": { + "additionalProperties": { + "type": "string" + }, + "type": "object", + "description": "Arbitrary key-value metadata provided by the platform." + } + }, + "required": [ + "creator", + "origin", + "source" + ], + "type": "object", + "description": "Metadata about the source platform that triggered the deployment. Allows us to map a deployment back to a platform (e.g. the chat that created it)" + }, + "config": { + "properties": { + "version": { + "type": "number" + }, + "functionType": { + "type": "string", + "enum": [ + "fluid", + "standard" + ] + }, + "functionMemoryType": { + "type": "string", + "enum": [ + "performance", + "performance_xl", + "standard", + "standard_legacy" + ] + }, + "functionTimeout": { + "nullable": true, + "type": "number" + }, + "secureComputePrimaryRegion": { + "nullable": true, + "type": "string" + }, + "secureComputeFallbackRegion": { + "nullable": true, + "type": "string" + }, + "isUsingActiveCPU": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "resourceConfig": { + "properties": { + "buildQueue": { + "properties": { + "configuration": { + "type": "string", + "enum": [ + "SKIP_NAMESPACE_QUEUE", + "WAIT_FOR_NAMESPACE_QUEUE" + ], + "description": "Build resource configuration snapshot for this deployment." + } + }, + "type": "object", + "description": "Build resource configuration snapshot for this deployment." + }, + "elasticConcurrency": { + "type": "string", + "enum": [ + "PROJECT_SETTING", + "SKIP_QUEUE", + "TEAM_SETTING" + ], + "description": "When elastic concurrency is used for this deployment, a value is set. The value tells the reason where the setting was coming from. - TEAM_SETTING: Inherited from team settings - PROJECT_SETTING: Inherited from project settings - SKIP_QUEUE: Manually triggered by user to skip the queues" + }, + "buildMachine": { + "properties": { + "purchaseType": { + "nullable": true, + "type": "string", + "enum": [ + "basic", + "enhanced", + "standard", + "turbo", + null + ], + "description": "Machine type that was used for the build." + } + }, + "type": "object" + } + }, + "type": "object", + "description": "Build resource configuration snapshot for this deployment." + } + }, + "required": [ + "functionMemoryType", + "functionTimeout", + "functionType", + "secureComputeFallbackRegion", + "secureComputePrimaryRegion" + ], + "type": "object", + "description": "Since February 2025 the configuration must include snapshot data at the time of deployment creation to capture properties for the /deployments/:id/config endpoint utilized for displaying Deployment Configuration on the frontend This is optional because older deployments may not have this data captured" + }, + "checks": { + "properties": { + "deployment-alias": { + "properties": { + "state": { + "type": "string", + "enum": [ + "failed", + "pending", + "succeeded" + ] + }, + "startedAt": { + "type": "number" + }, + "completedAt": { + "type": "number" + } + }, + "required": [ + "startedAt", + "state" + ], + "type": "object", + "description": "Condensed check data. Retrieve individual check and check run data using api-checks v2 routes." + } + }, + "required": [ + "deployment-alias" + ], + "type": "object" + }, + "seatBlock": { + "properties": { + "blockCode": { + "type": "string", + "enum": [ + "COMMIT_AUTHOR_REQUIRED", + "TEAM_ACCESS_REQUIRED" + ], + "description": "The NSNB decision code for the seat block. TODO: We should consolidate block types." + }, + "userId": { + "type": "string", + "description": "The blocked vercel user ID." + }, + "isVerified": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Determines if the user was verified during the block. In the git integration case, the commit sender was the author." + }, + "gitUserId": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "gitProvider": { + "type": "string", + "enum": [ + "bitbucket", + "github", + "gitlab" + ], + "description": "The git provider type associated with gitUserId." + } + }, + "required": [ + "blockCode" + ], + "type": "object", + "description": "NSNB Blocked metadata" + }, + "attribution": { + "properties": { + "commitMeta": { + "properties": { + "email": { + "type": "string", + "description": "Email from git commit author" + }, + "name": { + "type": "string", + "description": "Name from git commit author" + }, + "isVerified": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether the commit was signed/verified (GitHub only, others return undefined)" + } + }, + "type": "object", + "description": "Commit metadata from the git commit author" + }, + "gitUser": { + "properties": { + "id": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "login": { + "type": "string", + "description": "Git provider username/login" + }, + "type": { + "type": "string", + "description": "User type" + }, + "provider": { + "type": "string", + "description": "The git provider (github, gitlab, bitbucket)" + } + }, + "required": [ + "id", + "login" + ], + "type": "object", + "description": "Git provider user associated with the commit author email (only set if resolved)" + }, + "vercelUser": { + "properties": { + "id": { + "type": "string", + "description": "Vercel user ID" + }, + "username": { + "type": "string", + "description": "Vercel username" + }, + "teamRoles": { + "items": { + "type": "string" + }, + "type": "array", + "description": "Team roles at time of deployment" + } + }, + "required": [ + "id", + "username" + ], + "type": "object", + "description": "Vercel user linked to the git provider account (only set if resolved)" + } + }, + "type": "object", + "description": "Attribution metadata for the deployment, linking commit author to git and Vercel users. Only populated when the `enable-deployment-attribution` flag is enabled." + } + }, + "required": [ + "aliasAssigned", + "bootedAt", + "build", + "buildSkipped", + "buildingAt", + "createdAt", + "createdIn", + "creator", + "env", + "id", + "inspectorUrl", + "isInConcurrentBuildsQueue", + "isInSystemBuildsQueue", + "meta", + "name", + "ownerId", + "plan", + "projectId", + "projectSettings", + "public", + "readyState", + "regions", + "routes", + "status", + "type", + "url", + "version" + ], + "type": "object", + "description": "Returns the newly created deployment object. Poll `readyState` to track build progress. See https://vercel.com/docs/deployments/deployment-states for possible states." + } + ] + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid.\nOne of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "402": { + "description": "The account is missing a payment so payment method must be updated\nPro customers are allowed to deploy Serverless Functions to up to `proMaxRegions` regions, or if the project was created before the limit was introduced.\nDeploying to Serverless Functions to multiple regions requires a plan update" + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "409": { + "description": "The deployment project is being transferred" + }, + "410": { + "description": "" + }, + "426": { + "description": "" + }, + "429": { + "description": "" + }, + "500": { + "description": "" + }, + "503": { + "description": "" + } + }, + "x-vercel-cli": { + "supportedSubcommands": true, + "supportedProduction": false + }, + "parameters": [ + { + "name": "forceNew", + "description": "Forces a new deployment even if there is a previous similar deployment. Set to `1` to bypass deployment deduplication and always trigger a fresh build.", + "in": "query", + "schema": { + "description": "Forces a new deployment even if there is a previous similar deployment. Set to `1` to bypass deployment deduplication and always trigger a fresh build.", + "enum": [ + "0", + "1" + ], + "example": "1" + } + }, + { + "name": "skipAutoDetectionConfirmation", + "description": "Set to `1` to skip framework auto-detection and proceed without confirmation. By default, if Vercel detects a framework that differs from the project setting, the API returns a `400` asking you to confirm. Use this to suppress that check in automated pipelines.", + "in": "query", + "schema": { + "description": "Set to `1` to skip framework auto-detection and proceed without confirmation. By default, if Vercel detects a framework that differs from the project setting, the API returns a `400` asking you to confirm. Use this to suppress that check in automated pipelines.", + "enum": [ + "0", + "1" + ], + "example": "1" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "additionalProperties": false, + "properties": { + "customEnvironmentSlugOrId": { + "description": "The slug or ID of a custom environment to deploy to, overriding the default target environment. When omitted, the deployment targets the environment inferred from the branch (production or preview).", + "type": "string", + "example": "staging" + }, + "deploymentId": { + "description": "The ID of an existing deployment to redeploy. All project settings and environment variables are inherited from the original unless explicitly overridden in this request. The redeployment gets a new ID, URL, and build.", + "type": "string", + "example": "dpl_2qn7PZrx89yxY34vEZPD31Y9XVj6" + }, + "files": { + "description": "The files to include in the deployment. Each entry is either an inlined file (with `data` and `encoding`) or a reference to a previously uploaded file (with `sha` and `size`). Required for non-git deployments. Cannot be used together with `gitSource`.", + "items": { + "oneOf": [ + { + "additionalProperties": false, + "description": "Used in the case you want to inline a file inside the request", + "properties": { + "data": { + "description": "The file content, it could be either a `base64` (useful for images, etc.) of the files or the plain content for source code", + "type": "string" + }, + "encoding": { + "description": "The file content encoding, it could be either a base64 (useful for images, etc.) of the files or the plain text for source code.", + "enum": [ + "base64", + "utf-8" + ] + }, + "file": { + "description": "The file name including the whole path", + "example": "folder/file.js", + "type": "string" + } + }, + "required": [ + "file", + "data" + ], + "title": "InlinedFile", + "type": "object" + }, + { + "additionalProperties": false, + "description": "Used in the case you want to reference a file that was already uploaded", + "properties": { + "file": { + "description": "The file path relative to the project root", + "example": "folder/file.js", + "type": "string" + }, + "sha": { + "description": "The file contents hashed with SHA1, used to check the integrity", + "type": "string" + }, + "size": { + "description": "The file size in bytes", + "type": "integer" + } + }, + "required": [ + "file" + ], + "title": "UploadedFile", + "type": "object" + } + ] + }, + "type": "array" + }, + "gitAccessToken": { + "description": "Available only to Vercel platform accounts. A read-only GitHub access token scoped to the requested repository. Use a token with a lifetime of 24 hours or less that remains valid until source retrieval completes.", + "maxLength": 1024, + "type": "string", + "writeOnly": true + }, + "gitMetadata": { + "description": "Populates initial git metadata for different git providers.", + "additionalProperties": false, + "type": "object", + "properties": { + "remoteUrl": { + "type": "string", + "description": "The git repository's remote origin url", + "example": "https://github.com/vercel/next.js" + }, + "commitAuthorName": { + "type": "string", + "description": "The name of the author of the commit", + "example": "kyliau" + }, + "commitAuthorEmail": { + "type": "string", + "description": "The email of the author of the commit", + "example": "kyliau@example.com" + }, + "commitMessage": { + "type": "string", + "description": "The commit message", + "example": "add method to measure Interaction to Next Paint (INP) (#36490)" + }, + "commitRef": { + "type": "string", + "description": "The branch on which the commit was made", + "example": "main" + }, + "commitSha": { + "type": "string", + "description": "The hash of the commit", + "example": "dc36199b2234c6586ebe05ec94078a895c707e29" + }, + "dirty": { + "type": "boolean", + "description": "Whether or not there have been modifications to the working tree since the latest commit", + "example": true + }, + "ci": { + "type": "boolean", + "description": "True if process.env.CI was set when deploying", + "example": true + }, + "ciType": { + "type": "string", + "description": "The type of CI system used", + "example": "github-actions" + }, + "ciGitProviderUsername": { + "type": "string", + "description": "The username used for the Git Provider (e.g. GitHub) if their CI (e.g. GitHub Actions) was used, if available", + "example": "rauchg" + }, + "ciGitRepoVisibility": { + "type": "string", + "description": "The visibility of the Git repository if their CI (e.g. GitHub Actions) was used, if available", + "example": "private" + }, + "rootDirectory": { + "type": "string", + "description": "Path of the deployed directory relative to the detected git repository root. Empty string when deploying from the repository root.", + "example": "apps/web" + } + } + }, + "gitSource": { + "description": "Defines the Git Repository source to be deployed. This property can not be used in combination with `files`.", + "anyOf": [ + { + "properties": { + "type": { + "enum": [ + "vercel" + ], + "type": "string" + }, + "sha": { + "type": "string", + "example": "a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9t0" + } + }, + "required": [ + "type", + "sha" + ], + "type": "object" + }, + { + "properties": { + "ref": { + "type": "string", + "example": "main" + }, + "repoId": { + "oneOf": [ + { + "type": "number" + }, + { + "type": "string" + } + ], + "example": 123456789 + }, + "sha": { + "type": "string", + "example": "a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9t0" + }, + "type": { + "enum": [ + "github" + ], + "type": "string" + } + }, + "required": [ + "type", + "ref", + "repoId" + ], + "type": "object" + }, + { + "properties": { + "org": { + "type": "string", + "example": "vercel" + }, + "ref": { + "type": "string", + "example": "main" + }, + "repo": { + "type": "string", + "example": "next.js" + }, + "sha": { + "type": "string", + "example": "a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9t0" + }, + "type": { + "enum": [ + "github" + ], + "type": "string" + } + }, + "required": [ + "type", + "ref", + "org", + "repo" + ], + "type": "object" + }, + { + "properties": { + "ref": { + "type": "string", + "example": "main" + }, + "repoId": { + "oneOf": [ + { + "type": "number" + }, + { + "type": "string" + } + ], + "example": 123456789 + }, + "sha": { + "type": "string", + "example": "a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9t0" + }, + "type": { + "enum": [ + "github-limited" + ], + "type": "string" + } + }, + "required": [ + "type", + "ref", + "repoId" + ], + "type": "object" + }, + { + "properties": { + "org": { + "type": "string", + "example": "vercel" + }, + "ref": { + "type": "string", + "example": "main" + }, + "repo": { + "type": "string", + "example": "next.js" + }, + "sha": { + "type": "string", + "example": "a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9t0" + }, + "type": { + "enum": [ + "github-limited" + ], + "type": "string" + } + }, + "required": [ + "type", + "ref", + "org", + "repo" + ], + "type": "object" + }, + { + "properties": { + "projectId": { + "oneOf": [ + { + "type": "number" + }, + { + "type": "string" + } + ], + "example": 987654321 + }, + "ref": { + "type": "string", + "example": "main" + }, + "sha": { + "type": "string", + "example": "a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9t0" + }, + "type": { + "enum": [ + "gitlab" + ], + "type": "string" + } + }, + "required": [ + "type", + "ref", + "projectId" + ], + "type": "object" + }, + { + "properties": { + "ref": { + "type": "string", + "example": "main" + }, + "repoUuid": { + "type": "string", + "example": "123e4567-e89b-12d3-a456-426614174000" + }, + "sha": { + "type": "string", + "example": "a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9t0" + }, + "type": { + "enum": [ + "bitbucket" + ], + "type": "string" + }, + "workspaceUuid": { + "type": "string", + "example": "987e6543-e21b-12d3-a456-426614174000" + } + }, + "required": [ + "type", + "ref", + "repoUuid" + ], + "type": "object" + }, + { + "properties": { + "owner": { + "type": "string", + "example": "bitbucket_user" + }, + "ref": { + "type": "string", + "example": "main" + }, + "sha": { + "type": "string", + "example": "a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9t0" + }, + "slug": { + "type": "string", + "example": "my-awesome-project" + }, + "type": { + "enum": [ + "bitbucket" + ], + "type": "string" + } + }, + "required": [ + "type", + "ref", + "owner", + "slug" + ], + "type": "object" + }, + { + "description": "Deploys from the Cursor Origin repository linked to the target project. The repository ID must match the linked repository; Vercel resolves the owner and repository name from the project link.", + "properties": { + "owner": { + "description": "The Origin workspace slug. Optional because Vercel resolves it from the linked project.", + "type": "string", + "example": "bitbucket_user" + }, + "ref": { + "description": "The branch or Git reference to deploy.", + "type": "string", + "example": "main" + }, + "repo": { + "description": "The Origin repository name. Optional because Vercel resolves it from the linked project.", + "type": "string", + "example": "next.js" + }, + "repoId": { + "description": "The stable Origin repository ID. Read it from the `link.repoId` field returned by the project API.", + "type": "string", + "example": 123456789 + }, + "sha": { + "description": "The commit SHA to deploy. When omitted, Vercel resolves the latest commit on `ref`.", + "type": "string", + "example": "a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9t0" + }, + "type": { + "enum": [ + "cursor-origin" + ], + "type": "string" + } + }, + "required": [ + "type", + "ref", + "repoId" + ], + "type": "object" + } + ] + }, + "meta": { + "additionalProperties": { + "maxLength": 65536, + "type": "string" + }, + "description": "An object containing the deployment's metadata. Multiple key-value pairs can be attached to a deployment. For deployments created with a Cursor Origin `gitSource`, Vercel automatically adds `cursorOriginDeployment`, `cursorOriginCommitSha`, `cursorOriginCommitRef`, `cursorOriginCommitMessage`, `cursorOriginCommitAuthorName`, `cursorOriginCommitAuthorEmail` when available, `cursorOriginOwner`, `cursorOriginRepo`, `cursorOriginRepoId`, and `cursorOriginPrId` for pull request deployments.", + "example": { + "foo": "bar" + }, + "maxProperties": 100, + "type": "object" + }, + "monorepoManager": { + "description": "The monorepo manager that is being used for this deployment. When `null` is used no monorepo manager is selected", + "type": "string", + "nullable": true + }, + "name": { + "description": "A string with the project name used in the deployment URL", + "example": "my-instant-deployment", + "type": "string" + }, + "project": { + "description": "The target project identifier in which the deployment will be created. When defined, this parameter overrides name", + "example": "my-deployment-project", + "type": "string" + }, + "projectSettings": { + "additionalProperties": false, + "description": "Project settings that will be applied to the deployment. It is required for the first deployment of a project and will be saved for any following deployments", + "properties": { + "buildCommand": { + "description": "The build command for this project. When `null` is used this value will be automatically detected", + "maxLength": 256, + "type": "string", + "nullable": true, + "example": "next build" + }, + "commandForIgnoringBuildStep": { + "maxLength": 256, + "type": "string", + "nullable": true + }, + "devCommand": { + "description": "The dev command for this project. When `null` is used this value will be automatically detected", + "maxLength": 256, + "type": "string", + "nullable": true + }, + "framework": { + "description": "The framework that is being used for this project. When `null` is used no framework is selected", + "type": "string", + "enum": [ + null, + "services", + "container", + "blitzjs", + "nextjs", + "gatsby", + "remix", + "react-router", + "astro", + "hexo", + "eleventy", + "docusaurus-2", + "docusaurus", + "preact", + "solidstart-1", + "solidstart", + "dojo", + "ember", + "vue", + "scully", + "ionic-angular", + "angular", + "polymer", + "svelte", + "sveltekit", + "sveltekit-1", + "ionic-react", + "create-react-app", + "gridsome", + "umijs", + "sapper", + "saber", + "stencil", + "nuxtjs", + "redwoodjs", + "hugo", + "jekyll", + "brunch", + "middleman", + "zola", + "hydrogen", + "vite", + "tanstack-start", + "tanstack-start-lovable", + "vitepress", + "vuepress", + "parcel", + "fastapi", + "flask", + "fasthtml", + "django", + "ash", + "factory-eve", + "eve", + "sanity", + "sanity-v2", + "storybook", + "nitro", + "hono", + "express", + "h3", + "koa", + "nestjs", + "elysia", + "fastify", + "xmcp", + "python", + "ruby", + "rust", + "axum", + "actix-web", + "bun", + "node", + "go", + "mastra" + ], + "nullable": true + }, + "installCommand": { + "description": "The install command for this project. When `null` is used this value will be automatically detected", + "maxLength": 256, + "type": "string", + "nullable": true, + "example": "pnpm install" + }, + "nodeVersion": { + "description": "Override the Node.js version that should be used for this deployment", + "enum": [ + "24.x", + "22.x", + "20.x", + "18.x", + "16.x", + "14.x", + "12.x", + "10.x", + "8.10.x" + ], + "type": "string" + }, + "outputDirectory": { + "description": "The output directory of the project. When `null` is used this value will be automatically detected", + "maxLength": 256, + "type": "string", + "nullable": true + }, + "rootDirectory": { + "description": "The name of a directory or relative path to the source code of your project. When `null` is used it will default to the project root", + "maxLength": 256, + "type": "string", + "nullable": true + }, + "serverlessFunctionRegion": { + "description": "The region to deploy Serverless Functions in this project", + "maxLength": 4, + "type": "string", + "nullable": true + }, + "skipGitConnectDuringLink": { + "description": "Opts-out of the message prompting a CLI user to connect a Git repository in `vercel link`.", + "type": "boolean", + "deprecated": true + }, + "sourceFilesOutsideRootDirectory": { + "description": "Indicates if there are source files outside of the root directory, typically used for monorepos", + "type": "boolean" + } + }, + "type": "object" + }, + "target": { + "description": "Either not defined, `staging`, `production`, or a custom environment identifier. If `staging`, a staging alias in the format `\u003cproject\u003e-\u003cteam\u003e.vercel.app` will be assigned. If `production`, any aliases defined in `alias` will be assigned. If omitted, the target will be `preview`.", + "type": "string", + "example": "production" + }, + "withLatestCommit": { + "description": "When `true` and `deploymentId` is passed in, the sha from the previous deployment's `gitSource` is removed forcing the latest commit to be used.", + "type": "boolean" + } + }, + "required": [ + "name" + ], + "type": "object" + } + } + }, + "required": true + } + } + }, + "/v12/deployments/{id}/cancel": { + "patch": { + "description": "Cancels a deployment that is currently in progress, stopping the build before it completes. Use this to recover quickly from accidental deploys, wrong-branch pushes, or builds with known errors — without waiting for them to finish. Returns 400 if the deployment is no longer cancelable (already `READY`, `ERROR`, or `CANCELED`). Returns the updated deployment object with `readyState: 'CANCELED'` on success.", + "operationId": "cancelDeployment", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Cancel a deployment", + "tags": [ + "deployments" + ], + "responses": { + "200": { + "description": "Returns the updated deployment object with `readyState` set to `CANCELED`. The build has been stopped and this action is irreversible.", + "content": { + "application/json": { + "schema": { + "properties": { + "aliasAssignedAt": { + "nullable": true, + "oneOf": [ + { + "type": "number" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + } + ] + }, + "alwaysRefuseToBuild": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "build": { + "properties": { + "env": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "env" + ], + "type": "object" + }, + "buildArtifactUrls": { + "items": { + "type": "string" + }, + "type": "array" + }, + "builds": { + "items": { + "properties": { + "use": { + "type": "string" + }, + "src": { + "type": "string" + }, + "config": { + "additionalProperties": true, + "type": "object" + } + }, + "required": [ + "use" + ], + "type": "object" + }, + "type": "array" + }, + "env": { + "items": { + "type": "string" + }, + "type": "array" + }, + "resourceConfig": { + "properties": { + "buildMachine": { + "properties": { + "purchaseType": { + "type": "string", + "enum": [ + "basic", + "enhanced", + "standard", + "turbo" + ], + "description": "Machine type which was purchased/selected for this build. `basic` is the 2vCPU tier, recorded on the deployment so the build pipeline can detect a basic build without consulting the project." + }, + "defaultPurchaseType": { + "type": "string", + "enum": [ + "basic", + "enhanced", + "standard" + ], + "description": "The default plan type for the build machine — what the customer is *paying* for on their plan. For most customers, this is standard, but some customers have an entitlement for enhanced builds." + }, + "machineSelectionType": { + "type": "string", + "enum": [ + "elastic", + "fixed" + ], + "description": "Whether the build ran on a fixed or elastic machine. Used to drive billing for the build." + }, + "selectionSource": { + "type": "string", + "enum": [ + "elastic-algorithm", + "plan-default", + "project-setting", + "team-entitlement", + "team-setting" + ], + "description": "The setting which selected the build machine when the deployment was created. Frozen here so later project or team changes do not rewrite its history." + }, + "cores": { + "type": "number", + "description": "Number of cores the build machine ran with. Set at dispatch time once the build lands on a hive." + }, + "memory": { + "type": "number", + "description": "Memory, in MiB, the build machine ran with. Set at dispatch time once the build lands on a hive." + } + }, + "type": "object", + "description": "Build machine configuration recorded for this deployment's build. See {@link DeploymentBuildMachine}. Distinct from the team/user `resourceConfig.buildMachine`, which only carries `default`." + } + }, + "type": "object" + }, + "inspectorUrl": { + "nullable": true, + "type": "string" + }, + "isInConcurrentBuildsQueue": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "isInSystemBuildsQueue": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "projectSettings": { + "properties": { + "nodeVersion": { + "type": "string", + "enum": [ + "10.x", + "12.x", + "14.x", + "16.x", + "18.x", + "20.x", + "22.x", + "24.x", + "8.10.x" + ] + }, + "buildCommand": { + "nullable": true, + "type": "string" + }, + "devCommand": { + "nullable": true, + "type": "string" + }, + "framework": { + "nullable": true, + "type": "string", + "enum": [ + "actix-web", + "angular", + "ash", + "astro", + "axum", + "blitzjs", + "brunch", + "bun", + "container", + "create-react-app", + "django", + "docusaurus", + "docusaurus-2", + "dojo", + "eleventy", + "elysia", + "ember", + "eve", + "express", + "factory-eve", + "fastapi", + "fasthtml", + "fastify", + "flask", + "gatsby", + "go", + "gridsome", + "h3", + "hexo", + "hono", + "hugo", + "hydrogen", + "ionic-angular", + "ionic-react", + "jekyll", + "koa", + "mastra", + "middleman", + "nestjs", + "nextjs", + "nitro", + "node", + "nuxtjs", + "parcel", + "polymer", + "preact", + "python", + "react-router", + "redwoodjs", + "remix", + "ruby", + "rust", + "saber", + "sanity", + "sanity-v2", + "sapper", + "scully", + "services", + "solidstart", + "solidstart-1", + "stencil", + "storybook", + "svelte", + "sveltekit", + "sveltekit-1", + "tanstack-start", + "tanstack-start-lovable", + "umijs", + "vite", + "vitepress", + "vue", + "vuepress", + "xmcp", + "zola", + null + ] + }, + "commandForIgnoringBuildStep": { + "nullable": true, + "type": "string" + }, + "installCommand": { + "nullable": true, + "type": "string" + }, + "outputDirectory": { + "nullable": true, + "type": "string" + }, + "speedInsights": { + "properties": { + "id": { + "type": "string" + }, + "enabledAt": { + "type": "number" + }, + "disabledAt": { + "type": "number" + }, + "canceledAt": { + "type": "number" + }, + "hasData": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "dataReceivedAt": { + "type": "number", + "description": "When the first free (not Speed Insights Plus) production data point was observed, in ms. Set once by subscriber-analytics-events; projects that already had data before this field shipped get it backfilled on their next batch, so it reads \"first free data point observed\", not necessarily \"first ever\"." + }, + "paidAt": { + "type": "number" + } + }, + "required": [ + "id" + ], + "type": "object" + }, + "webAnalytics": { + "properties": { + "id": { + "type": "string" + }, + "disabledAt": { + "type": "number" + }, + "canceledAt": { + "type": "number" + }, + "enabledAt": { + "type": "number" + }, + "hasData": { + "type": "boolean", + "enum": [ + true + ] + } + }, + "required": [ + "id" + ], + "type": "object" + } + }, + "type": "object" + }, + "integrations": { + "properties": { + "status": { + "type": "string", + "enum": [ + "error", + "pending", + "ready", + "skipped", + "timeout" + ] + }, + "startedAt": { + "type": "number" + }, + "claimedAt": { + "type": "number" + }, + "completedAt": { + "type": "number" + }, + "skippedAt": { + "type": "number" + }, + "skippedBy": { + "type": "string" + } + }, + "required": [ + "startedAt", + "status" + ], + "type": "object" + }, + "images": { + "properties": { + "sizes": { + "items": { + "type": "number" + }, + "type": "array" + }, + "qualities": { + "items": { + "type": "number" + }, + "type": "array" + }, + "domains": { + "items": { + "type": "string" + }, + "type": "array" + }, + "remotePatterns": { + "items": { + "properties": { + "protocol": { + "type": "string", + "enum": [ + "http", + "https" + ], + "description": "Must be `http` or `https`." + }, + "hostname": { + "type": "string", + "description": "Can be literal or wildcard. Single `*` matches a single subdomain. Double `**` matches any number of subdomains." + }, + "port": { + "type": "string", + "description": "Can be literal port such as `8080` or empty string meaning no port." + }, + "pathname": { + "type": "string", + "description": "Can be literal or wildcard. Single `*` matches a single path segment. Double `**` matches any number of path segments." + }, + "search": { + "type": "string", + "description": "Can be literal query string such as `?v=1` or empty string meaning no query string." + } + }, + "required": [ + "hostname" + ], + "type": "object" + }, + "type": "array" + }, + "localPatterns": { + "items": { + "properties": { + "pathname": { + "type": "string", + "description": "Can be literal or wildcard. Single `*` matches a single path segment. Double `**` matches any number of path segments." + }, + "search": { + "type": "string", + "description": "Can be literal query string such as `?v=1` or empty string meaning no query string." + } + }, + "type": "object" + }, + "type": "array" + }, + "minimumCacheTTL": { + "type": "number" + }, + "formats": { + "items": { + "type": "string", + "enum": [ + "image/avif", + "image/webp" + ] + }, + "type": "array" + }, + "dangerouslyAllowSVG": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "contentSecurityPolicy": { + "type": "string" + }, + "contentDispositionType": { + "type": "string", + "enum": [ + "attachment", + "inline" + ] + } + }, + "type": "object" + }, + "alias": { + "items": { + "type": "string" + }, + "type": "array", + "description": "A list of all the aliases (default aliases, staging aliases and production aliases) that were assigned upon deployment creation", + "example": [] + }, + "aliasAssigned": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "A boolean that will be true when the aliases from the alias property were assigned successfully", + "example": true + }, + "bootedAt": { + "type": "number" + }, + "buildingAt": { + "type": "number" + }, + "buildContainerFinishedAt": { + "type": "number", + "description": "Since April 2025 it necessary for On-Demand Concurrency Minutes calculation" + }, + "buildSkipped": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "creator": { + "properties": { + "uid": { + "type": "string", + "description": "Stable creator id across principal types (user id, app id, integration configuration id, or `system`).", + "example": "96SnxkFiMyVKsK3pnoHfx3Hz" + }, + "type": { + "type": "string", + "enum": [ + "app", + "integration", + "system", + "user" + ], + "description": "Principal type of the deployment creator." + }, + "username": { + "type": "string", + "description": "The username of the user that created the deployment", + "example": "john-doe" + }, + "avatar": { + "type": "string", + "description": "The avatar of the user that created the deployment" + } + }, + "required": [ + "uid" + ], + "type": "object", + "description": "Information about the deployment creator" + }, + "initReadyAt": { + "type": "number" + }, + "isFirstBranchDeployment": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "lambdas": { + "items": { + "properties": { + "id": { + "type": "string" + }, + "readyState": { + "type": "string", + "enum": [ + "BUILDING", + "ERROR", + "INITIALIZING", + "READY" + ] + }, + "createdAt": { + "type": "number" + }, + "entrypoint": { + "nullable": true, + "type": "string" + }, + "readyStateAt": { + "type": "number" + }, + "output": { + "items": { + "properties": { + "path": { + "type": "string" + }, + "functionName": { + "type": "string" + } + }, + "required": [ + "functionName", + "path" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "id", + "output" + ], + "type": "object", + "description": "A partial representation of a Build used by the deployment endpoint." + }, + "type": "array" + }, + "public": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "A boolean representing if the deployment is public or not. By default this is `false`", + "example": false + }, + "ready": { + "type": "number" + }, + "status": { + "type": "string", + "enum": [ + "BLOCKED", + "BUILDING", + "CANCELED", + "ERROR", + "INITIALIZING", + "QUEUED", + "READY" + ] + }, + "team": { + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "slug": { + "type": "string" + }, + "avatar": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "slug" + ], + "type": "object", + "description": "The team that owns the deployment if any" + }, + "userAliases": { + "items": { + "type": "string" + }, + "type": "array", + "description": "An array of domains that were provided by the user when creating the Deployment.", + "example": [ + "sub1.example.com", + "sub2.example.com" + ] + }, + "previewCommentsEnabled": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether or not preview comments are enabled for the deployment", + "example": false + }, + "ttyBuildLogs": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "customEnvironment": { + "oneOf": [ + { + "properties": { + "id": { + "type": "string", + "description": "Unique identifier for the custom environment (format: env_*)" + }, + "slug": { + "type": "string", + "description": "URL-friendly name of the environment" + }, + "type": { + "type": "string", + "enum": [ + "development", + "preview", + "production" + ], + "description": "The type of environment (production, preview, or development)" + }, + "description": { + "type": "string", + "description": "Optional description of the environment's purpose" + }, + "branchMatcher": { + "properties": { + "type": { + "type": "string", + "enum": [ + "endsWith", + "equals", + "startsWith" + ], + "description": "The type of matching to perform" + }, + "pattern": { + "type": "string", + "description": "The pattern to match against branch names" + } + }, + "required": [ + "pattern", + "type" + ], + "type": "object", + "description": "Configuration for matching git branches to this environment" + }, + "domains": { + "items": { + "properties": { + "name": { + "type": "string" + }, + "apexName": { + "type": "string" + }, + "projectId": { + "type": "string" + }, + "redirect": { + "nullable": true, + "type": "string" + }, + "redirectStatusCode": { + "nullable": true, + "type": "number", + "enum": [ + 301, + 302, + 307, + 308, + null + ] + }, + "gitBranch": { + "nullable": true, + "type": "string" + }, + "customEnvironmentId": { + "nullable": true, + "type": "string" + }, + "updatedAt": { + "type": "number" + }, + "createdAt": { + "type": "number" + }, + "verified": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "`true` if the domain is verified for use with the project. If `false` it will not be used as an alias on this project until the challenge in `verification` is completed." + }, + "verification": { + "items": { + "properties": { + "type": { + "type": "string" + }, + "domain": { + "type": "string" + }, + "value": { + "type": "string" + }, + "reason": { + "type": "string" + } + }, + "required": [ + "domain", + "reason", + "type", + "value" + ], + "type": "object", + "description": "A list of verification challenges, one of which must be completed to verify the domain for use on the project. After the challenge is complete `POST /projects/:idOrName/domains/:domain/verify` to verify the domain. Possible challenges: - If `verification.type = TXT` the `verification.domain` will be checked for a TXT record matching `verification.value`." + }, + "type": "array", + "description": "A list of verification challenges, one of which must be completed to verify the domain for use on the project. After the challenge is complete `POST /projects/:idOrName/domains/:domain/verify` to verify the domain. Possible challenges: - If `verification.type = TXT` the `verification.domain` will be checked for a TXT record matching `verification.value`." + } + }, + "required": [ + "apexName", + "name", + "projectId", + "verified" + ], + "type": "object", + "description": "List of domains associated with this environment" + }, + "type": "array", + "description": "List of domains associated with this environment" + }, + "currentDeploymentAliases": { + "items": { + "type": "string" + }, + "type": "array", + "description": "List of aliases for the current deployment" + }, + "createdAt": { + "type": "number", + "description": "Timestamp when the environment was created" + }, + "updatedAt": { + "type": "number", + "description": "Timestamp when the environment was last updated" + } + }, + "required": [ + "createdAt", + "id", + "slug", + "type", + "updatedAt" + ], + "type": "object", + "description": "If the deployment was created using a Custom Environment, then this property contains information regarding the environment used." + }, + { + "properties": { + "id": { + "type": "string" + } + }, + "required": [ + "id" + ], + "type": "object", + "description": "If the deployment was created using a Custom Environment, then this property contains information regarding the environment used." + } + ] + }, + "oomReport": { + "type": "string", + "enum": [ + "out-of-memory" + ] + }, + "readyStateReason": { + "type": "string" + }, + "id": { + "type": "string", + "description": "A string holding the unique ID of the deployment", + "example": "dpl_89qyp1cskzkLrVicDaZoDbjyHuDJ" + }, + "target": { + "nullable": true, + "type": "string", + "enum": [ + "production", + "staging", + null + ], + "description": "If defined, either `staging` if a staging alias in the format `\u003cproject\u003e.\u003cteam\u003e.now.sh` was assigned upon creation, or `production` if the aliases from `alias` were assigned. `null` value indicates the \"preview\" deployment.", + "example": null + }, + "readyState": { + "type": "string", + "enum": [ + "BLOCKED", + "BUILDING", + "CANCELED", + "ERROR", + "INITIALIZING", + "QUEUED", + "READY" + ], + "description": "The state of the deployment depending on the process of deploying, or if it is ready or in an error state", + "example": "READY" + }, + "aliasError": { + "nullable": true, + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object", + "description": "An object that will contain a `code` and a `message` when the aliasing fails, otherwise the value will be `null`", + "example": null + }, + "aliasWarning": { + "nullable": true, + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + }, + "link": { + "type": "string" + }, + "action": { + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" + }, + "errorCode": { + "type": "string" + }, + "errorMessage": { + "nullable": true, + "type": "string" + }, + "createdAt": { + "type": "number", + "description": "A number containing the date when the deployment was created in milliseconds", + "example": 1540257589405 + }, + "name": { + "type": "string", + "description": "The name of the project associated with the deployment at the time that the deployment was created", + "example": "my-project" + }, + "type": { + "type": "string", + "enum": [ + "LAMBDAS" + ] + }, + "aliasFinal": { + "nullable": true, + "type": "string" + }, + "autoAssignCustomDomains": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "applies to custom domains only, defaults to `true`" + }, + "automaticAliases": { + "items": { + "type": "string" + }, + "type": "array" + }, + "buildErrorAt": { + "type": "number" + }, + "checksState": { + "type": "string", + "enum": [ + "completed", + "registered", + "running" + ] + }, + "checksConclusion": { + "type": "string", + "enum": [ + "canceled", + "failed", + "skipped", + "succeeded" + ] + }, + "deletedAt": { + "nullable": true, + "type": "number", + "description": "A number containing the date when the deployment was deleted at milliseconds", + "example": 1540257589405 + }, + "defaultRoute": { + "type": "string", + "description": "Computed field that is only available for deployments with a microfrontend configuration." + }, + "canceledAt": { + "type": "number" + }, + "errorLink": { + "type": "string" + }, + "errorStep": { + "type": "string" + }, + "passiveRegions": { + "items": { + "type": "string" + }, + "type": "array", + "description": "Since November 2023 this field defines a set of regions that we will deploy the lambda to passively Lambdas will be deployed to these regions but only invoked if all of the primary `regions` are marked as out of service" + }, + "gitSource": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "github" + ] + }, + "repoId": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "ref": { + "nullable": true, + "type": "string" + }, + "sha": { + "type": "string" + }, + "prId": { + "nullable": true, + "type": "number" + } + }, + "required": [ + "repoId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "github" + ] + }, + "org": { + "type": "string" + }, + "repo": { + "type": "string" + }, + "ref": { + "nullable": true, + "type": "string" + }, + "sha": { + "type": "string" + }, + "prId": { + "nullable": true, + "type": "number" + } + }, + "required": [ + "org", + "repo", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "github-custom-host" + ] + }, + "host": { + "type": "string" + }, + "repoId": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "ref": { + "nullable": true, + "type": "string" + }, + "sha": { + "type": "string" + }, + "prId": { + "nullable": true, + "type": "number" + } + }, + "required": [ + "host", + "repoId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "github-custom-host" + ] + }, + "host": { + "type": "string" + }, + "org": { + "type": "string" + }, + "repo": { + "type": "string" + }, + "ref": { + "nullable": true, + "type": "string" + }, + "sha": { + "type": "string" + }, + "prId": { + "nullable": true, + "type": "number" + } + }, + "required": [ + "host", + "org", + "repo", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "github-limited" + ] + }, + "repoId": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "ref": { + "nullable": true, + "type": "string" + }, + "sha": { + "type": "string" + }, + "prId": { + "nullable": true, + "type": "number" + } + }, + "required": [ + "repoId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "github-limited" + ] + }, + "org": { + "type": "string" + }, + "repo": { + "type": "string" + }, + "ref": { + "nullable": true, + "type": "string" + }, + "sha": { + "type": "string" + }, + "prId": { + "nullable": true, + "type": "number" + } + }, + "required": [ + "org", + "repo", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "gitlab" + ] + }, + "projectId": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "ref": { + "nullable": true, + "type": "string" + }, + "sha": { + "type": "string" + }, + "prId": { + "nullable": true, + "type": "number" + } + }, + "required": [ + "projectId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "bitbucket" + ] + }, + "workspaceUuid": { + "type": "string" + }, + "repoUuid": { + "type": "string" + }, + "ref": { + "nullable": true, + "type": "string" + }, + "sha": { + "type": "string" + }, + "prId": { + "nullable": true, + "type": "number" + } + }, + "required": [ + "repoUuid", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "bitbucket" + ] + }, + "owner": { + "type": "string" + }, + "slug": { + "type": "string" + }, + "ref": { + "nullable": true, + "type": "string" + }, + "sha": { + "type": "string" + }, + "prId": { + "nullable": true, + "type": "number" + } + }, + "required": [ + "owner", + "slug", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "vercel" + ] + }, + "org": { + "type": "string" + }, + "repo": { + "type": "string" + }, + "sha": { + "type": "string" + }, + "repoPushedAt": { + "type": "number" + }, + "ref": { + "nullable": true, + "type": "string" + }, + "prId": { + "nullable": true, + "type": "number" + } + }, + "required": [ + "sha", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "cursor-origin" + ] + }, + "repoId": { + "type": "string", + "description": "Origin repository id." + }, + "owner": { + "type": "string", + "description": "Owner (namespace) slug." + }, + "repo": { + "type": "string" + }, + "ref": { + "nullable": true, + "type": "string" + }, + "sha": { + "type": "string" + }, + "prId": { + "nullable": true, + "type": "number" + } + }, + "required": [ + "repoId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "custom" + ] + }, + "ref": { + "type": "string" + }, + "sha": { + "type": "string" + }, + "gitUrl": { + "type": "string" + } + }, + "required": [ + "gitUrl", + "ref", + "sha", + "type" + ], + "type": "object", + "description": "Allows custom git sources (local folder mounted to the container) in test mode" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "github" + ] + }, + "ref": { + "type": "string" + }, + "sha": { + "type": "string" + }, + "repoId": { + "type": "number" + }, + "org": { + "type": "string" + }, + "repo": { + "type": "string" + } + }, + "required": [ + "ref", + "repoId", + "sha", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "github-custom-host" + ] + }, + "host": { + "type": "string" + }, + "ref": { + "type": "string" + }, + "sha": { + "type": "string" + }, + "repoId": { + "type": "number" + }, + "org": { + "type": "string" + }, + "repo": { + "type": "string" + } + }, + "required": [ + "host", + "ref", + "repoId", + "sha", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "github-limited" + ] + }, + "ref": { + "type": "string" + }, + "sha": { + "type": "string" + }, + "repoId": { + "type": "number" + }, + "org": { + "type": "string" + }, + "repo": { + "type": "string" + } + }, + "required": [ + "ref", + "repoId", + "sha", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "gitlab" + ] + }, + "ref": { + "type": "string" + }, + "sha": { + "type": "string" + }, + "projectId": { + "type": "number" + } + }, + "required": [ + "projectId", + "ref", + "sha", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "bitbucket" + ] + }, + "ref": { + "type": "string" + }, + "sha": { + "type": "string" + }, + "owner": { + "type": "string" + }, + "slug": { + "type": "string" + }, + "workspaceUuid": { + "type": "string" + }, + "repoUuid": { + "type": "string" + } + }, + "required": [ + "ref", + "repoUuid", + "sha", + "type", + "workspaceUuid" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "vercel" + ] + }, + "ref": { + "type": "string" + }, + "sha": { + "type": "string" + }, + "org": { + "type": "string" + }, + "repo": { + "type": "string" + }, + "repoPushedAt": { + "type": "number" + } + }, + "required": [ + "org", + "ref", + "repo", + "sha", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "cursor-origin" + ] + }, + "ref": { + "type": "string" + }, + "sha": { + "type": "string" + }, + "repoId": { + "type": "string" + }, + "owner": { + "type": "string" + }, + "repo": { + "type": "string" + } + }, + "required": [ + "owner", + "ref", + "repo", + "repoId", + "sha", + "type" + ], + "type": "object" + } + ] + }, + "manualProvisioning": { + "properties": { + "state": { + "type": "string", + "enum": [ + "COMPLETE", + "PENDING", + "TIMEOUT" + ], + "description": "Current provisioning state" + }, + "completedAt": { + "type": "number", + "description": "Timestamp when manual provisioning completed" + } + }, + "required": [ + "state" + ], + "type": "object", + "description": "Present when deployment was created with manual provisioning enabled, either explicitly or via the experimental BYOC git flow. The deployment stays in INITIALIZING until /continue is called." + }, + "meta": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "originCacheRegion": { + "type": "string" + }, + "nodeVersion": { + "type": "string", + "enum": [ + "10.x", + "12.x", + "14.x", + "16.x", + "18.x", + "20.x", + "22.x", + "24.x", + "8.10.x" + ], + "description": "If set it overrides the `projectSettings.nodeVersion` for this deployment." + }, + "project": { + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "framework": { + "nullable": true, + "type": "string" + } + }, + "required": [ + "id", + "name" + ], + "type": "object", + "description": "The public project information associated with the deployment." + }, + "prebuilt": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "readySubstate": { + "type": "string", + "enum": [ + "PROMOTED", + "ROLLING", + "STAGED" + ], + "description": "Substate of deployment when readyState is 'READY' Tracks whether or not deployment has seen production traffic: - STAGED: never seen production traffic - ROLLING: in the process of having production traffic gradually transitioned. - PROMOTED: has seen production traffic" + }, + "regions": { + "items": { + "type": "string" + }, + "type": "array", + "description": "The regions the deployment exists in", + "example": [ + "sfo1" + ] + }, + "softDeletedByRetention": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "flag to indicate if the deployment was deleted by retention policy", + "example": "true" + }, + "source": { + "type": "string", + "enum": [ + "api-trigger-git-deploy", + "cli", + "clone/repo", + "drop", + "git", + "git-deploy-hook", + "import", + "import/repo", + "redeploy", + "v0-web" + ], + "description": "Where was the deployment created from. Best-effort guess for metrics only — not authoritative; do not gate behavior on it.", + "example": "cli" + }, + "undeletedAt": { + "type": "number", + "description": "A number containing the date when the deployment was undeleted at milliseconds", + "example": 1540257589405 + }, + "url": { + "type": "string", + "description": "A string with the unique URL of the deployment", + "example": "my-instant-deployment-3ij3cxz9qr.now.sh" + }, + "userConfiguredDeploymentId": { + "type": "string", + "description": "Since January 2025 User-configured deployment ID for skew protection with pre-built deployments. This is set when users configure a custom deploymentId in their next.config.js file. This allows Next.js to use skew protection even when deployments are pre-built outside of Vercel's build system.", + "example": "abc123" + }, + "version": { + "type": "number", + "enum": [ + 2 + ], + "description": "The platform version that was used to create the deployment.", + "example": 2 + }, + "oidcTokenClaims": { + "properties": { + "iss": { + "type": "string" + }, + "sub": { + "type": "string" + }, + "scope": { + "type": "string" + }, + "aud": { + "type": "string" + }, + "owner": { + "type": "string" + }, + "owner_id": { + "type": "string" + }, + "project": { + "type": "string" + }, + "project_id": { + "type": "string" + }, + "environment": { + "type": "string" + }, + "custom_environment_id": { + "type": "string" + }, + "mfe_group_ids": { + "items": { + "type": "string" + }, + "type": "array" + }, + "plan": { + "type": "string" + } + }, + "required": [ + "aud", + "environment", + "iss", + "owner", + "owner_id", + "project", + "project_id", + "scope", + "sub" + ], + "type": "object" + }, + "projectId": { + "type": "string" + }, + "plan": { + "type": "string", + "enum": [ + "enterprise", + "hobby", + "pro" + ] + }, + "connectBuildsEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "connectConfigurationId": { + "type": "string" + }, + "createdIn": { + "type": "string" + }, + "crons": { + "items": { + "properties": { + "schedule": { + "type": "string" + }, + "path": { + "type": "string" + } + }, + "required": [ + "path", + "schedule" + ], + "type": "object" + }, + "type": "array" + }, + "atproto": { + "oneOf": [ + { + "properties": { + "enabled": { + "type": "boolean", + "enum": [ + false + ] + } + }, + "required": [ + "enabled" + ], + "type": "object" + }, + { + "properties": { + "enabled": { + "type": "boolean", + "enum": [ + true + ] + }, + "subscription": { + "properties": { + "collections": { + "items": { + "type": "string" + }, + "type": "array" + }, + "dids": { + "items": { + "type": "string" + }, + "type": "array" + }, + "kinds": { + "items": { + "type": "string", + "enum": [ + "account", + "commit", + "identity", + "sync" + ] + }, + "type": "array" + }, + "path": { + "type": "string" + } + }, + "required": [ + "collections", + "path" + ], + "type": "object" + } + }, + "required": [ + "enabled", + "subscription" + ], + "type": "object" + } + ] + }, + "functions": { + "nullable": true, + "additionalProperties": { + "properties": { + "architecture": { + "type": "string", + "enum": [ + "arm64", + "x86_64" + ] + }, + "memory": { + "type": "number" + }, + "maxDuration": { + "oneOf": [ + { + "type": "number" + }, + { + "type": "string", + "enum": [ + "max" + ] + } + ] + }, + "affinity": { + "properties": { + "mode": { + "type": "string", + "enum": [ + "strict" + ] + } + }, + "required": [ + "mode" + ], + "type": "object" + }, + "maxConcurrency": { + "type": "number" + }, + "regions": { + "items": { + "type": "string" + }, + "type": "array" + }, + "functionFailoverRegions": { + "items": { + "type": "string" + }, + "type": "array" + }, + "runtime": { + "type": "string" + }, + "includeFiles": { + "type": "string" + }, + "excludeFiles": { + "type": "string" + }, + "experimentalTriggers": { + "items": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "queue/v1beta" + ], + "description": "Event type - must be \"queue/v1beta\" (REQUIRED)" + }, + "consumer": { + "type": "string", + "description": "Name of the consumer group for this trigger (REQUIRED)" + }, + "topic": { + "type": "string", + "description": "Name of the queue topic to consume from (REQUIRED)" + }, + "maxDeliveries": { + "type": "number", + "description": "Maximum number of delivery attempts for message processing (OPTIONAL) This represents the total number of times a message can be delivered, not the number of retries. Must be at least 1 if specified. Behavior when not specified depends on the server's default configuration." + }, + "retryAfterSeconds": { + "type": "number", + "description": "Delay in seconds before retrying failed executions (OPTIONAL) Behavior when not specified depends on the server's default configuration." + }, + "initialDelaySeconds": { + "type": "number", + "description": "Initial delay in seconds before first execution attempt (OPTIONAL) Must be 0 or greater. Use 0 for no initial delay. Behavior when not specified depends on the server's default configuration." + }, + "maxConcurrency": { + "type": "number", + "description": "Maximum number of concurrent executions for this consumer (OPTIONAL) Must be at least 1 if specified. Behavior when not specified depends on the server's default configuration." + } + }, + "required": [ + "consumer", + "topic", + "type" + ], + "type": "object", + "description": "Queue trigger input event for v1beta (from vercel.json config). Requires explicit consumer name." + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "queue/v2beta" + ], + "description": "Event type - must be \"queue/v2beta\" (REQUIRED)" + }, + "topic": { + "type": "string", + "description": "Name of the queue topic to consume from (REQUIRED)" + }, + "maxDeliveries": { + "type": "number", + "description": "Maximum number of delivery attempts for message processing (OPTIONAL) This represents the total number of times a message can be delivered, not the number of retries. Must be at least 1 if specified. Behavior when not specified depends on the server's default configuration." + }, + "retryAfterSeconds": { + "type": "number", + "description": "Delay in seconds before retrying failed executions (OPTIONAL) Behavior when not specified depends on the server's default configuration." + }, + "initialDelaySeconds": { + "type": "number", + "description": "Initial delay in seconds before first execution attempt (OPTIONAL) Must be 0 or greater. Use 0 for no initial delay. Behavior when not specified depends on the server's default configuration." + }, + "maxConcurrency": { + "type": "number", + "description": "Maximum number of concurrent executions for this consumer (OPTIONAL) Must be at least 1 if specified. Behavior when not specified depends on the server's default configuration." + } + }, + "required": [ + "topic", + "type" + ], + "type": "object", + "description": "Queue trigger input event for v2beta (from vercel.json config). Consumer name is implicitly derived from the function path. Only one trigger per function is allowed." + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "schedule/v1beta" + ], + "description": "Event type - must be \"schedule/v1beta\" (REQUIRED)" + } + }, + "required": [ + "type" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "supportsCancellation": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "type": "object" + }, + "type": "object" + }, + "isInstantStatic": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether this deployment completed through the instant static fast path." + }, + "monorepoManager": { + "nullable": true, + "type": "string" + }, + "ownerId": { + "type": "string" + }, + "passiveConnectConfigurationId": { + "type": "string", + "description": "Since November 2023 this field defines a Secure Compute network that will only be used to deploy passive lambdas to (as in passiveRegions)" + }, + "routes": { + "nullable": true, + "items": { + "oneOf": [ + { + "properties": { + "src": { + "type": "string" + }, + "dest": { + "type": "string" + }, + "headers": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "methods": { + "items": { + "type": "string" + }, + "type": "array" + }, + "continue": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "override": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "caseSensitive": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "check": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "important": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "status": { + "type": "number" + }, + "has": { + "items": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "host" + ] + }, + "value": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "eq": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "neq": { + "type": "string" + }, + "inc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "ninc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "pre": { + "type": "string" + }, + "suf": { + "type": "string" + }, + "re": { + "type": "string" + }, + "gt": { + "type": "number" + }, + "gte": { + "type": "number" + }, + "lt": { + "type": "number" + }, + "lte": { + "type": "number" + } + }, + "type": "object" + } + ] + } + }, + "required": [ + "type", + "value" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "cookie", + "header", + "query" + ] + }, + "key": { + "type": "string" + }, + "value": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "eq": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "neq": { + "type": "string" + }, + "inc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "ninc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "pre": { + "type": "string" + }, + "suf": { + "type": "string" + }, + "re": { + "type": "string" + }, + "gt": { + "type": "number" + }, + "gte": { + "type": "number" + }, + "lt": { + "type": "number" + }, + "lte": { + "type": "number" + } + }, + "type": "object" + } + ] + } + }, + "required": [ + "key", + "type" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "missing": { + "items": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "host" + ] + }, + "value": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "eq": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "neq": { + "type": "string" + }, + "inc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "ninc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "pre": { + "type": "string" + }, + "suf": { + "type": "string" + }, + "re": { + "type": "string" + }, + "gt": { + "type": "number" + }, + "gte": { + "type": "number" + }, + "lt": { + "type": "number" + }, + "lte": { + "type": "number" + } + }, + "type": "object" + } + ] + } + }, + "required": [ + "type", + "value" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "cookie", + "header", + "query" + ] + }, + "key": { + "type": "string" + }, + "value": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "eq": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "neq": { + "type": "string" + }, + "inc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "ninc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "pre": { + "type": "string" + }, + "suf": { + "type": "string" + }, + "re": { + "type": "string" + }, + "gt": { + "type": "number" + }, + "gte": { + "type": "number" + }, + "lt": { + "type": "number" + }, + "lte": { + "type": "number" + } + }, + "type": "object" + } + ] + } + }, + "required": [ + "key", + "type" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "mitigate": { + "properties": { + "action": { + "type": "string", + "enum": [ + "challenge", + "deny" + ] + } + }, + "required": [ + "action" + ], + "type": "object" + }, + "transforms": { + "items": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "request.headers", + "request.query", + "response.headers" + ] + }, + "op": { + "type": "string", + "enum": [ + "append", + "delete", + "set" + ] + }, + "target": { + "properties": { + "key": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "eq": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "neq": { + "type": "string" + }, + "inc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "ninc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "pre": { + "type": "string" + }, + "suf": { + "type": "string" + }, + "gt": { + "type": "number" + }, + "gte": { + "type": "number" + }, + "lt": { + "type": "number" + }, + "lte": { + "type": "number" + } + }, + "type": "object" + } + ] + } + }, + "required": [ + "key" + ], + "type": "object" + }, + "args": { + "oneOf": [ + { + "type": "string" + }, + { + "items": { + "type": "string" + }, + "type": "array" + } + ] + }, + "env": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "op", + "target", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "request.path" + ] + }, + "op": { + "type": "string", + "enum": [ + "set" + ] + }, + "args": { + "type": "string" + }, + "env": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "args", + "op", + "type" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "env": { + "items": { + "type": "string" + }, + "type": "array" + }, + "locale": { + "properties": { + "redirect": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "cookie": { + "type": "string" + } + }, + "type": "object" + }, + "source": { + "type": "string", + "description": "Aliases for `src`, `dest`, and `status`. These provide consistency with the `rewrites`, `redirects`, and `headers` fields which use `source`, `destination`, and `statusCode`. During normalization, the string forms are converted to their canonical forms (`src`, `dest`, `status`) and stripped from the route object. `destination` may also be a service-targeted object, in which case routing is delegated into the named service's internal route table and the object is preserved as-is (not folded into `dest`)." + }, + "destination": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "service" + ], + "description": "Optional explicit format marker. The destination is identified by the presence of `service`, so `type` is no longer required." + }, + "service": { + "type": "string" + }, + "path": { + "type": "string", + "description": "Routing-only path used to select a route inside the target service." + } + }, + "required": [ + "service" + ], + "type": "object" + } + ] + }, + "statusCode": { + "type": "number" + }, + "middlewarePath": { + "type": "string", + "description": "A middleware key within the `output` key under the build result. Overrides a `middleware` definition." + }, + "middlewareRawSrc": { + "items": { + "type": "string" + }, + "type": "array", + "description": "The original middleware matchers." + }, + "middleware": { + "type": "number", + "description": "A middleware index in the `middleware` key under the build result" + }, + "respectOriginCacheControl": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "src" + ], + "type": "object" + }, + { + "properties": { + "handle": { + "type": "string", + "enum": [ + "error", + "filesystem", + "hit", + "miss", + "resource", + "rewrite" + ] + }, + "src": { + "type": "string" + }, + "dest": { + "type": "string" + }, + "status": { + "type": "number" + } + }, + "required": [ + "handle" + ], + "type": "object" + }, + { + "properties": { + "src": { + "type": "string" + }, + "continue": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "middleware": { + "type": "number", + "enum": [ + 0 + ] + } + }, + "required": [ + "continue", + "middleware", + "src" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "services": { + "items": { + "oneOf": [ + { + "properties": { + "schema": { + "type": "string", + "enum": [ + "experimentalServices" + ] + }, + "name": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "cron", + "job", + "web", + "worker" + ] + }, + "trigger": { + "type": "string", + "enum": [ + "queue", + "schedule", + "workflow" + ] + }, + "group": { + "type": "string" + }, + "workspace": { + "type": "string" + }, + "entrypoint": { + "type": "string" + }, + "framework": { + "type": "string" + }, + "builder": { + "properties": { + "use": { + "type": "string" + }, + "src": { + "type": "string" + }, + "config": { + "properties": { + "bunVersion": { + "type": "string" + }, + "maxLambdaSize": { + "type": "string" + }, + "includeFiles": { + "oneOf": [ + { + "type": "string" + }, + { + "items": { + "type": "string" + }, + "type": "array" + } + ] + }, + "excludeFiles": { + "oneOf": [ + { + "type": "string" + }, + { + "items": { + "type": "string" + }, + "type": "array" + } + ] + }, + "bundle": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "ldsflags": { + "type": "string" + }, + "helpers": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "rust": { + "type": "string" + }, + "debug": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "zeroConfig": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "import": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "functions": { + "additionalProperties": { + "properties": { + "architecture": { + "type": "string", + "enum": [ + "arm64", + "x86_64" + ] + }, + "memory": { + "type": "number" + }, + "maxDuration": { + "oneOf": [ + { + "type": "number" + }, + { + "type": "string", + "enum": [ + "max" + ] + } + ] + }, + "affinity": { + "properties": { + "mode": { + "type": "string", + "enum": [ + "strict" + ] + } + }, + "required": [ + "mode" + ], + "type": "object" + }, + "maxConcurrency": { + "type": "number" + }, + "regions": { + "items": { + "type": "string" + }, + "type": "array" + }, + "functionFailoverRegions": { + "items": { + "type": "string" + }, + "type": "array" + }, + "runtime": { + "type": "string" + }, + "includeFiles": { + "type": "string" + }, + "excludeFiles": { + "type": "string" + }, + "experimentalTriggers": { + "items": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "queue/v1beta" + ], + "description": "Event type - must be \"queue/v1beta\" (REQUIRED)" + }, + "consumer": { + "type": "string", + "description": "Name of the consumer group for this trigger (REQUIRED)" + }, + "topic": { + "type": "string", + "description": "Name of the queue topic to consume from (REQUIRED)" + }, + "maxDeliveries": { + "type": "number", + "description": "Maximum number of delivery attempts for message processing (OPTIONAL) This represents the total number of times a message can be delivered, not the number of retries. Must be at least 1 if specified. Behavior when not specified depends on the server's default configuration." + }, + "retryAfterSeconds": { + "type": "number", + "description": "Delay in seconds before retrying failed executions (OPTIONAL) Behavior when not specified depends on the server's default configuration." + }, + "initialDelaySeconds": { + "type": "number", + "description": "Initial delay in seconds before first execution attempt (OPTIONAL) Must be 0 or greater. Use 0 for no initial delay. Behavior when not specified depends on the server's default configuration." + }, + "maxConcurrency": { + "type": "number", + "description": "Maximum number of concurrent executions for this consumer (OPTIONAL) Must be at least 1 if specified. Behavior when not specified depends on the server's default configuration." + } + }, + "required": [ + "consumer", + "topic", + "type" + ], + "type": "object", + "description": "Queue trigger input event for v1beta (from vercel.json config). Requires explicit consumer name." + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "queue/v2beta" + ], + "description": "Event type - must be \"queue/v2beta\" (REQUIRED)" + }, + "topic": { + "type": "string", + "description": "Name of the queue topic to consume from (REQUIRED)" + }, + "maxDeliveries": { + "type": "number", + "description": "Maximum number of delivery attempts for message processing (OPTIONAL) This represents the total number of times a message can be delivered, not the number of retries. Must be at least 1 if specified. Behavior when not specified depends on the server's default configuration." + }, + "retryAfterSeconds": { + "type": "number", + "description": "Delay in seconds before retrying failed executions (OPTIONAL) Behavior when not specified depends on the server's default configuration." + }, + "initialDelaySeconds": { + "type": "number", + "description": "Initial delay in seconds before first execution attempt (OPTIONAL) Must be 0 or greater. Use 0 for no initial delay. Behavior when not specified depends on the server's default configuration." + }, + "maxConcurrency": { + "type": "number", + "description": "Maximum number of concurrent executions for this consumer (OPTIONAL) Must be at least 1 if specified. Behavior when not specified depends on the server's default configuration." + } + }, + "required": [ + "topic", + "type" + ], + "type": "object", + "description": "Queue trigger input event for v2beta (from vercel.json config). Consumer name is implicitly derived from the function path. Only one trigger per function is allowed." + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "schedule/v1beta" + ], + "description": "Event type - must be \"schedule/v1beta\" (REQUIRED)" + } + }, + "required": [ + "type" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "supportsCancellation": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "type": "object" + }, + "type": "object" + }, + "projectSettings": { + "properties": { + "framework": { + "nullable": true, + "type": "string" + }, + "devCommand": { + "nullable": true, + "type": "string" + }, + "installCommand": { + "nullable": true, + "type": "string" + }, + "buildCommand": { + "nullable": true, + "type": "string" + }, + "outputDirectory": { + "nullable": true, + "type": "string" + }, + "rootDirectory": { + "nullable": true, + "type": "string" + }, + "nodeVersion": { + "type": "string" + }, + "monorepoManager": { + "nullable": true, + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "autoExposeSystemEnvs": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "sourceFilesOutsideRootDirectory": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "directoryListing": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "gitForkProtection": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "commandForIgnoringBuildStep": { + "nullable": true, + "type": "string" + } + }, + "type": "object" + }, + "outputDirectory": { + "type": "string" + }, + "installCommand": { + "type": "string" + }, + "buildCommand": { + "type": "string" + }, + "devCommand": { + "type": "string" + }, + "framework": { + "nullable": true, + "type": "string" + }, + "nodeVersion": { + "type": "string" + }, + "middleware": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "middlewareRuntime": { + "type": "string", + "enum": [ + "nodejs" + ], + "description": "Enforced runtime for explicitly configured Routing Middleware." + }, + "middlewareMatcher": { + "oneOf": [ + { + "type": "string" + }, + { + "items": { + "type": "string" + }, + "type": "array", + "description": "Matcher supplied outside of the middleware source module." + } + ] + }, + "serviceName": { + "type": "string", + "description": "Owning service name; scopes per-function config such as the v2beta consumer." + } + }, + "type": "object" + } + }, + "required": [ + "use" + ], + "type": "object" + }, + "runtime": { + "type": "string" + }, + "buildCommand": { + "type": "string" + }, + "installCommand": { + "type": "string" + }, + "preDeployCommand": { + "type": "string" + }, + "routePrefix": { + "type": "string" + }, + "routePrefixSource": { + "type": "string", + "enum": [ + "configured", + "generated" + ] + }, + "subdomain": { + "type": "string" + }, + "schedule": { + "oneOf": [ + { + "type": "string" + }, + { + "items": { + "type": "string" + }, + "type": "array" + } + ] + }, + "handlerFunction": { + "type": "string" + }, + "topics": { + "oneOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "items": { + "properties": { + "topic": { + "type": "string" + }, + "retryAfterSeconds": { + "type": "number" + }, + "initialDelaySeconds": { + "type": "number" + } + }, + "required": [ + "topic" + ], + "type": "object" + }, + "type": "array" + } + ] + }, + "env": { + "additionalProperties": { + "properties": { + "type": { + "type": "string", + "enum": [ + "service-ref" + ] + }, + "service": { + "type": "string" + } + }, + "required": [ + "service", + "type" + ], + "type": "object" + }, + "type": "object" + } + }, + "required": [ + "builder", + "name", + "schema", + "type", + "workspace" + ], + "type": "object", + "description": "Services detected during build from vercel.json experimentalServices or auto-detected from project structure. Used to inject service URLs as environment variables at runtime." + }, + { + "properties": { + "schema": { + "type": "string", + "enum": [ + "experimentalServicesV2" + ] + }, + "name": { + "type": "string" + }, + "root": { + "type": "string", + "description": "Path to the service root, relative to the project root." + }, + "framework": { + "type": "string" + }, + "runtime": { + "type": "string" + }, + "entrypoint": { + "type": "string", + "description": "Resolved entrypoint, relative to the service root." + }, + "command": { + "items": { + "type": "string" + }, + "type": "array", + "description": "Command override for `runtime: \"container\"` services." + }, + "builder": { + "properties": { + "use": { + "type": "string" + }, + "src": { + "type": "string" + }, + "config": { + "properties": { + "bunVersion": { + "type": "string" + }, + "maxLambdaSize": { + "type": "string" + }, + "includeFiles": { + "oneOf": [ + { + "type": "string" + }, + { + "items": { + "type": "string" + }, + "type": "array" + } + ] + }, + "excludeFiles": { + "oneOf": [ + { + "type": "string" + }, + { + "items": { + "type": "string" + }, + "type": "array" + } + ] + }, + "bundle": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "ldsflags": { + "type": "string" + }, + "helpers": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "rust": { + "type": "string" + }, + "debug": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "zeroConfig": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "import": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "functions": { + "additionalProperties": { + "properties": { + "architecture": { + "type": "string", + "enum": [ + "arm64", + "x86_64" + ] + }, + "memory": { + "type": "number" + }, + "maxDuration": { + "oneOf": [ + { + "type": "number" + }, + { + "type": "string", + "enum": [ + "max" + ] + } + ] + }, + "affinity": { + "properties": { + "mode": { + "type": "string", + "enum": [ + "strict" + ] + } + }, + "required": [ + "mode" + ], + "type": "object" + }, + "maxConcurrency": { + "type": "number" + }, + "regions": { + "items": { + "type": "string" + }, + "type": "array" + }, + "functionFailoverRegions": { + "items": { + "type": "string" + }, + "type": "array" + }, + "runtime": { + "type": "string" + }, + "includeFiles": { + "type": "string" + }, + "excludeFiles": { + "type": "string" + }, + "experimentalTriggers": { + "items": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "queue/v1beta" + ], + "description": "Event type - must be \"queue/v1beta\" (REQUIRED)" + }, + "consumer": { + "type": "string", + "description": "Name of the consumer group for this trigger (REQUIRED)" + }, + "topic": { + "type": "string", + "description": "Name of the queue topic to consume from (REQUIRED)" + }, + "maxDeliveries": { + "type": "number", + "description": "Maximum number of delivery attempts for message processing (OPTIONAL) This represents the total number of times a message can be delivered, not the number of retries. Must be at least 1 if specified. Behavior when not specified depends on the server's default configuration." + }, + "retryAfterSeconds": { + "type": "number", + "description": "Delay in seconds before retrying failed executions (OPTIONAL) Behavior when not specified depends on the server's default configuration." + }, + "initialDelaySeconds": { + "type": "number", + "description": "Initial delay in seconds before first execution attempt (OPTIONAL) Must be 0 or greater. Use 0 for no initial delay. Behavior when not specified depends on the server's default configuration." + }, + "maxConcurrency": { + "type": "number", + "description": "Maximum number of concurrent executions for this consumer (OPTIONAL) Must be at least 1 if specified. Behavior when not specified depends on the server's default configuration." + } + }, + "required": [ + "consumer", + "topic", + "type" + ], + "type": "object", + "description": "Queue trigger input event for v1beta (from vercel.json config). Requires explicit consumer name." + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "queue/v2beta" + ], + "description": "Event type - must be \"queue/v2beta\" (REQUIRED)" + }, + "topic": { + "type": "string", + "description": "Name of the queue topic to consume from (REQUIRED)" + }, + "maxDeliveries": { + "type": "number", + "description": "Maximum number of delivery attempts for message processing (OPTIONAL) This represents the total number of times a message can be delivered, not the number of retries. Must be at least 1 if specified. Behavior when not specified depends on the server's default configuration." + }, + "retryAfterSeconds": { + "type": "number", + "description": "Delay in seconds before retrying failed executions (OPTIONAL) Behavior when not specified depends on the server's default configuration." + }, + "initialDelaySeconds": { + "type": "number", + "description": "Initial delay in seconds before first execution attempt (OPTIONAL) Must be 0 or greater. Use 0 for no initial delay. Behavior when not specified depends on the server's default configuration." + }, + "maxConcurrency": { + "type": "number", + "description": "Maximum number of concurrent executions for this consumer (OPTIONAL) Must be at least 1 if specified. Behavior when not specified depends on the server's default configuration." + } + }, + "required": [ + "topic", + "type" + ], + "type": "object", + "description": "Queue trigger input event for v2beta (from vercel.json config). Consumer name is implicitly derived from the function path. Only one trigger per function is allowed." + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "schedule/v1beta" + ], + "description": "Event type - must be \"schedule/v1beta\" (REQUIRED)" + } + }, + "required": [ + "type" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "supportsCancellation": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "type": "object" + }, + "type": "object" + }, + "projectSettings": { + "properties": { + "framework": { + "nullable": true, + "type": "string" + }, + "devCommand": { + "nullable": true, + "type": "string" + }, + "installCommand": { + "nullable": true, + "type": "string" + }, + "buildCommand": { + "nullable": true, + "type": "string" + }, + "outputDirectory": { + "nullable": true, + "type": "string" + }, + "rootDirectory": { + "nullable": true, + "type": "string" + }, + "nodeVersion": { + "type": "string" + }, + "monorepoManager": { + "nullable": true, + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "autoExposeSystemEnvs": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "sourceFilesOutsideRootDirectory": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "directoryListing": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "gitForkProtection": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "commandForIgnoringBuildStep": { + "nullable": true, + "type": "string" + } + }, + "type": "object" + }, + "outputDirectory": { + "type": "string" + }, + "installCommand": { + "type": "string" + }, + "buildCommand": { + "type": "string" + }, + "devCommand": { + "type": "string" + }, + "framework": { + "nullable": true, + "type": "string" + }, + "nodeVersion": { + "type": "string" + }, + "middleware": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "middlewareRuntime": { + "type": "string", + "enum": [ + "nodejs" + ], + "description": "Enforced runtime for explicitly configured Routing Middleware." + }, + "middlewareMatcher": { + "oneOf": [ + { + "type": "string" + }, + { + "items": { + "type": "string" + }, + "type": "array", + "description": "Matcher supplied outside of the middleware source module." + } + ] + }, + "serviceName": { + "type": "string", + "description": "Owning service name; scopes per-function config such as the v2beta consumer." + } + }, + "type": "object" + } + }, + "required": [ + "use" + ], + "type": "object", + "description": "Builder selected by the resolver." + }, + "installCommand": { + "type": "string" + }, + "buildCommand": { + "type": "string" + }, + "devCommand": { + "type": "string" + }, + "ignoreCommand": { + "type": "string" + }, + "outputDirectory": { + "type": "string" + }, + "bindings": { + "items": { + "properties": { + "type": { + "type": "string", + "enum": [ + "service" + ], + "description": "If present, must be `\"service\"` for Service-to-Service HTTP bindings." + }, + "service": { + "type": "string", + "description": "Target service name from `services`." + }, + "format": { + "type": "string", + "enum": [ + "url" + ], + "description": "Generated value shape, must be `\"url\"`." + }, + "env": { + "type": "string", + "description": "Environment variable name that will store the generated value" + } + }, + "required": [ + "env", + "format", + "service" + ], + "type": "object", + "description": "Caller-side bindings to other services." + }, + "type": "array", + "description": "Caller-side bindings to other services." + }, + "functions": { + "additionalProperties": { + "properties": { + "architecture": { + "type": "string", + "enum": [ + "arm64", + "x86_64" + ] + }, + "memory": { + "type": "number" + }, + "maxDuration": { + "oneOf": [ + { + "type": "number" + }, + { + "type": "string", + "enum": [ + "max" + ] + } + ] + }, + "affinity": { + "properties": { + "mode": { + "type": "string", + "enum": [ + "strict" + ] + } + }, + "required": [ + "mode" + ], + "type": "object" + }, + "maxConcurrency": { + "type": "number" + }, + "regions": { + "items": { + "type": "string" + }, + "type": "array" + }, + "functionFailoverRegions": { + "items": { + "type": "string" + }, + "type": "array" + }, + "runtime": { + "type": "string" + }, + "includeFiles": { + "type": "string" + }, + "excludeFiles": { + "type": "string" + }, + "experimentalTriggers": { + "items": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "queue/v1beta" + ], + "description": "Event type - must be \"queue/v1beta\" (REQUIRED)" + }, + "consumer": { + "type": "string", + "description": "Name of the consumer group for this trigger (REQUIRED)" + }, + "topic": { + "type": "string", + "description": "Name of the queue topic to consume from (REQUIRED)" + }, + "maxDeliveries": { + "type": "number", + "description": "Maximum number of delivery attempts for message processing (OPTIONAL) This represents the total number of times a message can be delivered, not the number of retries. Must be at least 1 if specified. Behavior when not specified depends on the server's default configuration." + }, + "retryAfterSeconds": { + "type": "number", + "description": "Delay in seconds before retrying failed executions (OPTIONAL) Behavior when not specified depends on the server's default configuration." + }, + "initialDelaySeconds": { + "type": "number", + "description": "Initial delay in seconds before first execution attempt (OPTIONAL) Must be 0 or greater. Use 0 for no initial delay. Behavior when not specified depends on the server's default configuration." + }, + "maxConcurrency": { + "type": "number", + "description": "Maximum number of concurrent executions for this consumer (OPTIONAL) Must be at least 1 if specified. Behavior when not specified depends on the server's default configuration." + } + }, + "required": [ + "consumer", + "topic", + "type" + ], + "type": "object", + "description": "Queue trigger input event for v1beta (from vercel.json config). Requires explicit consumer name." + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "queue/v2beta" + ], + "description": "Event type - must be \"queue/v2beta\" (REQUIRED)" + }, + "topic": { + "type": "string", + "description": "Name of the queue topic to consume from (REQUIRED)" + }, + "maxDeliveries": { + "type": "number", + "description": "Maximum number of delivery attempts for message processing (OPTIONAL) This represents the total number of times a message can be delivered, not the number of retries. Must be at least 1 if specified. Behavior when not specified depends on the server's default configuration." + }, + "retryAfterSeconds": { + "type": "number", + "description": "Delay in seconds before retrying failed executions (OPTIONAL) Behavior when not specified depends on the server's default configuration." + }, + "initialDelaySeconds": { + "type": "number", + "description": "Initial delay in seconds before first execution attempt (OPTIONAL) Must be 0 or greater. Use 0 for no initial delay. Behavior when not specified depends on the server's default configuration." + }, + "maxConcurrency": { + "type": "number", + "description": "Maximum number of concurrent executions for this consumer (OPTIONAL) Must be at least 1 if specified. Behavior when not specified depends on the server's default configuration." + } + }, + "required": [ + "topic", + "type" + ], + "type": "object", + "description": "Queue trigger input event for v2beta (from vercel.json config). Consumer name is implicitly derived from the function path. Only one trigger per function is allowed." + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "schedule/v1beta" + ], + "description": "Event type - must be \"schedule/v1beta\" (REQUIRED)" + } + }, + "required": [ + "type" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "supportsCancellation": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "type": "object", + "description": "Function configuration scoped to this service." + }, + "type": "object", + "description": "Function configuration scoped to this service." + }, + "headers": { + "items": { + "properties": { + "source": { + "type": "string" + }, + "headers": { + "items": { + "properties": { + "key": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "required": [ + "key", + "value" + ], + "type": "object" + }, + "type": "array" + }, + "has": { + "items": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "host" + ] + }, + "value": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "eq": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "neq": { + "type": "string" + }, + "inc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "ninc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "pre": { + "type": "string" + }, + "suf": { + "type": "string" + }, + "re": { + "type": "string" + }, + "gt": { + "type": "number" + }, + "gte": { + "type": "number" + }, + "lt": { + "type": "number" + }, + "lte": { + "type": "number" + } + }, + "type": "object" + } + ] + } + }, + "required": [ + "type", + "value" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "cookie", + "header", + "query" + ] + }, + "key": { + "type": "string" + }, + "value": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "eq": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "neq": { + "type": "string" + }, + "inc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "ninc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "pre": { + "type": "string" + }, + "suf": { + "type": "string" + }, + "re": { + "type": "string" + }, + "gt": { + "type": "number" + }, + "gte": { + "type": "number" + }, + "lt": { + "type": "number" + }, + "lte": { + "type": "number" + } + }, + "type": "object" + } + ] + } + }, + "required": [ + "key", + "type" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "missing": { + "items": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "host" + ] + }, + "value": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "eq": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "neq": { + "type": "string" + }, + "inc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "ninc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "pre": { + "type": "string" + }, + "suf": { + "type": "string" + }, + "re": { + "type": "string" + }, + "gt": { + "type": "number" + }, + "gte": { + "type": "number" + }, + "lt": { + "type": "number" + }, + "lte": { + "type": "number" + } + }, + "type": "object" + } + ] + } + }, + "required": [ + "type", + "value" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "cookie", + "header", + "query" + ] + }, + "key": { + "type": "string" + }, + "value": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "eq": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "neq": { + "type": "string" + }, + "inc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "ninc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "pre": { + "type": "string" + }, + "suf": { + "type": "string" + }, + "re": { + "type": "string" + }, + "gt": { + "type": "number" + }, + "gte": { + "type": "number" + }, + "lt": { + "type": "number" + }, + "lte": { + "type": "number" + } + }, + "type": "object" + } + ] + } + }, + "required": [ + "key", + "type" + ], + "type": "object" + } + ] + }, + "type": "array" + } + }, + "required": [ + "headers", + "source" + ], + "type": "object" + }, + "type": "array" + }, + "redirects": { + "items": { + "properties": { + "source": { + "type": "string" + }, + "destination": { + "type": "string" + }, + "permanent": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "statusCode": { + "type": "number" + }, + "has": { + "items": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "host" + ] + }, + "value": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "eq": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "neq": { + "type": "string" + }, + "inc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "ninc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "pre": { + "type": "string" + }, + "suf": { + "type": "string" + }, + "re": { + "type": "string" + }, + "gt": { + "type": "number" + }, + "gte": { + "type": "number" + }, + "lt": { + "type": "number" + }, + "lte": { + "type": "number" + } + }, + "type": "object" + } + ] + } + }, + "required": [ + "type", + "value" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "cookie", + "header", + "query" + ] + }, + "key": { + "type": "string" + }, + "value": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "eq": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "neq": { + "type": "string" + }, + "inc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "ninc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "pre": { + "type": "string" + }, + "suf": { + "type": "string" + }, + "re": { + "type": "string" + }, + "gt": { + "type": "number" + }, + "gte": { + "type": "number" + }, + "lt": { + "type": "number" + }, + "lte": { + "type": "number" + } + }, + "type": "object" + } + ] + } + }, + "required": [ + "key", + "type" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "missing": { + "items": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "host" + ] + }, + "value": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "eq": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "neq": { + "type": "string" + }, + "inc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "ninc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "pre": { + "type": "string" + }, + "suf": { + "type": "string" + }, + "re": { + "type": "string" + }, + "gt": { + "type": "number" + }, + "gte": { + "type": "number" + }, + "lt": { + "type": "number" + }, + "lte": { + "type": "number" + } + }, + "type": "object" + } + ] + } + }, + "required": [ + "type", + "value" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "cookie", + "header", + "query" + ] + }, + "key": { + "type": "string" + }, + "value": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "eq": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "neq": { + "type": "string" + }, + "inc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "ninc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "pre": { + "type": "string" + }, + "suf": { + "type": "string" + }, + "re": { + "type": "string" + }, + "gt": { + "type": "number" + }, + "gte": { + "type": "number" + }, + "lt": { + "type": "number" + }, + "lte": { + "type": "number" + } + }, + "type": "object" + } + ] + } + }, + "required": [ + "key", + "type" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "env": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "destination", + "source" + ], + "type": "object" + }, + "type": "array" + }, + "rewrites": { + "items": { + "properties": { + "source": { + "type": "string" + }, + "destination": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "service" + ], + "description": "Optional explicit format marker. The destination is identified by the presence of `service`, so `type` is no longer required." + }, + "service": { + "type": "string" + }, + "path": { + "type": "string", + "description": "Routing-only path used to select a route inside the target service." + } + }, + "required": [ + "service" + ], + "type": "object" + } + ] + }, + "transforms": { + "items": { + "properties": { + "type": { + "type": "string", + "enum": [ + "request.path" + ] + }, + "op": { + "type": "string", + "enum": [ + "set" + ] + }, + "args": { + "type": "string" + }, + "env": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "args", + "op", + "type" + ], + "type": "object" + }, + "type": "array" + }, + "has": { + "items": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "host" + ] + }, + "value": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "eq": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "neq": { + "type": "string" + }, + "inc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "ninc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "pre": { + "type": "string" + }, + "suf": { + "type": "string" + }, + "re": { + "type": "string" + }, + "gt": { + "type": "number" + }, + "gte": { + "type": "number" + }, + "lt": { + "type": "number" + }, + "lte": { + "type": "number" + } + }, + "type": "object" + } + ] + } + }, + "required": [ + "type", + "value" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "cookie", + "header", + "query" + ] + }, + "key": { + "type": "string" + }, + "value": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "eq": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "neq": { + "type": "string" + }, + "inc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "ninc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "pre": { + "type": "string" + }, + "suf": { + "type": "string" + }, + "re": { + "type": "string" + }, + "gt": { + "type": "number" + }, + "gte": { + "type": "number" + }, + "lt": { + "type": "number" + }, + "lte": { + "type": "number" + } + }, + "type": "object" + } + ] + } + }, + "required": [ + "key", + "type" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "missing": { + "items": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "host" + ] + }, + "value": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "eq": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "neq": { + "type": "string" + }, + "inc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "ninc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "pre": { + "type": "string" + }, + "suf": { + "type": "string" + }, + "re": { + "type": "string" + }, + "gt": { + "type": "number" + }, + "gte": { + "type": "number" + }, + "lt": { + "type": "number" + }, + "lte": { + "type": "number" + } + }, + "type": "object" + } + ] + } + }, + "required": [ + "type", + "value" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "cookie", + "header", + "query" + ] + }, + "key": { + "type": "string" + }, + "value": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "eq": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "neq": { + "type": "string" + }, + "inc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "ninc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "pre": { + "type": "string" + }, + "suf": { + "type": "string" + }, + "re": { + "type": "string" + }, + "gt": { + "type": "number" + }, + "gte": { + "type": "number" + }, + "lt": { + "type": "number" + }, + "lte": { + "type": "number" + } + }, + "type": "object" + } + ] + } + }, + "required": [ + "key", + "type" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "statusCode": { + "type": "number" + }, + "env": { + "items": { + "type": "string" + }, + "type": "array" + }, + "respectOriginCacheControl": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "destination", + "source" + ], + "type": "object" + }, + "type": "array" + }, + "routes": { + "items": { + "oneOf": [ + { + "properties": { + "src": { + "type": "string" + }, + "dest": { + "type": "string" + }, + "headers": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "methods": { + "items": { + "type": "string" + }, + "type": "array" + }, + "continue": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "override": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "caseSensitive": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "check": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "important": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "status": { + "type": "number" + }, + "has": { + "items": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "host" + ] + }, + "value": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "eq": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "neq": { + "type": "string" + }, + "inc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "ninc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "pre": { + "type": "string" + }, + "suf": { + "type": "string" + }, + "re": { + "type": "string" + }, + "gt": { + "type": "number" + }, + "gte": { + "type": "number" + }, + "lt": { + "type": "number" + }, + "lte": { + "type": "number" + } + }, + "type": "object" + } + ] + } + }, + "required": [ + "type", + "value" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "cookie", + "header", + "query" + ] + }, + "key": { + "type": "string" + }, + "value": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "eq": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "neq": { + "type": "string" + }, + "inc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "ninc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "pre": { + "type": "string" + }, + "suf": { + "type": "string" + }, + "re": { + "type": "string" + }, + "gt": { + "type": "number" + }, + "gte": { + "type": "number" + }, + "lt": { + "type": "number" + }, + "lte": { + "type": "number" + } + }, + "type": "object" + } + ] + } + }, + "required": [ + "key", + "type" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "missing": { + "items": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "host" + ] + }, + "value": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "eq": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "neq": { + "type": "string" + }, + "inc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "ninc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "pre": { + "type": "string" + }, + "suf": { + "type": "string" + }, + "re": { + "type": "string" + }, + "gt": { + "type": "number" + }, + "gte": { + "type": "number" + }, + "lt": { + "type": "number" + }, + "lte": { + "type": "number" + } + }, + "type": "object" + } + ] + } + }, + "required": [ + "type", + "value" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "cookie", + "header", + "query" + ] + }, + "key": { + "type": "string" + }, + "value": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "eq": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "neq": { + "type": "string" + }, + "inc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "ninc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "pre": { + "type": "string" + }, + "suf": { + "type": "string" + }, + "re": { + "type": "string" + }, + "gt": { + "type": "number" + }, + "gte": { + "type": "number" + }, + "lt": { + "type": "number" + }, + "lte": { + "type": "number" + } + }, + "type": "object" + } + ] + } + }, + "required": [ + "key", + "type" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "mitigate": { + "properties": { + "action": { + "type": "string", + "enum": [ + "challenge", + "deny" + ] + } + }, + "required": [ + "action" + ], + "type": "object" + }, + "transforms": { + "items": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "request.headers", + "request.query", + "response.headers" + ] + }, + "op": { + "type": "string", + "enum": [ + "append", + "delete", + "set" + ] + }, + "target": { + "properties": { + "key": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "eq": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "neq": { + "type": "string" + }, + "inc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "ninc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "pre": { + "type": "string" + }, + "suf": { + "type": "string" + }, + "gt": { + "type": "number" + }, + "gte": { + "type": "number" + }, + "lt": { + "type": "number" + }, + "lte": { + "type": "number" + } + }, + "type": "object" + } + ] + } + }, + "required": [ + "key" + ], + "type": "object" + }, + "args": { + "oneOf": [ + { + "type": "string" + }, + { + "items": { + "type": "string" + }, + "type": "array" + } + ] + }, + "env": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "op", + "target", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "request.path" + ] + }, + "op": { + "type": "string", + "enum": [ + "set" + ] + }, + "args": { + "type": "string" + }, + "env": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "args", + "op", + "type" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "env": { + "items": { + "type": "string" + }, + "type": "array" + }, + "locale": { + "properties": { + "redirect": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "cookie": { + "type": "string" + } + }, + "type": "object" + }, + "source": { + "type": "string", + "description": "Aliases for `src`, `dest`, and `status`. These provide consistency with the `rewrites`, `redirects`, and `headers` fields which use `source`, `destination`, and `statusCode`. During normalization, the string forms are converted to their canonical forms (`src`, `dest`, `status`) and stripped from the route object. `destination` may also be a service-targeted object, in which case routing is delegated into the named service's internal route table and the object is preserved as-is (not folded into `dest`)." + }, + "destination": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "service" + ], + "description": "Optional explicit format marker. The destination is identified by the presence of `service`, so `type` is no longer required." + }, + "service": { + "type": "string" + }, + "path": { + "type": "string", + "description": "Routing-only path used to select a route inside the target service." + } + }, + "required": [ + "service" + ], + "type": "object" + } + ] + }, + "statusCode": { + "type": "number" + }, + "middlewarePath": { + "type": "string", + "description": "A middleware key within the `output` key under the build result. Overrides a `middleware` definition." + }, + "middlewareRawSrc": { + "items": { + "type": "string" + }, + "type": "array", + "description": "The original middleware matchers." + }, + "middleware": { + "type": "number", + "description": "A middleware index in the `middleware` key under the build result" + }, + "respectOriginCacheControl": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "src" + ], + "type": "object" + }, + { + "properties": { + "handle": { + "type": "string", + "enum": [ + "error", + "filesystem", + "hit", + "miss", + "resource", + "rewrite" + ] + }, + "src": { + "type": "string" + }, + "dest": { + "type": "string" + }, + "status": { + "type": "number" + } + }, + "required": [ + "handle" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "cleanUrls": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "trailingSlash": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "builder", + "name", + "root", + "schema" + ], + "type": "object", + "description": "Services detected during build from vercel.json experimentalServices or auto-detected from project structure. Used to inject service URLs as environment variables at runtime." + } + ] + }, + "type": "array", + "description": "Services detected during build from vercel.json experimentalServices or auto-detected from project structure. Used to inject service URLs as environment variables at runtime." + }, + "gitRepo": { + "nullable": true, + "oneOf": [ + { + "properties": { + "namespace": { + "type": "string" + }, + "projectId": { + "type": "number" + }, + "type": { + "type": "string", + "enum": [ + "gitlab" + ] + }, + "url": { + "type": "string" + }, + "path": { + "type": "string" + }, + "defaultBranch": { + "type": "string" + }, + "name": { + "type": "string" + }, + "private": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "ownerType": { + "type": "string", + "enum": [ + "team", + "user" + ] + } + }, + "required": [ + "defaultBranch", + "name", + "namespace", + "ownerType", + "path", + "private", + "projectId", + "type", + "url" + ], + "type": "object" + }, + { + "properties": { + "org": { + "type": "string" + }, + "repo": { + "type": "string" + }, + "repoId": { + "type": "number" + }, + "type": { + "type": "string", + "enum": [ + "github" + ] + }, + "repoOwnerId": { + "type": "number" + }, + "path": { + "type": "string" + }, + "defaultBranch": { + "type": "string" + }, + "name": { + "type": "string" + }, + "private": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "ownerType": { + "type": "string", + "enum": [ + "team", + "user" + ] + } + }, + "required": [ + "defaultBranch", + "name", + "org", + "ownerType", + "path", + "private", + "repo", + "repoId", + "repoOwnerId", + "type" + ], + "type": "object" + }, + { + "properties": { + "owner": { + "type": "string" + }, + "repoUuid": { + "type": "string" + }, + "slug": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "bitbucket" + ] + }, + "workspaceUuid": { + "type": "string" + }, + "path": { + "type": "string" + }, + "defaultBranch": { + "type": "string" + }, + "name": { + "type": "string" + }, + "private": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "ownerType": { + "type": "string", + "enum": [ + "team", + "user" + ] + } + }, + "required": [ + "defaultBranch", + "name", + "owner", + "ownerType", + "path", + "private", + "repoUuid", + "slug", + "type", + "workspaceUuid" + ], + "type": "object" + }, + { + "properties": { + "org": { + "type": "string" + }, + "repo": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "vercel" + ] + }, + "path": { + "type": "string" + }, + "defaultBranch": { + "type": "string" + }, + "name": { + "type": "string" + }, + "private": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "ownerType": { + "type": "string", + "enum": [ + "team", + "user" + ] + } + }, + "required": [ + "defaultBranch", + "name", + "org", + "ownerType", + "path", + "private", + "repo", + "type" + ], + "type": "object" + }, + { + "properties": { + "owner": { + "type": "string", + "description": "Owner (namespace) slug." + }, + "repo": { + "type": "string" + }, + "repoId": { + "type": "string", + "description": "Origin repository id." + }, + "type": { + "type": "string", + "enum": [ + "cursor-origin" + ] + }, + "path": { + "type": "string" + }, + "defaultBranch": { + "type": "string" + }, + "name": { + "type": "string" + }, + "private": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "ownerType": { + "type": "string", + "enum": [ + "team", + "user" + ] + } + }, + "required": [ + "defaultBranch", + "name", + "owner", + "ownerType", + "path", + "private", + "repo", + "repoId", + "type" + ], + "type": "object" + } + ] + }, + "flags": { + "oneOf": [ + { + "properties": { + "definitions": { + "additionalProperties": { + "properties": { + "options": { + "items": { + "properties": { + "value": { + "$ref": "#/components/schemas/FlagJSONValue" + }, + "label": { + "type": "string" + } + }, + "required": [ + "value" + ], + "type": "object" + }, + "type": "array" + }, + "url": { + "type": "string" + }, + "description": { + "type": "string" + } + }, + "type": "object" + }, + "type": "object" + } + }, + "required": [ + "definitions" + ], + "type": "object", + "description": "Flags defined in the Build Output API, used by this deployment. Primarily used by the Toolbar to know about the used flags." + }, + { + "items": { + "type": "object", + "description": "Flags defined in the Build Output API, used by this deployment. Primarily used by the Toolbar to know about the used flags." + }, + "type": "array", + "description": "Flags defined in the Build Output API, used by this deployment. Primarily used by the Toolbar to know about the used flags." + } + ] + }, + "microfrontends": { + "oneOf": [ + { + "properties": { + "isDefaultApp": { + "type": "boolean", + "enum": [ + false + ] + }, + "defaultAppProjectName": { + "type": "string", + "description": "The project name of the default app of this deployment's microfrontends group." + }, + "defaultRoute": { + "type": "string", + "description": "A path that is used to take screenshots and as the default path in preview links when a domain for this microfrontend is shown in the UI." + }, + "groupIds": { + "type": "array", + "items": { + "type": "string" + }, + "minItems": 1, + "description": "The group of microfrontends that this project belongs to. Each microfrontend project must belong to a microfrontends group that is the set of microfrontends that are used together." + } + }, + "required": [ + "defaultAppProjectName", + "groupIds" + ], + "type": "object" + }, + { + "properties": { + "isDefaultApp": { + "type": "boolean", + "enum": [ + true + ] + }, + "mfeConfigUploadState": { + "type": "string", + "enum": [ + "no_config", + "success", + "waiting_on_build" + ], + "description": "The result of the microfrontends config upload during deployment creation / build. Only set for default app deployments. The config upload is attempted during deployment create, and then again during the build. If the config is not in the root directory, or the deployment is prebuilt, the config cannot be uploaded during deployment create. The upload during deployment build finds the config even if it's not in the root directory, as it has access to all files. Uploading the config during create is ideal, as then all child deployments are guaranteed to have access to the default app deployment config even if the default app has not yet started building. If the config is not uploaded, the child app will show as building until the config has been uploaded during the default app build. - `success` - The config was uploaded successfully, either when the deployment was created or during the build. - `waiting_on_build` - The config could not be uploaded during deployment create, will be attempted again during the build. - `no_config` - No config was found. Only set once the build has not found the config in any of the deployment's files. - `undefined` - Legacy deployments, or there was an error uploading the config during deployment create." + }, + "defaultAppProjectName": { + "type": "string", + "description": "The project name of the default app of this deployment's microfrontends group." + }, + "defaultRoute": { + "type": "string", + "description": "A path that is used to take screenshots and as the default path in preview links when a domain for this microfrontend is shown in the UI." + }, + "groupIds": { + "type": "array", + "items": { + "type": "string" + }, + "minItems": 1, + "description": "The group of microfrontends that this project belongs to. Each microfrontend project must belong to a microfrontends group that is the set of microfrontends that are used together." + } + }, + "required": [ + "defaultAppProjectName", + "groupIds", + "isDefaultApp" + ], + "type": "object" + } + ] + }, + "platform": { + "properties": { + "source": { + "properties": { + "name": { + "type": "string", + "description": "Display name of the platform." + } + }, + "required": [ + "name" + ], + "type": "object", + "description": "The external platform that created the deployment (e.g. its display name)." + }, + "origin": { + "properties": { + "type": { + "type": "string", + "enum": [ + "id", + "url" + ], + "description": "Whether the value is an opaque identifier or a URL." + }, + "value": { + "type": "string", + "description": "The identifier or URL pointing to the originating entity." + } + }, + "required": [ + "type", + "value" + ], + "type": "object", + "description": "Reference back to the entity on the platform that initiated the deployment." + }, + "creator": { + "properties": { + "name": { + "type": "string", + "description": "Display name of the platform user." + }, + "avatar": { + "type": "string", + "description": "URL of the platform user's avatar image." + } + }, + "required": [ + "name" + ], + "type": "object", + "description": "The user on the external platform who triggered the deployment." + }, + "meta": { + "additionalProperties": { + "type": "string" + }, + "type": "object", + "description": "Arbitrary key-value metadata provided by the platform." + } + }, + "required": [ + "creator", + "origin", + "source" + ], + "type": "object", + "description": "Metadata about the source platform that triggered the deployment. Allows us to map a deployment back to a platform (e.g. the chat that created it)" + }, + "config": { + "properties": { + "version": { + "type": "number" + }, + "functionType": { + "type": "string", + "enum": [ + "fluid", + "standard" + ] + }, + "functionMemoryType": { + "type": "string", + "enum": [ + "performance", + "performance_xl", + "standard", + "standard_legacy" + ] + }, + "functionTimeout": { + "nullable": true, + "type": "number" + }, + "secureComputePrimaryRegion": { + "nullable": true, + "type": "string" + }, + "secureComputeFallbackRegion": { + "nullable": true, + "type": "string" + }, + "isUsingActiveCPU": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "resourceConfig": { + "properties": { + "buildQueue": { + "properties": { + "configuration": { + "type": "string", + "enum": [ + "SKIP_NAMESPACE_QUEUE", + "WAIT_FOR_NAMESPACE_QUEUE" + ], + "description": "Build resource configuration snapshot for this deployment." + } + }, + "type": "object", + "description": "Build resource configuration snapshot for this deployment." + }, + "elasticConcurrency": { + "type": "string", + "enum": [ + "PROJECT_SETTING", + "SKIP_QUEUE", + "TEAM_SETTING" + ], + "description": "When elastic concurrency is used for this deployment, a value is set. The value tells the reason where the setting was coming from. - TEAM_SETTING: Inherited from team settings - PROJECT_SETTING: Inherited from project settings - SKIP_QUEUE: Manually triggered by user to skip the queues" + }, + "buildMachine": { + "properties": { + "purchaseType": { + "nullable": true, + "type": "string", + "enum": [ + "basic", + "enhanced", + "standard", + "turbo", + null + ], + "description": "Machine type that was used for the build." + } + }, + "type": "object" + } + }, + "type": "object", + "description": "Build resource configuration snapshot for this deployment." + } + }, + "required": [ + "functionMemoryType", + "functionTimeout", + "functionType", + "secureComputeFallbackRegion", + "secureComputePrimaryRegion" + ], + "type": "object", + "description": "Since February 2025 the configuration must include snapshot data at the time of deployment creation to capture properties for the /deployments/:id/config endpoint utilized for displaying Deployment Configuration on the frontend This is optional because older deployments may not have this data captured" + }, + "checks": { + "properties": { + "deployment-alias": { + "properties": { + "state": { + "type": "string", + "enum": [ + "failed", + "pending", + "succeeded" + ] + }, + "startedAt": { + "type": "number" + }, + "completedAt": { + "type": "number" + } + }, + "required": [ + "startedAt", + "state" + ], + "type": "object", + "description": "Condensed check data. Retrieve individual check and check run data using api-checks v2 routes." + } + }, + "required": [ + "deployment-alias" + ], + "type": "object" + }, + "seatBlock": { + "properties": { + "blockCode": { + "type": "string", + "enum": [ + "COMMIT_AUTHOR_REQUIRED", + "TEAM_ACCESS_REQUIRED" + ], + "description": "The NSNB decision code for the seat block. TODO: We should consolidate block types." + }, + "userId": { + "type": "string", + "description": "The blocked vercel user ID." + }, + "isVerified": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Determines if the user was verified during the block. In the git integration case, the commit sender was the author." + }, + "gitUserId": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "gitProvider": { + "type": "string", + "enum": [ + "bitbucket", + "github", + "gitlab" + ], + "description": "The git provider type associated with gitUserId." + } + }, + "required": [ + "blockCode" + ], + "type": "object", + "description": "NSNB Blocked metadata" + }, + "attribution": { + "properties": { + "commitMeta": { + "properties": { + "email": { + "type": "string", + "description": "Email from git commit author" + }, + "name": { + "type": "string", + "description": "Name from git commit author" + }, + "isVerified": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether the commit was signed/verified (GitHub only, others return undefined)" + } + }, + "type": "object", + "description": "Commit metadata from the git commit author" + }, + "gitUser": { + "properties": { + "id": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "login": { + "type": "string", + "description": "Git provider username/login" + }, + "type": { + "type": "string", + "description": "User type" + }, + "provider": { + "type": "string", + "description": "The git provider (github, gitlab, bitbucket)" + } + }, + "required": [ + "id", + "login" + ], + "type": "object", + "description": "Git provider user associated with the commit author email (only set if resolved)" + }, + "vercelUser": { + "properties": { + "id": { + "type": "string", + "description": "Vercel user ID" + }, + "username": { + "type": "string", + "description": "Vercel username" + }, + "teamRoles": { + "items": { + "type": "string" + }, + "type": "array", + "description": "Team roles at time of deployment" + } + }, + "required": [ + "id", + "username" + ], + "type": "object", + "description": "Vercel user linked to the git provider account (only set if resolved)" + } + }, + "type": "object", + "description": "Attribution metadata for the deployment, linking commit author to git and Vercel users. Only populated when the `enable-deployment-attribution` flag is enabled." + } + }, + "required": [ + "aliasAssigned", + "bootedAt", + "build", + "buildSkipped", + "buildingAt", + "createdAt", + "createdIn", + "creator", + "env", + "id", + "inspectorUrl", + "isInConcurrentBuildsQueue", + "isInSystemBuildsQueue", + "meta", + "name", + "ownerId", + "plan", + "projectId", + "projectSettings", + "public", + "readyState", + "regions", + "routes", + "status", + "type", + "url", + "version" + ], + "type": "object", + "description": "Returns the updated deployment object with `readyState` set to `CANCELED`. The build has been stopped and this action is irreversible." + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + } + }, + "x-vercel-cli": { + "supportedSubcommands": true, + "supportedProduction": false + }, + "parameters": [ + { + "name": "id", + "description": "The unique identifier of the deployment.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "example": "dpl_5WJWYSyB7BpgTj3EuwF37WMRBXBtPQ2iTMJHJBJyRfd", + "description": "The unique identifier of the deployment." + }, + "x-vercel-cli": { + "kind": "argument" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + } + }, + "/v5/domains/{domain}/records": { + "get": { + "description": "Retrieves a list of DNS records created for a domain name. By default it returns 20 records if no limit is provided. The rest can be retrieved using the pagination options.", + "operationId": "getRecords", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "List existing DNS records", + "tags": [ + "dns" + ], + "responses": { + "200": { + "description": "Successful response retrieving a list of paginated DNS records.", + "content": { + "application/json": { + "schema": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "records": { + "items": { + "properties": { + "id": { + "type": "string" + }, + "slug": { + "type": "string" + }, + "name": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "A", + "AAAA", + "ALIAS", + "CAA", + "CNAME", + "HTTPS", + "MX", + "NS", + "SRV", + "TXT" + ] + }, + "value": { + "type": "string" + }, + "mxPriority": { + "type": "number" + }, + "priority": { + "type": "number" + }, + "creator": { + "type": "string" + }, + "created": { + "nullable": true, + "type": "number" + }, + "updated": { + "nullable": true, + "type": "number" + }, + "createdAt": { + "nullable": true, + "type": "number" + }, + "updatedAt": { + "nullable": true, + "type": "number" + }, + "ttl": { + "type": "number" + }, + "comment": { + "type": "string" + } + }, + "required": [ + "created", + "createdAt", + "creator", + "id", + "name", + "slug", + "type", + "updated", + "updatedAt", + "value" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "records" + ], + "type": "object" + }, + { + "properties": { + "records": { + "items": { + "properties": { + "id": { + "type": "string" + }, + "slug": { + "type": "string" + }, + "name": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "A", + "AAAA", + "ALIAS", + "CAA", + "CNAME", + "HTTPS", + "MX", + "NS", + "SRV", + "TXT" + ] + }, + "value": { + "type": "string" + }, + "mxPriority": { + "type": "number" + }, + "priority": { + "type": "number" + }, + "creator": { + "type": "string" + }, + "created": { + "nullable": true, + "type": "number" + }, + "updated": { + "nullable": true, + "type": "number" + }, + "createdAt": { + "nullable": true, + "type": "number" + }, + "updatedAt": { + "nullable": true, + "type": "number" + }, + "ttl": { + "type": "number" + }, + "comment": { + "type": "string" + } + }, + "required": [ + "created", + "createdAt", + "creator", + "id", + "name", + "slug", + "type", + "updated", + "updatedAt", + "value" + ], + "type": "object" + }, + "type": "array" + }, + "pagination": { + "$ref": "#/components/schemas/Pagination" + } + }, + "required": [ + "pagination", + "records" + ], + "type": "object", + "description": "Successful response retrieving a list of paginated DNS records." + } + ] + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + } + }, + "x-vercel-cli": { + "supportedSubcommands": true, + "supportedProduction": false, + "aliases": [ + "ls", + "list" + ] + }, + "parameters": [ + { + "name": "domain", + "in": "path", + "required": true, + "schema": { + "type": "string", + "example": "example.com" + }, + "x-vercel-cli": { + "kind": "argument" + } + }, + { + "name": "limit", + "description": "Maximum number of records to list from a request.", + "in": "query", + "required": false, + "schema": { + "description": "Maximum number of records to list from a request.", + "type": "string", + "example": 20 + } + }, + { + "name": "since", + "description": "Get records created after this JavaScript timestamp.", + "in": "query", + "required": false, + "schema": { + "description": "Get records created after this JavaScript timestamp.", + "type": "string", + "example": 1609499532000 + } + }, + { + "name": "until", + "description": "Get records created before this JavaScript timestamp.", + "in": "query", + "required": false, + "schema": { + "description": "Get records created before this JavaScript timestamp.", + "type": "string", + "example": 1612264332000 + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + } + }, + "/v2/domains/{domain}/records": { + "post": { + "description": "Creates a DNS record for a domain.", + "operationId": "createRecord", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Create a DNS record", + "tags": [ + "dns" + ], + "responses": { + "200": { + "description": "Successful response showing the uid of the newly created DNS record.", + "content": { + "application/json": { + "schema": { + "oneOf": [ + { + "properties": { + "uid": { + "type": "string" + }, + "updated": { + "type": "number" + } + }, + "required": [ + "updated" + ], + "type": "object" + }, + { + "properties": { + "uid": { + "type": "string", + "description": "The id of the newly created DNS record", + "example": "rec_V0fra8eEgQwEpFhYG2vTzC3K" + } + }, + "required": [ + "uid" + ], + "type": "object" + } + ] + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid.\nOne of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "402": { + "description": "The account is missing a payment so payment method must be updated" + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "409": { + "description": "" + }, + "410": { + "description": "" + } + }, + "x-vercel-cli": { + "supportedSubcommands": true, + "supportedProduction": false, + "bodyArguments": [ + "name", + "type", + "value" + ] + }, + "parameters": [ + { + "name": "domain", + "description": "The domain used to create the DNS record.", + "in": "path", + "required": true, + "schema": { + "description": "The domain used to create the DNS record.", + "type": "string", + "example": "example.com" + }, + "x-vercel-cli": { + "kind": "argument" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "required": [ + "type" + ], + "properties": { + "type": { + "description": "The type of record, it could be one of the valid DNS records.", + "type": "string", + "enum": [ + "A", + "AAAA", + "ALIAS", + "CAA", + "CNAME", + "HTTPS", + "MX", + "SRV", + "TXT", + "NS" + ] + } + }, + "anyOf": [ + { + "type": "object", + "additionalProperties": false, + "required": [ + "type", + "value", + "name" + ], + "properties": { + "name": { + "description": "A subdomain name or an empty string for the root domain.", + "type": "string", + "example": "subdomain" + }, + "type": { + "description": "Must be of type `A`.", + "type": "string", + "enum": [ + "A" + ] + }, + "ttl": { + "description": "The TTL value. Must be a number between 60 and 2147483647. Default value is 60.", + "type": "number", + "minimum": 60, + "maximum": 2147483647, + "example": 60 + }, + "value": { + "description": "The record value must be a valid IPv4 address.", + "type": "string", + "format": "ipv4", + "example": "192.0.2.42" + }, + "comment": { + "type": "string", + "description": "A comment to add context on what this DNS record is for", + "example": "used to verify ownership of domain", + "maxLength": 500 + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "type", + "value", + "name" + ], + "properties": { + "name": { + "description": "A subdomain name or an empty string for the root domain.", + "type": "string", + "example": "subdomain" + }, + "type": { + "description": "Must be of type `AAAA`.", + "type": "string", + "enum": [ + "AAAA" + ] + }, + "ttl": { + "description": "The TTL value. Must be a number between 60 and 2147483647. Default value is 60.", + "type": "number", + "minimum": 60, + "maximum": 2147483647, + "example": 60 + }, + "value": { + "description": "An AAAA record pointing to an IPv6 address.", + "type": "string", + "format": "ipv6", + "example": "2001:DB8::42" + }, + "comment": { + "type": "string", + "description": "A comment to add context on what this DNS record is for", + "example": "used to verify ownership of domain", + "maxLength": 500 + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "type", + "value", + "name" + ], + "properties": { + "name": { + "description": "A subdomain name or an empty string for the root domain.", + "type": "string", + "example": "subdomain" + }, + "type": { + "description": "Must be of type `ALIAS`.", + "type": "string", + "enum": [ + "ALIAS" + ] + }, + "ttl": { + "description": "The TTL value. Must be a number between 60 and 2147483647. Default value is 60.", + "type": "number", + "minimum": 60, + "maximum": 2147483647, + "example": 60 + }, + "value": { + "description": "An ALIAS virtual record pointing to a hostname resolved to an A record on server side.", + "type": "string", + "example": "cname.vercel-dns.com" + }, + "comment": { + "type": "string", + "description": "A comment to add context on what this DNS record is for", + "example": "used to verify ownership of domain", + "maxLength": 500 + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "type", + "value", + "name" + ], + "properties": { + "name": { + "description": "A subdomain name or an empty string for the root domain.", + "type": "string", + "example": "subdomain" + }, + "type": { + "description": "Must be of type `CAA`.", + "type": "string", + "enum": [ + "CAA" + ] + }, + "ttl": { + "description": "The TTL value. Must be a number between 60 and 2147483647. Default value is 60.", + "type": "number", + "minimum": 60, + "maximum": 2147483647, + "example": 60 + }, + "value": { + "description": "A CAA record to specify which Certificate Authorities (CAs) are allowed to issue certificates for the domain.", + "type": "string", + "example": "0 issue \"letsencrypt.org\"" + }, + "comment": { + "type": "string", + "description": "A comment to add context on what this DNS record is for", + "example": "used to verify ownership of domain", + "maxLength": 500 + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "type", + "name" + ], + "properties": { + "name": { + "description": "A subdomain name or an empty string for the root domain.", + "type": "string", + "example": "subdomain" + }, + "type": { + "description": "Must be of type `CNAME`.", + "type": "string", + "enum": [ + "CNAME" + ] + }, + "ttl": { + "description": "The TTL value. Must be a number between 60 and 2147483647. Default value is 60.", + "type": "number", + "minimum": 60, + "maximum": 2147483647, + "example": 60 + }, + "value": { + "description": "A CNAME record mapping to another domain name.", + "type": "string", + "example": "cname.vercel-dns.com" + }, + "comment": { + "type": "string", + "description": "A comment to add context on what this DNS record is for", + "example": "used to verify ownership of domain", + "maxLength": 500 + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "type", + "value", + "name", + "mxPriority" + ], + "properties": { + "name": { + "description": "A subdomain name or an empty string for the root domain.", + "type": "string", + "example": "subdomain" + }, + "type": { + "description": "Must be of type `MX`.", + "type": "string", + "enum": [ + "MX" + ] + }, + "ttl": { + "description": "The TTL value. Must be a number between 60 and 2147483647. Default value is 60.", + "type": "number", + "minimum": 60, + "maximum": 2147483647, + "example": 60 + }, + "value": { + "description": "An MX record specifying the mail server responsible for accepting messages on behalf of the domain name.", + "type": "string", + "example": "10 mail.example.com." + }, + "mxPriority": { + "type": "number", + "minimum": 0, + "maximum": 65535, + "example": 10 + }, + "comment": { + "type": "string", + "description": "A comment to add context on what this DNS record is for", + "example": "used to verify ownership of domain", + "maxLength": 500 + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "type", + "name", + "srv" + ], + "properties": { + "type": { + "description": "Must be of type `SRV`.", + "type": "string", + "enum": [ + "SRV" + ] + }, + "ttl": { + "description": "The TTL value. Must be a number between 60 and 2147483647. Default value is 60.", + "type": "number", + "minimum": 60, + "maximum": 2147483647, + "example": 60 + }, + "srv": { + "type": "object", + "additionalProperties": false, + "required": [ + "weight", + "port", + "priority", + "target" + ], + "properties": { + "priority": { + "anyOf": [ + { + "type": "number", + "minimum": 0, + "maximum": 65535, + "example": 10 + } + ], + "nullable": true + }, + "weight": { + "anyOf": [ + { + "type": "number", + "minimum": 0, + "maximum": 65535, + "example": 10 + } + ], + "nullable": true + }, + "port": { + "anyOf": [ + { + "type": "number", + "minimum": 0, + "maximum": 65535, + "example": 5000 + } + ], + "nullable": true + }, + "target": { + "type": "string", + "example": "host.example.com" + } + } + }, + "comment": { + "type": "string", + "description": "A comment to add context on what this DNS record is for", + "example": "used to verify ownership of domain", + "maxLength": 500 + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "type", + "value", + "name" + ], + "properties": { + "type": { + "description": "Must be of type `TXT`.", + "type": "string", + "enum": [ + "TXT" + ] + }, + "ttl": { + "description": "The TTL value. Must be a number between 60 and 2147483647. Default value is 60.", + "type": "number", + "minimum": 60, + "maximum": 2147483647, + "example": 60 + }, + "value": { + "description": "A TXT record containing arbitrary text.", + "type": "string", + "example": "hello" + }, + "comment": { + "type": "string", + "description": "A comment to add context on what this DNS record is for", + "example": "used to verify ownership of domain", + "maxLength": 500 + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "type", + "name" + ], + "properties": { + "name": { + "description": "A subdomain name.", + "type": "string", + "example": "subdomain" + }, + "type": { + "description": "Must be of type `NS`.", + "type": "string", + "enum": [ + "NS" + ] + }, + "ttl": { + "description": "The TTL value. Must be a number between 60 and 2147483647. Default value is 60.", + "type": "number", + "minimum": 60, + "maximum": 2147483647, + "example": 60 + }, + "value": { + "description": "An NS domain value.", + "type": "string", + "example": "ns1.example.com" + }, + "comment": { + "type": "string", + "description": "A comment to add context on what this DNS record is for", + "example": "used to verify ownership of domain", + "maxLength": 500 + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "type", + "name", + "https" + ], + "properties": { + "type": { + "description": "Must be of type `HTTPS`.", + "type": "string", + "enum": [ + "HTTPS" + ] + }, + "ttl": { + "description": "The TTL value. Must be a number between 60 and 2147483647. Default value is 60.", + "type": "number", + "minimum": 60, + "maximum": 2147483647, + "example": 60 + }, + "https": { + "type": "object", + "additionalProperties": false, + "required": [ + "priority", + "target" + ], + "properties": { + "priority": { + "anyOf": [ + { + "type": "number", + "minimum": 0, + "maximum": 65535, + "example": 10 + } + ], + "nullable": true + }, + "target": { + "type": "string", + "example": "host.example.com" + }, + "params": { + "type": "string", + "example": "alpn=h2,h3" + } + } + }, + "comment": { + "type": "string", + "description": "A comment to add context on what this DNS record is for", + "example": "used to verify ownership of domain", + "maxLength": 500 + } + } + } + ] + } + } + }, + "required": true + }, + "x-speakeasy-test": false + } + }, + "/v1/domains/records/{recordId}": { + "patch": { + "description": "Updates an existing DNS record for a domain name.", + "operationId": "updateRecord", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Update an existing DNS record", + "tags": [ + "dns" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "record", + "record-sys" + ] + }, + "value": { + "type": "string" + }, + "creator": { + "type": "string" + }, + "domain": { + "type": "string" + }, + "ttl": { + "type": "number" + }, + "comment": { + "type": "string" + }, + "recordType": { + "type": "string", + "enum": [ + "A", + "AAAA", + "ALIAS", + "CAA", + "CNAME", + "HTTPS", + "MX", + "NS", + "SRV", + "TXT" + ] + }, + "createdAt": { + "nullable": true, + "type": "number" + } + }, + "required": [ + "creator", + "domain", + "id", + "name", + "recordType", + "type", + "value" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid.\nOne of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "402": { + "description": "The account is missing a payment so payment method must be updated" + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "409": { + "description": "" + }, + "410": { + "description": "" + } + }, + "x-vercel-cli": { + "supportedSubcommands": true, + "supportedProduction": false + }, + "parameters": [ + { + "name": "recordId", + "description": "The id of the DNS record", + "in": "path", + "required": true, + "schema": { + "description": "The id of the DNS record", + "example": "rec_2qn7pzrx89yxy34vezpd31y9", + "type": "string" + }, + "x-vercel-cli": { + "kind": "argument" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "additionalProperties": false, + "properties": { + "name": { + "type": "string", + "description": "The name of the DNS record", + "example": "example-1", + "nullable": true + }, + "value": { + "type": "string", + "description": "The value of the DNS record", + "example": "google.com", + "nullable": true + }, + "type": { + "enum": [ + "A", + "AAAA", + "ALIAS", + "CAA", + "CNAME", + "HTTPS", + "MX", + "SRV", + "TXT", + "NS", + null + ], + "type": "string", + "description": "The type of the DNS record", + "example": "A", + "maxLength": 255, + "nullable": true + }, + "ttl": { + "type": "integer", + "description": "The Time to live (TTL) value of the DNS record", + "example": "60", + "minimum": 60, + "maximum": 2147483647, + "nullable": true + }, + "mxPriority": { + "type": "integer", + "description": "The MX priority value of the DNS record", + "nullable": true + }, + "srv": { + "additionalProperties": false, + "required": [ + "target", + "weight", + "port", + "priority" + ], + "properties": { + "target": { + "type": "string", + "description": "", + "example": "example2.com.", + "maxLength": 255, + "nullable": true + }, + "weight": { + "description": "", + "type": "integer", + "nullable": true + }, + "port": { + "description": "", + "type": "integer", + "nullable": true + }, + "priority": { + "description": "", + "type": "integer", + "nullable": true + } + }, + "type": "object", + "nullable": true + }, + "https": { + "additionalProperties": false, + "required": [ + "priority", + "target" + ], + "properties": { + "priority": { + "description": "", + "type": "integer", + "nullable": true + }, + "target": { + "type": "string", + "description": "", + "example": "example2.com.", + "maxLength": 255, + "nullable": true + }, + "params": { + "description": "", + "type": "string", + "nullable": true + } + }, + "type": "object", + "nullable": true + }, + "comment": { + "type": "string", + "description": "A comment to add context on what this DNS record is for", + "example": "used to verify ownership of domain", + "maxLength": 500 + } + }, + "type": "object" + } + } + }, + "required": true + } + } + }, + "/domains/{domain}/records": { + "put": { + "description": "", + "operationId": "replaceDomainsByDomainRecords", + "security": [], + "tags": [], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "recordIds": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "recordIds" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "409": { + "description": "" + }, + "410": { + "description": "" + }, + "415": { + "description": "" + } + }, + "parameters": [ + { + "name": "domain", + "description": "The domain name", + "in": "path", + "required": true, + "schema": { + "type": "string", + "description": "The domain name", + "example": "example.com" + } + } + ] + } + }, + "/domains/records/{recordId}": { + "get": { + "description": "", + "operationId": "getDomainsRecordsByRecordId", + "security": [], + "tags": [], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "type": { + "type": "string", + "enum": [ + "A", + "AAAA", + "ALIAS", + "CAA", + "CNAME", + "HTTPS", + "MX", + "NS", + "SRV", + "TXT" + ] + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "value": { + "type": "string" + }, + "creator": { + "type": "string" + }, + "domain": { + "type": "string" + }, + "ttl": { + "type": "number" + }, + "comment": { + "type": "string" + }, + "recordType": { + "type": "string", + "enum": [ + "A", + "AAAA", + "ALIAS", + "CAA", + "CNAME", + "HTTPS", + "MX", + "NS", + "SRV", + "TXT" + ] + }, + "createdAt": { + "nullable": true, + "type": "number" + } + }, + "required": [ + "creator", + "domain", + "id", + "name", + "recordType", + "type", + "value" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "recordId", + "description": "The unique ID of the DNS record", + "in": "path", + "required": true, + "schema": { + "type": "string", + "description": "The unique ID of the DNS record" + } + } + ] + } + }, + "/v2/domains/{domain}/records/{recordId}": { + "delete": { + "description": "Removes an existing DNS record from a domain name.", + "operationId": "removeRecord", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Delete a DNS record", + "tags": [ + "dns" + ], + "responses": { + "200": { + "description": "Successful response by removing the specified DNS record.", + "content": { + "application/json": { + "schema": { + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + } + }, + "x-vercel-cli": { + "supportedSubcommands": true, + "supportedProduction": false + }, + "parameters": [ + { + "name": "domain", + "in": "path", + "required": true, + "schema": { + "type": "string", + "example": "example.com" + }, + "x-vercel-cli": { + "kind": "argument" + } + }, + { + "name": "recordId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "example": "rec_V0fra8eEgQwEpFhYG2vTzC3K" + }, + "x-vercel-cli": { + "kind": "argument" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + } + }, + "/v1/registrar/tlds/supported": { + "get": { + "tags": [ + "domains-registrar" + ], + "operationId": "getSupportedTlds", + "parameters": [ + { + "name": "teamId", + "in": "query", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + }, + "required": false + } + ], + "security": [ + { + "bearerToken": [] + } + ], + "responses": { + "200": { + "description": "A list of the TLDs supported by Vercel.", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/TldName" + }, + "description": "A list of the TLDs supported by Vercel." + } + } + } + }, + "400": { + "description": "There was something wrong with the request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HttpApiDecodeError" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Unauthorized" + } + } + } + }, + "403": { + "description": "NotAuthorizedForScope", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NotAuthorizedForScope" + } + } + } + }, + "429": { + "description": "TooManyRequests", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TooManyRequests" + } + } + } + }, + "500": { + "description": "InternalServerError", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InternalServerError" + } + } + } + } + }, + "description": "Get a list of TLDs supported by Vercel", + "summary": "Get supported TLDs" + } + }, + "/v1/registrar/tlds/{tld}": { + "get": { + "tags": [ + "domains-registrar" + ], + "operationId": "getTld", + "parameters": [ + { + "name": "tld", + "in": "path", + "schema": { + "$ref": "#/components/schemas/TldName" + }, + "required": true + }, + { + "name": "teamId", + "in": "query", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + }, + "required": false + } + ], + "security": [ + { + "bearerToken": [] + } + ], + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "supportedLanguageCodes" + ], + "properties": { + "supportedLanguageCodes": { + "type": "object", + "properties": {}, + "additionalProperties": { + "type": "string" + }, + "description": "The language codes that are supported for the TLD. The key is the language code, and the value is the name of the language." + } + }, + "additionalProperties": false + } + } + } + }, + "400": { + "description": "There was something wrong with the request", + "content": { + "application/json": { + "schema": { + "anyOf": [ + { + "$ref": "#/components/schemas/TldNotSupported" + }, + { + "$ref": "#/components/schemas/HttpApiDecodeError" + } + ] + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Unauthorized" + } + } + } + }, + "403": { + "description": "NotAuthorizedForScope", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NotAuthorizedForScope" + } + } + } + }, + "429": { + "description": "TooManyRequests", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TooManyRequests" + } + } + } + }, + "500": { + "description": "InternalServerError", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InternalServerError" + } + } + } + } + }, + "description": "Get the metadata for a specific TLD.", + "summary": "Get TLD" + } + }, + "/v1/registrar/tlds/{tld}/price": { + "get": { + "tags": [ + "domains-registrar" + ], + "operationId": "getTldPrice", + "parameters": [ + { + "name": "tld", + "in": "path", + "schema": { + "$ref": "#/components/schemas/TldName" + }, + "required": true + }, + { + "name": "years", + "in": "query", + "schema": { + "type": "string", + "description": "The number of years to get the price for. If not provided, the minimum number of years for the TLD will be used." + }, + "required": false, + "description": "The number of years to get the price for. If not provided, the minimum number of years for the TLD will be used." + }, + { + "name": "teamId", + "in": "query", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + }, + "required": false + } + ], + "security": [ + { + "bearerToken": [] + } + ], + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "years", + "purchasePrice", + "renewalPrice", + "transferPrice" + ], + "properties": { + "years": { + "type": "number", + "description": "The number of years the returned price is for." + }, + "purchasePrice": { + "anyOf": [ + { + "type": "number", + "minimum": 0.01 + }, + { + "type": "string" + } + ] + }, + "renewalPrice": { + "anyOf": [ + { + "type": "number", + "minimum": 0.01 + }, + { + "type": "string" + } + ] + }, + "transferPrice": { + "anyOf": [ + { + "type": "number", + "minimum": 0.01 + }, + { + "type": "string" + } + ] + } + }, + "additionalProperties": false + } + } + } + }, + "400": { + "description": "There was something wrong with the request", + "content": { + "application/json": { + "schema": { + "anyOf": [ + { + "$ref": "#/components/schemas/TldNotSupported" + }, + { + "$ref": "#/components/schemas/HttpApiDecodeError" + } + ] + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Unauthorized" + } + } + } + }, + "403": { + "description": "NotAuthorizedForScope", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NotAuthorizedForScope" + } + } + } + }, + "429": { + "description": "TooManyRequests", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TooManyRequests" + } + } + } + }, + "500": { + "description": "InternalServerError", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InternalServerError" + } + } + } + } + }, + "description": "Get price data for a specific TLD. This only reflects base prices for the given TLD. Premium domains may have different prices. Use the [Get price data for a domain](https://vercel.com/docs/rest-api/reference/endpoints/domains-registrar/get-price-data-for-a-domain) endpoint to get the price data for a specific domain.", + "summary": "Get TLD price data" + } + }, + "/v1/registrar/domains/{domain}/availability": { + "get": { + "tags": [ + "domains-registrar" + ], + "operationId": "getDomainAvailability", + "parameters": [ + { + "name": "domain", + "in": "path", + "schema": { + "$ref": "#/components/schemas/DomainName" + }, + "required": true + }, + { + "name": "teamId", + "in": "query", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + }, + "required": false + } + ], + "security": [ + { + "bearerToken": [] + } + ], + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "available" + ], + "properties": { + "available": { + "type": "boolean" + } + }, + "additionalProperties": false + } + } + } + }, + "400": { + "description": "There was something wrong with the request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HttpApiDecodeError" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Unauthorized" + } + } + } + }, + "403": { + "description": "NotAuthorizedForScope", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NotAuthorizedForScope" + } + } + } + }, + "404": { + "description": "NotFound", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NotFound" + } + } + } + }, + "429": { + "description": "TooManyRequests", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TooManyRequests" + } + } + } + }, + "500": { + "description": "InternalServerError", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InternalServerError" + } + } + } + } + }, + "description": "Get availability for a specific domain. If the domain is available, it can be purchased using the [Buy a domain](https://vercel.com/docs/rest-api/reference/endpoints/domains-registrar/buy-a-domain) endpoint or the [Buy multiple domains](https://vercel.com/docs/rest-api/reference/endpoints/domains-registrar/buy-multiple-domains) endpoint.", + "summary": "Get availability for a domain" + } + }, + "/v1/registrar/domains/{domain}/price": { + "get": { + "tags": [ + "domains-registrar" + ], + "operationId": "getDomainPrice", + "parameters": [ + { + "name": "domain", + "in": "path", + "schema": { + "$ref": "#/components/schemas/DomainName" + }, + "required": true + }, + { + "name": "years", + "in": "query", + "schema": { + "type": "string", + "description": "The number of years to get the price for. If not provided, the minimum number of years for the TLD will be used." + }, + "required": false, + "description": "The number of years to get the price for. If not provided, the minimum number of years for the TLD will be used." + }, + { + "name": "teamId", + "in": "query", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + }, + "required": false + } + ], + "security": [ + { + "bearerToken": [] + } + ], + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "years", + "purchasePrice", + "renewalPrice", + "transferPrice" + ], + "properties": { + "years": { + "type": "number" + }, + "purchasePrice": { + "anyOf": [ + { + "type": "number", + "minimum": 0.01 + }, + { + "type": "string" + } + ] + }, + "renewalPrice": { + "anyOf": [ + { + "type": "number", + "minimum": 0.01 + }, + { + "type": "string" + } + ] + }, + "transferPrice": { + "anyOf": [ + { + "type": "number", + "minimum": 0.01 + }, + { + "type": "string" + } + ] + } + }, + "additionalProperties": false + } + } + } + }, + "400": { + "description": "There was something wrong with the request", + "content": { + "application/json": { + "schema": { + "anyOf": [ + { + "$ref": "#/components/schemas/BadRequest" + }, + { + "$ref": "#/components/schemas/DomainTooShort" + }, + { + "$ref": "#/components/schemas/TldNotSupported" + }, + { + "$ref": "#/components/schemas/HttpApiDecodeError" + } + ] + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Unauthorized" + } + } + } + }, + "403": { + "description": "NotAuthorizedForScope", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NotAuthorizedForScope" + } + } + } + }, + "429": { + "description": "TooManyRequests", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TooManyRequests" + } + } + } + }, + "500": { + "description": "InternalServerError", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InternalServerError" + } + } + } + } + }, + "description": "Get price data for a specific domain", + "summary": "Get price data for a domain" + } + }, + "/v1/registrar/domains/availability": { + "post": { + "tags": [ + "domains-registrar" + ], + "operationId": "getBulkAvailability", + "parameters": [ + { + "name": "teamId", + "in": "query", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + }, + "required": false + } + ], + "security": [ + { + "bearerToken": [] + } + ], + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "results" + ], + "properties": { + "results": { + "type": "array", + "items": { + "type": "object", + "required": [ + "domain", + "available" + ], + "properties": { + "domain": { + "$ref": "#/components/schemas/DomainName" + }, + "available": { + "type": "boolean" + } + }, + "additionalProperties": false + } + } + }, + "additionalProperties": false + } + } + } + }, + "400": { + "description": "There was something wrong with the request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HttpApiDecodeError" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Unauthorized" + } + } + } + }, + "403": { + "description": "NotAuthorizedForScope", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NotAuthorizedForScope" + } + } + } + }, + "429": { + "description": "TooManyRequests", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TooManyRequests" + } + } + } + }, + "500": { + "description": "InternalServerError", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InternalServerError" + } + } + } + } + }, + "description": "Get availability for multiple domains. If the domains are available, they can be purchased using the [Buy a domain](https://vercel.com/docs/rest-api/reference/endpoints/domains-registrar/buy-a-domain) endpoint or the [Buy multiple domains](https://vercel.com/docs/rest-api/reference/endpoints/domains-registrar/buy-multiple-domains) endpoint.", + "summary": "Get availability for multiple domains", + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "domains" + ], + "properties": { + "domains": { + "type": "array", + "minItems": 1, + "items": { + "$ref": "#/components/schemas/DomainName" + }, + "description": "an array of at most 50 item(s)", + "title": "maxItems(50)", + "maxItems": 50 + } + }, + "additionalProperties": false + } + } + }, + "required": true + } + } + }, + "/v1/registrar/domains/{domain}/auth-code": { + "get": { + "tags": [ + "domains-registrar" + ], + "operationId": "getDomainAuthCode", + "parameters": [ + { + "name": "domain", + "in": "path", + "schema": { + "$ref": "#/components/schemas/DomainName" + }, + "required": true + }, + { + "name": "teamId", + "in": "query", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + }, + "required": false + } + ], + "security": [ + { + "bearerToken": [] + } + ], + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "authCode" + ], + "properties": { + "authCode": { + "type": "string" + } + }, + "additionalProperties": false + } + } + } + }, + "400": { + "description": "There was something wrong with the request", + "content": { + "application/json": { + "schema": { + "anyOf": [ + { + "$ref": "#/components/schemas/DomainNotRegistered" + }, + { + "$ref": "#/components/schemas/HttpApiDecodeError" + } + ] + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Unauthorized" + } + } + } + }, + "403": { + "description": "NotAuthorizedForScope", + "content": { + "application/json": { + "schema": { + "anyOf": [ + { + "$ref": "#/components/schemas/NotAuthorizedForScope" + }, + { + "$ref": "#/components/schemas/Forbidden" + } + ] + } + } + } + }, + "404": { + "description": "The domain was not found in our system.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DomainNotFound" + } + } + } + }, + "409": { + "description": "The domain cannot be transfered out until the specified date.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DomainCannotBeTransferedOutUntil" + } + } + } + }, + "429": { + "description": "TooManyRequests", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TooManyRequests" + } + } + } + }, + "500": { + "description": "InternalServerError", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InternalServerError" + } + } + } + } + }, + "description": "Get the auth code for a domain. This is required to transfer a domain from Vercel to another registrar.", + "summary": "Get the auth code for a domain" + } + }, + "/v1/registrar/domains/{domain}/buy": { + "post": { + "tags": [ + "domains-registrar" + ], + "operationId": "buySingleDomain", + "parameters": [ + { + "name": "domain", + "in": "path", + "schema": { + "$ref": "#/components/schemas/DomainName" + }, + "required": true + }, + { + "name": "teamId", + "in": "query", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + }, + "required": false + } + ], + "security": [ + { + "bearerToken": [] + } + ], + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "orderId", + "_links" + ], + "properties": { + "orderId": { + "$ref": "#/components/schemas/OrderId" + }, + "_links": { + "type": "object", + "additionalProperties": { + "type": "object", + "required": [ + "href", + "method" + ], + "properties": { + "href": { + "type": "string" + }, + "method": { + "type": "string", + "enum": [ + "GET", + "POST", + "PUT", + "DELETE", + "PATCH" + ] + } + }, + "additionalProperties": false + } + } + }, + "additionalProperties": false + } + } + } + }, + "400": { + "description": "There was something wrong with the request", + "content": { + "application/json": { + "schema": { + "anyOf": [ + { + "$ref": "#/components/schemas/DomainTooShort" + }, + { + "$ref": "#/components/schemas/OrderTooExpensive" + }, + { + "$ref": "#/components/schemas/InvalidAdditionalContactInfo" + }, + { + "$ref": "#/components/schemas/AdditionalContactInfoRequired" + }, + { + "$ref": "#/components/schemas/ExpectedPriceMismatch" + }, + { + "$ref": "#/components/schemas/DomainNotAvailable" + }, + { + "$ref": "#/components/schemas/LanguageCodeRequired" + }, + { + "$ref": "#/components/schemas/TldNotSupported" + }, + { + "$ref": "#/components/schemas/HttpApiDecodeError" + } + ] + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Unauthorized" + } + } + } + }, + "403": { + "description": "NotAuthorizedForScope", + "content": { + "application/json": { + "schema": { + "anyOf": [ + { + "$ref": "#/components/schemas/NotAuthorizedForScope" + }, + { + "$ref": "#/components/schemas/Forbidden" + } + ] + } + } + } + }, + "429": { + "description": "TooManyRequests", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TooManyRequests" + } + } + } + }, + "500": { + "description": "InternalServerError", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InternalServerError" + } + } + } + } + }, + "description": "Buy a domain", + "summary": "Buy a domain", + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "autoRenew", + "years", + "expectedPrice", + "contactInformation" + ], + "properties": { + "autoRenew": { + "type": "boolean", + "description": "Whether the domain should be auto-renewed before it expires. This can be configured later through the Vercel Dashboard or the [Update auto-renew for a domain](https://vercel.com/docs/rest-api/reference/endpoints/domains-registrar/update-auto-renew-for-a-domain) endpoint." + }, + "years": { + "type": "number", + "description": "The number of years to purchase the domain for." + }, + "expectedPrice": { + "type": "number", + "minimum": 0.01 + }, + "contactInformation": { + "type": "object", + "required": [ + "firstName", + "lastName", + "email", + "phone", + "address1", + "city", + "state", + "zip", + "country" + ], + "properties": { + "firstName": { + "$ref": "#/components/schemas/NonEmptyTrimmedString" + }, + "lastName": { + "$ref": "#/components/schemas/NonEmptyTrimmedString" + }, + "email": { + "$ref": "#/components/schemas/EmailAddress" + }, + "phone": { + "$ref": "#/components/schemas/E164PhoneNumber" + }, + "address1": { + "$ref": "#/components/schemas/NonEmptyTrimmedString" + }, + "address2": { + "$ref": "#/components/schemas/NonEmptyTrimmedString" + }, + "city": { + "$ref": "#/components/schemas/NonEmptyTrimmedString" + }, + "state": { + "$ref": "#/components/schemas/NonEmptyTrimmedString" + }, + "zip": { + "$ref": "#/components/schemas/NonEmptyTrimmedString" + }, + "country": { + "$ref": "#/components/schemas/CountryCode" + }, + "companyName": { + "$ref": "#/components/schemas/NonEmptyTrimmedString" + }, + "fax": { + "$ref": "#/components/schemas/E164PhoneNumber" + }, + "additional": { + "type": "object", + "properties": {} + } + }, + "additionalProperties": false, + "description": "The contact information for the domain. Some TLDs require additional contact information. Use the [Get contact info schema](https://vercel.com/docs/rest-api/reference/endpoints/domains-registrar/get-contact-info-schema) endpoint to retrieve the required fields." + }, + "languageCode": { + "type": "string", + "description": "The language code for the domain. For punycode domains, this must be provided. The list of supported language codes for a TLD can be retrieved from the [Get TLD](https://vercel.com/docs/rest-api/reference/endpoints/domains-registrar/get-tld) endpoint." + } + }, + "additionalProperties": false + } + } + }, + "required": true + } + } + }, + "/v1/registrar/domains/buy": { + "post": { + "tags": [ + "domains-registrar" + ], + "operationId": "buyDomains", + "parameters": [ + { + "name": "teamId", + "in": "query", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + }, + "required": false + } + ], + "security": [ + { + "bearerToken": [] + } + ], + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "orderId", + "_links" + ], + "properties": { + "orderId": { + "$ref": "#/components/schemas/OrderId" + }, + "_links": { + "type": "object", + "additionalProperties": { + "type": "object", + "required": [ + "href", + "method" + ], + "properties": { + "href": { + "type": "string" + }, + "method": { + "type": "string", + "enum": [ + "GET", + "POST", + "PUT", + "DELETE", + "PATCH" + ] + } + }, + "additionalProperties": false + } + } + }, + "additionalProperties": false + } + } + } + }, + "400": { + "description": "There was something wrong with the request", + "content": { + "application/json": { + "schema": { + "anyOf": [ + { + "$ref": "#/components/schemas/DomainTooShort" + }, + { + "$ref": "#/components/schemas/OrderTooExpensive" + }, + { + "$ref": "#/components/schemas/TooManyDomains" + }, + { + "$ref": "#/components/schemas/InvalidAdditionalContactInfo" + }, + { + "$ref": "#/components/schemas/AdditionalContactInfoRequired" + }, + { + "$ref": "#/components/schemas/DuplicateDomains" + }, + { + "$ref": "#/components/schemas/ExpectedPriceMismatch" + }, + { + "$ref": "#/components/schemas/DomainNotAvailable" + }, + { + "$ref": "#/components/schemas/LanguageCodeRequired" + }, + { + "$ref": "#/components/schemas/TldNotSupported" + }, + { + "$ref": "#/components/schemas/HttpApiDecodeError" + } + ] + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Unauthorized" + } + } + } + }, + "403": { + "description": "NotAuthorizedForScope", + "content": { + "application/json": { + "schema": { + "anyOf": [ + { + "$ref": "#/components/schemas/NotAuthorizedForScope" + }, + { + "$ref": "#/components/schemas/Forbidden" + } + ] + } + } + } + }, + "429": { + "description": "TooManyRequests", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TooManyRequests" + } + } + } + }, + "500": { + "description": "InternalServerError", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InternalServerError" + } + } + } + } + }, + "description": "Buy multiple domains at once", + "summary": "Buy multiple domains", + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "domains", + "contactInformation" + ], + "properties": { + "domains": { + "type": "array", + "minItems": 1, + "items": { + "type": "object", + "required": [ + "domainName", + "autoRenew", + "years", + "expectedPrice" + ], + "properties": { + "domainName": { + "$ref": "#/components/schemas/DomainName" + }, + "autoRenew": { + "type": "boolean", + "description": "Whether the domain should be auto-renewed before it expires. This can be configured later through the Vercel Dashboard or the [Update auto-renew for a domain](https://vercel.com/docs/rest-api/reference/endpoints/domains-registrar/update-auto-renew-for-a-domain) endpoint." + }, + "years": { + "type": "number", + "description": "The number of years to purchase the domain for." + }, + "expectedPrice": { + "type": "number", + "minimum": 0.01 + }, + "languageCode": { + "type": "string", + "description": "The language code for the domain. For punycode domains, this must be provided. The list of supported language codes for a TLD can be retrieved from the [Get TLD](https://vercel.com/docs/rest-api/reference/endpoints/domains-registrar/get-tld) endpoint." + } + }, + "additionalProperties": false + } + }, + "contactInformation": { + "type": "object", + "required": [ + "firstName", + "lastName", + "email", + "phone", + "address1", + "city", + "state", + "zip", + "country" + ], + "properties": { + "firstName": { + "$ref": "#/components/schemas/NonEmptyTrimmedString" + }, + "lastName": { + "$ref": "#/components/schemas/NonEmptyTrimmedString" + }, + "email": { + "$ref": "#/components/schemas/EmailAddress" + }, + "phone": { + "$ref": "#/components/schemas/E164PhoneNumber" + }, + "address1": { + "$ref": "#/components/schemas/NonEmptyTrimmedString" + }, + "address2": { + "$ref": "#/components/schemas/NonEmptyTrimmedString" + }, + "city": { + "$ref": "#/components/schemas/NonEmptyTrimmedString" + }, + "state": { + "$ref": "#/components/schemas/NonEmptyTrimmedString" + }, + "zip": { + "$ref": "#/components/schemas/NonEmptyTrimmedString" + }, + "country": { + "$ref": "#/components/schemas/CountryCode" + }, + "companyName": { + "$ref": "#/components/schemas/NonEmptyTrimmedString" + }, + "fax": { + "$ref": "#/components/schemas/E164PhoneNumber" + }, + "additional": { + "type": "object", + "properties": {} + } + }, + "additionalProperties": false, + "description": "The contact information for the domain. Some TLDs require additional contact information. Use the [Get contact info schema](https://vercel.com/docs/rest-api/reference/endpoints/domains-registrar/get-contact-info-schema) endpoint to retrieve the required fields." + } + }, + "additionalProperties": false + } + } + }, + "required": true + } + } + }, + "/v1/registrar/domains/{domain}/transfer": { + "post": { + "tags": [ + "domains-registrar" + ], + "operationId": "transferInDomain", + "parameters": [ + { + "name": "domain", + "in": "path", + "schema": { + "$ref": "#/components/schemas/DomainName" + }, + "required": true + }, + { + "name": "teamId", + "in": "query", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + }, + "required": false + } + ], + "security": [ + { + "bearerToken": [] + } + ], + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "orderId", + "_links" + ], + "properties": { + "orderId": { + "$ref": "#/components/schemas/OrderId" + }, + "_links": { + "type": "object", + "additionalProperties": { + "type": "object", + "required": [ + "href", + "method" + ], + "properties": { + "href": { + "type": "string" + }, + "method": { + "type": "string", + "enum": [ + "GET", + "POST", + "PUT", + "DELETE", + "PATCH" + ] + } + }, + "additionalProperties": false + } + } + }, + "additionalProperties": false + } + } + } + }, + "400": { + "description": "There was something wrong with the request", + "content": { + "application/json": { + "schema": { + "anyOf": [ + { + "$ref": "#/components/schemas/BadRequest" + }, + { + "$ref": "#/components/schemas/DomainAlreadyOwned" + }, + { + "$ref": "#/components/schemas/DomainTooShort" + }, + { + "$ref": "#/components/schemas/DNSSECEnabled" + }, + { + "$ref": "#/components/schemas/ExpectedPriceMismatch" + }, + { + "$ref": "#/components/schemas/DomainNotAvailable" + }, + { + "$ref": "#/components/schemas/TldNotSupported" + }, + { + "$ref": "#/components/schemas/HttpApiDecodeError" + } + ] + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Unauthorized" + } + } + } + }, + "403": { + "description": "NotAuthorizedForScope", + "content": { + "application/json": { + "schema": { + "anyOf": [ + { + "$ref": "#/components/schemas/NotAuthorizedForScope" + }, + { + "$ref": "#/components/schemas/Forbidden" + } + ] + } + } + } + }, + "429": { + "description": "TooManyRequests", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TooManyRequests" + } + } + } + }, + "500": { + "description": "InternalServerError", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InternalServerError" + } + } + } + } + }, + "description": "Transfer a domain in from another registrar", + "summary": "Transfer-in a domain", + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "authCode", + "autoRenew", + "years", + "expectedPrice", + "contactInformation" + ], + "properties": { + "authCode": { + "type": "string", + "description": "The auth code for the domain. You must obtain this code from the losing registrar." + }, + "autoRenew": { + "type": "boolean", + "description": "Whether the domain should be auto-renewed before it expires. This can be configured later through the Vercel Dashboard or the [Update auto-renew for a domain](https://vercel.com/docs/rest-api/reference/endpoints/domains-registrar/update-auto-renew-for-a-domain) endpoint." + }, + "years": { + "type": "number", + "description": "The number of years to renew the domain for once it is transferred in. This must be a valid number of transfer years for the TLD." + }, + "expectedPrice": { + "type": "number", + "minimum": 0.01 + }, + "contactInformation": { + "type": "object", + "required": [ + "firstName", + "lastName", + "email", + "phone", + "address1", + "city", + "state", + "zip", + "country" + ], + "properties": { + "firstName": { + "$ref": "#/components/schemas/NonEmptyTrimmedString" + }, + "lastName": { + "$ref": "#/components/schemas/NonEmptyTrimmedString" + }, + "email": { + "$ref": "#/components/schemas/EmailAddress" + }, + "phone": { + "$ref": "#/components/schemas/E164PhoneNumber" + }, + "address1": { + "$ref": "#/components/schemas/NonEmptyTrimmedString" + }, + "address2": { + "$ref": "#/components/schemas/NonEmptyTrimmedString" + }, + "city": { + "$ref": "#/components/schemas/NonEmptyTrimmedString" + }, + "state": { + "$ref": "#/components/schemas/NonEmptyTrimmedString" + }, + "zip": { + "$ref": "#/components/schemas/NonEmptyTrimmedString" + }, + "country": { + "$ref": "#/components/schemas/CountryCode" + }, + "companyName": { + "$ref": "#/components/schemas/NonEmptyTrimmedString" + }, + "fax": { + "$ref": "#/components/schemas/E164PhoneNumber" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + } + }, + "required": true + } + }, + "get": { + "tags": [ + "domains-registrar" + ], + "operationId": "getDomainTransferIn", + "parameters": [ + { + "name": "domain", + "in": "path", + "schema": { + "$ref": "#/components/schemas/DomainName" + }, + "required": true + }, + { + "name": "teamId", + "in": "query", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + }, + "required": false + } + ], + "security": [ + { + "bearerToken": [] + } + ], + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "status" + ], + "properties": { + "status": { + "type": "string", + "enum": [ + "canceled", + "canceled_pending_refund", + "completed", + "created", + "failed", + "pending", + "pending_insert", + "pending_new_auth_code", + "pending_transfer", + "pending_unlock", + "pending_registry_unlock", + "rejected", + "submitting_transfer" + ] + } + }, + "additionalProperties": false + } + } + } + }, + "400": { + "description": "There was something wrong with the request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HttpApiDecodeError" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Unauthorized" + } + } + } + }, + "403": { + "description": "NotAuthorizedForScope", + "content": { + "application/json": { + "schema": { + "anyOf": [ + { + "$ref": "#/components/schemas/NotAuthorizedForScope" + }, + { + "$ref": "#/components/schemas/Forbidden" + } + ] + } + } + } + }, + "404": { + "description": "NotFound", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NotFound" + } + } + } + }, + "429": { + "description": "TooManyRequests", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TooManyRequests" + } + } + } + }, + "500": { + "description": "InternalServerError", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InternalServerError" + } + } + } + } + }, + "description": "Get the transfer status for a domain", + "summary": "Get a domain's transfer status" + } + }, + "/v1/registrar/domains/{domain}/renew": { + "post": { + "tags": [ + "domains-registrar" + ], + "operationId": "renewDomain", + "parameters": [ + { + "name": "domain", + "in": "path", + "schema": { + "$ref": "#/components/schemas/DomainName" + }, + "required": true + }, + { + "name": "teamId", + "in": "query", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + }, + "required": false + } + ], + "security": [ + { + "bearerToken": [] + } + ], + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "orderId", + "_links" + ], + "properties": { + "orderId": { + "$ref": "#/components/schemas/OrderId" + }, + "_links": { + "type": "object", + "additionalProperties": { + "type": "object", + "required": [ + "href", + "method" + ], + "properties": { + "href": { + "type": "string" + }, + "method": { + "type": "string", + "enum": [ + "GET", + "POST", + "PUT", + "DELETE", + "PATCH" + ] + } + }, + "additionalProperties": false + } + } + }, + "additionalProperties": false + } + } + } + }, + "400": { + "description": "There was something wrong with the request", + "content": { + "application/json": { + "schema": { + "anyOf": [ + { + "$ref": "#/components/schemas/BadRequest" + }, + { + "$ref": "#/components/schemas/DomainTooShort" + }, + { + "$ref": "#/components/schemas/DomainNotRegistered" + }, + { + "$ref": "#/components/schemas/ExpectedPriceMismatch" + }, + { + "$ref": "#/components/schemas/DomainNotAvailable" + }, + { + "$ref": "#/components/schemas/TldNotSupported" + }, + { + "$ref": "#/components/schemas/HttpApiDecodeError" + } + ] + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Unauthorized" + } + } + } + }, + "403": { + "description": "NotAuthorizedForScope", + "content": { + "application/json": { + "schema": { + "anyOf": [ + { + "$ref": "#/components/schemas/NotAuthorizedForScope" + }, + { + "$ref": "#/components/schemas/Forbidden" + } + ] + } + } + } + }, + "404": { + "description": "The domain was not found in our system.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DomainNotFound" + } + } + } + }, + "429": { + "description": "TooManyRequests", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TooManyRequests" + } + } + } + }, + "500": { + "description": "InternalServerError", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InternalServerError" + } + } + } + } + }, + "description": "Renew a domain", + "summary": "Renew a domain", + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "years", + "expectedPrice" + ], + "properties": { + "years": { + "type": "number", + "description": "The number of years to renew the domain for." + }, + "expectedPrice": { + "type": "number", + "minimum": 0.01 + }, + "contactInformation": { + "type": "object", + "required": [ + "firstName", + "lastName", + "email", + "phone", + "address1", + "city", + "state", + "zip", + "country" + ], + "properties": { + "firstName": { + "$ref": "#/components/schemas/NonEmptyTrimmedString" + }, + "lastName": { + "$ref": "#/components/schemas/NonEmptyTrimmedString" + }, + "email": { + "$ref": "#/components/schemas/EmailAddress" + }, + "phone": { + "$ref": "#/components/schemas/E164PhoneNumber" + }, + "address1": { + "$ref": "#/components/schemas/NonEmptyTrimmedString" + }, + "address2": { + "$ref": "#/components/schemas/NonEmptyTrimmedString" + }, + "city": { + "$ref": "#/components/schemas/NonEmptyTrimmedString" + }, + "state": { + "$ref": "#/components/schemas/NonEmptyTrimmedString" + }, + "zip": { + "$ref": "#/components/schemas/NonEmptyTrimmedString" + }, + "country": { + "$ref": "#/components/schemas/CountryCode" + }, + "companyName": { + "$ref": "#/components/schemas/NonEmptyTrimmedString" + }, + "fax": { + "$ref": "#/components/schemas/E164PhoneNumber" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + } + }, + "required": true + } + } + }, + "/v1/registrar/domains/{domain}/auto-renew": { + "patch": { + "tags": [ + "domains-registrar" + ], + "operationId": "updateDomainAutoRenew", + "parameters": [ + { + "name": "domain", + "in": "path", + "schema": { + "$ref": "#/components/schemas/DomainName" + }, + "required": true + }, + { + "name": "teamId", + "in": "query", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + }, + "required": false + } + ], + "security": [ + { + "bearerToken": [] + } + ], + "responses": { + "204": { + "description": "Success" + }, + "400": { + "description": "There was something wrong with the request", + "content": { + "application/json": { + "schema": { + "anyOf": [ + { + "$ref": "#/components/schemas/DomainAlreadyRenewing" + }, + { + "$ref": "#/components/schemas/DomainNotRenewable" + }, + { + "$ref": "#/components/schemas/DomainNotRegistered" + }, + { + "$ref": "#/components/schemas/HttpApiDecodeError" + } + ] + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Unauthorized" + } + } + } + }, + "403": { + "description": "NotAuthorizedForScope", + "content": { + "application/json": { + "schema": { + "anyOf": [ + { + "$ref": "#/components/schemas/NotAuthorizedForScope" + }, + { + "$ref": "#/components/schemas/Forbidden" + } + ] + } + } + } + }, + "404": { + "description": "The domain was not found in our system.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DomainNotFound" + } + } + } + }, + "429": { + "description": "TooManyRequests", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TooManyRequests" + } + } + } + }, + "500": { + "description": "InternalServerError", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InternalServerError" + } + } + } + } + }, + "description": "Update the auto-renew setting for a domain", + "summary": "Update auto-renew for a domain", + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "autoRenew" + ], + "properties": { + "autoRenew": { + "type": "boolean" + } + }, + "additionalProperties": false + } + } + }, + "required": true + } + } + }, + "/v1/registrar/domains/{domain}/nameservers": { + "patch": { + "tags": [ + "domains-registrar" + ], + "operationId": "updateDomainNameservers", + "parameters": [ + { + "name": "domain", + "in": "path", + "schema": { + "$ref": "#/components/schemas/DomainName" + }, + "required": true + }, + { + "name": "teamId", + "in": "query", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + }, + "required": false + } + ], + "security": [ + { + "bearerToken": [] + } + ], + "responses": { + "204": { + "description": "Success" + }, + "400": { + "description": "There was something wrong with the request", + "content": { + "application/json": { + "schema": { + "anyOf": [ + { + "$ref": "#/components/schemas/DomainNotRegistered" + }, + { + "$ref": "#/components/schemas/HttpApiDecodeError" + } + ] + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Unauthorized" + } + } + } + }, + "403": { + "description": "NotAuthorizedForScope", + "content": { + "application/json": { + "schema": { + "anyOf": [ + { + "$ref": "#/components/schemas/NotAuthorizedForScope" + }, + { + "$ref": "#/components/schemas/Forbidden" + } + ] + } + } + } + }, + "404": { + "description": "The domain was not found in our system.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DomainNotFound" + } + } + } + }, + "429": { + "description": "TooManyRequests", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TooManyRequests" + } + } + } + }, + "500": { + "description": "InternalServerError", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InternalServerError" + } + } + } + } + }, + "description": "Update the nameservers for a domain. Pass an empty array to use Vercel's default nameservers.", + "summary": "Update nameservers for a domain", + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "nameservers" + ], + "properties": { + "nameservers": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Nameserver" + } + } + }, + "additionalProperties": false + } + } + }, + "required": true + } + } + }, + "/v1/registrar/domains/{domain}/contact-verification": { + "get": { + "tags": [ + "domains-registrar" + ], + "operationId": "getDomainContactVerification", + "parameters": [ + { + "name": "domain", + "in": "path", + "schema": { + "$ref": "#/components/schemas/DomainName" + }, + "required": true + }, + { + "name": "teamId", + "in": "query", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + }, + "required": false + } + ], + "security": [ + { + "bearerToken": [] + } + ], + "responses": { + "200": { + "description": "The registrant contact has been verified.", + "content": { + "application/json": { + "schema": { + "anyOf": [ + { + "$ref": "#/components/schemas/ContactVerified" + }, + { + "$ref": "#/components/schemas/ContactPendingVerification" + } + ] + } + } + } + }, + "400": { + "description": "There was something wrong with the request", + "content": { + "application/json": { + "schema": { + "anyOf": [ + { + "$ref": "#/components/schemas/BoughtTooRecently" + }, + { + "$ref": "#/components/schemas/DomainNotRegistered" + }, + { + "$ref": "#/components/schemas/HttpApiDecodeError" + } + ] + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Unauthorized" + } + } + } + }, + "403": { + "description": "NotAuthorizedForScope", + "content": { + "application/json": { + "schema": { + "anyOf": [ + { + "$ref": "#/components/schemas/NotAuthorizedForScope" + }, + { + "$ref": "#/components/schemas/Forbidden" + } + ] + } + } + } + }, + "404": { + "description": "The domain was not found in our system.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DomainNotFound" + } + } + } + }, + "429": { + "description": "TooManyRequests", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TooManyRequests" + } + } + } + }, + "500": { + "description": "InternalServerError", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InternalServerError" + } + } + } + } + }, + "description": "Get the registrant contact verification status for a domain. Use this after purchasing a domain to determine whether the contact has been verified. Note that a bought_too_recently error will be returned if the domain was bought less than 30 minutes before the request.", + "summary": "Get contact verification status for a domain" + } + }, + "/v1/registrar/domains/{domain}/contact-info/schema": { + "get": { + "tags": [ + "domains-registrar" + ], + "operationId": "getContactInfoSchema", + "parameters": [ + { + "name": "domain", + "in": "path", + "schema": { + "$ref": "#/components/schemas/DomainName" + }, + "required": true + }, + { + "name": "teamId", + "in": "query", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + }, + "required": false + } + ], + "security": [ + { + "bearerToken": [] + } + ], + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": {} + } + } + } + }, + "400": { + "description": "There was something wrong with the request", + "content": { + "application/json": { + "schema": { + "anyOf": [ + { + "$ref": "#/components/schemas/BadRequest" + }, + { + "$ref": "#/components/schemas/HttpApiDecodeError" + } + ] + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Unauthorized" + } + } + } + }, + "403": { + "description": "NotAuthorizedForScope", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NotAuthorizedForScope" + } + } + } + }, + "429": { + "description": "TooManyRequests", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TooManyRequests" + } + } + } + }, + "500": { + "description": "InternalServerError", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InternalServerError" + } + } + } + } + }, + "description": "Some TLDs require additional contact information. Use this endpoint to get the schema for the tld-specific contact information for a domain.", + "summary": "Get contact info schema" + } + }, + "/v1/registrar/orders/{orderId}": { + "get": { + "tags": [ + "domains-registrar" + ], + "operationId": "getOrder", + "parameters": [ + { + "name": "orderId", + "in": "path", + "schema": { + "$ref": "#/components/schemas/OrderId" + }, + "required": true + }, + { + "name": "teamId", + "in": "query", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + }, + "required": false + } + ], + "security": [ + { + "bearerToken": [] + } + ], + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "orderId", + "domains", + "status" + ], + "properties": { + "orderId": { + "$ref": "#/components/schemas/OrderId" + }, + "domains": { + "type": "array", + "items": { + "anyOf": [ + { + "type": "object", + "required": [ + "purchaseType", + "autoRenew", + "years", + "domainName", + "status", + "price" + ], + "properties": { + "purchaseType": { + "type": "string", + "enum": [ + "purchase" + ] + }, + "autoRenew": { + "type": "boolean" + }, + "years": { + "type": "number", + "description": "The number of years the domain is being purchased for." + }, + "domainName": { + "$ref": "#/components/schemas/DomainName" + }, + "status": { + "type": "string", + "enum": [ + "pending", + "completed", + "failed", + "refunded", + "refund-failed" + ] + }, + "price": { + "type": "number", + "minimum": 0.01 + }, + "error": { + "anyOf": [ + { + "anyOf": [ + { + "type": "object", + "required": [ + "code", + "details" + ], + "properties": { + "code": { + "type": "string", + "enum": [ + "unsupported-language-code" + ] + }, + "details": { + "type": "object", + "required": [ + "detectedLanguageCode" + ], + "properties": { + "detectedLanguageCode": { + "type": "string" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "code", + "details" + ], + "properties": { + "code": { + "type": "string", + "enum": [ + "incorrect-language-code" + ] + }, + "details": { + "type": "object", + "required": [ + "detectedLanguageCode" + ], + "properties": { + "detectedLanguageCode": { + "type": "string" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "code" + ], + "properties": { + "code": { + "type": "string", + "enum": [ + "client-transfer-prohibited" + ] + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "code" + ], + "properties": { + "code": { + "type": "string", + "enum": [ + "incorrect-auth-code" + ] + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "code" + ], + "properties": { + "code": { + "type": "string", + "enum": [ + "claims-notice-required" + ] + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "code", + "details" + ], + "properties": { + "code": { + "type": "string", + "enum": [ + "cannot-transfer-in-until" + ] + }, + "details": { + "type": "object", + "required": [ + "numDaysUntilTransferrable" + ], + "properties": { + "numDaysUntilTransferrable": { + "type": "number" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "code" + ], + "properties": { + "code": { + "type": "string", + "enum": [ + "account-transfer-required" + ] + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "code" + ], + "properties": { + "code": { + "type": "string", + "enum": [ + "price-change" + ] + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "code" + ], + "properties": { + "code": { + "type": "string", + "enum": [ + "unavailable-legal" + ] + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "code", + "details" + ], + "properties": { + "code": { + "type": "string", + "enum": [ + "invalid-contact" + ] + }, + "details": { + "type": "object", + "properties": { + "invalidField": { + "type": "string", + "enum": [ + "firstName", + "lastName", + "email", + "phone", + "address1", + "address2", + "city", + "state", + "zip", + "country", + "companyName", + "fax" + ] + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + ] + }, + { + "type": "object", + "required": [ + "code" + ], + "properties": { + "code": { + "type": "string" + }, + "details": { + "title": "unknown" + } + }, + "additionalProperties": false + } + ] + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "purchaseType", + "years", + "domainName", + "status", + "price" + ], + "properties": { + "purchaseType": { + "type": "string", + "enum": [ + "renewal" + ] + }, + "years": { + "type": "number", + "description": "The number of years the domain is being renewed for." + }, + "domainName": { + "$ref": "#/components/schemas/DomainName" + }, + "status": { + "type": "string", + "enum": [ + "pending", + "completed", + "failed", + "refunded", + "refund-failed" + ] + }, + "price": { + "type": "number", + "minimum": 0.01 + }, + "error": { + "anyOf": [ + { + "anyOf": [ + { + "type": "object", + "required": [ + "code", + "details" + ], + "properties": { + "code": { + "type": "string", + "enum": [ + "unsupported-language-code" + ] + }, + "details": { + "type": "object", + "required": [ + "detectedLanguageCode" + ], + "properties": { + "detectedLanguageCode": { + "type": "string" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "code", + "details" + ], + "properties": { + "code": { + "type": "string", + "enum": [ + "incorrect-language-code" + ] + }, + "details": { + "type": "object", + "required": [ + "detectedLanguageCode" + ], + "properties": { + "detectedLanguageCode": { + "type": "string" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "code" + ], + "properties": { + "code": { + "type": "string", + "enum": [ + "client-transfer-prohibited" + ] + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "code" + ], + "properties": { + "code": { + "type": "string", + "enum": [ + "incorrect-auth-code" + ] + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "code" + ], + "properties": { + "code": { + "type": "string", + "enum": [ + "claims-notice-required" + ] + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "code", + "details" + ], + "properties": { + "code": { + "type": "string", + "enum": [ + "cannot-transfer-in-until" + ] + }, + "details": { + "type": "object", + "required": [ + "numDaysUntilTransferrable" + ], + "properties": { + "numDaysUntilTransferrable": { + "type": "number" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "code" + ], + "properties": { + "code": { + "type": "string", + "enum": [ + "account-transfer-required" + ] + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "code" + ], + "properties": { + "code": { + "type": "string", + "enum": [ + "price-change" + ] + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "code" + ], + "properties": { + "code": { + "type": "string", + "enum": [ + "unavailable-legal" + ] + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "code", + "details" + ], + "properties": { + "code": { + "type": "string", + "enum": [ + "invalid-contact" + ] + }, + "details": { + "type": "object", + "properties": { + "invalidField": { + "type": "string", + "enum": [ + "firstName", + "lastName", + "email", + "phone", + "address1", + "address2", + "city", + "state", + "zip", + "country", + "companyName", + "fax" + ] + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + ] + }, + { + "type": "object", + "required": [ + "code" + ], + "properties": { + "code": { + "type": "string" + }, + "details": { + "title": "unknown" + } + }, + "additionalProperties": false + } + ] + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "purchaseType", + "autoRenew", + "years", + "domainName", + "status", + "price" + ], + "properties": { + "purchaseType": { + "type": "string", + "enum": [ + "transfer" + ] + }, + "autoRenew": { + "type": "boolean" + }, + "years": { + "type": "number", + "description": "The number of years the domain is being transferred for." + }, + "domainName": { + "$ref": "#/components/schemas/DomainName" + }, + "status": { + "type": "string", + "enum": [ + "pending", + "completed", + "failed", + "refunded", + "refund-failed" + ] + }, + "price": { + "type": "number", + "minimum": 0.01 + }, + "error": { + "anyOf": [ + { + "anyOf": [ + { + "type": "object", + "required": [ + "code", + "details" + ], + "properties": { + "code": { + "type": "string", + "enum": [ + "unsupported-language-code" + ] + }, + "details": { + "type": "object", + "required": [ + "detectedLanguageCode" + ], + "properties": { + "detectedLanguageCode": { + "type": "string" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "code", + "details" + ], + "properties": { + "code": { + "type": "string", + "enum": [ + "incorrect-language-code" + ] + }, + "details": { + "type": "object", + "required": [ + "detectedLanguageCode" + ], + "properties": { + "detectedLanguageCode": { + "type": "string" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "code" + ], + "properties": { + "code": { + "type": "string", + "enum": [ + "client-transfer-prohibited" + ] + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "code" + ], + "properties": { + "code": { + "type": "string", + "enum": [ + "incorrect-auth-code" + ] + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "code" + ], + "properties": { + "code": { + "type": "string", + "enum": [ + "claims-notice-required" + ] + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "code", + "details" + ], + "properties": { + "code": { + "type": "string", + "enum": [ + "cannot-transfer-in-until" + ] + }, + "details": { + "type": "object", + "required": [ + "numDaysUntilTransferrable" + ], + "properties": { + "numDaysUntilTransferrable": { + "type": "number" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "code" + ], + "properties": { + "code": { + "type": "string", + "enum": [ + "account-transfer-required" + ] + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "code" + ], + "properties": { + "code": { + "type": "string", + "enum": [ + "price-change" + ] + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "code" + ], + "properties": { + "code": { + "type": "string", + "enum": [ + "unavailable-legal" + ] + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "code", + "details" + ], + "properties": { + "code": { + "type": "string", + "enum": [ + "invalid-contact" + ] + }, + "details": { + "type": "object", + "properties": { + "invalidField": { + "type": "string", + "enum": [ + "firstName", + "lastName", + "email", + "phone", + "address1", + "address2", + "city", + "state", + "zip", + "country", + "companyName", + "fax" + ] + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + ] + }, + { + "type": "object", + "required": [ + "code" + ], + "properties": { + "code": { + "type": "string" + }, + "details": { + "title": "unknown" + } + }, + "additionalProperties": false + } + ] + } + }, + "additionalProperties": false + } + ] + } + }, + "status": { + "type": "string", + "enum": [ + "draft", + "purchasing", + "completed", + "failed" + ] + }, + "error": { + "anyOf": [ + { + "anyOf": [ + { + "type": "object", + "required": [ + "code" + ], + "properties": { + "code": { + "type": "string", + "enum": [ + "payment-failed" + ] + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "code", + "details" + ], + "properties": { + "code": { + "type": "string", + "enum": [ + "tld-outage" + ] + }, + "details": { + "type": "object", + "required": [ + "tlds" + ], + "properties": { + "tlds": { + "type": "array", + "items": { + "type": "object", + "required": [ + "tldName", + "endsAt" + ], + "properties": { + "tldName": { + "type": "string" + }, + "endsAt": { + "type": "string" + } + }, + "additionalProperties": false + } + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "code", + "details" + ], + "properties": { + "code": { + "type": "string", + "enum": [ + "price-mismatch" + ] + }, + "details": { + "type": "object", + "required": [ + "expectedPrice" + ], + "properties": { + "expectedPrice": { + "type": "number" + }, + "actualPrice": { + "type": "number" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "code" + ], + "properties": { + "code": { + "type": "string", + "enum": [ + "unexpected-error" + ] + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "code", + "details" + ], + "properties": { + "code": { + "type": "string", + "enum": [ + "claims-required" + ] + }, + "details": { + "type": "object", + "required": [ + "message", + "domainNames" + ], + "properties": { + "message": { + "type": "string" + }, + "domainNames": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "code" + ], + "properties": { + "code": { + "type": "string", + "enum": [ + "domain-mismatch" + ] + } + }, + "additionalProperties": false + } + ] + }, + { + "type": "object", + "required": [ + "code" + ], + "properties": { + "code": { + "type": "string" + }, + "details": { + "title": "unknown" + } + }, + "additionalProperties": false + } + ] + } + }, + "additionalProperties": false + } + } + } + }, + "400": { + "description": "There was something wrong with the request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HttpApiDecodeError" + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Unauthorized" + } + } + } + }, + "403": { + "description": "NotAuthorizedForScope", + "content": { + "application/json": { + "schema": { + "anyOf": [ + { + "$ref": "#/components/schemas/NotAuthorizedForScope" + }, + { + "$ref": "#/components/schemas/Forbidden" + } + ] + } + } + } + }, + "404": { + "description": "NotFound", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/NotFound" + } + } + } + }, + "429": { + "description": "TooManyRequests", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TooManyRequests" + } + } + } + }, + "500": { + "description": "InternalServerError", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InternalServerError" + } + } + } + } + }, + "description": "Get information about a domain order by its ID", + "summary": "Get a domain order" + } + }, + "/v6/domains/{domain}/config": { + "get": { + "description": "Get a Domain's configuration.", + "operationId": "getDomainConfig", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Get a Domain's configuration", + "tags": [ + "domains" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "configuredBy": { + "nullable": true, + "type": "string", + "enum": [ + "A", + "CNAME", + "dns-01", + "http", + null + ], + "description": "How we see the domain's configuration. - `CNAME`: Domain has a CNAME pointing to Vercel. - `A`: Domain's A record is resolving to Vercel. - `http`: Domain is resolving to Vercel but may be behind a Proxy. - `dns-01`: Domain is not resolving to Vercel but dns-01 challenge is enabled. - `null`: Domain is not resolving to Vercel." + }, + "acceptedChallenges": { + "items": { + "type": "string", + "enum": [ + "dns-01", + "http-01" + ], + "description": "Which challenge types the domain can use for issuing certs." + }, + "type": "array", + "description": "Which challenge types the domain can use for issuing certs." + }, + "recommendedIPv4": { + "items": { + "properties": { + "rank": { + "type": "number" + }, + "value": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "rank", + "value" + ], + "type": "object", + "description": "Recommended IPv4s for the domain. rank=1 is the preferred value(s) to use. Only using 1 ip value is acceptable." + }, + "type": "array", + "description": "Recommended IPv4s for the domain. rank=1 is the preferred value(s) to use. Only using 1 ip value is acceptable." + }, + "recommendedCNAME": { + "items": { + "properties": { + "rank": { + "type": "number" + }, + "value": { + "type": "string" + } + }, + "required": [ + "rank", + "value" + ], + "type": "object", + "description": "Recommended CNAMEs for the domain. rank=1 is the preferred value to use." + }, + "type": "array", + "description": "Recommended CNAMEs for the domain. rank=1 is the preferred value to use." + }, + "misconfigured": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether or not the domain is configured AND we can automatically generate a TLS certificate." + } + }, + "required": [ + "acceptedChallenges", + "configuredBy", + "misconfigured", + "recommendedCNAME", + "recommendedIPv4" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "domain", + "description": "The name of the domain.", + "in": "path", + "required": true, + "schema": { + "description": "The name of the domain.", + "type": "string", + "example": "example.com" + } + }, + { + "name": "projectIdOrName", + "description": "The project id or name that will be associated with the domain. Use this when the domain is not yet associated with a project.", + "in": "query", + "required": false, + "schema": { + "description": "The project id or name that will be associated with the domain. Use this when the domain is not yet associated with a project.", + "type": "string" + } + }, + { + "name": "strict", + "description": "When true, the response will only include the nameservers assigned directly to the specified domain. When false and there are no nameservers assigned directly to the specified domain, the response will include the nameservers of the domain's parent zone.", + "in": "query", + "required": false, + "schema": { + "enum": [ + "true", + "false" + ], + "description": "When true, the response will only include the nameservers assigned directly to the specified domain. When false and there are no nameservers assigned directly to the specified domain, the response will include the nameservers of the domain's parent zone." + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + } + }, + "/v9/domains/{domain}/verification": { + "get": { + "description": "Get the TXT verification record needed to claim ownership of a domain for the authenticated team. The caller must add this TXT record to `_vercel.{domain}` in their DNS configuration, then call POST /domains/:domain/claim to complete the ownership transfer.", + "operationId": "getDomainVerificationRecord", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Get Domain Verification Record", + "tags": [ + "domains" + ], + "responses": { + "200": { + "description": "Returns the TXT record needed to verify domain ownership.", + "content": { + "application/json": { + "schema": { + "properties": { + "txtRecord": { + "type": "string" + }, + "verificationDomain": { + "type": "string" + } + }, + "required": [ + "txtRecord", + "verificationDomain" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "domain", + "description": "The domain name to get the verification record for", + "in": "path", + "required": true, + "schema": { + "description": "The domain name to get the verification record for", + "type": "string", + "example": "example.com" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + } + }, + "/v9/domains/{domain}/claim": { + "post": { + "description": "Claim ownership of a domain for the authenticated team by verifying a TXT record. The caller must first add a TXT record to `_vercel.{domain}` (obtained from GET /domains/:domain/verification), then call this endpoint to complete the ownership transfer. If the TXT record is verified, the domain ownership will be transferred to the caller's team, even if the domain is currently owned by another user or team.", + "operationId": "claimDomainOwnership", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Claim Domain Ownership", + "tags": [ + "domains" + ], + "responses": { + "200": { + "description": "Domain ownership successfully claimed.", + "content": { + "application/json": { + "schema": { + "properties": { + "domain": { + "properties": { + "expiresAt": { + "nullable": true, + "type": "number", + "description": "Timestamp in milliseconds at which the domain is set to expire. null if not bought with Vercel." + }, + "verified": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "If the domain has the ownership verified.", + "example": true + }, + "nameservers": { + "items": { + "type": "string" + }, + "type": "array", + "description": "A list of the current nameservers of the domain.", + "example": [ + "ns1.nameserver.net", + "ns2.nameserver.net" + ] + }, + "intendedNameservers": { + "items": { + "type": "string" + }, + "type": "array", + "description": "A list of the intended nameservers for the domain to point to Vercel DNS.", + "example": [ + "ns1.vercel-dns.com", + "ns2.vercel-dns.com" + ] + }, + "customNameservers": { + "items": { + "type": "string" + }, + "type": "array", + "description": "A list of custom nameservers for the domain to point to. Only applies to domains purchased with Vercel.", + "example": [ + "ns1.nameserver.net", + "ns2.nameserver.net" + ] + }, + "creator": { + "properties": { + "username": { + "type": "string" + }, + "email": { + "type": "string" + }, + "customerId": { + "nullable": true, + "type": "string" + }, + "isDomainReseller": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "id": { + "type": "string" + } + }, + "required": [ + "email", + "id", + "username" + ], + "type": "object", + "description": "An object containing information of the domain creator, including the user's id, username, and email.", + "example": { + "id": "ZspSRT4ljIEEmMHgoDwKWDei", + "username": "vercel_user", + "email": "demo@example.com" + } + }, + "echMode": { + "type": "string", + "enum": [ + "auto", + "disabled", + "enabled" + ], + "description": "Whether the domain is enrolled in Encrypted Client Hello. `auto` leaves the decision to Vercel, `enabled` always enrolls, and `disabled` never enrolls and opts out of automatic enrollment.", + "example": "auto" + }, + "name": { + "type": "string", + "description": "The domain name.", + "example": "example.com" + }, + "teamId": { + "nullable": true, + "type": "string" + }, + "boughtAt": { + "nullable": true, + "type": "number", + "description": "If it was purchased through Vercel, the timestamp in milliseconds when it was purchased.", + "example": 1613602938882 + }, + "createdAt": { + "type": "number", + "description": "Timestamp in milliseconds when the domain was created in the registry.", + "example": 1613602938882 + }, + "id": { + "type": "string", + "description": "The unique identifier of the domain.", + "example": "EmTbe5CEJyTk2yVAHBUWy4A3sRusca3GCwRjTC1bpeVnt1" + }, + "renew": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Indicates whether the domain is set to automatically renew.", + "example": true + }, + "serviceType": { + "type": "string", + "enum": [ + "external", + "na", + "zeit.world" + ], + "description": "The type of service the domain is handled by. `external` if the DNS is externally handled, `zeit.world` if handled with Vercel, or `na` if the service is not available.", + "example": "zeit.world" + }, + "transferredAt": { + "nullable": true, + "type": "number", + "description": "Timestamp in milliseconds at which the domain was successfully transferred into Vercel. `null` if the transfer is still processing or was never transferred in.", + "example": 1613602938882 + }, + "transferStartedAt": { + "type": "number", + "description": "If transferred into Vercel, timestamp in milliseconds when the domain transfer was initiated.", + "example": 1613602938882 + }, + "userId": { + "type": "string" + } + }, + "required": [ + "boughtAt", + "createdAt", + "creator", + "echMode", + "expiresAt", + "id", + "intendedNameservers", + "name", + "nameservers", + "serviceType", + "teamId", + "userId", + "verified" + ], + "type": "object" + } + }, + "required": [ + "domain" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "domain", + "description": "The domain name to claim ownership of", + "in": "path", + "required": true, + "schema": { + "description": "The domain name to claim ownership of", + "type": "string", + "example": "example.com" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + } + }, + "/v1/domains/{domain}/project-domains": { + "get": { + "description": "List all project domains associated with an apex domain owned by the authenticated account.", + "operationId": "getDomainProjectDomains", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "List Project Domains by Apex Domain", + "tags": [ + "domains" + ], + "responses": { + "200": { + "description": "Successful response retrieving project domains for an apex domain.", + "content": { + "application/json": { + "schema": { + "properties": { + "projectDomains": { + "items": { + "properties": { + "name": { + "type": "string" + }, + "apexName": { + "type": "string" + }, + "projectId": { + "type": "string" + }, + "redirect": { + "nullable": true, + "type": "string" + }, + "redirectStatusCode": { + "nullable": true, + "type": "number", + "enum": [ + 301, + 302, + 307, + 308, + null + ] + }, + "gitBranch": { + "nullable": true, + "type": "string" + }, + "customEnvironmentId": { + "nullable": true, + "type": "string" + }, + "updatedAt": { + "type": "number" + }, + "createdAt": { + "type": "number" + }, + "verified": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "`true` if the domain is verified for use with the project. If `false` it will not be used as an alias on this project until the challenge in `verification` is completed." + }, + "verification": { + "items": { + "properties": { + "type": { + "type": "string" + }, + "domain": { + "type": "string" + }, + "value": { + "type": "string" + }, + "reason": { + "type": "string" + } + }, + "required": [ + "domain", + "reason", + "type", + "value" + ], + "type": "object", + "description": "A list of verification challenges, one of which must be completed to verify the domain for use on the project. After the challenge is complete `POST /projects/:idOrName/domains/:domain/verify` to verify the domain. Possible challenges: - If `verification.type = TXT` the `verification.domain` will be checked for a TXT record matching `verification.value`." + }, + "type": "array", + "description": "A list of verification challenges, one of which must be completed to verify the domain for use on the project. After the challenge is complete `POST /projects/:idOrName/domains/:domain/verify` to verify the domain. Possible challenges: - If `verification.type = TXT` the `verification.domain` will be checked for a TXT record matching `verification.value`." + } + }, + "required": [ + "apexName", + "name", + "projectId", + "verified" + ], + "type": "object" + }, + "type": "array" + }, + "pagination": { + "$ref": "#/components/schemas/Pagination" + } + }, + "required": [ + "pagination", + "projectDomains" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "domain", + "description": "The apex domain name.", + "in": "path", + "required": true, + "schema": { + "description": "The apex domain name.", + "type": "string", + "example": "example.com" + } + }, + { + "name": "limit", + "description": "Maximum number of project domains to list from a request.", + "in": "query", + "required": false, + "schema": { + "description": "Maximum number of project domains to list from a request.", + "type": "number", + "example": 20 + } + }, + { + "name": "since", + "description": "Get project domains created after this JavaScript timestamp.", + "in": "query", + "required": false, + "schema": { + "description": "Get project domains created after this JavaScript timestamp.", + "type": "number", + "example": 1609499532000 + } + }, + { + "name": "until", + "description": "Get project domains created before this JavaScript timestamp.", + "in": "query", + "required": false, + "schema": { + "description": "Get project domains created before this JavaScript timestamp.", + "type": "number", + "example": 1612264332000 + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + } + }, + "/v5/domains/{domain}": { + "get": { + "description": "Get information for a single domain in an account or team.", + "operationId": "getDomain", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Get Information for a Single Domain", + "tags": [ + "domains" + ], + "responses": { + "200": { + "description": "Successful response retrieving an information for a specific domains.", + "content": { + "application/json": { + "schema": { + "properties": { + "domain": { + "properties": { + "suffix": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "expiresAt": { + "nullable": true, + "type": "number", + "description": "Timestamp in milliseconds at which the domain is set to expire. null if not bought with Vercel." + }, + "verified": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "If the domain has the ownership verified.", + "example": true + }, + "nameservers": { + "items": { + "type": "string" + }, + "type": "array", + "description": "A list of the current nameservers of the domain.", + "example": [ + "ns1.nameserver.net", + "ns2.nameserver.net" + ] + }, + "intendedNameservers": { + "items": { + "type": "string" + }, + "type": "array", + "description": "A list of the intended nameservers for the domain to point to Vercel DNS.", + "example": [ + "ns1.vercel-dns.com", + "ns2.vercel-dns.com" + ] + }, + "customNameservers": { + "items": { + "type": "string" + }, + "type": "array", + "description": "A list of custom nameservers for the domain to point to. Only applies to domains purchased with Vercel.", + "example": [ + "ns1.nameserver.net", + "ns2.nameserver.net" + ] + }, + "creator": { + "properties": { + "username": { + "type": "string" + }, + "email": { + "type": "string" + }, + "customerId": { + "nullable": true, + "type": "string" + }, + "isDomainReseller": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "id": { + "type": "string" + } + }, + "required": [ + "email", + "id", + "username" + ], + "type": "object", + "description": "An object containing information of the domain creator, including the user's id, username, and email.", + "example": { + "id": "ZspSRT4ljIEEmMHgoDwKWDei", + "username": "vercel_user", + "email": "demo@example.com" + } + }, + "echMode": { + "type": "string", + "enum": [ + "auto", + "disabled", + "enabled" + ], + "description": "Whether the domain is enrolled in Encrypted Client Hello. `auto` leaves the decision to Vercel, `enabled` always enrolls, and `disabled` never enrolls and opts out of automatic enrollment.", + "example": "auto" + }, + "name": { + "type": "string", + "description": "The domain name.", + "example": "example.com" + }, + "teamId": { + "nullable": true, + "type": "string" + }, + "boughtAt": { + "nullable": true, + "type": "number", + "description": "If it was purchased through Vercel, the timestamp in milliseconds when it was purchased.", + "example": 1613602938882 + }, + "createdAt": { + "type": "number", + "description": "Timestamp in milliseconds when the domain was created in the registry.", + "example": 1613602938882 + }, + "id": { + "type": "string", + "description": "The unique identifier of the domain.", + "example": "EmTbe5CEJyTk2yVAHBUWy4A3sRusca3GCwRjTC1bpeVnt1" + }, + "renew": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Indicates whether the domain is set to automatically renew.", + "example": true + }, + "serviceType": { + "type": "string", + "enum": [ + "external", + "na", + "zeit.world" + ], + "description": "The type of service the domain is handled by. `external` if the DNS is externally handled, `zeit.world` if handled with Vercel, or `na` if the service is not available.", + "example": "zeit.world" + }, + "transferredAt": { + "nullable": true, + "type": "number", + "description": "Timestamp in milliseconds at which the domain was successfully transferred into Vercel. `null` if the transfer is still processing or was never transferred in.", + "example": 1613602938882 + }, + "transferStartedAt": { + "type": "number", + "description": "If transferred into Vercel, timestamp in milliseconds when the domain transfer was initiated.", + "example": 1613602938882 + }, + "userId": { + "type": "string" + } + }, + "required": [ + "boughtAt", + "createdAt", + "creator", + "echMode", + "expiresAt", + "id", + "intendedNameservers", + "name", + "nameservers", + "serviceType", + "suffix", + "teamId", + "userId", + "verified" + ], + "type": "object" + } + }, + "required": [ + "domain" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + } + }, + "x-vercel-cli": { + "supportedSubcommands": true, + "supportedProduction": false + }, + "parameters": [ + { + "name": "domain", + "description": "The name of the domain.", + "in": "path", + "required": true, + "schema": { + "description": "The name of the domain.", + "type": "string", + "example": "example.com" + }, + "x-vercel-cli": { + "kind": "argument" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + } + }, + "/v5/domains": { + "get": { + "description": "Retrieves a list of domains registered for the authenticated user or team. By default it returns the last 20 domains if no limit is provided.", + "operationId": "getDomains", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "List all the domains", + "tags": [ + "domains" + ], + "responses": { + "200": { + "description": "Successful response retrieving a list of domains.", + "content": { + "application/json": { + "schema": { + "properties": { + "domains": { + "items": { + "properties": { + "expiresAt": { + "nullable": true, + "type": "number", + "description": "Timestamp in milliseconds at which the domain is set to expire. null if not bought with Vercel." + }, + "verified": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "If the domain has the ownership verified.", + "example": true + }, + "nameservers": { + "items": { + "type": "string" + }, + "type": "array", + "description": "A list of the current nameservers of the domain.", + "example": [ + "ns1.nameserver.net", + "ns2.nameserver.net" + ] + }, + "intendedNameservers": { + "items": { + "type": "string" + }, + "type": "array", + "description": "A list of the intended nameservers for the domain to point to Vercel DNS.", + "example": [ + "ns1.vercel-dns.com", + "ns2.vercel-dns.com" + ] + }, + "customNameservers": { + "items": { + "type": "string" + }, + "type": "array", + "description": "A list of custom nameservers for the domain to point to. Only applies to domains purchased with Vercel.", + "example": [ + "ns1.nameserver.net", + "ns2.nameserver.net" + ] + }, + "creator": { + "properties": { + "username": { + "type": "string" + }, + "email": { + "type": "string" + }, + "customerId": { + "nullable": true, + "type": "string" + }, + "isDomainReseller": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "id": { + "type": "string" + } + }, + "required": [ + "email", + "id", + "username" + ], + "type": "object", + "description": "An object containing information of the domain creator, including the user's id, username, and email.", + "example": { + "id": "ZspSRT4ljIEEmMHgoDwKWDei", + "username": "vercel_user", + "email": "demo@example.com" + } + }, + "echMode": { + "type": "string", + "enum": [ + "auto", + "disabled", + "enabled" + ], + "description": "Whether the domain is enrolled in Encrypted Client Hello. `auto` leaves the decision to Vercel, `enabled` always enrolls, and `disabled` never enrolls and opts out of automatic enrollment.", + "example": "auto" + }, + "name": { + "type": "string", + "description": "The domain name.", + "example": "example.com" + }, + "teamId": { + "nullable": true, + "type": "string" + }, + "boughtAt": { + "nullable": true, + "type": "number", + "description": "If it was purchased through Vercel, the timestamp in milliseconds when it was purchased.", + "example": 1613602938882 + }, + "createdAt": { + "type": "number", + "description": "Timestamp in milliseconds when the domain was created in the registry.", + "example": 1613602938882 + }, + "id": { + "type": "string", + "description": "The unique identifier of the domain.", + "example": "EmTbe5CEJyTk2yVAHBUWy4A3sRusca3GCwRjTC1bpeVnt1" + }, + "renew": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Indicates whether the domain is set to automatically renew.", + "example": true + }, + "serviceType": { + "type": "string", + "enum": [ + "external", + "na", + "zeit.world" + ], + "description": "The type of service the domain is handled by. `external` if the DNS is externally handled, `zeit.world` if handled with Vercel, or `na` if the service is not available.", + "example": "zeit.world" + }, + "transferredAt": { + "nullable": true, + "type": "number", + "description": "Timestamp in milliseconds at which the domain was successfully transferred into Vercel. `null` if the transfer is still processing or was never transferred in.", + "example": 1613602938882 + }, + "transferStartedAt": { + "type": "number", + "description": "If transferred into Vercel, timestamp in milliseconds when the domain transfer was initiated.", + "example": 1613602938882 + }, + "userId": { + "type": "string" + } + }, + "required": [ + "boughtAt", + "createdAt", + "creator", + "echMode", + "expiresAt", + "id", + "intendedNameservers", + "name", + "nameservers", + "serviceType", + "teamId", + "userId", + "verified" + ], + "type": "object" + }, + "type": "array" + }, + "pagination": { + "$ref": "#/components/schemas/Pagination" + } + }, + "required": [ + "domains", + "pagination" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "409": { + "description": "" + }, + "410": { + "description": "" + } + }, + "x-vercel-cli": { + "supportedSubcommands": true, + "supportedProduction": false, + "aliases": [ + "ls", + "list" + ] + }, + "parameters": [ + { + "name": "limit", + "description": "Maximum number of domains to list from a request.", + "in": "query", + "schema": { + "description": "Maximum number of domains to list from a request.", + "type": "number", + "example": 20 + } + }, + { + "name": "since", + "description": "Get domains created after this JavaScript timestamp.", + "in": "query", + "schema": { + "description": "Get domains created after this JavaScript timestamp.", + "type": "number", + "example": 1609499532000 + } + }, + { + "name": "until", + "description": "Get domains created before this JavaScript timestamp.", + "in": "query", + "schema": { + "description": "Get domains created before this JavaScript timestamp.", + "type": "number", + "example": 1612264332000 + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + } + }, + "/v7/domains": { + "post": { + "description": "This endpoint is used for adding a new apex domain name with Vercel for the authenticating user. Note: This endpoint is no longer used for initiating domain transfers from external registrars to Vercel. For this, please use the endpoint [Transfer-in a domain](https://vercel.com/docs/rest-api/reference/endpoints/domains-registrar/transfer-in-a-domain).", + "operationId": "createOrTransferDomain", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Add an existing domain to the Vercel platform", + "tags": [ + "domains" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "domain": { + "properties": { + "expiresAt": { + "nullable": true, + "type": "number", + "description": "Timestamp in milliseconds at which the domain is set to expire. null if not bought with Vercel." + }, + "verified": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "If the domain has the ownership verified.", + "example": true + }, + "nameservers": { + "items": { + "type": "string" + }, + "type": "array", + "description": "A list of the current nameservers of the domain.", + "example": [ + "ns1.nameserver.net", + "ns2.nameserver.net" + ] + }, + "intendedNameservers": { + "items": { + "type": "string" + }, + "type": "array", + "description": "A list of the intended nameservers for the domain to point to Vercel DNS.", + "example": [ + "ns1.vercel-dns.com", + "ns2.vercel-dns.com" + ] + }, + "customNameservers": { + "items": { + "type": "string" + }, + "type": "array", + "description": "A list of custom nameservers for the domain to point to. Only applies to domains purchased with Vercel.", + "example": [ + "ns1.nameserver.net", + "ns2.nameserver.net" + ] + }, + "creator": { + "properties": { + "username": { + "type": "string" + }, + "email": { + "type": "string" + }, + "customerId": { + "nullable": true, + "type": "string" + }, + "isDomainReseller": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "id": { + "type": "string" + } + }, + "required": [ + "email", + "id", + "username" + ], + "type": "object", + "description": "An object containing information of the domain creator, including the user's id, username, and email.", + "example": { + "id": "ZspSRT4ljIEEmMHgoDwKWDei", + "username": "vercel_user", + "email": "demo@example.com" + } + }, + "echMode": { + "type": "string", + "enum": [ + "auto", + "disabled", + "enabled" + ], + "description": "Whether the domain is enrolled in Encrypted Client Hello. `auto` leaves the decision to Vercel, `enabled` always enrolls, and `disabled` never enrolls and opts out of automatic enrollment.", + "example": "auto" + }, + "name": { + "type": "string", + "description": "The domain name.", + "example": "example.com" + }, + "teamId": { + "nullable": true, + "type": "string" + }, + "boughtAt": { + "nullable": true, + "type": "number", + "description": "If it was purchased through Vercel, the timestamp in milliseconds when it was purchased.", + "example": 1613602938882 + }, + "createdAt": { + "type": "number", + "description": "Timestamp in milliseconds when the domain was created in the registry.", + "example": 1613602938882 + }, + "id": { + "type": "string", + "description": "The unique identifier of the domain.", + "example": "EmTbe5CEJyTk2yVAHBUWy4A3sRusca3GCwRjTC1bpeVnt1" + }, + "renew": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Indicates whether the domain is set to automatically renew.", + "example": true + }, + "serviceType": { + "type": "string", + "enum": [ + "external", + "na", + "zeit.world" + ], + "description": "The type of service the domain is handled by. `external` if the DNS is externally handled, `zeit.world` if handled with Vercel, or `na` if the service is not available.", + "example": "zeit.world" + }, + "transferredAt": { + "nullable": true, + "type": "number", + "description": "Timestamp in milliseconds at which the domain was successfully transferred into Vercel. `null` if the transfer is still processing or was never transferred in.", + "example": 1613602938882 + }, + "transferStartedAt": { + "type": "number", + "description": "If transferred into Vercel, timestamp in milliseconds when the domain transfer was initiated.", + "example": 1613602938882 + }, + "userId": { + "type": "string" + } + }, + "required": [ + "boughtAt", + "createdAt", + "creator", + "echMode", + "expiresAt", + "id", + "intendedNameservers", + "name", + "nameservers", + "serviceType", + "teamId", + "userId", + "verified" + ], + "type": "object" + } + }, + "required": [ + "domain" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "402": { + "description": "The account is missing a payment so payment method must be updated" + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "409": { + "description": "The domain is not allowed to be used" + }, + "410": { + "description": "" + } + }, + "x-vercel-cli": { + "supportedSubcommands": true, + "supportedProduction": false, + "bodyArguments": [ + "name" + ] + }, + "parameters": [ + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "method": { + "description": "The domain operation to perform. It can be either `add` or `move-in`.", + "type": "string", + "example": "add" + } + }, + "oneOf": [ + { + "additionalProperties": false, + "type": "object", + "description": "add", + "required": [ + "name" + ], + "properties": { + "name": { + "description": "The domain name you want to add.", + "type": "string", + "example": "example.com" + }, + "cdnEnabled": { + "description": "Whether the domain has the Vercel CDN enabled or not.", + "type": "boolean", + "example": true + }, + "zone": { + "description": "Whether to create a DNS zone on Vercel. Set `true` if using Vercel nameservers.", + "type": "boolean" + }, + "method": { + "description": "The domain operation to perform.", + "type": "string", + "example": "add" + } + } + }, + { + "additionalProperties": false, + "type": "object", + "description": "move-in", + "required": [ + "method", + "name" + ], + "properties": { + "name": { + "description": "The domain name you want to add.", + "type": "string", + "example": "example.com" + }, + "method": { + "description": "The domain operation to perform.", + "type": "string", + "example": "move-in" + }, + "token": { + "description": "The move-in token from Move Requested email.", + "type": "string", + "example": "fdhfr820ad#@FAdlj$$" + } + } + } + ] + } + } + } + } + } + }, + "/v3/domains/{domain}": { + "patch": { + "description": "Update or move apex domain. Note: This endpoint is no longer used for updating auto-renew or nameservers. For this, please use the endpoints [Update auto-renew for a domain](https://vercel.com/docs/rest-api/reference/endpoints/domains-registrar/update-auto-renew-for-a-domain) and [Update nameservers for a domain](https://vercel.com/docs/rest-api/reference/endpoints/domains-registrar/update-nameservers-for-a-domain).", + "operationId": "patchDomain", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Update or move apex domain", + "tags": [ + "domains" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "oneOf": [ + { + "properties": { + "moved": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "moved" + ], + "type": "object" + }, + { + "properties": { + "moved": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "token": { + "type": "string" + } + }, + "required": [ + "moved", + "token" + ], + "type": "object" + }, + { + "properties": { + "renew": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "customNameservers": { + "items": { + "type": "string" + }, + "type": "array" + }, + "zone": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "echMode": { + "type": "string", + "enum": [ + "auto", + "disabled", + "enabled" + ] + } + }, + "required": [ + "echMode" + ], + "type": "object" + } + ] + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid.\nOne of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "409": { + "description": "" + }, + "410": { + "description": "" + }, + "500": { + "description": "" + } + }, + "parameters": [ + { + "name": "domain", + "in": "path", + "schema": { + "type": "string" + }, + "required": true + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "oneOf": [ + { + "type": "object", + "description": "update", + "additionalProperties": false, + "properties": { + "op": { + "example": "update", + "type": "string" + }, + "renew": { + "description": "This field is deprecated. Please use PATCH /v1/registrar/domains/{domainName}/auto-renew instead.", + "type": "boolean", + "deprecated": true + }, + "customNameservers": { + "description": "This field is deprecated. Please use PATCH /v1/registrar/domains/{domainName}/nameservers instead.", + "items": { + "type": "string" + }, + "maxItems": 4, + "minItems": 0, + "type": "array", + "uniqueItems": true, + "deprecated": true + }, + "zone": { + "description": "Specifies whether this is a DNS zone that intends to use Vercel's nameservers.", + "type": "boolean" + }, + "echMode": { + "description": "Encrypted Client Hello enrollment. 'auto' leaves it to Vercel, 'disabled' never enrolls and opts out of automatic enrollment.", + "type": "string", + "enum": [ + "auto", + "disabled" + ] + } + } + }, + { + "type": "object", + "description": "move-out", + "additionalProperties": false, + "properties": { + "op": { + "example": "move-out", + "type": "string" + }, + "destination": { + "description": "User or team to move domain to", + "type": "string" + } + } + } + ] + } + } + }, + "required": true + }, + "x-speakeasy-test": false + } + }, + "/v6/domains/{domain}": { + "delete": { + "description": "Delete a previously registered domain name from Vercel. Deleting a domain will automatically remove any associated aliases.", + "operationId": "deleteDomain", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Remove a domain by name", + "tags": [ + "domains" + ], + "responses": { + "200": { + "description": "Successful response removing a domain.", + "content": { + "application/json": { + "schema": { + "properties": { + "uid": { + "type": "string" + } + }, + "required": [ + "uid" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "409": { + "description": "" + }, + "410": { + "description": "" + } + }, + "x-vercel-cli": { + "supportedSubcommands": true, + "supportedProduction": false + }, + "parameters": [ + { + "name": "domain", + "description": "The name of the domain.", + "in": "path", + "required": true, + "schema": { + "description": "The name of the domain.", + "type": "string", + "example": "example.com" + }, + "x-vercel-cli": { + "kind": "argument" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + } + }, + "/v1/log-drains/{id}": { + "get": { + "description": "Retrieves a Configurable Log Drain. This endpoint must be called with a team AccessToken (integration OAuth2 clients are not allowed). Only log drains owned by the authenticated team can be accessed.", + "operationId": "getConfigurableLogDrain", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Retrieves a Configurable Log Drain (deprecated)", + "tags": [ + "logDrains" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "createdFrom": { + "type": "string" + }, + "clientId": { + "type": "string" + }, + "configurationId": { + "type": "string" + }, + "projectsMetadata": { + "nullable": true, + "items": { + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "framework": { + "nullable": true, + "type": "string", + "enum": [ + "actix-web", + "angular", + "ash", + "astro", + "axum", + "blitzjs", + "brunch", + "bun", + "container", + "create-react-app", + "django", + "docusaurus", + "docusaurus-2", + "dojo", + "eleventy", + "elysia", + "ember", + "eve", + "express", + "factory-eve", + "fastapi", + "fasthtml", + "fastify", + "flask", + "gatsby", + "go", + "gridsome", + "h3", + "hexo", + "hono", + "hugo", + "hydrogen", + "ionic-angular", + "ionic-react", + "jekyll", + "koa", + "mastra", + "middleman", + "nestjs", + "nextjs", + "nitro", + "node", + "nuxtjs", + "parcel", + "polymer", + "preact", + "python", + "react-router", + "redwoodjs", + "remix", + "ruby", + "rust", + "saber", + "sanity", + "sanity-v2", + "sapper", + "scully", + "services", + "solidstart", + "solidstart-1", + "stencil", + "storybook", + "svelte", + "sveltekit", + "sveltekit-1", + "tanstack-start", + "tanstack-start-lovable", + "umijs", + "vite", + "vitepress", + "vue", + "vuepress", + "xmcp", + "zola", + null + ] + }, + "latestDeployment": { + "type": "string" + } + }, + "required": [ + "id", + "name" + ], + "type": "object" + }, + "type": "array" + }, + "integrationIcon": { + "type": "string" + }, + "integrationConfigurationUri": { + "type": "string" + }, + "integrationWebsite": { + "type": "string" + } + }, + "required": [ + "createdFrom" + ] + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + }, + "delete": { + "description": "Deletes a Configurable Log Drain. This endpoint must be called with a team AccessToken (integration OAuth2 clients are not allowed). Only log drains owned by the authenticated team can be deleted.", + "operationId": "deleteConfigurableLogDrain", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Deletes a Configurable Log Drain (deprecated)", + "tags": [ + "logDrains" + ], + "responses": { + "204": { + "description": "" + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + } + }, + "/v1/log-drains": { + "get": { + "description": "Retrieves a list of all the Log Drains owned by the account. This endpoint must be called with an account AccessToken (integration OAuth2 clients are not allowed). Only log drains owned by the authenticated account can be accessed.", + "operationId": "getAllLogDrains", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Retrieves a list of all the Log Drains (deprecated)", + "tags": [ + "logDrains" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "oneOf": [ + { + "items": { + "type": "object", + "properties": { + "createdFrom": { + "type": "string" + }, + "clientId": { + "type": "string" + }, + "configurationId": { + "type": "string" + }, + "projectsMetadata": { + "nullable": true, + "items": { + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "framework": { + "nullable": true, + "type": "string", + "enum": [ + "actix-web", + "angular", + "ash", + "astro", + "axum", + "blitzjs", + "brunch", + "bun", + "container", + "create-react-app", + "django", + "docusaurus", + "docusaurus-2", + "dojo", + "eleventy", + "elysia", + "ember", + "eve", + "express", + "factory-eve", + "fastapi", + "fasthtml", + "fastify", + "flask", + "gatsby", + "go", + "gridsome", + "h3", + "hexo", + "hono", + "hugo", + "hydrogen", + "ionic-angular", + "ionic-react", + "jekyll", + "koa", + "mastra", + "middleman", + "nestjs", + "nextjs", + "nitro", + "node", + "nuxtjs", + "parcel", + "polymer", + "preact", + "python", + "react-router", + "redwoodjs", + "remix", + "ruby", + "rust", + "saber", + "sanity", + "sanity-v2", + "sapper", + "scully", + "services", + "solidstart", + "solidstart-1", + "stencil", + "storybook", + "svelte", + "sveltekit", + "sveltekit-1", + "tanstack-start", + "tanstack-start-lovable", + "umijs", + "vite", + "vitepress", + "vue", + "vuepress", + "xmcp", + "zola", + null + ] + }, + "latestDeployment": { + "type": "string" + } + }, + "required": [ + "id", + "name" + ], + "type": "object" + }, + "type": "array" + }, + "integrationIcon": { + "type": "string" + }, + "integrationConfigurationUri": { + "type": "string" + }, + "integrationWebsite": { + "type": "string" + } + }, + "required": [ + "createdFrom" + ] + }, + "type": "array" + }, + { + "properties": { + "drains": { + "oneOf": [ + { + "items": { + "properties": { + "id": { + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "updatedAt": { + "type": "number" + }, + "projectIds": { + "items": { + "type": "string" + }, + "type": "array" + }, + "name": { + "type": "string" + }, + "teamId": { + "nullable": true, + "type": "string" + }, + "ownerId": { + "type": "string" + }, + "status": { + "type": "string", + "enum": [ + "disabled", + "enabled", + "errored" + ] + }, + "firstErrorTimestamp": { + "type": "number" + }, + "disabledAt": { + "type": "number" + }, + "disabledBy": { + "type": "string" + }, + "disabledReason": { + "type": "string", + "enum": [ + "account-plan-downgrade", + "disabled-by-admin", + "disabled-by-owner", + "feature-not-available", + "limits-exceeded" + ] + }, + "schemas": { + "properties": { + "log": { + "type": "object" + }, + "trace": { + "type": "object" + }, + "analytics": { + "type": "object" + }, + "speed_insights": { + "type": "object" + }, + "ai_gateway": { + "type": "object" + }, + "audit_log": { + "type": "object" + }, + "connect": { + "type": "object" + } + }, + "type": "object" + }, + "delivery": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "http" + ] + }, + "endpoint": { + "type": "string" + }, + "encoding": { + "type": "string", + "enum": [ + "json", + "ndjson" + ] + }, + "compression": { + "type": "string", + "enum": [ + "gzip", + "none" + ] + }, + "headers": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "secret": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "kind": { + "type": "string", + "enum": [ + "INTEGRATION_SECRET" + ] + } + }, + "required": [ + "kind" + ], + "type": "object" + } + ] + } + }, + "required": [ + "encoding", + "endpoint", + "headers", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "otlphttp" + ] + }, + "endpoint": { + "properties": { + "traces": { + "type": "string" + } + }, + "required": [ + "traces" + ], + "type": "object" + }, + "encoding": { + "type": "string", + "enum": [ + "json", + "proto" + ] + }, + "headers": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "secret": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "kind": { + "type": "string", + "enum": [ + "INTEGRATION_SECRET" + ] + } + }, + "required": [ + "kind" + ], + "type": "object" + } + ] + } + }, + "required": [ + "encoding", + "endpoint", + "headers", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "clickhouse" + ] + }, + "endpoint": { + "type": "string" + }, + "table": { + "type": "string" + } + }, + "required": [ + "endpoint", + "table", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "s3" + ] + }, + "endpoint": { + "type": "string" + }, + "encoding": { + "type": "string", + "enum": [ + "json", + "ndjson" + ] + }, + "compression": { + "type": "string", + "enum": [ + "none" + ] + }, + "fileStructure": { + "type": "string", + "enum": [ + "hive" + ] + }, + "roleArn": { + "type": "string" + }, + "region": { + "type": "string" + }, + "serverSideEncryption": { + "type": "string", + "enum": [ + "AES256", + "aws:kms", + "aws:kms:dsse" + ] + }, + "objectAcl": { + "type": "string", + "enum": [ + "authenticated-read", + "aws-exec-read", + "bucket-owner-full-control", + "bucket-owner-read", + "private", + "public-read", + "public-read-write" + ] + } + }, + "required": [ + "compression", + "encoding", + "endpoint", + "fileStructure", + "region", + "roleArn", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "internal" + ] + }, + "target": { + "type": "string", + "enum": [ + "vercel-otel-traces-db" + ] + } + }, + "required": [ + "target", + "type" + ], + "type": "object" + } + ] + }, + "sampling": { + "items": { + "properties": { + "type": { + "type": "string", + "enum": [ + "head_sampling" + ] + }, + "rate": { + "type": "number" + }, + "env": { + "type": "string", + "enum": [ + "preview", + "production" + ] + }, + "requestPath": { + "type": "string" + } + }, + "required": [ + "rate", + "type" + ], + "type": "object" + }, + "type": "array" + }, + "source": { + "oneOf": [ + { + "properties": { + "kind": { + "type": "string", + "enum": [ + "self-served" + ] + } + }, + "required": [ + "kind" + ], + "type": "object" + }, + { + "properties": { + "kind": { + "type": "string", + "enum": [ + "integration" + ] + }, + "resourceId": { + "type": "string" + }, + "externalResourceId": { + "type": "string" + }, + "integrationId": { + "type": "string" + }, + "integrationConfigurationId": { + "type": "string" + } + }, + "required": [ + "integrationConfigurationId", + "integrationId", + "kind" + ], + "type": "object" + } + ] + }, + "filterV2": { + "properties": { + "version": { + "type": "string", + "enum": [ + "v2" + ] + }, + "filter": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "basic" + ] + }, + "project": { + "properties": { + "ids": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "log": { + "properties": { + "sources": { + "items": { + "type": "string", + "enum": [ + "build", + "edge", + "external", + "firewall", + "lambda", + "redirect", + "static" + ] + }, + "type": "array" + }, + "legacy_excludeCachedStaticAssetLogs": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "type": "object" + }, + "deployment": { + "properties": { + "environments": { + "items": { + "type": "string", + "enum": [ + "preview", + "production" + ] + }, + "type": "array" + } + }, + "type": "object" + } + }, + "required": [ + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "odata" + ] + }, + "text": { + "type": "string" + } + }, + "required": [ + "text", + "type" + ], + "type": "object" + } + ] + } + }, + "required": [ + "filter", + "version" + ], + "type": "object" + } + }, + "required": [ + "createdAt", + "delivery", + "id", + "name", + "ownerId", + "schemas", + "source", + "updatedAt" + ], + "type": "object" + }, + "type": "array" + }, + { + "items": { + "properties": { + "id": { + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "updatedAt": { + "type": "number" + }, + "projectIds": { + "items": { + "type": "string" + }, + "type": "array" + }, + "name": { + "type": "string" + }, + "teamId": { + "nullable": true, + "type": "string" + }, + "ownerId": { + "type": "string" + }, + "status": { + "type": "string", + "enum": [ + "disabled", + "enabled", + "errored" + ] + }, + "firstErrorTimestamp": { + "type": "number" + }, + "disabledAt": { + "type": "number" + }, + "disabledBy": { + "type": "string" + }, + "disabledReason": { + "type": "string", + "enum": [ + "account-plan-downgrade", + "disabled-by-admin", + "disabled-by-owner", + "feature-not-available", + "limits-exceeded" + ] + }, + "schemas": { + "properties": { + "log": { + "type": "object" + }, + "trace": { + "type": "object" + }, + "analytics": { + "type": "object" + }, + "speed_insights": { + "type": "object" + }, + "ai_gateway": { + "type": "object" + }, + "audit_log": { + "type": "object" + }, + "connect": { + "type": "object" + } + }, + "type": "object" + }, + "delivery": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "http" + ] + }, + "endpoint": { + "type": "string" + }, + "encoding": { + "type": "string", + "enum": [ + "json", + "ndjson" + ] + }, + "compression": { + "type": "string", + "enum": [ + "gzip", + "none" + ] + }, + "headers": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "secret": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "kind": { + "type": "string", + "enum": [ + "INTEGRATION_SECRET" + ] + } + }, + "required": [ + "kind" + ], + "type": "object" + } + ] + } + }, + "required": [ + "encoding", + "endpoint", + "headers", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "otlphttp" + ] + }, + "endpoint": { + "properties": { + "traces": { + "type": "string" + } + }, + "required": [ + "traces" + ], + "type": "object" + }, + "encoding": { + "type": "string", + "enum": [ + "json", + "proto" + ] + }, + "headers": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "secret": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "kind": { + "type": "string", + "enum": [ + "INTEGRATION_SECRET" + ] + } + }, + "required": [ + "kind" + ], + "type": "object" + } + ] + } + }, + "required": [ + "encoding", + "endpoint", + "headers", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "clickhouse" + ] + }, + "endpoint": { + "type": "string" + }, + "table": { + "type": "string" + } + }, + "required": [ + "endpoint", + "table", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "s3" + ] + }, + "endpoint": { + "type": "string" + }, + "encoding": { + "type": "string", + "enum": [ + "json", + "ndjson" + ] + }, + "compression": { + "type": "string", + "enum": [ + "none" + ] + }, + "fileStructure": { + "type": "string", + "enum": [ + "hive" + ] + }, + "roleArn": { + "type": "string" + }, + "region": { + "type": "string" + }, + "serverSideEncryption": { + "type": "string", + "enum": [ + "AES256", + "aws:kms", + "aws:kms:dsse" + ] + }, + "objectAcl": { + "type": "string", + "enum": [ + "authenticated-read", + "aws-exec-read", + "bucket-owner-full-control", + "bucket-owner-read", + "private", + "public-read", + "public-read-write" + ] + } + }, + "required": [ + "compression", + "encoding", + "endpoint", + "fileStructure", + "region", + "roleArn", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "internal" + ] + }, + "target": { + "type": "string", + "enum": [ + "vercel-otel-traces-db" + ] + } + }, + "required": [ + "target", + "type" + ], + "type": "object" + } + ] + }, + "sampling": { + "items": { + "properties": { + "type": { + "type": "string", + "enum": [ + "head_sampling" + ] + }, + "rate": { + "type": "number" + }, + "env": { + "type": "string", + "enum": [ + "preview", + "production" + ] + }, + "requestPath": { + "type": "string" + } + }, + "required": [ + "rate", + "type" + ], + "type": "object" + }, + "type": "array" + }, + "source": { + "oneOf": [ + { + "properties": { + "kind": { + "type": "string", + "enum": [ + "self-served" + ] + } + }, + "required": [ + "kind" + ], + "type": "object" + }, + { + "properties": { + "kind": { + "type": "string", + "enum": [ + "integration" + ] + }, + "resourceId": { + "type": "string" + }, + "externalResourceId": { + "type": "string" + }, + "integrationId": { + "type": "string" + }, + "integrationConfigurationId": { + "type": "string" + } + }, + "required": [ + "integrationConfigurationId", + "integrationId", + "kind" + ], + "type": "object" + } + ] + }, + "filterV2": { + "properties": { + "version": { + "type": "string", + "enum": [ + "v2" + ] + }, + "filter": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "basic" + ] + }, + "project": { + "properties": { + "ids": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "log": { + "properties": { + "sources": { + "items": { + "type": "string", + "enum": [ + "build", + "edge", + "external", + "firewall", + "lambda", + "redirect", + "static" + ] + }, + "type": "array" + }, + "legacy_excludeCachedStaticAssetLogs": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "type": "object" + }, + "deployment": { + "properties": { + "environments": { + "items": { + "type": "string", + "enum": [ + "preview", + "production" + ] + }, + "type": "array" + } + }, + "type": "object" + } + }, + "required": [ + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "odata" + ] + }, + "text": { + "type": "string" + } + }, + "required": [ + "text", + "type" + ], + "type": "object" + } + ] + } + }, + "required": [ + "filter", + "version" + ], + "type": "object" + }, + "integrationIcon": { + "type": "string" + }, + "integrationConfigurationUri": { + "type": "string" + }, + "integrationWebsite": { + "type": "string" + }, + "projectAccess": { + "oneOf": [ + { + "properties": { + "access": { + "type": "string", + "enum": [ + "all" + ] + }, + "managedBy": { + "type": "string", + "enum": [ + "drain", + "integration" + ] + } + }, + "required": [ + "access", + "managedBy" + ], + "type": "object" + }, + { + "properties": { + "access": { + "type": "string", + "enum": [ + "some" + ] + }, + "projectIds": { + "items": { + "type": "string" + }, + "type": "array" + }, + "managedBy": { + "type": "string", + "enum": [ + "drain", + "integration" + ] + } + }, + "required": [ + "access", + "managedBy", + "projectIds" + ], + "type": "object" + } + ] + } + }, + "required": [ + "createdAt", + "delivery", + "id", + "name", + "ownerId", + "schemas", + "source", + "updatedAt" + ], + "type": "object" + }, + "type": "array" + } + ] + } + }, + "required": [ + "drains" + ], + "type": "object" + } + ] + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "projectId", + "in": "query", + "schema": { + "pattern": "^[a-zA-z0-9_]+$", + "type": "string" + } + }, + { + "name": "projectIdOrName", + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "includeMetadata", + "in": "query", + "schema": { + "type": "boolean", + "default": false + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + }, + "post": { + "description": "Creates a configurable log drain. This endpoint must be called with a team AccessToken (integration OAuth2 clients are not allowed)", + "operationId": "createConfigurableLogDrain", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Creates a Configurable Log Drain (deprecated)", + "tags": [ + "logDrains" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "additionalProperties": false, + "required": [ + "deliveryFormat", + "url", + "sources" + ], + "properties": { + "deliveryFormat": { + "description": "The delivery log format", + "example": "json", + "enum": [ + "json", + "ndjson" + ] + }, + "url": { + "description": "The log drain url", + "format": "uri", + "pattern": "^(http|https)?://", + "type": "string" + }, + "headers": { + "description": "Headers to be sent together with the request", + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "projectIds": { + "minItems": 1, + "maxItems": 50, + "type": "array", + "items": { + "pattern": "^[a-zA-z0-9_]+$", + "type": "string" + } + }, + "sources": { + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "enum": [ + "static", + "lambda", + "build", + "edge", + "external", + "firewall" + ] + }, + "minItems": 1 + }, + "environments": { + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "enum": [ + "preview", + "production" + ] + }, + "minItems": 1 + }, + "secret": { + "description": "Custom secret of log drain", + "type": "string" + }, + "samplingRate": { + "type": "number", + "description": "The sampling rate for this log drain. It should be a percentage rate between 0 and 100. With max 2 decimal points", + "minimum": 0.01, + "maximum": 1, + "multipleOf": 0.01 + }, + "name": { + "type": "string", + "description": "The custom name of this log drain." + } + } + } + } + }, + "required": true + } + } + }, + "/v1/drains": { + "post": { + "description": "Create a new Drain with the provided configuration.", + "operationId": "createDrain", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Create a new Drain", + "tags": [ + "drains" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "oneOf": [ + { + "properties": { + "id": { + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "updatedAt": { + "type": "number" + }, + "projectIds": { + "items": { + "type": "string" + }, + "type": "array" + }, + "name": { + "type": "string" + }, + "teamId": { + "nullable": true, + "type": "string" + }, + "ownerId": { + "type": "string" + }, + "status": { + "type": "string", + "enum": [ + "disabled", + "enabled", + "errored" + ] + }, + "firstErrorTimestamp": { + "type": "number" + }, + "disabledAt": { + "type": "number" + }, + "disabledBy": { + "type": "string" + }, + "disabledReason": { + "type": "string", + "enum": [ + "account-plan-downgrade", + "disabled-by-admin", + "disabled-by-owner", + "feature-not-available", + "limits-exceeded" + ] + }, + "schemas": { + "properties": { + "log": { + "type": "object" + }, + "trace": { + "type": "object" + }, + "analytics": { + "type": "object" + }, + "speed_insights": { + "type": "object" + }, + "ai_gateway": { + "type": "object" + }, + "audit_log": { + "type": "object" + }, + "connect": { + "type": "object" + } + }, + "type": "object" + }, + "delivery": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "http" + ] + }, + "endpoint": { + "type": "string" + }, + "encoding": { + "type": "string", + "enum": [ + "json", + "ndjson" + ] + }, + "compression": { + "type": "string", + "enum": [ + "gzip", + "none" + ] + }, + "headers": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "secret": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "kind": { + "type": "string", + "enum": [ + "INTEGRATION_SECRET" + ] + } + }, + "required": [ + "kind" + ], + "type": "object" + } + ] + } + }, + "required": [ + "encoding", + "endpoint", + "headers", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "otlphttp" + ] + }, + "endpoint": { + "properties": { + "traces": { + "type": "string" + } + }, + "required": [ + "traces" + ], + "type": "object" + }, + "encoding": { + "type": "string", + "enum": [ + "json", + "proto" + ] + }, + "headers": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "secret": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "kind": { + "type": "string", + "enum": [ + "INTEGRATION_SECRET" + ] + } + }, + "required": [ + "kind" + ], + "type": "object" + } + ] + } + }, + "required": [ + "encoding", + "endpoint", + "headers", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "clickhouse" + ] + }, + "endpoint": { + "type": "string" + }, + "table": { + "type": "string" + } + }, + "required": [ + "endpoint", + "table", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "s3" + ] + }, + "endpoint": { + "type": "string" + }, + "encoding": { + "type": "string", + "enum": [ + "json", + "ndjson" + ] + }, + "compression": { + "type": "string", + "enum": [ + "none" + ] + }, + "fileStructure": { + "type": "string", + "enum": [ + "hive" + ] + }, + "roleArn": { + "type": "string" + }, + "region": { + "type": "string" + }, + "serverSideEncryption": { + "type": "string", + "enum": [ + "AES256", + "aws:kms", + "aws:kms:dsse" + ] + }, + "objectAcl": { + "type": "string", + "enum": [ + "authenticated-read", + "aws-exec-read", + "bucket-owner-full-control", + "bucket-owner-read", + "private", + "public-read", + "public-read-write" + ] + } + }, + "required": [ + "compression", + "encoding", + "endpoint", + "fileStructure", + "region", + "roleArn", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "internal" + ] + }, + "target": { + "type": "string", + "enum": [ + "vercel-otel-traces-db" + ] + } + }, + "required": [ + "target", + "type" + ], + "type": "object" + } + ] + }, + "sampling": { + "items": { + "properties": { + "type": { + "type": "string", + "enum": [ + "head_sampling" + ] + }, + "rate": { + "type": "number" + }, + "env": { + "type": "string", + "enum": [ + "preview", + "production" + ] + }, + "requestPath": { + "type": "string" + } + }, + "required": [ + "rate", + "type" + ], + "type": "object" + }, + "type": "array" + }, + "source": { + "oneOf": [ + { + "properties": { + "kind": { + "type": "string", + "enum": [ + "self-served" + ] + } + }, + "required": [ + "kind" + ], + "type": "object" + }, + { + "properties": { + "kind": { + "type": "string", + "enum": [ + "integration" + ] + }, + "resourceId": { + "type": "string" + }, + "externalResourceId": { + "type": "string" + }, + "integrationId": { + "type": "string" + }, + "integrationConfigurationId": { + "type": "string" + } + }, + "required": [ + "integrationConfigurationId", + "integrationId", + "kind" + ], + "type": "object" + } + ] + }, + "filterV2": { + "properties": { + "version": { + "type": "string", + "enum": [ + "v2" + ] + }, + "filter": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "basic" + ] + }, + "project": { + "properties": { + "ids": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "log": { + "properties": { + "sources": { + "items": { + "type": "string", + "enum": [ + "build", + "edge", + "external", + "firewall", + "lambda", + "redirect", + "static" + ] + }, + "type": "array" + }, + "legacy_excludeCachedStaticAssetLogs": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "type": "object" + }, + "deployment": { + "properties": { + "environments": { + "items": { + "type": "string", + "enum": [ + "preview", + "production" + ] + }, + "type": "array" + } + }, + "type": "object" + } + }, + "required": [ + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "odata" + ] + }, + "text": { + "type": "string" + } + }, + "required": [ + "text", + "type" + ], + "type": "object" + } + ] + } + }, + "required": [ + "filter", + "version" + ], + "type": "object" + } + }, + "required": [ + "createdAt", + "delivery", + "id", + "name", + "ownerId", + "schemas", + "source", + "updatedAt" + ], + "type": "object" + }, + { + "properties": { + "id": { + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "updatedAt": { + "type": "number" + }, + "projectIds": { + "items": { + "type": "string" + }, + "type": "array" + }, + "name": { + "type": "string" + }, + "teamId": { + "nullable": true, + "type": "string" + }, + "ownerId": { + "type": "string" + }, + "status": { + "type": "string", + "enum": [ + "disabled", + "enabled", + "errored" + ] + }, + "firstErrorTimestamp": { + "type": "number" + }, + "disabledAt": { + "type": "number" + }, + "disabledBy": { + "type": "string" + }, + "disabledReason": { + "type": "string", + "enum": [ + "account-plan-downgrade", + "disabled-by-admin", + "disabled-by-owner", + "feature-not-available", + "limits-exceeded" + ] + }, + "schemas": { + "properties": { + "log": { + "type": "object" + }, + "trace": { + "type": "object" + }, + "analytics": { + "type": "object" + }, + "speed_insights": { + "type": "object" + }, + "ai_gateway": { + "type": "object" + }, + "audit_log": { + "type": "object" + }, + "connect": { + "type": "object" + } + }, + "type": "object" + }, + "delivery": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "http" + ] + }, + "endpoint": { + "type": "string" + }, + "encoding": { + "type": "string", + "enum": [ + "json", + "ndjson" + ] + }, + "compression": { + "type": "string", + "enum": [ + "gzip", + "none" + ] + }, + "headers": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "secret": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "kind": { + "type": "string", + "enum": [ + "INTEGRATION_SECRET" + ] + } + }, + "required": [ + "kind" + ], + "type": "object" + } + ] + } + }, + "required": [ + "encoding", + "endpoint", + "headers", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "otlphttp" + ] + }, + "endpoint": { + "properties": { + "traces": { + "type": "string" + } + }, + "required": [ + "traces" + ], + "type": "object" + }, + "encoding": { + "type": "string", + "enum": [ + "json", + "proto" + ] + }, + "headers": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "secret": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "kind": { + "type": "string", + "enum": [ + "INTEGRATION_SECRET" + ] + } + }, + "required": [ + "kind" + ], + "type": "object" + } + ] + } + }, + "required": [ + "encoding", + "endpoint", + "headers", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "clickhouse" + ] + }, + "endpoint": { + "type": "string" + }, + "table": { + "type": "string" + } + }, + "required": [ + "endpoint", + "table", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "s3" + ] + }, + "endpoint": { + "type": "string" + }, + "encoding": { + "type": "string", + "enum": [ + "json", + "ndjson" + ] + }, + "compression": { + "type": "string", + "enum": [ + "none" + ] + }, + "fileStructure": { + "type": "string", + "enum": [ + "hive" + ] + }, + "roleArn": { + "type": "string" + }, + "region": { + "type": "string" + }, + "serverSideEncryption": { + "type": "string", + "enum": [ + "AES256", + "aws:kms", + "aws:kms:dsse" + ] + }, + "objectAcl": { + "type": "string", + "enum": [ + "authenticated-read", + "aws-exec-read", + "bucket-owner-full-control", + "bucket-owner-read", + "private", + "public-read", + "public-read-write" + ] + } + }, + "required": [ + "compression", + "encoding", + "endpoint", + "fileStructure", + "region", + "roleArn", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "internal" + ] + }, + "target": { + "type": "string", + "enum": [ + "vercel-otel-traces-db" + ] + } + }, + "required": [ + "target", + "type" + ], + "type": "object" + } + ] + }, + "sampling": { + "items": { + "properties": { + "type": { + "type": "string", + "enum": [ + "head_sampling" + ] + }, + "rate": { + "type": "number" + }, + "env": { + "type": "string", + "enum": [ + "preview", + "production" + ] + }, + "requestPath": { + "type": "string" + } + }, + "required": [ + "rate", + "type" + ], + "type": "object" + }, + "type": "array" + }, + "source": { + "oneOf": [ + { + "properties": { + "kind": { + "type": "string", + "enum": [ + "self-served" + ] + } + }, + "required": [ + "kind" + ], + "type": "object" + }, + { + "properties": { + "kind": { + "type": "string", + "enum": [ + "integration" + ] + }, + "resourceId": { + "type": "string" + }, + "externalResourceId": { + "type": "string" + }, + "integrationId": { + "type": "string" + }, + "integrationConfigurationId": { + "type": "string" + } + }, + "required": [ + "integrationConfigurationId", + "integrationId", + "kind" + ], + "type": "object" + } + ] + }, + "filterV2": { + "properties": { + "version": { + "type": "string", + "enum": [ + "v2" + ] + }, + "filter": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "basic" + ] + }, + "project": { + "properties": { + "ids": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "log": { + "properties": { + "sources": { + "items": { + "type": "string", + "enum": [ + "build", + "edge", + "external", + "firewall", + "lambda", + "redirect", + "static" + ] + }, + "type": "array" + }, + "legacy_excludeCachedStaticAssetLogs": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "type": "object" + }, + "deployment": { + "properties": { + "environments": { + "items": { + "type": "string", + "enum": [ + "preview", + "production" + ] + }, + "type": "array" + } + }, + "type": "object" + } + }, + "required": [ + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "odata" + ] + }, + "text": { + "type": "string" + } + }, + "required": [ + "text", + "type" + ], + "type": "object" + } + ] + } + }, + "required": [ + "filter", + "version" + ], + "type": "object" + }, + "integrationIcon": { + "type": "string" + }, + "integrationConfigurationUri": { + "type": "string" + }, + "integrationWebsite": { + "type": "string" + }, + "projectAccess": { + "oneOf": [ + { + "properties": { + "access": { + "type": "string", + "enum": [ + "all" + ] + }, + "managedBy": { + "type": "string", + "enum": [ + "drain", + "integration" + ] + } + }, + "required": [ + "access", + "managedBy" + ], + "type": "object" + }, + { + "properties": { + "access": { + "type": "string", + "enum": [ + "some" + ] + }, + "projectIds": { + "items": { + "type": "string" + }, + "type": "array" + }, + "managedBy": { + "type": "string", + "enum": [ + "drain", + "integration" + ] + } + }, + "required": [ + "access", + "managedBy", + "projectIds" + ], + "type": "object" + } + ] + } + }, + "required": [ + "createdAt", + "delivery", + "id", + "name", + "ownerId", + "schemas", + "source", + "updatedAt" + ], + "type": "object" + } + ] + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "402": { + "description": "" + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "additionalProperties": false, + "required": [ + "name", + "projects", + "schemas" + ], + "properties": { + "name": { + "type": "string" + }, + "projects": { + "type": "string", + "enum": [ + "some", + "all" + ] + }, + "projectIds": { + "type": "array", + "items": { + "type": "string" + } + }, + "filter": { + "type": "object", + "additionalProperties": false, + "required": [ + "version", + "filter" + ], + "properties": { + "version": { + "type": "string" + }, + "filter": { + "oneOf": [ + { + "type": "object", + "additionalProperties": false, + "required": [ + "type" + ], + "properties": { + "type": { + "type": "string" + }, + "project": { + "type": "object", + "additionalProperties": false, + "properties": { + "ids": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "log": { + "type": "object", + "additionalProperties": false, + "properties": { + "sources": { + "type": "array", + "items": { + "type": "string", + "enum": [ + "build", + "edge", + "lambda", + "static", + "external", + "firewall", + "redirect" + ] + } + } + } + }, + "deployment": { + "type": "object", + "additionalProperties": false, + "properties": { + "environments": { + "type": "array", + "items": { + "type": "string", + "enum": [ + "production", + "preview" + ] + } + } + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "type", + "text" + ], + "properties": { + "type": { + "type": "string" + }, + "text": { + "type": "string" + } + } + } + ] + } + } + }, + "schemas": { + "type": "object", + "additionalProperties": { + "type": "object", + "required": [ + "version" + ], + "properties": { + "version": { + "type": "string" + } + } + } + }, + "delivery": { + "type": "object", + "oneOf": [ + { + "type": "object", + "additionalProperties": false, + "required": [ + "type", + "endpoint", + "encoding", + "headers" + ], + "properties": { + "type": { + "type": "string" + }, + "endpoint": { + "type": "string" + }, + "compression": { + "type": "string", + "enum": [ + "gzip", + "none" + ] + }, + "encoding": { + "type": "string", + "enum": [ + "json", + "ndjson" + ] + }, + "headers": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "secret": { + "type": "string" + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "type", + "endpoint", + "encoding", + "headers" + ], + "properties": { + "type": { + "type": "string" + }, + "endpoint": { + "oneOf": [ + { + "type": "object", + "additionalProperties": false, + "required": [ + "traces" + ], + "properties": { + "traces": { + "type": "string" + } + } + } + ] + }, + "encoding": { + "type": "string", + "enum": [ + "proto", + "json" + ] + }, + "headers": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "secret": { + "type": "string" + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "type", + "endpoint", + "encoding", + "compression", + "fileStructure", + "roleArn", + "region" + ], + "properties": { + "type": { + "type": "string" + }, + "endpoint": { + "type": "string" + }, + "encoding": { + "type": "string", + "enum": [ + "json", + "ndjson" + ] + }, + "compression": { + "type": "string", + "enum": [ + "none" + ] + }, + "fileStructure": { + "type": "string", + "enum": [ + "hive" + ] + }, + "roleArn": { + "type": "string" + }, + "region": { + "type": "string" + }, + "serverSideEncryption": { + "type": "string", + "enum": [ + "AES256", + "aws:kms", + "aws:kms:dsse" + ], + "default": "AES256" + }, + "objectAcl": { + "type": "string", + "enum": [ + "private", + "bucket-owner-read", + "bucket-owner-full-control" + ] + } + } + } + ] + }, + "sampling": { + "type": "array", + "maxItems": 10, + "items": { + "type": "object", + "additionalProperties": false, + "required": [ + "type", + "rate" + ], + "properties": { + "type": { + "type": "string" + }, + "rate": { + "type": "number", + "minimum": 0, + "maximum": 1, + "description": "Sampling rate from 0 to 1 (e.g., 0.1 for 10%)" + }, + "env": { + "type": "string", + "enum": [ + "production", + "preview" + ], + "description": "Environment to apply sampling to" + }, + "requestPath": { + "type": "string", + "description": "Request path prefix to apply the sampling rule to" + } + } + } + }, + "transforms": { + "type": "array", + "items": { + "type": "object", + "required": [ + "id" + ], + "properties": { + "id": { + "type": "string" + } + } + } + }, + "source": { + "type": "object", + "oneOf": [ + { + "oneOf": [ + { + "properties": { + "kind": { + "type": "string", + "default": "integration" + }, + "externalResourceId": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "externalResourceId" + ] + }, + { + "properties": { + "kind": { + "type": "string", + "default": "integration" + }, + "resourceId": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "resourceId" + ] + }, + { + "properties": { + "kind": { + "type": "string", + "default": "integration" + } + }, + "additionalProperties": false, + "required": [ + "kind" + ] + } + ] + }, + { + "properties": { + "kind": { + "type": "string", + "default": "self-served" + } + }, + "additionalProperties": false, + "required": [ + "kind" + ] + } + ] + } + } + } + } + } + } + }, + "get": { + "description": "Allows to retrieve the list of Drains of the authenticated team.", + "operationId": "getDrains", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Retrieve a list of all Drains", + "tags": [ + "drains" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "drains": { + "oneOf": [ + { + "items": { + "properties": { + "id": { + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "updatedAt": { + "type": "number" + }, + "projectIds": { + "items": { + "type": "string" + }, + "type": "array" + }, + "name": { + "type": "string" + }, + "teamId": { + "nullable": true, + "type": "string" + }, + "ownerId": { + "type": "string" + }, + "status": { + "type": "string", + "enum": [ + "disabled", + "enabled", + "errored" + ] + }, + "firstErrorTimestamp": { + "type": "number" + }, + "disabledAt": { + "type": "number" + }, + "disabledBy": { + "type": "string" + }, + "disabledReason": { + "type": "string", + "enum": [ + "account-plan-downgrade", + "disabled-by-admin", + "disabled-by-owner", + "feature-not-available", + "limits-exceeded" + ] + }, + "schemas": { + "properties": { + "log": { + "type": "object" + }, + "trace": { + "type": "object" + }, + "analytics": { + "type": "object" + }, + "speed_insights": { + "type": "object" + }, + "ai_gateway": { + "type": "object" + }, + "audit_log": { + "type": "object" + }, + "connect": { + "type": "object" + } + }, + "type": "object" + }, + "delivery": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "http" + ] + }, + "endpoint": { + "type": "string" + }, + "encoding": { + "type": "string", + "enum": [ + "json", + "ndjson" + ] + }, + "compression": { + "type": "string", + "enum": [ + "gzip", + "none" + ] + }, + "headers": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "secret": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "kind": { + "type": "string", + "enum": [ + "INTEGRATION_SECRET" + ] + } + }, + "required": [ + "kind" + ], + "type": "object" + } + ] + } + }, + "required": [ + "encoding", + "endpoint", + "headers", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "otlphttp" + ] + }, + "endpoint": { + "properties": { + "traces": { + "type": "string" + } + }, + "required": [ + "traces" + ], + "type": "object" + }, + "encoding": { + "type": "string", + "enum": [ + "json", + "proto" + ] + }, + "headers": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "secret": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "kind": { + "type": "string", + "enum": [ + "INTEGRATION_SECRET" + ] + } + }, + "required": [ + "kind" + ], + "type": "object" + } + ] + } + }, + "required": [ + "encoding", + "endpoint", + "headers", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "clickhouse" + ] + }, + "endpoint": { + "type": "string" + }, + "table": { + "type": "string" + } + }, + "required": [ + "endpoint", + "table", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "s3" + ] + }, + "endpoint": { + "type": "string" + }, + "encoding": { + "type": "string", + "enum": [ + "json", + "ndjson" + ] + }, + "compression": { + "type": "string", + "enum": [ + "none" + ] + }, + "fileStructure": { + "type": "string", + "enum": [ + "hive" + ] + }, + "roleArn": { + "type": "string" + }, + "region": { + "type": "string" + }, + "serverSideEncryption": { + "type": "string", + "enum": [ + "AES256", + "aws:kms", + "aws:kms:dsse" + ] + }, + "objectAcl": { + "type": "string", + "enum": [ + "authenticated-read", + "aws-exec-read", + "bucket-owner-full-control", + "bucket-owner-read", + "private", + "public-read", + "public-read-write" + ] + } + }, + "required": [ + "compression", + "encoding", + "endpoint", + "fileStructure", + "region", + "roleArn", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "internal" + ] + }, + "target": { + "type": "string", + "enum": [ + "vercel-otel-traces-db" + ] + } + }, + "required": [ + "target", + "type" + ], + "type": "object" + } + ] + }, + "sampling": { + "items": { + "properties": { + "type": { + "type": "string", + "enum": [ + "head_sampling" + ] + }, + "rate": { + "type": "number" + }, + "env": { + "type": "string", + "enum": [ + "preview", + "production" + ] + }, + "requestPath": { + "type": "string" + } + }, + "required": [ + "rate", + "type" + ], + "type": "object" + }, + "type": "array" + }, + "source": { + "oneOf": [ + { + "properties": { + "kind": { + "type": "string", + "enum": [ + "self-served" + ] + } + }, + "required": [ + "kind" + ], + "type": "object" + }, + { + "properties": { + "kind": { + "type": "string", + "enum": [ + "integration" + ] + }, + "resourceId": { + "type": "string" + }, + "externalResourceId": { + "type": "string" + }, + "integrationId": { + "type": "string" + }, + "integrationConfigurationId": { + "type": "string" + } + }, + "required": [ + "integrationConfigurationId", + "integrationId", + "kind" + ], + "type": "object" + } + ] + }, + "filterV2": { + "properties": { + "version": { + "type": "string", + "enum": [ + "v2" + ] + }, + "filter": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "basic" + ] + }, + "project": { + "properties": { + "ids": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "log": { + "properties": { + "sources": { + "items": { + "type": "string", + "enum": [ + "build", + "edge", + "external", + "firewall", + "lambda", + "redirect", + "static" + ] + }, + "type": "array" + }, + "legacy_excludeCachedStaticAssetLogs": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "type": "object" + }, + "deployment": { + "properties": { + "environments": { + "items": { + "type": "string", + "enum": [ + "preview", + "production" + ] + }, + "type": "array" + } + }, + "type": "object" + } + }, + "required": [ + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "odata" + ] + }, + "text": { + "type": "string" + } + }, + "required": [ + "text", + "type" + ], + "type": "object" + } + ] + } + }, + "required": [ + "filter", + "version" + ], + "type": "object" + } + }, + "required": [ + "createdAt", + "delivery", + "id", + "name", + "ownerId", + "schemas", + "source", + "updatedAt" + ], + "type": "object" + }, + "type": "array" + }, + { + "items": { + "properties": { + "id": { + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "updatedAt": { + "type": "number" + }, + "projectIds": { + "items": { + "type": "string" + }, + "type": "array" + }, + "name": { + "type": "string" + }, + "teamId": { + "nullable": true, + "type": "string" + }, + "ownerId": { + "type": "string" + }, + "status": { + "type": "string", + "enum": [ + "disabled", + "enabled", + "errored" + ] + }, + "firstErrorTimestamp": { + "type": "number" + }, + "disabledAt": { + "type": "number" + }, + "disabledBy": { + "type": "string" + }, + "disabledReason": { + "type": "string", + "enum": [ + "account-plan-downgrade", + "disabled-by-admin", + "disabled-by-owner", + "feature-not-available", + "limits-exceeded" + ] + }, + "schemas": { + "properties": { + "log": { + "type": "object" + }, + "trace": { + "type": "object" + }, + "analytics": { + "type": "object" + }, + "speed_insights": { + "type": "object" + }, + "ai_gateway": { + "type": "object" + }, + "audit_log": { + "type": "object" + }, + "connect": { + "type": "object" + } + }, + "type": "object" + }, + "delivery": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "http" + ] + }, + "endpoint": { + "type": "string" + }, + "encoding": { + "type": "string", + "enum": [ + "json", + "ndjson" + ] + }, + "compression": { + "type": "string", + "enum": [ + "gzip", + "none" + ] + }, + "headers": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "secret": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "kind": { + "type": "string", + "enum": [ + "INTEGRATION_SECRET" + ] + } + }, + "required": [ + "kind" + ], + "type": "object" + } + ] + } + }, + "required": [ + "encoding", + "endpoint", + "headers", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "otlphttp" + ] + }, + "endpoint": { + "properties": { + "traces": { + "type": "string" + } + }, + "required": [ + "traces" + ], + "type": "object" + }, + "encoding": { + "type": "string", + "enum": [ + "json", + "proto" + ] + }, + "headers": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "secret": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "kind": { + "type": "string", + "enum": [ + "INTEGRATION_SECRET" + ] + } + }, + "required": [ + "kind" + ], + "type": "object" + } + ] + } + }, + "required": [ + "encoding", + "endpoint", + "headers", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "clickhouse" + ] + }, + "endpoint": { + "type": "string" + }, + "table": { + "type": "string" + } + }, + "required": [ + "endpoint", + "table", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "s3" + ] + }, + "endpoint": { + "type": "string" + }, + "encoding": { + "type": "string", + "enum": [ + "json", + "ndjson" + ] + }, + "compression": { + "type": "string", + "enum": [ + "none" + ] + }, + "fileStructure": { + "type": "string", + "enum": [ + "hive" + ] + }, + "roleArn": { + "type": "string" + }, + "region": { + "type": "string" + }, + "serverSideEncryption": { + "type": "string", + "enum": [ + "AES256", + "aws:kms", + "aws:kms:dsse" + ] + }, + "objectAcl": { + "type": "string", + "enum": [ + "authenticated-read", + "aws-exec-read", + "bucket-owner-full-control", + "bucket-owner-read", + "private", + "public-read", + "public-read-write" + ] + } + }, + "required": [ + "compression", + "encoding", + "endpoint", + "fileStructure", + "region", + "roleArn", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "internal" + ] + }, + "target": { + "type": "string", + "enum": [ + "vercel-otel-traces-db" + ] + } + }, + "required": [ + "target", + "type" + ], + "type": "object" + } + ] + }, + "sampling": { + "items": { + "properties": { + "type": { + "type": "string", + "enum": [ + "head_sampling" + ] + }, + "rate": { + "type": "number" + }, + "env": { + "type": "string", + "enum": [ + "preview", + "production" + ] + }, + "requestPath": { + "type": "string" + } + }, + "required": [ + "rate", + "type" + ], + "type": "object" + }, + "type": "array" + }, + "source": { + "oneOf": [ + { + "properties": { + "kind": { + "type": "string", + "enum": [ + "self-served" + ] + } + }, + "required": [ + "kind" + ], + "type": "object" + }, + { + "properties": { + "kind": { + "type": "string", + "enum": [ + "integration" + ] + }, + "resourceId": { + "type": "string" + }, + "externalResourceId": { + "type": "string" + }, + "integrationId": { + "type": "string" + }, + "integrationConfigurationId": { + "type": "string" + } + }, + "required": [ + "integrationConfigurationId", + "integrationId", + "kind" + ], + "type": "object" + } + ] + }, + "filterV2": { + "properties": { + "version": { + "type": "string", + "enum": [ + "v2" + ] + }, + "filter": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "basic" + ] + }, + "project": { + "properties": { + "ids": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "log": { + "properties": { + "sources": { + "items": { + "type": "string", + "enum": [ + "build", + "edge", + "external", + "firewall", + "lambda", + "redirect", + "static" + ] + }, + "type": "array" + }, + "legacy_excludeCachedStaticAssetLogs": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "type": "object" + }, + "deployment": { + "properties": { + "environments": { + "items": { + "type": "string", + "enum": [ + "preview", + "production" + ] + }, + "type": "array" + } + }, + "type": "object" + } + }, + "required": [ + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "odata" + ] + }, + "text": { + "type": "string" + } + }, + "required": [ + "text", + "type" + ], + "type": "object" + } + ] + } + }, + "required": [ + "filter", + "version" + ], + "type": "object" + }, + "integrationIcon": { + "type": "string" + }, + "integrationConfigurationUri": { + "type": "string" + }, + "integrationWebsite": { + "type": "string" + }, + "projectAccess": { + "oneOf": [ + { + "properties": { + "access": { + "type": "string", + "enum": [ + "all" + ] + }, + "managedBy": { + "type": "string", + "enum": [ + "drain", + "integration" + ] + } + }, + "required": [ + "access", + "managedBy" + ], + "type": "object" + }, + { + "properties": { + "access": { + "type": "string", + "enum": [ + "some" + ] + }, + "projectIds": { + "items": { + "type": "string" + }, + "type": "array" + }, + "managedBy": { + "type": "string", + "enum": [ + "drain", + "integration" + ] + } + }, + "required": [ + "access", + "managedBy", + "projectIds" + ], + "type": "object" + } + ] + } + }, + "required": [ + "createdAt", + "delivery", + "id", + "name", + "ownerId", + "schemas", + "source", + "updatedAt" + ], + "type": "object" + }, + "type": "array" + } + ] + } + }, + "required": [ + "drains" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "projectId", + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "includeMetadata", + "in": "query", + "schema": { + "type": "boolean", + "default": false + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + } + }, + "/v1/drains/{id}": { + "delete": { + "description": "Delete a specific Drain by passing the drain id in the URL.", + "operationId": "deleteDrain", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Delete a drain", + "tags": [ + "drains" + ], + "responses": { + "204": { + "description": "" + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + }, + "get": { + "description": "Get the information for a specific Drain by passing the drain id in the URL.", + "operationId": "getDrain", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Find a Drain by id", + "tags": [ + "drains" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "oneOf": [ + { + "properties": { + "id": { + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "updatedAt": { + "type": "number" + }, + "projectIds": { + "items": { + "type": "string" + }, + "type": "array" + }, + "name": { + "type": "string" + }, + "teamId": { + "nullable": true, + "type": "string" + }, + "ownerId": { + "type": "string" + }, + "status": { + "type": "string", + "enum": [ + "disabled", + "enabled", + "errored" + ] + }, + "firstErrorTimestamp": { + "type": "number" + }, + "disabledAt": { + "type": "number" + }, + "disabledBy": { + "type": "string" + }, + "disabledReason": { + "type": "string", + "enum": [ + "account-plan-downgrade", + "disabled-by-admin", + "disabled-by-owner", + "feature-not-available", + "limits-exceeded" + ] + }, + "schemas": { + "properties": { + "log": { + "type": "object" + }, + "trace": { + "type": "object" + }, + "analytics": { + "type": "object" + }, + "speed_insights": { + "type": "object" + }, + "ai_gateway": { + "type": "object" + }, + "audit_log": { + "type": "object" + }, + "connect": { + "type": "object" + } + }, + "type": "object" + }, + "delivery": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "http" + ] + }, + "endpoint": { + "type": "string" + }, + "encoding": { + "type": "string", + "enum": [ + "json", + "ndjson" + ] + }, + "compression": { + "type": "string", + "enum": [ + "gzip", + "none" + ] + }, + "headers": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "secret": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "kind": { + "type": "string", + "enum": [ + "INTEGRATION_SECRET" + ] + } + }, + "required": [ + "kind" + ], + "type": "object" + } + ] + } + }, + "required": [ + "encoding", + "endpoint", + "headers", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "otlphttp" + ] + }, + "endpoint": { + "properties": { + "traces": { + "type": "string" + } + }, + "required": [ + "traces" + ], + "type": "object" + }, + "encoding": { + "type": "string", + "enum": [ + "json", + "proto" + ] + }, + "headers": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "secret": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "kind": { + "type": "string", + "enum": [ + "INTEGRATION_SECRET" + ] + } + }, + "required": [ + "kind" + ], + "type": "object" + } + ] + } + }, + "required": [ + "encoding", + "endpoint", + "headers", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "clickhouse" + ] + }, + "endpoint": { + "type": "string" + }, + "table": { + "type": "string" + } + }, + "required": [ + "endpoint", + "table", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "s3" + ] + }, + "endpoint": { + "type": "string" + }, + "encoding": { + "type": "string", + "enum": [ + "json", + "ndjson" + ] + }, + "compression": { + "type": "string", + "enum": [ + "none" + ] + }, + "fileStructure": { + "type": "string", + "enum": [ + "hive" + ] + }, + "roleArn": { + "type": "string" + }, + "region": { + "type": "string" + }, + "serverSideEncryption": { + "type": "string", + "enum": [ + "AES256", + "aws:kms", + "aws:kms:dsse" + ] + }, + "objectAcl": { + "type": "string", + "enum": [ + "authenticated-read", + "aws-exec-read", + "bucket-owner-full-control", + "bucket-owner-read", + "private", + "public-read", + "public-read-write" + ] + } + }, + "required": [ + "compression", + "encoding", + "endpoint", + "fileStructure", + "region", + "roleArn", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "internal" + ] + }, + "target": { + "type": "string", + "enum": [ + "vercel-otel-traces-db" + ] + } + }, + "required": [ + "target", + "type" + ], + "type": "object" + } + ] + }, + "sampling": { + "items": { + "properties": { + "type": { + "type": "string", + "enum": [ + "head_sampling" + ] + }, + "rate": { + "type": "number" + }, + "env": { + "type": "string", + "enum": [ + "preview", + "production" + ] + }, + "requestPath": { + "type": "string" + } + }, + "required": [ + "rate", + "type" + ], + "type": "object" + }, + "type": "array" + }, + "source": { + "oneOf": [ + { + "properties": { + "kind": { + "type": "string", + "enum": [ + "self-served" + ] + } + }, + "required": [ + "kind" + ], + "type": "object" + }, + { + "properties": { + "kind": { + "type": "string", + "enum": [ + "integration" + ] + }, + "resourceId": { + "type": "string" + }, + "externalResourceId": { + "type": "string" + }, + "integrationId": { + "type": "string" + }, + "integrationConfigurationId": { + "type": "string" + } + }, + "required": [ + "integrationConfigurationId", + "integrationId", + "kind" + ], + "type": "object" + } + ] + }, + "filterV2": { + "properties": { + "version": { + "type": "string", + "enum": [ + "v2" + ] + }, + "filter": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "basic" + ] + }, + "project": { + "properties": { + "ids": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "log": { + "properties": { + "sources": { + "items": { + "type": "string", + "enum": [ + "build", + "edge", + "external", + "firewall", + "lambda", + "redirect", + "static" + ] + }, + "type": "array" + }, + "legacy_excludeCachedStaticAssetLogs": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "type": "object" + }, + "deployment": { + "properties": { + "environments": { + "items": { + "type": "string", + "enum": [ + "preview", + "production" + ] + }, + "type": "array" + } + }, + "type": "object" + } + }, + "required": [ + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "odata" + ] + }, + "text": { + "type": "string" + } + }, + "required": [ + "text", + "type" + ], + "type": "object" + } + ] + } + }, + "required": [ + "filter", + "version" + ], + "type": "object" + } + }, + "required": [ + "createdAt", + "delivery", + "id", + "name", + "ownerId", + "schemas", + "source", + "updatedAt" + ], + "type": "object" + }, + { + "properties": { + "id": { + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "updatedAt": { + "type": "number" + }, + "projectIds": { + "items": { + "type": "string" + }, + "type": "array" + }, + "name": { + "type": "string" + }, + "teamId": { + "nullable": true, + "type": "string" + }, + "ownerId": { + "type": "string" + }, + "status": { + "type": "string", + "enum": [ + "disabled", + "enabled", + "errored" + ] + }, + "firstErrorTimestamp": { + "type": "number" + }, + "disabledAt": { + "type": "number" + }, + "disabledBy": { + "type": "string" + }, + "disabledReason": { + "type": "string", + "enum": [ + "account-plan-downgrade", + "disabled-by-admin", + "disabled-by-owner", + "feature-not-available", + "limits-exceeded" + ] + }, + "schemas": { + "properties": { + "log": { + "type": "object" + }, + "trace": { + "type": "object" + }, + "analytics": { + "type": "object" + }, + "speed_insights": { + "type": "object" + }, + "ai_gateway": { + "type": "object" + }, + "audit_log": { + "type": "object" + }, + "connect": { + "type": "object" + } + }, + "type": "object" + }, + "delivery": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "http" + ] + }, + "endpoint": { + "type": "string" + }, + "encoding": { + "type": "string", + "enum": [ + "json", + "ndjson" + ] + }, + "compression": { + "type": "string", + "enum": [ + "gzip", + "none" + ] + }, + "headers": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "secret": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "kind": { + "type": "string", + "enum": [ + "INTEGRATION_SECRET" + ] + } + }, + "required": [ + "kind" + ], + "type": "object" + } + ] + } + }, + "required": [ + "encoding", + "endpoint", + "headers", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "otlphttp" + ] + }, + "endpoint": { + "properties": { + "traces": { + "type": "string" + } + }, + "required": [ + "traces" + ], + "type": "object" + }, + "encoding": { + "type": "string", + "enum": [ + "json", + "proto" + ] + }, + "headers": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "secret": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "kind": { + "type": "string", + "enum": [ + "INTEGRATION_SECRET" + ] + } + }, + "required": [ + "kind" + ], + "type": "object" + } + ] + } + }, + "required": [ + "encoding", + "endpoint", + "headers", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "clickhouse" + ] + }, + "endpoint": { + "type": "string" + }, + "table": { + "type": "string" + } + }, + "required": [ + "endpoint", + "table", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "s3" + ] + }, + "endpoint": { + "type": "string" + }, + "encoding": { + "type": "string", + "enum": [ + "json", + "ndjson" + ] + }, + "compression": { + "type": "string", + "enum": [ + "none" + ] + }, + "fileStructure": { + "type": "string", + "enum": [ + "hive" + ] + }, + "roleArn": { + "type": "string" + }, + "region": { + "type": "string" + }, + "serverSideEncryption": { + "type": "string", + "enum": [ + "AES256", + "aws:kms", + "aws:kms:dsse" + ] + }, + "objectAcl": { + "type": "string", + "enum": [ + "authenticated-read", + "aws-exec-read", + "bucket-owner-full-control", + "bucket-owner-read", + "private", + "public-read", + "public-read-write" + ] + } + }, + "required": [ + "compression", + "encoding", + "endpoint", + "fileStructure", + "region", + "roleArn", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "internal" + ] + }, + "target": { + "type": "string", + "enum": [ + "vercel-otel-traces-db" + ] + } + }, + "required": [ + "target", + "type" + ], + "type": "object" + } + ] + }, + "sampling": { + "items": { + "properties": { + "type": { + "type": "string", + "enum": [ + "head_sampling" + ] + }, + "rate": { + "type": "number" + }, + "env": { + "type": "string", + "enum": [ + "preview", + "production" + ] + }, + "requestPath": { + "type": "string" + } + }, + "required": [ + "rate", + "type" + ], + "type": "object" + }, + "type": "array" + }, + "source": { + "oneOf": [ + { + "properties": { + "kind": { + "type": "string", + "enum": [ + "self-served" + ] + } + }, + "required": [ + "kind" + ], + "type": "object" + }, + { + "properties": { + "kind": { + "type": "string", + "enum": [ + "integration" + ] + }, + "resourceId": { + "type": "string" + }, + "externalResourceId": { + "type": "string" + }, + "integrationId": { + "type": "string" + }, + "integrationConfigurationId": { + "type": "string" + } + }, + "required": [ + "integrationConfigurationId", + "integrationId", + "kind" + ], + "type": "object" + } + ] + }, + "filterV2": { + "properties": { + "version": { + "type": "string", + "enum": [ + "v2" + ] + }, + "filter": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "basic" + ] + }, + "project": { + "properties": { + "ids": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "log": { + "properties": { + "sources": { + "items": { + "type": "string", + "enum": [ + "build", + "edge", + "external", + "firewall", + "lambda", + "redirect", + "static" + ] + }, + "type": "array" + }, + "legacy_excludeCachedStaticAssetLogs": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "type": "object" + }, + "deployment": { + "properties": { + "environments": { + "items": { + "type": "string", + "enum": [ + "preview", + "production" + ] + }, + "type": "array" + } + }, + "type": "object" + } + }, + "required": [ + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "odata" + ] + }, + "text": { + "type": "string" + } + }, + "required": [ + "text", + "type" + ], + "type": "object" + } + ] + } + }, + "required": [ + "filter", + "version" + ], + "type": "object" + }, + "integrationIcon": { + "type": "string" + }, + "integrationConfigurationUri": { + "type": "string" + }, + "integrationWebsite": { + "type": "string" + }, + "projectAccess": { + "oneOf": [ + { + "properties": { + "access": { + "type": "string", + "enum": [ + "all" + ] + }, + "managedBy": { + "type": "string", + "enum": [ + "drain", + "integration" + ] + } + }, + "required": [ + "access", + "managedBy" + ], + "type": "object" + }, + { + "properties": { + "access": { + "type": "string", + "enum": [ + "some" + ] + }, + "projectIds": { + "items": { + "type": "string" + }, + "type": "array" + }, + "managedBy": { + "type": "string", + "enum": [ + "drain", + "integration" + ] + } + }, + "required": [ + "access", + "managedBy", + "projectIds" + ], + "type": "object" + } + ] + } + }, + "required": [ + "createdAt", + "delivery", + "id", + "name", + "ownerId", + "schemas", + "source", + "updatedAt" + ], + "type": "object" + } + ] + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + }, + "patch": { + "description": "Update the configuration of an existing drain.", + "operationId": "updateDrain", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Update an existing Drain", + "tags": [ + "drains" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "oneOf": [ + { + "properties": { + "id": { + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "updatedAt": { + "type": "number" + }, + "projectIds": { + "items": { + "type": "string" + }, + "type": "array" + }, + "name": { + "type": "string" + }, + "teamId": { + "nullable": true, + "type": "string" + }, + "ownerId": { + "type": "string" + }, + "status": { + "type": "string", + "enum": [ + "disabled", + "enabled", + "errored" + ] + }, + "firstErrorTimestamp": { + "type": "number" + }, + "disabledAt": { + "type": "number" + }, + "disabledBy": { + "type": "string" + }, + "disabledReason": { + "type": "string", + "enum": [ + "account-plan-downgrade", + "disabled-by-admin", + "disabled-by-owner", + "feature-not-available", + "limits-exceeded" + ] + }, + "schemas": { + "properties": { + "log": { + "type": "object" + }, + "trace": { + "type": "object" + }, + "analytics": { + "type": "object" + }, + "speed_insights": { + "type": "object" + }, + "ai_gateway": { + "type": "object" + }, + "audit_log": { + "type": "object" + }, + "connect": { + "type": "object" + } + }, + "type": "object" + }, + "delivery": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "http" + ] + }, + "endpoint": { + "type": "string" + }, + "encoding": { + "type": "string", + "enum": [ + "json", + "ndjson" + ] + }, + "compression": { + "type": "string", + "enum": [ + "gzip", + "none" + ] + }, + "headers": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "secret": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "kind": { + "type": "string", + "enum": [ + "INTEGRATION_SECRET" + ] + } + }, + "required": [ + "kind" + ], + "type": "object" + } + ] + } + }, + "required": [ + "encoding", + "endpoint", + "headers", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "otlphttp" + ] + }, + "endpoint": { + "properties": { + "traces": { + "type": "string" + } + }, + "required": [ + "traces" + ], + "type": "object" + }, + "encoding": { + "type": "string", + "enum": [ + "json", + "proto" + ] + }, + "headers": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "secret": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "kind": { + "type": "string", + "enum": [ + "INTEGRATION_SECRET" + ] + } + }, + "required": [ + "kind" + ], + "type": "object" + } + ] + } + }, + "required": [ + "encoding", + "endpoint", + "headers", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "clickhouse" + ] + }, + "endpoint": { + "type": "string" + }, + "table": { + "type": "string" + } + }, + "required": [ + "endpoint", + "table", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "s3" + ] + }, + "endpoint": { + "type": "string" + }, + "encoding": { + "type": "string", + "enum": [ + "json", + "ndjson" + ] + }, + "compression": { + "type": "string", + "enum": [ + "none" + ] + }, + "fileStructure": { + "type": "string", + "enum": [ + "hive" + ] + }, + "roleArn": { + "type": "string" + }, + "region": { + "type": "string" + }, + "serverSideEncryption": { + "type": "string", + "enum": [ + "AES256", + "aws:kms", + "aws:kms:dsse" + ] + }, + "objectAcl": { + "type": "string", + "enum": [ + "authenticated-read", + "aws-exec-read", + "bucket-owner-full-control", + "bucket-owner-read", + "private", + "public-read", + "public-read-write" + ] + } + }, + "required": [ + "compression", + "encoding", + "endpoint", + "fileStructure", + "region", + "roleArn", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "internal" + ] + }, + "target": { + "type": "string", + "enum": [ + "vercel-otel-traces-db" + ] + } + }, + "required": [ + "target", + "type" + ], + "type": "object" + } + ] + }, + "sampling": { + "items": { + "properties": { + "type": { + "type": "string", + "enum": [ + "head_sampling" + ] + }, + "rate": { + "type": "number" + }, + "env": { + "type": "string", + "enum": [ + "preview", + "production" + ] + }, + "requestPath": { + "type": "string" + } + }, + "required": [ + "rate", + "type" + ], + "type": "object" + }, + "type": "array" + }, + "source": { + "oneOf": [ + { + "properties": { + "kind": { + "type": "string", + "enum": [ + "self-served" + ] + } + }, + "required": [ + "kind" + ], + "type": "object" + }, + { + "properties": { + "kind": { + "type": "string", + "enum": [ + "integration" + ] + }, + "resourceId": { + "type": "string" + }, + "externalResourceId": { + "type": "string" + }, + "integrationId": { + "type": "string" + }, + "integrationConfigurationId": { + "type": "string" + } + }, + "required": [ + "integrationConfigurationId", + "integrationId", + "kind" + ], + "type": "object" + } + ] + }, + "filterV2": { + "properties": { + "version": { + "type": "string", + "enum": [ + "v2" + ] + }, + "filter": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "basic" + ] + }, + "project": { + "properties": { + "ids": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "log": { + "properties": { + "sources": { + "items": { + "type": "string", + "enum": [ + "build", + "edge", + "external", + "firewall", + "lambda", + "redirect", + "static" + ] + }, + "type": "array" + }, + "legacy_excludeCachedStaticAssetLogs": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "type": "object" + }, + "deployment": { + "properties": { + "environments": { + "items": { + "type": "string", + "enum": [ + "preview", + "production" + ] + }, + "type": "array" + } + }, + "type": "object" + } + }, + "required": [ + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "odata" + ] + }, + "text": { + "type": "string" + } + }, + "required": [ + "text", + "type" + ], + "type": "object" + } + ] + } + }, + "required": [ + "filter", + "version" + ], + "type": "object" + } + }, + "required": [ + "createdAt", + "delivery", + "id", + "name", + "ownerId", + "schemas", + "source", + "updatedAt" + ], + "type": "object" + }, + { + "properties": { + "id": { + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "updatedAt": { + "type": "number" + }, + "projectIds": { + "items": { + "type": "string" + }, + "type": "array" + }, + "name": { + "type": "string" + }, + "teamId": { + "nullable": true, + "type": "string" + }, + "ownerId": { + "type": "string" + }, + "status": { + "type": "string", + "enum": [ + "disabled", + "enabled", + "errored" + ] + }, + "firstErrorTimestamp": { + "type": "number" + }, + "disabledAt": { + "type": "number" + }, + "disabledBy": { + "type": "string" + }, + "disabledReason": { + "type": "string", + "enum": [ + "account-plan-downgrade", + "disabled-by-admin", + "disabled-by-owner", + "feature-not-available", + "limits-exceeded" + ] + }, + "schemas": { + "properties": { + "log": { + "type": "object" + }, + "trace": { + "type": "object" + }, + "analytics": { + "type": "object" + }, + "speed_insights": { + "type": "object" + }, + "ai_gateway": { + "type": "object" + }, + "audit_log": { + "type": "object" + }, + "connect": { + "type": "object" + } + }, + "type": "object" + }, + "delivery": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "http" + ] + }, + "endpoint": { + "type": "string" + }, + "encoding": { + "type": "string", + "enum": [ + "json", + "ndjson" + ] + }, + "compression": { + "type": "string", + "enum": [ + "gzip", + "none" + ] + }, + "headers": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "secret": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "kind": { + "type": "string", + "enum": [ + "INTEGRATION_SECRET" + ] + } + }, + "required": [ + "kind" + ], + "type": "object" + } + ] + } + }, + "required": [ + "encoding", + "endpoint", + "headers", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "otlphttp" + ] + }, + "endpoint": { + "properties": { + "traces": { + "type": "string" + } + }, + "required": [ + "traces" + ], + "type": "object" + }, + "encoding": { + "type": "string", + "enum": [ + "json", + "proto" + ] + }, + "headers": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "secret": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "kind": { + "type": "string", + "enum": [ + "INTEGRATION_SECRET" + ] + } + }, + "required": [ + "kind" + ], + "type": "object" + } + ] + } + }, + "required": [ + "encoding", + "endpoint", + "headers", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "clickhouse" + ] + }, + "endpoint": { + "type": "string" + }, + "table": { + "type": "string" + } + }, + "required": [ + "endpoint", + "table", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "s3" + ] + }, + "endpoint": { + "type": "string" + }, + "encoding": { + "type": "string", + "enum": [ + "json", + "ndjson" + ] + }, + "compression": { + "type": "string", + "enum": [ + "none" + ] + }, + "fileStructure": { + "type": "string", + "enum": [ + "hive" + ] + }, + "roleArn": { + "type": "string" + }, + "region": { + "type": "string" + }, + "serverSideEncryption": { + "type": "string", + "enum": [ + "AES256", + "aws:kms", + "aws:kms:dsse" + ] + }, + "objectAcl": { + "type": "string", + "enum": [ + "authenticated-read", + "aws-exec-read", + "bucket-owner-full-control", + "bucket-owner-read", + "private", + "public-read", + "public-read-write" + ] + } + }, + "required": [ + "compression", + "encoding", + "endpoint", + "fileStructure", + "region", + "roleArn", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "internal" + ] + }, + "target": { + "type": "string", + "enum": [ + "vercel-otel-traces-db" + ] + } + }, + "required": [ + "target", + "type" + ], + "type": "object" + } + ] + }, + "sampling": { + "items": { + "properties": { + "type": { + "type": "string", + "enum": [ + "head_sampling" + ] + }, + "rate": { + "type": "number" + }, + "env": { + "type": "string", + "enum": [ + "preview", + "production" + ] + }, + "requestPath": { + "type": "string" + } + }, + "required": [ + "rate", + "type" + ], + "type": "object" + }, + "type": "array" + }, + "source": { + "oneOf": [ + { + "properties": { + "kind": { + "type": "string", + "enum": [ + "self-served" + ] + } + }, + "required": [ + "kind" + ], + "type": "object" + }, + { + "properties": { + "kind": { + "type": "string", + "enum": [ + "integration" + ] + }, + "resourceId": { + "type": "string" + }, + "externalResourceId": { + "type": "string" + }, + "integrationId": { + "type": "string" + }, + "integrationConfigurationId": { + "type": "string" + } + }, + "required": [ + "integrationConfigurationId", + "integrationId", + "kind" + ], + "type": "object" + } + ] + }, + "filterV2": { + "properties": { + "version": { + "type": "string", + "enum": [ + "v2" + ] + }, + "filter": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "basic" + ] + }, + "project": { + "properties": { + "ids": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "log": { + "properties": { + "sources": { + "items": { + "type": "string", + "enum": [ + "build", + "edge", + "external", + "firewall", + "lambda", + "redirect", + "static" + ] + }, + "type": "array" + }, + "legacy_excludeCachedStaticAssetLogs": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "type": "object" + }, + "deployment": { + "properties": { + "environments": { + "items": { + "type": "string", + "enum": [ + "preview", + "production" + ] + }, + "type": "array" + } + }, + "type": "object" + } + }, + "required": [ + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "odata" + ] + }, + "text": { + "type": "string" + } + }, + "required": [ + "text", + "type" + ], + "type": "object" + } + ] + } + }, + "required": [ + "filter", + "version" + ], + "type": "object" + }, + "integrationIcon": { + "type": "string" + }, + "integrationConfigurationUri": { + "type": "string" + }, + "integrationWebsite": { + "type": "string" + }, + "projectAccess": { + "oneOf": [ + { + "properties": { + "access": { + "type": "string", + "enum": [ + "all" + ] + }, + "managedBy": { + "type": "string", + "enum": [ + "drain", + "integration" + ] + } + }, + "required": [ + "access", + "managedBy" + ], + "type": "object" + }, + { + "properties": { + "access": { + "type": "string", + "enum": [ + "some" + ] + }, + "projectIds": { + "items": { + "type": "string" + }, + "type": "array" + }, + "managedBy": { + "type": "string", + "enum": [ + "drain", + "integration" + ] + } + }, + "required": [ + "access", + "managedBy", + "projectIds" + ], + "type": "object" + } + ] + } + }, + "required": [ + "createdAt", + "delivery", + "id", + "name", + "ownerId", + "schemas", + "source", + "updatedAt" + ], + "type": "object" + } + ] + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid.\nOne of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "402": { + "description": "" + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "additionalProperties": false, + "properties": { + "name": { + "type": "string" + }, + "projects": { + "type": "string", + "enum": [ + "some", + "all" + ] + }, + "projectIds": { + "type": "array", + "items": { + "type": "string" + }, + "nullable": true + }, + "filter": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "version", + "filter" + ], + "properties": { + "version": { + "type": "string" + }, + "filter": { + "oneOf": [ + { + "type": "object", + "additionalProperties": false, + "required": [ + "type" + ], + "properties": { + "type": { + "type": "string" + }, + "project": { + "type": "object", + "additionalProperties": false, + "properties": { + "ids": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "log": { + "type": "object", + "additionalProperties": false, + "properties": { + "sources": { + "type": "array", + "items": { + "type": "string", + "enum": [ + "build", + "edge", + "lambda", + "static", + "external", + "firewall", + "redirect" + ] + } + } + } + }, + "deployment": { + "type": "object", + "additionalProperties": false, + "properties": { + "environments": { + "type": "array", + "items": { + "type": "string", + "enum": [ + "production", + "preview" + ] + } + } + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "type", + "text" + ], + "properties": { + "type": { + "type": "string" + }, + "text": { + "type": "string" + } + } + } + ] + } + } + } + ] + }, + "schemas": { + "type": "object", + "additionalProperties": { + "type": "object", + "required": [ + "version" + ], + "properties": { + "version": { + "type": "string" + } + } + } + }, + "delivery": { + "type": "object", + "oneOf": [ + { + "type": "object", + "additionalProperties": false, + "required": [ + "type", + "endpoint", + "encoding", + "headers" + ], + "properties": { + "type": { + "type": "string" + }, + "endpoint": { + "type": "string" + }, + "compression": { + "type": "string", + "enum": [ + "gzip", + "none" + ] + }, + "encoding": { + "type": "string", + "enum": [ + "json", + "ndjson" + ] + }, + "headers": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "secret": { + "type": "string" + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "type", + "endpoint", + "encoding", + "headers" + ], + "properties": { + "type": { + "type": "string" + }, + "endpoint": { + "oneOf": [ + { + "type": "object", + "additionalProperties": false, + "required": [ + "traces" + ], + "properties": { + "traces": { + "type": "string" + } + } + } + ] + }, + "encoding": { + "type": "string", + "enum": [ + "proto", + "json" + ] + }, + "headers": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "secret": { + "type": "string" + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "type", + "endpoint", + "encoding", + "compression", + "fileStructure", + "roleArn", + "region" + ], + "properties": { + "type": { + "type": "string" + }, + "endpoint": { + "type": "string" + }, + "encoding": { + "type": "string", + "enum": [ + "json", + "ndjson" + ] + }, + "compression": { + "type": "string", + "enum": [ + "none" + ] + }, + "fileStructure": { + "type": "string", + "enum": [ + "hive" + ] + }, + "roleArn": { + "type": "string" + }, + "region": { + "type": "string" + }, + "serverSideEncryption": { + "type": "string", + "enum": [ + "AES256", + "aws:kms", + "aws:kms:dsse" + ], + "default": "AES256" + }, + "objectAcl": { + "type": "string", + "enum": [ + "private", + "bucket-owner-read", + "bucket-owner-full-control" + ] + } + } + } + ] + }, + "sampling": { + "type": "array", + "maxItems": 10, + "items": { + "type": "object", + "additionalProperties": false, + "required": [ + "type", + "rate" + ], + "properties": { + "type": { + "type": "string" + }, + "rate": { + "type": "number", + "minimum": 0, + "maximum": 1, + "description": "Sampling rate from 0 to 1 (e.g., 0.1 for 10%)" + }, + "env": { + "type": "string", + "enum": [ + "production", + "preview" + ], + "description": "Environment to apply sampling to" + }, + "requestPath": { + "type": "string", + "description": "Request path prefix to apply the sampling rule to" + } + } + }, + "nullable": true + }, + "transforms": { + "type": "array", + "items": { + "type": "object", + "required": [ + "id" + ], + "properties": { + "id": { + "type": "string" + } + } + }, + "nullable": true + }, + "status": { + "type": "string", + "enum": [ + "enabled", + "disabled" + ] + }, + "source": { + "type": "object", + "oneOf": [ + { + "oneOf": [ + { + "properties": { + "kind": { + "type": "string", + "default": "integration" + }, + "externalResourceId": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "externalResourceId" + ] + }, + { + "properties": { + "kind": { + "type": "string", + "default": "integration" + }, + "resourceId": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "resourceId" + ] + }, + { + "properties": { + "kind": { + "type": "string", + "default": "integration" + } + }, + "additionalProperties": false, + "required": [ + "kind" + ] + } + ] + }, + { + "properties": { + "kind": { + "type": "string", + "default": "self-served" + } + }, + "additionalProperties": false, + "required": [ + "kind" + ] + } + ] + } + } + } + } + } + } + } + }, + "/v1/drains/test": { + "post": { + "description": "Validate the delivery configuration of a Drain using sample events.", + "operationId": "testDrain", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Validate Drain delivery configuration", + "tags": [ + "drains" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "oneOf": [ + { + "type": "object" + }, + { + "properties": { + "status": { + "type": "string" + }, + "error": { + "type": "string" + }, + "endpoint": { + "type": "string" + } + }, + "required": [ + "endpoint", + "error", + "status" + ], + "type": "object" + } + ] + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "402": { + "description": "" + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "additionalProperties": false, + "required": [ + "schemas", + "delivery" + ], + "properties": { + "schemas": { + "type": "object", + "additionalProperties": { + "type": "object", + "required": [ + "version" + ], + "properties": { + "version": { + "type": "string" + } + } + } + }, + "delivery": { + "type": "object", + "oneOf": [ + { + "type": "object", + "additionalProperties": false, + "required": [ + "type", + "endpoint", + "encoding", + "headers" + ], + "properties": { + "type": { + "type": "string" + }, + "endpoint": { + "type": "string" + }, + "compression": { + "type": "string", + "enum": [ + "gzip", + "none" + ] + }, + "encoding": { + "type": "string", + "enum": [ + "json", + "ndjson" + ] + }, + "headers": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "secret": { + "type": "string" + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "type", + "endpoint", + "encoding", + "headers" + ], + "properties": { + "type": { + "type": "string" + }, + "endpoint": { + "oneOf": [ + { + "type": "object", + "additionalProperties": false, + "required": [ + "traces" + ], + "properties": { + "traces": { + "type": "string" + } + } + } + ] + }, + "encoding": { + "type": "string", + "enum": [ + "proto", + "json" + ] + }, + "headers": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "secret": { + "type": "string" + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "type", + "endpoint", + "encoding", + "compression", + "fileStructure", + "roleArn", + "region" + ], + "properties": { + "type": { + "type": "string" + }, + "endpoint": { + "type": "string" + }, + "encoding": { + "type": "string", + "enum": [ + "json", + "ndjson" + ] + }, + "compression": { + "type": "string", + "enum": [ + "none" + ] + }, + "fileStructure": { + "type": "string", + "enum": [ + "hive" + ] + }, + "roleArn": { + "type": "string" + }, + "region": { + "type": "string" + }, + "serverSideEncryption": { + "type": "string", + "enum": [ + "AES256", + "aws:kms", + "aws:kms:dsse" + ], + "default": "AES256" + }, + "objectAcl": { + "type": "string", + "enum": [ + "private", + "bucket-owner-read", + "bucket-owner-full-control" + ] + } + } + } + ] + } + } + } + } + } + } + } + }, + "/v1/edge-cache/invalidate-by-tags": { + "post": { + "description": "Marks a cache tag as stale, causing cache entries associated with that tag to be revalidated in the background on the next request.", + "operationId": "invalidateByTags", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Invalidate by tag", + "tags": [ + "edge-cache" + ], + "responses": { + "200": { + "description": "" + }, + "400": { + "description": "One of the provided values in the request body is invalid.\nOne of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "projectIdOrName", + "in": "query", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "additionalProperties": false, + "type": "object", + "required": [ + "tags" + ], + "properties": { + "tags": { + "oneOf": [ + { + "items": { + "maxLength": 256, + "type": "string" + }, + "maxItems": 16, + "minItems": 1, + "type": "array" + }, + { + "maxLength": 8196, + "type": "string" + } + ] + }, + "target": { + "enum": [ + "production", + "preview" + ], + "type": "string" + } + } + } + } + } + } + } + }, + "/v1/edge-cache/dangerously-delete-by-tags": { + "post": { + "description": "Marks a cache tag as deleted, causing cache entries associated with that tag to be revalidated in the foreground on the next request. Use this method with caution because one tag can be associated with many paths and deleting the cache can cause many concurrent requests to the origin leading to cache stampede problem. This method is for advanced use cases and is not recommended; prefer using `invalidateByTag` instead.", + "operationId": "dangerouslyDeleteByTags", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Dangerously delete by tag", + "tags": [ + "edge-cache" + ], + "responses": { + "200": { + "description": "" + }, + "400": { + "description": "One of the provided values in the request body is invalid.\nOne of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "projectIdOrName", + "in": "query", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "additionalProperties": false, + "type": "object", + "required": [ + "tags" + ], + "properties": { + "revalidationDeadlineSeconds": { + "minimum": 0, + "maximum": 31536000, + "type": "integer" + }, + "tags": { + "oneOf": [ + { + "items": { + "maxLength": 256, + "type": "string" + }, + "maxItems": 16, + "minItems": 1, + "type": "array" + }, + { + "maxLength": 8196, + "type": "string" + } + ] + }, + "target": { + "enum": [ + "production", + "preview" + ], + "type": "string" + } + } + } + } + } + } + } + }, + "/v1/edge-cache/invalidate-by-src-images": { + "post": { + "description": "Marks a source image as stale, causing its corresponding transformed images to be revalidated in the background on the next request.", + "operationId": "invalidateBySrcImages", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Invalidate by source image", + "tags": [ + "edge-cache" + ], + "responses": { + "200": { + "description": "" + }, + "400": { + "description": "One of the provided values in the request body is invalid.\nOne of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "402": { + "description": "" + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "projectIdOrName", + "in": "query", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "additionalProperties": false, + "type": "object", + "required": [ + "srcImages" + ], + "properties": { + "srcImages": { + "items": { + "type": "string" + }, + "maxItems": 8, + "minItems": 1, + "type": "array" + } + } + } + } + } + } + } + }, + "/v1/edge-cache/dangerously-delete-by-src-images": { + "post": { + "description": "Marks a source image as deleted, causing cache entries associated with that source image to be revalidated in the foreground on the next request. Use this method with caution because one source image can be associated with many paths and deleting the cache can cause many concurrent requests to the origin leading to cache stampede problem. This method is for advanced use cases and is not recommended; prefer using `invalidateBySrcImage` instead.", + "operationId": "dangerouslyDeleteBySrcImages", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Dangerously delete by source image", + "tags": [ + "edge-cache" + ], + "responses": { + "200": { + "description": "" + }, + "400": { + "description": "One of the provided values in the request body is invalid.\nOne of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "402": { + "description": "" + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "projectIdOrName", + "in": "query", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "additionalProperties": false, + "type": "object", + "required": [ + "srcImages" + ], + "properties": { + "revalidationDeadlineSeconds": { + "minimum": 0, + "maximum": 31536000, + "type": "integer" + }, + "srcImages": { + "items": { + "type": "string" + }, + "maxItems": 8, + "minItems": 1, + "type": "array" + } + } + } + } + } + } + } + }, + "/v1/global-config": { + "get": { + "description": "Returns all Global Configs.", + "operationId": "getEdgeConfigs", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Get Global Configs", + "tags": [ + "global-config" + ], + "responses": { + "200": { + "description": "List of all global configs.", + "content": { + "application/json": { + "schema": { + "properties": { + "id": { + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "createdBy": { + "type": "string", + "description": "The ID of the user who created the Global Config, optional because it is not always set." + }, + "ownerId": { + "type": "string" + }, + "slug": { + "type": "string", + "description": "Name for the Global Config Names are not unique. Must start with an alphabetic character and can contain only alphanumeric characters and underscores)." + }, + "updatedAt": { + "type": "number" + }, + "digest": { + "type": "string" + }, + "purpose": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "flags" + ] + }, + "projectId": { + "type": "string" + } + }, + "required": [ + "projectId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "experimentation" + ] + }, + "resourceId": { + "type": "string" + } + }, + "required": [ + "resourceId", + "type" + ], + "type": "object" + } + ] + }, + "deletedAt": { + "nullable": true, + "type": "number" + }, + "transfer": { + "properties": { + "fromAccountId": { + "type": "string" + }, + "startedAt": { + "type": "number" + }, + "doneAt": { + "nullable": true, + "type": "number" + } + }, + "required": [ + "doneAt", + "fromAccountId", + "startedAt" + ], + "type": "object", + "description": "Keeps track of the current state of the Global Config while it gets transferred." + }, + "schema": { + "type": "object" + }, + "syncedToDynamoAt": { + "type": "number", + "description": "Timestamp of when the Global Config was synced to DynamoDB initially. It is only set when syncing the entire Global Config, not when updating." + }, + "sizeInBytes": { + "type": "number" + }, + "itemCount": { + "type": "number" + } + }, + "required": [ + "createdAt", + "digest", + "id", + "itemCount", + "ownerId", + "sizeInBytes", + "slug", + "updatedAt" + ], + "type": "object", + "description": "List of all global configs." + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + }, + "post": { + "description": "Creates a Global Config.", + "operationId": "createEdgeConfig", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Create a Global Config", + "tags": [ + "global-config" + ], + "responses": { + "201": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "id": { + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "createdBy": { + "type": "string", + "description": "The ID of the user who created the Global Config, optional because it is not always set." + }, + "ownerId": { + "type": "string" + }, + "slug": { + "type": "string", + "description": "Name for the Global Config Names are not unique. Must start with an alphabetic character and can contain only alphanumeric characters and underscores)." + }, + "updatedAt": { + "type": "number" + }, + "digest": { + "type": "string" + }, + "purpose": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "flags" + ] + }, + "projectId": { + "type": "string" + } + }, + "required": [ + "projectId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "experimentation" + ] + }, + "resourceId": { + "type": "string" + } + }, + "required": [ + "resourceId", + "type" + ], + "type": "object" + } + ] + }, + "deletedAt": { + "nullable": true, + "type": "number" + }, + "transfer": { + "properties": { + "fromAccountId": { + "type": "string" + }, + "startedAt": { + "type": "number" + }, + "doneAt": { + "nullable": true, + "type": "number" + } + }, + "required": [ + "doneAt", + "fromAccountId", + "startedAt" + ], + "type": "object", + "description": "Keeps track of the current state of the Global Config while it gets transferred." + }, + "schema": { + "type": "object" + }, + "syncedToDynamoAt": { + "type": "number", + "description": "Timestamp of when the Global Config was synced to DynamoDB initially. It is only set when syncing the entire Global Config, not when updating." + }, + "sizeInBytes": { + "type": "number" + }, + "itemCount": { + "type": "number" + } + }, + "required": [ + "createdAt", + "digest", + "id", + "itemCount", + "ownerId", + "sizeInBytes", + "slug", + "updatedAt" + ], + "type": "object", + "description": "A Global Config" + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "402": { + "description": "The account is missing a payment so payment method must be updated" + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "slug" + ], + "properties": { + "slug": { + "maxLength": 64, + "pattern": "^[\\w-]+$", + "type": "string" + }, + "items": { + "type": "object", + "additionalProperties": {} + } + } + } + } + } + } + } + }, + "/v1/global-config/{edgeConfigId}": { + "get": { + "description": "Returns a Global Config.", + "operationId": "getEdgeConfig", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Get a Global Config", + "tags": [ + "global-config" + ], + "responses": { + "200": { + "description": "The Global Config.", + "content": { + "application/json": { + "schema": { + "properties": { + "id": { + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "createdBy": { + "type": "string", + "description": "The ID of the user who created the Global Config, optional because it is not always set." + }, + "ownerId": { + "type": "string" + }, + "slug": { + "type": "string", + "description": "Name for the Global Config Names are not unique. Must start with an alphabetic character and can contain only alphanumeric characters and underscores)." + }, + "updatedAt": { + "type": "number" + }, + "digest": { + "type": "string" + }, + "purpose": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "flags" + ] + }, + "projectId": { + "type": "string" + } + }, + "required": [ + "projectId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "experimentation" + ] + }, + "resourceId": { + "type": "string" + } + }, + "required": [ + "resourceId", + "type" + ], + "type": "object" + } + ] + }, + "deletedAt": { + "nullable": true, + "type": "number" + }, + "transfer": { + "properties": { + "fromAccountId": { + "type": "string" + }, + "startedAt": { + "type": "number" + }, + "doneAt": { + "nullable": true, + "type": "number" + } + }, + "required": [ + "doneAt", + "fromAccountId", + "startedAt" + ], + "type": "object", + "description": "Keeps track of the current state of the Global Config while it gets transferred." + }, + "schema": { + "type": "object" + }, + "syncedToDynamoAt": { + "type": "number", + "description": "Timestamp of when the Global Config was synced to DynamoDB initially. It is only set when syncing the entire Global Config, not when updating." + }, + "sizeInBytes": { + "type": "number" + }, + "itemCount": { + "type": "number" + } + }, + "required": [ + "createdAt", + "digest", + "id", + "itemCount", + "ownerId", + "sizeInBytes", + "slug", + "updatedAt" + ], + "type": "object", + "description": "The Global Config." + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "edgeConfigId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + }, + "put": { + "description": "Updates a Global Config.", + "operationId": "updateEdgeConfig", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Update a Global Config", + "tags": [ + "global-config" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "id": { + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "createdBy": { + "type": "string", + "description": "The ID of the user who created the Global Config, optional because it is not always set." + }, + "ownerId": { + "type": "string" + }, + "slug": { + "type": "string", + "description": "Name for the Global Config Names are not unique. Must start with an alphabetic character and can contain only alphanumeric characters and underscores)." + }, + "updatedAt": { + "type": "number" + }, + "digest": { + "type": "string" + }, + "purpose": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "flags" + ] + }, + "projectId": { + "type": "string" + } + }, + "required": [ + "projectId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "experimentation" + ] + }, + "resourceId": { + "type": "string" + } + }, + "required": [ + "resourceId", + "type" + ], + "type": "object" + } + ] + }, + "deletedAt": { + "nullable": true, + "type": "number" + }, + "transfer": { + "properties": { + "fromAccountId": { + "type": "string" + }, + "startedAt": { + "type": "number" + }, + "doneAt": { + "nullable": true, + "type": "number" + } + }, + "required": [ + "doneAt", + "fromAccountId", + "startedAt" + ], + "type": "object", + "description": "Keeps track of the current state of the Global Config while it gets transferred." + }, + "schema": { + "type": "object" + }, + "syncedToDynamoAt": { + "type": "number", + "description": "Timestamp of when the Global Config was synced to DynamoDB initially. It is only set when syncing the entire Global Config, not when updating." + }, + "sizeInBytes": { + "type": "number" + }, + "itemCount": { + "type": "number" + } + }, + "required": [ + "createdAt", + "digest", + "id", + "itemCount", + "ownerId", + "sizeInBytes", + "slug", + "updatedAt" + ], + "type": "object", + "description": "A Global Config" + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid.\nOne of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "402": { + "description": "The account is missing a payment so payment method must be updated" + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "409": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "edgeConfigId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "slug" + ], + "properties": { + "slug": { + "maxLength": 64, + "pattern": "^[\\w-]+$", + "type": "string" + } + } + } + } + } + } + }, + "delete": { + "description": "Delete a Global Config by id.", + "operationId": "deleteEdgeConfig", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Delete a Global Config", + "tags": [ + "global-config" + ], + "responses": { + "204": { + "description": "" + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "409": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "edgeConfigId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + } + }, + "/v1/global-config/{edgeConfigId}/items": { + "get": { + "description": "Returns all items of a Global Config.", + "operationId": "getEdgeConfigItems", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Get Global Config items", + "tags": [ + "global-config" + ], + "responses": { + "200": { + "description": "List of all Global Config items.", + "content": { + "application/json": { + "schema": { + "items": { + "$ref": "#/components/schemas/GlobalConfigItem" + }, + "type": "array" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "edgeConfigId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "pattern": "^ecfg_" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + }, + "patch": { + "description": "Update multiple Global Config Items in batch.", + "operationId": "patchEdgeConfigItems", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Update Global Config items in batch", + "tags": [ + "global-config" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "status": { + "type": "string" + } + }, + "required": [ + "status" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid.\nOne of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "402": { + "description": "The account is missing a payment so payment method must be updated" + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "409": { + "description": "" + }, + "410": { + "description": "" + }, + "412": { + "description": "" + } + }, + "parameters": [ + { + "name": "edgeConfigId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "pattern": "^ecfg_" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "additionalProperties": false, + "required": [ + "items" + ], + "properties": { + "items": { + "type": "array", + "items": { + "oneOf": [ + { + "type": "object", + "properties": { + "operation": { + "enum": [ + "create", + "update", + "upsert", + "delete" + ] + }, + "key": { + "maxLength": 256, + "pattern": "^[\\w-]+$", + "type": "string" + }, + "value": {}, + "description": { + "oneOf": [ + { + "type": "string", + "maxLength": 512 + }, + { + "type": "string" + } + ] + } + }, + "anyOf": [ + { + "properties": { + "operation": {} + }, + "required": [ + "operation", + "key", + "value" + ] + }, + { + "properties": { + "operation": { + "enum": [ + "update", + "upsert" + ] + } + }, + "required": [ + "operation", + "key", + "value" + ] + }, + { + "properties": { + "operation": { + "enum": [ + "update", + "upsert" + ] + } + }, + "required": [ + "operation", + "key", + "description" + ] + }, + { + "properties": { + "operation": {} + }, + "required": [ + "operation", + "key" + ], + "not": { + "required": [ + "value", + "description" + ] + } + } + ] + } + ] + } + } + } + } + } + } + } + } + }, + "/v1/global-config/{edgeConfigId}/schema": { + "get": { + "description": "Returns the schema of a Global Config.", + "operationId": "getEdgeConfigSchema", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Get Global Config schema", + "tags": [ + "global-config" + ], + "responses": { + "200": { + "description": "The Global Config.", + "content": { + "application/json": { + "schema": { + "nullable": true, + "type": "object", + "description": "The Global Config." + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "edgeConfigId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + }, + "post": { + "description": "Update a Global Config's schema.", + "operationId": "patchEdgeConfigSchema", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Update Global Config schema", + "tags": [ + "global-config" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "nullable": true, + "type": "object", + "description": "The JSON schema uploaded by the user" + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid.\nOne of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "402": { + "description": "The account is missing a payment so payment method must be updated" + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "409": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "edgeConfigId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "dryRun", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "additionalProperties": false, + "required": [ + "definition" + ], + "properties": { + "definition": {} + } + } + } + } + } + }, + "delete": { + "description": "Deletes the schema of existing Global Config.", + "operationId": "deleteEdgeConfigSchema", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Delete a Global Config's schema", + "tags": [ + "global-config" + ], + "responses": { + "204": { + "description": "" + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "402": { + "description": "The account is missing a payment so payment method must be updated" + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "409": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "edgeConfigId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + } + }, + "/v1/global-config/{edgeConfigId}/item/{edgeConfigItemKey}": { + "get": { + "description": "Returns a specific Global Config Item.", + "operationId": "getEdgeConfigItem", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Get a Global Config item", + "tags": [ + "global-config" + ], + "responses": { + "200": { + "description": "The Global Config.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GlobalConfigItem" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "edgeConfigId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "pattern": "^ecfg_" + } + }, + { + "name": "edgeConfigItemKey", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + } + }, + "/v1/global-config/{edgeConfigId}/tokens": { + "get": { + "description": "Returns all tokens of a Global Config.", + "operationId": "getEdgeConfigTokens", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Get all tokens of a Global Config", + "tags": [ + "global-config" + ], + "responses": { + "200": { + "description": "The Global Config.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GlobalConfigToken" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "edgeConfigId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + }, + "delete": { + "description": "Deletes one or more tokens of an existing Global Config.", + "operationId": "deleteEdgeConfigTokens", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Delete one or more Global Config tokens", + "tags": [ + "global-config" + ], + "responses": { + "204": { + "description": "" + }, + "400": { + "description": "One of the provided values in the request body is invalid.\nOne of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "402": { + "description": "The account is missing a payment so payment method must be updated" + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "409": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "edgeConfigId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "pattern": "^ecfg_" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "additionalProperties": false, + "properties": { + "tokens": { + "type": "array", + "minItems": 1, + "items": { + "type": "string" + } + }, + "ids": { + "type": "array", + "minItems": 1, + "items": { + "type": "string" + } + } + }, + "anyOf": [ + { + "required": [ + "tokens" + ] + }, + { + "required": [ + "ids" + ] + } + ] + } + } + } + } + } + }, + "/v1/global-config/{edgeConfigId}/token/{token}": { + "get": { + "description": "Return meta data about a Global Config token.", + "operationId": "getEdgeConfigToken", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Get Global Config token meta data", + "tags": [ + "global-config" + ], + "responses": { + "200": { + "description": "The Global Config.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/GlobalConfigToken" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "edgeConfigId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "token", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + } + }, + "/v1/global-config/{edgeConfigId}/token": { + "post": { + "description": "Adds a token to an existing Global Config.", + "operationId": "createEdgeConfigToken", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Create a Global Config token", + "tags": [ + "global-config" + ], + "responses": { + "201": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "token": { + "type": "string" + }, + "id": { + "type": "string" + } + }, + "required": [ + "id", + "token" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid.\nOne of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "402": { + "description": "The account is missing a payment so payment method must be updated" + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "409": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "edgeConfigId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "pattern": "^ecfg_" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "additionalProperties": false, + "required": [ + "label" + ], + "properties": { + "label": { + "maxLength": 52, + "type": "string" + } + } + } + } + } + } + } + }, + "/v1/global-config/{edgeConfigId}/backups/{edgeConfigBackupVersionId}": { + "get": { + "description": "Retrieves a specific version of a Global Config from backup storage.", + "operationId": "getEdgeConfigBackup", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Get Global Config backup", + "tags": [ + "global-config" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "oneOf": [ + { + "properties": { + "id": { + "type": "string" + }, + "lastModified": { + "type": "number" + }, + "backup": { + "properties": { + "slug": { + "type": "string", + "description": "Name for the Global Config Names are not unique. Must start with an alphabetic character and can contain only alphanumeric characters and underscores)." + }, + "updatedAt": { + "type": "number" + }, + "items": { + "additionalProperties": { + "properties": { + "createdAt": { + "type": "number" + }, + "updatedAt": { + "type": "number" + }, + "value": { + "$ref": "#/components/schemas/GlobalConfigItemValue" + }, + "description": { + "type": "string" + } + }, + "required": [ + "createdAt", + "updatedAt", + "value" + ], + "type": "object" + }, + "type": "object" + }, + "digest": { + "type": "string" + } + }, + "required": [ + "digest", + "items", + "slug", + "updatedAt" + ], + "type": "object" + }, + "metadata": { + "properties": { + "updatedAt": { + "type": "string" + }, + "updatedBy": { + "type": "string" + }, + "itemsCount": { + "type": "number" + }, + "itemsBytes": { + "type": "number" + } + }, + "type": "object" + }, + "user": { + "properties": { + "id": { + "type": "string" + }, + "username": { + "type": "string" + }, + "email": { + "type": "string" + }, + "name": { + "type": "string" + }, + "avatar": { + "type": "string" + } + }, + "required": [ + "email", + "id", + "username" + ], + "type": "object" + } + }, + "required": [ + "backup", + "id", + "lastModified", + "metadata" + ], + "type": "object", + "description": "The object the API responds with when requesting a Global Config backup" + }, + { + "properties": { + "user": { + "properties": { + "id": { + "type": "string" + }, + "username": { + "type": "string" + }, + "email": { + "type": "string" + }, + "name": { + "type": "string" + }, + "avatar": { + "type": "string" + } + }, + "required": [ + "email", + "id", + "username" + ], + "type": "object" + }, + "id": { + "type": "string" + }, + "lastModified": { + "type": "number" + }, + "backup": { + "properties": { + "slug": { + "type": "string", + "description": "Name for the Global Config Names are not unique. Must start with an alphabetic character and can contain only alphanumeric characters and underscores)." + }, + "updatedAt": { + "type": "number" + }, + "items": { + "additionalProperties": { + "properties": { + "createdAt": { + "type": "number" + }, + "updatedAt": { + "type": "number" + }, + "value": { + "$ref": "#/components/schemas/GlobalConfigItemValue" + }, + "description": { + "type": "string" + } + }, + "required": [ + "createdAt", + "updatedAt", + "value" + ], + "type": "object" + }, + "type": "object" + }, + "digest": { + "type": "string" + } + }, + "required": [ + "digest", + "items", + "slug", + "updatedAt" + ], + "type": "object" + }, + "metadata": { + "properties": { + "updatedAt": { + "type": "string" + }, + "updatedBy": { + "type": "string" + }, + "itemsCount": { + "type": "number" + }, + "itemsBytes": { + "type": "number" + } + }, + "type": "object" + } + }, + "required": [ + "backup", + "id", + "lastModified", + "metadata", + "user" + ], + "type": "object" + } + ] + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "edgeConfigId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "edgeConfigBackupVersionId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + } + }, + "/v1/global-config/{edgeConfigId}/backups/{edgeConfigBackupVersionId}/restore": { + "post": { + "description": "Restores a Global Config backup.", + "operationId": "restoreEdgeConfigBackup", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Restore Global Config backup", + "tags": [ + "global-config" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "status": { + "type": "string", + "enum": [ + "ok" + ] + }, + "restoredFrom": { + "type": "string" + }, + "previousDigest": { + "type": "string" + }, + "digest": { + "type": "string" + } + }, + "required": [ + "digest", + "previousDigest", + "restoredFrom", + "status" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "402": { + "description": "The account is missing a payment so payment method must be updated" + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "409": { + "description": "" + }, + "410": { + "description": "" + }, + "412": { + "description": "" + } + }, + "parameters": [ + { + "name": "edgeConfigId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "pattern": "^ecfg_" + } + }, + { + "name": "edgeConfigBackupVersionId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + } + }, + "/v1/global-config/{edgeConfigId}/backups": { + "get": { + "description": "Returns backups of a Global Config.", + "operationId": "getEdgeConfigBackups", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Get Global Config backups", + "tags": [ + "global-config" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "backups": { + "items": { + "properties": { + "metadata": { + "properties": { + "updatedAt": { + "type": "string" + }, + "updatedBy": { + "type": "string" + }, + "itemsCount": { + "type": "number" + }, + "itemsBytes": { + "type": "number" + } + }, + "type": "object" + }, + "id": { + "type": "string" + }, + "lastModified": { + "type": "number" + } + }, + "required": [ + "id", + "lastModified" + ], + "type": "object" + }, + "type": "array" + }, + "pagination": { + "properties": { + "hasNext": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "next": { + "type": "string" + } + }, + "required": [ + "hasNext" + ], + "type": "object" + } + }, + "required": [ + "backups", + "pagination" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "edgeConfigId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "next", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "limit", + "in": "query", + "required": false, + "schema": { + "type": "number", + "minimum": 0, + "maximum": 50 + } + }, + { + "name": "metadata", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + } + }, + "/v1/env": { + "post": { + "description": "Creates shared environment variable(s) for a team.", + "operationId": "createSharedEnvVariable", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Create one or more shared environment variables", + "tags": [ + "environment" + ], + "responses": { + "201": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "created": { + "items": { + "properties": { + "created": { + "type": "string", + "format": "date-time", + "description": "The date when the Shared Env Var was created.", + "example": "2021-02-10T13:11:49.180Z" + }, + "key": { + "type": "string", + "description": "The name of the Shared Env Var.", + "example": "my-api-key" + }, + "ownerId": { + "nullable": true, + "type": "string", + "description": "The unique identifier of the owner (team) the Shared Env Var was created for.", + "example": "team_LLHUOMOoDlqOp8wPE4kFo9pE" + }, + "id": { + "type": "string", + "description": "The unique identifier of the Shared Env Var.", + "example": "env_XCG7t7AIHuO2SBA8667zNUiM" + }, + "createdBy": { + "nullable": true, + "type": "string", + "description": "The unique identifier of the user who created the Shared Env Var.", + "example": "2qDDuGFTWXBLDNnqZfWPDp1A" + }, + "deletedBy": { + "nullable": true, + "type": "string", + "description": "The unique identifier of the user who deleted the Shared Env Var.", + "example": "2qDDuGFTWXBLDNnqZfWPDp1A" + }, + "updatedBy": { + "nullable": true, + "type": "string", + "description": "The unique identifier of the user who last updated the Shared Env Var.", + "example": "2qDDuGFTWXBLDNnqZfWPDp1A" + }, + "createdAt": { + "type": "number", + "description": "Timestamp for when the Shared Env Var was created.", + "example": 1609492210000 + }, + "deletedAt": { + "type": "number", + "description": "Timestamp for when the Shared Env Var was (soft) deleted.", + "example": 1609492210000 + }, + "updatedAt": { + "type": "number", + "description": "Timestamp for when the Shared Env Var was last updated.", + "example": 1609492210000 + }, + "value": { + "type": "string", + "description": "The value of the Shared Env Var." + }, + "projectId": { + "items": { + "type": "string" + }, + "type": "array", + "description": "The unique identifiers of the projects which the Shared Env Var is linked to.", + "example": [ + "prj_2WjyKQmM8ZnGcJsPWMrHRHrE", + "prj_2WjyKQmM8ZnGcJsPWMrasEFg" + ] + }, + "type": { + "type": "string", + "enum": [ + "encrypted", + "plain", + "sensitive", + "system" + ], + "description": "The type of this cosmos doc instance, if blank, assume secret.", + "example": "encrypted" + }, + "target": { + "items": { + "type": "string", + "enum": [ + "development", + "preview", + "production" + ], + "example": "production", + "description": "environments this env variable targets" + }, + "type": "array", + "description": "environments this env variable targets", + "example": "production" + }, + "applyToAllCustomEnvironments": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "whether or not this env varible applies to custom environments" + }, + "customEnvironmentIds": { + "items": { + "type": "string" + }, + "type": "array", + "description": "The custom environment IDs that this Shared Env Var is scoped to." + }, + "decrypted": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "whether or not this env variable is decrypted" + }, + "comment": { + "type": "string", + "description": "A user provided comment that describes what this Shared Env Var is for." + }, + "lastEditedByDisplayName": { + "type": "string", + "description": "The last editor full name or username." + } + }, + "type": "object" + }, + "type": "array" + }, + "failed": { + "items": { + "properties": { + "error": { + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + }, + "key": { + "type": "string" + }, + "envVarId": { + "type": "string" + }, + "envVarKey": { + "type": "string" + }, + "action": { + "type": "string" + }, + "link": { + "type": "string" + }, + "value": { + "oneOf": [ + { + "type": "string" + }, + { + "items": { + "type": "string", + "enum": [ + "development", + "development", + "preview", + "preview", + "production" + ] + }, + "type": "array" + } + ] + }, + "gitBranch": { + "type": "string" + }, + "target": { + "oneOf": [ + { + "items": { + "type": "string", + "enum": [ + "development", + "development", + "preview", + "preview", + "production" + ] + }, + "type": "array" + }, + { + "type": "string", + "enum": [ + "development", + "development", + "preview", + "preview", + "production" + ] + } + ] + }, + "project": { + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" + } + }, + "required": [ + "error" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "created", + "failed" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "402": { + "description": "The account is missing a payment so payment method must be updated" + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "410": { + "description": "" + } + }, + "x-vercel-cli": { + "supportedSubcommands": true, + "supportedProduction": false + }, + "parameters": [ + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "evs" + ], + "anyOf": [ + { + "required": [ + "target" + ] + }, + { + "required": [ + "applyToAllCustomEnvironments" + ] + }, + { + "required": [ + "customEnvironmentIds" + ] + } + ], + "properties": { + "evs": { + "type": "array", + "maximum": 50, + "minimum": 1, + "items": { + "type": "object", + "required": [ + "key", + "value" + ], + "properties": { + "key": { + "description": "The name of the Shared Environment Variable", + "type": "string", + "example": "API_URL" + }, + "value": { + "description": "The value of the Shared Environment Variable", + "type": "string", + "example": "https://api.vercel.com" + }, + "comment": { + "type": "string", + "description": "A comment to add context on what this Shared Environment Variable is for", + "example": "database connection string for production", + "maxLength": 500 + } + } + } + }, + "type": { + "description": "The type of environment variable", + "type": "string", + "enum": [ + "encrypted", + "sensitive" + ], + "example": "encrypted" + }, + "target": { + "description": "The target environment of the Shared Environment Variable", + "type": "array", + "items": { + "enum": [ + "production", + "preview", + "development" + ] + }, + "example": [ + "production", + "preview" + ] + }, + "projectId": { + "description": "Associate a Shared Environment Variable to projects.", + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "prj_2WjyKQmM8ZnGcJsPWMrHRHrE", + "prj_2WjyKQmM8ZnGcJsPWMrHRCRV" + ], + "deprecated": true + } + } + } + } + } + } + }, + "get": { + "description": "Lists all Shared Environment Variables for a team, taking into account optional filters.", + "operationId": "listSharedEnvVariable", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Lists all Shared Environment Variables for a team", + "tags": [ + "environment" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "items": { + "properties": { + "securityIssues": { + "items": { + "type": "string", + "enum": [ + "flags-secret-needs-split", + "readable-secret" + ] + }, + "type": "array" + }, + "created": { + "type": "string", + "format": "date-time", + "description": "The date when the Shared Env Var was created.", + "example": "2021-02-10T13:11:49.180Z" + }, + "key": { + "type": "string", + "description": "The name of the Shared Env Var.", + "example": "my-api-key" + }, + "ownerId": { + "nullable": true, + "type": "string", + "description": "The unique identifier of the owner (team) the Shared Env Var was created for.", + "example": "team_LLHUOMOoDlqOp8wPE4kFo9pE" + }, + "id": { + "type": "string", + "description": "The unique identifier of the Shared Env Var.", + "example": "env_XCG7t7AIHuO2SBA8667zNUiM" + }, + "createdBy": { + "nullable": true, + "type": "string", + "description": "The unique identifier of the user who created the Shared Env Var.", + "example": "2qDDuGFTWXBLDNnqZfWPDp1A" + }, + "deletedBy": { + "nullable": true, + "type": "string", + "description": "The unique identifier of the user who deleted the Shared Env Var.", + "example": "2qDDuGFTWXBLDNnqZfWPDp1A" + }, + "updatedBy": { + "nullable": true, + "type": "string", + "description": "The unique identifier of the user who last updated the Shared Env Var.", + "example": "2qDDuGFTWXBLDNnqZfWPDp1A" + }, + "createdAt": { + "type": "number", + "description": "Timestamp for when the Shared Env Var was created.", + "example": 1609492210000 + }, + "deletedAt": { + "type": "number", + "description": "Timestamp for when the Shared Env Var was (soft) deleted.", + "example": 1609492210000 + }, + "updatedAt": { + "type": "number", + "description": "Timestamp for when the Shared Env Var was last updated.", + "example": 1609492210000 + }, + "value": { + "type": "string", + "description": "The value of the Shared Env Var." + }, + "projectId": { + "items": { + "type": "string" + }, + "type": "array", + "description": "The unique identifiers of the projects which the Shared Env Var is linked to.", + "example": [ + "prj_2WjyKQmM8ZnGcJsPWMrHRHrE", + "prj_2WjyKQmM8ZnGcJsPWMrasEFg" + ] + }, + "type": { + "type": "string", + "enum": [ + "encrypted", + "plain", + "sensitive", + "system" + ], + "description": "The type of this cosmos doc instance, if blank, assume secret.", + "example": "encrypted" + }, + "target": { + "items": { + "type": "string", + "enum": [ + "development", + "preview", + "production" + ], + "example": "production", + "description": "environments this env variable targets" + }, + "type": "array", + "description": "environments this env variable targets", + "example": "production" + }, + "applyToAllCustomEnvironments": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "whether or not this env varible applies to custom environments" + }, + "customEnvironmentIds": { + "items": { + "type": "string" + }, + "type": "array", + "description": "The custom environment IDs that this Shared Env Var is scoped to." + }, + "decrypted": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "whether or not this env variable is decrypted" + }, + "comment": { + "type": "string", + "description": "A user provided comment that describes what this Shared Env Var is for." + }, + "lastEditedByDisplayName": { + "type": "string", + "description": "The last editor full name or username." + } + }, + "required": [ + "created", + "decrypted", + "id", + "key", + "securityIssues" + ], + "type": "object" + }, + "type": "array" + }, + "pagination": { + "$ref": "#/components/schemas/Pagination" + } + }, + "required": [ + "data", + "pagination" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + } + }, + "x-vercel-cli": { + "supportedSubcommands": true, + "supportedProduction": false, + "aliases": [ + "ls", + "list" + ] + }, + "parameters": [ + { + "name": "search", + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "projectId", + "description": "Filter SharedEnvVariables that belong to a project", + "in": "query", + "schema": { + "description": "Filter SharedEnvVariables that belong to a project", + "type": "string", + "example": "prj_2WjyKQmM8ZnGcJsPWMrHRHrE" + } + }, + { + "name": "ids", + "description": "Filter SharedEnvVariables based on comma separated ids", + "in": "query", + "schema": { + "description": "Filter SharedEnvVariables based on comma separated ids", + "type": "string", + "example": "env_2WjyKQmM8ZnGcJsPWMrHRHrE,env_2WjyKQmM8ZnGcJsPWMrHRCRV" + } + }, + { + "name": "exclude_ids", + "description": "Filter SharedEnvVariables based on comma separated ids", + "in": "query", + "schema": { + "description": "Filter SharedEnvVariables based on comma separated ids", + "type": "string", + "example": "env_2WjyKQmM8ZnGcJsPWMrHRHrE,env_2WjyKQmM8ZnGcJsPWMrHRCRV" + } + }, + { + "name": "exclude-ids", + "description": "Filter SharedEnvVariables based on comma separated ids", + "in": "query", + "schema": { + "description": "Filter SharedEnvVariables based on comma separated ids", + "type": "string", + "example": "env_2WjyKQmM8ZnGcJsPWMrHRHrE,env_2WjyKQmM8ZnGcJsPWMrHRCRV" + } + }, + { + "name": "exclude_projectId", + "description": "Filter SharedEnvVariables that belong to a project", + "in": "query", + "schema": { + "description": "Filter SharedEnvVariables that belong to a project", + "type": "string", + "example": "prj_2WjyKQmM8ZnGcJsPWMrHRHrE" + } + }, + { + "name": "exclude-projectId", + "description": "Filter SharedEnvVariables that belong to a project", + "in": "query", + "schema": { + "description": "Filter SharedEnvVariables that belong to a project", + "type": "string", + "example": "prj_2WjyKQmM8ZnGcJsPWMrHRHrE" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + }, + "patch": { + "description": "Updates a given Shared Environment Variable for a Team.", + "operationId": "updateSharedEnvVariable", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Updates one or more shared environment variables", + "tags": [ + "environment" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "updated": { + "items": { + "properties": { + "created": { + "type": "string", + "format": "date-time", + "description": "The date when the Shared Env Var was created.", + "example": "2021-02-10T13:11:49.180Z" + }, + "key": { + "type": "string", + "description": "The name of the Shared Env Var.", + "example": "my-api-key" + }, + "ownerId": { + "nullable": true, + "type": "string", + "description": "The unique identifier of the owner (team) the Shared Env Var was created for.", + "example": "team_LLHUOMOoDlqOp8wPE4kFo9pE" + }, + "id": { + "type": "string", + "description": "The unique identifier of the Shared Env Var.", + "example": "env_XCG7t7AIHuO2SBA8667zNUiM" + }, + "createdBy": { + "nullable": true, + "type": "string", + "description": "The unique identifier of the user who created the Shared Env Var.", + "example": "2qDDuGFTWXBLDNnqZfWPDp1A" + }, + "deletedBy": { + "nullable": true, + "type": "string", + "description": "The unique identifier of the user who deleted the Shared Env Var.", + "example": "2qDDuGFTWXBLDNnqZfWPDp1A" + }, + "updatedBy": { + "nullable": true, + "type": "string", + "description": "The unique identifier of the user who last updated the Shared Env Var.", + "example": "2qDDuGFTWXBLDNnqZfWPDp1A" + }, + "createdAt": { + "type": "number", + "description": "Timestamp for when the Shared Env Var was created.", + "example": 1609492210000 + }, + "deletedAt": { + "type": "number", + "description": "Timestamp for when the Shared Env Var was (soft) deleted.", + "example": 1609492210000 + }, + "updatedAt": { + "type": "number", + "description": "Timestamp for when the Shared Env Var was last updated.", + "example": 1609492210000 + }, + "value": { + "type": "string", + "description": "The value of the Shared Env Var." + }, + "projectId": { + "items": { + "type": "string" + }, + "type": "array", + "description": "The unique identifiers of the projects which the Shared Env Var is linked to.", + "example": [ + "prj_2WjyKQmM8ZnGcJsPWMrHRHrE", + "prj_2WjyKQmM8ZnGcJsPWMrasEFg" + ] + }, + "type": { + "type": "string", + "enum": [ + "encrypted", + "plain", + "sensitive", + "system" + ], + "description": "The type of this cosmos doc instance, if blank, assume secret.", + "example": "encrypted" + }, + "target": { + "items": { + "type": "string", + "enum": [ + "development", + "preview", + "production" + ], + "example": "production", + "description": "environments this env variable targets" + }, + "type": "array", + "description": "environments this env variable targets", + "example": "production" + }, + "applyToAllCustomEnvironments": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "whether or not this env varible applies to custom environments" + }, + "customEnvironmentIds": { + "items": { + "type": "string" + }, + "type": "array", + "description": "The custom environment IDs that this Shared Env Var is scoped to." + }, + "decrypted": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "whether or not this env variable is decrypted" + }, + "comment": { + "type": "string", + "description": "A user provided comment that describes what this Shared Env Var is for." + }, + "lastEditedByDisplayName": { + "type": "string", + "description": "The last editor full name or username." + } + }, + "type": "object" + }, + "type": "array" + }, + "failed": { + "items": { + "properties": { + "error": { + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + }, + "key": { + "type": "string" + }, + "envVarId": { + "type": "string" + }, + "envVarKey": { + "type": "string" + }, + "action": { + "type": "string" + }, + "link": { + "type": "string" + }, + "value": { + "oneOf": [ + { + "type": "string" + }, + { + "items": { + "type": "string", + "enum": [ + "development", + "development", + "preview", + "preview", + "production" + ] + }, + "type": "array" + } + ] + }, + "gitBranch": { + "type": "string" + }, + "target": { + "oneOf": [ + { + "items": { + "type": "string", + "enum": [ + "development", + "development", + "preview", + "preview", + "production" + ] + }, + "type": "array" + }, + { + "type": "string", + "enum": [ + "development", + "development", + "preview", + "preview", + "production" + ] + } + ] + }, + "project": { + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" + } + }, + "required": [ + "error" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "failed", + "updated" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "402": { + "description": "The account is missing a payment so payment method must be updated" + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "410": { + "description": "" + } + }, + "x-vercel-cli": { + "supportedSubcommands": true, + "supportedProduction": false + }, + "parameters": [ + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "additionalProperties": false, + "type": "object", + "required": [ + "updates" + ], + "properties": { + "updates": { + "description": "An object where each key is an environment variable ID (not the key name) and the value is the update to apply", + "type": "object", + "example": { + "env_2WjyKQmM8ZnGcJsPWMrHRHrE": { + "key": "API_URL", + "value": "https://api.vercel.com", + "target": [ + "production", + "preview" + ], + "projectIdUpdates": { + "link": [ + "prj_2WjyKQmM8ZnGcJsPWMrHRHrE" + ] + } + } + }, + "additionalProperties": { + "type": "object", + "additionalProperties": false, + "properties": { + "key": { + "description": "The name of the Shared Environment Variable", + "type": "string", + "example": "API_URL" + }, + "value": { + "description": "The value of the Shared Environment Variable", + "type": "string", + "example": "https://api.vercel.com" + }, + "target": { + "description": "The target environment of the Shared Environment Variable", + "type": "array", + "items": { + "enum": [ + "production", + "preview", + "development" + ] + }, + "example": [ + "production", + "preview" + ] + }, + "projectId": { + "description": "Associate a Shared Environment Variable to projects.", + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "prj_2WjyKQmM8ZnGcJsPWMrHRHrE", + "prj_2WjyKQmM8ZnGcJsPWMrHRCRV" + ] + }, + "projectIdUpdates": { + "description": "Incrementally update project linking without specifying the full list", + "type": "object", + "additionalProperties": false, + "properties": { + "link": { + "description": "Project IDs to add to this environment variable", + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "prj_2WjyKQmM8ZnGcJsPWMrHRHrE" + ] + }, + "unlink": { + "description": "Project IDs to remove from this environment variable", + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "prj_2WjyKQmM8ZnGcJsPWMrHRCRV" + ] + } + } + }, + "type": { + "description": "The new type of the Shared Environment Variable", + "type": "string", + "enum": [ + "encrypted", + "sensitive" + ], + "example": "encrypted" + }, + "comment": { + "type": "string", + "description": "A comment to add context on what this Shared Environment Variable is for", + "example": "database connection string for production", + "maxLength": 500 + } + } + } + } + } + } + } + } + } + }, + "delete": { + "description": "Deletes one or many Shared Environment Variables for a given team.", + "operationId": "deleteSharedEnvVariable", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Delete one or more Env Var", + "tags": [ + "environment" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "deleted": { + "items": { + "type": "string" + }, + "type": "array" + }, + "failed": { + "items": { + "properties": { + "error": { + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + }, + "key": { + "type": "string" + }, + "envVarId": { + "type": "string" + }, + "envVarKey": { + "type": "string" + }, + "action": { + "type": "string" + }, + "link": { + "type": "string" + }, + "value": { + "oneOf": [ + { + "type": "string" + }, + { + "items": { + "type": "string", + "enum": [ + "development", + "development", + "preview", + "preview", + "production" + ] + }, + "type": "array" + } + ] + }, + "gitBranch": { + "type": "string" + }, + "target": { + "oneOf": [ + { + "items": { + "type": "string", + "enum": [ + "development", + "development", + "preview", + "preview", + "production" + ] + }, + "type": "array" + }, + { + "type": "string", + "enum": [ + "development", + "development", + "preview", + "preview", + "production" + ] + } + ] + }, + "project": { + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" + } + }, + "required": [ + "error" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "deleted", + "failed" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "402": { + "description": "The account is missing a payment so payment method must be updated" + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "410": { + "description": "" + } + }, + "x-vercel-cli": { + "supportedSubcommands": true, + "supportedProduction": false + }, + "parameters": [ + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "ids" + ], + "properties": { + "ids": { + "description": "IDs of the Shared Environment Variables to delete", + "minimum": 1, + "maximum": 50, + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "env_abc123", + "env_abc124" + ] + } + } + } + } + } + } + } + }, + "/v1/env/{id}": { + "get": { + "description": "Retrieve the decrypted value of a Shared Environment Variable by id.", + "operationId": "getSharedEnvVar", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Retrieve the decrypted value of a Shared Environment Variable by id.", + "tags": [ + "environment" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "created": { + "type": "string", + "format": "date-time", + "description": "The date when the Shared Env Var was created.", + "example": "2021-02-10T13:11:49.180Z" + }, + "key": { + "type": "string", + "description": "The name of the Shared Env Var.", + "example": "my-api-key" + }, + "ownerId": { + "nullable": true, + "type": "string", + "description": "The unique identifier of the owner (team) the Shared Env Var was created for.", + "example": "team_LLHUOMOoDlqOp8wPE4kFo9pE" + }, + "id": { + "type": "string", + "description": "The unique identifier of the Shared Env Var.", + "example": "env_XCG7t7AIHuO2SBA8667zNUiM" + }, + "createdBy": { + "nullable": true, + "type": "string", + "description": "The unique identifier of the user who created the Shared Env Var.", + "example": "2qDDuGFTWXBLDNnqZfWPDp1A" + }, + "deletedBy": { + "nullable": true, + "type": "string", + "description": "The unique identifier of the user who deleted the Shared Env Var.", + "example": "2qDDuGFTWXBLDNnqZfWPDp1A" + }, + "updatedBy": { + "nullable": true, + "type": "string", + "description": "The unique identifier of the user who last updated the Shared Env Var.", + "example": "2qDDuGFTWXBLDNnqZfWPDp1A" + }, + "createdAt": { + "type": "number", + "description": "Timestamp for when the Shared Env Var was created.", + "example": 1609492210000 + }, + "deletedAt": { + "type": "number", + "description": "Timestamp for when the Shared Env Var was (soft) deleted.", + "example": 1609492210000 + }, + "updatedAt": { + "type": "number", + "description": "Timestamp for when the Shared Env Var was last updated.", + "example": 1609492210000 + }, + "value": { + "type": "string", + "description": "The value of the Shared Env Var." + }, + "projectId": { + "items": { + "type": "string" + }, + "type": "array", + "description": "The unique identifiers of the projects which the Shared Env Var is linked to.", + "example": [ + "prj_2WjyKQmM8ZnGcJsPWMrHRHrE", + "prj_2WjyKQmM8ZnGcJsPWMrasEFg" + ] + }, + "type": { + "type": "string", + "enum": [ + "encrypted", + "plain", + "sensitive", + "system" + ], + "description": "The type of this cosmos doc instance, if blank, assume secret.", + "example": "encrypted" + }, + "target": { + "items": { + "type": "string", + "enum": [ + "development", + "preview", + "production" + ], + "example": "production", + "description": "environments this env variable targets" + }, + "type": "array", + "description": "environments this env variable targets", + "example": "production" + }, + "applyToAllCustomEnvironments": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "whether or not this env varible applies to custom environments" + }, + "customEnvironmentIds": { + "items": { + "type": "string" + }, + "type": "array", + "description": "The custom environment IDs that this Shared Env Var is scoped to." + }, + "decrypted": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "whether or not this env variable is decrypted" + }, + "comment": { + "type": "string", + "description": "A user provided comment that describes what this Shared Env Var is for." + }, + "lastEditedByDisplayName": { + "type": "string", + "description": "The last editor full name or username." + } + }, + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "410": { + "description": "" + } + }, + "x-vercel-cli": { + "supportedSubcommands": true, + "supportedProduction": false + }, + "parameters": [ + { + "name": "id", + "description": "The unique ID for the Shared Environment Variable to get the decrypted value.", + "in": "path", + "required": true, + "schema": { + "description": "The unique ID for the Shared Environment Variable to get the decrypted value.", + "type": "string" + }, + "x-vercel-cli": { + "kind": "argument" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + } + }, + "/v1/env/{id}/unlink/{projectId}": { + "patch": { + "description": "Disconnects a shared environment variable for a given project", + "operationId": "unlinkSharedEnvVariable", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Disconnects a shared environment variable for a given project", + "tags": [ + "environment" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "id": { + "type": "string" + } + }, + "required": [ + "id" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "id", + "description": "The unique ID for the Shared Environment Variable to unlink from the project.", + "in": "path", + "required": true, + "schema": { + "description": "The unique ID for the Shared Environment Variable to unlink from the project.", + "type": "string" + } + }, + { + "name": "projectId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + } + }, + "/v3/events": { + "get": { + "description": "Retrieves a list of \"events\" generated by the User on Vercel. Events are generated when the User performs a particular action, such as logging in, creating a deployment, and joining a Team (just to name a few). When the `teamId` parameter is supplied, then the events that are returned will be in relation to the Team that was specified.", + "operationId": "listUserEvents", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "List User Events", + "tags": [ + "user" + ], + "responses": { + "200": { + "description": "Successful response.", + "content": { + "application/json": { + "schema": { + "properties": { + "events": { + "items": { + "$ref": "#/components/schemas/UserEvent" + }, + "type": "array", + "description": "Array of events generated by the User." + } + }, + "required": [ + "events" + ], + "type": "object", + "description": "Successful response." + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "410": { + "description": "" + } + }, + "x-vercel-cli": { + "supportedSubcommands": true, + "supportedProduction": false, + "aliases": [ + "events" + ] + }, + "parameters": [ + { + "name": "limit", + "description": "Maximum number of items which may be returned.", + "in": "query", + "schema": { + "description": "Maximum number of items which may be returned.", + "example": 20, + "type": "number" + } + }, + { + "name": "since", + "description": "Timestamp to only include items created since then.", + "in": "query", + "schema": { + "description": "Timestamp to only include items created since then.", + "example": "2019-12-08T10:00:38.976Z", + "type": "string" + } + }, + { + "name": "until", + "description": "Timestamp to only include items created until then.", + "in": "query", + "schema": { + "description": "Timestamp to only include items created until then.", + "example": "2019-12-09T23:00:38.976Z", + "type": "string" + } + }, + { + "name": "types", + "description": "Comma-delimited list of event \"types\" to filter the results by.", + "in": "query", + "schema": { + "description": "Comma-delimited list of event \"types\" to filter the results by.", + "example": "login,team-member-join,domain-buy", + "type": "string" + } + }, + { + "name": "userId", + "description": "Deprecated. Use `principalId` instead. If `principalId` and `userId` both exist, `principalId` will be used.", + "in": "query", + "schema": { + "description": "Deprecated. Use `principalId` instead. If `principalId` and `userId` both exist, `principalId` will be used.", + "example": "aeIInYVk59zbFF2SxfyxxmuO", + "type": "string" + } + }, + { + "name": "principalId", + "description": "When retrieving events for a Team, the `principalId` parameter may be specified to filter events generated by a specific principal.", + "in": "query", + "schema": { + "description": "When retrieving events for a Team, the `principalId` parameter may be specified to filter events generated by a specific principal.", + "example": "aeIInYVk59zbFF2SxfyxxmuO", + "type": "string" + } + }, + { + "name": "projectIds", + "description": "Comma-delimited list of project IDs to filter the results by.", + "in": "query", + "schema": { + "description": "Comma-delimited list of project IDs to filter the results by.", + "example": "aeIInYVk59zbFF2SxfyxxmuO", + "type": "string" + } + }, + { + "name": "entityId", + "description": "Filters events to those associated with a specific entity (matched against `payload.id`). For example, a connector ID.", + "in": "query", + "schema": { + "description": "Filters events to those associated with a specific entity (matched against `payload.id`). For example, a connector ID.", + "example": "scl_123", + "type": "string" + } + }, + { + "name": "withPayload", + "description": "When set to `true`, the response will include the `payload` field for each event.", + "in": "query", + "schema": { + "description": "When set to `true`, the response will include the `payload` field for each event.", + "example": "true", + "type": "string" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + } + }, + "/v1/events/types": { + "get": { + "description": "Returns the list of user-facing event types with descriptions.", + "operationId": "listEventTypes", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "List Event Types", + "tags": [ + "user" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ListEventTypesResponse" + } + } + } + }, + "400": { + "description": "" + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + } + }, + "/v2/projects/{projectIdOrName}/feature-flags/flags": { + "get": { + "description": "Retrieve feature flags for a project. Returns an opaque cursor for pagination.", + "operationId": "listFlagsV2", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "List flags", + "tags": [ + "feature-flags" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "pagination": { + "properties": { + "next": { + "nullable": true, + "type": "string" + } + }, + "required": [ + "next" + ], + "type": "object" + }, + "data": { + "items": { + "oneOf": [ + { + "$ref": "#/components/schemas/Flag" + }, + { + "$ref": "#/components/schemas/MarketplaceFlag" + } + ] + }, + "type": "array" + } + }, + "required": [ + "data", + "pagination" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "402": { + "description": "The account is missing a payment so payment method must be updated" + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "projectIdOrName", + "description": "The project id or name", + "in": "path", + "required": true, + "schema": { + "description": "The project id or name", + "type": "string" + } + }, + { + "name": "state", + "description": "The state of the flags to retrieve. Defaults to `active`.", + "in": "query", + "required": false, + "schema": { + "type": "string", + "enum": [ + "active", + "archived" + ], + "description": "The state of the flags to retrieve. Defaults to `active`." + } + }, + { + "name": "limit", + "description": "Maximum number of flags to return.", + "in": "query", + "required": false, + "schema": { + "description": "Maximum number of flags to return.", + "type": "integer", + "minimum": 1, + "maximum": 100, + "default": 25 + } + }, + { + "name": "cursor", + "description": "Pagination cursor to continue from.", + "in": "query", + "required": false, + "schema": { + "description": "Pagination cursor to continue from.", + "type": "string" + } + }, + { + "name": "search", + "description": "Search flags by their slug or description. Case-insensitive.", + "in": "query", + "required": false, + "schema": { + "description": "Search flags by their slug or description. Case-insensitive.", + "type": "string", + "maxLength": 256 + } + }, + { + "name": "tags", + "description": "Filter flags by tag. Repeat the parameter for multiple tags (all must match).", + "in": "query", + "required": false, + "schema": { + "description": "Filter flags by tag. Repeat the parameter for multiple tags (all must match).", + "type": "array", + "items": { + "type": "string" + } + } + }, + { + "name": "createdBy", + "description": "Filter flags by the id of the entity that created them (a user or team id).", + "in": "query", + "required": false, + "schema": { + "description": "Filter flags by the id of the entity that created them (a user or team id).", + "type": "string", + "maxLength": 256 + } + }, + { + "name": "maintainerIds", + "description": "Filter flags by maintainer user id. Repeat the parameter for multiple maintainers (any may match).", + "in": "query", + "required": false, + "schema": { + "description": "Filter flags by maintainer user id. Repeat the parameter for multiple maintainers (any may match).", + "type": "array", + "items": { + "type": "string", + "maxLength": 24 + }, + "maxItems": 25 + } + }, + { + "name": "includeMarketplaceFlags", + "description": "Whether to include Marketplace experimentation items in the paginated response. Defaults to false.", + "in": "query", + "required": false, + "schema": { + "description": "Whether to include Marketplace experimentation items in the paginated response. Defaults to false.", + "type": "boolean" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + } + }, + "/v1/projects/{projectIdOrName}/feature-flags/flags": { + "get": { + "description": "Retrieve feature flags for a project. The list can be filtered by state and supports pagination.", + "operationId": "listFlags", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "List flags", + "tags": [ + "feature-flags" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "items": { + "$ref": "#/components/schemas/Flag" + }, + "type": "array" + }, + "pagination": { + "properties": { + "next": { + "nullable": true, + "type": "string" + } + }, + "required": [ + "next" + ], + "type": "object" + } + }, + "required": [ + "data", + "pagination" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "402": { + "description": "The account is missing a payment so payment method must be updated" + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "projectIdOrName", + "description": "The project id or name", + "in": "path", + "required": true, + "schema": { + "description": "The project id or name", + "type": "string" + } + }, + { + "name": "state", + "description": "The state of the flags to retrieve. Defaults to `active`.", + "in": "query", + "required": false, + "schema": { + "type": "string", + "enum": [ + "active", + "archived" + ], + "description": "The state of the flags to retrieve. Defaults to `active`." + } + }, + { + "name": "withMetadata", + "description": "Deprecated. Whether to include creator metadata in each flag in the response. Resolve creator identity client-side (e.g. via the team members endpoint) instead; this parameter will be removed in a future release. Use `GET /v1/projects/:id/feature-flags/flags/:flagIdOrSlug?withMetadata=true` for single-flag lookups that need creator metadata.", + "in": "query", + "required": false, + "schema": { + "description": "Deprecated. Whether to include creator metadata in each flag in the response. Resolve creator identity client-side (e.g. via the team members endpoint) instead; this parameter will be removed in a future release. Use `GET /v1/projects/:id/feature-flags/flags/:flagIdOrSlug?withMetadata=true` for single-flag lookups that need creator metadata.", + "type": "boolean", + "deprecated": true + } + }, + { + "name": "limit", + "description": "Maximum number of flags to return. When not set, all flags are returned.", + "in": "query", + "required": false, + "schema": { + "description": "Maximum number of flags to return. When not set, all flags are returned.", + "type": "integer", + "minimum": 1, + "maximum": 100 + } + }, + { + "name": "cursor", + "description": "Pagination cursor to continue from.", + "in": "query", + "required": false, + "schema": { + "description": "Pagination cursor to continue from.", + "type": "string" + } + }, + { + "name": "search", + "description": "Search flags by their slug or description. Case-insensitive.", + "in": "query", + "required": false, + "schema": { + "description": "Search flags by their slug or description. Case-insensitive.", + "type": "string", + "maxLength": 256 + } + }, + { + "name": "tags", + "description": "Filter flags by tag. Repeat the parameter for multiple tags (all must match).", + "in": "query", + "required": false, + "schema": { + "description": "Filter flags by tag. Repeat the parameter for multiple tags (all must match).", + "type": "array", + "items": { + "type": "string" + } + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + }, + "put": { + "description": "Create a new feature flag for a project. The flag must have a unique slug within the project and specify its kind (boolean, string, number, or json).", + "operationId": "createFlag", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Create a flag", + "tags": [ + "feature-flags" + ], + "responses": { + "201": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "description": { + "type": "string" + }, + "variants": { + "items": { + "type": "object" + }, + "type": "array" + }, + "id": { + "type": "string" + }, + "environments": { + "additionalProperties": { + "properties": { + "reuse": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "environment": { + "type": "string" + } + }, + "required": [ + "active", + "environment" + ], + "type": "object" + }, + "targets": { + "additionalProperties": { + "additionalProperties": { + "additionalProperties": { + "items": { + "properties": { + "note": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "required": [ + "value" + ], + "type": "object" + }, + "type": "array" + }, + "type": "object" + }, + "type": "object" + }, + "type": "object" + }, + "revision": { + "type": "number" + }, + "pausedOutcome": { + "properties": { + "type": { + "type": "string", + "enum": [ + "variant" + ] + }, + "variantId": { + "type": "string" + } + }, + "required": [ + "type", + "variantId" + ], + "type": "object" + }, + "fallthrough": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "variant" + ] + }, + "variantId": { + "type": "string" + } + }, + "required": [ + "type", + "variantId" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "split" + ] + }, + "base": { + "properties": { + "type": { + "type": "string", + "enum": [ + "entity" + ] + }, + "kind": { + "type": "string" + }, + "attribute": { + "type": "string" + } + }, + "required": [ + "attribute", + "kind", + "type" + ], + "type": "object" + }, + "weights": { + "additionalProperties": { + "type": "number" + }, + "type": "object" + }, + "defaultVariantId": { + "type": "string" + } + }, + "required": [ + "base", + "defaultVariantId", + "type", + "weights" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "rollout" + ] + }, + "base": { + "properties": { + "type": { + "type": "string", + "enum": [ + "entity" + ] + }, + "kind": { + "type": "string" + }, + "attribute": { + "type": "string" + } + }, + "required": [ + "attribute", + "kind", + "type" + ], + "type": "object" + }, + "defaultVariantId": { + "type": "string" + }, + "startTimestamp": { + "type": "number" + }, + "rollFromVariantId": { + "type": "string" + }, + "rollToVariantId": { + "type": "string" + }, + "slots": { + "items": { + "properties": { + "promille": { + "type": "number" + }, + "durationMs": { + "type": "number" + } + }, + "required": [ + "durationMs", + "promille" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "base", + "defaultVariantId", + "rollFromVariantId", + "rollToVariantId", + "slots", + "startTimestamp", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "experiment" + ] + } + }, + "required": [ + "type" + ], + "type": "object" + } + ] + }, + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "rules": { + "items": { + "properties": { + "id": { + "type": "string" + }, + "outcome": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "variant" + ] + }, + "variantId": { + "type": "string" + } + }, + "required": [ + "type", + "variantId" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "split" + ] + }, + "base": { + "properties": { + "type": { + "type": "string", + "enum": [ + "entity" + ] + }, + "kind": { + "type": "string" + }, + "attribute": { + "type": "string" + } + }, + "required": [ + "attribute", + "kind", + "type" + ], + "type": "object" + }, + "weights": { + "additionalProperties": { + "type": "number" + }, + "type": "object" + }, + "defaultVariantId": { + "type": "string" + } + }, + "required": [ + "base", + "defaultVariantId", + "type", + "weights" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "rollout" + ] + }, + "base": { + "properties": { + "type": { + "type": "string", + "enum": [ + "entity" + ] + }, + "kind": { + "type": "string" + }, + "attribute": { + "type": "string" + } + }, + "required": [ + "attribute", + "kind", + "type" + ], + "type": "object" + }, + "defaultVariantId": { + "type": "string" + }, + "startTimestamp": { + "type": "number" + }, + "rollFromVariantId": { + "type": "string" + }, + "rollToVariantId": { + "type": "string" + }, + "slots": { + "items": { + "properties": { + "promille": { + "type": "number" + }, + "durationMs": { + "type": "number" + } + }, + "required": [ + "durationMs", + "promille" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "base", + "defaultVariantId", + "rollFromVariantId", + "rollToVariantId", + "slots", + "startTimestamp", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "experiment" + ] + } + }, + "required": [ + "type" + ], + "type": "object" + } + ] + }, + "conditions": { + "items": { + "properties": { + "rhs": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "list", + "list/inline" + ] + }, + "items": { + "items": { + "oneOf": [ + { + "properties": { + "label": { + "type": "string" + }, + "note": { + "type": "string" + }, + "value": { + "type": "number" + } + }, + "required": [ + "value" + ], + "type": "object" + }, + { + "properties": { + "label": { + "type": "string" + }, + "note": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "required": [ + "value" + ], + "type": "object" + } + ] + }, + "type": "array" + } + }, + "required": [ + "items", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "regex" + ] + }, + "pattern": { + "type": "string" + }, + "flags": { + "type": "string" + } + }, + "required": [ + "flags", + "pattern", + "type" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + } + ] + }, + "cmpOptions": { + "properties": { + "ignoreCase": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "type": "object" + }, + "lhs": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "segment" + ] + } + }, + "required": [ + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "entity" + ] + }, + "kind": { + "type": "string" + }, + "attribute": { + "type": "string" + } + }, + "required": [ + "attribute", + "kind", + "type" + ], + "type": "object" + } + ] + }, + "cmp": { + "type": "string", + "enum": [ + "!contains", + "!endsWith", + "!eq", + "!ex", + "!oneOf", + "!regex", + "!startsWith", + "after", + "before", + "contains", + "containsAllOf", + "containsAnyOf", + "containsNoneOf", + "endsWith", + "eq", + "ex", + "gt", + "gte", + "lt", + "lte", + "oneOf", + "regex", + "startsWith" + ] + } + }, + "required": [ + "cmp", + "lhs" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "conditions", + "id", + "outcome" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "active", + "fallthrough", + "pausedOutcome", + "rules" + ], + "type": "object" + }, + "type": "object" + }, + "kind": { + "type": "string", + "enum": [ + "boolean", + "json", + "number", + "string" + ] + }, + "revision": { + "type": "number" + }, + "seed": { + "type": "number" + }, + "state": { + "type": "string", + "enum": [ + "active", + "archived" + ] + }, + "maintainerIds": { + "items": { + "type": "string" + }, + "type": "array" + }, + "permanent": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "tags": { + "items": { + "type": "string" + }, + "type": "array" + }, + "slug": { + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "updatedAt": { + "type": "number" + }, + "updatedBy": { + "type": "string" + }, + "createdBy": { + "type": "string" + }, + "ownerId": { + "type": "string" + }, + "projectId": { + "type": "string" + }, + "typeName": { + "type": "string", + "enum": [ + "flag" + ] + } + }, + "required": [ + "createdAt", + "createdBy", + "environments", + "id", + "kind", + "ownerId", + "projectId", + "revision", + "seed", + "slug", + "state", + "typeName", + "updatedAt", + "variants" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid.\nOne of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "402": { + "description": "The account is missing a payment so payment method must be updated" + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "409": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "projectIdOrName", + "description": "The project id or name", + "in": "path", + "required": true, + "schema": { + "description": "The project id or name", + "type": "string" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "additionalProperties": false, + "properties": { + "slug": { + "description": "A unique (per project) key for the flag, composed of letters, numbers, dashes, and underscores", + "type": "string", + "pattern": "^[a-zA-Z0-9_-]{1,512}$" + }, + "kind": { + "description": "The kind of flag", + "enum": [ + "boolean", + "string", + "number", + "json" + ] + }, + "variants": { + "type": "array", + "description": "The variants of the flag", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "id": { + "description": "The id of the variant", + "type": "string" + }, + "label": { + "description": "A label for the variant", + "type": "string" + }, + "description": { + "description": "A description of the variant", + "type": "string" + }, + "value": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "object" + }, + { + "type": "array", + "items": {} + }, + { + "type": "string" + } + ] + } + }, + "required": [ + "id", + "value" + ] + } + }, + "environments": { + "type": "object", + "description": "The configuration for the flag in different environments", + "additionalProperties": { + "type": "object", + "additionalProperties": false, + "properties": { + "active": { + "type": "boolean" + }, + "reuse": { + "type": "object", + "description": "Allows linking this environment to another environment so this flag will be evaluated with the other flag's configuration", + "additionalProperties": false, + "required": [ + "active", + "environment" + ], + "properties": { + "active": { + "type": "boolean", + "description": "Whether the reuse is active or not" + }, + "environment": { + "type": "string", + "description": "The environment to link to" + } + } + }, + "targets": { + "type": "object", + "description": "Allows assigning targets to variants while bypassing the flag's rules", + "additionalProperties": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "note": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "required": [ + "value" + ] + }, + "maxItems": 10000 + } + } + } + }, + "pausedOutcome": { + "type": "object", + "additionalProperties": false, + "properties": { + "type": {}, + "variantId": { + "type": "string" + } + }, + "required": [ + "type", + "variantId" + ] + }, + "rules": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "id": { + "type": "string" + }, + "conditions": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "lhs": { + "anyOf": [ + { + "type": "object", + "additionalProperties": false, + "properties": { + "type": {} + }, + "required": [ + "type" + ] + }, + { + "type": "object", + "additionalProperties": false, + "properties": { + "type": {}, + "kind": { + "type": "string" + }, + "attribute": { + "type": "string" + } + }, + "required": [ + "type", + "kind", + "attribute" + ] + } + ] + }, + "cmp": { + "type": "string", + "enum": [ + "eq", + "!eq", + "oneOf", + "!oneOf", + "containsAllOf", + "containsAnyOf", + "containsNoneOf", + "startsWith", + "!startsWith", + "endsWith", + "!endsWith", + "contains", + "!contains", + "ex", + "!ex", + "gt", + "gte", + "lt", + "lte", + "regex", + "!regex", + "before", + "after" + ] + }, + "rhs": { + "anyOf": [ + { + "type": "object", + "additionalProperties": false, + "properties": { + "type": { + "type": "string", + "enum": [ + "list/inline", + "list" + ] + }, + "items": { + "type": "array", + "items": { + "anyOf": [ + { + "type": "object", + "additionalProperties": false, + "properties": { + "label": { + "type": "string" + }, + "note": { + "type": "string" + }, + "value": { + "type": "number" + } + }, + "required": [ + "value" + ] + }, + { + "type": "object", + "additionalProperties": false, + "properties": { + "label": { + "type": "string" + }, + "note": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "required": [ + "value" + ] + } + ] + }, + "maxItems": 10000 + } + }, + "required": [ + "type", + "items" + ] + }, + { + "type": "object", + "additionalProperties": false, + "properties": { + "type": {}, + "pattern": { + "type": "string" + }, + "flags": { + "type": "string" + } + }, + "required": [ + "type", + "pattern", + "flags" + ] + }, + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + } + ] + }, + "cmpOptions": { + "type": "object", + "additionalProperties": false, + "properties": { + "ignoreCase": { + "type": "boolean" + } + } + } + }, + "required": [ + "lhs", + "cmp" + ] + } + }, + "outcome": { + "anyOf": [ + { + "type": "object", + "additionalProperties": false, + "properties": { + "type": {}, + "variantId": { + "type": "string" + } + }, + "required": [ + "type", + "variantId" + ] + }, + { + "type": "object", + "additionalProperties": false, + "properties": { + "type": {}, + "base": { + "type": "object", + "additionalProperties": false, + "properties": { + "type": {}, + "kind": { + "type": "string" + }, + "attribute": { + "type": "string" + } + }, + "required": [ + "type", + "kind", + "attribute" + ] + }, + "weights": { + "type": "object", + "additionalProperties": { + "type": "number" + }, + "description": "The distribution for each variant" + }, + "defaultVariantId": { + "type": "string", + "description": "This variant will be used when the base attribute does not exist" + } + }, + "required": [ + "type", + "base", + "weights", + "defaultVariantId" + ] + }, + { + "type": "object", + "additionalProperties": false, + "properties": { + "type": {}, + "base": { + "type": "object", + "additionalProperties": false, + "properties": { + "type": {}, + "kind": { + "type": "string" + }, + "attribute": { + "type": "string" + } + }, + "required": [ + "type", + "kind", + "attribute" + ] + }, + "startTimestamp": { + "type": "number", + "description": "Epoch ms when the rollout begins" + }, + "rollFromVariantId": { + "type": "string", + "description": "The variant to roll away from" + }, + "rollToVariantId": { + "type": "string", + "description": "The variant to roll towards" + }, + "defaultVariantId": { + "type": "string", + "description": "This variant will be used when the base attribute does not exist" + }, + "slots": { + "type": "array", + "description": "Each slot defines a promille and how long it is served for. After all slots expire, 100% is served indefinitely. The final implicit 100% slot does not need to be listed. Example: [[5_000, 21_600_000], [10_000, 28_800_000]] means 5‰ for 6h, then 10‰ for 8h, then 100% indefinitely.", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "promille": { + "type": "number", + "minimum": 0, + "maximum": 100000, + "description": "Promille of traffic for rollToVariant (0-100_000, where 1_000 = 1%)" + }, + "durationMs": { + "type": "number", + "minimum": 0, + "description": "How long this promille is served in ms before moving to the next slot." + } + }, + "required": [ + "promille", + "durationMs" + ] + }, + "minItems": 1 + } + }, + "required": [ + "type", + "base", + "startTimestamp", + "rollFromVariantId", + "rollToVariantId", + "defaultVariantId", + "slots" + ] + } + ] + } + }, + "required": [ + "id", + "conditions", + "outcome" + ] + }, + "maxItems": 10000 + }, + "fallthrough": { + "anyOf": [ + { + "type": "object", + "additionalProperties": false, + "properties": { + "type": {}, + "variantId": { + "type": "string" + } + }, + "required": [ + "type", + "variantId" + ] + }, + { + "type": "object", + "additionalProperties": false, + "properties": { + "type": {}, + "base": { + "type": "object", + "additionalProperties": false, + "properties": { + "type": {}, + "kind": { + "type": "string" + }, + "attribute": { + "type": "string" + } + }, + "required": [ + "type", + "kind", + "attribute" + ] + }, + "weights": { + "type": "object", + "additionalProperties": { + "type": "number" + }, + "description": "The distribution for each variant" + }, + "defaultVariantId": { + "type": "string", + "description": "This variant will be used when the base attribute does not exist" + } + }, + "required": [ + "type", + "base", + "weights", + "defaultVariantId" + ] + }, + { + "type": "object", + "additionalProperties": false, + "properties": { + "type": {}, + "base": { + "type": "object", + "additionalProperties": false, + "properties": { + "type": {}, + "kind": { + "type": "string" + }, + "attribute": { + "type": "string" + } + }, + "required": [ + "type", + "kind", + "attribute" + ] + }, + "startTimestamp": { + "type": "number", + "description": "Epoch ms when the rollout begins" + }, + "rollFromVariantId": { + "type": "string", + "description": "The variant to roll away from" + }, + "rollToVariantId": { + "type": "string", + "description": "The variant to roll towards" + }, + "defaultVariantId": { + "type": "string", + "description": "This variant will be used when the base attribute does not exist" + }, + "slots": { + "type": "array", + "description": "Each slot defines a promille and how long it is served for. After all slots expire, 100% is served indefinitely. The final implicit 100% slot does not need to be listed. Example: [[5_000, 21_600_000], [10_000, 28_800_000]] means 5‰ for 6h, then 10‰ for 8h, then 100% indefinitely.", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "promille": { + "type": "number", + "minimum": 0, + "maximum": 100000, + "description": "Promille of traffic for rollToVariant (0-100_000, where 1_000 = 1%)" + }, + "durationMs": { + "type": "number", + "minimum": 0, + "description": "How long this promille is served in ms before moving to the next slot." + } + }, + "required": [ + "promille", + "durationMs" + ] + }, + "minItems": 1 + } + }, + "required": [ + "type", + "base", + "startTimestamp", + "rollFromVariantId", + "rollToVariantId", + "defaultVariantId", + "slots" + ] + } + ] + }, + "revision": { + "type": "number", + "description": "The revision of the environment config" + } + }, + "required": [ + "active", + "pausedOutcome", + "rules", + "fallthrough" + ] + }, + "maxProperties": 10 + }, + "seed": { + "type": "number", + "minimum": 0, + "maximum": 100000, + "description": "A random seed to prevent split points in different flags from having the same targets" + }, + "description": { + "description": "A description of the flag", + "type": "string" + }, + "state": { + "type": "string", + "enum": [ + "active", + "archived" + ] + }, + "maintainerIds": { + "description": "The user ids of the maintainers of the flag", + "type": "array", + "items": { + "type": "string", + "maxLength": 24 + }, + "maxItems": 5 + }, + "permanent": { + "description": "Whether this flag is marked as permanent, indicating it should not be removed", + "type": "boolean" + }, + "tags": { + "description": "Tags for categorizing the flag", + "type": "array", + "items": { + "type": "string", + "maxLength": 64 + }, + "maxItems": 20, + "uniqueItems": true + } + }, + "required": [ + "slug", + "kind", + "environments" + ] + } + } + } + } + } + }, + "/v1/projects/{projectIdOrName}/feature-flags/flags/{flagIdOrSlug}": { + "get": { + "description": "Retrieve a specific feature flag by its ID or slug.", + "operationId": "getFlag", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Get a flag", + "tags": [ + "feature-flags" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Flag" + } + } + } + }, + "304": { + "description": "" + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "402": { + "description": "The account is missing a payment so payment method must be updated" + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "projectIdOrName", + "description": "The project id or name", + "in": "path", + "required": true, + "schema": { + "description": "The project id or name", + "type": "string" + } + }, + { + "name": "flagIdOrSlug", + "description": "The flag id or name", + "in": "path", + "required": true, + "schema": { + "description": "The flag id or name", + "type": "string" + } + }, + { + "name": "ifMatch", + "description": "Etag to match, can be used interchangeably with the `if-match` header", + "in": "query", + "required": false, + "schema": { + "description": "Etag to match, can be used interchangeably with the `if-match` header", + "type": "string" + } + }, + { + "name": "withMetadata", + "description": "Whether to include metadata in the response", + "in": "query", + "required": false, + "schema": { + "description": "Whether to include metadata in the response", + "type": "boolean" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + }, + "patch": { + "description": "Update an existing feature flag. This endpoint supports partial updates, allowing you to modify specific properties like variants, environments, or state without providing the full flag configuration.", + "operationId": "updateFlag", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Update a flag", + "tags": [ + "feature-flags" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "oneOf": [ + { + "properties": { + "description": { + "type": "string" + }, + "variants": { + "items": { + "type": "object" + }, + "type": "array" + }, + "id": { + "type": "string" + }, + "environments": { + "additionalProperties": { + "properties": { + "reuse": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "environment": { + "type": "string" + } + }, + "required": [ + "active", + "environment" + ], + "type": "object" + }, + "targets": { + "additionalProperties": { + "additionalProperties": { + "additionalProperties": { + "items": { + "properties": { + "note": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "required": [ + "value" + ], + "type": "object" + }, + "type": "array" + }, + "type": "object" + }, + "type": "object" + }, + "type": "object" + }, + "revision": { + "type": "number" + }, + "pausedOutcome": { + "properties": { + "type": { + "type": "string", + "enum": [ + "variant" + ] + }, + "variantId": { + "type": "string" + } + }, + "required": [ + "type", + "variantId" + ], + "type": "object" + }, + "fallthrough": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "variant" + ] + }, + "variantId": { + "type": "string" + } + }, + "required": [ + "type", + "variantId" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "split" + ] + }, + "base": { + "properties": { + "type": { + "type": "string", + "enum": [ + "entity" + ] + }, + "kind": { + "type": "string" + }, + "attribute": { + "type": "string" + } + }, + "required": [ + "attribute", + "kind", + "type" + ], + "type": "object" + }, + "weights": { + "additionalProperties": { + "type": "number" + }, + "type": "object" + }, + "defaultVariantId": { + "type": "string" + } + }, + "required": [ + "base", + "defaultVariantId", + "type", + "weights" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "rollout" + ] + }, + "base": { + "properties": { + "type": { + "type": "string", + "enum": [ + "entity" + ] + }, + "kind": { + "type": "string" + }, + "attribute": { + "type": "string" + } + }, + "required": [ + "attribute", + "kind", + "type" + ], + "type": "object" + }, + "defaultVariantId": { + "type": "string" + }, + "startTimestamp": { + "type": "number" + }, + "rollFromVariantId": { + "type": "string" + }, + "rollToVariantId": { + "type": "string" + }, + "slots": { + "items": { + "properties": { + "promille": { + "type": "number" + }, + "durationMs": { + "type": "number" + } + }, + "required": [ + "durationMs", + "promille" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "base", + "defaultVariantId", + "rollFromVariantId", + "rollToVariantId", + "slots", + "startTimestamp", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "experiment" + ] + } + }, + "required": [ + "type" + ], + "type": "object" + } + ] + }, + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "rules": { + "items": { + "properties": { + "id": { + "type": "string" + }, + "outcome": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "variant" + ] + }, + "variantId": { + "type": "string" + } + }, + "required": [ + "type", + "variantId" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "split" + ] + }, + "base": { + "properties": { + "type": { + "type": "string", + "enum": [ + "entity" + ] + }, + "kind": { + "type": "string" + }, + "attribute": { + "type": "string" + } + }, + "required": [ + "attribute", + "kind", + "type" + ], + "type": "object" + }, + "weights": { + "additionalProperties": { + "type": "number" + }, + "type": "object" + }, + "defaultVariantId": { + "type": "string" + } + }, + "required": [ + "base", + "defaultVariantId", + "type", + "weights" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "rollout" + ] + }, + "base": { + "properties": { + "type": { + "type": "string", + "enum": [ + "entity" + ] + }, + "kind": { + "type": "string" + }, + "attribute": { + "type": "string" + } + }, + "required": [ + "attribute", + "kind", + "type" + ], + "type": "object" + }, + "defaultVariantId": { + "type": "string" + }, + "startTimestamp": { + "type": "number" + }, + "rollFromVariantId": { + "type": "string" + }, + "rollToVariantId": { + "type": "string" + }, + "slots": { + "items": { + "properties": { + "promille": { + "type": "number" + }, + "durationMs": { + "type": "number" + } + }, + "required": [ + "durationMs", + "promille" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "base", + "defaultVariantId", + "rollFromVariantId", + "rollToVariantId", + "slots", + "startTimestamp", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "experiment" + ] + } + }, + "required": [ + "type" + ], + "type": "object" + } + ] + }, + "conditions": { + "items": { + "properties": { + "rhs": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "list", + "list/inline" + ] + }, + "items": { + "items": { + "oneOf": [ + { + "properties": { + "label": { + "type": "string" + }, + "note": { + "type": "string" + }, + "value": { + "type": "number" + } + }, + "required": [ + "value" + ], + "type": "object" + }, + { + "properties": { + "label": { + "type": "string" + }, + "note": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "required": [ + "value" + ], + "type": "object" + } + ] + }, + "type": "array" + } + }, + "required": [ + "items", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "regex" + ] + }, + "pattern": { + "type": "string" + }, + "flags": { + "type": "string" + } + }, + "required": [ + "flags", + "pattern", + "type" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + } + ] + }, + "cmpOptions": { + "properties": { + "ignoreCase": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "type": "object" + }, + "lhs": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "segment" + ] + } + }, + "required": [ + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "entity" + ] + }, + "kind": { + "type": "string" + }, + "attribute": { + "type": "string" + } + }, + "required": [ + "attribute", + "kind", + "type" + ], + "type": "object" + } + ] + }, + "cmp": { + "type": "string", + "enum": [ + "!contains", + "!endsWith", + "!eq", + "!ex", + "!oneOf", + "!regex", + "!startsWith", + "after", + "before", + "contains", + "containsAllOf", + "containsAnyOf", + "containsNoneOf", + "endsWith", + "eq", + "ex", + "gt", + "gte", + "lt", + "lte", + "oneOf", + "regex", + "startsWith" + ] + } + }, + "required": [ + "cmp", + "lhs" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "conditions", + "id", + "outcome" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "active", + "fallthrough", + "pausedOutcome", + "rules" + ], + "type": "object" + }, + "type": "object" + }, + "kind": { + "type": "string", + "enum": [ + "boolean", + "json", + "number", + "string" + ] + }, + "revision": { + "type": "number" + }, + "seed": { + "type": "number" + }, + "state": { + "type": "string", + "enum": [ + "active", + "archived" + ] + }, + "maintainerIds": { + "items": { + "type": "string" + }, + "type": "array" + }, + "permanent": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "tags": { + "items": { + "type": "string" + }, + "type": "array" + }, + "slug": { + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "updatedAt": { + "type": "number" + }, + "updatedBy": { + "type": "string" + }, + "createdBy": { + "type": "string" + }, + "ownerId": { + "type": "string" + }, + "projectId": { + "type": "string" + }, + "typeName": { + "type": "string", + "enum": [ + "flag" + ] + } + }, + "required": [ + "createdAt", + "createdBy", + "environments", + "id", + "kind", + "ownerId", + "projectId", + "revision", + "seed", + "slug", + "state", + "typeName", + "updatedAt", + "variants" + ], + "type": "object" + }, + { + "$ref": "#/components/schemas/Flag" + } + ] + } + } + } + }, + "304": { + "description": "" + }, + "400": { + "description": "One of the provided values in the request body is invalid.\nOne of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "402": { + "description": "The account is missing a payment so payment method must be updated" + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "409": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "projectIdOrName", + "description": "The project id or name", + "in": "path", + "required": true, + "schema": { + "description": "The project id or name", + "type": "string" + } + }, + { + "name": "flagIdOrSlug", + "description": "The flag id or name", + "in": "path", + "required": true, + "schema": { + "description": "The flag id or name", + "type": "string" + } + }, + { + "name": "ifMatch", + "description": "Etag to match, can be used interchangeably with the `if-match` header", + "in": "query", + "required": false, + "schema": { + "description": "Etag to match, can be used interchangeably with the `if-match` header", + "type": "string" + } + }, + { + "name": "withMetadata", + "description": "Whether to include metadata in the response", + "in": "query", + "required": false, + "schema": { + "description": "Whether to include metadata in the response", + "type": "boolean" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "additionalProperties": false, + "properties": { + "createdBy": { + "description": "The user who created this patch", + "type": "string" + }, + "message": { + "description": "Additional message for this version", + "type": "string" + }, + "variants": { + "type": "array", + "description": "The variants of the flag", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "id": { + "description": "The id of the variant", + "type": "string" + }, + "label": { + "description": "A label for the variant", + "type": "string" + }, + "description": { + "description": "A description of the variant", + "type": "string" + }, + "value": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "object" + }, + { + "type": "array", + "items": {} + }, + { + "type": "string" + } + ] + } + }, + "required": [ + "id", + "value" + ] + } + }, + "environments": { + "type": "object", + "description": "The configuration for the flag in different environments", + "additionalProperties": { + "type": "object", + "additionalProperties": false, + "properties": { + "active": { + "type": "boolean" + }, + "reuse": { + "type": "object", + "description": "Allows linking this environment to another environment so this flag will be evaluated with the other flag's configuration", + "additionalProperties": false, + "required": [ + "active", + "environment" + ], + "properties": { + "active": { + "type": "boolean", + "description": "Whether the reuse is active or not" + }, + "environment": { + "type": "string", + "description": "The environment to link to" + } + } + }, + "targets": { + "type": "object", + "description": "Allows assigning targets to variants while bypassing the flag's rules", + "additionalProperties": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "note": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "required": [ + "value" + ] + }, + "maxItems": 10000 + } + } + } + }, + "pausedOutcome": { + "type": "object", + "additionalProperties": false, + "properties": { + "type": {}, + "variantId": { + "type": "string" + } + }, + "required": [ + "type", + "variantId" + ] + }, + "rules": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "id": { + "type": "string" + }, + "conditions": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "lhs": { + "anyOf": [ + { + "type": "object", + "additionalProperties": false, + "properties": { + "type": {} + }, + "required": [ + "type" + ] + }, + { + "type": "object", + "additionalProperties": false, + "properties": { + "type": {}, + "kind": { + "type": "string" + }, + "attribute": { + "type": "string" + } + }, + "required": [ + "type", + "kind", + "attribute" + ] + } + ] + }, + "cmp": { + "type": "string", + "enum": [ + "eq", + "!eq", + "oneOf", + "!oneOf", + "containsAllOf", + "containsAnyOf", + "containsNoneOf", + "startsWith", + "!startsWith", + "endsWith", + "!endsWith", + "contains", + "!contains", + "ex", + "!ex", + "gt", + "gte", + "lt", + "lte", + "regex", + "!regex", + "before", + "after" + ] + }, + "rhs": { + "anyOf": [ + { + "type": "object", + "additionalProperties": false, + "properties": { + "type": { + "type": "string", + "enum": [ + "list/inline", + "list" + ] + }, + "items": { + "type": "array", + "items": { + "anyOf": [ + { + "type": "object", + "additionalProperties": false, + "properties": { + "label": { + "type": "string" + }, + "note": { + "type": "string" + }, + "value": { + "type": "number" + } + }, + "required": [ + "value" + ] + }, + { + "type": "object", + "additionalProperties": false, + "properties": { + "label": { + "type": "string" + }, + "note": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "required": [ + "value" + ] + } + ] + }, + "maxItems": 10000 + } + }, + "required": [ + "type", + "items" + ] + }, + { + "type": "object", + "additionalProperties": false, + "properties": { + "type": {}, + "pattern": { + "type": "string" + }, + "flags": { + "type": "string" + } + }, + "required": [ + "type", + "pattern", + "flags" + ] + }, + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + } + ] + }, + "cmpOptions": { + "type": "object", + "additionalProperties": false, + "properties": { + "ignoreCase": { + "type": "boolean" + } + } + } + }, + "required": [ + "lhs", + "cmp" + ] + } + }, + "outcome": { + "anyOf": [ + { + "type": "object", + "additionalProperties": false, + "properties": { + "type": {}, + "variantId": { + "type": "string" + } + }, + "required": [ + "type", + "variantId" + ] + }, + { + "type": "object", + "additionalProperties": false, + "properties": { + "type": {}, + "base": { + "type": "object", + "additionalProperties": false, + "properties": { + "type": {}, + "kind": { + "type": "string" + }, + "attribute": { + "type": "string" + } + }, + "required": [ + "type", + "kind", + "attribute" + ] + }, + "weights": { + "type": "object", + "additionalProperties": { + "type": "number" + }, + "description": "The distribution for each variant" + }, + "defaultVariantId": { + "type": "string", + "description": "This variant will be used when the base attribute does not exist" + } + }, + "required": [ + "type", + "base", + "weights", + "defaultVariantId" + ] + }, + { + "type": "object", + "additionalProperties": false, + "properties": { + "type": {}, + "base": { + "type": "object", + "additionalProperties": false, + "properties": { + "type": {}, + "kind": { + "type": "string" + }, + "attribute": { + "type": "string" + } + }, + "required": [ + "type", + "kind", + "attribute" + ] + }, + "startTimestamp": { + "type": "number", + "description": "Epoch ms when the rollout begins" + }, + "rollFromVariantId": { + "type": "string", + "description": "The variant to roll away from" + }, + "rollToVariantId": { + "type": "string", + "description": "The variant to roll towards" + }, + "defaultVariantId": { + "type": "string", + "description": "This variant will be used when the base attribute does not exist" + }, + "slots": { + "type": "array", + "description": "Each slot defines a promille and how long it is served for. After all slots expire, 100% is served indefinitely. The final implicit 100% slot does not need to be listed. Example: [[5_000, 21_600_000], [10_000, 28_800_000]] means 5‰ for 6h, then 10‰ for 8h, then 100% indefinitely.", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "promille": { + "type": "number", + "minimum": 0, + "maximum": 100000, + "description": "Promille of traffic for rollToVariant (0-100_000, where 1_000 = 1%)" + }, + "durationMs": { + "type": "number", + "minimum": 0, + "description": "How long this promille is served in ms before moving to the next slot." + } + }, + "required": [ + "promille", + "durationMs" + ] + }, + "minItems": 1 + } + }, + "required": [ + "type", + "base", + "startTimestamp", + "rollFromVariantId", + "rollToVariantId", + "defaultVariantId", + "slots" + ] + } + ] + } + }, + "required": [ + "id", + "conditions", + "outcome" + ] + }, + "maxItems": 10000 + }, + "fallthrough": { + "anyOf": [ + { + "type": "object", + "additionalProperties": false, + "properties": { + "type": {}, + "variantId": { + "type": "string" + } + }, + "required": [ + "type", + "variantId" + ] + }, + { + "type": "object", + "additionalProperties": false, + "properties": { + "type": {}, + "base": { + "type": "object", + "additionalProperties": false, + "properties": { + "type": {}, + "kind": { + "type": "string" + }, + "attribute": { + "type": "string" + } + }, + "required": [ + "type", + "kind", + "attribute" + ] + }, + "weights": { + "type": "object", + "additionalProperties": { + "type": "number" + }, + "description": "The distribution for each variant" + }, + "defaultVariantId": { + "type": "string", + "description": "This variant will be used when the base attribute does not exist" + } + }, + "required": [ + "type", + "base", + "weights", + "defaultVariantId" + ] + }, + { + "type": "object", + "additionalProperties": false, + "properties": { + "type": {}, + "base": { + "type": "object", + "additionalProperties": false, + "properties": { + "type": {}, + "kind": { + "type": "string" + }, + "attribute": { + "type": "string" + } + }, + "required": [ + "type", + "kind", + "attribute" + ] + }, + "startTimestamp": { + "type": "number", + "description": "Epoch ms when the rollout begins" + }, + "rollFromVariantId": { + "type": "string", + "description": "The variant to roll away from" + }, + "rollToVariantId": { + "type": "string", + "description": "The variant to roll towards" + }, + "defaultVariantId": { + "type": "string", + "description": "This variant will be used when the base attribute does not exist" + }, + "slots": { + "type": "array", + "description": "Each slot defines a promille and how long it is served for. After all slots expire, 100% is served indefinitely. The final implicit 100% slot does not need to be listed. Example: [[5_000, 21_600_000], [10_000, 28_800_000]] means 5‰ for 6h, then 10‰ for 8h, then 100% indefinitely.", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "promille": { + "type": "number", + "minimum": 0, + "maximum": 100000, + "description": "Promille of traffic for rollToVariant (0-100_000, where 1_000 = 1%)" + }, + "durationMs": { + "type": "number", + "minimum": 0, + "description": "How long this promille is served in ms before moving to the next slot." + } + }, + "required": [ + "promille", + "durationMs" + ] + }, + "minItems": 1 + } + }, + "required": [ + "type", + "base", + "startTimestamp", + "rollFromVariantId", + "rollToVariantId", + "defaultVariantId", + "slots" + ] + } + ] + }, + "revision": { + "type": "number", + "description": "The revision of the environment config" + } + }, + "required": [ + "active", + "pausedOutcome", + "rules", + "fallthrough" + ] + }, + "maxProperties": 10 + }, + "seed": { + "type": "number", + "minimum": 0, + "maximum": 100000, + "description": "A random seed to prevent split points in different flags from having the same targets" + }, + "description": { + "description": "A description of the flag", + "type": "string" + }, + "state": { + "type": "string", + "enum": [ + "active", + "archived" + ] + }, + "maintainerIds": { + "description": "The user ids of the maintainers of the flag", + "type": "array", + "items": { + "type": "string", + "maxLength": 24 + }, + "maxItems": 5 + }, + "permanent": { + "description": "Whether this flag is marked as permanent, indicating it should not be removed", + "type": "boolean" + }, + "tags": { + "description": "Tags for categorizing the flag", + "type": "array", + "items": { + "type": "string", + "maxLength": 64 + }, + "maxItems": 20, + "uniqueItems": true + } + } + } + } + } + } + }, + "delete": { + "description": "Permanently delete a feature flag from the project. This action cannot be undone. Consider archiving the flag instead if you may need it in the future.", + "operationId": "deleteFlag", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Delete a flag", + "tags": [ + "feature-flags" + ], + "responses": { + "204": { + "description": "" + }, + "304": { + "description": "" + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "402": { + "description": "The account is missing a payment so payment method must be updated" + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "409": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "projectIdOrName", + "description": "The project id or name", + "in": "path", + "required": true, + "schema": { + "description": "The project id or name", + "type": "string" + } + }, + { + "name": "flagIdOrSlug", + "description": "The flag id or name", + "in": "path", + "required": true, + "schema": { + "description": "The flag id or name", + "type": "string" + } + }, + { + "name": "ifMatch", + "description": "Etag to match, can be used interchangeably with the `if-match` header", + "in": "query", + "required": false, + "schema": { + "description": "Etag to match, can be used interchangeably with the `if-match` header", + "type": "string" + } + }, + { + "name": "withMetadata", + "description": "Whether to include metadata in the response", + "in": "query", + "required": false, + "schema": { + "description": "Whether to include metadata in the response", + "type": "boolean" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + } + }, + "/v1/projects/{projectIdOrName}/feature-flags/flags/{flagIdOrSlug}/versions": { + "get": { + "description": "Lists flag versions for a given flag.", + "operationId": "listFlagVersions", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "List flag versions", + "tags": [ + "feature-flags" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "versions": { + "items": { + "properties": { + "id": { + "type": "string" + }, + "revision": { + "type": "number" + }, + "createdAt": { + "type": "number" + }, + "createdBy": { + "type": "string" + }, + "message": { + "type": "string" + }, + "flagId": { + "type": "string" + }, + "changedEnvironments": { + "items": { + "type": "string" + }, + "type": "array" + }, + "data": { + "properties": { + "description": { + "type": "string" + }, + "variants": { + "items": { + "type": "object" + }, + "type": "array" + }, + "environments": { + "additionalProperties": { + "properties": { + "reuse": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "environment": { + "type": "string" + } + }, + "required": [ + "active", + "environment" + ], + "type": "object" + }, + "targets": { + "additionalProperties": { + "additionalProperties": { + "additionalProperties": { + "items": { + "properties": { + "note": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "required": [ + "value" + ], + "type": "object" + }, + "type": "array" + }, + "type": "object" + }, + "type": "object" + }, + "type": "object" + }, + "revision": { + "type": "number" + }, + "pausedOutcome": { + "properties": { + "type": { + "type": "string", + "enum": [ + "variant" + ] + }, + "variantId": { + "type": "string" + } + }, + "required": [ + "type", + "variantId" + ], + "type": "object" + }, + "fallthrough": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "variant" + ] + }, + "variantId": { + "type": "string" + } + }, + "required": [ + "type", + "variantId" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "split" + ] + }, + "base": { + "properties": { + "type": { + "type": "string", + "enum": [ + "entity" + ] + }, + "kind": { + "type": "string" + }, + "attribute": { + "type": "string" + } + }, + "required": [ + "attribute", + "kind", + "type" + ], + "type": "object" + }, + "weights": { + "additionalProperties": { + "type": "number" + }, + "type": "object" + }, + "defaultVariantId": { + "type": "string" + } + }, + "required": [ + "base", + "defaultVariantId", + "type", + "weights" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "rollout" + ] + }, + "base": { + "properties": { + "type": { + "type": "string", + "enum": [ + "entity" + ] + }, + "kind": { + "type": "string" + }, + "attribute": { + "type": "string" + } + }, + "required": [ + "attribute", + "kind", + "type" + ], + "type": "object" + }, + "defaultVariantId": { + "type": "string" + }, + "startTimestamp": { + "type": "number" + }, + "rollFromVariantId": { + "type": "string" + }, + "rollToVariantId": { + "type": "string" + }, + "slots": { + "items": { + "properties": { + "promille": { + "type": "number" + }, + "durationMs": { + "type": "number" + } + }, + "required": [ + "durationMs", + "promille" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "base", + "defaultVariantId", + "rollFromVariantId", + "rollToVariantId", + "slots", + "startTimestamp", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "experiment" + ] + } + }, + "required": [ + "type" + ], + "type": "object" + } + ] + }, + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "rules": { + "items": { + "properties": { + "id": { + "type": "string" + }, + "outcome": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "variant" + ] + }, + "variantId": { + "type": "string" + } + }, + "required": [ + "type", + "variantId" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "split" + ] + }, + "base": { + "properties": { + "type": { + "type": "string", + "enum": [ + "entity" + ] + }, + "kind": { + "type": "string" + }, + "attribute": { + "type": "string" + } + }, + "required": [ + "attribute", + "kind", + "type" + ], + "type": "object" + }, + "weights": { + "additionalProperties": { + "type": "number" + }, + "type": "object" + }, + "defaultVariantId": { + "type": "string" + } + }, + "required": [ + "base", + "defaultVariantId", + "type", + "weights" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "rollout" + ] + }, + "base": { + "properties": { + "type": { + "type": "string", + "enum": [ + "entity" + ] + }, + "kind": { + "type": "string" + }, + "attribute": { + "type": "string" + } + }, + "required": [ + "attribute", + "kind", + "type" + ], + "type": "object" + }, + "defaultVariantId": { + "type": "string" + }, + "startTimestamp": { + "type": "number" + }, + "rollFromVariantId": { + "type": "string" + }, + "rollToVariantId": { + "type": "string" + }, + "slots": { + "items": { + "properties": { + "promille": { + "type": "number" + }, + "durationMs": { + "type": "number" + } + }, + "required": [ + "durationMs", + "promille" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "base", + "defaultVariantId", + "rollFromVariantId", + "rollToVariantId", + "slots", + "startTimestamp", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "experiment" + ] + } + }, + "required": [ + "type" + ], + "type": "object" + } + ] + }, + "conditions": { + "items": { + "properties": { + "rhs": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "list", + "list/inline" + ] + }, + "items": { + "items": { + "oneOf": [ + { + "properties": { + "label": { + "type": "string" + }, + "note": { + "type": "string" + }, + "value": { + "type": "number" + } + }, + "required": [ + "value" + ], + "type": "object" + }, + { + "properties": { + "label": { + "type": "string" + }, + "note": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "required": [ + "value" + ], + "type": "object" + } + ] + }, + "type": "array" + } + }, + "required": [ + "items", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "regex" + ] + }, + "pattern": { + "type": "string" + }, + "flags": { + "type": "string" + } + }, + "required": [ + "flags", + "pattern", + "type" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + } + ] + }, + "cmpOptions": { + "properties": { + "ignoreCase": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "type": "object" + }, + "lhs": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "segment" + ] + } + }, + "required": [ + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "entity" + ] + }, + "kind": { + "type": "string" + }, + "attribute": { + "type": "string" + } + }, + "required": [ + "attribute", + "kind", + "type" + ], + "type": "object" + } + ] + }, + "cmp": { + "type": "string", + "enum": [ + "!contains", + "!endsWith", + "!eq", + "!ex", + "!oneOf", + "!regex", + "!startsWith", + "after", + "before", + "contains", + "containsAllOf", + "containsAnyOf", + "containsNoneOf", + "endsWith", + "eq", + "ex", + "gt", + "gte", + "lt", + "lte", + "oneOf", + "regex", + "startsWith" + ] + } + }, + "required": [ + "cmp", + "lhs" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "conditions", + "id", + "outcome" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "active", + "fallthrough", + "pausedOutcome", + "rules" + ], + "type": "object" + }, + "type": "object" + }, + "seed": { + "type": "number" + }, + "state": { + "type": "string", + "enum": [ + "active", + "archived" + ] + }, + "maintainerIds": { + "items": { + "type": "string" + }, + "type": "array" + }, + "permanent": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "tags": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "environments", + "seed", + "state", + "variants" + ], + "type": "object" + }, + "metadata": { + "properties": { + "creator": { + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + } + }, + "required": [ + "id", + "name" + ], + "type": "object" + } + }, + "type": "object" + } + }, + "required": [ + "changedEnvironments", + "createdAt", + "data", + "flagId", + "id", + "revision" + ], + "type": "object" + }, + "type": "array" + }, + "pagination": { + "type": "object" + } + }, + "required": [ + "pagination", + "versions" + ], + "type": "object" + } + } + } + }, + "304": { + "description": "" + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "402": { + "description": "The account is missing a payment so payment method must be updated" + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "projectIdOrName", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "flagIdOrSlug", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "limit", + "in": "query", + "required": false, + "schema": { + "type": "number", + "minimum": 1, + "maximum": 100, + "default": 20 + } + }, + { + "name": "cursor", + "description": "Pagination cursor", + "in": "query", + "required": false, + "schema": { + "type": "string", + "description": "Pagination cursor" + } + }, + { + "name": "environment", + "description": "Environment to filter by", + "in": "query", + "required": false, + "schema": { + "type": "string", + "description": "Environment to filter by" + } + }, + { + "name": "withMetadata", + "description": "Whether to include metadata", + "in": "query", + "required": false, + "schema": { + "type": "boolean", + "description": "Whether to include metadata", + "default": false + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + } + }, + "/v1/projects/{projectIdOrName}/feature-flags/settings": { + "get": { + "description": "Retrieve feature flag settings for a project.", + "operationId": "getFlagSettings", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Get project flag settings", + "tags": [ + "feature-flags" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "typeName": { + "type": "string", + "enum": [ + "settings" + ] + }, + "projectId": { + "type": "string" + }, + "ownerId": { + "type": "string" + }, + "enabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "environments": { + "items": { + "type": "string" + }, + "type": "array" + }, + "entities": { + "items": { + "properties": { + "kind": { + "type": "string" + }, + "label": { + "type": "string" + }, + "attributes": { + "items": { + "properties": { + "key": { + "type": "string" + }, + "type": { + "type": "string" + }, + "labels": { + "items": { + "properties": { + "label": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "required": [ + "label", + "value" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "key", + "type" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "attributes", + "kind", + "label" + ], + "type": "object" + }, + "type": "array" + }, + "createdAt": { + "type": "number" + }, + "updatedAt": { + "type": "number" + }, + "metadata": { + "properties": { + "activeFlagCount": { + "type": "number" + }, + "archivedFlagCount": { + "type": "number" + }, + "segmentCount": { + "type": "number" + }, + "packSizeInBytes": { + "type": "number" + }, + "packRevision": { + "type": "number" + }, + "configUpdatedAt": { + "type": "number" + } + }, + "required": [ + "activeFlagCount", + "archivedFlagCount", + "packSizeInBytes", + "segmentCount" + ], + "type": "object" + } + }, + "required": [ + "enabled", + "entities", + "environments", + "metadata", + "projectId", + "typeName" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "402": { + "description": "The account is missing a payment so payment method must be updated" + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "projectIdOrName", + "description": "The project id or name", + "in": "path", + "required": true, + "schema": { + "description": "The project id or name", + "type": "string" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + }, + "patch": { + "description": "Update feature flag settings for a project.", + "operationId": "updateFlagSettings", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Update project flag settings", + "tags": [ + "feature-flags" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "typeName": { + "type": "string", + "enum": [ + "settings" + ] + }, + "projectId": { + "type": "string" + }, + "ownerId": { + "type": "string" + }, + "enabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "environments": { + "items": { + "type": "string" + }, + "type": "array" + }, + "entities": { + "items": { + "properties": { + "kind": { + "type": "string" + }, + "label": { + "type": "string" + }, + "attributes": { + "items": { + "properties": { + "key": { + "type": "string" + }, + "type": { + "type": "string" + }, + "labels": { + "items": { + "properties": { + "label": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "required": [ + "label", + "value" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "key", + "type" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "attributes", + "kind", + "label" + ], + "type": "object" + }, + "type": "array" + }, + "createdAt": { + "type": "number" + }, + "updatedAt": { + "type": "number" + }, + "metadata": { + "properties": { + "activeFlagCount": { + "type": "number" + }, + "archivedFlagCount": { + "type": "number" + }, + "segmentCount": { + "type": "number" + }, + "packSizeInBytes": { + "type": "number" + }, + "packRevision": { + "type": "number" + }, + "configUpdatedAt": { + "type": "number" + } + }, + "required": [ + "activeFlagCount", + "archivedFlagCount", + "packSizeInBytes", + "segmentCount" + ], + "type": "object" + } + }, + "required": [ + "enabled", + "entities", + "environments", + "metadata", + "projectId", + "typeName" + ], + "type": "object" + } + } + } + }, + "201": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "typeName": { + "type": "string", + "enum": [ + "settings" + ] + }, + "projectId": { + "type": "string" + }, + "ownerId": { + "type": "string" + }, + "enabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "environments": { + "items": { + "type": "string" + }, + "type": "array" + }, + "entities": { + "items": { + "properties": { + "kind": { + "type": "string" + }, + "label": { + "type": "string" + }, + "attributes": { + "items": { + "properties": { + "key": { + "type": "string" + }, + "type": { + "type": "string" + }, + "labels": { + "items": { + "properties": { + "label": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "required": [ + "label", + "value" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "key", + "type" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "attributes", + "kind", + "label" + ], + "type": "object" + }, + "type": "array" + }, + "createdAt": { + "type": "number" + }, + "updatedAt": { + "type": "number" + }, + "metadata": { + "properties": { + "activeFlagCount": { + "type": "number" + }, + "archivedFlagCount": { + "type": "number" + }, + "segmentCount": { + "type": "number" + }, + "packSizeInBytes": { + "type": "number" + }, + "packRevision": { + "type": "number" + }, + "configUpdatedAt": { + "type": "number" + } + }, + "required": [ + "activeFlagCount", + "archivedFlagCount", + "packSizeInBytes", + "segmentCount" + ], + "type": "object" + } + }, + "required": [ + "enabled", + "entities", + "environments", + "metadata", + "projectId", + "typeName" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid.\nOne of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "402": { + "description": "The account is missing a payment so payment method must be updated" + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "409": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "projectIdOrName", + "description": "The project id or name", + "in": "path", + "required": true, + "schema": { + "description": "The project id or name", + "type": "string" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "additionalProperties": false, + "properties": { + "enabled": { + "type": "boolean" + }, + "entities": { + "type": "array", + "maxItems": 32, + "items": { + "type": "object", + "additionalProperties": false, + "required": [ + "kind", + "label", + "attributes" + ], + "properties": { + "kind": { + "type": "string", + "maxLength": 128 + }, + "label": { + "type": "string", + "maxLength": 128 + }, + "attributes": { + "type": "array", + "maxItems": 32, + "items": { + "type": "object", + "additionalProperties": false, + "required": [ + "key", + "type" + ], + "properties": { + "key": { + "type": "string", + "maxLength": 128 + }, + "type": { + "type": "string", + "maxLength": 128 + }, + "labels": { + "type": "array", + "maxItems": 256, + "items": { + "type": "object", + "additionalProperties": false, + "required": [ + "label", + "value" + ], + "properties": { + "label": { + "type": "string", + "maxLength": 128 + }, + "value": { + "type": "string", + "maxLength": 128 + } + } + } + } + } + } + } + } + } + }, + "environments": { + "description": "The environments to sync", + "type": "array", + "items": { + "type": "string" + } + } + } + } + } + } + } + } + }, + "/v1/teams/{teamId}/feature-flags/settings": { + "get": { + "description": "Retrieve feature flag settings for projects in a team.", + "operationId": "listTeamFlagSettings", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "List team project flag settings", + "tags": [ + "feature-flags" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "oneOf": [ + { + "type": "object" + }, + { + "properties": { + "data": { + "items": { + "properties": { + "typeName": { + "type": "string", + "enum": [ + "settings" + ] + }, + "projectId": { + "type": "string" + }, + "ownerId": { + "type": "string" + }, + "enabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "environments": { + "items": { + "type": "string" + }, + "type": "array" + }, + "entities": { + "items": { + "properties": { + "kind": { + "type": "string" + }, + "label": { + "type": "string" + }, + "attributes": { + "items": { + "properties": { + "key": { + "type": "string" + }, + "type": { + "type": "string" + }, + "labels": { + "items": { + "properties": { + "label": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "required": [ + "label", + "value" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "key", + "type" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "attributes", + "kind", + "label" + ], + "type": "object" + }, + "type": "array" + }, + "createdAt": { + "type": "number" + }, + "updatedAt": { + "type": "number" + }, + "metadata": { + "properties": { + "activeFlagCount": { + "type": "number" + }, + "archivedFlagCount": { + "type": "number" + }, + "segmentCount": { + "type": "number" + }, + "packSizeInBytes": { + "type": "number" + }, + "packRevision": { + "type": "number" + }, + "configUpdatedAt": { + "type": "number" + } + }, + "required": [ + "activeFlagCount", + "archivedFlagCount", + "packSizeInBytes", + "segmentCount" + ], + "type": "object" + } + }, + "required": [ + "enabled", + "entities", + "environments", + "metadata", + "projectId", + "typeName" + ], + "type": "object" + }, + "type": "array" + }, + "pagination": { + "properties": { + "next": { + "nullable": true, + "type": "string" + } + }, + "required": [ + "next" + ], + "type": "object" + } + }, + "required": [ + "data", + "pagination" + ], + "type": "object" + } + ] + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "limit", + "description": "Maximum number of settings to return.", + "in": "query", + "required": false, + "schema": { + "description": "Maximum number of settings to return.", + "type": "integer", + "minimum": 1, + "maximum": 100, + "default": 20 + } + }, + { + "name": "cursor", + "description": "Pagination cursor to continue from.", + "in": "query", + "required": false, + "schema": { + "description": "Pagination cursor to continue from.", + "type": "string" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "path", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + }, + "required": true + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + } + }, + "/v2/teams/{teamId}/feature-flags/flags": { + "get": { + "description": "Retrieve all feature flags for a team across all projects. Returns an opaque cursor for pagination.", + "operationId": "listTeamFlagsV2", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "List all flags for a team", + "tags": [ + "feature-flags" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "pagination": { + "properties": { + "next": { + "nullable": true, + "type": "string" + } + }, + "required": [ + "next" + ], + "type": "object" + }, + "data": { + "items": { + "oneOf": [ + { + "$ref": "#/components/schemas/Flag" + }, + { + "$ref": "#/components/schemas/MarketplaceFlag" + } + ] + }, + "type": "array" + } + }, + "required": [ + "data", + "pagination" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "state", + "description": "The state of the flags to retrieve. Defaults to `active`.", + "in": "query", + "required": false, + "schema": { + "type": "string", + "enum": [ + "active", + "archived" + ], + "description": "The state of the flags to retrieve. Defaults to `active`." + } + }, + { + "name": "limit", + "description": "Maximum number of flags to return.", + "in": "query", + "required": false, + "schema": { + "description": "Maximum number of flags to return.", + "type": "integer", + "minimum": 1, + "maximum": 100, + "default": 25 + } + }, + { + "name": "cursor", + "description": "Pagination cursor to continue from.", + "in": "query", + "required": false, + "schema": { + "description": "Pagination cursor to continue from.", + "type": "string" + } + }, + { + "name": "search", + "description": "Search flags by their slug or description. Case-insensitive.", + "in": "query", + "required": false, + "schema": { + "description": "Search flags by their slug or description. Case-insensitive.", + "type": "string", + "maxLength": 256 + } + }, + { + "name": "kind", + "description": "The kind of flags to retrieve.", + "in": "query", + "required": false, + "schema": { + "description": "The kind of flags to retrieve.", + "type": "string", + "enum": [ + "boolean", + "string", + "number", + "json" + ] + } + }, + { + "name": "tags", + "description": "Filter flags by tag. Repeat the parameter for multiple tags (all must match).", + "in": "query", + "required": false, + "schema": { + "description": "Filter flags by tag. Repeat the parameter for multiple tags (all must match).", + "type": "array", + "items": { + "type": "string" + } + } + }, + { + "name": "createdBy", + "description": "Filter flags by the id of the entity that created them (a user or team id).", + "in": "query", + "required": false, + "schema": { + "description": "Filter flags by the id of the entity that created them (a user or team id).", + "type": "string", + "maxLength": 256 + } + }, + { + "name": "maintainerIds", + "description": "Filter flags by maintainer user id. Repeat the parameter for multiple maintainers (any may match).", + "in": "query", + "required": false, + "schema": { + "description": "Filter flags by maintainer user id. Repeat the parameter for multiple maintainers (any may match).", + "type": "array", + "items": { + "type": "string", + "maxLength": 24 + }, + "maxItems": 25 + } + }, + { + "name": "includeMarketplaceFlags", + "description": "Whether to include Marketplace experimentation items in the paginated response. Defaults to false.", + "in": "query", + "required": false, + "schema": { + "description": "Whether to include Marketplace experimentation items in the paginated response. Defaults to false.", + "type": "boolean" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "path", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + }, + "required": true + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + } + }, + "/v1/teams/{teamId}/feature-flags/flags": { + "get": { + "description": "Retrieve all feature flags for a team across all projects. The list can be filtered by state and supports pagination.", + "operationId": "listTeamFlags", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "List all flags for a team", + "tags": [ + "feature-flags" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "items": { + "$ref": "#/components/schemas/Flag" + }, + "type": "array" + }, + "pagination": { + "properties": { + "next": { + "nullable": true, + "type": "string" + } + }, + "required": [ + "next" + ], + "type": "object" + } + }, + "required": [ + "data", + "pagination" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "state", + "description": "The state of the flags to retrieve. Defaults to `active`.", + "in": "query", + "required": false, + "schema": { + "type": "string", + "enum": [ + "active", + "archived" + ], + "description": "The state of the flags to retrieve. Defaults to `active`." + } + }, + { + "name": "withMetadata", + "description": "Deprecated. Whether to include creator metadata in each flag in the response. Resolve creator identity client-side (e.g. via the team members endpoint) instead; this parameter will be removed in a future release.", + "in": "query", + "required": false, + "schema": { + "description": "Deprecated. Whether to include creator metadata in each flag in the response. Resolve creator identity client-side (e.g. via the team members endpoint) instead; this parameter will be removed in a future release.", + "type": "boolean", + "deprecated": true + } + }, + { + "name": "limit", + "description": "Maximum number of flags to return.", + "in": "query", + "required": false, + "schema": { + "description": "Maximum number of flags to return.", + "type": "integer", + "minimum": 1, + "maximum": 100, + "default": 20 + } + }, + { + "name": "cursor", + "description": "Pagination cursor to continue from.", + "in": "query", + "required": false, + "schema": { + "description": "Pagination cursor to continue from.", + "type": "string" + } + }, + { + "name": "search", + "description": "Search flags by their slug or description. Case-insensitive.", + "in": "query", + "required": false, + "schema": { + "description": "Search flags by their slug or description. Case-insensitive.", + "type": "string", + "maxLength": 256 + } + }, + { + "name": "kind", + "description": "The kind of flags to retrieve.", + "in": "query", + "required": false, + "schema": { + "description": "The kind of flags to retrieve.", + "type": "string", + "enum": [ + "boolean", + "string", + "number", + "json" + ] + } + }, + { + "name": "tags", + "description": "Filter flags by tag. Repeat the parameter for multiple tags (all must match).", + "in": "query", + "required": false, + "schema": { + "description": "Filter flags by tag. Repeat the parameter for multiple tags (all must match).", + "type": "array", + "items": { + "type": "string" + } + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "path", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + }, + "required": true + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + } + }, + "/v1/projects/{projectIdOrName}/feature-flags/segments": { + "put": { + "description": "Create a new feature flag segment.", + "operationId": "createFlagSegment", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Create a segment", + "tags": [ + "feature-flags" + ], + "responses": { + "201": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "description": { + "type": "string" + }, + "createdBy": { + "type": "string" + }, + "usedByFlags": { + "items": { + "type": "string" + }, + "type": "array" + }, + "usedBySegments": { + "items": { + "type": "string" + }, + "type": "array" + }, + "data": { + "properties": { + "rules": { + "items": { + "properties": { + "id": { + "type": "string" + }, + "outcome": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "all" + ] + } + }, + "required": [ + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "split" + ] + }, + "base": { + "properties": { + "type": { + "type": "string", + "enum": [ + "entity" + ] + }, + "kind": { + "type": "string" + }, + "attribute": { + "type": "string" + } + }, + "required": [ + "attribute", + "kind", + "type" + ], + "type": "object" + }, + "passPromille": { + "type": "number" + } + }, + "required": [ + "base", + "passPromille", + "type" + ], + "type": "object" + } + ] + }, + "conditions": { + "items": { + "properties": { + "rhs": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "list", + "list/inline" + ] + }, + "items": { + "items": { + "oneOf": [ + { + "properties": { + "label": { + "type": "string" + }, + "note": { + "type": "string" + }, + "value": { + "type": "number" + } + }, + "required": [ + "value" + ], + "type": "object" + }, + { + "properties": { + "label": { + "type": "string" + }, + "note": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "required": [ + "value" + ], + "type": "object" + } + ] + }, + "type": "array" + } + }, + "required": [ + "items", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "regex" + ] + }, + "pattern": { + "type": "string" + }, + "flags": { + "type": "string" + } + }, + "required": [ + "flags", + "pattern", + "type" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + } + ] + }, + "cmpOptions": { + "properties": { + "ignoreCase": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "type": "object" + }, + "lhs": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "segment" + ] + } + }, + "required": [ + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "entity" + ] + }, + "kind": { + "type": "string" + }, + "attribute": { + "type": "string" + } + }, + "required": [ + "attribute", + "kind", + "type" + ], + "type": "object" + } + ] + }, + "cmp": { + "type": "string", + "enum": [ + "!contains", + "!endsWith", + "!eq", + "!ex", + "!oneOf", + "!regex", + "!startsWith", + "after", + "before", + "contains", + "containsAllOf", + "containsAnyOf", + "containsNoneOf", + "endsWith", + "eq", + "ex", + "gt", + "gte", + "lt", + "lte", + "oneOf", + "regex", + "startsWith" + ] + } + }, + "required": [ + "cmp", + "lhs" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "conditions", + "id", + "outcome" + ], + "type": "object" + }, + "type": "array" + }, + "include": { + "additionalProperties": { + "additionalProperties": { + "items": { + "properties": { + "note": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "required": [ + "value" + ], + "type": "object" + }, + "type": "array" + }, + "type": "object" + }, + "type": "object" + }, + "exclude": { + "additionalProperties": { + "additionalProperties": { + "items": { + "properties": { + "note": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "required": [ + "value" + ], + "type": "object" + }, + "type": "array" + }, + "type": "object" + }, + "type": "object" + } + }, + "type": "object" + }, + "id": { + "type": "string" + }, + "label": { + "type": "string" + }, + "slug": { + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "updatedAt": { + "type": "number" + }, + "projectId": { + "type": "string" + }, + "typeName": { + "type": "string", + "enum": [ + "segment" + ] + }, + "hint": { + "type": "string" + } + }, + "required": [ + "createdAt", + "data", + "hint", + "id", + "label", + "projectId", + "slug", + "typeName", + "updatedAt" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid.\nOne of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "402": { + "description": "The account is missing a payment so payment method must be updated" + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "409": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "projectIdOrName", + "description": "The project id or name", + "in": "path", + "required": true, + "schema": { + "description": "The project id or name", + "type": "string" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "additionalProperties": false, + "properties": { + "slug": { + "type": "string" + }, + "createdBy": { + "description": "The entity who created the segment", + "type": "string" + }, + "label": { + "type": "string" + }, + "description": { + "type": "string" + }, + "data": { + "type": "object", + "additionalProperties": false, + "description": "The data of the segment", + "properties": { + "rules": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "id": { + "type": "string" + }, + "conditions": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "lhs": { + "anyOf": [ + { + "type": "object", + "additionalProperties": false, + "properties": { + "type": {} + }, + "required": [ + "type" + ] + }, + { + "type": "object", + "additionalProperties": false, + "properties": { + "type": {}, + "kind": { + "type": "string" + }, + "attribute": { + "type": "string" + } + }, + "required": [ + "type", + "kind", + "attribute" + ] + } + ] + }, + "cmp": { + "type": "string", + "enum": [ + "eq", + "!eq", + "oneOf", + "!oneOf", + "containsAllOf", + "containsAnyOf", + "containsNoneOf", + "startsWith", + "!startsWith", + "endsWith", + "!endsWith", + "contains", + "!contains", + "ex", + "!ex", + "gt", + "gte", + "lt", + "lte", + "regex", + "!regex", + "before", + "after" + ] + }, + "rhs": { + "anyOf": [ + { + "type": "object", + "additionalProperties": false, + "properties": { + "type": { + "type": "string", + "enum": [ + "list/inline", + "list" + ] + }, + "items": { + "type": "array", + "items": { + "anyOf": [ + { + "type": "object", + "additionalProperties": false, + "properties": { + "label": { + "type": "string" + }, + "note": { + "type": "string" + }, + "value": { + "type": "number" + } + }, + "required": [ + "value" + ] + }, + { + "type": "object", + "additionalProperties": false, + "properties": { + "label": { + "type": "string" + }, + "note": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "required": [ + "value" + ] + } + ] + }, + "maxItems": 10000 + } + }, + "required": [ + "type", + "items" + ] + }, + { + "type": "object", + "additionalProperties": false, + "properties": { + "type": {}, + "pattern": { + "type": "string" + }, + "flags": { + "type": "string" + } + }, + "required": [ + "type", + "pattern", + "flags" + ] + }, + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + } + ] + }, + "cmpOptions": { + "type": "object", + "additionalProperties": false, + "properties": { + "ignoreCase": { + "type": "boolean" + } + } + } + }, + "required": [ + "lhs", + "cmp" + ] + } + }, + "outcome": { + "anyOf": [ + { + "type": "object", + "additionalProperties": false, + "properties": { + "type": {} + }, + "required": [ + "type" + ] + }, + { + "type": "object", + "additionalProperties": false, + "properties": { + "type": {}, + "base": { + "type": "object", + "additionalProperties": false, + "properties": { + "type": {}, + "kind": { + "type": "string" + }, + "attribute": { + "type": "string" + } + }, + "required": [ + "type", + "kind", + "attribute" + ] + }, + "passPromille": { + "type": "number" + } + }, + "required": [ + "type", + "base", + "passPromille" + ] + } + ] + } + }, + "required": [ + "conditions", + "outcome", + "id" + ] + }, + "maxItems": 10000 + }, + "include": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "note": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "required": [ + "value" + ] + }, + "maxItems": 10000 + } + } + }, + "exclude": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "note": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "required": [ + "value" + ] + }, + "maxItems": 10000 + } + } + } + } + }, + "hint": { + "type": "string" + } + }, + "required": [ + "slug", + "label", + "data", + "hint" + ] + } + } + } + } + }, + "get": { + "description": "List all feature flag segments for a project.", + "operationId": "listFlagSegments", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "List segments", + "tags": [ + "feature-flags" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "items": { + "$ref": "#/components/schemas/Segment" + }, + "type": "array" + } + }, + "required": [ + "data" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "402": { + "description": "The account is missing a payment so payment method must be updated" + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "projectIdOrName", + "description": "The project id or name", + "in": "path", + "required": true, + "schema": { + "description": "The project id or name", + "type": "string" + } + }, + { + "name": "withMetadata", + "description": "Whether to include metadata", + "in": "query", + "required": false, + "schema": { + "type": "boolean", + "description": "Whether to include metadata", + "default": false + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + } + }, + "/v1/projects/{projectIdOrName}/feature-flags/segments/{segmentIdOrSlug}": { + "get": { + "description": "Retrieve a feature flag segment by ID or slug.", + "operationId": "getFlagSegment", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Get a segment", + "tags": [ + "feature-flags" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Segment" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "402": { + "description": "The account is missing a payment so payment method must be updated" + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "projectIdOrName", + "description": "The project id or name", + "in": "path", + "required": true, + "schema": { + "description": "The project id or name", + "type": "string" + } + }, + { + "name": "segmentIdOrSlug", + "description": "The segment slug", + "in": "path", + "required": true, + "schema": { + "description": "The segment slug", + "type": "string" + } + }, + { + "name": "withMetadata", + "description": "Whether to include metadata", + "in": "query", + "required": false, + "schema": { + "type": "boolean", + "description": "Whether to include metadata", + "default": false + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + }, + "delete": { + "description": "Delete a feature flag segment.", + "operationId": "deleteFlagSegment", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Delete a segment", + "tags": [ + "feature-flags" + ], + "responses": { + "204": { + "description": "" + }, + "304": { + "description": "" + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "402": { + "description": "The account is missing a payment so payment method must be updated" + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "409": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "projectIdOrName", + "description": "The project id or name", + "in": "path", + "required": true, + "schema": { + "description": "The project id or name", + "type": "string" + } + }, + { + "name": "segmentIdOrSlug", + "description": "The segment slug", + "in": "path", + "required": true, + "schema": { + "description": "The segment slug", + "type": "string" + } + }, + { + "name": "withMetadata", + "description": "Whether to include metadata", + "in": "query", + "required": false, + "schema": { + "type": "boolean", + "description": "Whether to include metadata", + "default": false + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + }, + "patch": { + "description": "Update an existing feature flag segment.", + "operationId": "updateFlagSegment", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Update a segment", + "tags": [ + "feature-flags" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "oneOf": [ + { + "properties": { + "description": { + "type": "string" + }, + "createdBy": { + "type": "string" + }, + "usedByFlags": { + "items": { + "type": "string" + }, + "type": "array" + }, + "usedBySegments": { + "items": { + "type": "string" + }, + "type": "array" + }, + "data": { + "properties": { + "rules": { + "items": { + "properties": { + "id": { + "type": "string" + }, + "outcome": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "all" + ] + } + }, + "required": [ + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "split" + ] + }, + "base": { + "properties": { + "type": { + "type": "string", + "enum": [ + "entity" + ] + }, + "kind": { + "type": "string" + }, + "attribute": { + "type": "string" + } + }, + "required": [ + "attribute", + "kind", + "type" + ], + "type": "object" + }, + "passPromille": { + "type": "number" + } + }, + "required": [ + "base", + "passPromille", + "type" + ], + "type": "object" + } + ] + }, + "conditions": { + "items": { + "properties": { + "rhs": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "list", + "list/inline" + ] + }, + "items": { + "items": { + "oneOf": [ + { + "properties": { + "label": { + "type": "string" + }, + "note": { + "type": "string" + }, + "value": { + "type": "number" + } + }, + "required": [ + "value" + ], + "type": "object" + }, + { + "properties": { + "label": { + "type": "string" + }, + "note": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "required": [ + "value" + ], + "type": "object" + } + ] + }, + "type": "array" + } + }, + "required": [ + "items", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "regex" + ] + }, + "pattern": { + "type": "string" + }, + "flags": { + "type": "string" + } + }, + "required": [ + "flags", + "pattern", + "type" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + } + ] + }, + "cmpOptions": { + "properties": { + "ignoreCase": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "type": "object" + }, + "lhs": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "segment" + ] + } + }, + "required": [ + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "entity" + ] + }, + "kind": { + "type": "string" + }, + "attribute": { + "type": "string" + } + }, + "required": [ + "attribute", + "kind", + "type" + ], + "type": "object" + } + ] + }, + "cmp": { + "type": "string", + "enum": [ + "!contains", + "!endsWith", + "!eq", + "!ex", + "!oneOf", + "!regex", + "!startsWith", + "after", + "before", + "contains", + "containsAllOf", + "containsAnyOf", + "containsNoneOf", + "endsWith", + "eq", + "ex", + "gt", + "gte", + "lt", + "lte", + "oneOf", + "regex", + "startsWith" + ] + } + }, + "required": [ + "cmp", + "lhs" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "conditions", + "id", + "outcome" + ], + "type": "object" + }, + "type": "array" + }, + "include": { + "additionalProperties": { + "additionalProperties": { + "items": { + "properties": { + "note": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "required": [ + "value" + ], + "type": "object" + }, + "type": "array" + }, + "type": "object" + }, + "type": "object" + }, + "exclude": { + "additionalProperties": { + "additionalProperties": { + "items": { + "properties": { + "note": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "required": [ + "value" + ], + "type": "object" + }, + "type": "array" + }, + "type": "object" + }, + "type": "object" + } + }, + "type": "object" + }, + "id": { + "type": "string" + }, + "label": { + "type": "string" + }, + "slug": { + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "updatedAt": { + "type": "number" + }, + "projectId": { + "type": "string" + }, + "typeName": { + "type": "string", + "enum": [ + "segment" + ] + }, + "hint": { + "type": "string" + } + }, + "required": [ + "createdAt", + "data", + "hint", + "id", + "label", + "projectId", + "slug", + "typeName", + "updatedAt" + ], + "type": "object" + }, + { + "$ref": "#/components/schemas/Segment" + } + ] + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid.\nOne of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "402": { + "description": "The account is missing a payment so payment method must be updated" + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "409": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "projectIdOrName", + "description": "The project id or name", + "in": "path", + "required": true, + "schema": { + "description": "The project id or name", + "type": "string" + } + }, + { + "name": "segmentIdOrSlug", + "description": "The segment slug", + "in": "path", + "required": true, + "schema": { + "description": "The segment slug", + "type": "string" + } + }, + { + "name": "withMetadata", + "description": "Whether to include metadata", + "in": "query", + "required": false, + "schema": { + "type": "boolean", + "description": "Whether to include metadata", + "default": false + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "additionalProperties": false, + "properties": { + "operations": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "action": { + "type": "string", + "enum": [ + "add", + "remove" + ] + }, + "field": { + "type": "string", + "enum": [ + "include", + "exclude" + ] + }, + "entity": { + "type": "string" + }, + "attribute": { + "type": "string" + }, + "value": { + "type": "object", + "additionalProperties": false, + "properties": { + "note": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "required": [ + "value" + ] + } + }, + "required": [ + "action", + "field", + "entity", + "attribute", + "value" + ] + } + }, + "label": { + "type": "string" + }, + "description": { + "type": "string" + }, + "data": { + "type": "object", + "additionalProperties": false, + "description": "The data of the segment", + "properties": { + "rules": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "id": { + "type": "string" + }, + "conditions": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "lhs": { + "anyOf": [ + { + "type": "object", + "additionalProperties": false, + "properties": { + "type": {} + }, + "required": [ + "type" + ] + }, + { + "type": "object", + "additionalProperties": false, + "properties": { + "type": {}, + "kind": { + "type": "string" + }, + "attribute": { + "type": "string" + } + }, + "required": [ + "type", + "kind", + "attribute" + ] + } + ] + }, + "cmp": { + "type": "string", + "enum": [ + "eq", + "!eq", + "oneOf", + "!oneOf", + "containsAllOf", + "containsAnyOf", + "containsNoneOf", + "startsWith", + "!startsWith", + "endsWith", + "!endsWith", + "contains", + "!contains", + "ex", + "!ex", + "gt", + "gte", + "lt", + "lte", + "regex", + "!regex", + "before", + "after" + ] + }, + "rhs": { + "anyOf": [ + { + "type": "object", + "additionalProperties": false, + "properties": { + "type": { + "type": "string", + "enum": [ + "list/inline", + "list" + ] + }, + "items": { + "type": "array", + "items": { + "anyOf": [ + { + "type": "object", + "additionalProperties": false, + "properties": { + "label": { + "type": "string" + }, + "note": { + "type": "string" + }, + "value": { + "type": "number" + } + }, + "required": [ + "value" + ] + }, + { + "type": "object", + "additionalProperties": false, + "properties": { + "label": { + "type": "string" + }, + "note": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "required": [ + "value" + ] + } + ] + }, + "maxItems": 10000 + } + }, + "required": [ + "type", + "items" + ] + }, + { + "type": "object", + "additionalProperties": false, + "properties": { + "type": {}, + "pattern": { + "type": "string" + }, + "flags": { + "type": "string" + } + }, + "required": [ + "type", + "pattern", + "flags" + ] + }, + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + } + ] + }, + "cmpOptions": { + "type": "object", + "additionalProperties": false, + "properties": { + "ignoreCase": { + "type": "boolean" + } + } + } + }, + "required": [ + "lhs", + "cmp" + ] + } + }, + "outcome": { + "anyOf": [ + { + "type": "object", + "additionalProperties": false, + "properties": { + "type": {} + }, + "required": [ + "type" + ] + }, + { + "type": "object", + "additionalProperties": false, + "properties": { + "type": {}, + "base": { + "type": "object", + "additionalProperties": false, + "properties": { + "type": {}, + "kind": { + "type": "string" + }, + "attribute": { + "type": "string" + } + }, + "required": [ + "type", + "kind", + "attribute" + ] + }, + "passPromille": { + "type": "number" + } + }, + "required": [ + "type", + "base", + "passPromille" + ] + } + ] + } + }, + "required": [ + "conditions", + "outcome", + "id" + ] + }, + "maxItems": 10000 + }, + "include": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "note": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "required": [ + "value" + ] + }, + "maxItems": 10000 + } + } + }, + "exclude": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "note": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "required": [ + "value" + ] + }, + "maxItems": 10000 + } + } + } + } + }, + "hint": { + "type": "string" + } + } + } + } + } + } + } + }, + "/v1/deployments/{deploymentId}/feature-flags": { + "get": { + "description": "Retrieve the feature flags of a deployment.", + "operationId": "getDeploymentFeatureFlags", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Retrieve the feature flags of a deployment", + "tags": [ + "feature-flags" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "flags": { + "items": { + "type": "object" + }, + "type": "array" + }, + "status": { + "nullable": true, + "properties": { + "deploymentId": { + "type": "string" + }, + "projectId": { + "type": "string" + }, + "responseStatus": { + "type": "number", + "description": "The HTTP status code from the flags discovery endpoint." + }, + "flagCount": { + "type": "number", + "description": "The number of flag definitions returned by the flags discovery endpoint." + }, + "createdAt": { + "type": "number" + } + }, + "required": [ + "createdAt", + "deploymentId", + "flagCount", + "projectId", + "responseStatus" + ], + "type": "object" + } + }, + "required": [ + "flags", + "status" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "deploymentId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + } + }, + "/v1/projects/{projectIdOrName}/feature-flags/sdk-keys": { + "get": { + "description": "Gets all SDK keys for a project.", + "operationId": "getSdkKeys", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Get all SDK keys", + "tags": [ + "feature-flags" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "data": { + "items": { + "properties": { + "hashKey": { + "type": "string" + }, + "projectId": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "client", + "mobile", + "server" + ] + }, + "environment": { + "type": "string" + }, + "createdBy": { + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "updatedAt": { + "type": "number" + }, + "label": { + "type": "string" + }, + "deletedAt": { + "type": "number" + }, + "partialKeyValue": { + "type": "string", + "description": "Partially-masked representation of the SDK key value, safe to display in UIs. The value is the `vf_\u003ctype\u003e_` prefix followed by the first 3 characters of the secret portion and a fixed 8-character `*` mask (e.g. `vf_server_abc********`)." + } + }, + "required": [ + "createdAt", + "createdBy", + "environment", + "hashKey", + "partialKeyValue", + "projectId", + "type", + "updatedAt" + ], + "type": "object", + "description": "Shared metadata for a Flags SDK key, safe to return on both LIST and CREATE. Never contains cleartext secrets." + }, + "type": "array" + } + }, + "required": [ + "data" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "402": { + "description": "The account is missing a payment so payment method must be updated" + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "projectIdOrName", + "description": "The project id or name", + "in": "path", + "required": true, + "schema": { + "description": "The project id or name", + "type": "string" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + }, + "put": { + "description": "Creates an SDK key.", + "operationId": "createSdkKey", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Create an SDK key", + "tags": [ + "feature-flags" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FlagsSdkKeyWithSecrets" + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid.\nOne of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "402": { + "description": "The account is missing a payment so payment method must be updated" + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "409": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "projectIdOrName", + "description": "The project id or name", + "in": "path", + "required": true, + "schema": { + "description": "The project id or name", + "type": "string" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "additionalProperties": false, + "required": [ + "sdkKeyType", + "environment" + ], + "properties": { + "sdkKeyType": { + "type": "string", + "enum": [ + "server", + "mobile", + "client" + ] + }, + "environment": { + "type": "string" + }, + "label": { + "type": "string" + } + } + } + } + } + } + } + }, + "/v1/projects/{projectIdOrName}/feature-flags/sdk-keys/{hashKey}": { + "delete": { + "description": "Deletes an SDK key.", + "operationId": "deleteSdkKey", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Delete an SDK key", + "tags": [ + "feature-flags" + ], + "responses": { + "204": { + "description": "" + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "402": { + "description": "The account is missing a payment so payment method must be updated" + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "409": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "projectIdOrName", + "description": "The project id or name", + "in": "path", + "required": true, + "schema": { + "type": "string", + "description": "The project id or name" + } + }, + { + "name": "hashKey", + "description": "The SDK key hash key to delete", + "in": "path", + "required": true, + "schema": { + "type": "string", + "description": "The SDK key hash key to delete" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + } + }, + "/v1/integrations/git-namespaces": { + "get": { + "description": "Lists git namespaces for a supported provider. Supported providers are `github`, `gitlab` and `bitbucket`. If the provider is not provided, it will try to obtain it from the user that authenticated the request.", + "operationId": "gitNamespaces", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "List git namespaces by provider", + "tags": [ + "integrations" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "items": { + "properties": { + "provider": { + "type": "string" + }, + "slug": { + "type": "string" + }, + "id": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "ownerType": { + "type": "string" + }, + "name": { + "type": "string" + }, + "isAccessRestricted": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "installationId": { + "type": "number" + }, + "requireReauth": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "viewer": { + "properties": { + "canCreateApp": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "role": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + } + }, + "type": "object" + } + }, + "required": [ + "id", + "ownerType", + "provider", + "slug" + ], + "type": "object" + }, + "type": "array" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "" + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + }, + "429": { + "description": "" + }, + "500": { + "description": "" + } + }, + "parameters": [ + { + "name": "host", + "description": "The custom Git host if using a custom Git provider, like GitHub Enterprise Server", + "in": "query", + "schema": { + "description": "The custom Git host if using a custom Git provider, like GitHub Enterprise Server", + "type": "string", + "example": "ghes-test.now.systems" + } + }, + { + "name": "provider", + "in": "query", + "schema": { + "enum": [ + "github", + "github-limited", + "github-custom-host", + "gitlab", + "bitbucket" + ] + } + }, + { + "name": "viewerMetadata", + "description": "When true, includes the viewer object for each namespace.", + "in": "query", + "schema": { + "description": "When true, includes the viewer object for each namespace.", + "type": "boolean" + } + } + ] + } + }, + "/v1/integrations/search-repo": { + "get": { + "description": "Lists git repositories linked to a namespace `id` for a supported provider. A specific namespace `id` can be obtained via the `git-namespaces` endpoint. Supported providers are `github`, `gitlab` and `bitbucket`. If the provider or namespace is not provided, it will try to obtain it from the user that authenticated the request.", + "operationId": "searchRepo", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "List git repositories linked to namespace by provider", + "tags": [ + "integrations" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "oneOf": [ + { + "type": "object" + }, + { + "properties": { + "error": { + "properties": { + "code": { + "type": "string", + "enum": [ + "installation_not_found" + ] + }, + "message": { + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" + } + }, + "required": [ + "error" + ], + "type": "object" + }, + { + "properties": { + "gitAccount": { + "properties": { + "provider": { + "type": "string" + }, + "namespaceId": { + "nullable": true, + "type": "string" + } + }, + "required": [ + "namespaceId", + "provider" + ], + "type": "object" + }, + "repos": { + "items": { + "properties": { + "id": { + "type": "string" + }, + "provider": { + "type": "string", + "enum": [ + "cursor-origin" + ] + }, + "url": { + "type": "string" + }, + "name": { + "type": "string" + }, + "slug": { + "type": "string" + }, + "namespace": { + "type": "string" + }, + "ownerType": { + "type": "string", + "enum": [ + "team", + "user" + ] + }, + "owner": { + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + } + }, + "required": [ + "id", + "name" + ], + "type": "object" + }, + "private": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "defaultBranch": { + "type": "string" + }, + "updatedAt": { + "type": "number" + } + }, + "required": [ + "defaultBranch", + "id", + "name", + "namespace", + "owner", + "ownerType", + "private", + "provider", + "slug", + "updatedAt", + "url" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "gitAccount", + "repos" + ], + "type": "object" + }, + { + "properties": { + "gitAccount": { + "properties": { + "provider": { + "type": "string", + "enum": [ + "bitbucket", + "cursor-origin", + "github", + "github-custom-host", + "github-limited", + "gitlab", + "vercel" + ] + }, + "namespaceId": { + "nullable": true, + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + } + }, + "required": [ + "namespaceId", + "provider" + ], + "type": "object" + }, + "repos": { + "items": { + "properties": { + "id": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "provider": { + "type": "string", + "enum": [ + "bitbucket", + "cursor-origin", + "github", + "github-custom-host", + "github-limited", + "gitlab", + "vercel" + ] + }, + "url": { + "type": "string" + }, + "name": { + "type": "string" + }, + "slug": { + "type": "string" + }, + "namespace": { + "type": "string" + }, + "owner": { + "properties": { + "id": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "name": { + "type": "string" + } + }, + "required": [ + "id", + "name" + ], + "type": "object" + }, + "ownerType": { + "type": "string", + "enum": [ + "team", + "user" + ] + }, + "private": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "defaultBranch": { + "type": "string" + }, + "updatedAt": { + "type": "number" + } + }, + "required": [ + "defaultBranch", + "id", + "name", + "namespace", + "owner", + "ownerType", + "private", + "provider", + "slug", + "updatedAt", + "url" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "gitAccount", + "repos" + ], + "type": "object" + } + ] + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "" + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + }, + "429": { + "description": "" + }, + "500": { + "description": "" + }, + "502": { + "description": "" + } + }, + "parameters": [ + { + "name": "query", + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "namespaceId", + "in": "query", + "schema": { + "nullable": true, + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + } + }, + { + "name": "provider", + "in": "query", + "schema": { + "enum": [ + "github", + "github-limited", + "github-custom-host", + "gitlab", + "bitbucket", + "cursor-origin" + ] + } + }, + { + "name": "installationId", + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "host", + "description": "The custom Git host if using a custom Git provider, like GitHub Enterprise Server", + "in": "query", + "schema": { + "description": "The custom Git host if using a custom Git provider, like GitHub Enterprise Server", + "type": "string", + "example": "ghes-test.now.systems" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + } + }, + "/v1/integrations/integration/{integrationIdOrSlug}/products/{productIdOrSlug}/plans": { + "get": { + "description": "Get a list of billing plans for an integration and product.", + "operationId": "getBillingPlans", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "List integration billing plans", + "tags": [ + "integrations" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "plans": { + "items": { + "properties": { + "type": { + "type": "string", + "enum": [ + "prepayment", + "subscription" + ] + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "scope": { + "type": "string", + "enum": [ + "installation", + "resource" + ] + }, + "description": { + "type": "string" + }, + "paymentMethodRequired": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "preauthorizationAmount": { + "type": "number" + }, + "initialCharge": { + "type": "string" + }, + "minimumAmount": { + "type": "string" + }, + "maximumAmount": { + "type": "string" + }, + "maximumAmountAutoPurchasePerPeriod": { + "type": "string" + }, + "cost": { + "type": "string" + }, + "details": { + "items": { + "properties": { + "label": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "required": [ + "label" + ], + "type": "object" + }, + "type": "array" + }, + "highlightedDetails": { + "items": { + "properties": { + "label": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "required": [ + "label" + ], + "type": "object" + }, + "type": "array" + }, + "quote": { + "items": { + "properties": { + "line": { + "type": "string" + }, + "amount": { + "type": "string" + } + }, + "required": [ + "amount", + "line" + ], + "type": "object" + }, + "type": "array" + }, + "effectiveDate": { + "type": "string" + }, + "disabled": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "description", + "id", + "name", + "paymentMethodRequired", + "scope", + "type" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "plans" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "integrationIdOrSlug", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "integrationConfigurationId", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "productIdOrSlug", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "metadata", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "source", + "in": "query", + "required": false, + "schema": { + "type": "string", + "enum": [ + "marketplace", + "deploy-button", + "external", + "v0", + "resource-claims", + "cli", + "oauth", + "backoffice", + "import-recommended-integrations", + "organization" + ] + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + } + }, + "/v1/integrations/installations/{integrationConfigurationId}/resources/{resourceId}/connections": { + "post": { + "description": "Connects an integration resource to a Vercel project. This endpoint establishes a connection between a provisioned integration resource (from storage APIs like `POST /v1/storage/stores/integration/direct`) and a specific Vercel project.", + "operationId": "connectIntegrationResourceToProject", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Connect integration resource to project", + "tags": [ + "integrations" + ], + "responses": { + "201": { + "description": "" + }, + "400": { + "description": "One of the provided values in the request body is invalid.\nOne of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "integrationConfigurationId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "resourceId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "projectId" + ], + "properties": { + "projectId": { + "type": "string" + }, + "envVarEnvironments": { + "type": "array", + "items": { + "type": "string", + "enum": [ + "production", + "preview", + "development" + ] + } + }, + "makeEnvVarsSensitive": { + "type": "boolean" + } + } + } + } + } + } + } + }, + "/v1/installations/{integrationConfigurationId}": { + "patch": { + "description": "This endpoint updates an integration installation.", + "operationId": "update-installation", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Update Installation", + "tags": [ + "marketplace" + ], + "responses": { + "204": { + "description": "" + }, + "400": { + "description": "One of the provided values in the request body is invalid.\nOne of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "integrationConfigurationId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "status": { + "type": "string", + "enum": [ + "ready", + "pending", + "onboarding", + "suspended", + "resumed", + "uninstalled", + "error" + ] + }, + "externalId": { + "type": "string" + }, + "billingPlan": { + "type": "object", + "required": [ + "id", + "type", + "name" + ], + "properties": { + "id": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "prepayment", + "subscription" + ] + }, + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "paymentMethodRequired": { + "type": "boolean" + }, + "cost": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "label": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "required": [ + "label" + ], + "additionalProperties": false + } + }, + "highlightedDetails": { + "type": "array", + "items": { + "type": "object", + "properties": { + "label": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "required": [ + "label" + ], + "additionalProperties": false + } + }, + "effectiveDate": { + "type": "string" + } + }, + "additionalProperties": true + }, + "notification": { + "oneOf": [ + { + "type": "object", + "required": [ + "level", + "title" + ], + "properties": { + "level": { + "type": "string", + "enum": [ + "info", + "warn", + "error" + ] + }, + "title": { + "type": "string" + }, + "message": { + "type": "string" + }, + "href": { + "type": "string", + "format": "uri", + "pattern": "^https?://|^sso:" + } + } + }, + { + "type": "string" + } + ], + "description": "A notification to display to your customer. Send `null` to clear the current notification." + } + }, + "additionalProperties": false + } + } + } + } + } + }, + "/v1/installations/{integrationConfigurationId}/account": { + "get": { + "description": "Fetches the best account or user’s contact info", + "operationId": "get-account-info", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Get Account Information", + "tags": [ + "marketplace" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "name": { + "type": "string", + "description": "The name of the team the installation is tied to." + }, + "url": { + "type": "string", + "description": "A URL linking to the installation in the Vercel Dashboard." + }, + "contact": { + "nullable": true, + "properties": { + "email": { + "type": "string" + }, + "name": { + "type": "string" + } + }, + "required": [ + "email" + ], + "type": "object", + "description": "The best contact for the integration, which can change as team members and their roles change." + } + }, + "required": [ + "contact", + "url" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "integrationConfigurationId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ] + } + }, + "/v1/installations/{integrationConfigurationId}/member/{memberId}": { + "get": { + "description": "Returns the member role and other information for a given member ID (\"user_id\" claim in the SSO OIDC token).", + "operationId": "get-member", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Get Member Information", + "tags": [ + "marketplace" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "id": { + "type": "string" + }, + "role": { + "type": "string", + "enum": [ + "ADMIN", + "USER" + ], + "description": "\"The `ADMIN` role, by default, is provided to users capable of installing integrations, while the `USER` role can be granted to Vercel users with the Vercel `Billing` or Vercel `Viewer` role, which are considered to be Read-Only roles.\"" + }, + "globalUserId": { + "type": "string" + }, + "userEmail": { + "type": "string" + } + }, + "required": [ + "id", + "role" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "integrationConfigurationId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "memberId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ] + } + }, + "/v1/installations/{integrationConfigurationId}/credentials/rotate": { + "post": { + "description": "Issues a replacement access token for an installation, so a partner can rotate a credential it believes is compromised without the customer having to reinstall. Authenticated by the credential being replaced plus the integration's client secret: a leaked access token on its own cannot rotate itself, which would otherwise let an attacker take over the installation and lock the partner out. The previous credential intentionally stays valid so in-flight requests keep working. Retiring it is a separate, explicit operation — a partner is never left mid-rotation without a working credential.", + "operationId": "rotate-installation-credential", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Rotate Installation Credential", + "tags": [ + "marketplace" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "scope": { + "type": "string" + }, + "expires_in": { + "type": "number" + }, + "access_token": { + "type": "string" + }, + "token_type": { + "type": "string", + "enum": [ + "oauth2-token" + ] + } + }, + "required": [ + "access_token", + "expires_in", + "scope", + "token_type" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid.\nOne of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "409": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "integrationConfigurationId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "client_secret" + ], + "properties": { + "client_secret": { + "type": "string", + "maxLength": 512 + }, + "client_id": { + "type": "string" + } + }, + "additionalProperties": false + } + } + } + } + } + }, + "/v1/installations/{integrationConfigurationId}/credentials/revoke": { + "post": { + "description": "Retires a superseded installation credential, so a partner can complete a rotation it started with `POST /credentials/rotate` — the leaked credential stops working without the customer having to reinstall. Authenticated by a live installation credential plus the integration's client secret. The credential to retire is named in the body rather than being the one that authenticates, so the ordinary flow is: rotate, store the replacement, then authenticate with the replacement and revoke the old one. Refuses to retire an installation's last live credential. Rotation exists so remediation is not customer-visible; revoking the only credential would undo that and leave the install needing a reinstall.", + "operationId": "revoke-installation-credential", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Revoke Installation Credential", + "tags": [ + "marketplace" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "revoked": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "already_revoked": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "already_revoked", + "revoked" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid.\nOne of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "409": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "integrationConfigurationId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "token", + "client_secret" + ], + "properties": { + "token": { + "type": "string", + "maxLength": 512 + }, + "client_secret": { + "type": "string", + "maxLength": 512 + }, + "client_id": { + "type": "string" + } + }, + "additionalProperties": false + } + } + } + } + } + }, + "/v1/installations/{integrationConfigurationId}/events": { + "post": { + "description": "Partner notifies Vercel of any changes made to an Installation or a Resource. Vercel is expected to use `list-resources` and other read APIs to get the new state.\u003cbr/\u003e \u003cbr/\u003e `resource.updated` event should be dispatched when any state of a resource linked to Vercel is modified by the partner.\u003cbr/\u003e `installation.updated` event should be dispatched when an installation's billing plan is changed via the provider instead of Vercel.\u003cbr/\u003e \u003cbr/\u003e Resource update use cases: \u003cbr/\u003e \u003cbr/\u003e - The user renames a database in the partner’s application. The partner should dispatch a `resource.updated` event to notify Vercel to update the resource in Vercel’s datastores.\u003cbr/\u003e - A resource has been suspended due to a lack of use. The partner should dispatch a `resource.updated` event to notify Vercel to update the resource's status in Vercel's datastores.\u003cbr/\u003e", + "operationId": "create-event", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Create Event", + "tags": [ + "marketplace" + ], + "responses": { + "201": { + "description": "" + }, + "400": { + "description": "One of the provided values in the request body is invalid.\nOne of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "integrationConfigurationId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "event" + ], + "properties": { + "event": { + "oneOf": [ + { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "installation.updated" + ] + }, + "billingPlanId": { + "type": "string", + "description": "The installation-level billing plan ID" + } + }, + "required": [ + "type" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "resource.updated" + ] + }, + "productId": { + "type": "string", + "description": "Partner-provided product slug or id" + }, + "resourceId": { + "type": "string", + "description": "Partner provided resource ID" + } + }, + "required": [ + "type", + "resourceId" + ], + "additionalProperties": false + } + ] + } + }, + "additionalProperties": false + } + } + }, + "required": true + } + } + }, + "/v1/installations/{integrationConfigurationId}/resources": { + "get": { + "description": "Get all resources for a given installation ID.", + "operationId": "get-integration-resources", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Get Integration Resources", + "tags": [ + "marketplace" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "resources": { + "items": { + "properties": { + "partnerId": { + "type": "string", + "description": "The ID provided by the partner for the given resource" + }, + "internalId": { + "type": "string", + "description": "The ID assigned by Vercel for the given resource" + }, + "name": { + "type": "string", + "description": "The name of the resource as it is recorded in Vercel" + }, + "status": { + "type": "string", + "enum": [ + "error", + "onboarding", + "pending", + "ready", + "resumed", + "suspended", + "uninstalled" + ], + "description": "The current status of the resource" + }, + "productId": { + "type": "string", + "description": "The ID of the product the resource is derived from" + }, + "protocolSettings": { + "properties": { + "experimentation": { + "properties": { + "edgeConfigSyncingEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "edgeConfigId": { + "type": "string" + }, + "globalConfigId": { + "type": "string" + }, + "globalConfigSyncingEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "edgeConfigTokenId": { + "type": "string" + } + }, + "type": "object" + }, + "authentication": { + "properties": { + "appUrls": { + "items": { + "properties": { + "url": { + "type": "string" + }, + "target": { + "type": "string", + "enum": [ + "development", + "preview", + "production" + ] + } + }, + "required": [ + "target", + "url" + ], + "type": "object" + }, + "type": "array" + } + }, + "type": "object" + } + }, + "type": "object", + "description": "Any settings provided for the resource to support its product's protocols" + }, + "notification": { + "properties": { + "title": { + "type": "string" + }, + "level": { + "type": "string", + "enum": [ + "error", + "info", + "warn" + ] + }, + "message": { + "type": "string" + }, + "href": { + "type": "string" + } + }, + "required": [ + "level", + "title" + ], + "type": "object", + "description": "The notification, if set, displayed to the user when viewing the resource in Vercel" + }, + "billingPlanId": { + "type": "string", + "description": "The ID of the billing plan the resource is subscribed to, if applicable" + }, + "metadata": { + "additionalProperties": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "items": { + "type": "string" + }, + "type": "array", + "description": "The configured metadata for the resource as defined by its product's Metadata Schema" + }, + { + "items": { + "type": "number" + }, + "type": "array", + "description": "The configured metadata for the resource as defined by its product's Metadata Schema" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + } + ] + }, + "type": "object", + "description": "The configured metadata for the resource as defined by its product's Metadata Schema" + } + }, + "required": [ + "internalId", + "name", + "partnerId", + "productId" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "resources" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "integrationConfigurationId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ] + } + }, + "/v1/installations/{integrationConfigurationId}/resources/{resourceId}": { + "get": { + "description": "Get a resource by its partner ID.", + "operationId": "get-integration-resource", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Get Integration Resource", + "tags": [ + "marketplace" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "id": { + "type": "string", + "description": "The ID provided by the 3rd party provider for the given resource" + }, + "internalId": { + "type": "string", + "description": "The ID assigned by Vercel for the given resource" + }, + "name": { + "type": "string", + "description": "The name of the resource as it is recorded in Vercel" + }, + "status": { + "type": "string", + "enum": [ + "error", + "onboarding", + "pending", + "ready", + "resumed", + "suspended", + "uninstalled" + ], + "description": "The current status of the resource" + }, + "productId": { + "type": "string", + "description": "The ID of the product the resource is derived from" + }, + "protocolSettings": { + "properties": { + "experimentation": { + "properties": { + "edgeConfigId": { + "type": "string" + }, + "globalConfigId": { + "type": "string" + } + }, + "type": "object" + }, + "authentication": { + "properties": { + "appUrls": { + "items": { + "properties": { + "url": { + "type": "string" + }, + "target": { + "type": "string", + "enum": [ + "development", + "preview", + "production" + ] + } + }, + "required": [ + "target", + "url" + ], + "type": "object" + }, + "type": "array" + } + }, + "type": "object" + } + }, + "type": "object", + "description": "Any settings provided for the resource to support its product's protocols" + }, + "notification": { + "properties": { + "title": { + "type": "string" + }, + "level": { + "type": "string", + "enum": [ + "error", + "info", + "warn" + ] + }, + "message": { + "type": "string" + }, + "href": { + "type": "string" + } + }, + "required": [ + "level", + "title" + ], + "type": "object", + "description": "The notification, if set, displayed to the user when viewing the resource in Vercel" + }, + "billingPlanId": { + "type": "string", + "description": "The ID of the billing plan the resource is subscribed to, if applicable" + }, + "metadata": { + "additionalProperties": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "items": { + "type": "string" + }, + "type": "array", + "description": "The configured metadata for the resource as defined by its product's Metadata Schema" + }, + { + "items": { + "type": "number" + }, + "type": "array", + "description": "The configured metadata for the resource as defined by its product's Metadata Schema" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + } + ] + }, + "type": "object", + "description": "The configured metadata for the resource as defined by its product's Metadata Schema" + } + }, + "required": [ + "id", + "internalId", + "name", + "productId" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "integrationConfigurationId", + "description": "The ID of the integration configuration (installation) the resource belongs to", + "in": "path", + "required": true, + "schema": { + "type": "string", + "description": "The ID of the integration configuration (installation) the resource belongs to" + } + }, + { + "name": "resourceId", + "description": "The ID provided by the 3rd party provider for the given resource", + "in": "path", + "required": true, + "schema": { + "type": "string", + "description": "The ID provided by the 3rd party provider for the given resource" + } + } + ] + }, + "delete": { + "description": "Delete a resource owned by the selected installation ID.", + "operationId": "delete-integration-resource", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Delete Integration Resource", + "tags": [ + "marketplace" + ], + "responses": { + "204": { + "description": "" + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "integrationConfigurationId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "resourceId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ] + }, + "put": { + "description": "This endpoint imports (upserts) a resource to Vercel's installation. This may be needed if resources can be independently created on the partner's side and need to be synchronized to Vercel. When importing as part of the user-initiated import flow, call this endpoint before redirecting the user back to Vercel. See the [Import existing resources flow](https://vercel.com/docs/integrations/create-integration/marketplace-flows#import-existing-resources-flow) for the full contract.", + "operationId": "import-resource", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Import Resource", + "tags": [ + "marketplace" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "name": { + "type": "string" + } + }, + "required": [ + "name" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid.\nOne of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "409": { + "description": "" + }, + "410": { + "description": "" + }, + "422": { + "description": "" + } + }, + "parameters": [ + { + "name": "integrationConfigurationId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "resourceId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "productId", + "name", + "status" + ], + "properties": { + "ownership": { + "type": "string", + "enum": [ + "owned", + "linked", + "sandbox" + ] + }, + "productId": { + "type": "string" + }, + "name": { + "type": "string" + }, + "status": { + "type": "string", + "enum": [ + "ready", + "pending", + "onboarding", + "suspended", + "resumed", + "uninstalled", + "error" + ] + }, + "metadata": { + "type": "object", + "additionalProperties": true + }, + "billingPlan": { + "type": "object", + "required": [ + "id", + "type", + "name" + ], + "properties": { + "id": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "prepayment", + "subscription" + ] + }, + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "paymentMethodRequired": { + "type": "boolean" + }, + "cost": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "label": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "required": [ + "label" + ], + "additionalProperties": false + } + }, + "highlightedDetails": { + "type": "array", + "items": { + "type": "object", + "properties": { + "label": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "required": [ + "label" + ], + "additionalProperties": false + } + }, + "effectiveDate": { + "type": "string" + } + }, + "additionalProperties": true + }, + "notification": { + "type": "object", + "required": [ + "level", + "title" + ], + "properties": { + "level": { + "type": "string", + "enum": [ + "info", + "warn", + "error" + ] + }, + "title": { + "type": "string" + }, + "message": { + "type": "string" + }, + "href": { + "type": "string", + "format": "uri", + "pattern": "^https?://|^sso:" + } + } + }, + "extras": { + "type": "object", + "additionalProperties": true + }, + "secrets": { + "type": "array", + "items": { + "type": "object", + "required": [ + "name", + "value" + ], + "properties": { + "name": { + "type": "string" + }, + "value": { + "type": "string" + }, + "prefix": { + "type": "string" + }, + "environmentOverrides": { + "type": "object", + "description": "A map of environments to override values for the secret, used for setting different values across deployments in production, preview, and development environments. Note: the same value will be used for all deployments in the given environment.", + "properties": { + "development": { + "type": "string", + "description": "Value used for development environment." + }, + "preview": { + "type": "string", + "description": "Value used for preview environment." + }, + "production": { + "type": "string", + "description": "Value used for production environment." + } + } + } + }, + "additionalProperties": false + } + } + }, + "additionalProperties": false + } + } + } + } + }, + "patch": { + "description": "This endpoint updates an existing resource in the installation. All parameters are optional, allowing partial updates.", + "operationId": "update-resource", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Update Resource", + "tags": [ + "marketplace" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "name": { + "type": "string" + } + }, + "required": [ + "name" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid.\nOne of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "409": { + "description": "" + }, + "410": { + "description": "" + }, + "422": { + "description": "" + } + }, + "parameters": [ + { + "name": "integrationConfigurationId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "resourceId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "ownership": { + "type": "string", + "enum": [ + "owned", + "linked", + "sandbox" + ] + }, + "name": { + "type": "string" + }, + "status": { + "type": "string", + "enum": [ + "ready", + "pending", + "onboarding", + "suspended", + "resumed", + "uninstalled", + "error" + ] + }, + "metadata": { + "type": "object", + "additionalProperties": true + }, + "billingPlan": { + "type": "object", + "required": [ + "id", + "type", + "name" + ], + "properties": { + "id": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "prepayment", + "subscription" + ] + }, + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "paymentMethodRequired": { + "type": "boolean" + }, + "cost": { + "type": "string" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "label": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "required": [ + "label" + ], + "additionalProperties": false + } + }, + "highlightedDetails": { + "type": "array", + "items": { + "type": "object", + "properties": { + "label": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "required": [ + "label" + ], + "additionalProperties": false + } + }, + "effectiveDate": { + "type": "string" + } + }, + "additionalProperties": true + }, + "notification": { + "oneOf": [ + { + "type": "object", + "required": [ + "level", + "title" + ], + "properties": { + "level": { + "type": "string", + "enum": [ + "info", + "warn", + "error" + ] + }, + "title": { + "type": "string" + }, + "message": { + "type": "string" + }, + "href": { + "type": "string", + "format": "uri", + "pattern": "^https?://|^sso:" + } + } + }, + { + "type": "string" + } + ] + }, + "extras": { + "type": "object", + "additionalProperties": true + }, + "secrets": { + "oneOf": [ + { + "type": "array", + "items": { + "type": "object", + "required": [ + "name", + "value" + ], + "properties": { + "name": { + "type": "string" + }, + "value": { + "type": "string" + }, + "prefix": { + "type": "string" + }, + "environmentOverrides": { + "type": "object", + "description": "A map of environments to override values for the secret, used for setting different values across deployments in production, preview, and development environments. Note: the same value will be used for all deployments in the given environment.", + "properties": { + "development": { + "type": "string", + "description": "Value used for development environment." + }, + "preview": { + "type": "string", + "description": "Value used for preview environment." + }, + "production": { + "type": "string", + "description": "Value used for production environment." + } + } + } + }, + "additionalProperties": false + } + }, + { + "type": "object", + "required": [ + "secrets" + ], + "properties": { + "secrets": { + "type": "array", + "items": { + "type": "object", + "required": [ + "name", + "value" + ], + "properties": { + "name": { + "type": "string" + }, + "value": { + "type": "string" + }, + "prefix": { + "type": "string" + }, + "environmentOverrides": { + "type": "object", + "description": "A map of environments to override values for the secret, used for setting different values across deployments in production, preview, and development environments. Note: the same value will be used for all deployments in the given environment.", + "properties": { + "development": { + "type": "string", + "description": "Value used for development environment." + }, + "preview": { + "type": "string", + "description": "Value used for preview environment." + }, + "production": { + "type": "string", + "description": "Value used for production environment." + } + } + } + }, + "additionalProperties": false + } + }, + "partial": { + "type": "boolean", + "description": "If true, will only overwrite the provided secrets instead of replacing all secrets." + } + }, + "additionalProperties": false + } + ] + } + }, + "additionalProperties": false + } + } + } + } + } + }, + "/v1/installations/{integrationConfigurationId}/billing": { + "post": { + "description": "Sends the billing and usage data. The partner should do this at least once a day and ideally once per hour. \u003cbr/\u003e Use the `credentials.access_token` we provided in the [Upsert Installation](#upsert-installation) body to authorize this request.", + "operationId": "submit-billing-data", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Submit Billing Data", + "tags": [ + "marketplace" + ], + "responses": { + "201": { + "description": "" + }, + "400": { + "description": "One of the provided values in the request body is invalid.\nOne of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "integrationConfigurationId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "timestamp": { + "type": "string", + "format": "date-time", + "description": "Server time of your integration, used to determine the most recent data for race conditions \u0026 updates. Only the latest usage data for a given day, week, and month will be kept." + }, + "eod": { + "type": "string", + "format": "date-time", + "description": "End of Day, the UTC datetime for when the end of the billing/usage day is in UTC time. This tells us which day the usage data is for, and also allows for your \"end of day\" to be different from UTC 00:00:00. eod must be within the period dates, and cannot be older than 24h earlier from our server's current time." + }, + "period": { + "type": "object", + "description": "Period for the billing cycle. The period end date cannot be older than 24 hours earlier than our current server's time.", + "properties": { + "start": { + "type": "string", + "format": "date-time" + }, + "end": { + "type": "string", + "format": "date-time" + } + }, + "required": [ + "start", + "end" + ], + "additionalProperties": false + }, + "billing": { + "description": "Billing data (interim invoicing data).", + "oneOf": [ + { + "type": "array", + "items": { + "type": "object", + "properties": { + "billingPlanId": { + "type": "string", + "description": "Partner's billing plan ID." + }, + "resourceId": { + "type": "string", + "description": "Partner's resource ID." + }, + "start": { + "type": "string", + "format": "date-time", + "description": "Start and end are only needed if different from the period's start/end." + }, + "end": { + "type": "string", + "format": "date-time", + "description": "Start and end are only needed if different from the period's start/end." + }, + "name": { + "type": "string", + "description": "Line item name." + }, + "details": { + "type": "string", + "description": "Line item details." + }, + "price": { + "type": "string", + "pattern": "^[0-9]+(\\.[0-9]+)?$", + "description": "Price per unit." + }, + "quantity": { + "type": "number", + "description": "Quantity of units." + }, + "units": { + "type": "string", + "description": "Units of the quantity." + }, + "total": { + "type": "string", + "pattern": "^[0-9]+(\\.[0-9]+)?$", + "description": "Total amount." + } + }, + "required": [ + "billingPlanId", + "name", + "price", + "quantity", + "units", + "total" + ], + "additionalProperties": false + } + }, + { + "type": "object", + "properties": { + "items": { + "type": "array", + "items": { + "type": "object", + "properties": { + "billingPlanId": { + "type": "string", + "description": "Partner's billing plan ID." + }, + "resourceId": { + "type": "string", + "description": "Partner's resource ID." + }, + "start": { + "type": "string", + "format": "date-time", + "description": "Start and end are only needed if different from the period's start/end." + }, + "end": { + "type": "string", + "format": "date-time", + "description": "Start and end are only needed if different from the period's start/end." + }, + "name": { + "type": "string", + "description": "Line item name." + }, + "details": { + "type": "string", + "description": "Line item details." + }, + "price": { + "type": "string", + "pattern": "^[0-9]+(\\.[0-9]+)?$", + "description": "Price per unit." + }, + "quantity": { + "type": "number", + "description": "Quantity of units." + }, + "units": { + "type": "string", + "description": "Units of the quantity." + }, + "total": { + "type": "string", + "pattern": "^[0-9]+(\\.[0-9]+)?$", + "description": "Total amount." + } + }, + "required": [ + "billingPlanId", + "name", + "price", + "quantity", + "units", + "total" + ], + "additionalProperties": false + } + }, + "discounts": { + "type": "array", + "items": { + "type": "object", + "properties": { + "billingPlanId": { + "type": "string", + "description": "Partner's billing plan ID." + }, + "resourceId": { + "type": "string", + "description": "Partner's resource ID." + }, + "start": { + "type": "string", + "format": "date-time", + "description": "Start and end are only needed if different from the period's start/end." + }, + "end": { + "type": "string", + "format": "date-time", + "description": "Start and end are only needed if different from the period's start/end." + }, + "name": { + "type": "string", + "description": "Discount name." + }, + "details": { + "type": "string", + "description": "Discount details." + }, + "amount": { + "type": "string", + "pattern": "^[0-9]+(\\.[0-9]+)?$", + "description": "Discount amount." + } + }, + "required": [ + "billingPlanId", + "name", + "amount" + ], + "additionalProperties": false + } + } + }, + "required": [ + "items" + ] + } + ] + }, + "usage": { + "type": "array", + "items": { + "type": "object", + "properties": { + "resourceId": { + "type": "string", + "description": "Partner's resource ID." + }, + "name": { + "type": "string", + "description": "Metric name." + }, + "type": { + "type": "string", + "description": "\n Type of the metric.\n - total: measured total value, such as Database size\n - interval: usage during the period, such as i/o or number of queries.\n - rate: rate of usage, such as queries per second.\n ", + "enum": [ + "total", + "interval", + "rate" + ] + }, + "units": { + "type": "string", + "description": "Metric units. Example: \"GB\"" + }, + "dayValue": { + "type": "number", + "description": "Metric value for the day. Could be a final or an interim value for the day." + }, + "periodValue": { + "type": "number", + "description": "Metric value for the billing period. Could be a final or an interim value for the period." + }, + "planValue": { + "type": "number", + "description": "The limit value of the metric for a billing period, if a limit is defined by the plan." + } + }, + "required": [ + "name", + "type", + "units", + "dayValue", + "periodValue" + ], + "additionalProperties": false + } + } + }, + "required": [ + "timestamp", + "eod", + "period", + "billing", + "usage" + ], + "additionalProperties": false + } + } + }, + "required": true + } + } + }, + "/v1/installations/{integrationConfigurationId}/billing/invoices": { + "post": { + "description": "This endpoint allows the partner to submit an invoice to Vercel. The invoice is created in Vercel's billing system and sent to the customer. Depending on the type of billing plan, the invoice can be sent at a time of signup, at the start of the billing period, or at the end of the billing period.\u003cbr/\u003e \u003cbr/\u003e Use the `credentials.access_token` we provided in the [Upsert Installation](#upsert-installation) body to authorize this request. \u003cbr/\u003e There are several limitations to the invoice submission:\u003cbr/\u003e \u003cbr/\u003e 1. A resource can only be billed once per the billing period and the billing plan.\u003cbr/\u003e 2. The billing plan used to bill the resource must have been active for this resource during the billing period.\u003cbr/\u003e 3. The billing plan used must be a subscription plan.\u003cbr/\u003e 4. The interim usage data must be sent hourly for all types of subscriptions. See [Send subscription billing and usage data](#send-subscription-billing-and-usage-data) API on how to send interim billing and usage data.\u003cbr/\u003e 5. If provided, `externalId` must be unique for the installation.\u003cbr/\u003e", + "operationId": "submit-invoice", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Submit Invoice", + "tags": [ + "marketplace" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "invoiceId": { + "type": "string" + }, + "test": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "validationErrors": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid.\nOne of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "409": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "integrationConfigurationId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "externalId": { + "type": "string", + "description": "Partner-provided invoice identifier. If provided, it must be unique for this installation." + }, + "invoiceDate": { + "type": "string", + "format": "date-time", + "description": "Invoice date. Must be within the period's start and end." + }, + "memo": { + "type": "string", + "description": "Additional memo for the invoice." + }, + "period": { + "type": "object", + "description": "Subscription period for this billing cycle.", + "properties": { + "start": { + "type": "string", + "format": "date-time" + }, + "end": { + "type": "string", + "format": "date-time" + } + }, + "required": [ + "start", + "end" + ], + "additionalProperties": false + }, + "items": { + "type": "array", + "items": { + "type": "object", + "properties": { + "resourceId": { + "type": "string", + "description": "Partner's resource ID." + }, + "billingPlanId": { + "type": "string", + "description": "Partner's billing plan ID." + }, + "start": { + "type": "string", + "format": "date-time", + "description": "Start and end are only needed if different from the period's start/end." + }, + "end": { + "type": "string", + "format": "date-time", + "description": "Start and end are only needed if different from the period's start/end." + }, + "name": { + "type": "string" + }, + "details": { + "type": "string" + }, + "price": { + "type": "string", + "pattern": "^[0-9]+(\\.[0-9]+)?$", + "description": "Currency amount as a decimal string." + }, + "quantity": { + "type": "number" + }, + "units": { + "type": "string" + }, + "total": { + "type": "string", + "pattern": "^[0-9]+(\\.[0-9]+)?$", + "description": "Currency amount as a decimal string." + } + }, + "required": [ + "billingPlanId", + "name", + "price", + "quantity", + "units", + "total" + ], + "additionalProperties": false + } + }, + "discounts": { + "type": "array", + "items": { + "type": "object", + "properties": { + "resourceId": { + "type": "string", + "description": "Partner's resource ID." + }, + "billingPlanId": { + "type": "string", + "description": "Partner's billing plan ID." + }, + "start": { + "type": "string", + "format": "date-time", + "description": "Start and end are only needed if different from the period's start/end." + }, + "end": { + "type": "string", + "format": "date-time", + "description": "Start and end are only needed if different from the period's start/end." + }, + "name": { + "type": "string" + }, + "details": { + "type": "string" + }, + "amount": { + "type": "string", + "pattern": "^[0-9]+(\\.[0-9]+)?$", + "description": "Currency amount as a decimal string." + } + }, + "required": [ + "billingPlanId", + "name", + "amount" + ], + "additionalProperties": false + } + }, + "final": { + "type": "boolean", + "description": "Set this to `true` if this is the final invoice for the installation. Can only be set when the installation is pending deletion." + }, + "test": { + "type": "object", + "description": "Test mode", + "properties": { + "validate": { + "type": "boolean" + }, + "result": { + "type": "string", + "enum": [ + "paid", + "notpaid", + "overdue" + ] + } + }, + "additionalProperties": false + } + }, + "required": [ + "invoiceDate", + "period", + "items" + ], + "additionalProperties": false + } + } + }, + "required": true + } + } + }, + "/v1/installations/{integrationConfigurationId}/billing/finalize": { + "post": { + "description": "This endpoint allows the partner to mark an installation as finalized. This means you will not send any more invoices for the installation. Use this after a customer has requested uninstall and you have sent any remaining invoices. This will allow the uninstall process to proceed immediately after all invoices have been paid. \u003cbr/\u003e Use the `credentials.access_token` we provided in the [Upsert Installation](#upsert-installation) body to authorize this request.", + "operationId": "finalize-installation", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Finalize Installation", + "tags": [ + "marketplace" + ], + "responses": { + "204": { + "description": "" + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "integrationConfigurationId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ] + } + }, + "/v1/installations/{integrationConfigurationId}/billing/invoices/{invoiceId}": { + "get": { + "description": "Get Invoice details and status for a given invoice ID.\u003cbr/\u003e \u003cbr/\u003e See [Billing Events with Webhooks documentation](https://vercel.com/docs/integrations/create-integration/marketplace-api#working-with-billing-events-through-webhooks) on how to receive invoice events. This endpoint is used to retrieve the invoice details.", + "operationId": "get-invoice", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Get Invoice", + "tags": [ + "marketplace" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "test": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether the invoice is in the testmode (no real transaction created)." + }, + "invoiceId": { + "type": "string", + "description": "Vercel Marketplace Invoice ID." + }, + "externalId": { + "type": "string", + "description": "Partner-supplied Invoice ID, if applicable." + }, + "state": { + "type": "string", + "enum": [ + "draft", + "invoiced", + "notpaid", + "overdue", + "paid", + "pending", + "refund_requested", + "refunded", + "scheduled" + ], + "description": "Invoice state." + }, + "invoiceNumber": { + "type": "string", + "description": "User-readable invoice number." + }, + "invoiceDate": { + "type": "string", + "description": "Invoice date. ISO 8601 timestamp." + }, + "period": { + "properties": { + "start": { + "type": "string" + }, + "end": { + "type": "string" + } + }, + "required": [ + "end", + "start" + ], + "type": "object", + "description": "Subscription period for this billing cycle. ISO 8601 timestamps." + }, + "paidAt": { + "type": "string", + "description": "Moment the invoice was paid. ISO 8601 timestamp." + }, + "refundedAt": { + "type": "string", + "description": "Most recent moment the invoice was refunded. ISO 8601 timestamp." + }, + "memo": { + "type": "string", + "description": "Additional memo for the invoice." + }, + "items": { + "items": { + "properties": { + "billingPlanId": { + "type": "string", + "description": "Partner's billing plan ID." + }, + "resourceId": { + "type": "string", + "description": "Partner's resource ID. If not specified, indicates installation-wide item." + }, + "start": { + "type": "string", + "description": "Start and end are only needed if different from the period's start/end. ISO 8601 timestamp." + }, + "end": { + "type": "string", + "description": "Start and end are only needed if different from the period's start/end. ISO 8601 timestamp." + }, + "name": { + "type": "string", + "description": "Invoice item name." + }, + "details": { + "type": "string", + "description": "Additional item details." + }, + "price": { + "type": "string", + "description": "Item price. A dollar-based decimal string." + }, + "quantity": { + "type": "number", + "description": "Item quantity." + }, + "units": { + "type": "string", + "description": "Units for item's quantity." + }, + "total": { + "type": "string", + "description": "Item total. A dollar-based decimal string." + } + }, + "required": [ + "billingPlanId", + "name", + "price", + "quantity", + "total", + "units" + ], + "type": "object", + "description": "Invoice items." + }, + "type": "array", + "description": "Invoice items." + }, + "discounts": { + "items": { + "properties": { + "billingPlanId": { + "type": "string", + "description": "Partner's billing plan ID." + }, + "resourceId": { + "type": "string", + "description": "Partner's resource ID. If not specified, indicates installation-wide discount." + }, + "start": { + "type": "string", + "description": "Start and end are only needed if different from the period's start/end. ISO 8601 timestamp." + }, + "end": { + "type": "string", + "description": "Start and end are only needed if different from the period's start/end. ISO 8601 timestamp." + }, + "name": { + "type": "string", + "description": "Discount name." + }, + "details": { + "type": "string", + "description": "Additional discount details." + }, + "amount": { + "type": "string", + "description": "Discount amount. A dollar-based decimal string." + } + }, + "required": [ + "amount", + "billingPlanId", + "name" + ], + "type": "object", + "description": "Invoice discounts." + }, + "type": "array", + "description": "Invoice discounts." + }, + "total": { + "type": "string", + "description": "Invoice total amount. A dollar-based decimal string." + }, + "refundReason": { + "type": "string", + "description": "The reason for refund. Only applicable for states \"refunded\" or \"refund_request\"." + }, + "refundTotal": { + "type": "string", + "description": "Refund amount. Only applicable for states \"refunded\" or \"refund_request\". A dollar-based decimal string." + }, + "created": { + "type": "string", + "description": "System creation date. ISO 8601 timestamp." + }, + "updated": { + "type": "string", + "description": "System update date. ISO 8601 timestamp." + } + }, + "required": [ + "created", + "invoiceDate", + "invoiceId", + "items", + "period", + "state", + "total", + "updated" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + }, + "429": { + "description": "" + } + }, + "parameters": [ + { + "name": "integrationConfigurationId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "invoiceId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ] + } + }, + "/v1/installations/{integrationConfigurationId}/billing/invoices/{invoiceId}/actions": { + "post": { + "description": "This endpoint allows the partner to request a refund for an invoice to Vercel. The invoice is created using the [Submit Invoice API](#submit-invoice-api).", + "operationId": "update-invoice", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Invoice Actions", + "tags": [ + "marketplace" + ], + "responses": { + "204": { + "description": "" + }, + "400": { + "description": "One of the provided values in the request body is invalid.\nOne of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "409": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "integrationConfigurationId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "invoiceId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "oneOf": [ + { + "type": "object", + "properties": { + "action": { + "type": "string", + "enum": [ + "refund" + ] + }, + "reason": { + "type": "string", + "description": "Refund reason." + }, + "total": { + "type": "string", + "pattern": "^[0-9]+(\\.[0-9]+)?$", + "description": "The total amount to be refunded. Must be less than or equal to the total amount of the invoice." + } + }, + "required": [ + "action", + "reason", + "total" + ], + "additionalProperties": false + } + ] + } + } + }, + "required": true + } + } + }, + "/v1/installations/{integrationConfigurationId}/billing/balance": { + "post": { + "description": "Sends the prepayment balances. The partner should do this at least once a day and ideally once per hour. \u003cbr/\u003e Use the `credentials.access_token` we provided in the [Upsert Installation](#upsert-installation) body to authorize this request.", + "operationId": "submit-prepayment-balances", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Submit Prepayment Balances", + "tags": [ + "marketplace" + ], + "responses": { + "201": { + "description": "" + }, + "400": { + "description": "One of the provided values in the request body is invalid.\nOne of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "integrationConfigurationId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "timestamp": { + "type": "string", + "format": "date-time", + "description": "Server time of your integration, used to determine the most recent data for race conditions \u0026 updates. Only the latest usage data for a given day, week, and month will be kept." + }, + "balances": { + "type": "array", + "items": { + "type": "object", + "description": "A credit balance for a particular token type", + "properties": { + "resourceId": { + "type": "string", + "description": "Partner's resource ID, exclude if credits are tied to the installation and not an individual resource." + }, + "credit": { + "type": "string", + "description": "A human-readable description of the credits the user currently has, e.g. \"2,000 Tokens\"" + }, + "nameLabel": { + "type": "string", + "description": "The name of the credits, for display purposes, e.g. \"Tokens\"" + }, + "currencyValueInCents": { + "type": "number", + "description": "The dollar value of the credit balance, in USD and provided in cents, which is used to trigger automatic purchase thresholds." + } + }, + "required": [ + "currencyValueInCents" + ], + "additionalProperties": false + } + } + }, + "required": [ + "timestamp", + "balances" + ], + "additionalProperties": false + } + } + } + } + } + }, + "/v1/installations/{integrationConfigurationId}/products/{integrationProductIdOrSlug}/resources/{resourceId}/secrets": { + "put": { + "description": "This endpoint is deprecated and replaced with the endpoint [Update Resource Secrets](#update-resource-secrets). \u003cbr/\u003e This endpoint updates the secrets of a resource. If a resource has projects connected, the connected secrets are updated with the new secrets. The old secrets may still be used by existing connected projects because they are not automatically redeployed. Redeployment is a manual action and must be completed by the user. All new project connections will use the new secrets.\u003cbr/\u003e \u003cbr/\u003e Use cases for this endpoint:\u003cbr/\u003e \u003cbr/\u003e - Resetting the credentials of a database in the partner. If the user requests the credentials to be updated in the partner’s application, the partner post the new set of secrets to Vercel, the user should redeploy their application and the expire the old credentials.\u003cbr/\u003e", + "operationId": "update-resource-secrets", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Deprecated: true. Update Resource Secrets (Deprecated)", + "tags": [ + "marketplace" + ], + "deprecated": true, + "responses": { + "201": { + "description": "" + }, + "400": { + "description": "One of the provided values in the request body is invalid.\nOne of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "409": { + "description": "" + }, + "410": { + "description": "" + }, + "422": { + "description": "" + } + }, + "parameters": [ + { + "name": "integrationConfigurationId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "integrationProductIdOrSlug", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "resourceId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "secrets" + ], + "properties": { + "secrets": { + "type": "array", + "items": { + "type": "object", + "required": [ + "name", + "value" + ], + "properties": { + "name": { + "type": "string" + }, + "value": { + "type": "string" + }, + "prefix": { + "type": "string" + }, + "environmentOverrides": { + "type": "object", + "description": "A map of environments to override values for the secret, used for setting different values across deployments in production, preview, and development environments. Note: the same value will be used for all deployments in the given environment.", + "properties": { + "development": { + "type": "string", + "description": "Value used for development environment." + }, + "preview": { + "type": "string", + "description": "Value used for preview environment." + }, + "production": { + "type": "string", + "description": "Value used for production environment." + } + } + } + }, + "additionalProperties": false + } + }, + "partial": { + "type": "boolean", + "description": "If true, will only update the provided secrets" + } + }, + "additionalProperties": false + } + } + }, + "required": true + } + } + }, + "/v1/installations/{integrationConfigurationId}/resources/{resourceId}/secrets": { + "put": { + "description": "This endpoint updates the secrets of a resource. If a resource has projects connected, the connected secrets are updated with the new secrets. The old secrets may still be used by existing connected projects because they are not automatically redeployed. Redeployment is a manual action and must be completed by the user. All new project connections will use the new secrets.\u003cbr/\u003e \u003cbr/\u003e Use cases for this endpoint:\u003cbr/\u003e \u003cbr/\u003e - Resetting the credentials of a database in the partner. If the user requests the credentials to be updated in the partner’s application, the partner post the new set of secrets to Vercel, the user should redeploy their application and the expire the old credentials.\u003cbr/\u003e", + "operationId": "update-resource-secrets-by-id", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Update Resource Secrets", + "tags": [ + "marketplace" + ], + "responses": { + "201": { + "description": "" + }, + "400": { + "description": "One of the provided values in the request body is invalid.\nOne of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "409": { + "description": "" + }, + "410": { + "description": "" + }, + "422": { + "description": "" + } + }, + "parameters": [ + { + "name": "integrationConfigurationId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "resourceId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "secrets" + ], + "properties": { + "secrets": { + "type": "array", + "items": { + "type": "object", + "required": [ + "name", + "value" + ], + "properties": { + "name": { + "type": "string" + }, + "value": { + "type": "string" + }, + "prefix": { + "type": "string" + }, + "environmentOverrides": { + "type": "object", + "description": "A map of environments to override values for the secret, used for setting different values across deployments in production, preview, and development environments. Note: the same value will be used for all deployments in the given environment.", + "properties": { + "development": { + "type": "string", + "description": "Value used for development environment." + }, + "preview": { + "type": "string", + "description": "Value used for preview environment." + }, + "production": { + "type": "string", + "description": "Value used for production environment." + } + } + } + }, + "additionalProperties": false + } + }, + "partial": { + "type": "boolean", + "description": "If true, will only overwrite the provided secrets instead of replacing all secrets." + } + }, + "additionalProperties": false + } + } + } + } + } + }, + "/v1/integrations/configurations": { + "get": { + "description": "Allows to retrieve all configurations for an authenticated integration. When the `project` view is used, configurations generated for the authorization flow will be filtered out of the results.", + "operationId": "getConfigurations", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Get configurations for the authenticated user or team", + "tags": [ + "integrations" + ], + "responses": { + "200": { + "description": "The list of configurations for the authenticated user", + "content": { + "application/json": { + "schema": { + "oneOf": [ + { + "items": { + "properties": { + "completedAt": { + "type": "number", + "description": "A timestamp that tells you when the configuration was installed successfully", + "example": 1558531915505 + }, + "createdAt": { + "type": "number", + "description": "A timestamp that tells you when the configuration was created", + "example": 1558531915505 + }, + "id": { + "type": "string", + "description": "The unique identifier of the configuration", + "example": "icfg_3bwCLgxL8qt5kjRLcv2Dit7F" + }, + "integrationId": { + "type": "string", + "description": "The unique identifier of the app the configuration was created for", + "example": "oac_xzpVzcUOgcB1nrVlirtKhbWV" + }, + "ownerId": { + "type": "string", + "description": "The user or team ID that owns the configuration", + "example": "kr1PsOIzqEL5Xg6M4VZcZosf" + }, + "status": { + "type": "string", + "enum": [ + "error", + "onboarding", + "pending", + "ready", + "resumed", + "suspended", + "uninstalled" + ], + "description": "The configuration status. Optional. If not defined, assume 'ready'." + }, + "externalId": { + "type": "string", + "description": "An external identifier defined by the integration vendor." + }, + "projects": { + "items": { + "type": "string" + }, + "type": "array", + "description": "When a configuration is limited to access certain projects, this will contain each of the project ID it is allowed to access. If it is not defined, the configuration has full access.", + "example": [ + "prj_xQxbutw1HpL6HLYPAzt5h75m8NjO" + ] + }, + "source": { + "type": "string", + "enum": [ + "backoffice", + "cli", + "deploy-button", + "external", + "import-recommended-integrations", + "marketplace", + "oauth", + "organization", + "resource-claims", + "v0" + ], + "description": "Source defines where the configuration was installed from. It is used to analyze user engagement for integration installations in product metrics.", + "example": "marketplace" + }, + "slug": { + "type": "string", + "description": "The slug of the integration the configuration is created for.", + "example": "slack" + }, + "teamId": { + "nullable": true, + "type": "string", + "description": "When the configuration was created for a team, this will show the ID of the team.", + "example": "team_nLlpyC6RE1qxydlFKbrxDlud" + }, + "type": { + "type": "string", + "enum": [ + "integration-configuration" + ] + }, + "updatedAt": { + "type": "number", + "description": "A timestamp that tells you when the configuration was updated.", + "example": 1558531915505 + }, + "userId": { + "type": "string", + "description": "The ID of the user that created the configuration.", + "example": "kr1PsOIzqEL5Xg6M4VZcZosf" + }, + "scopes": { + "items": { + "type": "string" + }, + "type": "array", + "description": "The resources that are allowed to be accessed by the configuration.", + "example": [ + "read:project", + "read-write:log-drain" + ] + }, + "disabledAt": { + "type": "number", + "description": "A timestamp that tells you when the configuration was disabled. Note: Configurations can be disabled when the associated user loses access to a team. They do not function during this time until the configuration is 'transferred', meaning the associated user is changed to one with access to the team.", + "example": 1558531915505 + }, + "deletedAt": { + "nullable": true, + "type": "number", + "description": "A timestamp that tells you when the configuration was deleted.", + "example": 1558531915505 + }, + "deleteRequestedAt": { + "nullable": true, + "type": "number", + "description": "A timestamp that tells you when the configuration deletion has been started for cases when the deletion needs to be settled/approved by partners, such as when marketplace invoices have been paid.", + "example": 1558531915505 + }, + "customerDeleteRequestedAt": { + "nullable": true, + "type": "number", + "description": "Record when the customer initited deletion, independent of whether `deleteRequestedAt` gets set." + }, + "disabledReason": { + "type": "string", + "enum": [ + "account-plan-downgrade", + "disabled-by-admin", + "disabled-by-owner", + "feature-not-available", + "original-owner-left-the-team", + "original-owner-role-downgraded" + ] + }, + "installationType": { + "type": "string", + "enum": [ + "external", + "marketplace" + ], + "description": "Defines the installation type. - 'external' integrations are installed via the existing integrations flow - 'marketplace' integrations are natively installed: - when accepting the TOS of a partner during the store creation process - if undefined, assume 'external'" + }, + "acceptedPoliciesInheritedFromInstallationId": { + "type": "string", + "description": "Historical parent installation from which acceptedPolicies were inherited. This is immutable provenance, not current authorization or relationship truth." + } + }, + "type": "object", + "description": "The list of configurations for the authenticated user" + }, + "type": "array", + "description": "The list of configurations for the authenticated user" + }, + { + "items": { + "properties": { + "integration": { + "properties": { + "name": { + "type": "string" + }, + "icon": { + "type": "string" + }, + "isLegacy": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "flags": { + "items": { + "type": "string" + }, + "type": "array" + }, + "assignedBetaLabelAt": { + "type": "number" + }, + "tagIds": { + "items": { + "type": "string", + "enum": [ + "tag_agents", + "tag_ai", + "tag_analytics", + "tag_authentication", + "tag_cms", + "tag_code_repository", + "tag_code_review", + "tag_code_security", + "tag_code_testing", + "tag_commerce", + "tag_databases", + "tag_dev_tools", + "tag_experimentation", + "tag_flags", + "tag_logging", + "tag_messaging", + "tag_monitoring", + "tag_observability", + "tag_payments", + "tag_performance", + "tag_productivity", + "tag_searching", + "tag_security", + "tag_support_agent", + "tag_testing", + "tag_video", + "tag_web_automation", + "tag_workflow" + ] + }, + "type": "array" + } + }, + "required": [ + "icon", + "isLegacy", + "name" + ], + "type": "object" + }, + "completedAt": { + "type": "number", + "description": "A timestamp that tells you when the configuration was installed successfully", + "example": 1558531915505 + }, + "createdAt": { + "type": "number", + "description": "A timestamp that tells you when the configuration was created", + "example": 1558531915505 + }, + "id": { + "type": "string", + "description": "The unique identifier of the configuration", + "example": "icfg_3bwCLgxL8qt5kjRLcv2Dit7F" + }, + "integrationId": { + "type": "string", + "description": "The unique identifier of the app the configuration was created for", + "example": "oac_xzpVzcUOgcB1nrVlirtKhbWV" + }, + "ownerId": { + "type": "string", + "description": "The user or team ID that owns the configuration", + "example": "kr1PsOIzqEL5Xg6M4VZcZosf" + }, + "status": { + "type": "string", + "enum": [ + "error", + "onboarding", + "pending", + "ready", + "resumed", + "suspended", + "uninstalled" + ], + "description": "The configuration status. Optional. If not defined, assume 'ready'." + }, + "externalId": { + "type": "string", + "description": "An external identifier defined by the integration vendor." + }, + "projects": { + "items": { + "type": "string" + }, + "type": "array", + "description": "When a configuration is limited to access certain projects, this will contain each of the project ID it is allowed to access. If it is not defined, the configuration has full access.", + "example": [ + "prj_xQxbutw1HpL6HLYPAzt5h75m8NjO" + ] + }, + "source": { + "type": "string", + "enum": [ + "backoffice", + "cli", + "deploy-button", + "external", + "import-recommended-integrations", + "marketplace", + "oauth", + "organization", + "resource-claims", + "v0" + ], + "description": "Source defines where the configuration was installed from. It is used to analyze user engagement for integration installations in product metrics.", + "example": "marketplace" + }, + "slug": { + "type": "string", + "description": "The slug of the integration the configuration is created for.", + "example": "slack" + }, + "teamId": { + "nullable": true, + "type": "string", + "description": "When the configuration was created for a team, this will show the ID of the team.", + "example": "team_nLlpyC6RE1qxydlFKbrxDlud" + }, + "type": { + "type": "string", + "enum": [ + "integration-configuration" + ] + }, + "updatedAt": { + "type": "number", + "description": "A timestamp that tells you when the configuration was updated.", + "example": 1558531915505 + }, + "userId": { + "type": "string", + "description": "The ID of the user that created the configuration.", + "example": "kr1PsOIzqEL5Xg6M4VZcZosf" + }, + "scopes": { + "items": { + "type": "string" + }, + "type": "array", + "description": "The resources that are allowed to be accessed by the configuration.", + "example": [ + "read:project", + "read-write:log-drain" + ] + }, + "disabledAt": { + "type": "number", + "description": "A timestamp that tells you when the configuration was disabled. Note: Configurations can be disabled when the associated user loses access to a team. They do not function during this time until the configuration is 'transferred', meaning the associated user is changed to one with access to the team.", + "example": 1558531915505 + }, + "deletedAt": { + "nullable": true, + "type": "number", + "description": "A timestamp that tells you when the configuration was deleted.", + "example": 1558531915505 + }, + "deleteRequestedAt": { + "nullable": true, + "type": "number", + "description": "A timestamp that tells you when the configuration deletion has been started for cases when the deletion needs to be settled/approved by partners, such as when marketplace invoices have been paid.", + "example": 1558531915505 + }, + "customerDeleteRequestedAt": { + "nullable": true, + "type": "number", + "description": "Record when the customer initited deletion, independent of whether `deleteRequestedAt` gets set." + }, + "disabledReason": { + "type": "string", + "enum": [ + "account-plan-downgrade", + "disabled-by-admin", + "disabled-by-owner", + "feature-not-available", + "original-owner-left-the-team", + "original-owner-role-downgraded" + ] + }, + "installationType": { + "type": "string", + "enum": [ + "external", + "marketplace" + ], + "description": "Defines the installation type. - 'external' integrations are installed via the existing integrations flow - 'marketplace' integrations are natively installed: - when accepting the TOS of a partner during the store creation process - if undefined, assume 'external'" + }, + "acceptedPoliciesInheritedFromInstallationId": { + "type": "string", + "description": "Historical parent installation from which acceptedPolicies were inherited. This is immutable provenance, not current authorization or relationship truth." + } + }, + "required": [ + "createdAt", + "id", + "integration", + "integrationId", + "ownerId", + "scopes", + "slug", + "type", + "updatedAt", + "userId" + ], + "type": "object" + }, + "type": "array" + } + ] + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "view", + "in": "query", + "required": true, + "schema": { + "type": "string", + "enum": [ + "account", + "project" + ] + } + }, + { + "name": "installationType", + "in": "query", + "required": false, + "schema": { + "type": "string", + "enum": [ + "marketplace", + "external", + "provisioning" + ] + } + }, + { + "name": "integrationIdOrSlug", + "description": "ID of the integration", + "in": "query", + "required": false, + "schema": { + "type": "string", + "description": "ID of the integration" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "x-speakeasy-test": false + } + }, + "/v1/integrations/configuration/{id}": { + "get": { + "description": "Allows to retrieve a the configuration with the provided id in case it exists. The authenticated user or team must be the owner of the config in order to access it.", + "operationId": "getConfiguration", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Retrieve an integration configuration", + "tags": [ + "integrations" + ], + "responses": { + "200": { + "description": "The configuration with the provided id", + "content": { + "application/json": { + "schema": { + "oneOf": [ + { + "properties": { + "projectSelection": { + "type": "string", + "enum": [ + "all", + "selected" + ], + "description": "A string representing the permission for projects. Possible values are `all` or `selected`.", + "example": "all" + }, + "notification": { + "properties": { + "level": { + "type": "string", + "enum": [ + "error", + "info", + "warn" + ] + }, + "title": { + "type": "string" + }, + "message": { + "type": "string" + }, + "href": { + "type": "string" + } + }, + "required": [ + "level", + "title" + ], + "type": "object" + }, + "transferRequest": { + "oneOf": [ + { + "properties": { + "kind": { + "type": "string", + "enum": [ + "transfer-to-marketplace" + ] + }, + "metadata": { + "additionalProperties": true, + "type": "object" + }, + "billingPlan": { + "properties": { + "id": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "prepayment", + "subscription" + ] + }, + "scope": { + "type": "string", + "enum": [ + "installation", + "resource" + ] + }, + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "paymentMethodRequired": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "preauthorizationAmount": { + "type": "number" + } + }, + "required": [ + "description", + "id", + "name", + "type" + ], + "type": "object" + }, + "requestId": { + "type": "string" + }, + "transferId": { + "type": "string" + }, + "requester": { + "properties": { + "name": { + "type": "string" + }, + "email": { + "type": "string" + } + }, + "required": [ + "name" + ], + "type": "object" + }, + "createdAt": { + "type": "number" + }, + "expiresAt": { + "type": "number" + }, + "discardedAt": { + "type": "number" + }, + "discardedBy": { + "type": "string" + }, + "approvedAt": { + "type": "number" + }, + "approvedBy": { + "type": "string" + }, + "authorizationId": { + "type": "string" + } + }, + "required": [ + "createdAt", + "expiresAt", + "kind", + "requestId", + "requester", + "transferId" + ], + "type": "object" + }, + { + "properties": { + "kind": { + "type": "string", + "enum": [ + "transfer-from-marketplace" + ] + }, + "requestId": { + "type": "string" + }, + "transferId": { + "type": "string" + }, + "requester": { + "properties": { + "name": { + "type": "string" + }, + "email": { + "type": "string" + } + }, + "required": [ + "name" + ], + "type": "object" + }, + "createdAt": { + "type": "number" + }, + "expiresAt": { + "type": "number" + }, + "discardedAt": { + "type": "number" + }, + "discardedBy": { + "type": "string" + }, + "approvedAt": { + "type": "number" + }, + "approvedBy": { + "type": "string" + }, + "authorizationId": { + "type": "string" + } + }, + "required": [ + "createdAt", + "expiresAt", + "kind", + "requestId", + "requester", + "transferId" + ], + "type": "object" + } + ] + }, + "projects": { + "items": { + "type": "string" + }, + "type": "array", + "description": "When a configuration is limited to access certain projects, this will contain each of the project ID it is allowed to access. If it is not defined, the configuration has full access.", + "example": [ + "prj_xQxbutw1HpL6HLYPAzt5h75m8NjO" + ] + }, + "status": { + "type": "string", + "enum": [ + "error", + "onboarding", + "pending", + "ready", + "resumed", + "suspended", + "uninstalled" + ], + "description": "The configuration status. Optional. If not defined, assume 'ready'." + }, + "type": { + "type": "string", + "enum": [ + "integration-configuration" + ] + }, + "id": { + "type": "string", + "description": "The unique identifier of the configuration", + "example": "icfg_3bwCLgxL8qt5kjRLcv2Dit7F" + }, + "slug": { + "type": "string", + "description": "The slug of the integration the configuration is created for.", + "example": "slack" + }, + "createdAt": { + "type": "number", + "description": "A timestamp that tells you when the configuration was created", + "example": 1558531915505 + }, + "updatedAt": { + "type": "number", + "description": "A timestamp that tells you when the configuration was updated.", + "example": 1558531915505 + }, + "ownerId": { + "type": "string", + "description": "The user or team ID that owns the configuration", + "example": "kr1PsOIzqEL5Xg6M4VZcZosf" + }, + "deletedAt": { + "nullable": true, + "type": "number", + "description": "A timestamp that tells you when the configuration was deleted.", + "example": 1558531915505 + }, + "integrationId": { + "type": "string", + "description": "The unique identifier of the app the configuration was created for", + "example": "oac_xzpVzcUOgcB1nrVlirtKhbWV" + }, + "userId": { + "type": "string", + "description": "The ID of the user that created the configuration.", + "example": "kr1PsOIzqEL5Xg6M4VZcZosf" + }, + "teamId": { + "nullable": true, + "type": "string", + "description": "When the configuration was created for a team, this will show the ID of the team.", + "example": "team_nLlpyC6RE1qxydlFKbrxDlud" + }, + "scopes": { + "items": { + "type": "string" + }, + "type": "array", + "description": "The resources that are allowed to be accessed by the configuration.", + "example": [ + "read:project", + "read-write:log-drain" + ] + }, + "canConfigureOpenTelemetry": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "completedAt": { + "type": "number", + "description": "A timestamp that tells you when the configuration was installed successfully", + "example": 1558531915505 + }, + "externalId": { + "type": "string", + "description": "An external identifier defined by the integration vendor." + }, + "source": { + "type": "string", + "enum": [ + "backoffice", + "cli", + "deploy-button", + "external", + "import-recommended-integrations", + "marketplace", + "oauth", + "organization", + "resource-claims", + "v0" + ], + "description": "Source defines where the configuration was installed from. It is used to analyze user engagement for integration installations in product metrics.", + "example": "marketplace" + }, + "disabledAt": { + "type": "number", + "description": "A timestamp that tells you when the configuration was disabled. Note: Configurations can be disabled when the associated user loses access to a team. They do not function during this time until the configuration is 'transferred', meaning the associated user is changed to one with access to the team.", + "example": 1558531915505 + }, + "deleteRequestedAt": { + "nullable": true, + "type": "number", + "description": "A timestamp that tells you when the configuration deletion has been started for cases when the deletion needs to be settled/approved by partners, such as when marketplace invoices have been paid.", + "example": 1558531915505 + }, + "customerDeleteRequestedAt": { + "nullable": true, + "type": "number", + "description": "Record when the customer initited deletion, independent of whether `deleteRequestedAt` gets set." + }, + "disabledReason": { + "type": "string", + "enum": [ + "account-plan-downgrade", + "disabled-by-admin", + "disabled-by-owner", + "feature-not-available", + "original-owner-left-the-team", + "original-owner-role-downgraded" + ] + }, + "installationType": { + "type": "string", + "enum": [ + "external", + "marketplace" + ], + "description": "Defines the installation type. - 'external' integrations are installed via the existing integrations flow - 'marketplace' integrations are natively installed: - when accepting the TOS of a partner during the store creation process - if undefined, assume 'external'" + }, + "acceptedPoliciesInheritedFromInstallationId": { + "type": "string", + "description": "Historical parent installation from which acceptedPolicies were inherited. This is immutable provenance, not current authorization or relationship truth." + } + }, + "required": [ + "createdAt", + "id", + "integrationId", + "notification", + "ownerId", + "projectSelection", + "scopes", + "slug", + "transferRequest", + "type", + "updatedAt", + "userId" + ], + "type": "object" + }, + { + "properties": { + "completedAt": { + "type": "number", + "description": "A timestamp that tells you when the configuration was installed successfully", + "example": 1558531915505 + }, + "createdAt": { + "type": "number", + "description": "A timestamp that tells you when the configuration was created", + "example": 1558531915505 + }, + "id": { + "type": "string", + "description": "The unique identifier of the configuration", + "example": "icfg_3bwCLgxL8qt5kjRLcv2Dit7F" + }, + "integrationId": { + "type": "string", + "description": "The unique identifier of the app the configuration was created for", + "example": "oac_xzpVzcUOgcB1nrVlirtKhbWV" + }, + "ownerId": { + "type": "string", + "description": "The user or team ID that owns the configuration", + "example": "kr1PsOIzqEL5Xg6M4VZcZosf" + }, + "status": { + "type": "string", + "enum": [ + "error", + "onboarding", + "pending", + "ready", + "resumed", + "suspended", + "uninstalled" + ], + "description": "The configuration status. Optional. If not defined, assume 'ready'." + }, + "externalId": { + "type": "string", + "description": "An external identifier defined by the integration vendor." + }, + "projects": { + "items": { + "type": "string" + }, + "type": "array", + "description": "When a configuration is limited to access certain projects, this will contain each of the project ID it is allowed to access. If it is not defined, the configuration has full access.", + "example": [ + "prj_xQxbutw1HpL6HLYPAzt5h75m8NjO" + ] + }, + "source": { + "type": "string", + "enum": [ + "backoffice", + "cli", + "deploy-button", + "external", + "import-recommended-integrations", + "marketplace", + "oauth", + "organization", + "resource-claims", + "v0" + ], + "description": "Source defines where the configuration was installed from. It is used to analyze user engagement for integration installations in product metrics.", + "example": "marketplace" + }, + "slug": { + "type": "string", + "description": "The slug of the integration the configuration is created for.", + "example": "slack" + }, + "teamId": { + "nullable": true, + "type": "string", + "description": "When the configuration was created for a team, this will show the ID of the team.", + "example": "team_nLlpyC6RE1qxydlFKbrxDlud" + }, + "type": { + "type": "string", + "enum": [ + "integration-configuration" + ] + }, + "updatedAt": { + "type": "number", + "description": "A timestamp that tells you when the configuration was updated.", + "example": 1558531915505 + }, + "userId": { + "type": "string", + "description": "The ID of the user that created the configuration.", + "example": "kr1PsOIzqEL5Xg6M4VZcZosf" + }, + "scopes": { + "items": { + "type": "string" + }, + "type": "array", + "description": "The resources that are allowed to be accessed by the configuration.", + "example": [ + "read:project", + "read-write:log-drain" + ] + }, + "disabledAt": { + "type": "number", + "description": "A timestamp that tells you when the configuration was disabled. Note: Configurations can be disabled when the associated user loses access to a team. They do not function during this time until the configuration is 'transferred', meaning the associated user is changed to one with access to the team.", + "example": 1558531915505 + }, + "deletedAt": { + "nullable": true, + "type": "number", + "description": "A timestamp that tells you when the configuration was deleted.", + "example": 1558531915505 + }, + "deleteRequestedAt": { + "nullable": true, + "type": "number", + "description": "A timestamp that tells you when the configuration deletion has been started for cases when the deletion needs to be settled/approved by partners, such as when marketplace invoices have been paid.", + "example": 1558531915505 + }, + "customerDeleteRequestedAt": { + "nullable": true, + "type": "number", + "description": "Record when the customer initited deletion, independent of whether `deleteRequestedAt` gets set." + }, + "disabledReason": { + "type": "string", + "enum": [ + "account-plan-downgrade", + "disabled-by-admin", + "disabled-by-owner", + "feature-not-available", + "original-owner-left-the-team", + "original-owner-role-downgraded" + ] + }, + "installationType": { + "type": "string", + "enum": [ + "external", + "marketplace" + ], + "description": "Defines the installation type. - 'external' integrations are installed via the existing integrations flow - 'marketplace' integrations are natively installed: - when accepting the TOS of a partner during the store creation process - if undefined, assume 'external'" + }, + "acceptedPoliciesInheritedFromInstallationId": { + "type": "string", + "description": "Historical parent installation from which acceptedPolicies were inherited. This is immutable provenance, not current authorization or relationship truth." + } + }, + "required": [ + "createdAt", + "id", + "integrationId", + "ownerId", + "scopes", + "slug", + "type", + "updatedAt", + "userId" + ], + "type": "object", + "description": "The configuration with the provided id" + }, + { + "properties": { + "completedAt": { + "type": "number", + "description": "A timestamp that tells you when the configuration was installed successfully", + "example": 1558531915505 + }, + "createdAt": { + "type": "number", + "description": "A timestamp that tells you when the configuration was created", + "example": 1558531915505 + }, + "id": { + "type": "string", + "description": "The unique identifier of the configuration", + "example": "icfg_3bwCLgxL8qt5kjRLcv2Dit7F" + }, + "integrationId": { + "type": "string", + "description": "The unique identifier of the app the configuration was created for", + "example": "oac_xzpVzcUOgcB1nrVlirtKhbWV" + }, + "ownerId": { + "type": "string", + "description": "The user or team ID that owns the configuration", + "example": "kr1PsOIzqEL5Xg6M4VZcZosf" + }, + "status": { + "type": "string", + "enum": [ + "error", + "onboarding", + "pending", + "ready", + "resumed", + "suspended", + "uninstalled" + ], + "description": "The configuration status. Optional. If not defined, assume 'ready'." + }, + "externalId": { + "type": "string", + "description": "An external identifier defined by the integration vendor." + }, + "projects": { + "items": { + "type": "string" + }, + "type": "array", + "description": "When a configuration is limited to access certain projects, this will contain each of the project ID it is allowed to access. If it is not defined, the configuration has full access.", + "example": [ + "prj_xQxbutw1HpL6HLYPAzt5h75m8NjO" + ] + }, + "source": { + "type": "string", + "enum": [ + "backoffice", + "cli", + "deploy-button", + "external", + "import-recommended-integrations", + "marketplace", + "oauth", + "organization", + "resource-claims", + "v0" + ], + "description": "Source defines where the configuration was installed from. It is used to analyze user engagement for integration installations in product metrics.", + "example": "marketplace" + }, + "slug": { + "type": "string", + "description": "The slug of the integration the configuration is created for.", + "example": "slack" + }, + "teamId": { + "nullable": true, + "type": "string", + "description": "When the configuration was created for a team, this will show the ID of the team.", + "example": "team_nLlpyC6RE1qxydlFKbrxDlud" + }, + "type": { + "type": "string", + "enum": [ + "integration-configuration" + ] + }, + "updatedAt": { + "type": "number", + "description": "A timestamp that tells you when the configuration was updated.", + "example": 1558531915505 + }, + "userId": { + "type": "string", + "description": "The ID of the user that created the configuration.", + "example": "kr1PsOIzqEL5Xg6M4VZcZosf" + }, + "scopes": { + "items": { + "type": "string" + }, + "type": "array", + "description": "The resources that are allowed to be accessed by the configuration.", + "example": [ + "read:project", + "read-write:log-drain" + ] + }, + "disabledAt": { + "type": "number", + "description": "A timestamp that tells you when the configuration was disabled. Note: Configurations can be disabled when the associated user loses access to a team. They do not function during this time until the configuration is 'transferred', meaning the associated user is changed to one with access to the team.", + "example": 1558531915505 + }, + "deletedAt": { + "nullable": true, + "type": "number", + "description": "A timestamp that tells you when the configuration was deleted.", + "example": 1558531915505 + }, + "deleteRequestedAt": { + "nullable": true, + "type": "number", + "description": "A timestamp that tells you when the configuration deletion has been started for cases when the deletion needs to be settled/approved by partners, such as when marketplace invoices have been paid.", + "example": 1558531915505 + }, + "customerDeleteRequestedAt": { + "nullable": true, + "type": "number", + "description": "Record when the customer initited deletion, independent of whether `deleteRequestedAt` gets set." + }, + "disabledReason": { + "type": "string", + "enum": [ + "account-plan-downgrade", + "disabled-by-admin", + "disabled-by-owner", + "feature-not-available", + "original-owner-left-the-team", + "original-owner-role-downgraded" + ] + }, + "installationType": { + "type": "string", + "enum": [ + "external", + "marketplace" + ], + "description": "Defines the installation type. - 'external' integrations are installed via the existing integrations flow - 'marketplace' integrations are natively installed: - when accepting the TOS of a partner during the store creation process - if undefined, assume 'external'" + }, + "acceptedPoliciesInheritedFromInstallationId": { + "type": "string", + "description": "Historical parent installation from which acceptedPolicies were inherited. This is immutable provenance, not current authorization or relationship truth." + } + }, + "type": "object", + "description": "A configuration represents information about a single installation of an integration within an individual or team account" + } + ] + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "The configuration was not found" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "id", + "description": "ID of the configuration to check", + "in": "path", + "required": true, + "schema": { + "type": "string", + "description": "ID of the configuration to check", + "example": "icfg_cuwj0AdCdH3BwWT4LPijCC7t" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + }, + "delete": { + "description": "Allows to remove the configuration with the `id` provided in the parameters. The configuration and all of its resources will be removed. This includes Webhooks, LogDrains and Project Env variables.", + "operationId": "deleteConfiguration", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Delete an integration configuration", + "tags": [ + "integrations" + ], + "responses": { + "204": { + "description": "The configuration was successfully removed" + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "The configuration was not found" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + } + }, + "/v1/integrations/configuration/{id}/products": { + "get": { + "description": "Returns products available for an integration configuration. Each product includes a `metadataSchema` field with the JSON Schema for required and optional metadata fields.", + "operationId": "getConfigurationProducts", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "List products for integration configuration", + "tags": [ + "integrations" + ], + "responses": { + "200": { + "description": "List of products available for this integration configuration", + "content": { + "application/json": { + "schema": { + "properties": { + "products": { + "items": { + "properties": { + "id": { + "type": "string" + }, + "slug": { + "type": "string" + }, + "name": { + "type": "string" + }, + "protocols": { + "properties": { + "storage": { + "properties": { + "status": { + "type": "string", + "enum": [ + "disabled", + "enabled" + ] + }, + "repl": { + "properties": { + "enabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "supportsReadOnlyMode": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "welcomeMessage": { + "type": "string" + } + }, + "required": [ + "enabled", + "supportsReadOnlyMode" + ], + "type": "object" + } + }, + "required": [ + "status" + ], + "type": "object" + }, + "experimentation": { + "properties": { + "status": { + "type": "string", + "enum": [ + "disabled", + "enabled" + ] + }, + "edgeConfigSyncingSupport": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "status" + ], + "type": "object" + }, + "ai": { + "properties": { + "status": { + "type": "string", + "enum": [ + "disabled", + "enabled" + ] + } + }, + "required": [ + "status" + ], + "type": "object" + }, + "authentication": { + "properties": { + "status": { + "type": "string", + "enum": [ + "disabled", + "enabled" + ] + }, + "appUrlRegistrationSupport": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "The partner accepts Vercel-managed app URLs via `protocolSettings.authentication.appUrls` on provision-resource and update-resource, and reconciles them into its trusted-origin / redirect-URL allowlist. When absent, consumers surface the URL for a one-time manual registration instead." + } + }, + "required": [ + "status" + ], + "type": "object" + }, + "observability": { + "properties": { + "status": { + "type": "string", + "enum": [ + "disabled", + "enabled" + ] + } + }, + "required": [ + "status" + ], + "type": "object" + }, + "video": { + "properties": { + "status": { + "type": "string", + "enum": [ + "disabled", + "enabled" + ] + } + }, + "required": [ + "status" + ], + "type": "object" + }, + "workflow": { + "properties": { + "status": { + "type": "string", + "enum": [ + "disabled", + "enabled" + ] + } + }, + "required": [ + "status" + ], + "type": "object" + }, + "checks": { + "properties": { + "status": { + "type": "string", + "enum": [ + "disabled", + "enabled" + ] + } + }, + "required": [ + "status" + ], + "type": "object" + }, + "logDrain": { + "properties": { + "status": { + "type": "string", + "enum": [ + "disabled", + "enabled" + ] + }, + "endpoint": { + "type": "string" + }, + "headers": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "format": { + "type": "string", + "enum": [ + "json", + "ndjson" + ] + } + }, + "required": [ + "endpoint", + "format", + "status" + ], + "type": "object" + }, + "traceDrain": { + "properties": { + "status": { + "type": "string", + "enum": [ + "disabled", + "enabled" + ] + }, + "endpoint": { + "type": "string" + }, + "headers": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "format": { + "type": "string", + "enum": [ + "json", + "proto" + ] + } + }, + "required": [ + "endpoint", + "format", + "status" + ], + "type": "object" + }, + "messaging": { + "properties": { + "status": { + "type": "string", + "enum": [ + "disabled", + "enabled" + ] + } + }, + "required": [ + "status" + ], + "type": "object" + }, + "other": { + "properties": { + "status": { + "type": "string", + "enum": [ + "disabled", + "enabled" + ] + } + }, + "required": [ + "status" + ], + "type": "object" + } + }, + "type": "object" + }, + "primaryProtocol": { + "type": "string", + "enum": [ + "ai", + "authentication", + "checks", + "experimentation", + "logDrain", + "messaging", + "observability", + "other", + "storage", + "traceDrain", + "video", + "workflow" + ] + }, + "metadataSchema": { + "properties": { + "type": { + "type": "string", + "enum": [ + "object" + ] + }, + "properties": { + "additionalProperties": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "string" + ] + }, + "ui:control": { + "type": "string", + "enum": [ + "input" + ] + }, + "description": { + "type": "string" + }, + "enum": { + "items": { + "type": "string" + }, + "type": "array" + }, + "maxLength": { + "type": "number" + }, + "minLength": { + "type": "number" + }, + "pattern": { + "type": "string" + }, + "default": { + "type": "string" + }, + "ui:label": { + "type": "string" + }, + "ui:read-only": { + "oneOf": [ + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + }, + { + "type": "string", + "enum": [ + "create", + "update" + ] + } + ] + }, + "ui:hidden": { + "oneOf": [ + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + }, + { + "type": "string", + "enum": [ + "create", + "update" + ] + } + ] + }, + "ui:disabled": { + "oneOf": [ + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + }, + { + "type": "string", + "enum": [ + "create", + "update" + ] + } + ] + }, + "ui:description": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + } + ] + }, + "ui:formatted-value": { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + "ui:paid-only": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "ui:placeholder": { + "type": "string" + } + }, + "required": [ + "type", + "ui:control" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "number" + ] + }, + "ui:control": { + "type": "string", + "enum": [ + "input" + ] + }, + "minimum": { + "type": "number" + }, + "maximum": { + "type": "number" + }, + "description": { + "type": "string" + }, + "exclusiveMaximum": { + "type": "number" + }, + "exclusiveMinimum": { + "type": "number" + }, + "default": { + "type": "number" + }, + "ui:label": { + "type": "string" + }, + "ui:read-only": { + "oneOf": [ + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + }, + { + "type": "string", + "enum": [ + "create", + "update" + ] + } + ] + }, + "ui:hidden": { + "oneOf": [ + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + }, + { + "type": "string", + "enum": [ + "create", + "update" + ] + } + ] + }, + "ui:disabled": { + "oneOf": [ + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + }, + { + "type": "string", + "enum": [ + "create", + "update" + ] + } + ] + }, + "ui:description": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + } + ] + }, + "ui:formatted-value": { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + "ui:paid-only": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "ui:placeholder": { + "type": "string" + } + }, + "required": [ + "type", + "ui:control" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "boolean" + ] + }, + "ui:control": { + "type": "string", + "enum": [ + "toggle" + ] + }, + "description": { + "type": "string" + }, + "default": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "ui:label": { + "type": "string" + }, + "ui:read-only": { + "oneOf": [ + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + }, + { + "type": "string", + "enum": [ + "create", + "update" + ] + } + ] + }, + "ui:hidden": { + "oneOf": [ + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + }, + { + "type": "string", + "enum": [ + "create", + "update" + ] + } + ] + }, + "ui:disabled": { + "oneOf": [ + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + }, + { + "type": "string", + "enum": [ + "create", + "update" + ] + } + ] + }, + "ui:description": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + } + ] + }, + "ui:formatted-value": { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + "ui:paid-only": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "type", + "ui:control" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "array" + ] + }, + "items": { + "properties": { + "type": { + "type": "string", + "enum": [ + "number" + ] + }, + "minimum": { + "type": "number" + }, + "maximum": { + "type": "number" + }, + "description": { + "type": "string" + }, + "exclusiveMaximum": { + "type": "number" + }, + "exclusiveMinimum": { + "type": "number" + }, + "default": { + "type": "number" + } + }, + "required": [ + "type" + ], + "type": "object" + }, + "ui:control": { + "type": "string", + "enum": [ + "slider" + ] + }, + "ui:steps": { + "items": { + "type": "number" + }, + "type": "array" + }, + "description": { + "type": "string" + }, + "maxItems": { + "type": "number" + }, + "minItems": { + "type": "number" + }, + "default": { + "items": { + "type": "number" + }, + "type": "array" + }, + "ui:label": { + "type": "string" + }, + "ui:read-only": { + "oneOf": [ + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + }, + { + "type": "string", + "enum": [ + "create", + "update" + ] + } + ] + }, + "ui:hidden": { + "oneOf": [ + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + }, + { + "type": "string", + "enum": [ + "create", + "update" + ] + } + ] + }, + "ui:disabled": { + "oneOf": [ + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + }, + { + "type": "string", + "enum": [ + "create", + "update" + ] + } + ] + }, + "ui:description": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + } + ] + }, + "ui:formatted-value": { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + "ui:paid-only": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "items", + "type", + "ui:control", + "ui:steps" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "string" + ] + }, + "ui:control": { + "type": "string", + "enum": [ + "select" + ] + }, + "ui:options": { + "items": { + "properties": { + "value": { + "type": "string" + }, + "label": { + "type": "string" + }, + "description": { + "type": "string" + }, + "disabled": { + "oneOf": [ + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + }, + { + "type": "string", + "enum": [ + "create", + "update" + ] + } + ] + }, + "hidden": { + "oneOf": [ + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + }, + { + "type": "string", + "enum": [ + "create", + "update" + ] + } + ] + } + }, + "required": [ + "label", + "value" + ], + "type": "object" + }, + "type": "array" + }, + "description": { + "type": "string" + }, + "enum": { + "items": { + "type": "string" + }, + "type": "array" + }, + "maxLength": { + "type": "number" + }, + "minLength": { + "type": "number" + }, + "pattern": { + "type": "string" + }, + "default": { + "type": "string" + }, + "ui:label": { + "type": "string" + }, + "ui:read-only": { + "oneOf": [ + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + }, + { + "type": "string", + "enum": [ + "create", + "update" + ] + } + ] + }, + "ui:hidden": { + "oneOf": [ + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + }, + { + "type": "string", + "enum": [ + "create", + "update" + ] + } + ] + }, + "ui:disabled": { + "oneOf": [ + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + }, + { + "type": "string", + "enum": [ + "create", + "update" + ] + } + ] + }, + "ui:description": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + } + ] + }, + "ui:formatted-value": { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + "ui:paid-only": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "ui:placeholder": { + "type": "string" + } + }, + "required": [ + "type", + "ui:control", + "ui:options" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "string" + ] + }, + "ui:control": { + "type": "string", + "enum": [ + "radio-button" + ] + }, + "ui:options": { + "items": { + "properties": { + "value": { + "type": "string" + }, + "label": { + "type": "string" + }, + "description": { + "type": "string" + }, + "disabled": { + "oneOf": [ + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + }, + { + "type": "string", + "enum": [ + "create", + "update" + ] + } + ] + }, + "hidden": { + "oneOf": [ + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + }, + { + "type": "string", + "enum": [ + "create", + "update" + ] + } + ] + } + }, + "required": [ + "label", + "value" + ], + "type": "object" + }, + "type": "array" + }, + "description": { + "type": "string" + }, + "enum": { + "items": { + "type": "string" + }, + "type": "array" + }, + "maxLength": { + "type": "number" + }, + "minLength": { + "type": "number" + }, + "pattern": { + "type": "string" + }, + "default": { + "type": "string" + }, + "ui:label": { + "type": "string" + }, + "ui:read-only": { + "oneOf": [ + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + }, + { + "type": "string", + "enum": [ + "create", + "update" + ] + } + ] + }, + "ui:hidden": { + "oneOf": [ + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + }, + { + "type": "string", + "enum": [ + "create", + "update" + ] + } + ] + }, + "ui:disabled": { + "oneOf": [ + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + }, + { + "type": "string", + "enum": [ + "create", + "update" + ] + } + ] + }, + "ui:description": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + } + ] + }, + "ui:formatted-value": { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + "ui:paid-only": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "ui:placeholder": { + "type": "string" + } + }, + "required": [ + "type", + "ui:control", + "ui:options" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "array" + ] + }, + "items": { + "properties": { + "type": { + "type": "string", + "enum": [ + "string" + ] + }, + "description": { + "type": "string" + }, + "enum": { + "items": { + "type": "string" + }, + "type": "array" + }, + "maxLength": { + "type": "number" + }, + "minLength": { + "type": "number" + }, + "pattern": { + "type": "string" + }, + "default": { + "type": "string" + } + }, + "required": [ + "type" + ], + "type": "object" + }, + "ui:control": { + "type": "string", + "enum": [ + "multi-select" + ] + }, + "ui:options": { + "items": { + "properties": { + "value": { + "type": "string" + }, + "label": { + "type": "string" + }, + "description": { + "type": "string" + }, + "disabled": { + "oneOf": [ + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + }, + { + "type": "string", + "enum": [ + "create", + "update" + ] + } + ] + }, + "hidden": { + "oneOf": [ + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + }, + { + "type": "string", + "enum": [ + "create", + "update" + ] + } + ] + } + }, + "required": [ + "label", + "value" + ], + "type": "object" + }, + "type": "array" + }, + "description": { + "type": "string" + }, + "maxItems": { + "type": "number" + }, + "minItems": { + "type": "number" + }, + "default": { + "items": { + "type": "string" + }, + "type": "array" + }, + "example": { + "items": { + "type": "string" + }, + "type": "array" + }, + "ui:label": { + "type": "string" + }, + "ui:read-only": { + "oneOf": [ + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + }, + { + "type": "string", + "enum": [ + "create", + "update" + ] + } + ] + }, + "ui:hidden": { + "oneOf": [ + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + }, + { + "type": "string", + "enum": [ + "create", + "update" + ] + } + ] + }, + "ui:disabled": { + "oneOf": [ + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + }, + { + "type": "string", + "enum": [ + "create", + "update" + ] + } + ] + }, + "ui:description": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + } + ] + }, + "ui:formatted-value": { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + "ui:paid-only": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "ui:placeholder": { + "type": "string" + } + }, + "required": [ + "items", + "type", + "ui:control", + "ui:options" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "string" + ] + }, + "ui:control": { + "type": "string", + "enum": [ + "vercel-region" + ] + }, + "ui:options": { + "items": { + "oneOf": [ + { + "properties": { + "value": { + "type": "string" + }, + "label": { + "type": "string" + }, + "description": { + "type": "string" + }, + "disabled": { + "oneOf": [ + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + }, + { + "type": "string", + "enum": [ + "create", + "update" + ] + } + ] + }, + "hidden": { + "oneOf": [ + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + }, + { + "type": "string", + "enum": [ + "create", + "update" + ] + } + ] + } + }, + "required": [ + "label", + "value" + ], + "type": "object" + }, + { + "type": "string" + }, + { + "properties": { + "value": { + "type": "string" + }, + "description": { + "type": "string" + }, + "disabled": { + "oneOf": [ + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + }, + { + "type": "string", + "enum": [ + "create", + "update" + ] + } + ] + }, + "hidden": { + "oneOf": [ + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + }, + { + "type": "string", + "enum": [ + "create", + "update" + ] + } + ] + } + }, + "required": [ + "value" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "description": { + "type": "string" + }, + "enum": { + "items": { + "type": "string" + }, + "type": "array" + }, + "maxLength": { + "type": "number" + }, + "minLength": { + "type": "number" + }, + "pattern": { + "type": "string" + }, + "default": { + "type": "string" + }, + "ui:label": { + "type": "string" + }, + "ui:read-only": { + "oneOf": [ + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + }, + { + "type": "string", + "enum": [ + "create", + "update" + ] + } + ] + }, + "ui:hidden": { + "oneOf": [ + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + }, + { + "type": "string", + "enum": [ + "create", + "update" + ] + } + ] + }, + "ui:disabled": { + "oneOf": [ + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + }, + { + "type": "string", + "enum": [ + "create", + "update" + ] + } + ] + }, + "ui:description": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + } + ] + }, + "ui:formatted-value": { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + "ui:paid-only": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "ui:placeholder": { + "type": "string" + } + }, + "required": [ + "type", + "ui:control", + "ui:options" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "array" + ] + }, + "items": { + "properties": { + "type": { + "type": "string", + "enum": [ + "string" + ] + }, + "description": { + "type": "string" + }, + "enum": { + "items": { + "type": "string" + }, + "type": "array" + }, + "maxLength": { + "type": "number" + }, + "minLength": { + "type": "number" + }, + "pattern": { + "type": "string" + }, + "default": { + "type": "string" + } + }, + "required": [ + "type" + ], + "type": "object" + }, + "ui:control": { + "type": "string", + "enum": [ + "multi-vercel-region" + ] + }, + "ui:options": { + "items": { + "oneOf": [ + { + "properties": { + "value": { + "type": "string" + }, + "label": { + "type": "string" + }, + "description": { + "type": "string" + }, + "disabled": { + "oneOf": [ + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + }, + { + "type": "string", + "enum": [ + "create", + "update" + ] + } + ] + }, + "hidden": { + "oneOf": [ + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + }, + { + "type": "string", + "enum": [ + "create", + "update" + ] + } + ] + } + }, + "required": [ + "label", + "value" + ], + "type": "object" + }, + { + "type": "string" + }, + { + "properties": { + "value": { + "type": "string" + }, + "description": { + "type": "string" + }, + "disabled": { + "oneOf": [ + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + }, + { + "type": "string", + "enum": [ + "create", + "update" + ] + } + ] + }, + "hidden": { + "oneOf": [ + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + }, + { + "type": "string", + "enum": [ + "create", + "update" + ] + } + ] + } + }, + "required": [ + "value" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "description": { + "type": "string" + }, + "maxItems": { + "type": "number" + }, + "minItems": { + "type": "number" + }, + "default": { + "items": { + "type": "string" + }, + "type": "array" + }, + "example": { + "items": { + "type": "string" + }, + "type": "array" + }, + "ui:label": { + "type": "string" + }, + "ui:read-only": { + "oneOf": [ + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + }, + { + "type": "string", + "enum": [ + "create", + "update" + ] + } + ] + }, + "ui:hidden": { + "oneOf": [ + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + }, + { + "type": "string", + "enum": [ + "create", + "update" + ] + } + ] + }, + "ui:disabled": { + "oneOf": [ + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + }, + { + "type": "string", + "enum": [ + "create", + "update" + ] + } + ] + }, + "ui:description": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + } + ] + }, + "ui:formatted-value": { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + "ui:paid-only": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "ui:placeholder": { + "type": "string" + } + }, + "required": [ + "items", + "type", + "ui:control", + "ui:options" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "string" + ] + }, + "ui:control": { + "type": "string", + "enum": [ + "vercel-country" + ] + }, + "ui:options": { + "items": { + "oneOf": [ + { + "properties": { + "value": { + "type": "string" + }, + "label": { + "type": "string" + }, + "description": { + "type": "string" + }, + "disabled": { + "oneOf": [ + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + }, + { + "type": "string", + "enum": [ + "create", + "update" + ] + } + ] + }, + "hidden": { + "oneOf": [ + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + }, + { + "type": "string", + "enum": [ + "create", + "update" + ] + } + ] + } + }, + "required": [ + "label", + "value" + ], + "type": "object" + }, + { + "type": "string" + }, + { + "properties": { + "value": { + "type": "string" + }, + "description": { + "type": "string" + }, + "disabled": { + "oneOf": [ + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + }, + { + "type": "string", + "enum": [ + "create", + "update" + ] + } + ] + }, + "hidden": { + "oneOf": [ + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + }, + { + "type": "string", + "enum": [ + "create", + "update" + ] + } + ] + } + }, + "required": [ + "value" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "description": { + "type": "string" + }, + "enum": { + "items": { + "type": "string" + }, + "type": "array" + }, + "maxLength": { + "type": "number" + }, + "minLength": { + "type": "number" + }, + "pattern": { + "type": "string" + }, + "default": { + "type": "string" + }, + "ui:label": { + "type": "string" + }, + "ui:read-only": { + "oneOf": [ + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + }, + { + "type": "string", + "enum": [ + "create", + "update" + ] + } + ] + }, + "ui:hidden": { + "oneOf": [ + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + }, + { + "type": "string", + "enum": [ + "create", + "update" + ] + } + ] + }, + "ui:disabled": { + "oneOf": [ + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + }, + { + "type": "string", + "enum": [ + "create", + "update" + ] + } + ] + }, + "ui:description": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + } + ] + }, + "ui:formatted-value": { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + "ui:paid-only": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "ui:placeholder": { + "type": "string" + } + }, + "required": [ + "type", + "ui:control", + "ui:options" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "string" + ] + }, + "ui:control": { + "type": "string", + "enum": [ + "domain" + ] + }, + "description": { + "type": "string" + }, + "enum": { + "items": { + "type": "string" + }, + "type": "array" + }, + "maxLength": { + "type": "number" + }, + "minLength": { + "type": "number" + }, + "pattern": { + "type": "string" + }, + "default": { + "type": "string" + }, + "ui:label": { + "type": "string" + }, + "ui:read-only": { + "oneOf": [ + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + }, + { + "type": "string", + "enum": [ + "create", + "update" + ] + } + ] + }, + "ui:hidden": { + "oneOf": [ + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + }, + { + "type": "string", + "enum": [ + "create", + "update" + ] + } + ] + }, + "ui:disabled": { + "oneOf": [ + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + }, + { + "type": "string", + "enum": [ + "create", + "update" + ] + } + ] + }, + "ui:description": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + } + ] + }, + "ui:formatted-value": { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + "ui:paid-only": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "ui:placeholder": { + "type": "string" + } + }, + "required": [ + "type", + "ui:control" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "string" + ] + }, + "ui:control": { + "type": "string", + "enum": [ + "git-namespace" + ] + }, + "description": { + "type": "string" + }, + "ui:label": { + "type": "string" + }, + "ui:read-only": { + "oneOf": [ + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + }, + { + "type": "string", + "enum": [ + "create", + "update" + ] + } + ] + }, + "ui:hidden": { + "oneOf": [ + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + }, + { + "type": "string", + "enum": [ + "create", + "update" + ] + } + ] + }, + "ui:disabled": { + "oneOf": [ + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + }, + { + "type": "string", + "enum": [ + "create", + "update" + ] + } + ] + }, + "ui:description": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + } + ] + }, + "ui:formatted-value": { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + "ui:paid-only": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "ui:placeholder": { + "type": "string" + }, + "git:providers": { + "items": { + "type": "string", + "enum": [ + "bitbucket", + "github", + "gitlab" + ] + }, + "type": "array" + } + }, + "required": [ + "type", + "ui:control" + ], + "type": "object" + } + ] + }, + "type": "object" + }, + "required": { + "items": { + "type": "string" + }, + "type": "array" + }, + "ui:order": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "properties", + "type" + ], + "type": "object" + } + }, + "required": [ + "id", + "metadataSchema", + "name", + "protocols", + "slug" + ], + "type": "object" + }, + "type": "array" + }, + "integration": { + "properties": { + "id": { + "type": "string" + }, + "slug": { + "type": "string" + }, + "name": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "slug" + ], + "type": "object" + }, + "configuration": { + "properties": { + "id": { + "type": "string" + } + }, + "required": [ + "id" + ], + "type": "object" + } + }, + "required": [ + "configuration", + "integration", + "products" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + }, + "500": { + "description": "" + } + }, + "parameters": [ + { + "name": "id", + "description": "ID of the integration configuration", + "in": "path", + "required": true, + "schema": { + "type": "string", + "description": "ID of the integration configuration", + "example": "icfg_cuwj0AdCdH3BwWT4LPijCC7t" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + } + }, + "/v1/integrations/sso/token": { + "post": { + "description": "During the autorization process, Vercel sends the user to the provider [redirectLoginUrl](https://vercel.com/docs/integrations/create-integration/submit-integration#redirect-login-url), that includes the OAuth authorization `code` parameter. The provider then calls the SSO Token Exchange endpoint with the sent code and receives the OIDC token. They log the user in based on this token and redirects the user back to the Vercel account using deep-link parameters included the redirectLoginUrl. Providers should not persist the returned `id_token` in a database since the token will expire. See [**Authentication with SSO**](https://vercel.com/docs/integrations/create-integration/marketplace-api#authentication-with-sso) for more details.", + "operationId": "exchange-sso-token", + "security": [], + "summary": "SSO Token Exchange", + "tags": [ + "authentication", + "marketplace" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "oneOf": [ + { + "properties": { + "id_token": { + "type": "string" + }, + "token_type": { + "nullable": true, + "type": "string" + }, + "expires_in": { + "type": "number" + }, + "access_token": { + "nullable": true, + "type": "string" + }, + "refresh_token": { + "type": "string" + } + }, + "required": [ + "access_token", + "id_token", + "token_type" + ], + "type": "object" + }, + { + "properties": { + "id_token": { + "type": "string" + }, + "token_type": { + "type": "string" + }, + "access_token": { + "type": "string" + }, + "refresh_token": { + "type": "string" + }, + "expires_in": { + "type": "number" + } + }, + "required": [ + "access_token", + "expires_in", + "id_token", + "refresh_token", + "token_type" + ], + "type": "object" + } + ] + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid." + }, + "403": { + "description": "" + }, + "500": { + "description": "" + } + }, + "parameters": [], + "requestBody": { + "content": { + "application/json": { + "schema": { + "oneOf": [ + { + "type": "object", + "required": [ + "code", + "client_id", + "client_secret", + "grant_type" + ], + "properties": { + "code": { + "type": "string", + "description": "The sensitive code received from Vercel" + }, + "state": { + "type": "string", + "description": "The state received from the initialization request" + }, + "client_id": { + "type": "string", + "description": "The integration client id" + }, + "client_secret": { + "type": "string", + "description": "The integration client secret" + }, + "redirect_uri": { + "type": "string", + "description": "The integration redirect URI" + }, + "grant_type": { + "type": "string", + "description": "The grant type, when using x-www-form-urlencoded content type", + "enum": [ + "authorization_code" + ] + } + } + }, + { + "type": "object", + "required": [ + "refresh_token", + "client_id", + "client_secret", + "grant_type" + ], + "properties": { + "refresh_token": { + "type": "string", + "description": "The refresh token received from previous token exchange" + }, + "client_id": { + "type": "string", + "description": "The integration client id" + }, + "client_secret": { + "type": "string", + "description": "The integration client secret" + }, + "grant_type": { + "type": "string", + "description": "The grant type, when using x-www-form-urlencoded content type", + "enum": [ + "refresh_token" + ] + } + } + } + ] + } + } + }, + "required": true + } + } + }, + "/v2/integrations/log-drains": { + "get": { + "description": "Retrieves a list of all Integration log drains that are defined for the authenticated user or team. When using an OAuth2 token, the list is limited to log drains created by the authenticated integration.", + "operationId": "getIntegrationLogDrains", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Retrieves a list of Integration log drains (deprecated)", + "tags": [ + "logDrains" + ], + "responses": { + "200": { + "description": "A list of log drains", + "content": { + "application/json": { + "schema": { + "items": { + "properties": { + "clientId": { + "type": "string", + "description": "The oauth2 client application id that created this log drain", + "example": "oac_xRhY4LAB7yLhUADD69EvV7ct" + }, + "configurationId": { + "type": "string", + "description": "The client configuration this log drain was created with", + "example": "icfg_3bwCLgxL8qt5kjRLcv2Dit7F" + }, + "createdAt": { + "type": "number", + "description": "A timestamp that tells you when the log drain was created", + "example": 1558531915505 + }, + "id": { + "type": "string", + "description": "The unique identifier of the log drain. Always prefixed with `ld_`", + "example": "ld_nBuA7zCID8g4QZ8g" + }, + "deliveryFormat": { + "type": "string", + "enum": [ + "json", + "ndjson", + "protobuf" + ], + "description": "The delivery log format", + "example": "json" + }, + "name": { + "type": "string", + "description": "The name of the log drain", + "example": "My first log drain" + }, + "ownerId": { + "type": "string", + "description": "The identifier of the team or user whose events will trigger the log drain", + "example": "kr1PsOIzqEL5Xg6M4VZcZosf" + }, + "projectId": { + "nullable": true, + "type": "string", + "example": "AbCgVkqoxXeXCDWehVir51LHGrrcWL4mkYm14W6UBPWQeb" + }, + "projectIds": { + "items": { + "type": "string" + }, + "type": "array", + "description": "The identifier of the projects this log drain is associated with", + "example": "AbCgVkqoxXeXCDWehVir51LHGrrcWL4mkYm14W6UBPWQeb" + }, + "url": { + "type": "string", + "description": "The URL to call when logs are generated", + "example": "https://example.com/log-drain" + }, + "sources": { + "items": { + "type": "string", + "enum": [ + "build", + "edge", + "external", + "firewall", + "lambda", + "redirect", + "static" + ], + "description": "The sources from which logs are currently being delivered to this log drain.", + "example": [ + "build", + "edge" + ] + }, + "type": "array", + "description": "The sources from which logs are currently being delivered to this log drain.", + "example": [ + "build", + "edge" + ] + }, + "createdFrom": { + "type": "string", + "enum": [ + "integration", + "self-served" + ], + "description": "Whether the log drain was created by an integration or by a user", + "example": "integration" + }, + "headers": { + "additionalProperties": { + "type": "string" + }, + "type": "object", + "description": "The headers to send with the request", + "example": "{\"Authorization\": \"Bearer 123\"}" + }, + "environments": { + "items": { + "type": "string", + "enum": [ + "preview", + "production" + ], + "description": "The environment of log drain", + "example": [ + "production" + ] + }, + "type": "array", + "description": "The environment of log drain", + "example": [ + "production" + ] + }, + "branch": { + "type": "string", + "description": "The branch regexp of log drain", + "example": "feature/*" + }, + "samplingRate": { + "type": "number", + "description": "The sampling rate of log drain", + "example": 0.5 + }, + "source": { + "oneOf": [ + { + "properties": { + "kind": { + "type": "string", + "enum": [ + "self-served" + ] + } + }, + "required": [ + "kind" + ], + "type": "object" + }, + { + "properties": { + "kind": { + "type": "string", + "enum": [ + "integration" + ] + }, + "resourceId": { + "type": "string" + }, + "externalResourceId": { + "type": "string" + }, + "integrationId": { + "type": "string" + }, + "integrationConfigurationId": { + "type": "string" + } + }, + "required": [ + "integrationConfigurationId", + "integrationId", + "kind" + ], + "type": "object" + } + ] + } + }, + "required": [ + "createdAt", + "id", + "name", + "ownerId", + "source", + "url" + ], + "type": "object" + }, + "type": "array" + } + } + } + }, + "400": { + "description": "" + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + }, + "post": { + "description": "Creates an Integration log drain. This endpoint must be called with an OAuth2 client (integration), since log drains are tied to integrations. If it is called with a different token type it will produce a 400 error.", + "operationId": "createLogDrain", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Creates a new Integration Log Drain (deprecated)", + "tags": [ + "logDrains" + ], + "responses": { + "200": { + "description": "The log drain was successfully created", + "content": { + "application/json": { + "schema": { + "properties": { + "clientId": { + "type": "string", + "description": "The oauth2 client application id that created this log drain", + "example": "oac_xRhY4LAB7yLhUADD69EvV7ct" + }, + "configurationId": { + "type": "string", + "description": "The client configuration this log drain was created with", + "example": "icfg_3bwCLgxL8qt5kjRLcv2Dit7F" + }, + "createdAt": { + "type": "number", + "description": "A timestamp that tells you when the log drain was created", + "example": 1558531915505 + }, + "id": { + "type": "string", + "description": "The unique identifier of the log drain. Always prefixed with `ld_`", + "example": "ld_nBuA7zCID8g4QZ8g" + }, + "deliveryFormat": { + "type": "string", + "enum": [ + "json", + "ndjson", + "protobuf" + ], + "description": "The delivery log format", + "example": "json" + }, + "name": { + "type": "string", + "description": "The name of the log drain", + "example": "My first log drain" + }, + "ownerId": { + "type": "string", + "description": "The identifier of the team or user whose events will trigger the log drain", + "example": "kr1PsOIzqEL5Xg6M4VZcZosf" + }, + "projectId": { + "nullable": true, + "type": "string", + "example": "AbCgVkqoxXeXCDWehVir51LHGrrcWL4mkYm14W6UBPWQeb" + }, + "projectIds": { + "items": { + "type": "string" + }, + "type": "array", + "description": "The identifier of the projects this log drain is associated with", + "example": "AbCgVkqoxXeXCDWehVir51LHGrrcWL4mkYm14W6UBPWQeb" + }, + "url": { + "type": "string", + "description": "The URL to call when logs are generated", + "example": "https://example.com/log-drain" + }, + "sources": { + "items": { + "type": "string", + "enum": [ + "build", + "edge", + "external", + "firewall", + "lambda", + "redirect", + "static" + ], + "description": "The sources from which logs are currently being delivered to this log drain.", + "example": [ + "build", + "edge" + ] + }, + "type": "array", + "description": "The sources from which logs are currently being delivered to this log drain.", + "example": [ + "build", + "edge" + ] + }, + "createdFrom": { + "type": "string", + "enum": [ + "integration", + "self-served" + ], + "description": "Whether the log drain was created by an integration or by a user", + "example": "integration" + }, + "headers": { + "additionalProperties": { + "type": "string" + }, + "type": "object", + "description": "The headers to send with the request", + "example": "{\"Authorization\": \"Bearer 123\"}" + }, + "environments": { + "items": { + "type": "string", + "enum": [ + "preview", + "production" + ], + "description": "The environment of log drain", + "example": [ + "production" + ] + }, + "type": "array", + "description": "The environment of log drain", + "example": [ + "production" + ] + }, + "branch": { + "type": "string", + "description": "The branch regexp of log drain", + "example": "feature/*" + }, + "samplingRate": { + "type": "number", + "description": "The sampling rate of log drain", + "example": 0.5 + }, + "source": { + "oneOf": [ + { + "properties": { + "kind": { + "type": "string", + "enum": [ + "self-served" + ] + } + }, + "required": [ + "kind" + ], + "type": "object" + }, + { + "properties": { + "kind": { + "type": "string", + "enum": [ + "integration" + ] + }, + "resourceId": { + "type": "string" + }, + "externalResourceId": { + "type": "string" + }, + "integrationId": { + "type": "string" + }, + "integrationConfigurationId": { + "type": "string" + } + }, + "required": [ + "integrationConfigurationId", + "integrationId", + "kind" + ], + "type": "object" + } + ] + } + }, + "required": [ + "createdAt", + "id", + "name", + "ownerId", + "source", + "url" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid.\nThe provided token is not from an OAuth2 Client" + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "name": { + "description": "The name of the log drain", + "example": "My first log drain", + "maxLength": 100, + "pattern": "^[A-z0-9_ -]+$", + "type": "string" + }, + "projectIds": { + "minItems": 1, + "maxItems": 50, + "type": "array", + "items": { + "pattern": "^[a-zA-z0-9_]+$", + "type": "string" + } + }, + "secret": { + "description": "A secret to sign log drain notification headers so a consumer can verify their authenticity", + "example": "a1Xsfd325fXcs", + "maxLength": 100, + "pattern": "^[A-z0-9_ -]+$", + "type": "string" + }, + "deliveryFormat": { + "description": "The delivery log format", + "example": "json", + "enum": [ + "json", + "ndjson" + ] + }, + "url": { + "description": "The url where you will receive logs. The protocol must be `https://` or `http://` when type is `json` and `ndjson`.", + "example": "https://example.com/log-drain", + "format": "uri", + "pattern": "^https?://", + "type": "string" + }, + "sources": { + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "enum": [ + "static", + "lambda", + "build", + "edge", + "external", + "firewall" + ] + }, + "minItems": 1 + }, + "headers": { + "description": "Headers to be sent together with the request", + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "environments": { + "type": "array", + "uniqueItems": true, + "items": { + "type": "string", + "enum": [ + "preview", + "production" + ] + }, + "minItems": 1 + } + }, + "required": [ + "name", + "url" + ], + "type": "object" + } + } + }, + "required": true + } + } + }, + "/v1/integrations/log-drains/{id}": { + "delete": { + "description": "Deletes the Integration log drain with the provided `id`. When using an OAuth2 Token, the log drain can be deleted only if the integration owns it.", + "operationId": "deleteIntegrationLogDrain", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Deletes the Integration log drain with the provided `id` (deprecated)", + "tags": [ + "logDrains" + ], + "responses": { + "204": { + "description": "The log drain was successfully deleted" + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "id", + "description": "ID of the log drain to be deleted", + "in": "path", + "required": true, + "schema": { + "description": "ID of the log drain to be deleted", + "type": "string" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + } + }, + "/api-keys": { + "post": { + "description": "", + "operationId": "createApiKeys", + "security": [], + "tags": [], + "responses": { + "200": { + "description": "Successfully created an API key.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "apiKeyString": { + "description": "The API key's actual value. This value is only provided in this response, and can never be retrieved again in the future. Be sure to save it somewhere safe!", + "example": "uRKJSTt0L4RaSkiMj41QTkxM", + "type": "string" + }, + "apiKey": { + "$ref": "#/components/schemas/APIKey" + } + }, + "required": [ + "apiKeyString", + "apiKey" + ] + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid." + }, + "401": { + "description": "The request is not authorized.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + } + }, + "required": [ + "code", + "message" + ] + } + }, + "required": [ + "error" + ] + } + } + } + }, + "403": { + "description": "You do not have permission to access this resource.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + } + }, + "required": [ + "code", + "message" + ] + } + }, + "required": [ + "error" + ] + } + } + } + }, + "409": { + "description": "" + }, + "410": { + "description": "" + }, + "429": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "code": { + "type": "string" + }, + "name": { + "type": "string" + }, + "message": { + "type": "string" + }, + "limit": { + "type": "number" + } + }, + "required": [ + "code", + "name", + "message", + "limit" + ] + } + }, + "required": [ + "error" + ] + } + } + } + }, + "500": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "error": { + "type": "object", + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + } + }, + "required": [ + "code", + "message" + ] + } + }, + "required": [ + "error" + ] + } + } + } + } + }, + "parameters": [], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "purpose" + ], + "properties": { + "purpose": { + "type": "string", + "description": "The API key's purpose, which restricts how it can be used." + }, + "projectId": { + "type": "string", + "description": "An optional project to restrict the API key to.", + "example": "prj_12HKQaOmR5t5Uy6vdcQsNIiZgHGB" + }, + "name": { + "type": "string", + "description": "An optional name for the API key.", + "example": "API Key for App 123" + }, + "expiresAt": { + "type": "number", + "description": "The API key's expiration, expressed as a UNIX timestamp in milliseconds." + }, + "aiGatewayQuota": { + "type": "object", + "description": "Optional AI Gateway quota configuration for the API key.", + "properties": { + "limitAmount": { + "type": "number", + "minimum": 1, + "description": "The quota limit amount." + }, + "includeByokInQuota": { + "type": "boolean", + "default": false, + "description": "Whether to include BYOK (Bring Your Own Key) usage in the quota." + }, + "refreshPeriod": { + "type": "string", + "enum": [ + "daily", + "weekly", + "monthly", + "none" + ], + "default": "none", + "description": "How often the quota refreshes." + }, + "alertThresholds": { + "type": "array", + "items": { + "type": "number", + "enum": [ + 50, + 75, + 100 + ] + }, + "description": "Spend percentages (a subset of [50, 75, 100]) at which to send a spend alert." + } + }, + "required": [ + "limitAmount" + ] + }, + "metadata": { + "type": "object", + "description": "Optional generic metadata for the API key. The accepted shape depends on the key's `purpose` and is validated on creation; for `ai-gateway` keys this accepts `environment`.", + "additionalProperties": true + } + } + } + } + } + } + } + }, + "/v1/kms/issuers": { + "get": { + "description": "Retrieve the list of KMS issuers that belong to the authenticated team. The results are paginated.", + "operationId": "listKmsIssuers", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "List issuers", + "tags": [ + "kms" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "issuers": { + "items": { + "properties": { + "id": { + "type": "string" + }, + "ownerId": { + "type": "string" + }, + "name": { + "type": "string" + }, + "algorithm": { + "type": "string", + "enum": [ + "ES256", + "ES384", + "ES512", + "EdDSA", + "PS256", + "PS384", + "PS512", + "RS256", + "RS384", + "RS512" + ] + }, + "origin": { + "type": "string", + "enum": [ + "external", + "vercel" + ] + }, + "managedBy": { + "type": "string" + }, + "claimsSchema": { + "additionalProperties": true, + "type": "object" + }, + "createdAt": { + "type": "string" + }, + "updatedAt": { + "type": "string" + }, + "signingKeys": { + "items": { + "properties": { + "keyId": { + "type": "string", + "description": "The server-minted, unique record identifier. Use this to address the key on the activate / certificate endpoints." + }, + "importKeyId": { + "type": "string", + "description": "The caller-supplied key id (imported keys only), used as the JWT/JWKS `kid`. Not unique across an issuer's keys; omitted for generated keys." + }, + "issuerId": { + "type": "string" + }, + "algorithm": { + "type": "string" + }, + "status": { + "type": "string", + "enum": [ + "active", + "pending", + "revoking" + ] + }, + "publicKey": { + "properties": { + "kty": { + "type": "string" + }, + "kid": { + "type": "string" + }, + "alg": { + "type": "string" + }, + "use": { + "type": "string" + }, + "key_ops": { + "items": { + "type": "string" + }, + "type": "array" + }, + "x5c": { + "items": { + "type": "string" + }, + "type": "array", + "description": "The X.509 certificate chain (RFC 7517 §4.7). Each entry is the base64 DER (not base64url) of a certificate. For keys minted with a stored certificate this holds the single self-signed cert as `[x5c]`." + }, + "x5t#S256": { + "type": "string", + "description": "The base64url SHA-256 thumbprint of the DER certificate in `x5c[0]` (RFC 7517 §4.9)." + } + }, + "type": "object" + }, + "publicKeyFingerprint": { + "type": "string" + }, + "publicKeyPem": { + "type": "string", + "description": "The public key in SPKI PEM form, ready to render. Present whenever the key has public key material. Derived from `publicKey`; the embedded certificate members (`x5c`/`x5t#S256`) do not affect it." + }, + "certificatePem": { + "type": "string", + "description": "The stored X.509 certificate (from `publicKey.x5c[0]`) in PEM form, ready to render. Present only for keys created with a stored certificate; omitted for keys created before certificates were stored." + }, + "createdAt": { + "type": "string" + }, + "updatedAt": { + "type": "string" + }, + "revokeAt": { + "type": "string" + }, + "activateAt": { + "type": "string" + }, + "activatedAt": { + "type": "string", + "description": "When the key became the active signer. Present for active and revoking keys (and absent for pending keys and rows predating this field)." + } + }, + "required": [ + "algorithm", + "createdAt", + "issuerId", + "keyId", + "status", + "updatedAt" + ], + "type": "object" + }, + "type": "array" + }, + "policies": { + "items": { + "oneOf": [ + { + "properties": { + "kind": { + "type": "string", + "enum": [ + "project-grant" + ] + }, + "teamId": { + "type": "string" + }, + "projectId": { + "type": "string" + }, + "environments": { + "items": { + "type": "string" + }, + "type": "array", + "description": "Environments whose OIDC tokens this grant authorizes. Each entry is either a system environment slug (`production`, `preview`, `development`) or a custom environment ID (prefixed `env_`). Custom environments are matched against the token's `custom_environment_id` claim (the stable ID); system environments against its `environment` claim." + }, + "tokenClaims": { + "additionalProperties": true, + "type": "object" + }, + "createdAt": { + "type": "string" + }, + "updatedAt": { + "type": "string" + } + }, + "required": [ + "createdAt", + "environments", + "kind", + "projectId", + "teamId", + "updatedAt" + ], + "type": "object" + }, + { + "properties": { + "kind": { + "type": "string", + "enum": [ + "connex-grant" + ] + }, + "clientId": { + "type": "string" + }, + "tokenClaims": { + "additionalProperties": true, + "type": "object" + }, + "createdAt": { + "type": "string" + }, + "updatedAt": { + "type": "string" + } + }, + "required": [ + "clientId", + "createdAt", + "kind", + "updatedAt" + ], + "type": "object" + } + ] + }, + "type": "array" + } + }, + "required": [ + "algorithm", + "createdAt", + "id", + "name", + "origin", + "ownerId", + "policies", + "signingKeys", + "updatedAt" + ], + "type": "object" + }, + "type": "array" + }, + "pagination": { + "properties": { + "count": { + "type": "number" + }, + "next": { + "nullable": true, + "type": "string" + } + }, + "required": [ + "count", + "next" + ], + "type": "object" + } + }, + "required": [ + "issuers", + "pagination" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "limit", + "description": "Maximum number of issuers to return.", + "in": "query", + "schema": { + "type": "integer", + "minimum": 1, + "maximum": 100, + "description": "Maximum number of issuers to return." + } + }, + { + "name": "next", + "description": "Continuation cursor to retrieve the next page of results.", + "in": "query", + "schema": { + "type": "string", + "maxLength": 1024, + "pattern": "^[A-Za-z0-9_-]+$", + "description": "Continuation cursor to retrieve the next page of results." + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + }, + "post": { + "description": "Create a new KMS issuer for the authenticated team. An issuer owns the asymmetric signing keys that are used to sign tokens and messages.", + "operationId": "createKmsIssuer", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Create an issuer", + "tags": [ + "kms" + ], + "responses": { + "201": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "id": { + "type": "string" + }, + "ownerId": { + "type": "string" + }, + "name": { + "type": "string" + }, + "algorithm": { + "type": "string", + "enum": [ + "ES256", + "ES384", + "ES512", + "EdDSA", + "PS256", + "PS384", + "PS512", + "RS256", + "RS384", + "RS512" + ] + }, + "origin": { + "type": "string", + "enum": [ + "external", + "vercel" + ] + }, + "managedBy": { + "type": "string" + }, + "claimsSchema": { + "additionalProperties": true, + "type": "object" + }, + "createdAt": { + "type": "string" + }, + "updatedAt": { + "type": "string" + }, + "signingKeys": { + "items": { + "properties": { + "keyId": { + "type": "string", + "description": "The server-minted, unique record identifier. Use this to address the key on the activate / certificate endpoints." + }, + "importKeyId": { + "type": "string", + "description": "The caller-supplied key id (imported keys only), used as the JWT/JWKS `kid`. Not unique across an issuer's keys; omitted for generated keys." + }, + "issuerId": { + "type": "string" + }, + "algorithm": { + "type": "string" + }, + "status": { + "type": "string", + "enum": [ + "active", + "pending", + "revoking" + ] + }, + "publicKey": { + "properties": { + "kty": { + "type": "string" + }, + "kid": { + "type": "string" + }, + "alg": { + "type": "string" + }, + "use": { + "type": "string" + }, + "key_ops": { + "items": { + "type": "string" + }, + "type": "array" + }, + "x5c": { + "items": { + "type": "string" + }, + "type": "array", + "description": "The X.509 certificate chain (RFC 7517 §4.7). Each entry is the base64 DER (not base64url) of a certificate. For keys minted with a stored certificate this holds the single self-signed cert as `[x5c]`." + }, + "x5t#S256": { + "type": "string", + "description": "The base64url SHA-256 thumbprint of the DER certificate in `x5c[0]` (RFC 7517 §4.9)." + } + }, + "type": "object" + }, + "publicKeyFingerprint": { + "type": "string" + }, + "publicKeyPem": { + "type": "string", + "description": "The public key in SPKI PEM form, ready to render. Present whenever the key has public key material. Derived from `publicKey`; the embedded certificate members (`x5c`/`x5t#S256`) do not affect it." + }, + "certificatePem": { + "type": "string", + "description": "The stored X.509 certificate (from `publicKey.x5c[0]`) in PEM form, ready to render. Present only for keys created with a stored certificate; omitted for keys created before certificates were stored." + }, + "createdAt": { + "type": "string" + }, + "updatedAt": { + "type": "string" + }, + "revokeAt": { + "type": "string" + }, + "activateAt": { + "type": "string" + }, + "activatedAt": { + "type": "string", + "description": "When the key became the active signer. Present for active and revoking keys (and absent for pending keys and rows predating this field)." + } + }, + "required": [ + "algorithm", + "createdAt", + "issuerId", + "keyId", + "status", + "updatedAt" + ], + "type": "object" + }, + "type": "array" + }, + "policies": { + "items": { + "oneOf": [ + { + "properties": { + "kind": { + "type": "string", + "enum": [ + "project-grant" + ] + }, + "teamId": { + "type": "string" + }, + "projectId": { + "type": "string" + }, + "environments": { + "items": { + "type": "string" + }, + "type": "array", + "description": "Environments whose OIDC tokens this grant authorizes. Each entry is either a system environment slug (`production`, `preview`, `development`) or a custom environment ID (prefixed `env_`). Custom environments are matched against the token's `custom_environment_id` claim (the stable ID); system environments against its `environment` claim." + }, + "tokenClaims": { + "additionalProperties": true, + "type": "object" + }, + "createdAt": { + "type": "string" + }, + "updatedAt": { + "type": "string" + } + }, + "required": [ + "createdAt", + "environments", + "kind", + "projectId", + "teamId", + "updatedAt" + ], + "type": "object" + }, + { + "properties": { + "kind": { + "type": "string", + "enum": [ + "connex-grant" + ] + }, + "clientId": { + "type": "string" + }, + "tokenClaims": { + "additionalProperties": true, + "type": "object" + }, + "createdAt": { + "type": "string" + }, + "updatedAt": { + "type": "string" + } + }, + "required": [ + "clientId", + "createdAt", + "kind", + "updatedAt" + ], + "type": "object" + } + ] + }, + "type": "array" + } + }, + "required": [ + "algorithm", + "createdAt", + "id", + "name", + "origin", + "ownerId", + "policies", + "signingKeys", + "updatedAt" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "additionalProperties": false, + "required": [ + "name" + ], + "properties": { + "name": { + "type": "string", + "description": "The name of the issuer." + }, + "algorithm": { + "type": "string", + "description": "The signing algorithm to use for the issuer. EdDSA is not accepted for new issuers.", + "enum": [ + "RS256", + "RS384", + "RS512", + "PS256", + "PS384", + "PS512", + "ES256", + "ES384", + "ES512" + ], + "default": "RS512" + }, + "claimsSchema": { + "type": "object", + "description": "A JSON Schema used to validate the resolved token claims when signing tokens for this issuer.", + "additionalProperties": true + }, + "policy": { + "oneOf": [ + { + "type": "object", + "additionalProperties": false, + "required": [ + "kind", + "teamId", + "projectId", + "environments" + ], + "properties": { + "kind": { + "type": "string", + "enum": [ + "project-grant" + ] + }, + "teamId": { + "type": "string", + "description": "The team ID for the project grant policy." + }, + "projectId": { + "type": "string", + "description": "The project ID for the project grant policy." + }, + "environments": { + "type": "array", + "description": "The environments for the project grant policy. Each entry is a system environment (production, preview, development) or a custom environment ID (env_...).", + "items": { + "type": "string", + "pattern": "^(?:production|preview|development|env_.+)$" + }, + "minItems": 1, + "uniqueItems": true + }, + "tokenClaims": { + "type": "object", + "description": "The claims that KMS should include in signed JWTs for this policy.", + "additionalProperties": true + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "kind", + "clientId" + ], + "properties": { + "kind": { + "type": "string", + "enum": [ + "connex-grant" + ] + }, + "clientId": { + "type": "string", + "description": "The Connex client ID for the Connex grant policy." + }, + "tokenClaims": { + "type": "object", + "description": "The claims that KMS should include in signed JWTs for this policy.", + "additionalProperties": true + } + } + } + ] + }, + "importKey": { + "type": "string", + "description": "The PEM-encoded private key to use for the issuer." + }, + "importKeyId": { + "type": "string", + "description": "The key id to use as the imported key's JWT/JWKS `kid`. Only allowed when `importKey` is provided. Not required to be unique; the addressable key id is the server-minted `keyId` returned in the response.", + "maxLength": 128, + "pattern": "^[A-Za-z0-9._-]+$" + } + } + } + } + } + } + } + }, + "/v1/kms/issuers/{issuerId}/sign/message": { + "post": { + "description": "Sign a raw message with a KMS issuer's active signing key. Authenticate the request with a Vercel OIDC token in the `Authorization: Bearer` header; the issuer's policies decide which workloads are allowed to sign.", + "operationId": "signKmsMessage", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Sign a message", + "tags": [ + "kms" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "signature": { + "properties": { + "payload": { + "type": "string" + }, + "signature": { + "type": "string" + }, + "header": { + "properties": { + "alg": { + "type": "string", + "description": "JWS \"alg\" (Algorithm) Header Parameter" + }, + "b64": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "This JWS Extension Header Parameter modifies the JWS Payload representation and the JWS Signing Input computation as per {@link https://www.rfc-editor.org/rfc/rfc7797 RFC7797}." + }, + "crit": { + "items": { + "type": "string" + }, + "type": "array", + "description": "JWS \"crit\" (Critical) Header Parameter" + }, + "kid": { + "type": "string", + "description": "\"kid\" (Key ID) Header Parameter" + }, + "x5t": { + "type": "string", + "description": "\"x5t\" (X.509 Certificate SHA-1 Thumbprint) Header Parameter" + }, + "x5c": { + "items": { + "type": "string" + }, + "type": "array", + "description": "\"x5c\" (X.509 Certificate Chain) Header Parameter" + }, + "x5u": { + "type": "string", + "description": "\"x5u\" (X.509 URL) Header Parameter" + }, + "jku": { + "type": "string", + "description": "\"jku\" (JWK Set URL) Header Parameter" + }, + "jwk": { + "properties": { + "n": { + "type": "string", + "description": "RSA JWK \"n\" (Modulus) Parameter" + }, + "e": { + "type": "string", + "description": "RSA JWK \"e\" (Exponent) Parameter" + }, + "kty": { + "type": "string", + "description": "JWK \"kty\" (Key Type) Parameter" + }, + "crv": { + "type": "string", + "description": "- EC JWK \"crv\" (Curve) Parameter - OKP JWK \"crv\" (The Subtype of Key Pair) Parameter" + }, + "x": { + "type": "string", + "description": "- EC JWK \"x\" (X Coordinate) Parameter - OKP JWK \"x\" (The public key) Parameter" + }, + "y": { + "type": "string", + "description": "EC JWK \"y\" (Y Coordinate) Parameter" + }, + "alg": { + "type": "string", + "description": "JWK \"alg\" (Algorithm) Parameter" + }, + "pub": { + "type": "string", + "description": "AKP JWK \"pub\" (Public Key) Parameter" + } + }, + "type": "object", + "description": "\"jwk\" (JSON Web Key) Header Parameter" + }, + "typ": { + "type": "string", + "description": "\"typ\" (Type) Header Parameter" + }, + "cty": { + "type": "string", + "description": "\"cty\" (Content Type) Header Parameter" + } + }, + "type": "object", + "description": "The \"header\" member MUST be present and contain the value JWS Unprotected Header when the JWS Unprotected Header value is non- empty; otherwise, it MUST be absent. This value is represented as an unencoded JSON object, rather than as a string. These Header Parameter values are not integrity protected." + }, + "protected": { + "type": "string", + "description": "The \"protected\" member MUST be present and contain the value BASE64URL(UTF8(JWS Protected Header)) when the JWS Protected Header value is non-empty; otherwise, it MUST be absent. These Header Parameter values are integrity protected." + } + }, + "required": [ + "payload", + "signature" + ], + "type": "object", + "description": "Flattened JWS JSON Serialization Syntax token. Payload is returned as an empty string when JWS Unencoded Payload ({@link https://www.rfc-editor.org/rfc/rfc7797 RFC7797}) is used." + } + }, + "required": [ + "signature" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid.\nOne of the provided values in the request query is invalid." + }, + "401": { + "description": "" + }, + "403": { + "description": "" + }, + "404": { + "description": "" + }, + "429": { + "description": "" + } + }, + "parameters": [ + { + "name": "issuerId", + "description": "The ID of the issuer.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "description": "The ID of the issuer." + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "message" + ], + "properties": { + "message": { + "type": "string", + "description": "Base64-encoded message to be signed.", + "maxLength": 44000, + "pattern": "^[A-Za-z0-9+/]*={0,2}$" + } + } + } + } + } + } + } + }, + "/v1/kms/issuers/{issuerId}/sign/token": { + "post": { + "description": "Sign a JWT with a KMS issuer's active signing key. Authenticate the request with a Vercel OIDC token in the `Authorization: Bearer` header; the issuer's policies decide which workloads are allowed to sign.", + "operationId": "signKmsToken", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Sign a token", + "tags": [ + "kms" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "token": { + "type": "string" + } + }, + "required": [ + "token" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid.\nOne of the provided values in the request query is invalid." + }, + "401": { + "description": "" + }, + "403": { + "description": "" + }, + "404": { + "description": "" + }, + "429": { + "description": "" + } + }, + "parameters": [ + { + "name": "issuerId", + "description": "The ID of the issuer.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "description": "The ID of the issuer." + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "claims": { + "type": "object", + "description": "The claims to include in the token.", + "maxProperties": 128 + }, + "headers": { + "type": "object", + "description": "Additional headers to include in the token.", + "maxProperties": 64 + }, + "ttl": { + "type": "number", + "description": "The time-to-live for the token, in seconds.", + "default": 300, + "nullable": true + } + } + } + } + } + } + } + }, + "/v1/kms/issuers/{issuerId}/keys": { + "post": { + "description": "Create a new signing key for a KMS issuer. Depending on the activation mode, the key is activated automatically once its public key has propagated, or manually via the activate endpoint.", + "operationId": "createKmsSigningKey", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Create a signing key", + "tags": [ + "kms" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "keyId": { + "type": "string", + "description": "The server-minted, unique record identifier. Use this to address the key on the activate / certificate endpoints." + }, + "importKeyId": { + "type": "string", + "description": "The caller-supplied key id (imported keys only), used as the JWT/JWKS `kid`. Not unique across an issuer's keys; omitted for generated keys." + }, + "issuerId": { + "type": "string" + }, + "algorithm": { + "type": "string" + }, + "status": { + "type": "string", + "enum": [ + "active", + "pending", + "revoking" + ] + }, + "publicKey": { + "properties": { + "kty": { + "type": "string" + }, + "kid": { + "type": "string" + }, + "alg": { + "type": "string" + }, + "use": { + "type": "string" + }, + "key_ops": { + "items": { + "type": "string" + }, + "type": "array" + }, + "x5c": { + "items": { + "type": "string" + }, + "type": "array", + "description": "The X.509 certificate chain (RFC 7517 §4.7). Each entry is the base64 DER (not base64url) of a certificate. For keys minted with a stored certificate this holds the single self-signed cert as `[x5c]`." + }, + "x5t#S256": { + "type": "string", + "description": "The base64url SHA-256 thumbprint of the DER certificate in `x5c[0]` (RFC 7517 §4.9)." + } + }, + "type": "object" + }, + "publicKeyFingerprint": { + "type": "string" + }, + "publicKeyPem": { + "type": "string", + "description": "The public key in SPKI PEM form, ready to render. Present whenever the key has public key material. Derived from `publicKey`; the embedded certificate members (`x5c`/`x5t#S256`) do not affect it." + }, + "certificatePem": { + "type": "string", + "description": "The stored X.509 certificate (from `publicKey.x5c[0]`) in PEM form, ready to render. Present only for keys created with a stored certificate; omitted for keys created before certificates were stored." + }, + "createdAt": { + "type": "string" + }, + "updatedAt": { + "type": "string" + }, + "revokeAt": { + "type": "string" + }, + "activateAt": { + "type": "string" + }, + "activatedAt": { + "type": "string", + "description": "When the key became the active signer. Present for active and revoking keys (and absent for pending keys and rows predating this field)." + } + }, + "required": [ + "algorithm", + "createdAt", + "issuerId", + "keyId", + "status", + "updatedAt" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid.\nOne of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "409": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "issuerId", + "description": "The ID of the issuer.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "description": "The ID of the issuer." + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "additionalProperties": false, + "properties": { + "activation": { + "type": "string", + "enum": [ + "automatic", + "manual" + ], + "description": "Whether the new key is activated automatically after its public key has propagated, or manually via the activate endpoint. Defaults to `automatic`." + }, + "revokePreviousAfterHours": { + "type": "number", + "minimum": 0, + "description": "For automatic activation, how many hours after activation the previous signing key should stop being used. Defaults to a 1 hour grace period so already-issued tokens keep verifying." + }, + "revokePreviousAt": { + "description": "Deprecated. The ISO date string or timestamp when the previous signing key should stop being used. Converted to a relative grace and applied at activation, not creation. Prefer revokePreviousAfterHours.", + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "importKey": { + "type": "string", + "description": "The PEM-encoded private key to use for the issuer." + }, + "importKeyId": { + "type": "string", + "description": "The key id to use as the imported key's JWT/JWKS `kid`. Only allowed when `importKey` is provided. Not required to be unique; the addressable key id is the server-minted `keyId` returned in the response.", + "maxLength": 128, + "pattern": "^[A-Za-z0-9._-]+$" + } + } + } + } + } + } + } + }, + "/v1/kms/issuers/{issuerId}/keys/{keyId}/activate": { + "post": { + "description": "Activate a pending signing key so the issuer starts signing with it.", + "operationId": "activateKmsSigningKey", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Activate a signing key", + "tags": [ + "kms" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "keyId": { + "type": "string", + "description": "The server-minted, unique record identifier. Use this to address the key on the activate / certificate endpoints." + }, + "importKeyId": { + "type": "string", + "description": "The caller-supplied key id (imported keys only), used as the JWT/JWKS `kid`. Not unique across an issuer's keys; omitted for generated keys." + }, + "issuerId": { + "type": "string" + }, + "algorithm": { + "type": "string" + }, + "status": { + "type": "string", + "enum": [ + "active", + "pending", + "revoking" + ] + }, + "publicKey": { + "properties": { + "kty": { + "type": "string" + }, + "kid": { + "type": "string" + }, + "alg": { + "type": "string" + }, + "use": { + "type": "string" + }, + "key_ops": { + "items": { + "type": "string" + }, + "type": "array" + }, + "x5c": { + "items": { + "type": "string" + }, + "type": "array", + "description": "The X.509 certificate chain (RFC 7517 §4.7). Each entry is the base64 DER (not base64url) of a certificate. For keys minted with a stored certificate this holds the single self-signed cert as `[x5c]`." + }, + "x5t#S256": { + "type": "string", + "description": "The base64url SHA-256 thumbprint of the DER certificate in `x5c[0]` (RFC 7517 §4.9)." + } + }, + "type": "object" + }, + "publicKeyFingerprint": { + "type": "string" + }, + "publicKeyPem": { + "type": "string", + "description": "The public key in SPKI PEM form, ready to render. Present whenever the key has public key material. Derived from `publicKey`; the embedded certificate members (`x5c`/`x5t#S256`) do not affect it." + }, + "certificatePem": { + "type": "string", + "description": "The stored X.509 certificate (from `publicKey.x5c[0]`) in PEM form, ready to render. Present only for keys created with a stored certificate; omitted for keys created before certificates were stored." + }, + "createdAt": { + "type": "string" + }, + "updatedAt": { + "type": "string" + }, + "revokeAt": { + "type": "string" + }, + "activateAt": { + "type": "string" + }, + "activatedAt": { + "type": "string", + "description": "When the key became the active signer. Present for active and revoking keys (and absent for pending keys and rows predating this field)." + } + }, + "required": [ + "algorithm", + "createdAt", + "issuerId", + "keyId", + "status", + "updatedAt" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid.\nOne of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "409": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "issuerId", + "description": "The ID of the issuer.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "description": "The ID of the issuer." + } + }, + { + "name": "keyId", + "description": "The ID of the pending signing key to activate.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "description": "The ID of the pending signing key to activate." + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "additionalProperties": false, + "properties": { + "revokePreviousAfterHours": { + "type": "number", + "minimum": 0, + "description": "How many hours after activation the previously-active key should stop being used. Defaults to a 1 hour grace period so already-issued tokens keep verifying." + } + } + } + } + } + } + } + }, + "/v1/kms/issuers/{issuerId}/keys/{keyId}/revoke": { + "post": { + "description": "Immediately revoke a signing key that is already scheduled for revocation.", + "operationId": "revokeKmsSigningKey", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Revoke a signing key", + "tags": [ + "kms" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "id": { + "type": "string" + }, + "ownerId": { + "type": "string" + }, + "name": { + "type": "string" + }, + "algorithm": { + "type": "string", + "enum": [ + "ES256", + "ES384", + "ES512", + "EdDSA", + "PS256", + "PS384", + "PS512", + "RS256", + "RS384", + "RS512" + ] + }, + "origin": { + "type": "string", + "enum": [ + "external", + "vercel" + ] + }, + "managedBy": { + "type": "string" + }, + "claimsSchema": { + "additionalProperties": true, + "type": "object" + }, + "createdAt": { + "type": "string" + }, + "updatedAt": { + "type": "string" + }, + "signingKeys": { + "items": { + "properties": { + "keyId": { + "type": "string", + "description": "The server-minted, unique record identifier. Use this to address the key on the activate / certificate endpoints." + }, + "importKeyId": { + "type": "string", + "description": "The caller-supplied key id (imported keys only), used as the JWT/JWKS `kid`. Not unique across an issuer's keys; omitted for generated keys." + }, + "issuerId": { + "type": "string" + }, + "algorithm": { + "type": "string" + }, + "status": { + "type": "string", + "enum": [ + "active", + "pending", + "revoking" + ] + }, + "publicKey": { + "properties": { + "kty": { + "type": "string" + }, + "kid": { + "type": "string" + }, + "alg": { + "type": "string" + }, + "use": { + "type": "string" + }, + "key_ops": { + "items": { + "type": "string" + }, + "type": "array" + }, + "x5c": { + "items": { + "type": "string" + }, + "type": "array", + "description": "The X.509 certificate chain (RFC 7517 §4.7). Each entry is the base64 DER (not base64url) of a certificate. For keys minted with a stored certificate this holds the single self-signed cert as `[x5c]`." + }, + "x5t#S256": { + "type": "string", + "description": "The base64url SHA-256 thumbprint of the DER certificate in `x5c[0]` (RFC 7517 §4.9)." + } + }, + "type": "object" + }, + "publicKeyFingerprint": { + "type": "string" + }, + "publicKeyPem": { + "type": "string", + "description": "The public key in SPKI PEM form, ready to render. Present whenever the key has public key material. Derived from `publicKey`; the embedded certificate members (`x5c`/`x5t#S256`) do not affect it." + }, + "certificatePem": { + "type": "string", + "description": "The stored X.509 certificate (from `publicKey.x5c[0]`) in PEM form, ready to render. Present only for keys created with a stored certificate; omitted for keys created before certificates were stored." + }, + "createdAt": { + "type": "string" + }, + "updatedAt": { + "type": "string" + }, + "revokeAt": { + "type": "string" + }, + "activateAt": { + "type": "string" + }, + "activatedAt": { + "type": "string", + "description": "When the key became the active signer. Present for active and revoking keys (and absent for pending keys and rows predating this field)." + } + }, + "required": [ + "algorithm", + "createdAt", + "issuerId", + "keyId", + "status", + "updatedAt" + ], + "type": "object" + }, + "type": "array" + }, + "policies": { + "items": { + "oneOf": [ + { + "properties": { + "kind": { + "type": "string", + "enum": [ + "project-grant" + ] + }, + "teamId": { + "type": "string" + }, + "projectId": { + "type": "string" + }, + "environments": { + "items": { + "type": "string" + }, + "type": "array", + "description": "Environments whose OIDC tokens this grant authorizes. Each entry is either a system environment slug (`production`, `preview`, `development`) or a custom environment ID (prefixed `env_`). Custom environments are matched against the token's `custom_environment_id` claim (the stable ID); system environments against its `environment` claim." + }, + "tokenClaims": { + "additionalProperties": true, + "type": "object" + }, + "createdAt": { + "type": "string" + }, + "updatedAt": { + "type": "string" + } + }, + "required": [ + "createdAt", + "environments", + "kind", + "projectId", + "teamId", + "updatedAt" + ], + "type": "object" + }, + { + "properties": { + "kind": { + "type": "string", + "enum": [ + "connex-grant" + ] + }, + "clientId": { + "type": "string" + }, + "tokenClaims": { + "additionalProperties": true, + "type": "object" + }, + "createdAt": { + "type": "string" + }, + "updatedAt": { + "type": "string" + } + }, + "required": [ + "clientId", + "createdAt", + "kind", + "updatedAt" + ], + "type": "object" + } + ] + }, + "type": "array" + } + }, + "required": [ + "algorithm", + "createdAt", + "id", + "name", + "origin", + "ownerId", + "policies", + "signingKeys", + "updatedAt" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "409": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "issuerId", + "description": "The ID of the issuer.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "description": "The ID of the issuer." + } + }, + { + "name": "keyId", + "description": "The ID of the signing key to revoke immediately. The key must already be scheduled for revocation.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "description": "The ID of the signing key to revoke immediately. The key must already be scheduled for revocation." + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + } + }, + "/v1/kms/issuers/{issuerId}": { + "get": { + "description": "Retrieve a single KMS issuer by its ID. Accepts either a team bearer token (existing path) or an OIDC token authorized by one of the issuer's policies (e.g. a connex-grant token). The OIDC path returns the issuer without policies, since a policy token only proves signing access, not management access.", + "operationId": "getKmsIssuer", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Get an issuer", + "tags": [ + "kms" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "id": { + "type": "string" + }, + "ownerId": { + "type": "string" + }, + "name": { + "type": "string" + }, + "algorithm": { + "type": "string", + "enum": [ + "ES256", + "ES384", + "ES512", + "EdDSA", + "PS256", + "PS384", + "PS512", + "RS256", + "RS384", + "RS512" + ] + }, + "origin": { + "type": "string", + "enum": [ + "external", + "vercel" + ] + }, + "managedBy": { + "type": "string" + }, + "claimsSchema": { + "additionalProperties": true, + "type": "object" + }, + "createdAt": { + "type": "string" + }, + "updatedAt": { + "type": "string" + }, + "signingKeys": { + "items": { + "properties": { + "keyId": { + "type": "string", + "description": "The server-minted, unique record identifier. Use this to address the key on the activate / certificate endpoints." + }, + "importKeyId": { + "type": "string", + "description": "The caller-supplied key id (imported keys only), used as the JWT/JWKS `kid`. Not unique across an issuer's keys; omitted for generated keys." + }, + "issuerId": { + "type": "string" + }, + "algorithm": { + "type": "string" + }, + "status": { + "type": "string", + "enum": [ + "active", + "pending", + "revoking" + ] + }, + "publicKey": { + "properties": { + "kty": { + "type": "string" + }, + "kid": { + "type": "string" + }, + "alg": { + "type": "string" + }, + "use": { + "type": "string" + }, + "key_ops": { + "items": { + "type": "string" + }, + "type": "array" + }, + "x5c": { + "items": { + "type": "string" + }, + "type": "array", + "description": "The X.509 certificate chain (RFC 7517 §4.7). Each entry is the base64 DER (not base64url) of a certificate. For keys minted with a stored certificate this holds the single self-signed cert as `[x5c]`." + }, + "x5t#S256": { + "type": "string", + "description": "The base64url SHA-256 thumbprint of the DER certificate in `x5c[0]` (RFC 7517 §4.9)." + } + }, + "type": "object" + }, + "publicKeyFingerprint": { + "type": "string" + }, + "publicKeyPem": { + "type": "string", + "description": "The public key in SPKI PEM form, ready to render. Present whenever the key has public key material. Derived from `publicKey`; the embedded certificate members (`x5c`/`x5t#S256`) do not affect it." + }, + "certificatePem": { + "type": "string", + "description": "The stored X.509 certificate (from `publicKey.x5c[0]`) in PEM form, ready to render. Present only for keys created with a stored certificate; omitted for keys created before certificates were stored." + }, + "createdAt": { + "type": "string" + }, + "updatedAt": { + "type": "string" + }, + "revokeAt": { + "type": "string" + }, + "activateAt": { + "type": "string" + }, + "activatedAt": { + "type": "string", + "description": "When the key became the active signer. Present for active and revoking keys (and absent for pending keys and rows predating this field)." + } + }, + "required": [ + "algorithm", + "createdAt", + "issuerId", + "keyId", + "status", + "updatedAt" + ], + "type": "object" + }, + "type": "array" + }, + "policies": { + "items": { + "oneOf": [ + { + "properties": { + "kind": { + "type": "string", + "enum": [ + "project-grant" + ] + }, + "teamId": { + "type": "string" + }, + "projectId": { + "type": "string" + }, + "environments": { + "items": { + "type": "string" + }, + "type": "array", + "description": "Environments whose OIDC tokens this grant authorizes. Each entry is either a system environment slug (`production`, `preview`, `development`) or a custom environment ID (prefixed `env_`). Custom environments are matched against the token's `custom_environment_id` claim (the stable ID); system environments against its `environment` claim." + }, + "tokenClaims": { + "additionalProperties": true, + "type": "object" + }, + "createdAt": { + "type": "string" + }, + "updatedAt": { + "type": "string" + } + }, + "required": [ + "createdAt", + "environments", + "kind", + "projectId", + "teamId", + "updatedAt" + ], + "type": "object" + }, + { + "properties": { + "kind": { + "type": "string", + "enum": [ + "connex-grant" + ] + }, + "clientId": { + "type": "string" + }, + "tokenClaims": { + "additionalProperties": true, + "type": "object" + }, + "createdAt": { + "type": "string" + }, + "updatedAt": { + "type": "string" + } + }, + "required": [ + "clientId", + "createdAt", + "kind", + "updatedAt" + ], + "type": "object" + } + ] + }, + "type": "array" + } + }, + "required": [ + "algorithm", + "createdAt", + "id", + "name", + "origin", + "ownerId", + "policies", + "signingKeys", + "updatedAt" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "issuerId", + "description": "The ID of the issuer.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "description": "The ID of the issuer." + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + }, + "patch": { + "description": "Update a KMS issuer's name or claims schema.", + "operationId": "updateKmsIssuer", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Update an issuer", + "tags": [ + "kms" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "id": { + "type": "string" + }, + "ownerId": { + "type": "string" + }, + "name": { + "type": "string" + }, + "algorithm": { + "type": "string", + "enum": [ + "ES256", + "ES384", + "ES512", + "EdDSA", + "PS256", + "PS384", + "PS512", + "RS256", + "RS384", + "RS512" + ] + }, + "origin": { + "type": "string", + "enum": [ + "external", + "vercel" + ] + }, + "managedBy": { + "type": "string" + }, + "claimsSchema": { + "additionalProperties": true, + "type": "object" + }, + "createdAt": { + "type": "string" + }, + "updatedAt": { + "type": "string" + }, + "signingKeys": { + "items": { + "properties": { + "keyId": { + "type": "string", + "description": "The server-minted, unique record identifier. Use this to address the key on the activate / certificate endpoints." + }, + "importKeyId": { + "type": "string", + "description": "The caller-supplied key id (imported keys only), used as the JWT/JWKS `kid`. Not unique across an issuer's keys; omitted for generated keys." + }, + "issuerId": { + "type": "string" + }, + "algorithm": { + "type": "string" + }, + "status": { + "type": "string", + "enum": [ + "active", + "pending", + "revoking" + ] + }, + "publicKey": { + "properties": { + "kty": { + "type": "string" + }, + "kid": { + "type": "string" + }, + "alg": { + "type": "string" + }, + "use": { + "type": "string" + }, + "key_ops": { + "items": { + "type": "string" + }, + "type": "array" + }, + "x5c": { + "items": { + "type": "string" + }, + "type": "array", + "description": "The X.509 certificate chain (RFC 7517 §4.7). Each entry is the base64 DER (not base64url) of a certificate. For keys minted with a stored certificate this holds the single self-signed cert as `[x5c]`." + }, + "x5t#S256": { + "type": "string", + "description": "The base64url SHA-256 thumbprint of the DER certificate in `x5c[0]` (RFC 7517 §4.9)." + } + }, + "type": "object" + }, + "publicKeyFingerprint": { + "type": "string" + }, + "publicKeyPem": { + "type": "string", + "description": "The public key in SPKI PEM form, ready to render. Present whenever the key has public key material. Derived from `publicKey`; the embedded certificate members (`x5c`/`x5t#S256`) do not affect it." + }, + "certificatePem": { + "type": "string", + "description": "The stored X.509 certificate (from `publicKey.x5c[0]`) in PEM form, ready to render. Present only for keys created with a stored certificate; omitted for keys created before certificates were stored." + }, + "createdAt": { + "type": "string" + }, + "updatedAt": { + "type": "string" + }, + "revokeAt": { + "type": "string" + }, + "activateAt": { + "type": "string" + }, + "activatedAt": { + "type": "string", + "description": "When the key became the active signer. Present for active and revoking keys (and absent for pending keys and rows predating this field)." + } + }, + "required": [ + "algorithm", + "createdAt", + "issuerId", + "keyId", + "status", + "updatedAt" + ], + "type": "object" + }, + "type": "array" + }, + "policies": { + "items": { + "oneOf": [ + { + "properties": { + "kind": { + "type": "string", + "enum": [ + "project-grant" + ] + }, + "teamId": { + "type": "string" + }, + "projectId": { + "type": "string" + }, + "environments": { + "items": { + "type": "string" + }, + "type": "array", + "description": "Environments whose OIDC tokens this grant authorizes. Each entry is either a system environment slug (`production`, `preview`, `development`) or a custom environment ID (prefixed `env_`). Custom environments are matched against the token's `custom_environment_id` claim (the stable ID); system environments against its `environment` claim." + }, + "tokenClaims": { + "additionalProperties": true, + "type": "object" + }, + "createdAt": { + "type": "string" + }, + "updatedAt": { + "type": "string" + } + }, + "required": [ + "createdAt", + "environments", + "kind", + "projectId", + "teamId", + "updatedAt" + ], + "type": "object" + }, + { + "properties": { + "kind": { + "type": "string", + "enum": [ + "connex-grant" + ] + }, + "clientId": { + "type": "string" + }, + "tokenClaims": { + "additionalProperties": true, + "type": "object" + }, + "createdAt": { + "type": "string" + }, + "updatedAt": { + "type": "string" + } + }, + "required": [ + "clientId", + "createdAt", + "kind", + "updatedAt" + ], + "type": "object" + } + ] + }, + "type": "array" + } + }, + "required": [ + "algorithm", + "createdAt", + "id", + "name", + "origin", + "ownerId", + "policies", + "signingKeys", + "updatedAt" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid.\nOne of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "issuerId", + "description": "The ID of the issuer.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "description": "The ID of the issuer." + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "additionalProperties": false, + "minProperties": 1, + "properties": { + "name": { + "type": "string", + "description": "The name of the issuer." + }, + "claimsSchema": { + "type": "object", + "description": "A JSON Schema used to validate the resolved token claims when signing tokens for this issuer. Pass null to remove it.", + "additionalProperties": true, + "nullable": true + } + } + } + } + } + } + }, + "delete": { + "description": "Delete a KMS issuer and its signing keys.", + "operationId": "deleteKmsIssuer", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Delete an issuer", + "tags": [ + "kms" + ], + "responses": { + "204": { + "description": "" + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "issuerId", + "description": "The ID of the issuer.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "description": "The ID of the issuer." + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + } + }, + "/v1/kms/issuers/{issuerId}/policies": { + "post": { + "description": "Attach a policy to a KMS issuer that grants a project's deployments permission to sign with it.", + "operationId": "createKmsIssuerPolicy", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Create an issuer policy", + "tags": [ + "kms" + ], + "responses": { + "201": { + "description": "", + "content": { + "application/json": { + "schema": { + "oneOf": [ + { + "properties": { + "kind": { + "type": "string", + "enum": [ + "project-grant" + ] + }, + "teamId": { + "type": "string" + }, + "projectId": { + "type": "string" + }, + "environments": { + "items": { + "type": "string" + }, + "type": "array", + "description": "Environments whose OIDC tokens this grant authorizes. Each entry is either a system environment slug (`production`, `preview`, `development`) or a custom environment ID (prefixed `env_`). Custom environments are matched against the token's `custom_environment_id` claim (the stable ID); system environments against its `environment` claim." + }, + "tokenClaims": { + "additionalProperties": true, + "type": "object" + }, + "createdAt": { + "type": "string" + }, + "updatedAt": { + "type": "string" + } + }, + "required": [ + "createdAt", + "environments", + "kind", + "projectId", + "teamId", + "updatedAt" + ], + "type": "object" + }, + { + "properties": { + "kind": { + "type": "string", + "enum": [ + "connex-grant" + ] + }, + "clientId": { + "type": "string" + }, + "tokenClaims": { + "additionalProperties": true, + "type": "object" + }, + "createdAt": { + "type": "string" + }, + "updatedAt": { + "type": "string" + } + }, + "required": [ + "clientId", + "createdAt", + "kind", + "updatedAt" + ], + "type": "object" + } + ] + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid.\nOne of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "issuerId", + "description": "The ID of the issuer.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "description": "The ID of the issuer." + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "additionalProperties": false, + "required": [ + "kind", + "projectId", + "environments" + ], + "properties": { + "kind": { + "type": "string", + "enum": [ + "project-grant" + ] + }, + "projectId": { + "type": "string", + "description": "The project ID for the project grant policy." + }, + "environments": { + "type": "array", + "description": "The environments for the project grant policy. Each entry is a system environment (production, preview, development) or a custom environment ID (env_...).", + "items": { + "type": "string", + "pattern": "^(?:production|preview|development|env_.+)$" + }, + "minItems": 1, + "uniqueItems": true + }, + "tokenClaims": { + "type": "object", + "description": "The claims that KMS should include in signed JWTs for this policy.", + "additionalProperties": true + } + } + } + } + } + } + } + }, + "/v1/kms/issuers/{issuerId}/policies/{kind}/{policyKey}": { + "patch": { + "description": "Update an existing KMS issuer policy's environments or token claims.", + "operationId": "updateKmsIssuerPolicy", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Update an issuer policy", + "tags": [ + "kms" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "oneOf": [ + { + "properties": { + "kind": { + "type": "string", + "enum": [ + "project-grant" + ] + }, + "teamId": { + "type": "string" + }, + "projectId": { + "type": "string" + }, + "environments": { + "items": { + "type": "string" + }, + "type": "array", + "description": "Environments whose OIDC tokens this grant authorizes. Each entry is either a system environment slug (`production`, `preview`, `development`) or a custom environment ID (prefixed `env_`). Custom environments are matched against the token's `custom_environment_id` claim (the stable ID); system environments against its `environment` claim." + }, + "tokenClaims": { + "additionalProperties": true, + "type": "object" + }, + "createdAt": { + "type": "string" + }, + "updatedAt": { + "type": "string" + } + }, + "required": [ + "createdAt", + "environments", + "kind", + "projectId", + "teamId", + "updatedAt" + ], + "type": "object" + }, + { + "properties": { + "kind": { + "type": "string", + "enum": [ + "connex-grant" + ] + }, + "clientId": { + "type": "string" + }, + "tokenClaims": { + "additionalProperties": true, + "type": "object" + }, + "createdAt": { + "type": "string" + }, + "updatedAt": { + "type": "string" + } + }, + "required": [ + "clientId", + "createdAt", + "kind", + "updatedAt" + ], + "type": "object" + } + ] + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid.\nOne of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "issuerId", + "description": "The ID of the issuer.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "description": "The ID of the issuer." + } + }, + { + "name": "kind", + "description": "The issuer policy kind.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "enum": [ + "project-grant" + ], + "description": "The issuer policy kind." + } + }, + { + "name": "policyKey", + "description": "The policy identifier.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "description": "The policy identifier." + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "additionalProperties": false, + "properties": { + "environments": { + "type": "array", + "description": "The environments for the project grant policy. Each entry is a system environment (production, preview, development) or a custom environment ID (env_...).", + "items": { + "type": "string", + "pattern": "^(?:production|preview|development|env_.+)$" + }, + "minItems": 1, + "uniqueItems": true + }, + "tokenClaims": { + "type": "object", + "description": "The claims that KMS should include in signed JWTs for this policy. Pass null to remove them.", + "additionalProperties": true, + "nullable": true + } + } + } + } + } + } + }, + "delete": { + "description": "Remove a policy from a KMS issuer.", + "operationId": "deleteKmsIssuerPolicy", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Delete an issuer policy", + "tags": [ + "kms" + ], + "responses": { + "204": { + "description": "" + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "issuerId", + "description": "The ID of the issuer.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "description": "The ID of the issuer." + } + }, + { + "name": "kind", + "description": "The issuer policy kind.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "enum": [ + "project-grant", + "connex-grant" + ], + "description": "The issuer policy kind." + } + }, + { + "name": "policyKey", + "description": "The policy identifier.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "description": "The policy identifier." + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + } + }, + "/v1/projects/{projectId}/deployments/{deploymentId}/runtime-logs": { + "get": { + "description": "Returns a stream of logs for a given deployment.", + "operationId": "getRuntimeLogs", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Get logs for a deployment", + "tags": [ + "logs" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/stream+json": { + "schema": { + "properties": { + "level": { + "type": "string", + "enum": [ + "debug", + "error", + "fatal", + "info", + "trace", + "warning" + ] + }, + "message": { + "type": "string" + }, + "rowId": { + "type": "string" + }, + "source": { + "type": "string", + "enum": [ + "delimiter", + "edge-function", + "edge-middleware", + "request", + "serverless" + ] + }, + "timestampInMs": { + "type": "number" + }, + "domain": { + "type": "string" + }, + "messageTruncated": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "requestMethod": { + "type": "string" + }, + "requestPath": { + "type": "string" + }, + "responseStatusCode": { + "type": "number" + } + }, + "required": [ + "domain", + "level", + "message", + "messageTruncated", + "requestMethod", + "requestPath", + "responseStatusCode", + "rowId", + "source", + "timestampInMs" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "projectId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "deploymentId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + } + }, + "/v1/installations/{integrationConfigurationId}/resources/{resourceId}/experimentation/items": { + "post": { + "description": "Create one or multiple experimentation items", + "operationId": "createInstallationsByIntegrationConfigurationIdResourcesByResourceIdExperimentationItems", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Create one or multiple experimentation items", + "tags": [ + "marketplace" + ], + "responses": { + "204": { + "description": "The items were created" + }, + "400": { + "description": "One of the provided values in the request body is invalid.\nOne of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "integrationConfigurationId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "resourceId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "additionalProperties": false, + "required": [ + "items" + ], + "properties": { + "items": { + "type": "array", + "maxItems": 50, + "items": { + "type": "object", + "additionalProperties": false, + "required": [ + "id", + "slug", + "origin" + ], + "properties": { + "id": { + "type": "string", + "maxLength": 1024 + }, + "slug": { + "type": "string", + "maxLength": 1024 + }, + "origin": { + "type": "string", + "maxLength": 2048 + }, + "category": { + "type": "string", + "enum": [ + "experiment", + "flag" + ] + }, + "name": { + "type": "string", + "maxLength": 1024 + }, + "description": { + "type": "string", + "maxLength": 1024 + }, + "isArchived": { + "type": "boolean" + }, + "createdAt": { + "type": "number" + }, + "updatedAt": { + "type": "number" + } + } + } + } + } + } + } + } + }, + "x-speakeasy-name-override": "createInstallationIntegrationConfiguration" + } + }, + "/v1/installations/{integrationConfigurationId}/resources/{resourceId}/experimentation/items/{itemId}": { + "patch": { + "description": "Patch an existing experimentation item", + "operationId": "updateInstallationsByIntegrationConfigurationIdResourcesByResourceIdExperimentationItemsByItemId", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Patch an existing experimentation item", + "tags": [ + "marketplace" + ], + "responses": { + "204": { + "description": "The item was updated" + }, + "400": { + "description": "One of the provided values in the request body is invalid.\nOne of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "integrationConfigurationId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "resourceId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "itemId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "additionalProperties": false, + "required": [ + "slug", + "origin" + ], + "properties": { + "slug": { + "type": "string", + "maxLength": 1024 + }, + "origin": { + "type": "string", + "maxLength": 2048 + }, + "name": { + "type": "string", + "maxLength": 1024 + }, + "category": { + "type": "string", + "enum": [ + "experiment", + "flag" + ] + }, + "description": { + "type": "string", + "maxLength": 1024 + }, + "isArchived": { + "type": "boolean" + }, + "createdAt": { + "type": "number" + }, + "updatedAt": { + "type": "number" + } + } + } + } + } + }, + "x-speakeasy-name-override": "updateInstallationIntegrationConfiguration" + }, + "delete": { + "description": "Delete an existing experimentation item", + "operationId": "deleteInstallationsByIntegrationConfigurationIdResourcesByResourceIdExperimentationItemsByItemId", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Delete an existing experimentation item", + "tags": [ + "marketplace" + ], + "responses": { + "204": { + "description": "The item was deleted" + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "integrationConfigurationId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "resourceId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "itemId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "x-speakeasy-name-override": "deleteInstallationIntegrationConfiguration" + } + }, + "/v1/installations/{integrationConfigurationId}/resources/{resourceId}/experimentation/global-config": { + "head": { + "description": "When the user enabled Global Config syncing, then this endpoint can be used by the partner to fetch the contents of the Global Config.", + "operationId": "headInstallationsByIntegrationConfigurationIdResourcesByResourceIdExperimentationGlobalConfig", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Get the data of a user-provided Global Config", + "tags": [ + "marketplace" + ], + "responses": { + "200": { + "description": "The Global Config data", + "content": { + "application/json": { + "schema": { + "properties": { + "items": { + "additionalProperties": { + "$ref": "#/components/schemas/GlobalConfigItemValue" + }, + "type": "object" + }, + "updatedAt": { + "type": "number" + }, + "digest": { + "type": "string" + }, + "purpose": { + "type": "string", + "enum": [ + "experimentation", + "flags" + ] + } + }, + "required": [ + "digest", + "items", + "updatedAt" + ], + "type": "object" + } + } + } + }, + "304": { + "description": "" + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "integrationConfigurationId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "resourceId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ] + }, + "get": { + "description": "When the user enabled Global Config syncing, then this endpoint can be used by the partner to fetch the contents of the Global Config.", + "operationId": "getInstallationsByIntegrationConfigurationIdResourcesByResourceIdExperimentationGlobalConfig", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Get the data of a user-provided Global Config", + "tags": [ + "marketplace" + ], + "responses": { + "200": { + "description": "The Global Config data", + "content": { + "application/json": { + "schema": { + "properties": { + "items": { + "additionalProperties": { + "$ref": "#/components/schemas/GlobalConfigItemValue" + }, + "type": "object" + }, + "updatedAt": { + "type": "number" + }, + "digest": { + "type": "string" + }, + "purpose": { + "type": "string", + "enum": [ + "experimentation", + "flags" + ] + } + }, + "required": [ + "digest", + "items", + "updatedAt" + ], + "type": "object" + } + } + } + }, + "304": { + "description": "" + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "integrationConfigurationId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "resourceId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ] + }, + "put": { + "description": "When the user enabled Global Config syncing, then this endpoint can be used by the partner to push their configuration data into the relevant Global Config.", + "operationId": "replaceInstallationsByIntegrationConfigurationIdResourcesByResourceIdExperimentationGlobalConfig", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Push data into a user-provided Global Config", + "tags": [ + "marketplace" + ], + "responses": { + "200": { + "description": "The Global Config was updated", + "content": { + "application/json": { + "schema": { + "properties": { + "items": { + "additionalProperties": { + "$ref": "#/components/schemas/GlobalConfigItemValue" + }, + "type": "object" + }, + "updatedAt": { + "type": "number" + }, + "digest": { + "type": "string" + }, + "purpose": { + "type": "string", + "enum": [ + "experimentation", + "flags" + ] + } + }, + "required": [ + "digest", + "items", + "updatedAt" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid.\nOne of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "409": { + "description": "" + }, + "410": { + "description": "" + }, + "412": { + "description": "" + } + }, + "parameters": [ + { + "name": "integrationConfigurationId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "resourceId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "additionalProperties": false, + "required": [ + "data" + ], + "properties": { + "data": { + "type": "object", + "additionalProperties": {} + } + } + } + } + } + } + } + }, + "/v1/microfrontends/groups": { + "get": { + "description": "Get the microfrontends group IDs for a team.", + "operationId": "getMicrofrontendsGroups", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "List microfrontends groups", + "tags": [ + "microfrontends" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object" + } + } + } + }, + "400": { + "description": "" + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "410": { + "description": "" + }, + "500": { + "description": "" + } + }, + "parameters": [ + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + } + }, + "/v1/microfrontends/groups/{groupId}/projects": { + "get": { + "description": "Get the microfrontends for a given group ID.", + "operationId": "getMicrofrontendsInGroup", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "List projects in a microfrontends group", + "tags": [ + "microfrontends" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "projects": { + "items": { + "properties": { + "accountId": { + "type": "string" + }, + "creator": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "user" + ] + }, + "via": { + "nullable": true, + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "app" + ] + }, + "app": { + "properties": { + "id": { + "type": "string", + "description": "The internal ID of the Vercel App backing this principal." + }, + "clientId": { + "type": "string", + "description": "The protocol-facing OAuth client ID. This may differ from {@link id} when Client ID Metadata Documents (CIMD) are used." + } + }, + "required": [ + "id" + ], + "type": "object" + } + }, + "required": [ + "app", + "type" + ], + "type": "object", + "description": "Set when a Vercel App or Integration acts on behalf of a {@link User}. Captures user-consented OAuth delegation that the ACL layer may inspect to evaluate scope restrictions. This is NOT for impersonation or token-exchange provenance — those live on `auth.token`, not on the principal." + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "integration" + ] + }, + "integration": { + "properties": { + "integrationId": { + "type": "string" + }, + "configurationId": { + "type": "string" + } + }, + "required": [ + "configurationId", + "integrationId" + ], + "type": "object" + } + }, + "required": [ + "integration", + "type" + ], + "type": "object", + "description": "Set when a Vercel App or Integration acts on behalf of a {@link User}. Captures user-consented OAuth delegation that the ACL layer may inspect to evaluate scope restrictions. This is NOT for impersonation or token-exchange provenance — those live on `auth.token`, not on the principal." + } + ] + }, + "user": { + "properties": { + "id": { + "type": "string" + } + }, + "required": [ + "id" + ], + "type": "object" + } + }, + "required": [ + "type", + "user", + "via" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "app" + ] + }, + "app": { + "properties": { + "id": { + "type": "string", + "description": "The internal ID of the Vercel App backing this principal." + }, + "clientId": { + "type": "string", + "description": "The protocol-facing OAuth client ID. This may differ from {@link id} when Client ID Metadata Documents (CIMD) are used." + } + }, + "required": [ + "id" + ], + "type": "object" + } + }, + "required": [ + "app", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "integration" + ] + }, + "integration": { + "properties": { + "integrationId": { + "type": "string" + }, + "configurationId": { + "type": "string" + } + }, + "required": [ + "configurationId", + "integrationId" + ], + "type": "object" + } + }, + "required": [ + "integration", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "system" + ] + } + }, + "required": [ + "type" + ], + "type": "object" + } + ] + }, + "alias": { + "items": { + "properties": { + "configuredBy": { + "nullable": true, + "type": "string", + "enum": [ + "A", + "CNAME", + "dns-01", + "http", + null + ] + }, + "configuredChangedAt": { + "nullable": true, + "type": "number" + }, + "createdAt": { + "nullable": true, + "type": "number" + }, + "deployment": { + "nullable": true, + "properties": { + "id": { + "type": "string" + }, + "alias": { + "items": { + "type": "string" + }, + "type": "array" + }, + "aliasAssigned": { + "nullable": true, + "oneOf": [ + { + "type": "number" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + } + ] + }, + "aliasError": { + "nullable": true, + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" + }, + "aliasFinal": { + "nullable": true, + "type": "string" + }, + "automaticAliases": { + "items": { + "type": "string" + }, + "type": "array" + }, + "branchMatcher": { + "properties": { + "type": { + "type": "string", + "enum": [ + "endsWith", + "equals", + "startsWith" + ], + "description": "The type of matching to perform" + }, + "pattern": { + "type": "string", + "description": "The pattern to match against branch names" + } + }, + "required": [ + "pattern", + "type" + ], + "type": "object" + }, + "buildingAt": { + "type": "number" + }, + "builds": { + "items": { + "properties": { + "use": { + "type": "string" + }, + "src": { + "type": "string" + }, + "dest": { + "type": "string" + } + }, + "required": [ + "use" + ], + "type": "object" + }, + "type": "array" + }, + "checksConclusion": { + "type": "string", + "enum": [ + "canceled", + "failed", + "skipped", + "succeeded" + ] + }, + "checksState": { + "type": "string", + "enum": [ + "completed", + "registered", + "running" + ] + }, + "connectBuildsEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "connectConfigurationId": { + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "createdIn": { + "type": "string" + }, + "creator": { + "nullable": true, + "properties": { + "email": { + "type": "string" + }, + "githubLogin": { + "type": "string" + }, + "gitlabLogin": { + "type": "string" + }, + "uid": { + "type": "string" + }, + "username": { + "type": "string" + } + }, + "required": [ + "email", + "uid", + "username" + ], + "type": "object" + }, + "deletedAt": { + "type": "number" + }, + "deploymentHostname": { + "type": "string" + }, + "forced": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "name": { + "type": "string" + }, + "meta": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "monorepoManager": { + "nullable": true, + "type": "string" + }, + "oidcTokenClaims": { + "properties": { + "iss": { + "type": "string" + }, + "sub": { + "type": "string" + }, + "scope": { + "type": "string" + }, + "aud": { + "type": "string" + }, + "owner": { + "type": "string" + }, + "owner_id": { + "type": "string" + }, + "project": { + "type": "string" + }, + "project_id": { + "type": "string" + }, + "environment": { + "type": "string" + }, + "custom_environment_id": { + "type": "string" + }, + "mfe_group_ids": { + "items": { + "type": "string" + }, + "type": "array" + }, + "plan": { + "type": "string" + } + }, + "required": [ + "aud", + "environment", + "iss", + "owner", + "owner_id", + "project", + "project_id", + "scope", + "sub" + ], + "type": "object" + }, + "plan": { + "type": "string", + "enum": [ + "enterprise", + "hobby", + "pro" + ] + }, + "previewCommentsEnabled": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether or not preview comments are enabled for the deployment", + "example": false + }, + "private": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "readyAt": { + "type": "number" + }, + "readyState": { + "type": "string", + "enum": [ + "BLOCKED", + "BUILDING", + "CANCELED", + "ERROR", + "INITIALIZING", + "QUEUED", + "READY" + ] + }, + "readySubstate": { + "type": "string", + "enum": [ + "PROMOTED", + "ROLLING", + "STAGED" + ] + }, + "requestedAt": { + "type": "number" + }, + "target": { + "nullable": true, + "type": "string" + }, + "teamId": { + "nullable": true, + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "LAMBDAS" + ] + }, + "url": { + "type": "string" + }, + "userId": { + "type": "string", + "description": "Present for user creators; omitted for app/integration/system creators." + }, + "withCache": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "createdAt", + "createdIn", + "creator", + "deploymentHostname", + "id", + "name", + "plan", + "private", + "readyState", + "type", + "url" + ], + "type": "object" + }, + "domain": { + "type": "string" + }, + "environment": { + "type": "string", + "enum": [ + "preview", + "production" + ] + }, + "gitBranch": { + "nullable": true, + "type": "string" + }, + "redirect": { + "nullable": true, + "type": "string" + }, + "redirectStatusCode": { + "nullable": true, + "type": "number", + "enum": [ + 301, + 302, + 307, + 308, + null + ] + }, + "target": { + "type": "string", + "enum": [ + "PREVIEW", + "PRODUCTION", + "STAGING" + ] + } + }, + "required": [ + "deployment", + "domain", + "environment", + "target" + ], + "type": "object" + }, + "type": "array" + }, + "analytics": { + "properties": { + "id": { + "type": "string" + }, + "canceledAt": { + "nullable": true, + "type": "number" + }, + "disabledAt": { + "type": "number" + }, + "enabledAt": { + "type": "number" + }, + "paidAt": { + "type": "number" + }, + "sampleRatePercent": { + "nullable": true, + "type": "number" + }, + "spendLimitInDollars": { + "nullable": true, + "type": "number" + } + }, + "required": [ + "disabledAt", + "enabledAt", + "id" + ], + "type": "object" + }, + "appliedCve55182Migration": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "speedInsights": { + "properties": { + "id": { + "type": "string" + }, + "enabledAt": { + "type": "number" + }, + "disabledAt": { + "type": "number" + }, + "canceledAt": { + "type": "number" + }, + "hasData": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "dataReceivedAt": { + "type": "number", + "description": "When the first free (not Speed Insights Plus) production data point was observed, in ms. Set once by subscriber-analytics-events; projects that already had data before this field shipped get it backfilled on their next batch, so it reads \"first free data point observed\", not necessarily \"first ever\"." + }, + "paidAt": { + "type": "number" + } + }, + "required": [ + "id" + ], + "type": "object" + }, + "autoExposeSystemEnvs": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "autoAssignCustomDomains": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "autoAssignCustomDomainsUpdatedBy": { + "type": "string" + }, + "buildCommand": { + "nullable": true, + "type": "string" + }, + "commandForIgnoringBuildStep": { + "nullable": true, + "type": "string" + }, + "connectConfigurations": { + "nullable": true, + "items": { + "properties": { + "envId": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "string", + "enum": [ + "preview", + "production" + ] + } + ] + }, + "connectConfigurationId": { + "type": "string" + }, + "dc": { + "type": "string" + }, + "passive": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "buildsEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "aws": { + "properties": { + "subnetIds": { + "items": { + "type": "string" + }, + "type": "array" + }, + "securityGroupId": { + "type": "string" + } + }, + "required": [ + "subnetIds" + ], + "type": "object" + }, + "createdAt": { + "type": "number" + }, + "updatedAt": { + "type": "number" + } + }, + "required": [ + "buildsEnabled", + "connectConfigurationId", + "createdAt", + "envId", + "passive", + "updatedAt" + ], + "type": "object" + }, + "type": "array" + }, + "connectConfigurationId": { + "nullable": true, + "type": "string" + }, + "connectBuildsEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "passiveConnectConfigurationId": { + "nullable": true, + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "customerSupportCodeVisibility": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "crons": { + "properties": { + "enabledAt": { + "type": "number", + "description": "The time the feature was enabled for this project. Note: It enables automatically with the first Deployment that outputs cronjobs." + }, + "disabledAt": { + "nullable": true, + "type": "number", + "description": "The time the feature was disabled for this project." + }, + "updatedAt": { + "type": "number" + }, + "deploymentId": { + "nullable": true, + "type": "string", + "description": "The ID of the Deployment from which the definitions originated." + }, + "definitions": { + "items": { + "properties": { + "host": { + "type": "string", + "description": "The hostname that should be used.", + "example": "vercel.com" + }, + "path": { + "type": "string", + "description": "The path that should be called for the cronjob.", + "example": "/api/crons/sync-something?hello=world" + }, + "schedule": { + "type": "string", + "description": "The cron expression.", + "example": "0 0 * * *" + }, + "source": { + "type": "string", + "enum": [ + "api" + ], + "description": "The origin of this definition. 'api' means created via the API. Undefined means it originated from a deployment (vercel.json)." + }, + "description": { + "type": "string", + "description": "A human-readable description of what this cron job does." + }, + "hostInferred": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether the host was inferred from the production deployment URL rather than explicitly provided." + } + }, + "required": [ + "host", + "path", + "schedule" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "definitions", + "deploymentId", + "disabledAt", + "enabledAt", + "updatedAt" + ], + "type": "object" + }, + "dataCache": { + "properties": { + "userDisabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "storageSizeBytes": { + "nullable": true, + "type": "number" + }, + "unlimited": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "userDisabled" + ], + "type": "object" + }, + "deploymentExpiration": { + "properties": { + "expirationDays": { + "type": "number", + "description": "Number of days to keep non-production deployments (mostly preview deployments) before soft deletion." + }, + "expirationDaysProduction": { + "type": "number", + "description": "Number of days to keep production deployments before soft deletion." + }, + "expirationDaysCanceled": { + "type": "number", + "description": "Number of days to keep canceled deployments before soft deletion." + }, + "expirationDaysErrored": { + "type": "number", + "description": "Number of days to keep errored deployments before soft deletion." + }, + "deploymentsToKeep": { + "type": "number", + "description": "Minimum number of production deployments to keep for this project, even if they are over the production expiration limit." + } + }, + "type": "object", + "description": "Retention policies for deployments. These are enforced at the project level, but we also maintain an instance of this at the team level as a default policy that gets applied to new projects." + }, + "expiration": { + "oneOf": [ + { + "properties": { + "expiresAt": { + "type": "number", + "description": "Unix ms timestamp when the project is scheduled to expire." + } + }, + "required": [ + "expiresAt" + ], + "type": "object" + }, + { + "properties": { + "lockedAt": { + "type": "number", + "description": "Unix ms timestamp when the project was locked." + }, + "lockedBy": { + "type": "string", + "description": "userId of the actor that triggered the lock (system or admin)." + } + }, + "required": [ + "lockedAt", + "lockedBy" + ], + "type": "object" + } + ] + }, + "devCommand": { + "nullable": true, + "type": "string" + }, + "directoryListing": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "installCommand": { + "nullable": true, + "type": "string" + }, + "env": { + "items": { + "properties": { + "target": { + "oneOf": [ + { + "items": { + "type": "string", + "enum": [ + "development", + "development", + "preview", + "preview", + "production" + ] + }, + "type": "array" + }, + { + "type": "string", + "enum": [ + "development", + "development", + "preview", + "preview", + "production" + ] + } + ] + }, + "type": { + "type": "string", + "enum": [ + "encrypted", + "plain", + "secret", + "sensitive", + "system" + ] + }, + "sunsetSecretId": { + "type": "string", + "description": "This is used to identify variables that have been migrated from type secret to sensitive." + }, + "legacyValue": { + "type": "string", + "description": "Legacy now-encryption ciphertext, present after migration swaps value/vsmValue" + }, + "decrypted": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "value": { + "type": "string" + }, + "vsmValue": { + "type": "string" + }, + "id": { + "type": "string" + }, + "key": { + "type": "string" + }, + "configurationId": { + "nullable": true, + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "updatedAt": { + "type": "number" + }, + "createdBy": { + "nullable": true, + "type": "string" + }, + "updatedBy": { + "nullable": true, + "type": "string" + }, + "gitBranch": { + "type": "string" + }, + "visibility": { + "type": "string", + "enum": [ + "config", + "secret" + ], + "description": "User-facing config/secret model. When set, authoritative for new code paths when the env-var-config-secret-ui flag is enabled. Legacy rows omit this field; legacy rows omit it and callers fall back to existing `type` behavior." + }, + "edgeConfigId": { + "nullable": true, + "type": "string" + }, + "edgeConfigTokenId": { + "nullable": true, + "type": "string" + }, + "contentHint": { + "nullable": true, + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "redis-url" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "redis-rest-api-url" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "redis-rest-api-token" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "redis-rest-api-read-only-token" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "blob-read-write-token" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "blob-store-id" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "blob-webhook-public-key" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-url" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-url-non-pooling" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-prisma-url" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-user" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-host" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-password" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-database" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-url-no-ssl" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "integration-store-secret" + ] + }, + "storeId": { + "type": "string" + }, + "integrationId": { + "type": "string" + }, + "integrationProductId": { + "type": "string" + }, + "integrationConfigurationId": { + "type": "string" + } + }, + "required": [ + "integrationConfigurationId", + "integrationId", + "integrationProductId", + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "flags-connection-string" + ] + }, + "projectId": { + "type": "string" + } + }, + "required": [ + "projectId", + "type" + ], + "type": "object" + } + ] + }, + "internalContentHint": { + "nullable": true, + "properties": { + "type": { + "type": "string", + "enum": [ + "flags-secret" + ] + }, + "encryptedValue": { + "type": "string", + "description": "Contains the `value` of the env variable, encrypted with a special key to make decryption possible in the subscriber Lambda." + } + }, + "required": [ + "encryptedValue", + "type" + ], + "type": "object", + "description": "Similar to `contentHints`, but should not be exposed to the user." + }, + "comment": { + "type": "string" + }, + "customEnvironmentIds": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "key", + "type", + "value" + ], + "type": "object" + }, + "type": "array" + }, + "customEnvironments": { + "items": { + "properties": { + "id": { + "type": "string", + "description": "Unique identifier for the custom environment (format: env_*)" + }, + "slug": { + "type": "string", + "description": "URL-friendly name of the environment" + }, + "type": { + "type": "string", + "enum": [ + "development", + "preview", + "production" + ], + "description": "The type of environment (production, preview, or development)" + }, + "description": { + "type": "string", + "description": "Optional description of the environment's purpose" + }, + "branchMatcher": { + "properties": { + "type": { + "type": "string", + "enum": [ + "endsWith", + "equals", + "startsWith" + ], + "description": "The type of matching to perform" + }, + "pattern": { + "type": "string", + "description": "The pattern to match against branch names" + } + }, + "required": [ + "pattern", + "type" + ], + "type": "object", + "description": "Configuration for matching git branches to this environment" + }, + "domains": { + "items": { + "properties": { + "name": { + "type": "string" + }, + "apexName": { + "type": "string" + }, + "projectId": { + "type": "string" + }, + "redirect": { + "nullable": true, + "type": "string" + }, + "redirectStatusCode": { + "nullable": true, + "type": "number", + "enum": [ + 301, + 302, + 307, + 308, + null + ] + }, + "gitBranch": { + "nullable": true, + "type": "string" + }, + "customEnvironmentId": { + "nullable": true, + "type": "string" + }, + "updatedAt": { + "type": "number" + }, + "createdAt": { + "type": "number" + }, + "verified": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "`true` if the domain is verified for use with the project. If `false` it will not be used as an alias on this project until the challenge in `verification` is completed." + }, + "verification": { + "items": { + "properties": { + "type": { + "type": "string" + }, + "domain": { + "type": "string" + }, + "value": { + "type": "string" + }, + "reason": { + "type": "string" + } + }, + "required": [ + "domain", + "reason", + "type", + "value" + ], + "type": "object", + "description": "A list of verification challenges, one of which must be completed to verify the domain for use on the project. After the challenge is complete `POST /projects/:idOrName/domains/:domain/verify` to verify the domain. Possible challenges: - If `verification.type = TXT` the `verification.domain` will be checked for a TXT record matching `verification.value`." + }, + "type": "array", + "description": "A list of verification challenges, one of which must be completed to verify the domain for use on the project. After the challenge is complete `POST /projects/:idOrName/domains/:domain/verify` to verify the domain. Possible challenges: - If `verification.type = TXT` the `verification.domain` will be checked for a TXT record matching `verification.value`." + } + }, + "required": [ + "apexName", + "name", + "projectId", + "verified" + ], + "type": "object", + "description": "List of domains associated with this environment" + }, + "type": "array", + "description": "List of domains associated with this environment" + }, + "currentDeploymentAliases": { + "items": { + "type": "string" + }, + "type": "array", + "description": "List of aliases for the current deployment" + }, + "createdAt": { + "type": "number", + "description": "Timestamp when the environment was created" + }, + "updatedAt": { + "type": "number", + "description": "Timestamp when the environment was last updated" + } + }, + "required": [ + "createdAt", + "id", + "slug", + "type", + "updatedAt" + ], + "type": "object", + "description": "Internal representation of a custom environment with all required properties" + }, + "type": "array" + }, + "framework": { + "nullable": true, + "type": "string", + "enum": [ + "actix-web", + "angular", + "ash", + "astro", + "axum", + "blitzjs", + "brunch", + "bun", + "container", + "create-react-app", + "django", + "docusaurus", + "docusaurus-2", + "dojo", + "eleventy", + "elysia", + "ember", + "eve", + "express", + "factory-eve", + "fastapi", + "fasthtml", + "fastify", + "flask", + "gatsby", + "go", + "gridsome", + "h3", + "hexo", + "hono", + "hugo", + "hydrogen", + "ionic-angular", + "ionic-react", + "jekyll", + "koa", + "mastra", + "middleman", + "nestjs", + "nextjs", + "nitro", + "node", + "nuxtjs", + "parcel", + "polymer", + "preact", + "python", + "react-router", + "redwoodjs", + "remix", + "ruby", + "rust", + "saber", + "sanity", + "sanity-v2", + "sapper", + "scully", + "services", + "solidstart", + "solidstart-1", + "stencil", + "storybook", + "svelte", + "sveltekit", + "sveltekit-1", + "tanstack-start", + "tanstack-start-lovable", + "umijs", + "vite", + "vitepress", + "vue", + "vuepress", + "xmcp", + "zola", + null + ] + }, + "services": { + "items": { + "properties": { + "serviceName": { + "type": "string", + "description": "Service name from the deployment (Service.name)." + }, + "serviceType": { + "type": "string", + "enum": [ + "cron", + "job", + "web", + "worker" + ], + "description": "Service kind (Service.type). Omitted for schemas that do not define one." + }, + "framework": { + "type": "string", + "enum": [ + "actix-web", + "angular", + "ash", + "astro", + "axum", + "blitzjs", + "brunch", + "bun", + "container", + "create-react-app", + "django", + "docusaurus", + "docusaurus-2", + "dojo", + "eleventy", + "elysia", + "ember", + "eve", + "express", + "factory-eve", + "fastapi", + "fasthtml", + "fastify", + "flask", + "gatsby", + "go", + "gridsome", + "h3", + "hexo", + "hono", + "hugo", + "hydrogen", + "ionic-angular", + "ionic-react", + "jekyll", + "koa", + "mastra", + "middleman", + "nestjs", + "nextjs", + "nitro", + "node", + "nuxtjs", + "parcel", + "polymer", + "preact", + "python", + "react-router", + "redwoodjs", + "remix", + "ruby", + "rust", + "saber", + "sanity", + "sanity-v2", + "sapper", + "scully", + "services", + "solidstart", + "solidstart-1", + "stencil", + "storybook", + "svelte", + "sveltekit", + "sveltekit-1", + "tanstack-start", + "tanstack-start-lovable", + "umijs", + "vite", + "vitepress", + "vue", + "vuepress", + "xmcp", + "zola" + ], + "description": "Framework slug, when the service has one (omitted otherwise)." + }, + "runtime": { + "type": "string", + "description": "Generic runtime, e.g. 'node' | 'python' | 'go' | 'ruby' | 'rust' (Service.runtime). Omitted for static builds." + } + }, + "required": [ + "serviceName" + ], + "type": "object" + }, + "type": "array" + }, + "gitForkProtection": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "gitLFS": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "id": { + "type": "string" + }, + "ipBuckets": { + "items": { + "properties": { + "bucket": { + "type": "string" + }, + "default": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "supportUntil": { + "type": "number" + } + }, + "required": [ + "bucket" + ], + "type": "object" + }, + "type": "array" + }, + "jobs": { + "properties": { + "lint": { + "properties": { + "targets": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "targets" + ], + "type": "object" + }, + "typecheck": { + "properties": { + "targets": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "targets" + ], + "type": "object" + }, + "mfe-config-present": { + "properties": { + "targets": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "targets" + ], + "type": "object" + } + }, + "type": "object" + }, + "latestDeployments": { + "items": { + "properties": { + "id": { + "type": "string" + }, + "alias": { + "items": { + "type": "string" + }, + "type": "array" + }, + "aliasAssigned": { + "nullable": true, + "oneOf": [ + { + "type": "number" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + } + ] + }, + "aliasError": { + "nullable": true, + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" + }, + "aliasFinal": { + "nullable": true, + "type": "string" + }, + "automaticAliases": { + "items": { + "type": "string" + }, + "type": "array" + }, + "branchMatcher": { + "properties": { + "type": { + "type": "string", + "enum": [ + "endsWith", + "equals", + "startsWith" + ], + "description": "The type of matching to perform" + }, + "pattern": { + "type": "string", + "description": "The pattern to match against branch names" + } + }, + "required": [ + "pattern", + "type" + ], + "type": "object" + }, + "buildingAt": { + "type": "number" + }, + "builds": { + "items": { + "properties": { + "use": { + "type": "string" + }, + "src": { + "type": "string" + }, + "dest": { + "type": "string" + } + }, + "required": [ + "use" + ], + "type": "object" + }, + "type": "array" + }, + "checksConclusion": { + "type": "string", + "enum": [ + "canceled", + "failed", + "skipped", + "succeeded" + ] + }, + "checksState": { + "type": "string", + "enum": [ + "completed", + "registered", + "running" + ] + }, + "connectBuildsEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "connectConfigurationId": { + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "createdIn": { + "type": "string" + }, + "creator": { + "nullable": true, + "properties": { + "email": { + "type": "string" + }, + "githubLogin": { + "type": "string" + }, + "gitlabLogin": { + "type": "string" + }, + "uid": { + "type": "string" + }, + "username": { + "type": "string" + } + }, + "required": [ + "email", + "uid", + "username" + ], + "type": "object" + }, + "deletedAt": { + "type": "number" + }, + "deploymentHostname": { + "type": "string" + }, + "forced": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "name": { + "type": "string" + }, + "meta": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "monorepoManager": { + "nullable": true, + "type": "string" + }, + "oidcTokenClaims": { + "properties": { + "iss": { + "type": "string" + }, + "sub": { + "type": "string" + }, + "scope": { + "type": "string" + }, + "aud": { + "type": "string" + }, + "owner": { + "type": "string" + }, + "owner_id": { + "type": "string" + }, + "project": { + "type": "string" + }, + "project_id": { + "type": "string" + }, + "environment": { + "type": "string" + }, + "custom_environment_id": { + "type": "string" + }, + "mfe_group_ids": { + "items": { + "type": "string" + }, + "type": "array" + }, + "plan": { + "type": "string" + } + }, + "required": [ + "aud", + "environment", + "iss", + "owner", + "owner_id", + "project", + "project_id", + "scope", + "sub" + ], + "type": "object" + }, + "plan": { + "type": "string", + "enum": [ + "enterprise", + "hobby", + "pro" + ] + }, + "previewCommentsEnabled": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether or not preview comments are enabled for the deployment", + "example": false + }, + "private": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "readyAt": { + "type": "number" + }, + "readyState": { + "type": "string", + "enum": [ + "BLOCKED", + "BUILDING", + "CANCELED", + "ERROR", + "INITIALIZING", + "QUEUED", + "READY" + ] + }, + "readySubstate": { + "type": "string", + "enum": [ + "PROMOTED", + "ROLLING", + "STAGED" + ] + }, + "requestedAt": { + "type": "number" + }, + "target": { + "nullable": true, + "type": "string" + }, + "teamId": { + "nullable": true, + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "LAMBDAS" + ] + }, + "url": { + "type": "string" + }, + "userId": { + "type": "string", + "description": "Present for user creators; omitted for app/integration/system creators." + }, + "withCache": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "createdAt", + "createdIn", + "creator", + "deploymentHostname", + "id", + "name", + "plan", + "private", + "readyState", + "type", + "url" + ], + "type": "object" + }, + "type": "array" + }, + "link": { + "oneOf": [ + { + "properties": { + "org": { + "type": "string" + }, + "repoOwnerId": { + "type": "number", + "description": "A new field, should be included in all new project links, is being added just in time when a deployment is created. This is needed for Protected Git scopes." + }, + "repo": { + "type": "string" + }, + "repoId": { + "type": "number" + }, + "type": { + "type": "string", + "enum": [ + "github" + ] + }, + "createdAt": { + "type": "number" + }, + "deployHooks": { + "items": { + "properties": { + "createdAt": { + "type": "number" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "ref": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "ref", + "url" + ], + "type": "object" + }, + "type": "array" + }, + "gitCredentialId": { + "type": "string" + }, + "updatedAt": { + "type": "number" + }, + "sourceless": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "productionBranch": { + "type": "string" + } + }, + "required": [ + "deployHooks", + "gitCredentialId", + "org", + "productionBranch", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "github-limited" + ] + }, + "createdAt": { + "type": "number" + }, + "org": { + "type": "string" + }, + "repoOwnerId": { + "type": "number", + "description": "A new field, should be included in all new project links, is being added just in time when a deployment is created. This is needed for Protected Git scopes." + }, + "repo": { + "type": "string" + }, + "repoId": { + "type": "number" + }, + "deployHooks": { + "items": { + "properties": { + "createdAt": { + "type": "number" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "ref": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "ref", + "url" + ], + "type": "object" + }, + "type": "array" + }, + "gitCredentialId": { + "type": "string" + }, + "updatedAt": { + "type": "number" + }, + "sourceless": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "productionBranch": { + "type": "string" + } + }, + "required": [ + "deployHooks", + "gitCredentialId", + "org", + "productionBranch", + "type" + ], + "type": "object" + }, + { + "properties": { + "org": { + "type": "string" + }, + "repoOwnerId": { + "type": "number", + "description": "A new field, should be included in all new project links, is being added just in time when a deployment is created. This is needed for Protected Git scopes." + }, + "repo": { + "type": "string" + }, + "repoId": { + "type": "number" + }, + "type": { + "type": "string", + "enum": [ + "github-custom-host" + ] + }, + "host": { + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "deployHooks": { + "items": { + "properties": { + "createdAt": { + "type": "number" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "ref": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "ref", + "url" + ], + "type": "object" + }, + "type": "array" + }, + "gitCredentialId": { + "type": "string" + }, + "updatedAt": { + "type": "number" + }, + "sourceless": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "productionBranch": { + "type": "string" + } + }, + "required": [ + "deployHooks", + "gitCredentialId", + "host", + "org", + "productionBranch", + "type" + ], + "type": "object" + }, + { + "properties": { + "projectId": { + "type": "string" + }, + "projectName": { + "type": "string" + }, + "projectNameWithNamespace": { + "type": "string" + }, + "projectNamespace": { + "type": "string" + }, + "projectOwnerId": { + "type": "number", + "description": "A new field, should be included in all new project links, is being added just in time when a deployment is created. This is needed for Protected Git scopes. This is the id of the top level group that a namespace belongs to. Gitlab supports group nesting (up to 20 levels)." + }, + "projectUrl": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "gitlab" + ] + }, + "createdAt": { + "type": "number" + }, + "deployHooks": { + "items": { + "properties": { + "createdAt": { + "type": "number" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "ref": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "ref", + "url" + ], + "type": "object" + }, + "type": "array" + }, + "gitCredentialId": { + "type": "string" + }, + "updatedAt": { + "type": "number" + }, + "sourceless": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "productionBranch": { + "type": "string" + } + }, + "required": [ + "deployHooks", + "gitCredentialId", + "productionBranch", + "projectId", + "projectName", + "projectNameWithNamespace", + "projectNamespace", + "projectUrl", + "type" + ], + "type": "object" + }, + { + "properties": { + "name": { + "type": "string" + }, + "slug": { + "type": "string" + }, + "owner": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "bitbucket" + ] + }, + "uuid": { + "type": "string" + }, + "workspaceUuid": { + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "deployHooks": { + "items": { + "properties": { + "createdAt": { + "type": "number" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "ref": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "ref", + "url" + ], + "type": "object" + }, + "type": "array" + }, + "gitCredentialId": { + "type": "string" + }, + "updatedAt": { + "type": "number" + }, + "sourceless": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "productionBranch": { + "type": "string" + } + }, + "required": [ + "deployHooks", + "gitCredentialId", + "name", + "owner", + "productionBranch", + "slug", + "type", + "uuid", + "workspaceUuid" + ], + "type": "object" + }, + { + "properties": { + "org": { + "type": "string" + }, + "repo": { + "type": "string" + }, + "repoId": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "vercel" + ] + }, + "createdAt": { + "type": "number" + }, + "deployHooks": { + "items": { + "properties": { + "createdAt": { + "type": "number" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "ref": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "ref", + "url" + ], + "type": "object" + }, + "type": "array" + }, + "gitCredentialId": { + "type": "string" + }, + "updatedAt": { + "type": "number" + }, + "sourceless": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "productionBranch": { + "type": "string" + } + }, + "required": [ + "deployHooks", + "gitCredentialId", + "org", + "productionBranch", + "repo", + "repoId", + "type" + ], + "type": "object" + }, + { + "properties": { + "org": { + "type": "string" + }, + "repo": { + "type": "string" + }, + "repoId": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "v0" + ] + }, + "createdAt": { + "type": "number" + }, + "deployHooks": { + "items": { + "properties": { + "createdAt": { + "type": "number" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "ref": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "ref", + "url" + ], + "type": "object" + }, + "type": "array" + }, + "gitCredentialId": { + "type": "string" + }, + "updatedAt": { + "type": "number" + }, + "sourceless": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "productionBranch": { + "type": "string" + } + }, + "required": [ + "deployHooks", + "gitCredentialId", + "org", + "productionBranch", + "repo", + "repoId", + "type" + ], + "type": "object" + }, + { + "properties": { + "owner": { + "type": "string", + "description": "Owner (namespace) slug, e.g. `acme`." + }, + "repo": { + "type": "string" + }, + "repoId": { + "type": "string", + "description": "Origin repository id." + }, + "ownerId": { + "type": "string", + "description": "Origin namespace id (`ns_…`) of the owner." + }, + "type": { + "type": "string", + "enum": [ + "cursor-origin" + ] + }, + "createdAt": { + "type": "number" + }, + "deployHooks": { + "items": { + "properties": { + "createdAt": { + "type": "number" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "ref": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "ref", + "url" + ], + "type": "object" + }, + "type": "array" + }, + "gitCredentialId": { + "type": "string" + }, + "updatedAt": { + "type": "number" + }, + "sourceless": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "productionBranch": { + "type": "string" + } + }, + "required": [ + "deployHooks", + "gitCredentialId", + "owner", + "ownerId", + "productionBranch", + "repo", + "repoId", + "type" + ], + "type": "object" + } + ] + }, + "blobs": { + "properties": { + "isDefaultApp": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Marks the team-level, Vercel-managed default blob project (`vercel-blob-default-project`) that orphan blob stores are scoped to when connected without an explicit project. Set only by internal storage flows and immutable after creation — guards rely on it to protect the connected stores from being lost when the project is deleted or transferred." + } + }, + "type": "object" + }, + "microfrontends": { + "oneOf": [ + { + "properties": { + "isDefaultApp": { + "type": "boolean", + "enum": [ + true + ] + }, + "updatedAt": { + "type": "number", + "description": "Timestamp when the microfrontends settings were last updated." + }, + "groupIds": { + "type": "array", + "items": { + "type": "string" + }, + "minItems": 1, + "description": "The group IDs of microfrontends that this project belongs to. Each microfrontend project must belong to a microfrontends group that is the set of microfrontends that are used together." + }, + "enabled": { + "type": "boolean", + "enum": [ + true + ], + "description": "Whether microfrontends are enabled for this project." + }, + "defaultRoute": { + "type": "string", + "description": "A path that is used to take screenshots and as the default path in preview links when a domain for this microfrontend is shown in the UI. Includes the leading slash, e.g. `/docs`" + }, + "freeProjectForLegacyLimits": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether the project was part of the legacy limits for hobby and pro-trial before billing was added. This field is only set when the team is upgraded to a paid plan and we are backfilling the subscription status. We cap the subscription to 2 projects and set this field for the 3rd project. When this field is set, the project is not charged for and we do not call any billing APIs for this project." + } + }, + "required": [ + "enabled", + "groupIds", + "isDefaultApp", + "updatedAt" + ], + "type": "object" + }, + { + "properties": { + "isDefaultApp": { + "type": "boolean", + "enum": [ + false + ] + }, + "routeObservabilityToThisProject": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether observability data should be routed to this microfrontend project or a root project." + }, + "doNotRouteWithMicrofrontendsRouting": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether to add microfrontends routing to aliases. This means domains in this project will route as a microfrontend." + }, + "updatedAt": { + "type": "number", + "description": "Timestamp when the microfrontends settings were last updated." + }, + "groupIds": { + "type": "array", + "items": { + "type": "string" + }, + "minItems": 1, + "description": "The group IDs of microfrontends that this project belongs to. Each microfrontend project must belong to a microfrontends group that is the set of microfrontends that are used together." + }, + "enabled": { + "type": "boolean", + "enum": [ + true + ], + "description": "Whether microfrontends are enabled for this project." + }, + "defaultRoute": { + "type": "string", + "description": "A path that is used to take screenshots and as the default path in preview links when a domain for this microfrontend is shown in the UI. Includes the leading slash, e.g. `/docs`" + }, + "freeProjectForLegacyLimits": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether the project was part of the legacy limits for hobby and pro-trial before billing was added. This field is only set when the team is upgraded to a paid plan and we are backfilling the subscription status. We cap the subscription to 2 projects and set this field for the 3rd project. When this field is set, the project is not charged for and we do not call any billing APIs for this project." + } + }, + "required": [ + "enabled", + "groupIds", + "updatedAt" + ], + "type": "object" + }, + { + "properties": { + "updatedAt": { + "type": "number" + }, + "groupIds": { + "type": "array", + "items": {}, + "minItems": 0, + "maxItems": 0 + }, + "enabled": { + "type": "boolean", + "enum": [ + false + ] + }, + "freeProjectForLegacyLimits": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "enabled", + "groupIds", + "updatedAt" + ], + "type": "object" + } + ] + }, + "name": { + "type": "string" + }, + "nodeVersion": { + "type": "string", + "enum": [ + "10.x", + "12.x", + "14.x", + "16.x", + "18.x", + "20.x", + "22.x", + "24.x", + "8.10.x" + ] + }, + "optionsAllowlist": { + "nullable": true, + "properties": { + "paths": { + "items": { + "properties": { + "value": { + "type": "string" + } + }, + "required": [ + "value" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "paths" + ], + "type": "object" + }, + "outputDirectory": { + "nullable": true, + "type": "string" + }, + "passwordProtection": { + "nullable": true, + "type": "object" + }, + "passport": { + "nullable": true, + "properties": { + "deploymentType": { + "type": "string", + "enum": [ + "all", + "all_except_custom_domains", + "preview", + "prod_deployment_urls_and_all_previews" + ] + }, + "connectorId": { + "type": "string" + } + }, + "required": [ + "connectorId", + "deploymentType" + ], + "type": "object" + }, + "protectionConfig": { + "properties": { + "sandboxUrls": { + "properties": { + "inheritDeploymentProtection": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "type": "object" + } + }, + "type": "object" + }, + "sandbox": { + "properties": { + "region": { + "type": "string", + "enum": [ + "arn1", + "bom1", + "cdg1", + "cle1", + "cpt1", + "dub1", + "fra1", + "gru1", + "hkg1", + "hnd1", + "iad1", + "icn1", + "kix1", + "lhr1", + "pdx1", + "sfo1", + "sin1", + "syd1", + "yul1" + ] + }, + "failoverRegions": { + "items": { + "type": "string", + "enum": [ + "arn1", + "bom1", + "cdg1", + "cle1", + "cpt1", + "dub1", + "fra1", + "gru1", + "hkg1", + "hnd1", + "iad1", + "icn1", + "kix1", + "lhr1", + "pdx1", + "sfo1", + "sin1", + "syd1", + "yul1" + ] + }, + "type": "array" + } + }, + "type": "object" + }, + "productionDeploymentsFastLane": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "resourceConfig": { + "properties": { + "fluid": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "functionDefaultRegions": { + "items": { + "type": "string" + }, + "type": "array" + }, + "functionDefaultTimeout": { + "type": "number" + }, + "functionDefaultMemoryType": { + "type": "string", + "enum": [ + "performance", + "performance_xl", + "standard", + "standard_legacy" + ] + }, + "functionZeroConfigFailover": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "elasticConcurrencyEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "buildMachineType": { + "type": "string", + "enum": [ + "basic", + "enhanced", + "standard", + "turbo" + ] + }, + "buildMachineSelection": { + "type": "string", + "enum": [ + "elastic", + "fixed" + ] + }, + "buildMachineElasticLastUpdated": { + "type": "number" + }, + "buildMachineElasticReason": { + "type": "string", + "enum": [ + "basic-floor", + "build-timeout-failure", + "enospc-failure", + "enterprise-floor", + "high-peak-disk", + "high-peak-memory", + "long-build-duration", + "oom-failure", + "short-build-duration", + "sustained-high-cpu" + ] + }, + "isNSNBDisabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "buildQueue": { + "properties": { + "configuration": { + "type": "string", + "enum": [ + "SKIP_NAMESPACE_QUEUE", + "WAIT_FOR_NAMESPACE_QUEUE" + ] + } + }, + "type": "object" + }, + "enableFunctionsBeta": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "type": "object", + "required": [ + "functionDefaultRegions" + ] + }, + "rollbackDescription": { + "properties": { + "userId": { + "type": "string", + "description": "The user who rolled back the project." + }, + "username": { + "type": "string", + "description": "The username of the user who rolled back the project." + }, + "description": { + "type": "string", + "description": "User-supplied explanation of why they rolled back the project. Limited to 250 characters." + }, + "createdAt": { + "type": "number", + "description": "Timestamp of when the rollback was requested." + } + }, + "required": [ + "createdAt", + "description", + "userId", + "username" + ], + "type": "object", + "description": "Description of why a project was rolled back, and by whom. Note that lastAliasRequest contains the from/to details of the rollback." + }, + "rollingRelease": { + "nullable": true, + "properties": { + "target": { + "type": "string", + "description": "The environment that the release targets, currently only supports production. Adding in case we want to configure with alias groups or custom environments.", + "example": "production" + }, + "stages": { + "nullable": true, + "items": { + "properties": { + "targetPercentage": { + "type": "number", + "description": "The percentage of traffic to serve to the canary deployment (0-100)", + "example": 25 + }, + "requireApproval": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether or not this stage requires manual approval to proceed", + "example": false + }, + "duration": { + "type": "number", + "description": "Duration in minutes for automatic advancement to the next stage", + "example": 600 + }, + "linearShift": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether to linearly shift traffic over the duration of this stage", + "example": false + } + }, + "required": [ + "targetPercentage" + ], + "type": "object", + "description": "An array of all the stages required during a deployment release. Each stage defines a target percentage and advancement rules. The final stage must always have targetPercentage: 100." + }, + "type": "array", + "description": "An array of all the stages required during a deployment release. Each stage defines a target percentage and advancement rules. The final stage must always have targetPercentage: 100." + }, + "canaryResponseHeader": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether the request served by a canary deployment should return a header indicating a canary was served. Defaults to `false` when omitted.", + "example": false + }, + "gate": { + "properties": { + "enabled": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether automated gating is enabled for this project's rollouts." + }, + "checks": { + "items": { + "properties": { + "type": { + "type": "string", + "enum": [ + "error-rate-5xx" + ], + "description": "The metric this check evaluates." + }, + "minSampleSize": { + "type": "number", + "description": "Minimum number of requests required in the window before the check can fail. Below this, the check is inconclusive rather than failing, so low-traffic stages don't gate on noise. Defaults to `100` when omitted.", + "example": 100 + }, + "excludeStatusCodes": { + "items": { + "type": "number" + }, + "type": "array", + "description": "Response status codes to ignore entirely — dropped from both the numerator (errors) and the denominator (total requests). Defaults to `[]` when omitted.", + "example": [ + 503 + ] + }, + "excludePaths": { + "items": { + "type": "string" + }, + "type": "array", + "description": "Request paths to ignore entirely — dropped from both the numerator (errors) and the denominator (total requests). Matched exactly against the request path with any query string removed; no prefix or glob matching. Defaults to `[]` when omitted.", + "example": [ + "/api/health" + ] + }, + "ingestWatermarkSeconds": { + "type": "number", + "description": "Seconds of ingest lag to allow for: the query's upper bound is `now() - this value`, so the check never reads a window that is still filling. Defaults to `30` when omitted.", + "example": 30 + } + }, + "required": [ + "type" + ], + "type": "object", + "description": "The checks to evaluate. An empty array means nothing is evaluated." + }, + "type": "array", + "description": "The checks to evaluate. An empty array means nothing is evaluated." + }, + "failureThreshold": { + "type": "number", + "description": "How many failing evaluations within {@link windowSize} trip the gate. Defaults to `3` when omitted.", + "example": 3 + }, + "windowSize": { + "type": "number", + "description": "How many of the most recent evaluations {@link failureThreshold} is counted against. Defaults to `5` when omitted.", + "example": 5 + }, + "action": { + "type": "string", + "enum": [ + "pause", + "rollback" + ], + "description": "What to do when the gate trips: pause the rollout, or roll it back." + }, + "dryRun": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "When true, a tripped gate is only reported — {@link action} is not taken." + } + }, + "required": [ + "action", + "checks", + "dryRun", + "enabled" + ], + "type": "object", + "description": "Automated gating configuration. Omitted (the default) means no gating is configured, which is equivalent to `enabled: false`." + } + }, + "required": [ + "target" + ], + "type": "object", + "description": "Project-level rolling release configuration that defines how deployments should be gradually rolled out" + }, + "defaultResourceConfig": { + "properties": { + "fluid": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "functionDefaultRegions": { + "items": { + "type": "string" + }, + "type": "array" + }, + "functionDefaultTimeout": { + "type": "number" + }, + "functionDefaultMemoryType": { + "type": "string", + "enum": [ + "performance", + "performance_xl", + "standard", + "standard_legacy" + ] + }, + "functionZeroConfigFailover": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "elasticConcurrencyEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "buildMachineType": { + "type": "string", + "enum": [ + "basic", + "enhanced", + "standard", + "turbo" + ] + }, + "buildMachineSelection": { + "type": "string", + "enum": [ + "elastic", + "fixed" + ] + }, + "buildMachineElasticLastUpdated": { + "type": "number" + }, + "buildMachineElasticReason": { + "type": "string", + "enum": [ + "basic-floor", + "build-timeout-failure", + "enospc-failure", + "enterprise-floor", + "high-peak-disk", + "high-peak-memory", + "long-build-duration", + "oom-failure", + "short-build-duration", + "sustained-high-cpu" + ] + }, + "isNSNBDisabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "buildQueue": { + "properties": { + "configuration": { + "type": "string", + "enum": [ + "SKIP_NAMESPACE_QUEUE", + "WAIT_FOR_NAMESPACE_QUEUE" + ] + } + }, + "type": "object" + }, + "enableFunctionsBeta": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "type": "object", + "required": [ + "functionDefaultRegions" + ] + }, + "rootDirectory": { + "nullable": true, + "type": "string" + }, + "serverlessFunctionZeroConfigFailover": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "skewProtectionBoundaryAt": { + "type": "number" + }, + "skewProtectionMaxAge": { + "type": "number" + }, + "skewProtectionAllowedDomains": { + "items": { + "type": "string" + }, + "type": "array" + }, + "skipGitConnectDuringLink": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "staticIps": { + "properties": { + "builds": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "enabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "regions": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "builds", + "enabled", + "regions" + ], + "type": "object" + }, + "sourceFilesOutsideRootDirectory": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "enableAffectedProjectsDeployments": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "enableExternalRewriteCaching": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "ssoProtection": { + "nullable": true, + "properties": { + "deploymentType": { + "type": "string", + "enum": [ + "all", + "all_except_custom_domains", + "preview", + "prod_deployment_urls_and_all_previews" + ] + }, + "cve55182MigrationAppliedFrom": { + "nullable": true, + "type": "string", + "enum": [ + "all", + "all_except_custom_domains", + "preview", + "prod_deployment_urls_and_all_previews", + null + ] + }, + "april2026SecurityIncidentMigrationAppliedFrom": { + "nullable": true, + "type": "string", + "enum": [ + "all", + "all_except_custom_domains", + "preview", + "prod_deployment_urls_and_all_previews", + null + ] + } + }, + "required": [ + "deploymentType" + ], + "type": "object" + }, + "targets": { + "additionalProperties": { + "nullable": true, + "properties": { + "id": { + "type": "string" + }, + "alias": { + "items": { + "type": "string" + }, + "type": "array" + }, + "aliasAssigned": { + "nullable": true, + "oneOf": [ + { + "type": "number" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + } + ] + }, + "aliasError": { + "nullable": true, + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" + }, + "aliasFinal": { + "nullable": true, + "type": "string" + }, + "automaticAliases": { + "items": { + "type": "string" + }, + "type": "array" + }, + "branchMatcher": { + "properties": { + "type": { + "type": "string", + "enum": [ + "endsWith", + "equals", + "startsWith" + ], + "description": "The type of matching to perform" + }, + "pattern": { + "type": "string", + "description": "The pattern to match against branch names" + } + }, + "required": [ + "pattern", + "type" + ], + "type": "object" + }, + "buildingAt": { + "type": "number" + }, + "builds": { + "items": { + "properties": { + "use": { + "type": "string" + }, + "src": { + "type": "string" + }, + "dest": { + "type": "string" + } + }, + "required": [ + "use" + ], + "type": "object" + }, + "type": "array" + }, + "checksConclusion": { + "type": "string", + "enum": [ + "canceled", + "failed", + "skipped", + "succeeded" + ] + }, + "checksState": { + "type": "string", + "enum": [ + "completed", + "registered", + "running" + ] + }, + "connectBuildsEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "connectConfigurationId": { + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "createdIn": { + "type": "string" + }, + "creator": { + "nullable": true, + "properties": { + "email": { + "type": "string" + }, + "githubLogin": { + "type": "string" + }, + "gitlabLogin": { + "type": "string" + }, + "uid": { + "type": "string" + }, + "username": { + "type": "string" + } + }, + "required": [ + "email", + "uid", + "username" + ], + "type": "object" + }, + "deletedAt": { + "type": "number" + }, + "deploymentHostname": { + "type": "string" + }, + "forced": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "name": { + "type": "string" + }, + "meta": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "monorepoManager": { + "nullable": true, + "type": "string" + }, + "oidcTokenClaims": { + "properties": { + "iss": { + "type": "string" + }, + "sub": { + "type": "string" + }, + "scope": { + "type": "string" + }, + "aud": { + "type": "string" + }, + "owner": { + "type": "string" + }, + "owner_id": { + "type": "string" + }, + "project": { + "type": "string" + }, + "project_id": { + "type": "string" + }, + "environment": { + "type": "string" + }, + "custom_environment_id": { + "type": "string" + }, + "mfe_group_ids": { + "items": { + "type": "string" + }, + "type": "array" + }, + "plan": { + "type": "string" + } + }, + "required": [ + "aud", + "environment", + "iss", + "owner", + "owner_id", + "project", + "project_id", + "scope", + "sub" + ], + "type": "object" + }, + "plan": { + "type": "string", + "enum": [ + "enterprise", + "hobby", + "pro" + ] + }, + "previewCommentsEnabled": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether or not preview comments are enabled for the deployment", + "example": false + }, + "private": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "readyAt": { + "type": "number" + }, + "readyState": { + "type": "string", + "enum": [ + "BLOCKED", + "BUILDING", + "CANCELED", + "ERROR", + "INITIALIZING", + "QUEUED", + "READY" + ] + }, + "readySubstate": { + "type": "string", + "enum": [ + "PROMOTED", + "ROLLING", + "STAGED" + ] + }, + "requestedAt": { + "type": "number" + }, + "target": { + "nullable": true, + "type": "string" + }, + "teamId": { + "nullable": true, + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "LAMBDAS" + ] + }, + "url": { + "type": "string" + }, + "userId": { + "type": "string", + "description": "Present for user creators; omitted for app/integration/system creators." + }, + "withCache": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "createdAt", + "createdIn", + "creator", + "deploymentHostname", + "id", + "name", + "plan", + "private", + "readyState", + "type", + "url" + ], + "type": "object" + }, + "type": "object" + }, + "transferCompletedAt": { + "type": "number" + }, + "transferStartedAt": { + "type": "number" + }, + "transferToAccountId": { + "type": "string" + }, + "transferredFromAccountId": { + "type": "string" + }, + "updatedAt": { + "type": "number" + }, + "live": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "enablePreviewFeedback": { + "nullable": true, + "type": "boolean", + "enum": [ + false, + true, + null + ] + }, + "enableProductionFeedback": { + "nullable": true, + "type": "boolean", + "enum": [ + false, + true, + null + ] + }, + "permissions": { + "properties": { + "aliasProject": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aliasProtectionBypass": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "bulkRedirects": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "buildMachine": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "connectConfigurationLink": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "dataCacheNamespace": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "deployment": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "deploymentBuildLogs": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "deploymentCheck": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "deploymentCheckPreview": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "deploymentCheckReRunFromProductionBranch": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "deploymentProductionGit": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "deploymentV0": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "deploymentPreview": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "deploymentPrivate": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "deploymentPromote": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "deploymentRollback": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "edgeCacheNamespace": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "environments": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "job": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "logs": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "logsPreset": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "observabilityData": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "onDemandBuild": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "onDemandConcurrency": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "optionsAllowlist": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "passwordProtection": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "privateLinkEndpoint": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "productionAliasProtectionBypass": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "productionShareableLink": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "project": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectAccessGroup": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectAnalyticsSampling": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectAnalyticsUsage": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectCheck": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectCheckRun": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectDeploymentExpiration": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectDeploymentHook": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectDeploymentProtectionStrict": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectDomain": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectDomainCheckConfig": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectDomainMove": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectDomainVerify": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectEvent": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectEnvVars": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectEnvVarsProduction": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectEnvVarsUnownedByIntegration": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectFlags": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectFlagsProduction": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectFlagsSdkKey": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectFromV0": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectId": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectIntegrationConfiguration": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectLink": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectMember": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectMonitoring": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectOIDCToken": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectPermissions": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectProductionBranch": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectProtectionBypass": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectRollingRelease": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectRoutes": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectSupportCase": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectSupportCaseComment": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectTier": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectTransfer": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectTransferOut": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectUsage": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "pageIntegrity": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "seawallConfig": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "securityPlusConfiguration": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "shareableLink": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "shareableLinkStrict": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "sharedEnvVarConnection": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "skewProtection": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "analytics": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "trustedIps": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "trustedSources": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "v0Chat": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "vercelAuth": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "vercelRun": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "webAnalytics": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "workflowRunData": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "oauth2Connection": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "user": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "userConnection": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "userMfaConfiguration": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "userPreference": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "userSudo": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "webAuthn": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "accessGroup": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "agent": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aiGatewayApiKey": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aiGatewayApiKeyBypassAll": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aiGatewayApiKeyOwnedBySelf": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aiGatewayApiKeySpendAttribution": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aiGatewayApiKeyZdrExemption": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aiGatewayBudget": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aiGatewayCredits": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aiGatewayPrivateModels": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aiGatewayGuardrails": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aiGatewayRules": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aiGatewaySettings": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aiGatewayTranscripts": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aiGatewayTranscriptsSettings": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aiGatewayUsage": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aiGatewayVirtualModelConfigs": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "alerts": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "alertRules": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aliasGlobal": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "analyticsSampling": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "analyticsUsage": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "apiKey": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "apiKeyAiGateway": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "apiKeyOwnedBySelf": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "oauth2Application": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "vercelAppInstallation": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "vercelAppInstallationRequest": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "auditLog": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "automation": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "billingAddress": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "billingInformation": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "billingInvoice": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "billingInvoiceEmailRecipient": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "billingInvoiceLanguage": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "billingPlan": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "billingPurchaseOrder": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "billingRefund": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "billingTaxId": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "blob": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "blobStoreTokenSet": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "budget": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "cacheArtifact": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "cacheArtifactUsageEvent": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "codeChecks": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "codeOwners": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "ciInvocations": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "ciLogs": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "concurrentBuilds": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "connect": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "connectConfiguration": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "connectLogs": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "connexClient": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "connexClientProject": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "connexContact": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "connexInstallation": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "connexToken": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "buildMachineDefault": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "cursorOriginInstallation": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "dataCacheBillingSettings": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "defaultDeploymentProtection": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "deploymentPolicy": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "domain": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "domainAcceptDelegation": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "domainAuthCodes": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "domainCertificate": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "domainCheckConfig": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "domainMove": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "domainPurchase": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "domainRecord": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "domainTransferIn": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "drain": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "edgeConfig": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "edgeConfigItem": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "edgeConfigSchema": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "edgeConfigToken": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "endpointVerification": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "event": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "fileUpload": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "flagsExplorerSubscription": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "gitRepository": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "imageOptimizationNewPrice": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integration": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integrationAccount": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integrationConfiguration": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integrationConfigurationProjects": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integrationConfigurationRole": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integrationConfigurationTransfer": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integrationDeploymentAction": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integrationEvent": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integrationLog": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integrationResource": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integrationResourceData": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integrationResourceReplCommand": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integrationResourceSecrets": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integrationSSOSession": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integrationStrict": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integrationStoreTokenSet": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integrationVercelConfigurationOverride": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integrationPullRequest": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "ipBlocking": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "jobGlobal": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "kmsIssuer": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "kmsProjectGrant": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "logDrain": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "marketplaceBillingData": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "marketplaceExperimentationEdgeConfigData": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "marketplaceExperimentationItem": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "marketplaceFlexCommit": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "marketplaceInstallationMember": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "marketplaceInvoice": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "marketplaceSettings": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "Monitoring": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "monitoringAlert": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "monitoringChart": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "monitoringQuery": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "monitoringSettings": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "notificationCustomerBudget": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "notificationDeploymentFailed": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "notificationDomainConfiguration": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "notificationDomainExpire": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "notificationDomainMoved": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "notificationDomainPurchase": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "notificationDomainRenewal": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "notificationDomainTransfer": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "notificationDomainUnverified": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "NotificationMonitoringAlert": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "notificationPaymentFailed": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "notificationPreferences": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "notificationStatementOfReasons": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "notificationUsageAlert": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "oidcFederationPolicy": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "observabilityConfiguration": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "observabilityFunnel": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "observabilityNotebook": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "openTelemetryEndpoint": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "ownEvent": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "organization": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "organizationDomain": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "organizationTeam": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "passwordProtectionInvoiceItem": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "paymentMethod": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "permissions": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "postgres": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "postgresStoreTokenSet": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "previewDeploymentSuffix": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "privateCloudAccount": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectTransferIn": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectTransferRequest": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "proTrialOnboarding": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "rateLimit": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "redis": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "redisStoreTokenSet": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "remoteCaching": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "repository": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "samlConfig": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "secret": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "securityConfig": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "sensitiveEnvironmentVariablePolicy": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "sharedEnvVars": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "sharedEnvVarsProduction": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "space": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "spaceRun": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "storeIsLocked": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "storeTokenSetSensitive": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "storeTransfer": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "supportCase": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "supportCaseComment": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "team": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "teamAccessRequest": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "teamFellowMembership": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "teamGitExclusivity": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "teamInvite": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "teamInviteCode": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "teamInviteLink": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "teamJoin": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "teamMemberMfaStatus": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "teamMicrofrontends": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "teamOwnMembership": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "teamOwnMembershipDisconnectSAML": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "teamSudo": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "teamTokenInvalidation": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "token": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "toolbarComment": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "usage": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "usageCycle": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "vcrRepository": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "vpcPeeringConnection": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "webAnalyticsPlan": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "webhook": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "webhook-event": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + } + }, + "type": "object" + }, + "lastRollbackTarget": { + "nullable": true, + "type": "object" + }, + "lastAliasRequest": { + "nullable": true, + "properties": { + "fromDeploymentId": { + "nullable": true, + "type": "string" + }, + "toDeploymentId": { + "type": "string" + }, + "fromRollingReleaseId": { + "type": "string", + "description": "If rolling back from a rolling release, fromDeploymentId captures the \"base\" of that rolling release, and fromRollingReleaseId captures the \"target\" of that rolling release." + }, + "jobStatus": { + "type": "string", + "enum": [ + "failed", + "in-progress", + "pending", + "skipped", + "succeeded" + ] + }, + "requestedAt": { + "type": "number" + }, + "type": { + "type": "string", + "enum": [ + "promote", + "rollback" + ] + } + }, + "required": [ + "fromDeploymentId", + "jobStatus", + "requestedAt", + "toDeploymentId", + "type" + ], + "type": "object" + }, + "protectionBypass": { + "additionalProperties": { + "oneOf": [ + { + "properties": { + "createdAt": { + "type": "number" + }, + "createdBy": { + "type": "string" + }, + "scope": { + "type": "string", + "enum": [ + "integration-automation-bypass" + ] + }, + "integrationId": { + "type": "string" + }, + "configurationId": { + "type": "string" + } + }, + "required": [ + "configurationId", + "createdAt", + "createdBy", + "integrationId", + "scope" + ], + "type": "object" + }, + { + "properties": { + "createdAt": { + "type": "number" + }, + "createdBy": { + "type": "string" + }, + "scope": { + "type": "string", + "enum": [ + "automation-bypass" + ] + }, + "isEnvVar": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "When there was only one bypass, it was automatically set as an env var on deployments. With multiple bypasses, there is always one bypass that is selected as the default, and gets set as an env var on deployments. As this is a new field, undefined means that the bypass is the env var. If there are any automation bypasses, exactly one must be the env var." + }, + "note": { + "type": "string", + "description": "Optional note about the bypass to be displayed in the UI" + } + }, + "required": [ + "createdAt", + "createdBy", + "scope" + ], + "type": "object" + } + ] + }, + "type": "object" + }, + "hasActiveBranches": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "trustedIps": { + "nullable": true, + "oneOf": [ + { + "properties": { + "deploymentType": { + "type": "string", + "enum": [ + "all", + "all_except_custom_domains", + "preview", + "prod_deployment_urls_and_all_previews", + "production" + ] + }, + "addresses": { + "items": { + "properties": { + "value": { + "type": "string" + }, + "note": { + "type": "string" + } + }, + "required": [ + "value" + ], + "type": "object" + }, + "type": "array" + }, + "protectionMode": { + "type": "string", + "enum": [ + "additional", + "exclusive" + ] + } + }, + "required": [ + "addresses", + "deploymentType", + "protectionMode" + ], + "type": "object" + }, + { + "properties": { + "deploymentType": { + "type": "string", + "enum": [ + "all", + "all_except_custom_domains", + "preview", + "prod_deployment_urls_and_all_previews", + "production" + ] + } + }, + "required": [ + "deploymentType" + ], + "type": "object" + } + ] + }, + "trustedSources": { + "nullable": true, + "properties": { + "enableVercelCiSameRepository": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Allow same-team Vercel CI access to preview deployments built from the CI run's repository, using the deployment source rather than the current project repository link. Defaults to enabled when not stored; omitted or null Trusted Sources updates preserve the stored value." + }, + "projects": { + "additionalProperties": { + "properties": { + "label": { + "type": "string" + }, + "customAllow": { + "items": { + "properties": { + "from": { + "oneOf": [ + { + "properties": { + "slugs": { + "items": { + "type": "string" + }, + "type": "array", + "description": "System environment slugs (`production`, `preview`) and/or custom environment slugs defined on the referenced project." + }, + "preset": { + "type": "string", + "enum": [ + "all-custom" + ] + } + }, + "required": [ + "slugs" + ], + "type": "object", + "description": "The source envs on the trusted project that are allowed to access `to`." + }, + { + "properties": { + "slugs": { + "items": { + "type": "string" + }, + "type": "array", + "description": "System environment slugs (`production`, `preview`) and/or custom environment slugs defined on the referenced project." + }, + "preset": { + "type": "string", + "enum": [ + "all-custom" + ] + } + }, + "required": [ + "preset" + ], + "type": "object", + "description": "The source envs on the trusted project that are allowed to access `to`." + } + ] + }, + "to": { + "oneOf": [ + { + "properties": { + "slugs": { + "items": { + "type": "string" + }, + "type": "array", + "description": "System environment slugs (`production`, `preview`) and/or custom environment slugs defined on the referenced project." + }, + "preset": { + "type": "string", + "enum": [ + "all-custom" + ] + } + }, + "required": [ + "slugs" + ], + "type": "object", + "description": "The target envs on the current project that may be accessed." + }, + { + "properties": { + "slugs": { + "items": { + "type": "string" + }, + "type": "array", + "description": "System environment slugs (`production`, `preview`) and/or custom environment slugs defined on the referenced project." + }, + "preset": { + "type": "string", + "enum": [ + "all-custom" + ] + } + }, + "required": [ + "preset" + ], + "type": "object", + "description": "The target envs on the current project that may be accessed." + } + ] + } + }, + "required": [ + "from", + "to" + ], + "type": "object", + "description": "Optional overrides for the default same-env-by-slug matching. Provide explicit rules to allow cross-env access or presets." + }, + "type": "array", + "description": "Optional overrides for the default same-env-by-slug matching. Provide explicit rules to allow cross-env access or presets." + } + }, + "type": "object" + }, + "type": "object" + }, + "oidcProviders": { + "additionalProperties": { + "items": { + "properties": { + "to": { + "oneOf": [ + { + "properties": { + "slugs": { + "items": { + "type": "string" + }, + "type": "array", + "description": "System environment slugs (`production`, `preview`) and/or custom environment slugs defined on the referenced project." + }, + "preset": { + "type": "string", + "enum": [ + "all-custom" + ] + } + }, + "required": [ + "slugs" + ], + "type": "object", + "description": "The target envs on the current project that may be accessed." + }, + { + "properties": { + "slugs": { + "items": { + "type": "string" + }, + "type": "array", + "description": "System environment slugs (`production`, `preview`) and/or custom environment slugs defined on the referenced project." + }, + "preset": { + "type": "string", + "enum": [ + "all-custom" + ] + } + }, + "required": [ + "preset" + ], + "type": "object", + "description": "The target envs on the current project that may be accessed." + } + ] + }, + "label": { + "type": "string" + }, + "claims": { + "additionalProperties": { + "items": { + "type": "string" + }, + "type": "array" + }, + "type": "object" + } + }, + "required": [ + "claims", + "to" + ], + "type": "object" + }, + "type": "array" + }, + "type": "object" + } + }, + "type": "object" + }, + "gitComments": { + "properties": { + "onPullRequest": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether the Vercel bot should comment on PRs" + }, + "onCommit": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether the Vercel bot should comment on commits" + } + }, + "required": [ + "onCommit", + "onPullRequest" + ], + "type": "object" + }, + "gitProviderOptions": { + "properties": { + "createDeployments": { + "type": "string", + "enum": [ + "disabled", + "enabled" + ], + "description": "Whether the Vercel bot should automatically create GitHub deployments https://docs.github.com/en/rest/deployments/deployments#about-deployments NOTE: repository-dispatch events should be used instead" + }, + "disableRepositoryDispatchEvents": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether the Vercel bot should not automatically create GitHub repository-dispatch events on deployment events. https://vercel.com/docs/git/vercel-for-github#repository-dispatch-events - `true`: disable repository-dispatch events for this project (explicit override of the team setting). - `false`: enable repository-dispatch events for this project (explicit override of the team setting). - absent: inherit from `team.disableRepositoryDispatchEvents`." + }, + "requireVerifiedCommits": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether the project requires commits to be signed \u0026 verified before deployments will be created. - `true`: require verified commits for this project (explicit override of the team setting). - `false`: do not require verified commits (explicit override of the team setting). - absent: inherit from `team.requireVerifiedCommits`." + }, + "gitCommitStatus": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether Vercel should post commit statuses for this project. When omitted, commit statuses remain enabled." + }, + "consolidatedGitCommitStatus": { + "properties": { + "enabled": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether consolidated commit status is enabled." + }, + "propagateFailures": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether to propagate individual deployment failures to the consolidated status." + } + }, + "required": [ + "enabled", + "propagateFailures" + ], + "type": "object", + "description": "Configuration for consolidated git commit status reporting. When enabled, Vercel will post a single consolidated commit status instead of individual statuses for each deployment." + } + }, + "required": [ + "createDeployments" + ], + "type": "object" + }, + "paused": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "concurrencyBucketName": { + "type": "string" + }, + "webAnalytics": { + "properties": { + "id": { + "type": "string" + }, + "disabledAt": { + "type": "number" + }, + "canceledAt": { + "type": "number" + }, + "enabledAt": { + "type": "number" + }, + "hasData": { + "type": "boolean", + "enum": [ + true + ] + } + }, + "required": [ + "id" + ], + "type": "object" + }, + "security": { + "properties": { + "attackModeEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "attackModeUpdatedAt": { + "type": "number" + }, + "firewallEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "firewallUpdatedAt": { + "type": "number" + }, + "attackModeActiveUntil": { + "nullable": true, + "type": "number" + }, + "firewallConfigVersion": { + "type": "number" + }, + "rulesets": { + "additionalProperties": { + "properties": { + "action": { + "type": "string", + "enum": [ + "allow", + "bypass", + "challenge", + "deny", + "log", + "rate_limit", + "redirect" + ] + }, + "rateLimit": { + "nullable": true, + "properties": { + "algo": { + "type": "string", + "enum": [ + "fixed_window", + "token_bucket" + ] + }, + "window": { + "type": "number" + }, + "limit": { + "type": "number" + }, + "keys": { + "items": { + "type": "string" + }, + "type": "array" + }, + "action": { + "nullable": true, + "type": "string", + "enum": [ + "challenge", + "deny", + "log", + "rate_limit", + null + ] + } + }, + "required": [ + "algo", + "keys", + "limit", + "window" + ], + "type": "object" + }, + "redirect": { + "nullable": true, + "properties": { + "location": { + "type": "string" + }, + "permanent": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "location", + "permanent" + ], + "type": "object" + }, + "actionDuration": { + "nullable": true, + "type": "string" + }, + "bypassSystem": { + "nullable": true, + "type": "boolean", + "enum": [ + false, + true, + null + ] + }, + "logHeaders": { + "oneOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "string", + "enum": [ + "*" + ] + } + ] + } + }, + "required": [ + "action" + ], + "type": "object" + }, + "type": "object" + }, + "firewallSeawallEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "ja3Enabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "ja4Enabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "firewallBypassIps": { + "items": { + "type": "string" + }, + "type": "array" + }, + "managedRules": { + "nullable": true, + "properties": { + "vercel_ruleset": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "challenge", + "deny", + "log" + ] + } + }, + "required": [ + "active" + ], + "type": "object" + }, + "traffic_sources": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "challenge", + "deny", + "log" + ] + } + }, + "required": [ + "active" + ], + "type": "object" + }, + "bot_filter": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "challenge", + "deny", + "log" + ] + } + }, + "required": [ + "active" + ], + "type": "object" + }, + "ai_bots": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "challenge", + "deny", + "log" + ] + } + }, + "required": [ + "active" + ], + "type": "object" + }, + "owasp": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "challenge", + "deny", + "log" + ] + } + }, + "required": [ + "active" + ], + "type": "object" + } + }, + "required": [ + "ai_bots", + "bot_filter", + "owasp", + "traffic_sources", + "vercel_ruleset" + ], + "type": "object" + }, + "botIdEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "log_headers": { + "oneOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "string", + "enum": [ + "*" + ] + } + ] + }, + "securityPlus": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "securityPlusMetadata": { + "properties": { + "updatedAt": { + "type": "number" + }, + "firstEnabledAt": { + "type": "number", + "description": "Timestamp when the feature was first enabled. Never changes after initial enablement." + } + }, + "required": [ + "updatedAt" + ], + "type": "object" + }, + "pageIntegrityEnabled": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether Page Integrity is enabled for this project. Used by the metadata service to gate DynamoDB lookups against the page-integrity-inventory table." + } + }, + "type": "object" + }, + "oidcTokenConfig": { + "properties": { + "enabled": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether or not to generate OpenID Connect JSON Web Tokens." + }, + "issuerMode": { + "type": "string", + "enum": [ + "global", + "team" + ], + "description": "- team: `https://oidc.vercel.com/[team_slug]` - global: `https://oidc.vercel.com`" + } + }, + "type": "object" + }, + "deploymentPolicy": { + "nullable": true, + "properties": { + "gitSources": { + "nullable": true, + "items": { + "properties": { + "sources": { + "items": { + "oneOf": [ + { + "properties": { + "provider": { + "type": "string", + "enum": [ + "bitbucket", + "github" + ] + }, + "org": { + "type": "string" + }, + "repo": { + "type": "string" + } + }, + "required": [ + "org", + "provider" + ], + "type": "object", + "description": "Allowlist entry for GitHub and Bitbucket, whose repos are identified by a flat `org`/`repo` (Bitbucket's workspace/owner maps to `org`, its repo slug to `repo`). Omit `repo` to match any repo in the org. Org is matched case-insensitively." + }, + { + "properties": { + "provider": { + "type": "string", + "enum": [ + "gitlab" + ] + }, + "namespace": { + "type": "string" + }, + "project": { + "type": "string" + } + }, + "required": [ + "namespace", + "provider" + ], + "type": "object", + "description": "Allowlist entry for GitLab, which uses nested groups rather than a flat org/repo. `namespace` is the full group path (e.g. `group` or `group/subgroup`); `project` is the leaf project name. Omit `project` to match any project under the namespace. Namespace is matched case-insensitively." + } + ] + }, + "type": "array" + }, + "enabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "environments": { + "items": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "system" + ] + }, + "target": { + "type": "string", + "enum": [ + "preview", + "production" + ] + } + }, + "required": [ + "target", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "custom" + ] + }, + "environmentId": { + "type": "string" + } + }, + "required": [ + "environmentId", + "type" + ], + "type": "object" + } + ] + }, + "type": "array" + } + }, + "required": [ + "enabled", + "environments", + "sources" + ], + "type": "object", + "description": "`enabled: true` with empty `sources` is deny-all." + }, + "type": "array" + }, + "deploymentSources": { + "nullable": true, + "items": { + "properties": { + "sources": { + "items": { + "type": "string", + "enum": [ + "cli", + "deploy-hook", + "git", + "integration", + "rest-api", + "v0" + ], + "description": "Customer-configurable deployment sources. Every deploy classifies to exactly one. JSON schema in `packages/deployment-policy/schemas/body.ts` enumerates exactly these values. - `'git'` — git provider webhook. - `'cli'` — Vercel CLI (legacy classic-token CLI and SIWV CLI both). - `'rest-api'` — direct user/team-token REST upload. Does NOT cover deploy hooks, Marketplace integrations, or first-party app tokens. - `'deploy-hook'` — project deploy-hook URL. The URL is the credential. - `'integration'` — third-party Marketplace actor: Marketplace integration token, user-delegated OAuth from a Marketplace app, or an unrecognized third-party Vercel App. First-party Vercel Apps are never `'integration'`. - `'v0'` — the v0 product surface (entitlement-gated). v0 deploys through the CLI under the hood, but classifies as its own source so a team can allow or deny v0 independently of `'cli'`. First-party Vercel apps (Toolbar, etc.) classify as `'first-party'` — see `ClassifiedSource` in `./checks`. They're not in this union because they aren't customer-configurable; they bypass `checkDeploymentSources` entirely. v0 is intentionally NOT among them: like the CLI, it's a real product surface and is policy-controllable." + }, + "type": "array" + }, + "enabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "environments": { + "items": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "system" + ] + }, + "target": { + "type": "string", + "enum": [ + "preview", + "production" + ] + } + }, + "required": [ + "target", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "custom" + ] + }, + "environmentId": { + "type": "string" + } + }, + "required": [ + "environmentId", + "type" + ], + "type": "object" + } + ] + }, + "type": "array" + } + }, + "required": [ + "enabled", + "environments", + "sources" + ], + "type": "object", + "description": "`enabled: true` with empty `sources` is deny-all." + }, + "type": "array" + } + }, + "type": "object", + "description": "Project shape. `null` on a rule list clears the project's override for that rule type (fall back to team for every env); omitting is equivalent. Setting `deploymentPolicy` itself to `null` clears every override at once. Kept structurally distinct from {@link TeamDeploymentPolicy} so the two storage locations don't share a type by accident." + }, + "tier": { + "type": "string", + "enum": [ + "advanced", + "critical", + "priority" + ] + }, + "usageStatus": { + "properties": { + "kind": { + "type": "string", + "enum": [ + "flat" + ], + "description": "Billing mode. Always 'flat' for flat-rate projects." + }, + "exceededAllowanceUntil": { + "type": "number", + "description": "Timestamp until which the project has exceeded its CDN allowance." + }, + "bypassThrottleUntil": { + "type": "number", + "description": "Timestamp until which throttling is bypassed (project pays list rates for overage)." + }, + "throttled": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Per-project throttle, set explicitly for this project (e.g. via the per-project Flat Rate CDN endpoint)." + }, + "teamThrottled": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Synced from `team.billing.usageStatus.throttled`. When `true`, the team has throttled all of its projects regardless of `throttled`. The effective throttle the CDN enforces is `throttled || teamThrottled`." + } + }, + "required": [ + "kind" + ], + "type": "object" + }, + "features": { + "properties": { + "webAnalytics": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "type": "object" + }, + "v0": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "v0Created": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "abuse": { + "properties": { + "scanner": { + "type": "string" + }, + "history": { + "items": { + "properties": { + "scanner": { + "type": "string" + }, + "reason": { + "type": "string" + }, + "by": { + "type": "string" + }, + "byId": { + "type": "string" + }, + "at": { + "type": "number" + } + }, + "required": [ + "at", + "by", + "byId", + "reason", + "scanner" + ], + "type": "object" + }, + "type": "array" + }, + "updatedAt": { + "type": "number" + }, + "block": { + "properties": { + "action": { + "type": "string", + "enum": [ + "blocked" + ] + }, + "reason": { + "type": "string" + }, + "statusCode": { + "type": "number" + }, + "createdAt": { + "type": "number" + }, + "caseId": { + "type": "string" + }, + "actor": { + "type": "string" + }, + "comment": { + "type": "string" + }, + "ineligibleForAppeal": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "isCascading": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "action", + "createdAt", + "reason", + "statusCode" + ], + "type": "object" + }, + "blockHistory": { + "items": { + "oneOf": [ + { + "properties": { + "action": { + "type": "string", + "enum": [ + "blocked" + ] + }, + "reason": { + "type": "string" + }, + "statusCode": { + "type": "number" + }, + "createdAt": { + "type": "number" + }, + "caseId": { + "type": "string" + }, + "actor": { + "type": "string" + }, + "comment": { + "type": "string" + }, + "ineligibleForAppeal": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "isCascading": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "action", + "createdAt", + "reason", + "statusCode" + ], + "type": "object" + }, + { + "properties": { + "action": { + "type": "string", + "enum": [ + "unblocked" + ] + }, + "createdAt": { + "type": "number" + }, + "caseId": { + "type": "string" + }, + "actor": { + "type": "string" + }, + "comment": { + "type": "string" + }, + "ineligibleForAppeal": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "isCascading": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "action", + "createdAt" + ], + "type": "object" + }, + { + "properties": { + "action": { + "type": "string", + "enum": [ + "route-blocked" + ] + }, + "route": { + "oneOf": [ + { + "properties": { + "src": { + "type": "string" + }, + "status": { + "type": "number" + }, + "expiry": { + "type": "number" + } + }, + "required": [ + "src", + "status" + ], + "type": "object" + }, + { + "properties": { + "has": { + "items": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "header" + ] + }, + "key": { + "type": "string", + "enum": [ + "x-vercel-ip-country" + ] + }, + "value": { + "properties": { + "eq": { + "type": "string" + } + }, + "required": [ + "eq" + ], + "type": "object" + } + }, + "required": [ + "key", + "type", + "value" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "host" + ] + }, + "value": { + "properties": { + "eq": { + "type": "string" + } + }, + "required": [ + "eq" + ], + "type": "object" + } + }, + "required": [ + "type", + "value" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "mitigate": { + "properties": { + "action": { + "type": "string", + "enum": [ + "block_legal_cwc" + ] + } + }, + "required": [ + "action" + ], + "type": "object" + }, + "src": { + "type": "string" + } + }, + "required": [ + "has", + "mitigate" + ], + "type": "object" + } + ] + }, + "reason": { + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "caseId": { + "type": "string" + }, + "actor": { + "type": "string" + }, + "comment": { + "type": "string" + }, + "ineligibleForAppeal": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "isCascading": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "action", + "createdAt", + "reason", + "route" + ], + "type": "object" + }, + { + "properties": { + "action": { + "type": "string", + "enum": [ + "route-unblocked" + ] + }, + "route": { + "oneOf": [ + { + "properties": { + "src": { + "type": "string" + }, + "status": { + "type": "number" + }, + "expiry": { + "type": "number" + } + }, + "required": [ + "src", + "status" + ], + "type": "object" + }, + { + "properties": { + "has": { + "items": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "header" + ] + }, + "key": { + "type": "string", + "enum": [ + "x-vercel-ip-country" + ] + }, + "value": { + "properties": { + "eq": { + "type": "string" + } + }, + "required": [ + "eq" + ], + "type": "object" + } + }, + "required": [ + "key", + "type", + "value" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "host" + ] + }, + "value": { + "properties": { + "eq": { + "type": "string" + } + }, + "required": [ + "eq" + ], + "type": "object" + } + }, + "required": [ + "type", + "value" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "mitigate": { + "properties": { + "action": { + "type": "string", + "enum": [ + "block_legal_cwc" + ] + } + }, + "required": [ + "action" + ], + "type": "object" + }, + "src": { + "type": "string" + } + }, + "required": [ + "has", + "mitigate" + ], + "type": "object" + } + ] + }, + "statusCode": { + "type": "number" + }, + "createdAt": { + "type": "number" + }, + "caseId": { + "type": "string" + }, + "actor": { + "type": "string" + }, + "comment": { + "type": "string" + }, + "ineligibleForAppeal": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "isCascading": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "action", + "createdAt", + "route" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "interstitial": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "interstitialHistory": { + "items": { + "properties": { + "action": { + "type": "string", + "enum": [ + "add-deployment-interstitial", + "add-project-interstitial", + "remove-deployment-interstitial", + "remove-project-interstitial" + ] + }, + "createdAt": { + "type": "number" + }, + "caseId": { + "type": "string" + }, + "reason": { + "type": "string" + }, + "actor": { + "type": "string" + }, + "comment": { + "type": "string" + } + }, + "required": [ + "action", + "createdAt" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "history", + "updatedAt" + ], + "type": "object" + }, + "internalRoutes": { + "items": { + "oneOf": [ + { + "properties": { + "src": { + "type": "string" + }, + "status": { + "type": "number" + }, + "expiry": { + "type": "number" + } + }, + "required": [ + "src", + "status" + ], + "type": "object" + }, + { + "properties": { + "has": { + "items": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "header" + ] + }, + "key": { + "type": "string", + "enum": [ + "x-vercel-ip-country" + ] + }, + "value": { + "properties": { + "eq": { + "type": "string" + } + }, + "required": [ + "eq" + ], + "type": "object" + } + }, + "required": [ + "key", + "type", + "value" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "host" + ] + }, + "value": { + "properties": { + "eq": { + "type": "string" + } + }, + "required": [ + "eq" + ], + "type": "object" + } + }, + "required": [ + "type", + "value" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "mitigate": { + "properties": { + "action": { + "type": "string", + "enum": [ + "block_legal_cwc" + ] + } + }, + "required": [ + "action" + ], + "type": "object" + }, + "src": { + "type": "string" + } + }, + "required": [ + "has", + "mitigate" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "hasDeployments": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "dismissedToasts": { + "items": { + "properties": { + "key": { + "type": "string" + }, + "dismissedAt": { + "type": "number" + }, + "action": { + "type": "string", + "enum": [ + "accept", + "cancel", + "delete" + ] + }, + "value": { + "nullable": true, + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "properties": { + "previousValue": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + } + ] + }, + "currentValue": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + } + ] + } + }, + "required": [ + "currentValue", + "previousValue" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + } + ] + } + }, + "required": [ + "action", + "dismissedAt", + "key", + "value" + ], + "type": "object" + }, + "type": "array" + }, + "protectedSourcemaps": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "tracing": { + "properties": { + "domains": { + "type": "string" + }, + "ignorePaths": { + "items": { + "type": "string" + }, + "type": "array" + }, + "samplingRules": { + "items": { + "properties": { + "rate": { + "type": "number" + }, + "env": { + "type": "string", + "enum": [ + "preview", + "production" + ] + }, + "requestPath": { + "type": "string" + }, + "destination": { + "type": "string", + "enum": [ + "external", + "internal" + ], + "description": "Which tracing destination this rule applies to. `internal` is the hidden Vercel production-tracing drain (internal delivery); `external` is any customer-configured drain. Derived from the owning drain's delivery type when project tracing is computed; absent on configs persisted before this field existed." + } + }, + "required": [ + "rate" + ], + "type": "object" + }, + "type": "array" + } + }, + "type": "object" + }, + "avatar": { + "nullable": true, + "type": "string" + } + }, + "required": [ + "accountId", + "alias", + "defaultResourceConfig", + "deploymentExpiration", + "directoryListing", + "id", + "name", + "nodeVersion", + "resourceConfig" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "projects" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "groupId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + } + }, + "/v1/microfrontends/{deploymentId}/config": { + "get": { + "description": "Get the microfrontends config for a deployment.", + "operationId": "getMicrofrontendsConfig", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Get microfrontends config for a deployment", + "tags": [ + "microfrontends" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "config": { + "nullable": true, + "properties": { + "$schema": { + "type": "string", + "description": "See https://openapi.vercel.sh/microfrontends.json." + }, + "version": { + "type": "string", + "enum": [ + "1" + ], + "description": "The version of the microfrontends config schema." + }, + "applications": { + "additionalProperties": { + "oneOf": [ + { + "properties": { + "development": { + "properties": { + "fallback": { + "type": "string", + "description": "Fallback for local development, could point to any environment. This is required for the default app. This value is used as the fallback for child apps as well if they do not have a fallback. If passing a string, include the protocol (optional), host (required) and port (optional). For example: `https://this.ismyhost:8080`. If omitted, the protocol defaults to HTTPS. If omitted, the port defaults to `80` for HTTP and `443` for HTTPS. See https://vercel.com/docs/microfrontends/local-development." + }, + "local": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "task": { + "type": "string", + "description": "The task to run when starting the development server. Should reference a script in the package.json of the application. The default value is \"dev\". See https://vercel.com/docs/microfrontends/local-development." + } + }, + "required": [ + "fallback" + ], + "type": "object", + "description": "Development configuration for the default application." + }, + "packageName": { + "type": "string", + "description": "The name used to run the application, e.g. the `name` field in the `package.json`. This is used by the local proxy to map the application config to the locally running app. This is only necessary when the application name does not match the `name` used in `package.json`. See https://vercel.com/docs/microfrontends/configuration#application-naming." + }, + "projectId": { + "type": "string" + } + }, + "required": [ + "development", + "projectId" + ], + "type": "object" + }, + { + "properties": { + "development": { + "properties": { + "fallback": { + "type": "string", + "description": "Fallback for local development, could point to any environment. If not provided for child apps, the fallback of the default app will be used. If passing a string, include the protocol (optional), host (required) and port (optional). For example: `https://this.ismyhost:8080`. If omitted, the protocol defaults to HTTPS. If omitted, the port defaults to `80` for HTTP and `443` for HTTPS. See https://vercel.com/docs/microfrontends/local-development." + }, + "local": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "task": { + "type": "string", + "description": "The task to run when starting the development server. Should reference a script in the package.json of the application. The default value is \"dev\". See https://vercel.com/docs/microfrontends/local-development." + } + }, + "type": "object", + "description": "Development configuration for the child application." + }, + "routing": { + "items": { + "properties": { + "group": { + "type": "string", + "description": "Group name for the paths." + }, + "flag": { + "type": "string", + "description": "The name of the feature flag that controls routing for this group of paths. See https://vercel.com/docs/microfrontends/path-routing#routing-changes-safely-with-flags." + }, + "paths": { + "items": { + "type": "string" + }, + "type": "array", + "description": "A list of path expressions that are routed to this application. See https://vercel.com/docs/microfrontends/path-routing#supported-path-expressions." + } + }, + "required": [ + "paths" + ], + "type": "object", + "description": "Groups of path expressions that are routed to this application. See https://vercel.com/docs/microfrontends/path-routing." + }, + "type": "array", + "description": "Groups of path expressions that are routed to this application. See https://vercel.com/docs/microfrontends/path-routing." + }, + "assetPrefix": { + "type": "string", + "description": "The name of the asset prefix to use instead of the auto-generated name. The asset prefix is used to prefix all paths to static assets, such as JS, CSS, or images that are served by a specific application. It is necessary to ensure there are no conflicts with other applications on the same domain. An auto-generated asset prefix of the form `vc-ap-\u003chash\u003e` is used when this field is not provided. When this field is provided, `/${assetPrefix}/:path*` must also be added to the list of paths in the `routing` field. Changing the asset prefix after a microfrontend application has already been deployed is not a forwards and backwards compatible change, and the asset prefix should be added to the `routing` field and deployed before setting the `assetPrefix` field. The default value is the auto-generated asset prefix of the form `vc-ap-\u003chash\u003e`. See https://vercel.com/docs/microfrontends/path-routing#asset-prefix." + }, + "packageName": { + "type": "string", + "description": "The name used to run the application, e.g. the `name` field in the `package.json`. This is used by the local proxy to map the application config to the locally running app. This is only necessary when the application name does not match the `name` used in `package.json`. See https://vercel.com/docs/microfrontends/configuration#application-naming." + }, + "projectId": { + "type": "string" + } + }, + "required": [ + "projectId", + "routing" + ], + "type": "object" + } + ] + }, + "type": "object" + }, + "options": { + "properties": { + "disableOverrides": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "If you want to disable the overrides for the site. For example, if you are managing rewrites between applications externally, you may wish to disable the overrides on the toolbar as they will have no effect. See https://vercel.com/docs/microfrontends/managing-microfrontends/vercel-toolbar#routing-overrides." + }, + "localProxyPort": { + "type": "number", + "description": "The port number used by the local proxy server. The default value is 3024. See https://vercel.com/docs/microfrontends/local-development." + } + }, + "type": "object", + "description": "Optional configuration options for the microfrontend." + } + }, + "required": [ + "applications" + ], + "type": "object", + "description": "projectIds are added when the config is uploaded to s3 deployment assets." + } + }, + "required": [ + "config" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + }, + "500": { + "description": "" + } + }, + "parameters": [ + { + "name": "deploymentId", + "description": "The unique deployment identifier", + "in": "path", + "required": true, + "schema": { + "description": "The unique deployment identifier", + "type": "string" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + } + }, + "/v1/microfrontends/projects/{projectIdOrName}/production-mfe-config": { + "get": { + "description": "Get the microfrontends config for a project by ID or name.", + "operationId": "getMicrofrontendsConfigForProject", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Get microfrontends config for a project", + "tags": [ + "microfrontends" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "config": { + "nullable": true, + "properties": { + "$schema": { + "type": "string", + "description": "See https://openapi.vercel.sh/microfrontends.json." + }, + "version": { + "type": "string", + "enum": [ + "1" + ], + "description": "The version of the microfrontends config schema." + }, + "applications": { + "additionalProperties": { + "oneOf": [ + { + "properties": { + "development": { + "properties": { + "fallback": { + "type": "string", + "description": "Fallback for local development, could point to any environment. This is required for the default app. This value is used as the fallback for child apps as well if they do not have a fallback. If passing a string, include the protocol (optional), host (required) and port (optional). For example: `https://this.ismyhost:8080`. If omitted, the protocol defaults to HTTPS. If omitted, the port defaults to `80` for HTTP and `443` for HTTPS. See https://vercel.com/docs/microfrontends/local-development." + }, + "local": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "task": { + "type": "string", + "description": "The task to run when starting the development server. Should reference a script in the package.json of the application. The default value is \"dev\". See https://vercel.com/docs/microfrontends/local-development." + } + }, + "required": [ + "fallback" + ], + "type": "object", + "description": "Development configuration for the default application." + }, + "packageName": { + "type": "string", + "description": "The name used to run the application, e.g. the `name` field in the `package.json`. This is used by the local proxy to map the application config to the locally running app. This is only necessary when the application name does not match the `name` used in `package.json`. See https://vercel.com/docs/microfrontends/configuration#application-naming." + }, + "projectId": { + "type": "string" + } + }, + "required": [ + "development", + "projectId" + ], + "type": "object" + }, + { + "properties": { + "development": { + "properties": { + "fallback": { + "type": "string", + "description": "Fallback for local development, could point to any environment. If not provided for child apps, the fallback of the default app will be used. If passing a string, include the protocol (optional), host (required) and port (optional). For example: `https://this.ismyhost:8080`. If omitted, the protocol defaults to HTTPS. If omitted, the port defaults to `80` for HTTP and `443` for HTTPS. See https://vercel.com/docs/microfrontends/local-development." + }, + "local": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "task": { + "type": "string", + "description": "The task to run when starting the development server. Should reference a script in the package.json of the application. The default value is \"dev\". See https://vercel.com/docs/microfrontends/local-development." + } + }, + "type": "object", + "description": "Development configuration for the child application." + }, + "routing": { + "items": { + "properties": { + "group": { + "type": "string", + "description": "Group name for the paths." + }, + "flag": { + "type": "string", + "description": "The name of the feature flag that controls routing for this group of paths. See https://vercel.com/docs/microfrontends/path-routing#routing-changes-safely-with-flags." + }, + "paths": { + "items": { + "type": "string" + }, + "type": "array", + "description": "A list of path expressions that are routed to this application. See https://vercel.com/docs/microfrontends/path-routing#supported-path-expressions." + } + }, + "required": [ + "paths" + ], + "type": "object", + "description": "Groups of path expressions that are routed to this application. See https://vercel.com/docs/microfrontends/path-routing." + }, + "type": "array", + "description": "Groups of path expressions that are routed to this application. See https://vercel.com/docs/microfrontends/path-routing." + }, + "assetPrefix": { + "type": "string", + "description": "The name of the asset prefix to use instead of the auto-generated name. The asset prefix is used to prefix all paths to static assets, such as JS, CSS, or images that are served by a specific application. It is necessary to ensure there are no conflicts with other applications on the same domain. An auto-generated asset prefix of the form `vc-ap-\u003chash\u003e` is used when this field is not provided. When this field is provided, `/${assetPrefix}/:path*` must also be added to the list of paths in the `routing` field. Changing the asset prefix after a microfrontend application has already been deployed is not a forwards and backwards compatible change, and the asset prefix should be added to the `routing` field and deployed before setting the `assetPrefix` field. The default value is the auto-generated asset prefix of the form `vc-ap-\u003chash\u003e`. See https://vercel.com/docs/microfrontends/path-routing#asset-prefix." + }, + "packageName": { + "type": "string", + "description": "The name used to run the application, e.g. the `name` field in the `package.json`. This is used by the local proxy to map the application config to the locally running app. This is only necessary when the application name does not match the `name` used in `package.json`. See https://vercel.com/docs/microfrontends/configuration#application-naming." + }, + "projectId": { + "type": "string" + } + }, + "required": [ + "projectId", + "routing" + ], + "type": "object" + } + ] + }, + "type": "object" + }, + "options": { + "properties": { + "disableOverrides": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "If you want to disable the overrides for the site. For example, if you are managing rewrites between applications externally, you may wish to disable the overrides on the toolbar as they will have no effect. See https://vercel.com/docs/microfrontends/managing-microfrontends/vercel-toolbar#routing-overrides." + }, + "localProxyPort": { + "type": "number", + "description": "The port number used by the local proxy server. The default value is 3024. See https://vercel.com/docs/microfrontends/local-development." + } + }, + "type": "object", + "description": "Optional configuration options for the microfrontend." + } + }, + "required": [ + "applications" + ], + "type": "object", + "description": "projectIds are added when the config is uploaded to s3 deployment assets." + } + }, + "required": [ + "config" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + }, + "500": { + "description": "" + } + }, + "parameters": [ + { + "name": "projectIdOrName", + "description": "The name or ID of the project", + "in": "path", + "required": true, + "schema": { + "description": "The name or ID of the project", + "type": "string" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + } + }, + "/v1/microfrontends/group": { + "post": { + "description": "Creates a microfrontends group and attaches multiple projects in a single request.", + "operationId": "createMicrofrontendsGroupWithApplications", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Create a microfrontends group with applications", + "tags": [ + "microfrontends" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "newMicrofrontendsGroup": { + "properties": { + "id": { + "type": "string" + }, + "slug": { + "type": "string" + }, + "name": { + "type": "string" + }, + "fallbackEnvironment": { + "type": "string" + }, + "enablePolyrepoBranchRouting": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "createdAt": { + "type": "number" + }, + "updatedAt": { + "type": "number" + } + }, + "required": [ + "createdAt", + "enablePolyrepoBranchRouting", + "fallbackEnvironment", + "id", + "name", + "slug", + "updatedAt" + ], + "type": "object" + } + }, + "required": [ + "newMicrofrontendsGroup" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "410": { + "description": "" + }, + "500": { + "description": "" + } + }, + "parameters": [ + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "groupName", + "defaultApp", + "otherApplications" + ], + "properties": { + "groupName": { + "type": "string", + "example": "MFE Group 1", + "description": "The name of the microfrontends group that will be used to identify the group" + }, + "defaultApp": { + "type": "object", + "required": [ + "projectId" + ], + "description": "The default app for the new microfrontend group", + "properties": { + "projectId": { + "type": "string", + "description": "The id of the project that will be used as the default app for the new microfrontend group" + }, + "defaultRoute": { + "type": "string", + "description": "The default route for the default app of the new microfrontend group" + } + } + }, + "otherApplications": { + "type": "array", + "description": "The list of other applications that will be used in the new microfrontend group", + "items": { + "type": "object", + "required": [ + "projectId" + ], + "properties": { + "projectId": { + "type": "string", + "description": "The id of the project that will be used in the new microfrontend group" + }, + "defaultRoute": { + "type": "string", + "description": "The default route for the application in the new microfrontend group" + } + } + } + } + } + } + } + } + } + } + }, + "/v1/observability/manage/configuration/projects": { + "get": { + "description": "Lists the projects that are currently configured as disabled for Observability Plus on a team.", + "operationId": "getObservabilityConfigurationProjects", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Lists disabled Observability Plus projects", + "tags": [ + "observability" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "disabledProjects": { + "items": { + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "disabledAt": { + "type": "number" + } + }, + "required": [ + "disabledAt", + "id" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "disabledProjects" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "" + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + } + }, + "/v1/observability/manage/configuration/projects/{projectIdOrName}": { + "put": { + "description": "Updates whether Observability Plus is disabled for a single project.", + "operationId": "updateObservabilityConfigurationProject", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Updates a disabled Observability Plus project setting", + "tags": [ + "observability" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "id": { + "type": "string" + }, + "disabledAt": { + "type": "number" + } + }, + "required": [ + "id" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid.\nOne of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + }, + "429": { + "description": "" + } + }, + "parameters": [ + { + "name": "projectIdOrName", + "description": "The ID or name of the project to update", + "in": "path", + "required": true, + "schema": { + "type": "string", + "description": "The ID or name of the project to update" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "additionalProperties": false, + "required": [ + "disabled" + ], + "properties": { + "disabled": { + "type": "boolean", + "description": "Whether Observability Plus should be disabled for the project" + } + } + } + } + } + } + } + }, + "/v2/observability/query": { + "post": { + "description": "", + "operationId": "createObservabilityQuery", + "security": [], + "tags": [], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "402": { + "description": "" + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "408": { + "description": "" + }, + "410": { + "description": "" + }, + "413": { + "description": "" + }, + "422": { + "description": "" + }, + "500": { + "description": "" + }, + "503": { + "description": "" + } + }, + "parameters": [], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "metric", + "scope" + ], + "properties": { + "metric": { + "type": "string", + "description": "Metric id" + }, + "scope": { + "type": "object", + "description": "Owner or project scope for the query" + }, + "aggregation": { + "type": "string", + "description": "Aggregation function to apply. Some aggregations require a dimension: use \u003cagg\u003e/\u003cdimension\u003e, for example unique/visitor_id." + }, + "groupBy": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Dimensions to group results by. JSON dimensions support nested refs, for example event_data/checkout_step. Nested keys containing characters that OData cannot parse as an identifier, such as '-', spaces, quotes, or '/', must be wrapped in single quotes (escape embedded single quotes by doubling them), for example flags/'enable-comments-view' or event_data/'some property''s/value'." + }, + "filter": { + "type": "string", + "description": "Filter to apply to the query. JSON dimensions support nested refs, for example event_data/checkout_step eq 'payment'. Nested keys containing characters that OData cannot parse as an identifier, such as '-', spaces, quotes, or '/', must be wrapped in single quotes (escape embedded single quotes by doubling them), for example flags/'enable-comments-view' eq true or event_data/'some property''s/value' eq true." + }, + "limit": { + "type": "number", + "description": "Maximum number of results" + }, + "orderBy": { + "type": "string", + "description": "Rollup column to order grouped results by. Use the generated rollup key for the requested metric and aggregation. Defaults to the query engine count rollup." + }, + "orderDirection": { + "type": "string", + "enum": [ + "asc", + "desc" + ], + "description": "Direction to order grouped results by. Defaults to desc." + }, + "granularity": { + "type": "object", + "description": "Time bucket size" + }, + "startTime": { + "type": "string", + "description": "Start timestamp" + }, + "endTime": { + "type": "string", + "description": "End timestamp" + }, + "bucketTimezone": { + "type": "string", + "description": "IANA timezone (e.g. Europe/Paris) used only to align calendar buckets (1d/1mo) to that zone's day/month boundaries. startTime/endTime and all output timestamps are always UTC. No effect on sub-day granularities." + } + }, + "additionalProperties": true + } + } + } + } + } + }, + "/v2/observability/schema": { + "get": { + "description": "", + "operationId": "getObservabilitySchema", + "security": [], + "tags": [], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "metrics": { + "items": { + "properties": { + "id": { + "type": "string" + }, + "description": { + "type": "string" + } + }, + "required": [ + "description", + "id" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "metrics" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "" + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "410": { + "description": "" + } + }, + "parameters": [] + } + }, + "/v2/observability/schema/{metricId}": { + "get": { + "description": "", + "operationId": "getObservabilitySchemaByMetricId", + "security": [], + "tags": [], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "items": { + "properties": { + "id": { + "type": "string" + }, + "description": { + "type": "string" + }, + "dimensions": { + "items": { + "properties": { + "name": { + "type": "string" + }, + "label": { + "type": "string" + }, + "description": { + "type": "string" + } + }, + "required": [ + "label", + "name" + ], + "type": "object" + }, + "type": "array" + }, + "unit": { + "type": "string" + }, + "aggregations": { + "items": { + "type": "string" + }, + "type": "array" + }, + "defaultAggregation": { + "type": "string" + } + }, + "required": [ + "aggregations", + "defaultAggregation", + "description", + "dimensions", + "id", + "unit" + ], + "type": "object" + }, + "type": "array" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "metricId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ] + } + }, + "/v1/projects/{idOrName}/members": { + "get": { + "description": "Lists all members of a project.", + "operationId": "getProjectMembers", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "List project members", + "tags": [ + "projectMembers" + ], + "responses": { + "200": { + "description": "Paginated list of members for the project.", + "content": { + "application/json": { + "schema": { + "oneOf": [ + { + "type": "object" + }, + { + "properties": { + "members": { + "items": { + "properties": { + "avatar": { + "type": "string", + "description": "ID of the file for the Avatar of this member.", + "example": "123a6c5209bc3778245d011443644c8d27dc2c50" + }, + "email": { + "type": "string", + "description": "The email of this member.", + "example": "jane.doe@example.com" + }, + "role": { + "type": "string", + "enum": [ + "ADMIN", + "PROJECT_DEVELOPER", + "PROJECT_GUEST", + "PROJECT_VIEWER" + ], + "description": "Role of this user in the project.", + "example": "ADMIN" + }, + "computedProjectRole": { + "type": "string", + "enum": [ + "ADMIN", + "PROJECT_DEVELOPER", + "PROJECT_GUEST", + "PROJECT_VIEWER" + ], + "description": "Role of this user in the project.", + "example": "ADMIN" + }, + "uid": { + "type": "string", + "description": "The ID of this user.", + "example": "zTuNVUXEAvvnNN3IaqinkyMw" + }, + "username": { + "type": "string", + "description": "The unique username of this user.", + "example": "jane-doe" + }, + "name": { + "type": "string", + "description": "The name of this user.", + "example": "Jane Doe" + }, + "createdAt": { + "type": "number", + "description": "Timestamp in milliseconds when this member was added.", + "example": 1588720733602 + }, + "teamRole": { + "type": "string", + "enum": [ + "BILLING", + "CONTRIBUTOR", + "DEVELOPER", + "MEMBER", + "OWNER", + "SECURITY", + "VIEWER", + "VIEWER_FOR_PLUS" + ], + "description": "The role of this user in the team.", + "example": "CONTRIBUTOR" + } + }, + "required": [ + "computedProjectRole", + "createdAt", + "email", + "role", + "teamRole", + "uid", + "username" + ], + "type": "object" + }, + "type": "array" + }, + "pagination": { + "properties": { + "hasNext": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "count": { + "type": "number", + "description": "Amount of items in the current page.", + "example": 20 + }, + "next": { + "nullable": true, + "type": "number", + "description": "Timestamp that must be used to request the next page.", + "example": 1540095775951 + }, + "prev": { + "nullable": true, + "type": "number", + "description": "Timestamp that must be used to request the previous page.", + "example": 1540095775951 + } + }, + "required": [ + "count", + "hasNext", + "next", + "prev" + ], + "type": "object" + } + }, + "required": [ + "members", + "pagination" + ], + "type": "object", + "description": "Paginated list of members for the project." + } + ] + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "idOrName", + "description": "The ID or name of the Project.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "description": "The ID or name of the Project.", + "example": "prj_pavWOn1iLObbXLRiwVvzmPrTWyTf" + } + }, + { + "name": "limit", + "description": "Limit how many project members should be returned", + "in": "query", + "required": false, + "schema": { + "description": "Limit how many project members should be returned", + "example": 20, + "type": "integer", + "minimum": 1, + "maximum": 100 + } + }, + { + "name": "since", + "description": "Timestamp in milliseconds to only include members added since then.", + "in": "query", + "required": false, + "schema": { + "description": "Timestamp in milliseconds to only include members added since then.", + "example": 1540095775951, + "type": "integer" + } + }, + { + "name": "until", + "description": "Timestamp in milliseconds to only include members added until then.", + "in": "query", + "required": false, + "schema": { + "description": "Timestamp in milliseconds to only include members added until then.", + "example": 1540095775951, + "type": "integer" + } + }, + { + "name": "search", + "description": "Search project members by their name, username, and email.", + "in": "query", + "required": false, + "schema": { + "description": "Search project members by their name, username, and email.", + "type": "string" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "x-speakeasy-test": false + }, + "post": { + "description": "Adds a new member to the project.", + "operationId": "addProjectMember", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Adds a new member to a project.", + "tags": [ + "projectMembers" + ], + "responses": { + "200": { + "description": "Responds with the project ID on success.", + "content": { + "application/json": { + "schema": { + "properties": { + "id": { + "type": "string" + } + }, + "required": [ + "id" + ], + "type": "object", + "description": "Responds with the project ID on success." + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid.\nOne of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "410": { + "description": "" + }, + "500": { + "description": "" + } + }, + "parameters": [ + { + "name": "idOrName", + "description": "The ID or name of the Project.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "description": "The ID or name of the Project.", + "example": "prj_pavWOn1iLObbXLRiwVvzmPrTWyTf" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "additionalProperties": false, + "required": [ + "role" + ], + "oneOf": [ + { + "required": [ + "uid" + ] + }, + { + "required": [ + "username" + ] + }, + { + "required": [ + "email" + ] + } + ], + "properties": { + "uid": { + "type": "string", + "maxLength": 256, + "example": "ndlgr43fadlPyCtREAqxxdyFK", + "description": "The ID of the team member that should be added to this project." + }, + "username": { + "type": "string", + "maxLength": 256, + "example": "example", + "description": "The username of the team member that should be added to this project." + }, + "email": { + "type": "string", + "format": "email", + "example": "entity@example.com", + "description": "The email of the team member that should be added to this project." + }, + "role": { + "type": "string", + "example": "ADMIN", + "description": "The project role of the member that will be added.", + "enum": [ + "ADMIN", + "PROJECT_VIEWER", + "PROJECT_DEVELOPER" + ] + } + } + } + } + }, + "required": true + } + } + }, + "/v1/projects/{idOrName}/members/{uid}": { + "delete": { + "description": "Remove a member from a specific project", + "operationId": "removeProjectMember", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Remove a Project Member", + "tags": [ + "projectMembers" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "id": { + "type": "string" + } + }, + "required": [ + "id" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "idOrName", + "description": "The ID or name of the Project.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "description": "The ID or name of the Project.", + "example": "prj_pavWOn1iLObbXLRiwVvzmPrTWyTf" + } + }, + { + "name": "uid", + "description": "The user ID of the member.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "description": "The user ID of the member.", + "example": "ndlgr43fadlPyCtREAqxxdyFK" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + } + }, + "/v1/projects/{projectId}/routes": { + "get": { + "description": "Get the routing rules for a project. Supports searching by name/ID/pattern, filtering by route type, and diffing staged changes against production.", + "operationId": "getRoutes", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Get project routing rules", + "tags": [ + "project-routes" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "oneOf": [ + { + "type": "object" + }, + { + "properties": { + "routes": { + "items": { + "properties": { + "id": { + "type": "string", + "description": "Unique identifier for the routing rule." + }, + "name": { + "type": "string", + "description": "Human-readable name for the routing rule." + }, + "description": { + "type": "string", + "description": "Optional description of what the routing rule does." + }, + "enabled": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether the routing rule is enabled. Defaults to true." + }, + "staged": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether this route is new and not yet published to production. Set to true only when a route is first created via add-route. Cleared (set to false) when a version is promoted to production." + }, + "route": { + "properties": { + "src": { + "type": "string" + }, + "dest": { + "type": "string" + }, + "headers": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "methods": { + "items": { + "type": "string" + }, + "type": "array" + }, + "continue": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "override": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "caseSensitive": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "check": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "important": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "status": { + "type": "number" + }, + "has": { + "items": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "host" + ] + }, + "value": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "eq": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "neq": { + "type": "string" + }, + "inc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "ninc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "pre": { + "type": "string" + }, + "suf": { + "type": "string" + }, + "re": { + "type": "string" + }, + "gt": { + "type": "number" + }, + "gte": { + "type": "number" + }, + "lt": { + "type": "number" + }, + "lte": { + "type": "number" + } + }, + "type": "object" + } + ] + } + }, + "required": [ + "type", + "value" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "cookie", + "header", + "query" + ] + }, + "key": { + "type": "string" + }, + "value": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "eq": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "neq": { + "type": "string" + }, + "inc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "ninc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "pre": { + "type": "string" + }, + "suf": { + "type": "string" + }, + "re": { + "type": "string" + }, + "gt": { + "type": "number" + }, + "gte": { + "type": "number" + }, + "lt": { + "type": "number" + }, + "lte": { + "type": "number" + } + }, + "type": "object" + } + ] + } + }, + "required": [ + "key", + "type" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "missing": { + "items": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "host" + ] + }, + "value": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "eq": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "neq": { + "type": "string" + }, + "inc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "ninc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "pre": { + "type": "string" + }, + "suf": { + "type": "string" + }, + "re": { + "type": "string" + }, + "gt": { + "type": "number" + }, + "gte": { + "type": "number" + }, + "lt": { + "type": "number" + }, + "lte": { + "type": "number" + } + }, + "type": "object" + } + ] + } + }, + "required": [ + "type", + "value" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "cookie", + "header", + "query" + ] + }, + "key": { + "type": "string" + }, + "value": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "eq": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "neq": { + "type": "string" + }, + "inc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "ninc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "pre": { + "type": "string" + }, + "suf": { + "type": "string" + }, + "re": { + "type": "string" + }, + "gt": { + "type": "number" + }, + "gte": { + "type": "number" + }, + "lt": { + "type": "number" + }, + "lte": { + "type": "number" + } + }, + "type": "object" + } + ] + } + }, + "required": [ + "key", + "type" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "mitigate": { + "properties": { + "action": { + "type": "string", + "enum": [ + "challenge", + "deny" + ] + } + }, + "required": [ + "action" + ], + "type": "object" + }, + "transforms": { + "items": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "request.headers", + "request.query", + "response.headers" + ] + }, + "op": { + "type": "string", + "enum": [ + "append", + "delete", + "set" + ] + }, + "target": { + "properties": { + "key": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "eq": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "neq": { + "type": "string" + }, + "inc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "ninc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "pre": { + "type": "string" + }, + "suf": { + "type": "string" + }, + "gt": { + "type": "number" + }, + "gte": { + "type": "number" + }, + "lt": { + "type": "number" + }, + "lte": { + "type": "number" + } + }, + "type": "object" + } + ] + } + }, + "required": [ + "key" + ], + "type": "object" + }, + "args": { + "oneOf": [ + { + "type": "string" + }, + { + "items": { + "type": "string" + }, + "type": "array" + } + ] + }, + "env": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "op", + "target", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "request.path" + ] + }, + "op": { + "type": "string", + "enum": [ + "set" + ] + }, + "args": { + "type": "string" + }, + "env": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "args", + "op", + "type" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "env": { + "items": { + "type": "string" + }, + "type": "array" + }, + "locale": { + "properties": { + "redirect": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "cookie": { + "type": "string" + } + }, + "type": "object" + }, + "source": { + "type": "string", + "description": "Aliases for `src`, `dest`, and `status`. These provide consistency with the `rewrites`, `redirects`, and `headers` fields which use `source`, `destination`, and `statusCode`. During normalization, the string forms are converted to their canonical forms (`src`, `dest`, `status`) and stripped from the route object. `destination` may also be a service-targeted object, in which case routing is delegated into the named service's internal route table and the object is preserved as-is (not folded into `dest`)." + }, + "destination": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "service" + ], + "description": "Optional explicit format marker. The destination is identified by the presence of `service`, so `type` is no longer required." + }, + "service": { + "type": "string" + }, + "path": { + "type": "string", + "description": "Routing-only path used to select a route inside the target service." + } + }, + "required": [ + "service" + ], + "type": "object" + } + ] + }, + "statusCode": { + "type": "number" + }, + "middlewarePath": { + "type": "string", + "description": "A middleware key within the `output` key under the build result. Overrides a `middleware` definition." + }, + "middlewareRawSrc": { + "items": { + "type": "string" + }, + "type": "array", + "description": "The original middleware matchers." + }, + "middleware": { + "type": "number", + "description": "A middleware index in the `middleware` key under the build result" + }, + "respectOriginCacheControl": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "src" + ], + "type": "object", + "description": "The route definition from @vercel/routing-utils." + }, + "rawSrc": { + "type": "string", + "description": "Original source pattern provided by user (path-to-regexp or regex). Used to display the user's input in API responses." + }, + "rawDest": { + "type": "string", + "description": "Original destination provided by user." + }, + "srcSyntax": { + "type": "string", + "enum": [ + "equals", + "path-to-regexp", + "regex" + ], + "description": "The syntax type of the source pattern. Determines how the pattern is compiled to regex." + }, + "routeType": { + "type": "string", + "enum": [ + "redirect", + "rewrite", + "set_status", + "transform" + ], + "description": "Computed route type based on the route configuration. Only present in API responses, not stored in S3." + } + }, + "required": [ + "id", + "name", + "route" + ], + "type": "object", + "description": "A routing rule with metadata for project-level routing." + }, + "type": "array" + }, + "version": { + "properties": { + "id": { + "type": "string", + "description": "Unique identifier for the version." + }, + "s3Key": { + "type": "string", + "description": "The S3 key where the routing rules are stored." + }, + "lastModified": { + "type": "number", + "description": "Timestamp of when this version was last modified." + }, + "createdBy": { + "type": "string", + "description": "The user who created this version." + }, + "isStaging": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether this version is staged and not yet promoted to production." + }, + "isLive": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether this version is currently live in production." + }, + "ruleCount": { + "type": "number", + "description": "The number of routing rules in this version." + }, + "alias": { + "type": "string", + "description": "The staging alias for previewing this version." + } + }, + "required": [ + "createdBy", + "id", + "lastModified", + "s3Key" + ], + "type": "object", + "description": "A version of routing rules stored in S3." + }, + "diffCount": { + "type": "number" + } + }, + "required": [ + "diffCount", + "routes", + "version" + ], + "type": "object" + }, + { + "properties": { + "routes": { + "items": { + "properties": { + "id": { + "type": "string", + "description": "Unique identifier for the routing rule." + }, + "name": { + "type": "string", + "description": "Human-readable name for the routing rule." + }, + "description": { + "type": "string", + "description": "Optional description of what the routing rule does." + }, + "enabled": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether the routing rule is enabled. Defaults to true." + }, + "staged": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether this route is new and not yet published to production. Set to true only when a route is first created via add-route. Cleared (set to false) when a version is promoted to production." + }, + "route": { + "properties": { + "src": { + "type": "string" + }, + "dest": { + "type": "string" + }, + "headers": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "methods": { + "items": { + "type": "string" + }, + "type": "array" + }, + "continue": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "override": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "caseSensitive": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "check": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "important": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "status": { + "type": "number" + }, + "has": { + "items": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "host" + ] + }, + "value": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "eq": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "neq": { + "type": "string" + }, + "inc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "ninc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "pre": { + "type": "string" + }, + "suf": { + "type": "string" + }, + "re": { + "type": "string" + }, + "gt": { + "type": "number" + }, + "gte": { + "type": "number" + }, + "lt": { + "type": "number" + }, + "lte": { + "type": "number" + } + }, + "type": "object" + } + ] + } + }, + "required": [ + "type", + "value" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "cookie", + "header", + "query" + ] + }, + "key": { + "type": "string" + }, + "value": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "eq": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "neq": { + "type": "string" + }, + "inc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "ninc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "pre": { + "type": "string" + }, + "suf": { + "type": "string" + }, + "re": { + "type": "string" + }, + "gt": { + "type": "number" + }, + "gte": { + "type": "number" + }, + "lt": { + "type": "number" + }, + "lte": { + "type": "number" + } + }, + "type": "object" + } + ] + } + }, + "required": [ + "key", + "type" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "missing": { + "items": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "host" + ] + }, + "value": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "eq": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "neq": { + "type": "string" + }, + "inc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "ninc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "pre": { + "type": "string" + }, + "suf": { + "type": "string" + }, + "re": { + "type": "string" + }, + "gt": { + "type": "number" + }, + "gte": { + "type": "number" + }, + "lt": { + "type": "number" + }, + "lte": { + "type": "number" + } + }, + "type": "object" + } + ] + } + }, + "required": [ + "type", + "value" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "cookie", + "header", + "query" + ] + }, + "key": { + "type": "string" + }, + "value": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "eq": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "neq": { + "type": "string" + }, + "inc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "ninc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "pre": { + "type": "string" + }, + "suf": { + "type": "string" + }, + "re": { + "type": "string" + }, + "gt": { + "type": "number" + }, + "gte": { + "type": "number" + }, + "lt": { + "type": "number" + }, + "lte": { + "type": "number" + } + }, + "type": "object" + } + ] + } + }, + "required": [ + "key", + "type" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "mitigate": { + "properties": { + "action": { + "type": "string", + "enum": [ + "challenge", + "deny" + ] + } + }, + "required": [ + "action" + ], + "type": "object" + }, + "transforms": { + "items": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "request.headers", + "request.query", + "response.headers" + ] + }, + "op": { + "type": "string", + "enum": [ + "append", + "delete", + "set" + ] + }, + "target": { + "properties": { + "key": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "eq": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "neq": { + "type": "string" + }, + "inc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "ninc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "pre": { + "type": "string" + }, + "suf": { + "type": "string" + }, + "gt": { + "type": "number" + }, + "gte": { + "type": "number" + }, + "lt": { + "type": "number" + }, + "lte": { + "type": "number" + } + }, + "type": "object" + } + ] + } + }, + "required": [ + "key" + ], + "type": "object" + }, + "args": { + "oneOf": [ + { + "type": "string" + }, + { + "items": { + "type": "string" + }, + "type": "array" + } + ] + }, + "env": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "op", + "target", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "request.path" + ] + }, + "op": { + "type": "string", + "enum": [ + "set" + ] + }, + "args": { + "type": "string" + }, + "env": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "args", + "op", + "type" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "env": { + "items": { + "type": "string" + }, + "type": "array" + }, + "locale": { + "properties": { + "redirect": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "cookie": { + "type": "string" + } + }, + "type": "object" + }, + "source": { + "type": "string", + "description": "Aliases for `src`, `dest`, and `status`. These provide consistency with the `rewrites`, `redirects`, and `headers` fields which use `source`, `destination`, and `statusCode`. During normalization, the string forms are converted to their canonical forms (`src`, `dest`, `status`) and stripped from the route object. `destination` may also be a service-targeted object, in which case routing is delegated into the named service's internal route table and the object is preserved as-is (not folded into `dest`)." + }, + "destination": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "service" + ], + "description": "Optional explicit format marker. The destination is identified by the presence of `service`, so `type` is no longer required." + }, + "service": { + "type": "string" + }, + "path": { + "type": "string", + "description": "Routing-only path used to select a route inside the target service." + } + }, + "required": [ + "service" + ], + "type": "object" + } + ] + }, + "statusCode": { + "type": "number" + }, + "middlewarePath": { + "type": "string", + "description": "A middleware key within the `output` key under the build result. Overrides a `middleware` definition." + }, + "middlewareRawSrc": { + "items": { + "type": "string" + }, + "type": "array", + "description": "The original middleware matchers." + }, + "middleware": { + "type": "number", + "description": "A middleware index in the `middleware` key under the build result" + }, + "respectOriginCacheControl": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "src" + ], + "type": "object", + "description": "The route definition from @vercel/routing-utils." + }, + "rawSrc": { + "type": "string", + "description": "Original source pattern provided by user (path-to-regexp or regex). Used to display the user's input in API responses." + }, + "rawDest": { + "type": "string", + "description": "Original destination provided by user." + }, + "srcSyntax": { + "type": "string", + "enum": [ + "equals", + "path-to-regexp", + "regex" + ], + "description": "The syntax type of the source pattern. Determines how the pattern is compiled to regex." + }, + "routeType": { + "type": "string", + "enum": [ + "redirect", + "rewrite", + "set_status", + "transform" + ], + "description": "Computed route type based on the route configuration. Only present in API responses, not stored in S3." + } + }, + "required": [ + "id", + "name", + "route" + ], + "type": "object", + "description": "A routing rule with metadata for project-level routing." + }, + "type": "array" + }, + "version": { + "properties": { + "id": { + "type": "string", + "description": "Unique identifier for the version." + }, + "s3Key": { + "type": "string", + "description": "The S3 key where the routing rules are stored." + }, + "lastModified": { + "type": "number", + "description": "Timestamp of when this version was last modified." + }, + "createdBy": { + "type": "string", + "description": "The user who created this version." + }, + "isStaging": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether this version is staged and not yet promoted to production." + }, + "isLive": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether this version is currently live in production." + }, + "ruleCount": { + "type": "number", + "description": "The number of routing rules in this version." + }, + "alias": { + "type": "string", + "description": "The staging alias for previewing this version." + } + }, + "required": [ + "createdBy", + "id", + "lastModified", + "s3Key" + ], + "type": "object", + "description": "A version of routing rules stored in S3." + } + }, + "required": [ + "routes", + "version" + ], + "type": "object" + }, + { + "properties": { + "routes": { + "items": { + "properties": { + "id": { + "type": "string", + "description": "Unique identifier for the routing rule." + }, + "name": { + "type": "string", + "description": "Human-readable name for the routing rule." + }, + "description": { + "type": "string", + "description": "Optional description of what the routing rule does." + }, + "enabled": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether the routing rule is enabled. Defaults to true." + }, + "staged": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether this route is new and not yet published to production. Set to true only when a route is first created via add-route. Cleared (set to false) when a version is promoted to production." + }, + "route": { + "properties": { + "src": { + "type": "string" + }, + "dest": { + "type": "string" + }, + "headers": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "methods": { + "items": { + "type": "string" + }, + "type": "array" + }, + "continue": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "override": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "caseSensitive": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "check": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "important": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "status": { + "type": "number" + }, + "has": { + "items": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "host" + ] + }, + "value": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "eq": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "neq": { + "type": "string" + }, + "inc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "ninc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "pre": { + "type": "string" + }, + "suf": { + "type": "string" + }, + "re": { + "type": "string" + }, + "gt": { + "type": "number" + }, + "gte": { + "type": "number" + }, + "lt": { + "type": "number" + }, + "lte": { + "type": "number" + } + }, + "type": "object" + } + ] + } + }, + "required": [ + "type", + "value" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "cookie", + "header", + "query" + ] + }, + "key": { + "type": "string" + }, + "value": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "eq": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "neq": { + "type": "string" + }, + "inc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "ninc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "pre": { + "type": "string" + }, + "suf": { + "type": "string" + }, + "re": { + "type": "string" + }, + "gt": { + "type": "number" + }, + "gte": { + "type": "number" + }, + "lt": { + "type": "number" + }, + "lte": { + "type": "number" + } + }, + "type": "object" + } + ] + } + }, + "required": [ + "key", + "type" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "missing": { + "items": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "host" + ] + }, + "value": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "eq": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "neq": { + "type": "string" + }, + "inc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "ninc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "pre": { + "type": "string" + }, + "suf": { + "type": "string" + }, + "re": { + "type": "string" + }, + "gt": { + "type": "number" + }, + "gte": { + "type": "number" + }, + "lt": { + "type": "number" + }, + "lte": { + "type": "number" + } + }, + "type": "object" + } + ] + } + }, + "required": [ + "type", + "value" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "cookie", + "header", + "query" + ] + }, + "key": { + "type": "string" + }, + "value": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "eq": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "neq": { + "type": "string" + }, + "inc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "ninc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "pre": { + "type": "string" + }, + "suf": { + "type": "string" + }, + "re": { + "type": "string" + }, + "gt": { + "type": "number" + }, + "gte": { + "type": "number" + }, + "lt": { + "type": "number" + }, + "lte": { + "type": "number" + } + }, + "type": "object" + } + ] + } + }, + "required": [ + "key", + "type" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "mitigate": { + "properties": { + "action": { + "type": "string", + "enum": [ + "challenge", + "deny" + ] + } + }, + "required": [ + "action" + ], + "type": "object" + }, + "transforms": { + "items": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "request.headers", + "request.query", + "response.headers" + ] + }, + "op": { + "type": "string", + "enum": [ + "append", + "delete", + "set" + ] + }, + "target": { + "properties": { + "key": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "eq": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "neq": { + "type": "string" + }, + "inc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "ninc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "pre": { + "type": "string" + }, + "suf": { + "type": "string" + }, + "gt": { + "type": "number" + }, + "gte": { + "type": "number" + }, + "lt": { + "type": "number" + }, + "lte": { + "type": "number" + } + }, + "type": "object" + } + ] + } + }, + "required": [ + "key" + ], + "type": "object" + }, + "args": { + "oneOf": [ + { + "type": "string" + }, + { + "items": { + "type": "string" + }, + "type": "array" + } + ] + }, + "env": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "op", + "target", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "request.path" + ] + }, + "op": { + "type": "string", + "enum": [ + "set" + ] + }, + "args": { + "type": "string" + }, + "env": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "args", + "op", + "type" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "env": { + "items": { + "type": "string" + }, + "type": "array" + }, + "locale": { + "properties": { + "redirect": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "cookie": { + "type": "string" + } + }, + "type": "object" + }, + "source": { + "type": "string", + "description": "Aliases for `src`, `dest`, and `status`. These provide consistency with the `rewrites`, `redirects`, and `headers` fields which use `source`, `destination`, and `statusCode`. During normalization, the string forms are converted to their canonical forms (`src`, `dest`, `status`) and stripped from the route object. `destination` may also be a service-targeted object, in which case routing is delegated into the named service's internal route table and the object is preserved as-is (not folded into `dest`)." + }, + "destination": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "service" + ], + "description": "Optional explicit format marker. The destination is identified by the presence of `service`, so `type` is no longer required." + }, + "service": { + "type": "string" + }, + "path": { + "type": "string", + "description": "Routing-only path used to select a route inside the target service." + } + }, + "required": [ + "service" + ], + "type": "object" + } + ] + }, + "statusCode": { + "type": "number" + }, + "middlewarePath": { + "type": "string", + "description": "A middleware key within the `output` key under the build result. Overrides a `middleware` definition." + }, + "middlewareRawSrc": { + "items": { + "type": "string" + }, + "type": "array", + "description": "The original middleware matchers." + }, + "middleware": { + "type": "number", + "description": "A middleware index in the `middleware` key under the build result" + }, + "respectOriginCacheControl": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "src" + ], + "type": "object", + "description": "The route definition from @vercel/routing-utils." + }, + "rawSrc": { + "type": "string", + "description": "Original source pattern provided by user (path-to-regexp or regex). Used to display the user's input in API responses." + }, + "rawDest": { + "type": "string", + "description": "Original destination provided by user." + }, + "srcSyntax": { + "type": "string", + "enum": [ + "equals", + "path-to-regexp", + "regex" + ], + "description": "The syntax type of the source pattern. Determines how the pattern is compiled to regex." + }, + "routeType": { + "type": "string", + "enum": [ + "redirect", + "rewrite", + "set_status", + "transform" + ], + "description": "Computed route type based on the route configuration. Only present in API responses, not stored in S3." + } + }, + "required": [ + "id", + "name", + "route" + ], + "type": "object", + "description": "A routing rule with metadata for project-level routing." + }, + "type": "array" + }, + "version": { + "properties": { + "id": { + "type": "string", + "description": "Unique identifier for the version." + }, + "s3Key": { + "type": "string", + "description": "The S3 key where the routing rules are stored." + }, + "lastModified": { + "type": "number", + "description": "Timestamp of when this version was last modified." + }, + "createdBy": { + "type": "string", + "description": "The user who created this version." + }, + "isStaging": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether this version is staged and not yet promoted to production." + }, + "isLive": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether this version is currently live in production." + }, + "ruleCount": { + "type": "number", + "description": "The number of routing rules in this version." + }, + "alias": { + "type": "string", + "description": "The staging alias for previewing this version." + } + }, + "required": [ + "createdBy", + "id", + "lastModified", + "s3Key" + ], + "type": "object", + "description": "A version of routing rules stored in S3." + }, + "limit": { + "properties": { + "maxRoutes": { + "type": "number" + }, + "currentRoutes": { + "type": "number" + } + }, + "required": [ + "currentRoutes", + "maxRoutes" + ], + "type": "object" + } + }, + "required": [ + "limit", + "routes", + "version" + ], + "type": "object" + } + ] + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "projectId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "versionId", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "q", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "filter", + "in": "query", + "required": false, + "schema": { + "type": "string", + "enum": [ + "rewrite", + "redirect", + "set_status", + "transform" + ] + } + }, + { + "name": "diff", + "in": "query", + "required": false, + "schema": { + "oneOf": [ + { + "type": "boolean" + }, + { + "type": "string", + "enum": [ + "only" + ] + } + ] + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + }, + "put": { + "description": "Stage routing rules for a project. Set `overwrite` to true to replace all existing rules, or omit it to merge with existing rules by ID. Returns the new staged version.", + "operationId": "stageRoutes", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Stage routing rules", + "tags": [ + "project-routes" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "version": { + "properties": { + "id": { + "type": "string", + "description": "Unique identifier for the version." + }, + "s3Key": { + "type": "string", + "description": "The S3 key where the routing rules are stored." + }, + "lastModified": { + "type": "number", + "description": "Timestamp of when this version was last modified." + }, + "createdBy": { + "type": "string", + "description": "The user who created this version." + }, + "isStaging": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether this version is staged and not yet promoted to production." + }, + "isLive": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether this version is currently live in production." + }, + "ruleCount": { + "type": "number", + "description": "The number of routing rules in this version." + }, + "alias": { + "type": "string", + "description": "The staging alias for previewing this version." + } + }, + "required": [ + "createdBy", + "id", + "lastModified", + "s3Key" + ], + "type": "object", + "description": "A version of routing rules stored in S3." + } + }, + "required": [ + "version" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid.\nOne of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "409": { + "description": "" + }, + "410": { + "description": "" + }, + "500": { + "description": "" + } + }, + "parameters": [ + { + "name": "projectId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "overwrite": { + "type": "boolean" + }, + "routes": { + "type": "array", + "default": [], + "items": { + "type": "object", + "required": [ + "id", + "name", + "route" + ], + "properties": { + "id": { + "type": "string", + "maxLength": 256 + }, + "name": { + "type": "string", + "maxLength": 256 + }, + "description": { + "type": "string", + "maxLength": 1024 + }, + "enabled": { + "type": "boolean" + }, + "route": { + "type": "object", + "required": [ + "src" + ], + "properties": { + "src": { + "type": "string" + }, + "dest": { + "type": "string" + }, + "headers": { + "type": "object" + }, + "caseSensitive": { + "type": "boolean" + }, + "status": { + "type": "integer" + }, + "has": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "host", + "header", + "cookie", + "query" + ] + }, + "key": { + "type": "string" + }, + "value": { + "type": "string" + } + } + } + }, + "missing": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "host", + "header", + "cookie", + "query" + ] + }, + "key": { + "type": "string" + }, + "value": { + "type": "string" + } + } + } + }, + "transforms": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "request.headers", + "request.query", + "response.headers" + ] + }, + "op": { + "type": "string", + "enum": [ + "append", + "set", + "delete" + ] + }, + "target": { + "type": "object" + }, + "args": {}, + "env": { + "type": "array", + "items": { + "type": "string" + } + } + } + } + }, + "respectOriginCacheControl": { + "type": "boolean" + } + } + } + } + } + } + } + } + } + } + } + }, + "post": { + "description": "Add a single routing rule to a project at a specified position. Defaults to the end of the list if no position is provided. The route is enabled by default. Stages a new version with the added route.", + "operationId": "addRoute", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Add a routing rule", + "tags": [ + "project-routes" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "route": { + "properties": { + "routeType": { + "type": "string", + "enum": [ + "redirect", + "rewrite", + "set_status", + "transform" + ] + }, + "id": { + "type": "string", + "description": "Unique identifier for the routing rule." + }, + "name": { + "type": "string", + "description": "Human-readable name for the routing rule." + }, + "description": { + "type": "string", + "description": "Optional description of what the routing rule does." + }, + "enabled": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether the routing rule is enabled. Defaults to true." + }, + "staged": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether this route is new and not yet published to production. Set to true only when a route is first created via add-route. Cleared (set to false) when a version is promoted to production." + }, + "route": { + "properties": { + "src": { + "type": "string" + }, + "dest": { + "type": "string" + }, + "headers": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "methods": { + "items": { + "type": "string" + }, + "type": "array" + }, + "continue": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "override": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "caseSensitive": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "check": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "important": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "status": { + "type": "number" + }, + "has": { + "items": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "host" + ] + }, + "value": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "eq": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "neq": { + "type": "string" + }, + "inc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "ninc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "pre": { + "type": "string" + }, + "suf": { + "type": "string" + }, + "re": { + "type": "string" + }, + "gt": { + "type": "number" + }, + "gte": { + "type": "number" + }, + "lt": { + "type": "number" + }, + "lte": { + "type": "number" + } + }, + "type": "object" + } + ] + } + }, + "required": [ + "type", + "value" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "cookie", + "header", + "query" + ] + }, + "key": { + "type": "string" + }, + "value": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "eq": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "neq": { + "type": "string" + }, + "inc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "ninc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "pre": { + "type": "string" + }, + "suf": { + "type": "string" + }, + "re": { + "type": "string" + }, + "gt": { + "type": "number" + }, + "gte": { + "type": "number" + }, + "lt": { + "type": "number" + }, + "lte": { + "type": "number" + } + }, + "type": "object" + } + ] + } + }, + "required": [ + "key", + "type" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "missing": { + "items": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "host" + ] + }, + "value": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "eq": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "neq": { + "type": "string" + }, + "inc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "ninc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "pre": { + "type": "string" + }, + "suf": { + "type": "string" + }, + "re": { + "type": "string" + }, + "gt": { + "type": "number" + }, + "gte": { + "type": "number" + }, + "lt": { + "type": "number" + }, + "lte": { + "type": "number" + } + }, + "type": "object" + } + ] + } + }, + "required": [ + "type", + "value" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "cookie", + "header", + "query" + ] + }, + "key": { + "type": "string" + }, + "value": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "eq": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "neq": { + "type": "string" + }, + "inc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "ninc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "pre": { + "type": "string" + }, + "suf": { + "type": "string" + }, + "re": { + "type": "string" + }, + "gt": { + "type": "number" + }, + "gte": { + "type": "number" + }, + "lt": { + "type": "number" + }, + "lte": { + "type": "number" + } + }, + "type": "object" + } + ] + } + }, + "required": [ + "key", + "type" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "mitigate": { + "properties": { + "action": { + "type": "string", + "enum": [ + "challenge", + "deny" + ] + } + }, + "required": [ + "action" + ], + "type": "object" + }, + "transforms": { + "items": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "request.headers", + "request.query", + "response.headers" + ] + }, + "op": { + "type": "string", + "enum": [ + "append", + "delete", + "set" + ] + }, + "target": { + "properties": { + "key": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "eq": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "neq": { + "type": "string" + }, + "inc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "ninc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "pre": { + "type": "string" + }, + "suf": { + "type": "string" + }, + "gt": { + "type": "number" + }, + "gte": { + "type": "number" + }, + "lt": { + "type": "number" + }, + "lte": { + "type": "number" + } + }, + "type": "object" + } + ] + } + }, + "required": [ + "key" + ], + "type": "object" + }, + "args": { + "oneOf": [ + { + "type": "string" + }, + { + "items": { + "type": "string" + }, + "type": "array" + } + ] + }, + "env": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "op", + "target", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "request.path" + ] + }, + "op": { + "type": "string", + "enum": [ + "set" + ] + }, + "args": { + "type": "string" + }, + "env": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "args", + "op", + "type" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "env": { + "items": { + "type": "string" + }, + "type": "array" + }, + "locale": { + "properties": { + "redirect": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "cookie": { + "type": "string" + } + }, + "type": "object" + }, + "source": { + "type": "string", + "description": "Aliases for `src`, `dest`, and `status`. These provide consistency with the `rewrites`, `redirects`, and `headers` fields which use `source`, `destination`, and `statusCode`. During normalization, the string forms are converted to their canonical forms (`src`, `dest`, `status`) and stripped from the route object. `destination` may also be a service-targeted object, in which case routing is delegated into the named service's internal route table and the object is preserved as-is (not folded into `dest`)." + }, + "destination": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "service" + ], + "description": "Optional explicit format marker. The destination is identified by the presence of `service`, so `type` is no longer required." + }, + "service": { + "type": "string" + }, + "path": { + "type": "string", + "description": "Routing-only path used to select a route inside the target service." + } + }, + "required": [ + "service" + ], + "type": "object" + } + ] + }, + "statusCode": { + "type": "number" + }, + "middlewarePath": { + "type": "string", + "description": "A middleware key within the `output` key under the build result. Overrides a `middleware` definition." + }, + "middlewareRawSrc": { + "items": { + "type": "string" + }, + "type": "array", + "description": "The original middleware matchers." + }, + "middleware": { + "type": "number", + "description": "A middleware index in the `middleware` key under the build result" + }, + "respectOriginCacheControl": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "src" + ], + "type": "object", + "description": "The route definition from @vercel/routing-utils." + }, + "rawSrc": { + "type": "string", + "description": "Original source pattern provided by user (path-to-regexp or regex). Used to display the user's input in API responses." + }, + "rawDest": { + "type": "string", + "description": "Original destination provided by user." + }, + "srcSyntax": { + "type": "string", + "enum": [ + "equals", + "path-to-regexp", + "regex" + ], + "description": "The syntax type of the source pattern. Determines how the pattern is compiled to regex." + } + }, + "required": [ + "id", + "name", + "route" + ], + "type": "object" + }, + "version": { + "properties": { + "id": { + "type": "string", + "description": "Unique identifier for the version." + }, + "s3Key": { + "type": "string", + "description": "The S3 key where the routing rules are stored." + }, + "lastModified": { + "type": "number", + "description": "Timestamp of when this version was last modified." + }, + "createdBy": { + "type": "string", + "description": "The user who created this version." + }, + "isStaging": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether this version is staged and not yet promoted to production." + }, + "isLive": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether this version is currently live in production." + }, + "ruleCount": { + "type": "number", + "description": "The number of routing rules in this version." + }, + "alias": { + "type": "string", + "description": "The staging alias for previewing this version." + } + }, + "required": [ + "createdBy", + "id", + "lastModified", + "s3Key" + ], + "type": "object", + "description": "A version of routing rules stored in S3." + } + }, + "required": [ + "route", + "version" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid.\nOne of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "409": { + "description": "" + }, + "410": { + "description": "" + }, + "500": { + "description": "" + } + }, + "parameters": [ + { + "name": "projectId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "route" + ], + "properties": { + "route": { + "type": "object", + "required": [ + "name", + "route" + ], + "properties": { + "name": { + "type": "string", + "maxLength": 256 + }, + "description": { + "type": "string", + "maxLength": 1024 + }, + "enabled": { + "type": "boolean" + }, + "srcSyntax": { + "type": "string", + "enum": [ + "equals", + "path-to-regexp", + "regex" + ], + "description": "Pattern syntax type. If not provided, inferred from pattern." + }, + "route": { + "type": "object", + "required": [ + "src" + ], + "properties": { + "src": { + "type": "string" + }, + "dest": { + "type": "string" + }, + "headers": { + "type": "object" + }, + "caseSensitive": { + "type": "boolean" + }, + "status": { + "type": "integer" + }, + "has": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "host", + "header", + "cookie", + "query" + ] + }, + "key": { + "type": "string" + }, + "value": { + "type": "string" + } + } + } + }, + "missing": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "host", + "header", + "cookie", + "query" + ] + }, + "key": { + "type": "string" + }, + "value": { + "type": "string" + } + } + } + }, + "transforms": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "request.headers", + "request.query", + "response.headers" + ] + }, + "op": { + "type": "string", + "enum": [ + "append", + "set", + "delete" + ] + }, + "target": { + "type": "object" + }, + "args": {}, + "env": { + "type": "array", + "items": { + "type": "string" + } + } + } + } + }, + "respectOriginCacheControl": { + "type": "boolean" + } + } + } + } + }, + "position": { + "type": "object", + "description": "Controls where the route is inserted. Defaults to \"end\" if omitted.", + "properties": { + "placement": { + "type": "string", + "enum": [ + "start", + "end", + "after", + "before" + ], + "description": "\"after\"/\"before\" require referenceId." + }, + "referenceId": { + "type": "string", + "description": "Route ID to insert after/before. Required for \"after\"/\"before\"." + } + } + } + } + } + } + } + } + }, + "delete": { + "description": "Delete one or more routing rules from a project by ID. Stages a new version with the routes removed.", + "operationId": "deleteRoutes", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Delete routing rules", + "tags": [ + "project-routes" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "deletedCount": { + "type": "number" + }, + "version": { + "properties": { + "id": { + "type": "string", + "description": "Unique identifier for the version." + }, + "s3Key": { + "type": "string", + "description": "The S3 key where the routing rules are stored." + }, + "lastModified": { + "type": "number", + "description": "Timestamp of when this version was last modified." + }, + "createdBy": { + "type": "string", + "description": "The user who created this version." + }, + "isStaging": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether this version is staged and not yet promoted to production." + }, + "isLive": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether this version is currently live in production." + }, + "ruleCount": { + "type": "number", + "description": "The number of routing rules in this version." + }, + "alias": { + "type": "string", + "description": "The staging alias for previewing this version." + } + }, + "required": [ + "createdBy", + "id", + "lastModified", + "s3Key" + ], + "type": "object", + "description": "A version of routing rules stored in S3." + } + }, + "required": [ + "deletedCount", + "version" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid.\nOne of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "409": { + "description": "" + }, + "410": { + "description": "" + }, + "500": { + "description": "" + } + }, + "parameters": [ + { + "name": "projectId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "routeIds" + ], + "properties": { + "routeIds": { + "type": "array", + "description": "The IDs of the routes to delete", + "minItems": 1, + "items": { + "type": "string" + } + } + } + } + } + } + } + } + }, + "/v1/projects/{projectId}/routes/{routeId}": { + "patch": { + "description": "Replace a routing rule identified by its ID, or restore it from the current production version. Stages a new version with the modified route.", + "operationId": "editRoute", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Edit a routing rule", + "tags": [ + "project-routes" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "route": { + "properties": { + "routeType": { + "type": "string", + "enum": [ + "redirect", + "rewrite", + "set_status", + "transform" + ] + }, + "id": { + "type": "string", + "description": "Unique identifier for the routing rule." + }, + "name": { + "type": "string", + "description": "Human-readable name for the routing rule." + }, + "description": { + "type": "string", + "description": "Optional description of what the routing rule does." + }, + "enabled": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether the routing rule is enabled. Defaults to true." + }, + "staged": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether this route is new and not yet published to production. Set to true only when a route is first created via add-route. Cleared (set to false) when a version is promoted to production." + }, + "route": { + "properties": { + "src": { + "type": "string" + }, + "dest": { + "type": "string" + }, + "headers": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "methods": { + "items": { + "type": "string" + }, + "type": "array" + }, + "continue": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "override": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "caseSensitive": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "check": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "important": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "status": { + "type": "number" + }, + "has": { + "items": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "host" + ] + }, + "value": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "eq": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "neq": { + "type": "string" + }, + "inc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "ninc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "pre": { + "type": "string" + }, + "suf": { + "type": "string" + }, + "re": { + "type": "string" + }, + "gt": { + "type": "number" + }, + "gte": { + "type": "number" + }, + "lt": { + "type": "number" + }, + "lte": { + "type": "number" + } + }, + "type": "object" + } + ] + } + }, + "required": [ + "type", + "value" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "cookie", + "header", + "query" + ] + }, + "key": { + "type": "string" + }, + "value": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "eq": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "neq": { + "type": "string" + }, + "inc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "ninc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "pre": { + "type": "string" + }, + "suf": { + "type": "string" + }, + "re": { + "type": "string" + }, + "gt": { + "type": "number" + }, + "gte": { + "type": "number" + }, + "lt": { + "type": "number" + }, + "lte": { + "type": "number" + } + }, + "type": "object" + } + ] + } + }, + "required": [ + "key", + "type" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "missing": { + "items": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "host" + ] + }, + "value": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "eq": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "neq": { + "type": "string" + }, + "inc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "ninc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "pre": { + "type": "string" + }, + "suf": { + "type": "string" + }, + "re": { + "type": "string" + }, + "gt": { + "type": "number" + }, + "gte": { + "type": "number" + }, + "lt": { + "type": "number" + }, + "lte": { + "type": "number" + } + }, + "type": "object" + } + ] + } + }, + "required": [ + "type", + "value" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "cookie", + "header", + "query" + ] + }, + "key": { + "type": "string" + }, + "value": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "eq": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "neq": { + "type": "string" + }, + "inc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "ninc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "pre": { + "type": "string" + }, + "suf": { + "type": "string" + }, + "re": { + "type": "string" + }, + "gt": { + "type": "number" + }, + "gte": { + "type": "number" + }, + "lt": { + "type": "number" + }, + "lte": { + "type": "number" + } + }, + "type": "object" + } + ] + } + }, + "required": [ + "key", + "type" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "mitigate": { + "properties": { + "action": { + "type": "string", + "enum": [ + "challenge", + "deny" + ] + } + }, + "required": [ + "action" + ], + "type": "object" + }, + "transforms": { + "items": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "request.headers", + "request.query", + "response.headers" + ] + }, + "op": { + "type": "string", + "enum": [ + "append", + "delete", + "set" + ] + }, + "target": { + "properties": { + "key": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "eq": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "neq": { + "type": "string" + }, + "inc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "ninc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "pre": { + "type": "string" + }, + "suf": { + "type": "string" + }, + "gt": { + "type": "number" + }, + "gte": { + "type": "number" + }, + "lt": { + "type": "number" + }, + "lte": { + "type": "number" + } + }, + "type": "object" + } + ] + } + }, + "required": [ + "key" + ], + "type": "object" + }, + "args": { + "oneOf": [ + { + "type": "string" + }, + { + "items": { + "type": "string" + }, + "type": "array" + } + ] + }, + "env": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "op", + "target", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "request.path" + ] + }, + "op": { + "type": "string", + "enum": [ + "set" + ] + }, + "args": { + "type": "string" + }, + "env": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "args", + "op", + "type" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "env": { + "items": { + "type": "string" + }, + "type": "array" + }, + "locale": { + "properties": { + "redirect": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "cookie": { + "type": "string" + } + }, + "type": "object" + }, + "source": { + "type": "string", + "description": "Aliases for `src`, `dest`, and `status`. These provide consistency with the `rewrites`, `redirects`, and `headers` fields which use `source`, `destination`, and `statusCode`. During normalization, the string forms are converted to their canonical forms (`src`, `dest`, `status`) and stripped from the route object. `destination` may also be a service-targeted object, in which case routing is delegated into the named service's internal route table and the object is preserved as-is (not folded into `dest`)." + }, + "destination": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "service" + ], + "description": "Optional explicit format marker. The destination is identified by the presence of `service`, so `type` is no longer required." + }, + "service": { + "type": "string" + }, + "path": { + "type": "string", + "description": "Routing-only path used to select a route inside the target service." + } + }, + "required": [ + "service" + ], + "type": "object" + } + ] + }, + "statusCode": { + "type": "number" + }, + "middlewarePath": { + "type": "string", + "description": "A middleware key within the `output` key under the build result. Overrides a `middleware` definition." + }, + "middlewareRawSrc": { + "items": { + "type": "string" + }, + "type": "array", + "description": "The original middleware matchers." + }, + "middleware": { + "type": "number", + "description": "A middleware index in the `middleware` key under the build result" + }, + "respectOriginCacheControl": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "src" + ], + "type": "object", + "description": "The route definition from @vercel/routing-utils." + }, + "rawSrc": { + "type": "string", + "description": "Original source pattern provided by user (path-to-regexp or regex). Used to display the user's input in API responses." + }, + "rawDest": { + "type": "string", + "description": "Original destination provided by user." + }, + "srcSyntax": { + "type": "string", + "enum": [ + "equals", + "path-to-regexp", + "regex" + ], + "description": "The syntax type of the source pattern. Determines how the pattern is compiled to regex." + } + }, + "required": [ + "id", + "name", + "route" + ], + "type": "object" + }, + "version": { + "properties": { + "id": { + "type": "string", + "description": "Unique identifier for the version." + }, + "s3Key": { + "type": "string", + "description": "The S3 key where the routing rules are stored." + }, + "lastModified": { + "type": "number", + "description": "Timestamp of when this version was last modified." + }, + "createdBy": { + "type": "string", + "description": "The user who created this version." + }, + "isStaging": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether this version is staged and not yet promoted to production." + }, + "isLive": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether this version is currently live in production." + }, + "ruleCount": { + "type": "number", + "description": "The number of routing rules in this version." + }, + "alias": { + "type": "string", + "description": "The staging alias for previewing this version." + } + }, + "required": [ + "createdBy", + "id", + "lastModified", + "s3Key" + ], + "type": "object", + "description": "A version of routing rules stored in S3." + } + }, + "required": [ + "version" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid.\nOne of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "409": { + "description": "" + }, + "410": { + "description": "" + }, + "500": { + "description": "" + } + }, + "parameters": [ + { + "name": "projectId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "routeId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "route": { + "type": "object", + "description": "The full route object to replace the existing route with", + "required": [ + "name", + "route" + ], + "properties": { + "name": { + "type": "string", + "maxLength": 256 + }, + "description": { + "type": "string", + "maxLength": 1024 + }, + "enabled": { + "type": "boolean" + }, + "srcSyntax": { + "type": "string", + "enum": [ + "equals", + "path-to-regexp", + "regex" + ], + "description": "Pattern syntax type. If not provided, inferred from pattern." + }, + "route": { + "type": "object", + "required": [ + "src" + ], + "properties": { + "src": { + "type": "string" + }, + "dest": { + "type": "string" + }, + "headers": { + "type": "object" + }, + "caseSensitive": { + "type": "boolean" + }, + "status": { + "type": "integer" + }, + "has": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "host", + "header", + "cookie", + "query" + ] + }, + "key": { + "type": "string" + }, + "value": { + "type": "string" + } + } + } + }, + "missing": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "host", + "header", + "cookie", + "query" + ] + }, + "key": { + "type": "string" + }, + "value": { + "type": "string" + } + } + } + }, + "transforms": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "request.headers", + "request.query", + "response.headers" + ] + }, + "op": { + "type": "string", + "enum": [ + "append", + "set", + "delete" + ] + }, + "target": { + "type": "object" + }, + "args": {}, + "env": { + "type": "array", + "items": { + "type": "string" + } + } + } + } + }, + "respectOriginCacheControl": { + "type": "boolean" + } + } + } + } + }, + "restore": { + "type": "boolean", + "description": "If true, restores the staged route to the value in the production version." + } + } + } + } + } + } + } + }, + "/v1/projects/{projectId}/routes/generate": { + "post": { + "description": "Generate a routing rule configuration from a natural language description. Returns a suggested route configuration that can be reviewed and saved.", + "operationId": "generateRoute", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Generate a routing rule from natural language", + "tags": [ + "project-routes" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "route": { + "properties": { + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "pathCondition": { + "properties": { + "value": { + "type": "string" + }, + "syntax": { + "type": "string", + "enum": [ + "equals", + "path-to-regexp", + "regex" + ] + } + }, + "required": [ + "syntax", + "value" + ], + "type": "object" + }, + "conditions": { + "items": { + "properties": { + "field": { + "type": "string", + "enum": [ + "cookie", + "header", + "host", + "query" + ] + }, + "operator": { + "type": "string", + "enum": [ + "contains", + "eq", + "exists", + "re" + ] + }, + "key": { + "type": "string" + }, + "value": { + "type": "string" + }, + "missing": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "field", + "missing", + "operator" + ], + "type": "object" + }, + "type": "array" + }, + "actions": { + "items": { + "properties": { + "type": { + "type": "string", + "enum": [ + "modify", + "redirect", + "rewrite", + "set-status" + ] + }, + "subType": { + "type": "string", + "enum": [ + "response-headers", + "transform-request-header", + "transform-request-query" + ] + }, + "dest": { + "type": "string" + }, + "status": { + "type": "number" + }, + "headers": { + "items": { + "properties": { + "key": { + "type": "string" + }, + "value": { + "type": "string" + }, + "op": { + "type": "string", + "enum": [ + "append", + "delete", + "set" + ] + } + }, + "required": [ + "key", + "op" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "type" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "actions", + "description", + "name", + "pathCondition" + ], + "type": "object" + }, + "error": { + "type": "string" + } + }, + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid.\nOne of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "408": { + "description": "" + }, + "410": { + "description": "" + }, + "500": { + "description": "" + } + }, + "parameters": [ + { + "name": "projectId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "prompt" + ], + "properties": { + "prompt": { + "type": "string", + "maxLength": 2000 + }, + "currentRoute": { + "type": "object", + "required": [ + "pathCondition", + "actions" + ], + "properties": { + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "pathCondition": { + "type": "object", + "properties": { + "value": { + "type": "string" + }, + "syntax": { + "type": "string" + } + } + }, + "conditions": { + "type": "array", + "items": { + "type": "object", + "properties": { + "field": { + "type": "string" + }, + "operator": { + "type": "string" + }, + "key": { + "type": "string" + }, + "value": { + "type": "string" + }, + "missing": { + "type": "boolean" + } + } + } + }, + "actions": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type": { + "type": "string" + }, + "subType": { + "type": "string" + }, + "dest": { + "type": "string" + }, + "status": { + "type": "integer" + }, + "headers": { + "type": "array", + "items": { + "type": "object", + "properties": { + "key": { + "type": "string" + }, + "value": { + "type": "string" + }, + "op": { + "type": "string" + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + }, + "/v1/projects/{projectId}/routes/versions": { + "get": { + "description": "Get the version history for a project's routing rules. Returns the staging version (if one exists) followed by production versions, most recent first. The staging version has `isStaging: true` and the current production version has `isLive: true`.", + "operationId": "getRouteVersions", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Get routing rule version history", + "tags": [ + "project-routes" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "versions": { + "items": { + "properties": { + "id": { + "type": "string", + "description": "Unique identifier for the version." + }, + "s3Key": { + "type": "string", + "description": "The S3 key where the routing rules are stored." + }, + "lastModified": { + "type": "number", + "description": "Timestamp of when this version was last modified." + }, + "createdBy": { + "type": "string", + "description": "The user who created this version." + }, + "isStaging": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether this version is staged and not yet promoted to production." + }, + "isLive": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether this version is currently live in production." + }, + "ruleCount": { + "type": "number", + "description": "The number of routing rules in this version." + }, + "alias": { + "type": "string", + "description": "The staging alias for previewing this version." + } + }, + "required": [ + "createdBy", + "id", + "lastModified", + "s3Key" + ], + "type": "object", + "description": "A version of routing rules stored in S3." + }, + "type": "array" + } + }, + "required": [ + "versions" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "projectId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + }, + "post": { + "description": "Promote staged routing rules to production, restore a previous production version, or discard staged changes. - `promote`: Publishes the staging version to production. - `restore`: Rolls back to a previous production version. - `discard`: Removes the staging version without publishing.", + "operationId": "updateRouteVersions", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Promote, restore, or discard a routing rule version", + "tags": [ + "project-routes" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "version": { + "properties": { + "id": { + "type": "string", + "description": "Unique identifier for the version." + }, + "s3Key": { + "type": "string", + "description": "The S3 key where the routing rules are stored." + }, + "lastModified": { + "type": "number", + "description": "Timestamp of when this version was last modified." + }, + "createdBy": { + "type": "string", + "description": "The user who created this version." + }, + "isStaging": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether this version is staged and not yet promoted to production." + }, + "isLive": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether this version is currently live in production." + }, + "ruleCount": { + "type": "number", + "description": "The number of routing rules in this version." + }, + "alias": { + "type": "string", + "description": "The staging alias for previewing this version." + } + }, + "required": [ + "createdBy", + "id", + "lastModified", + "s3Key" + ], + "type": "object", + "description": "A version of routing rules stored in S3." + } + }, + "required": [ + "version" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid.\nOne of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "409": { + "description": "" + }, + "410": { + "description": "" + }, + "500": { + "description": "" + } + }, + "parameters": [ + { + "name": "projectId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "id", + "action" + ], + "properties": { + "id": { + "type": "string" + }, + "action": { + "type": "string", + "enum": [ + "promote", + "restore", + "discard" + ] + } + } + } + } + } + } + } + }, + "/v10/projects": { + "get": { + "description": "Allows to retrieve the list of projects of the authenticated user or team. The list will be paginated and the provided query parameters allow filtering the returned projects.", + "operationId": "getProjects", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Retrieve a list of projects", + "tags": [ + "projects" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "nullable": true, + "oneOf": [ + { + "items": { + "properties": { + "accountId": { + "type": "string" + }, + "creator": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "user" + ] + }, + "via": { + "nullable": true, + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "app" + ] + }, + "app": { + "properties": { + "id": { + "type": "string", + "description": "The internal ID of the Vercel App backing this principal." + }, + "clientId": { + "type": "string", + "description": "The protocol-facing OAuth client ID. This may differ from {@link id} when Client ID Metadata Documents (CIMD) are used." + } + }, + "required": [ + "id" + ], + "type": "object" + } + }, + "required": [ + "app", + "type" + ], + "type": "object", + "description": "Set when a Vercel App or Integration acts on behalf of a {@link User}. Captures user-consented OAuth delegation that the ACL layer may inspect to evaluate scope restrictions. This is NOT for impersonation or token-exchange provenance — those live on `auth.token`, not on the principal." + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "integration" + ] + }, + "integration": { + "properties": { + "integrationId": { + "type": "string" + }, + "configurationId": { + "type": "string" + } + }, + "required": [ + "configurationId", + "integrationId" + ], + "type": "object" + } + }, + "required": [ + "integration", + "type" + ], + "type": "object", + "description": "Set when a Vercel App or Integration acts on behalf of a {@link User}. Captures user-consented OAuth delegation that the ACL layer may inspect to evaluate scope restrictions. This is NOT for impersonation or token-exchange provenance — those live on `auth.token`, not on the principal." + } + ] + }, + "user": { + "properties": { + "id": { + "type": "string" + } + }, + "required": [ + "id" + ], + "type": "object" + } + }, + "required": [ + "type", + "user", + "via" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "app" + ] + }, + "app": { + "properties": { + "id": { + "type": "string", + "description": "The internal ID of the Vercel App backing this principal." + }, + "clientId": { + "type": "string", + "description": "The protocol-facing OAuth client ID. This may differ from {@link id} when Client ID Metadata Documents (CIMD) are used." + } + }, + "required": [ + "id" + ], + "type": "object" + } + }, + "required": [ + "app", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "integration" + ] + }, + "integration": { + "properties": { + "integrationId": { + "type": "string" + }, + "configurationId": { + "type": "string" + } + }, + "required": [ + "configurationId", + "integrationId" + ], + "type": "object" + } + }, + "required": [ + "integration", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "system" + ] + } + }, + "required": [ + "type" + ], + "type": "object" + } + ] + }, + "alias": { + "items": { + "properties": { + "configuredBy": { + "nullable": true, + "type": "string", + "enum": [ + "A", + "CNAME", + "dns-01", + "http", + null + ] + }, + "configuredChangedAt": { + "nullable": true, + "type": "number" + }, + "createdAt": { + "nullable": true, + "type": "number" + }, + "deployment": { + "nullable": true, + "properties": { + "id": { + "type": "string" + }, + "alias": { + "items": { + "type": "string" + }, + "type": "array" + }, + "aliasAssigned": { + "nullable": true, + "oneOf": [ + { + "type": "number" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + } + ] + }, + "aliasError": { + "nullable": true, + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" + }, + "aliasFinal": { + "nullable": true, + "type": "string" + }, + "automaticAliases": { + "items": { + "type": "string" + }, + "type": "array" + }, + "branchMatcher": { + "properties": { + "type": { + "type": "string", + "enum": [ + "endsWith", + "equals", + "startsWith" + ], + "description": "The type of matching to perform" + }, + "pattern": { + "type": "string", + "description": "The pattern to match against branch names" + } + }, + "required": [ + "pattern", + "type" + ], + "type": "object" + }, + "buildingAt": { + "type": "number" + }, + "builds": { + "items": { + "properties": { + "use": { + "type": "string" + }, + "src": { + "type": "string" + }, + "dest": { + "type": "string" + } + }, + "required": [ + "use" + ], + "type": "object" + }, + "type": "array" + }, + "checksConclusion": { + "type": "string", + "enum": [ + "canceled", + "failed", + "skipped", + "succeeded" + ] + }, + "checksState": { + "type": "string", + "enum": [ + "completed", + "registered", + "running" + ] + }, + "connectBuildsEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "connectConfigurationId": { + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "createdIn": { + "type": "string" + }, + "creator": { + "nullable": true, + "properties": { + "email": { + "type": "string" + }, + "githubLogin": { + "type": "string" + }, + "gitlabLogin": { + "type": "string" + }, + "uid": { + "type": "string" + }, + "username": { + "type": "string" + } + }, + "required": [ + "email", + "uid", + "username" + ], + "type": "object" + }, + "deletedAt": { + "type": "number" + }, + "deploymentHostname": { + "type": "string" + }, + "forced": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "name": { + "type": "string" + }, + "meta": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "monorepoManager": { + "nullable": true, + "type": "string" + }, + "oidcTokenClaims": { + "properties": { + "iss": { + "type": "string" + }, + "sub": { + "type": "string" + }, + "scope": { + "type": "string" + }, + "aud": { + "type": "string" + }, + "owner": { + "type": "string" + }, + "owner_id": { + "type": "string" + }, + "project": { + "type": "string" + }, + "project_id": { + "type": "string" + }, + "environment": { + "type": "string" + }, + "custom_environment_id": { + "type": "string" + }, + "mfe_group_ids": { + "items": { + "type": "string" + }, + "type": "array" + }, + "plan": { + "type": "string" + } + }, + "required": [ + "aud", + "environment", + "iss", + "owner", + "owner_id", + "project", + "project_id", + "scope", + "sub" + ], + "type": "object" + }, + "plan": { + "type": "string", + "enum": [ + "enterprise", + "hobby", + "pro" + ] + }, + "previewCommentsEnabled": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether or not preview comments are enabled for the deployment", + "example": false + }, + "private": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "readyAt": { + "type": "number" + }, + "readyState": { + "type": "string", + "enum": [ + "BLOCKED", + "BUILDING", + "CANCELED", + "ERROR", + "INITIALIZING", + "QUEUED", + "READY" + ] + }, + "readySubstate": { + "type": "string", + "enum": [ + "PROMOTED", + "ROLLING", + "STAGED" + ] + }, + "requestedAt": { + "type": "number" + }, + "target": { + "nullable": true, + "type": "string" + }, + "teamId": { + "nullable": true, + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "LAMBDAS" + ] + }, + "url": { + "type": "string" + }, + "userId": { + "type": "string", + "description": "Present for user creators; omitted for app/integration/system creators." + }, + "withCache": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "createdAt", + "createdIn", + "creator", + "deploymentHostname", + "id", + "name", + "plan", + "private", + "readyState", + "type", + "url" + ], + "type": "object" + }, + "domain": { + "type": "string" + }, + "environment": { + "type": "string", + "enum": [ + "preview", + "production" + ] + }, + "gitBranch": { + "nullable": true, + "type": "string" + }, + "redirect": { + "nullable": true, + "type": "string" + }, + "redirectStatusCode": { + "nullable": true, + "type": "number", + "enum": [ + 301, + 302, + 307, + 308, + null + ] + }, + "target": { + "type": "string", + "enum": [ + "PREVIEW", + "PRODUCTION", + "STAGING" + ] + } + }, + "required": [ + "deployment", + "domain", + "environment", + "target" + ], + "type": "object" + }, + "type": "array" + }, + "analytics": { + "properties": { + "id": { + "type": "string" + }, + "canceledAt": { + "nullable": true, + "type": "number" + }, + "disabledAt": { + "type": "number" + }, + "enabledAt": { + "type": "number" + }, + "paidAt": { + "type": "number" + }, + "sampleRatePercent": { + "nullable": true, + "type": "number" + }, + "spendLimitInDollars": { + "nullable": true, + "type": "number" + } + }, + "required": [ + "disabledAt", + "enabledAt", + "id" + ], + "type": "object" + }, + "appliedCve55182Migration": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "autoExposeSystemEnvs": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "autoAssignCustomDomains": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "autoAssignCustomDomainsUpdatedBy": { + "type": "string" + }, + "buildCommand": { + "nullable": true, + "type": "string" + }, + "commandForIgnoringBuildStep": { + "nullable": true, + "type": "string" + }, + "customerSupportCodeVisibility": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "createdAt": { + "type": "number" + }, + "devCommand": { + "nullable": true, + "type": "string" + }, + "directoryListing": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "deploymentExpiration": { + "properties": { + "expirationDays": { + "type": "number", + "description": "Number of days to keep non-production deployments (mostly preview deployments) before soft deletion." + }, + "expirationDaysProduction": { + "type": "number", + "description": "Number of days to keep production deployments before soft deletion." + }, + "expirationDaysCanceled": { + "type": "number", + "description": "Number of days to keep canceled deployments before soft deletion." + }, + "expirationDaysErrored": { + "type": "number", + "description": "Number of days to keep errored deployments before soft deletion." + }, + "deploymentsToKeep": { + "type": "number", + "description": "Minimum number of production deployments to keep for this project, even if they are over the production expiration limit." + } + }, + "type": "object", + "description": "Retention policies for deployments. These are enforced at the project level, but we also maintain an instance of this at the team level as a default policy that gets applied to new projects." + }, + "installCommand": { + "nullable": true, + "type": "string" + }, + "ipBuckets": { + "items": { + "properties": { + "bucket": { + "type": "string" + }, + "default": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "supportUntil": { + "type": "number" + } + }, + "required": [ + "bucket" + ], + "type": "object" + }, + "type": "array" + }, + "env": { + "items": { + "properties": { + "target": { + "oneOf": [ + { + "items": { + "type": "string", + "enum": [ + "development", + "development", + "preview", + "preview", + "production" + ] + }, + "type": "array" + }, + { + "type": "string", + "enum": [ + "development", + "development", + "preview", + "preview", + "production" + ] + } + ] + }, + "type": { + "type": "string", + "enum": [ + "encrypted", + "plain", + "secret", + "sensitive", + "system" + ] + }, + "sunsetSecretId": { + "type": "string", + "description": "This is used to identify variables that have been migrated from type secret to sensitive." + }, + "legacyValue": { + "type": "string", + "description": "Legacy now-encryption ciphertext, present after migration swaps value/vsmValue" + }, + "decrypted": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "value": { + "type": "string" + }, + "vsmValue": { + "type": "string" + }, + "id": { + "type": "string" + }, + "key": { + "type": "string" + }, + "configurationId": { + "nullable": true, + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "updatedAt": { + "type": "number" + }, + "createdBy": { + "nullable": true, + "type": "string" + }, + "updatedBy": { + "nullable": true, + "type": "string" + }, + "gitBranch": { + "type": "string" + }, + "visibility": { + "type": "string", + "enum": [ + "config", + "secret" + ], + "description": "User-facing config/secret model. When set, authoritative for new code paths when the env-var-config-secret-ui flag is enabled. Legacy rows omit this field; legacy rows omit it and callers fall back to existing `type` behavior." + }, + "edgeConfigId": { + "nullable": true, + "type": "string" + }, + "edgeConfigTokenId": { + "nullable": true, + "type": "string" + }, + "contentHint": { + "nullable": true, + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "redis-url" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "redis-rest-api-url" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "redis-rest-api-token" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "redis-rest-api-read-only-token" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "blob-read-write-token" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "blob-store-id" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "blob-webhook-public-key" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-url" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-url-non-pooling" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-prisma-url" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-user" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-host" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-password" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-database" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-url-no-ssl" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "integration-store-secret" + ] + }, + "storeId": { + "type": "string" + }, + "integrationId": { + "type": "string" + }, + "integrationProductId": { + "type": "string" + }, + "integrationConfigurationId": { + "type": "string" + } + }, + "required": [ + "integrationConfigurationId", + "integrationId", + "integrationProductId", + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "flags-connection-string" + ] + }, + "projectId": { + "type": "string" + } + }, + "required": [ + "projectId", + "type" + ], + "type": "object" + } + ] + }, + "internalContentHint": { + "nullable": true, + "properties": { + "type": { + "type": "string", + "enum": [ + "flags-secret" + ] + }, + "encryptedValue": { + "type": "string", + "description": "Contains the `value` of the env variable, encrypted with a special key to make decryption possible in the subscriber Lambda." + } + }, + "required": [ + "encryptedValue", + "type" + ], + "type": "object", + "description": "Similar to `contentHints`, but should not be exposed to the user." + }, + "comment": { + "type": "string" + }, + "customEnvironmentIds": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "key", + "type", + "value" + ], + "type": "object" + }, + "type": "array" + }, + "framework": { + "nullable": true, + "type": "string", + "enum": [ + "actix-web", + "angular", + "ash", + "astro", + "axum", + "blitzjs", + "brunch", + "bun", + "container", + "create-react-app", + "django", + "docusaurus", + "docusaurus-2", + "dojo", + "eleventy", + "elysia", + "ember", + "eve", + "express", + "factory-eve", + "fastapi", + "fasthtml", + "fastify", + "flask", + "gatsby", + "go", + "gridsome", + "h3", + "hexo", + "hono", + "hugo", + "hydrogen", + "ionic-angular", + "ionic-react", + "jekyll", + "koa", + "mastra", + "middleman", + "nestjs", + "nextjs", + "nitro", + "node", + "nuxtjs", + "parcel", + "polymer", + "preact", + "python", + "react-router", + "redwoodjs", + "remix", + "ruby", + "rust", + "saber", + "sanity", + "sanity-v2", + "sapper", + "scully", + "services", + "solidstart", + "solidstart-1", + "stencil", + "storybook", + "svelte", + "sveltekit", + "sveltekit-1", + "tanstack-start", + "tanstack-start-lovable", + "umijs", + "vite", + "vitepress", + "vue", + "vuepress", + "xmcp", + "zola", + null + ] + }, + "gitForkProtection": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "id": { + "type": "string" + }, + "latestDeployments": { + "items": { + "properties": { + "id": { + "type": "string" + }, + "alias": { + "items": { + "type": "string" + }, + "type": "array" + }, + "aliasAssigned": { + "nullable": true, + "oneOf": [ + { + "type": "number" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + } + ] + }, + "aliasError": { + "nullable": true, + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" + }, + "aliasFinal": { + "nullable": true, + "type": "string" + }, + "automaticAliases": { + "items": { + "type": "string" + }, + "type": "array" + }, + "branchMatcher": { + "properties": { + "type": { + "type": "string", + "enum": [ + "endsWith", + "equals", + "startsWith" + ], + "description": "The type of matching to perform" + }, + "pattern": { + "type": "string", + "description": "The pattern to match against branch names" + } + }, + "required": [ + "pattern", + "type" + ], + "type": "object" + }, + "buildingAt": { + "type": "number" + }, + "builds": { + "items": { + "properties": { + "use": { + "type": "string" + }, + "src": { + "type": "string" + }, + "dest": { + "type": "string" + } + }, + "required": [ + "use" + ], + "type": "object" + }, + "type": "array" + }, + "checksConclusion": { + "type": "string", + "enum": [ + "canceled", + "failed", + "skipped", + "succeeded" + ] + }, + "checksState": { + "type": "string", + "enum": [ + "completed", + "registered", + "running" + ] + }, + "connectBuildsEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "connectConfigurationId": { + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "createdIn": { + "type": "string" + }, + "creator": { + "nullable": true, + "properties": { + "email": { + "type": "string" + }, + "githubLogin": { + "type": "string" + }, + "gitlabLogin": { + "type": "string" + }, + "uid": { + "type": "string" + }, + "username": { + "type": "string" + } + }, + "required": [ + "email", + "uid", + "username" + ], + "type": "object" + }, + "deletedAt": { + "type": "number" + }, + "deploymentHostname": { + "type": "string" + }, + "forced": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "name": { + "type": "string" + }, + "meta": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "monorepoManager": { + "nullable": true, + "type": "string" + }, + "oidcTokenClaims": { + "properties": { + "iss": { + "type": "string" + }, + "sub": { + "type": "string" + }, + "scope": { + "type": "string" + }, + "aud": { + "type": "string" + }, + "owner": { + "type": "string" + }, + "owner_id": { + "type": "string" + }, + "project": { + "type": "string" + }, + "project_id": { + "type": "string" + }, + "environment": { + "type": "string" + }, + "custom_environment_id": { + "type": "string" + }, + "mfe_group_ids": { + "items": { + "type": "string" + }, + "type": "array" + }, + "plan": { + "type": "string" + } + }, + "required": [ + "aud", + "environment", + "iss", + "owner", + "owner_id", + "project", + "project_id", + "scope", + "sub" + ], + "type": "object" + }, + "plan": { + "type": "string", + "enum": [ + "enterprise", + "hobby", + "pro" + ] + }, + "previewCommentsEnabled": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether or not preview comments are enabled for the deployment", + "example": false + }, + "private": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "readyAt": { + "type": "number" + }, + "readyState": { + "type": "string", + "enum": [ + "BLOCKED", + "BUILDING", + "CANCELED", + "ERROR", + "INITIALIZING", + "QUEUED", + "READY" + ] + }, + "readySubstate": { + "type": "string", + "enum": [ + "PROMOTED", + "ROLLING", + "STAGED" + ] + }, + "requestedAt": { + "type": "number" + }, + "target": { + "nullable": true, + "type": "string" + }, + "teamId": { + "nullable": true, + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "LAMBDAS" + ] + }, + "url": { + "type": "string" + }, + "userId": { + "type": "string", + "description": "Present for user creators; omitted for app/integration/system creators." + }, + "withCache": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "createdAt", + "createdIn", + "creator", + "deploymentHostname", + "id", + "name", + "plan", + "private", + "readyState", + "type", + "url" + ], + "type": "object" + }, + "type": "array" + }, + "link": { + "oneOf": [ + { + "properties": { + "org": { + "type": "string" + }, + "repoOwnerId": { + "type": "number", + "description": "A new field, should be included in all new project links, is being added just in time when a deployment is created. This is needed for Protected Git scopes." + }, + "repo": { + "type": "string" + }, + "repoId": { + "type": "number" + }, + "type": { + "type": "string", + "enum": [ + "github" + ] + }, + "createdAt": { + "type": "number" + }, + "deployHooks": { + "items": { + "properties": { + "createdAt": { + "type": "number" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "ref": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "ref", + "url" + ], + "type": "object" + }, + "type": "array" + }, + "gitCredentialId": { + "type": "string" + }, + "updatedAt": { + "type": "number" + }, + "sourceless": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "productionBranch": { + "type": "string" + } + }, + "required": [ + "deployHooks", + "gitCredentialId", + "org", + "productionBranch", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "github-limited" + ] + }, + "repo": { + "type": "string" + }, + "repoId": { + "type": "number" + }, + "createdAt": { + "type": "number" + }, + "updatedAt": { + "type": "number" + }, + "org": { + "type": "string" + }, + "repoOwnerId": { + "type": "number", + "description": "A new field, should be included in all new project links, is being added just in time when a deployment is created. This is needed for Protected Git scopes." + }, + "deployHooks": { + "items": { + "properties": { + "createdAt": { + "type": "number" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "ref": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "ref", + "url" + ], + "type": "object" + }, + "type": "array" + }, + "gitCredentialId": { + "type": "string" + }, + "sourceless": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "productionBranch": { + "type": "string" + } + }, + "required": [ + "deployHooks", + "gitCredentialId", + "org", + "productionBranch", + "type" + ], + "type": "object" + }, + { + "properties": { + "org": { + "type": "string" + }, + "repoOwnerId": { + "type": "number", + "description": "A new field, should be included in all new project links, is being added just in time when a deployment is created. This is needed for Protected Git scopes." + }, + "repo": { + "type": "string" + }, + "repoId": { + "type": "number" + }, + "type": { + "type": "string", + "enum": [ + "github-custom-host" + ] + }, + "host": { + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "deployHooks": { + "items": { + "properties": { + "createdAt": { + "type": "number" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "ref": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "ref", + "url" + ], + "type": "object" + }, + "type": "array" + }, + "gitCredentialId": { + "type": "string" + }, + "updatedAt": { + "type": "number" + }, + "sourceless": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "productionBranch": { + "type": "string" + } + }, + "required": [ + "deployHooks", + "gitCredentialId", + "host", + "org", + "productionBranch", + "type" + ], + "type": "object" + }, + { + "properties": { + "projectId": { + "type": "string" + }, + "projectName": { + "type": "string" + }, + "projectNameWithNamespace": { + "type": "string" + }, + "projectNamespace": { + "type": "string" + }, + "projectOwnerId": { + "type": "number", + "description": "A new field, should be included in all new project links, is being added just in time when a deployment is created. This is needed for Protected Git scopes. This is the id of the top level group that a namespace belongs to. Gitlab supports group nesting (up to 20 levels)." + }, + "projectUrl": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "gitlab" + ] + }, + "createdAt": { + "type": "number" + }, + "deployHooks": { + "items": { + "properties": { + "createdAt": { + "type": "number" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "ref": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "ref", + "url" + ], + "type": "object" + }, + "type": "array" + }, + "gitCredentialId": { + "type": "string" + }, + "updatedAt": { + "type": "number" + }, + "sourceless": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "productionBranch": { + "type": "string" + } + }, + "required": [ + "deployHooks", + "gitCredentialId", + "productionBranch", + "projectId", + "projectName", + "projectNameWithNamespace", + "projectNamespace", + "projectUrl", + "type" + ], + "type": "object" + }, + { + "properties": { + "name": { + "type": "string" + }, + "slug": { + "type": "string" + }, + "owner": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "bitbucket" + ] + }, + "uuid": { + "type": "string" + }, + "workspaceUuid": { + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "deployHooks": { + "items": { + "properties": { + "createdAt": { + "type": "number" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "ref": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "ref", + "url" + ], + "type": "object" + }, + "type": "array" + }, + "gitCredentialId": { + "type": "string" + }, + "updatedAt": { + "type": "number" + }, + "sourceless": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "productionBranch": { + "type": "string" + } + }, + "required": [ + "deployHooks", + "gitCredentialId", + "name", + "owner", + "productionBranch", + "slug", + "type", + "uuid", + "workspaceUuid" + ], + "type": "object" + }, + { + "properties": { + "org": { + "type": "string" + }, + "repo": { + "type": "string" + }, + "repoId": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "vercel" + ] + }, + "createdAt": { + "type": "number" + }, + "deployHooks": { + "items": { + "properties": { + "createdAt": { + "type": "number" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "ref": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "ref", + "url" + ], + "type": "object" + }, + "type": "array" + }, + "gitCredentialId": { + "type": "string" + }, + "updatedAt": { + "type": "number" + }, + "sourceless": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "productionBranch": { + "type": "string" + } + }, + "required": [ + "deployHooks", + "gitCredentialId", + "org", + "productionBranch", + "repo", + "repoId", + "type" + ], + "type": "object" + }, + { + "properties": { + "org": { + "type": "string" + }, + "repo": { + "type": "string" + }, + "repoId": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "v0" + ] + }, + "createdAt": { + "type": "number" + }, + "deployHooks": { + "items": { + "properties": { + "createdAt": { + "type": "number" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "ref": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "ref", + "url" + ], + "type": "object" + }, + "type": "array" + }, + "gitCredentialId": { + "type": "string" + }, + "updatedAt": { + "type": "number" + }, + "sourceless": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "productionBranch": { + "type": "string" + } + }, + "required": [ + "deployHooks", + "gitCredentialId", + "org", + "productionBranch", + "repo", + "repoId", + "type" + ], + "type": "object" + }, + { + "properties": { + "owner": { + "type": "string", + "description": "Owner (namespace) slug, e.g. `acme`." + }, + "repo": { + "type": "string" + }, + "repoId": { + "type": "string", + "description": "Origin repository id." + }, + "ownerId": { + "type": "string", + "description": "Origin namespace id (`ns_…`) of the owner." + }, + "type": { + "type": "string", + "enum": [ + "cursor-origin" + ] + }, + "createdAt": { + "type": "number" + }, + "deployHooks": { + "items": { + "properties": { + "createdAt": { + "type": "number" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "ref": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "ref", + "url" + ], + "type": "object" + }, + "type": "array" + }, + "gitCredentialId": { + "type": "string" + }, + "updatedAt": { + "type": "number" + }, + "sourceless": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "productionBranch": { + "type": "string" + } + }, + "required": [ + "deployHooks", + "gitCredentialId", + "owner", + "ownerId", + "productionBranch", + "repo", + "repoId", + "type" + ], + "type": "object" + } + ] + }, + "name": { + "type": "string" + }, + "nodeVersion": { + "type": "string", + "enum": [ + "10.x", + "12.x", + "14.x", + "16.x", + "18.x", + "20.x", + "22.x", + "24.x", + "8.10.x" + ] + }, + "outputDirectory": { + "nullable": true, + "type": "string" + }, + "passwordProtection": { + "nullable": true, + "type": "object" + }, + "passport": { + "nullable": true, + "properties": { + "deploymentType": { + "type": "string", + "enum": [ + "all", + "all_except_custom_domains", + "preview", + "prod_deployment_urls_and_all_previews" + ] + }, + "connectorId": { + "type": "string" + } + }, + "required": [ + "connectorId", + "deploymentType" + ], + "type": "object" + }, + "resourceConfig": { + "properties": { + "elasticConcurrencyEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "fluid": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "functionDefaultRegions": { + "items": { + "type": "string" + }, + "type": "array" + }, + "functionDefaultTimeout": { + "type": "number" + }, + "functionDefaultMemoryType": { + "type": "string", + "enum": [ + "performance", + "performance_xl", + "standard", + "standard_legacy" + ] + }, + "functionZeroConfigFailover": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "buildMachineType": { + "type": "string", + "enum": [ + "basic", + "enhanced", + "standard", + "turbo" + ] + }, + "buildMachineSelection": { + "type": "string", + "enum": [ + "elastic", + "fixed" + ] + }, + "buildMachineElasticLastUpdated": { + "type": "number" + }, + "buildMachineElasticReason": { + "type": "string", + "enum": [ + "basic-floor", + "build-timeout-failure", + "enospc-failure", + "enterprise-floor", + "high-peak-disk", + "high-peak-memory", + "long-build-duration", + "oom-failure", + "short-build-duration", + "sustained-high-cpu" + ] + }, + "isNSNBDisabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "buildQueue": { + "properties": { + "configuration": { + "type": "string", + "enum": [ + "SKIP_NAMESPACE_QUEUE", + "WAIT_FOR_NAMESPACE_QUEUE" + ] + } + }, + "type": "object" + }, + "enableFunctionsBeta": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "type": "object", + "required": [ + "functionDefaultRegions" + ] + }, + "rollingRelease": { + "nullable": true, + "properties": { + "target": { + "type": "string", + "description": "The environment that the release targets, currently only supports production. Adding in case we want to configure with alias groups or custom environments.", + "example": "production" + }, + "stages": { + "nullable": true, + "items": { + "properties": { + "targetPercentage": { + "type": "number", + "description": "The percentage of traffic to serve to the canary deployment (0-100)", + "example": 25 + }, + "requireApproval": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether or not this stage requires manual approval to proceed", + "example": false + }, + "duration": { + "type": "number", + "description": "Duration in minutes for automatic advancement to the next stage", + "example": 600 + }, + "linearShift": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether to linearly shift traffic over the duration of this stage", + "example": false + } + }, + "required": [ + "targetPercentage" + ], + "type": "object", + "description": "An array of all the stages required during a deployment release. Each stage defines a target percentage and advancement rules. The final stage must always have targetPercentage: 100." + }, + "type": "array", + "description": "An array of all the stages required during a deployment release. Each stage defines a target percentage and advancement rules. The final stage must always have targetPercentage: 100." + }, + "canaryResponseHeader": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether the request served by a canary deployment should return a header indicating a canary was served. Defaults to `false` when omitted.", + "example": false + }, + "gate": { + "properties": { + "enabled": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether automated gating is enabled for this project's rollouts." + }, + "checks": { + "items": { + "properties": { + "type": { + "type": "string", + "enum": [ + "error-rate-5xx" + ], + "description": "The metric this check evaluates." + }, + "minSampleSize": { + "type": "number", + "description": "Minimum number of requests required in the window before the check can fail. Below this, the check is inconclusive rather than failing, so low-traffic stages don't gate on noise. Defaults to `100` when omitted.", + "example": 100 + }, + "excludeStatusCodes": { + "items": { + "type": "number" + }, + "type": "array", + "description": "Response status codes to ignore entirely — dropped from both the numerator (errors) and the denominator (total requests). Defaults to `[]` when omitted.", + "example": [ + 503 + ] + }, + "excludePaths": { + "items": { + "type": "string" + }, + "type": "array", + "description": "Request paths to ignore entirely — dropped from both the numerator (errors) and the denominator (total requests). Matched exactly against the request path with any query string removed; no prefix or glob matching. Defaults to `[]` when omitted.", + "example": [ + "/api/health" + ] + }, + "ingestWatermarkSeconds": { + "type": "number", + "description": "Seconds of ingest lag to allow for: the query's upper bound is `now() - this value`, so the check never reads a window that is still filling. Defaults to `30` when omitted.", + "example": 30 + } + }, + "required": [ + "type" + ], + "type": "object", + "description": "The checks to evaluate. An empty array means nothing is evaluated." + }, + "type": "array", + "description": "The checks to evaluate. An empty array means nothing is evaluated." + }, + "failureThreshold": { + "type": "number", + "description": "How many failing evaluations within {@link windowSize} trip the gate. Defaults to `3` when omitted.", + "example": 3 + }, + "windowSize": { + "type": "number", + "description": "How many of the most recent evaluations {@link failureThreshold} is counted against. Defaults to `5` when omitted.", + "example": 5 + }, + "action": { + "type": "string", + "enum": [ + "pause", + "rollback" + ], + "description": "What to do when the gate trips: pause the rollout, or roll it back." + }, + "dryRun": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "When true, a tripped gate is only reported — {@link action} is not taken." + } + }, + "required": [ + "action", + "checks", + "dryRun", + "enabled" + ], + "type": "object", + "description": "Automated gating configuration. Omitted (the default) means no gating is configured, which is equivalent to `enabled: false`." + } + }, + "required": [ + "target" + ], + "type": "object", + "description": "Project-level rolling release configuration that defines how deployments should be gradually rolled out" + }, + "rootDirectory": { + "nullable": true, + "type": "string" + }, + "serverlessFunctionRegion": { + "type": "string" + }, + "serverlessFunctionZeroConfigFailover": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "speedInsights": { + "properties": { + "id": { + "type": "string" + }, + "enabledAt": { + "type": "number" + }, + "disabledAt": { + "type": "number" + }, + "canceledAt": { + "type": "number" + }, + "hasData": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "dataReceivedAt": { + "type": "number", + "description": "When the first free (not Speed Insights Plus) production data point was observed, in ms. Set once by subscriber-analytics-events; projects that already had data before this field shipped get it backfilled on their next batch, so it reads \"first free data point observed\", not necessarily \"first ever\"." + }, + "paidAt": { + "type": "number" + } + }, + "required": [ + "id" + ], + "type": "object" + }, + "skipGitConnectDuringLink": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "sourceFilesOutsideRootDirectory": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "ssoProtection": { + "nullable": true, + "properties": { + "deploymentType": { + "type": "string", + "enum": [ + "all", + "all_except_custom_domains", + "preview", + "prod_deployment_urls_and_all_previews" + ] + }, + "cve55182MigrationAppliedFrom": { + "nullable": true, + "type": "string", + "enum": [ + "all", + "all_except_custom_domains", + "preview", + "prod_deployment_urls_and_all_previews", + null + ] + }, + "april2026SecurityIncidentMigrationAppliedFrom": { + "nullable": true, + "type": "string", + "enum": [ + "all", + "all_except_custom_domains", + "preview", + "prod_deployment_urls_and_all_previews", + null + ] + } + }, + "required": [ + "deploymentType" + ], + "type": "object" + }, + "targets": { + "additionalProperties": { + "nullable": true, + "properties": { + "id": { + "type": "string" + }, + "alias": { + "items": { + "type": "string" + }, + "type": "array" + }, + "aliasAssigned": { + "nullable": true, + "oneOf": [ + { + "type": "number" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + } + ] + }, + "aliasError": { + "nullable": true, + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" + }, + "aliasFinal": { + "nullable": true, + "type": "string" + }, + "automaticAliases": { + "items": { + "type": "string" + }, + "type": "array" + }, + "branchMatcher": { + "properties": { + "type": { + "type": "string", + "enum": [ + "endsWith", + "equals", + "startsWith" + ], + "description": "The type of matching to perform" + }, + "pattern": { + "type": "string", + "description": "The pattern to match against branch names" + } + }, + "required": [ + "pattern", + "type" + ], + "type": "object" + }, + "buildingAt": { + "type": "number" + }, + "builds": { + "items": { + "properties": { + "use": { + "type": "string" + }, + "src": { + "type": "string" + }, + "dest": { + "type": "string" + } + }, + "required": [ + "use" + ], + "type": "object" + }, + "type": "array" + }, + "checksConclusion": { + "type": "string", + "enum": [ + "canceled", + "failed", + "skipped", + "succeeded" + ] + }, + "checksState": { + "type": "string", + "enum": [ + "completed", + "registered", + "running" + ] + }, + "connectBuildsEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "connectConfigurationId": { + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "createdIn": { + "type": "string" + }, + "creator": { + "nullable": true, + "properties": { + "email": { + "type": "string" + }, + "githubLogin": { + "type": "string" + }, + "gitlabLogin": { + "type": "string" + }, + "uid": { + "type": "string" + }, + "username": { + "type": "string" + } + }, + "required": [ + "email", + "uid", + "username" + ], + "type": "object" + }, + "deletedAt": { + "type": "number" + }, + "deploymentHostname": { + "type": "string" + }, + "forced": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "name": { + "type": "string" + }, + "meta": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "monorepoManager": { + "nullable": true, + "type": "string" + }, + "oidcTokenClaims": { + "properties": { + "iss": { + "type": "string" + }, + "sub": { + "type": "string" + }, + "scope": { + "type": "string" + }, + "aud": { + "type": "string" + }, + "owner": { + "type": "string" + }, + "owner_id": { + "type": "string" + }, + "project": { + "type": "string" + }, + "project_id": { + "type": "string" + }, + "environment": { + "type": "string" + }, + "custom_environment_id": { + "type": "string" + }, + "mfe_group_ids": { + "items": { + "type": "string" + }, + "type": "array" + }, + "plan": { + "type": "string" + } + }, + "required": [ + "aud", + "environment", + "iss", + "owner", + "owner_id", + "project", + "project_id", + "scope", + "sub" + ], + "type": "object" + }, + "plan": { + "type": "string", + "enum": [ + "enterprise", + "hobby", + "pro" + ] + }, + "previewCommentsEnabled": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether or not preview comments are enabled for the deployment", + "example": false + }, + "private": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "readyAt": { + "type": "number" + }, + "readyState": { + "type": "string", + "enum": [ + "BLOCKED", + "BUILDING", + "CANCELED", + "ERROR", + "INITIALIZING", + "QUEUED", + "READY" + ] + }, + "readySubstate": { + "type": "string", + "enum": [ + "PROMOTED", + "ROLLING", + "STAGED" + ] + }, + "requestedAt": { + "type": "number" + }, + "target": { + "nullable": true, + "type": "string" + }, + "teamId": { + "nullable": true, + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "LAMBDAS" + ] + }, + "url": { + "type": "string" + }, + "userId": { + "type": "string", + "description": "Present for user creators; omitted for app/integration/system creators." + }, + "withCache": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "createdAt", + "createdIn", + "creator", + "deploymentHostname", + "id", + "name", + "plan", + "private", + "readyState", + "type", + "url" + ], + "type": "object" + }, + "type": "object" + }, + "transferCompletedAt": { + "type": "number" + }, + "transferStartedAt": { + "type": "number" + }, + "transferToAccountId": { + "type": "string" + }, + "transferredFromAccountId": { + "type": "string" + }, + "trustedSources": { + "nullable": true, + "properties": { + "enableVercelCiSameRepository": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Allow same-team Vercel CI access to preview deployments built from the CI run's repository, using the deployment source rather than the current project repository link. Defaults to enabled when not stored; omitted or null Trusted Sources updates preserve the stored value." + }, + "projects": { + "additionalProperties": { + "properties": { + "label": { + "type": "string" + }, + "customAllow": { + "items": { + "properties": { + "from": { + "oneOf": [ + { + "properties": { + "slugs": { + "items": { + "type": "string" + }, + "type": "array", + "description": "System environment slugs (`production`, `preview`) and/or custom environment slugs defined on the referenced project." + }, + "preset": { + "type": "string", + "enum": [ + "all-custom" + ] + } + }, + "required": [ + "slugs" + ], + "type": "object", + "description": "The source envs on the trusted project that are allowed to access `to`." + }, + { + "properties": { + "slugs": { + "items": { + "type": "string" + }, + "type": "array", + "description": "System environment slugs (`production`, `preview`) and/or custom environment slugs defined on the referenced project." + }, + "preset": { + "type": "string", + "enum": [ + "all-custom" + ] + } + }, + "required": [ + "preset" + ], + "type": "object", + "description": "The source envs on the trusted project that are allowed to access `to`." + } + ] + }, + "to": { + "oneOf": [ + { + "properties": { + "slugs": { + "items": { + "type": "string" + }, + "type": "array", + "description": "System environment slugs (`production`, `preview`) and/or custom environment slugs defined on the referenced project." + }, + "preset": { + "type": "string", + "enum": [ + "all-custom" + ] + } + }, + "required": [ + "slugs" + ], + "type": "object", + "description": "The target envs on the current project that may be accessed." + }, + { + "properties": { + "slugs": { + "items": { + "type": "string" + }, + "type": "array", + "description": "System environment slugs (`production`, `preview`) and/or custom environment slugs defined on the referenced project." + }, + "preset": { + "type": "string", + "enum": [ + "all-custom" + ] + } + }, + "required": [ + "preset" + ], + "type": "object", + "description": "The target envs on the current project that may be accessed." + } + ] + } + }, + "required": [ + "from", + "to" + ], + "type": "object", + "description": "Optional overrides for the default same-env-by-slug matching. Provide explicit rules to allow cross-env access or presets." + }, + "type": "array", + "description": "Optional overrides for the default same-env-by-slug matching. Provide explicit rules to allow cross-env access or presets." + } + }, + "type": "object" + }, + "type": "object" + }, + "oidcProviders": { + "additionalProperties": { + "items": { + "properties": { + "to": { + "oneOf": [ + { + "properties": { + "slugs": { + "items": { + "type": "string" + }, + "type": "array", + "description": "System environment slugs (`production`, `preview`) and/or custom environment slugs defined on the referenced project." + }, + "preset": { + "type": "string", + "enum": [ + "all-custom" + ] + } + }, + "required": [ + "slugs" + ], + "type": "object", + "description": "The target envs on the current project that may be accessed." + }, + { + "properties": { + "slugs": { + "items": { + "type": "string" + }, + "type": "array", + "description": "System environment slugs (`production`, `preview`) and/or custom environment slugs defined on the referenced project." + }, + "preset": { + "type": "string", + "enum": [ + "all-custom" + ] + } + }, + "required": [ + "preset" + ], + "type": "object", + "description": "The target envs on the current project that may be accessed." + } + ] + }, + "label": { + "type": "string" + }, + "claims": { + "additionalProperties": { + "items": { + "type": "string" + }, + "type": "array" + }, + "type": "object" + } + }, + "required": [ + "claims", + "to" + ], + "type": "object" + }, + "type": "array" + }, + "type": "object" + } + }, + "type": "object" + }, + "updatedAt": { + "type": "number" + }, + "live": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "hasActiveBranches": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "gitComments": { + "properties": { + "onPullRequest": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether the Vercel bot should comment on PRs" + }, + "onCommit": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether the Vercel bot should comment on commits" + } + }, + "required": [ + "onCommit", + "onPullRequest" + ], + "type": "object" + }, + "gitProviderOptions": { + "properties": { + "createDeployments": { + "type": "string", + "enum": [ + "disabled", + "enabled" + ], + "description": "Whether the Vercel bot should automatically create GitHub deployments https://docs.github.com/en/rest/deployments/deployments#about-deployments NOTE: repository-dispatch events should be used instead" + }, + "disableRepositoryDispatchEvents": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether the Vercel bot should not automatically create GitHub repository-dispatch events on deployment events. https://vercel.com/docs/git/vercel-for-github#repository-dispatch-events - `true`: disable repository-dispatch events for this project (explicit override of the team setting). - `false`: enable repository-dispatch events for this project (explicit override of the team setting). - absent: inherit from `team.disableRepositoryDispatchEvents`." + }, + "requireVerifiedCommits": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether the project requires commits to be signed \u0026 verified before deployments will be created. - `true`: require verified commits for this project (explicit override of the team setting). - `false`: do not require verified commits (explicit override of the team setting). - absent: inherit from `team.requireVerifiedCommits`." + }, + "gitCommitStatus": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether Vercel should post commit statuses for this project. When omitted, commit statuses remain enabled." + }, + "consolidatedGitCommitStatus": { + "properties": { + "enabled": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether consolidated commit status is enabled." + }, + "propagateFailures": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether to propagate individual deployment failures to the consolidated status." + } + }, + "required": [ + "enabled", + "propagateFailures" + ], + "type": "object", + "description": "Configuration for consolidated git commit status reporting. When enabled, Vercel will post a single consolidated commit status instead of individual statuses for each deployment." + } + }, + "required": [ + "createDeployments" + ], + "type": "object" + }, + "paused": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "webAnalytics": { + "properties": { + "id": { + "type": "string" + }, + "disabledAt": { + "type": "number" + }, + "canceledAt": { + "type": "number" + }, + "enabledAt": { + "type": "number" + }, + "hasData": { + "type": "boolean", + "enum": [ + true + ] + } + }, + "required": [ + "id" + ], + "type": "object" + }, + "security": { + "properties": { + "attackModeEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "attackModeUpdatedAt": { + "type": "number" + }, + "firewallEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "firewallUpdatedAt": { + "type": "number" + }, + "attackModeActiveUntil": { + "nullable": true, + "type": "number" + }, + "firewallConfigVersion": { + "type": "number" + }, + "firewallRoutes": { + "items": { + "properties": { + "src": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "re": { + "type": "string" + }, + "eq": { + "type": "string" + }, + "neq": { + "type": "string" + }, + "inc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "ninc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "pre": { + "type": "string" + }, + "suf": { + "type": "string" + }, + "gt": { + "type": "number" + }, + "gte": { + "type": "number" + }, + "lt": { + "type": "number" + }, + "lte": { + "type": "number" + }, + "list": { + "type": "string" + } + }, + "type": "object" + } + ] + }, + "tierRequirement": { + "type": "string", + "enum": [ + "advanced", + "critical", + "priority" + ] + }, + "has": { + "items": { + "properties": { + "type": { + "type": "string", + "enum": [ + "cookie", + "domain_environment", + "environment", + "header", + "headers", + "host", + "initial_request_path", + "ip_address", + "method", + "path", + "protocol", + "query", + "region", + "scheme", + "trusted_source" + ] + }, + "key": { + "type": "string" + }, + "value": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "re": { + "type": "string" + }, + "eq": { + "type": "string" + }, + "neq": { + "type": "string" + }, + "inc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "ninc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "pre": { + "type": "string" + }, + "suf": { + "type": "string" + }, + "gt": { + "type": "number" + }, + "gte": { + "type": "number" + }, + "lt": { + "type": "number" + }, + "lte": { + "type": "number" + }, + "list": { + "type": "string" + } + }, + "type": "object" + } + ] + } + }, + "required": [ + "type" + ], + "type": "object" + }, + "type": "array" + }, + "missing": { + "items": { + "properties": { + "type": { + "type": "string", + "enum": [ + "cookie", + "domain_environment", + "environment", + "header", + "headers", + "host", + "initial_request_path", + "ip_address", + "method", + "path", + "protocol", + "query", + "region", + "scheme", + "trusted_source" + ] + }, + "key": { + "type": "string" + }, + "value": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "re": { + "type": "string" + }, + "eq": { + "type": "string" + }, + "neq": { + "type": "string" + }, + "inc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "ninc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "pre": { + "type": "string" + }, + "suf": { + "type": "string" + }, + "gt": { + "type": "number" + }, + "gte": { + "type": "number" + }, + "lt": { + "type": "number" + }, + "lte": { + "type": "number" + }, + "list": { + "type": "string" + } + }, + "type": "object" + } + ] + } + }, + "required": [ + "type" + ], + "type": "object" + }, + "type": "array" + }, + "dest": { + "type": "string" + }, + "status": { + "type": "number" + }, + "handle": { + "type": "string", + "enum": [ + "finalize", + "init" + ] + }, + "mitigate": { + "properties": { + "action": { + "type": "string", + "enum": [ + "bypass", + "challenge", + "deny", + "log", + "rate_limit", + "redirect" + ] + }, + "rule_id": { + "type": "string" + }, + "ttl": { + "type": "number" + }, + "erl": { + "properties": { + "algo": { + "type": "string", + "enum": [ + "fixed_window", + "token_bucket" + ] + }, + "window": { + "type": "number" + }, + "limit": { + "type": "number" + }, + "keys": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "algo", + "keys", + "limit", + "window" + ], + "type": "object" + }, + "log_headers": { + "oneOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "string", + "enum": [ + "*" + ] + } + ] + } + }, + "required": [ + "action", + "rule_id" + ], + "type": "object" + }, + "transforms": { + "items": { + "properties": { + "type": { + "type": "string", + "enum": [ + "request.headers" + ] + }, + "op": { + "type": "string", + "enum": [ + "append" + ] + }, + "target": { + "properties": { + "key": { + "type": "string" + } + }, + "required": [ + "key" + ], + "type": "object" + }, + "args": { + "type": "string" + } + }, + "required": [ + "args", + "op", + "target", + "type" + ], + "type": "object" + }, + "type": "array" + } + }, + "type": "object" + }, + "type": "array" + }, + "rulesets": { + "additionalProperties": { + "properties": { + "action": { + "type": "string", + "enum": [ + "allow", + "bypass", + "challenge", + "deny", + "log", + "rate_limit", + "redirect" + ] + }, + "rateLimit": { + "nullable": true, + "properties": { + "algo": { + "type": "string", + "enum": [ + "fixed_window", + "token_bucket" + ] + }, + "window": { + "type": "number" + }, + "limit": { + "type": "number" + }, + "keys": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "algo", + "keys", + "limit", + "window" + ], + "type": "object" + }, + "redirect": { + "nullable": true, + "properties": { + "location": { + "type": "string" + }, + "permanent": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "location", + "permanent" + ], + "type": "object" + }, + "actionDuration": { + "nullable": true, + "type": "string" + }, + "bypassSystem": { + "nullable": true, + "type": "boolean", + "enum": [ + false, + true, + null + ] + }, + "logHeaders": { + "oneOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "string", + "enum": [ + "*" + ] + } + ] + } + }, + "required": [ + "action" + ], + "type": "object" + }, + "type": "object" + }, + "firewallSeawallEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "ja3Enabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "ja4Enabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "firewallBypassIps": { + "items": { + "type": "string" + }, + "type": "array" + }, + "managedRules": { + "nullable": true, + "properties": { + "vercel_ruleset": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "challenge", + "deny", + "log" + ] + } + }, + "required": [ + "active" + ], + "type": "object" + }, + "traffic_sources": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "challenge", + "deny", + "log" + ] + } + }, + "required": [ + "active" + ], + "type": "object" + }, + "bot_filter": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "challenge", + "deny", + "log" + ] + } + }, + "required": [ + "active" + ], + "type": "object" + }, + "ai_bots": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "challenge", + "deny", + "log" + ] + } + }, + "required": [ + "active" + ], + "type": "object" + }, + "owasp": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "challenge", + "deny", + "log" + ] + } + }, + "required": [ + "active" + ], + "type": "object" + } + }, + "required": [ + "ai_bots", + "bot_filter", + "owasp", + "traffic_sources", + "vercel_ruleset" + ], + "type": "object" + }, + "botIdEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "requestLogsKey": { + "items": { + "type": "string" + }, + "type": "array" + }, + "log_headers": { + "oneOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "string", + "enum": [ + "*" + ] + } + ] + }, + "securityPlus": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "securityPlusMetadata": { + "properties": { + "updatedAt": { + "type": "number" + }, + "firstEnabledAt": { + "type": "number", + "description": "Timestamp when the feature was first enabled. Never changes after initial enablement." + } + }, + "required": [ + "updatedAt" + ], + "type": "object" + }, + "pageIntegrityEnabled": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether Page Integrity is enabled for this project. Used by the metadata service to gate DynamoDB lookups against the page-integrity-inventory table." + } + }, + "type": "object" + }, + "oidcTokenConfig": { + "properties": { + "enabled": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether or not to generate OpenID Connect JSON Web Tokens." + }, + "issuerMode": { + "type": "string", + "enum": [ + "global", + "team" + ], + "description": "- team: `https://oidc.vercel.com/[team_slug]` - global: `https://oidc.vercel.com`" + } + }, + "type": "object" + }, + "tier": { + "type": "string", + "enum": [ + "advanced", + "critical", + "priority" + ] + }, + "abuse": { + "properties": { + "scanner": { + "type": "string" + }, + "history": { + "items": { + "properties": { + "scanner": { + "type": "string" + }, + "reason": { + "type": "string" + }, + "by": { + "type": "string" + }, + "byId": { + "type": "string" + }, + "at": { + "type": "number" + } + }, + "required": [ + "at", + "by", + "byId", + "reason", + "scanner" + ], + "type": "object" + }, + "type": "array" + }, + "updatedAt": { + "type": "number" + }, + "block": { + "properties": { + "action": { + "type": "string", + "enum": [ + "blocked" + ] + }, + "reason": { + "type": "string" + }, + "statusCode": { + "type": "number" + }, + "createdAt": { + "type": "number" + }, + "caseId": { + "type": "string" + }, + "actor": { + "type": "string" + }, + "comment": { + "type": "string" + }, + "ineligibleForAppeal": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "isCascading": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "action", + "createdAt", + "reason", + "statusCode" + ], + "type": "object" + }, + "blockHistory": { + "items": { + "oneOf": [ + { + "properties": { + "action": { + "type": "string", + "enum": [ + "blocked" + ] + }, + "reason": { + "type": "string" + }, + "statusCode": { + "type": "number" + }, + "createdAt": { + "type": "number" + }, + "caseId": { + "type": "string" + }, + "actor": { + "type": "string" + }, + "comment": { + "type": "string" + }, + "ineligibleForAppeal": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "isCascading": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "action", + "createdAt", + "reason", + "statusCode" + ], + "type": "object" + }, + { + "properties": { + "action": { + "type": "string", + "enum": [ + "unblocked" + ] + }, + "createdAt": { + "type": "number" + }, + "caseId": { + "type": "string" + }, + "actor": { + "type": "string" + }, + "comment": { + "type": "string" + }, + "ineligibleForAppeal": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "isCascading": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "action", + "createdAt" + ], + "type": "object" + }, + { + "properties": { + "action": { + "type": "string", + "enum": [ + "route-blocked" + ] + }, + "route": { + "oneOf": [ + { + "properties": { + "src": { + "type": "string" + }, + "status": { + "type": "number" + }, + "expiry": { + "type": "number" + } + }, + "required": [ + "src", + "status" + ], + "type": "object" + }, + { + "properties": { + "has": { + "items": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "header" + ] + }, + "key": { + "type": "string", + "enum": [ + "x-vercel-ip-country" + ] + }, + "value": { + "properties": { + "eq": { + "type": "string" + } + }, + "required": [ + "eq" + ], + "type": "object" + } + }, + "required": [ + "key", + "type", + "value" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "host" + ] + }, + "value": { + "properties": { + "eq": { + "type": "string" + } + }, + "required": [ + "eq" + ], + "type": "object" + } + }, + "required": [ + "type", + "value" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "mitigate": { + "properties": { + "action": { + "type": "string", + "enum": [ + "block_legal_cwc" + ] + } + }, + "required": [ + "action" + ], + "type": "object" + }, + "src": { + "type": "string" + } + }, + "required": [ + "has", + "mitigate" + ], + "type": "object" + } + ] + }, + "reason": { + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "caseId": { + "type": "string" + }, + "actor": { + "type": "string" + }, + "comment": { + "type": "string" + }, + "ineligibleForAppeal": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "isCascading": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "action", + "createdAt", + "reason", + "route" + ], + "type": "object" + }, + { + "properties": { + "action": { + "type": "string", + "enum": [ + "route-unblocked" + ] + }, + "route": { + "oneOf": [ + { + "properties": { + "src": { + "type": "string" + }, + "status": { + "type": "number" + }, + "expiry": { + "type": "number" + } + }, + "required": [ + "src", + "status" + ], + "type": "object" + }, + { + "properties": { + "has": { + "items": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "header" + ] + }, + "key": { + "type": "string", + "enum": [ + "x-vercel-ip-country" + ] + }, + "value": { + "properties": { + "eq": { + "type": "string" + } + }, + "required": [ + "eq" + ], + "type": "object" + } + }, + "required": [ + "key", + "type", + "value" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "host" + ] + }, + "value": { + "properties": { + "eq": { + "type": "string" + } + }, + "required": [ + "eq" + ], + "type": "object" + } + }, + "required": [ + "type", + "value" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "mitigate": { + "properties": { + "action": { + "type": "string", + "enum": [ + "block_legal_cwc" + ] + } + }, + "required": [ + "action" + ], + "type": "object" + }, + "src": { + "type": "string" + } + }, + "required": [ + "has", + "mitigate" + ], + "type": "object" + } + ] + }, + "statusCode": { + "type": "number" + }, + "createdAt": { + "type": "number" + }, + "caseId": { + "type": "string" + }, + "actor": { + "type": "string" + }, + "comment": { + "type": "string" + }, + "ineligibleForAppeal": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "isCascading": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "action", + "createdAt", + "route" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "interstitial": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "interstitialHistory": { + "items": { + "properties": { + "action": { + "type": "string", + "enum": [ + "add-deployment-interstitial", + "add-project-interstitial", + "remove-deployment-interstitial", + "remove-project-interstitial" + ] + }, + "createdAt": { + "type": "number" + }, + "caseId": { + "type": "string" + }, + "reason": { + "type": "string" + }, + "actor": { + "type": "string" + }, + "comment": { + "type": "string" + } + }, + "required": [ + "action", + "createdAt" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "history", + "updatedAt" + ], + "type": "object" + }, + "internalRoutes": { + "items": { + "oneOf": [ + { + "properties": { + "src": { + "type": "string" + }, + "status": { + "type": "number" + }, + "expiry": { + "type": "number" + } + }, + "required": [ + "src", + "status" + ], + "type": "object" + }, + { + "properties": { + "has": { + "items": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "header" + ] + }, + "key": { + "type": "string", + "enum": [ + "x-vercel-ip-country" + ] + }, + "value": { + "properties": { + "eq": { + "type": "string" + } + }, + "required": [ + "eq" + ], + "type": "object" + } + }, + "required": [ + "key", + "type", + "value" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "host" + ] + }, + "value": { + "properties": { + "eq": { + "type": "string" + } + }, + "required": [ + "eq" + ], + "type": "object" + } + }, + "required": [ + "type", + "value" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "mitigate": { + "properties": { + "action": { + "type": "string", + "enum": [ + "block_legal_cwc" + ] + } + }, + "required": [ + "action" + ], + "type": "object" + }, + "src": { + "type": "string" + } + }, + "required": [ + "has", + "mitigate" + ], + "type": "object" + } + ] + }, + "type": "array" + } + }, + "required": [ + "accountId", + "alias", + "deploymentExpiration", + "directoryListing", + "id", + "name", + "nodeVersion", + "resourceConfig", + "serverlessFunctionRegion" + ], + "type": "object" + }, + "type": "array" + }, + { + "properties": { + "projects": { + "items": { + "properties": { + "accountId": { + "type": "string" + }, + "creator": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "user" + ] + }, + "via": { + "nullable": true, + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "app" + ] + }, + "app": { + "properties": { + "id": { + "type": "string", + "description": "The internal ID of the Vercel App backing this principal." + }, + "clientId": { + "type": "string", + "description": "The protocol-facing OAuth client ID. This may differ from {@link id} when Client ID Metadata Documents (CIMD) are used." + } + }, + "required": [ + "id" + ], + "type": "object" + } + }, + "required": [ + "app", + "type" + ], + "type": "object", + "description": "Set when a Vercel App or Integration acts on behalf of a {@link User}. Captures user-consented OAuth delegation that the ACL layer may inspect to evaluate scope restrictions. This is NOT for impersonation or token-exchange provenance — those live on `auth.token`, not on the principal." + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "integration" + ] + }, + "integration": { + "properties": { + "integrationId": { + "type": "string" + }, + "configurationId": { + "type": "string" + } + }, + "required": [ + "configurationId", + "integrationId" + ], + "type": "object" + } + }, + "required": [ + "integration", + "type" + ], + "type": "object", + "description": "Set when a Vercel App or Integration acts on behalf of a {@link User}. Captures user-consented OAuth delegation that the ACL layer may inspect to evaluate scope restrictions. This is NOT for impersonation or token-exchange provenance — those live on `auth.token`, not on the principal." + } + ] + }, + "user": { + "properties": { + "id": { + "type": "string" + } + }, + "required": [ + "id" + ], + "type": "object" + } + }, + "required": [ + "type", + "user", + "via" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "app" + ] + }, + "app": { + "properties": { + "id": { + "type": "string", + "description": "The internal ID of the Vercel App backing this principal." + }, + "clientId": { + "type": "string", + "description": "The protocol-facing OAuth client ID. This may differ from {@link id} when Client ID Metadata Documents (CIMD) are used." + } + }, + "required": [ + "id" + ], + "type": "object" + } + }, + "required": [ + "app", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "integration" + ] + }, + "integration": { + "properties": { + "integrationId": { + "type": "string" + }, + "configurationId": { + "type": "string" + } + }, + "required": [ + "configurationId", + "integrationId" + ], + "type": "object" + } + }, + "required": [ + "integration", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "system" + ] + } + }, + "required": [ + "type" + ], + "type": "object" + } + ] + }, + "alias": { + "items": { + "properties": { + "configuredBy": { + "nullable": true, + "type": "string", + "enum": [ + "A", + "CNAME", + "dns-01", + "http", + null + ] + }, + "configuredChangedAt": { + "nullable": true, + "type": "number" + }, + "createdAt": { + "nullable": true, + "type": "number" + }, + "deployment": { + "nullable": true, + "properties": { + "id": { + "type": "string" + }, + "alias": { + "items": { + "type": "string" + }, + "type": "array" + }, + "aliasAssigned": { + "nullable": true, + "oneOf": [ + { + "type": "number" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + } + ] + }, + "aliasError": { + "nullable": true, + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" + }, + "aliasFinal": { + "nullable": true, + "type": "string" + }, + "automaticAliases": { + "items": { + "type": "string" + }, + "type": "array" + }, + "branchMatcher": { + "properties": { + "type": { + "type": "string", + "enum": [ + "endsWith", + "equals", + "startsWith" + ], + "description": "The type of matching to perform" + }, + "pattern": { + "type": "string", + "description": "The pattern to match against branch names" + } + }, + "required": [ + "pattern", + "type" + ], + "type": "object" + }, + "buildingAt": { + "type": "number" + }, + "builds": { + "items": { + "properties": { + "use": { + "type": "string" + }, + "src": { + "type": "string" + }, + "dest": { + "type": "string" + } + }, + "required": [ + "use" + ], + "type": "object" + }, + "type": "array" + }, + "checksConclusion": { + "type": "string", + "enum": [ + "canceled", + "failed", + "skipped", + "succeeded" + ] + }, + "checksState": { + "type": "string", + "enum": [ + "completed", + "registered", + "running" + ] + }, + "connectBuildsEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "connectConfigurationId": { + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "createdIn": { + "type": "string" + }, + "creator": { + "nullable": true, + "properties": { + "email": { + "type": "string" + }, + "githubLogin": { + "type": "string" + }, + "gitlabLogin": { + "type": "string" + }, + "uid": { + "type": "string" + }, + "username": { + "type": "string" + } + }, + "required": [ + "email", + "uid", + "username" + ], + "type": "object" + }, + "deletedAt": { + "type": "number" + }, + "deploymentHostname": { + "type": "string" + }, + "forced": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "name": { + "type": "string" + }, + "meta": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "monorepoManager": { + "nullable": true, + "type": "string" + }, + "oidcTokenClaims": { + "properties": { + "iss": { + "type": "string" + }, + "sub": { + "type": "string" + }, + "scope": { + "type": "string" + }, + "aud": { + "type": "string" + }, + "owner": { + "type": "string" + }, + "owner_id": { + "type": "string" + }, + "project": { + "type": "string" + }, + "project_id": { + "type": "string" + }, + "environment": { + "type": "string" + }, + "custom_environment_id": { + "type": "string" + }, + "mfe_group_ids": { + "items": { + "type": "string" + }, + "type": "array" + }, + "plan": { + "type": "string" + } + }, + "required": [ + "aud", + "environment", + "iss", + "owner", + "owner_id", + "project", + "project_id", + "scope", + "sub" + ], + "type": "object" + }, + "plan": { + "type": "string", + "enum": [ + "enterprise", + "hobby", + "pro" + ] + }, + "previewCommentsEnabled": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether or not preview comments are enabled for the deployment", + "example": false + }, + "private": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "readyAt": { + "type": "number" + }, + "readyState": { + "type": "string", + "enum": [ + "BLOCKED", + "BUILDING", + "CANCELED", + "ERROR", + "INITIALIZING", + "QUEUED", + "READY" + ] + }, + "readySubstate": { + "type": "string", + "enum": [ + "PROMOTED", + "ROLLING", + "STAGED" + ] + }, + "requestedAt": { + "type": "number" + }, + "target": { + "nullable": true, + "type": "string" + }, + "teamId": { + "nullable": true, + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "LAMBDAS" + ] + }, + "url": { + "type": "string" + }, + "userId": { + "type": "string", + "description": "Present for user creators; omitted for app/integration/system creators." + }, + "withCache": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "createdAt", + "createdIn", + "creator", + "deploymentHostname", + "id", + "name", + "plan", + "private", + "readyState", + "type", + "url" + ], + "type": "object" + }, + "domain": { + "type": "string" + }, + "environment": { + "type": "string", + "enum": [ + "preview", + "production" + ] + }, + "gitBranch": { + "nullable": true, + "type": "string" + }, + "redirect": { + "nullable": true, + "type": "string" + }, + "redirectStatusCode": { + "nullable": true, + "type": "number", + "enum": [ + 301, + 302, + 307, + 308, + null + ] + }, + "target": { + "type": "string", + "enum": [ + "PREVIEW", + "PRODUCTION", + "STAGING" + ] + } + }, + "required": [ + "deployment", + "domain", + "environment", + "target" + ], + "type": "object" + }, + "type": "array" + }, + "analytics": { + "properties": { + "id": { + "type": "string" + }, + "canceledAt": { + "nullable": true, + "type": "number" + }, + "disabledAt": { + "type": "number" + }, + "enabledAt": { + "type": "number" + }, + "paidAt": { + "type": "number" + }, + "sampleRatePercent": { + "nullable": true, + "type": "number" + }, + "spendLimitInDollars": { + "nullable": true, + "type": "number" + } + }, + "required": [ + "disabledAt", + "enabledAt", + "id" + ], + "type": "object" + }, + "appliedCve55182Migration": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "autoExposeSystemEnvs": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "autoAssignCustomDomains": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "autoAssignCustomDomainsUpdatedBy": { + "type": "string" + }, + "buildCommand": { + "nullable": true, + "type": "string" + }, + "commandForIgnoringBuildStep": { + "nullable": true, + "type": "string" + }, + "customerSupportCodeVisibility": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "createdAt": { + "type": "number" + }, + "devCommand": { + "nullable": true, + "type": "string" + }, + "directoryListing": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "deploymentExpiration": { + "properties": { + "expirationDays": { + "type": "number", + "description": "Number of days to keep non-production deployments (mostly preview deployments) before soft deletion." + }, + "expirationDaysProduction": { + "type": "number", + "description": "Number of days to keep production deployments before soft deletion." + }, + "expirationDaysCanceled": { + "type": "number", + "description": "Number of days to keep canceled deployments before soft deletion." + }, + "expirationDaysErrored": { + "type": "number", + "description": "Number of days to keep errored deployments before soft deletion." + }, + "deploymentsToKeep": { + "type": "number", + "description": "Minimum number of production deployments to keep for this project, even if they are over the production expiration limit." + } + }, + "type": "object", + "description": "Retention policies for deployments. These are enforced at the project level, but we also maintain an instance of this at the team level as a default policy that gets applied to new projects." + }, + "installCommand": { + "nullable": true, + "type": "string" + }, + "ipBuckets": { + "items": { + "properties": { + "bucket": { + "type": "string" + }, + "default": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "supportUntil": { + "type": "number" + } + }, + "required": [ + "bucket" + ], + "type": "object" + }, + "type": "array" + }, + "env": { + "items": { + "properties": { + "target": { + "oneOf": [ + { + "items": { + "type": "string", + "enum": [ + "development", + "development", + "preview", + "preview", + "production" + ] + }, + "type": "array" + }, + { + "type": "string", + "enum": [ + "development", + "development", + "preview", + "preview", + "production" + ] + } + ] + }, + "type": { + "type": "string", + "enum": [ + "encrypted", + "plain", + "secret", + "sensitive", + "system" + ] + }, + "sunsetSecretId": { + "type": "string", + "description": "This is used to identify variables that have been migrated from type secret to sensitive." + }, + "legacyValue": { + "type": "string", + "description": "Legacy now-encryption ciphertext, present after migration swaps value/vsmValue" + }, + "decrypted": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "value": { + "type": "string" + }, + "vsmValue": { + "type": "string" + }, + "id": { + "type": "string" + }, + "key": { + "type": "string" + }, + "configurationId": { + "nullable": true, + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "updatedAt": { + "type": "number" + }, + "createdBy": { + "nullable": true, + "type": "string" + }, + "updatedBy": { + "nullable": true, + "type": "string" + }, + "gitBranch": { + "type": "string" + }, + "visibility": { + "type": "string", + "enum": [ + "config", + "secret" + ], + "description": "User-facing config/secret model. When set, authoritative for new code paths when the env-var-config-secret-ui flag is enabled. Legacy rows omit this field; legacy rows omit it and callers fall back to existing `type` behavior." + }, + "edgeConfigId": { + "nullable": true, + "type": "string" + }, + "edgeConfigTokenId": { + "nullable": true, + "type": "string" + }, + "contentHint": { + "nullable": true, + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "redis-url" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "redis-rest-api-url" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "redis-rest-api-token" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "redis-rest-api-read-only-token" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "blob-read-write-token" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "blob-store-id" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "blob-webhook-public-key" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-url" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-url-non-pooling" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-prisma-url" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-user" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-host" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-password" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-database" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-url-no-ssl" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "integration-store-secret" + ] + }, + "storeId": { + "type": "string" + }, + "integrationId": { + "type": "string" + }, + "integrationProductId": { + "type": "string" + }, + "integrationConfigurationId": { + "type": "string" + } + }, + "required": [ + "integrationConfigurationId", + "integrationId", + "integrationProductId", + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "flags-connection-string" + ] + }, + "projectId": { + "type": "string" + } + }, + "required": [ + "projectId", + "type" + ], + "type": "object" + } + ] + }, + "internalContentHint": { + "nullable": true, + "properties": { + "type": { + "type": "string", + "enum": [ + "flags-secret" + ] + }, + "encryptedValue": { + "type": "string", + "description": "Contains the `value` of the env variable, encrypted with a special key to make decryption possible in the subscriber Lambda." + } + }, + "required": [ + "encryptedValue", + "type" + ], + "type": "object", + "description": "Similar to `contentHints`, but should not be exposed to the user." + }, + "comment": { + "type": "string" + }, + "customEnvironmentIds": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "key", + "type", + "value" + ], + "type": "object" + }, + "type": "array" + }, + "framework": { + "nullable": true, + "type": "string", + "enum": [ + "actix-web", + "angular", + "ash", + "astro", + "axum", + "blitzjs", + "brunch", + "bun", + "container", + "create-react-app", + "django", + "docusaurus", + "docusaurus-2", + "dojo", + "eleventy", + "elysia", + "ember", + "eve", + "express", + "factory-eve", + "fastapi", + "fasthtml", + "fastify", + "flask", + "gatsby", + "go", + "gridsome", + "h3", + "hexo", + "hono", + "hugo", + "hydrogen", + "ionic-angular", + "ionic-react", + "jekyll", + "koa", + "mastra", + "middleman", + "nestjs", + "nextjs", + "nitro", + "node", + "nuxtjs", + "parcel", + "polymer", + "preact", + "python", + "react-router", + "redwoodjs", + "remix", + "ruby", + "rust", + "saber", + "sanity", + "sanity-v2", + "sapper", + "scully", + "services", + "solidstart", + "solidstart-1", + "stencil", + "storybook", + "svelte", + "sveltekit", + "sveltekit-1", + "tanstack-start", + "tanstack-start-lovable", + "umijs", + "vite", + "vitepress", + "vue", + "vuepress", + "xmcp", + "zola", + null + ] + }, + "gitForkProtection": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "id": { + "type": "string" + }, + "latestDeployments": { + "items": { + "properties": { + "id": { + "type": "string" + }, + "alias": { + "items": { + "type": "string" + }, + "type": "array" + }, + "aliasAssigned": { + "nullable": true, + "oneOf": [ + { + "type": "number" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + } + ] + }, + "aliasError": { + "nullable": true, + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" + }, + "aliasFinal": { + "nullable": true, + "type": "string" + }, + "automaticAliases": { + "items": { + "type": "string" + }, + "type": "array" + }, + "branchMatcher": { + "properties": { + "type": { + "type": "string", + "enum": [ + "endsWith", + "equals", + "startsWith" + ], + "description": "The type of matching to perform" + }, + "pattern": { + "type": "string", + "description": "The pattern to match against branch names" + } + }, + "required": [ + "pattern", + "type" + ], + "type": "object" + }, + "buildingAt": { + "type": "number" + }, + "builds": { + "items": { + "properties": { + "use": { + "type": "string" + }, + "src": { + "type": "string" + }, + "dest": { + "type": "string" + } + }, + "required": [ + "use" + ], + "type": "object" + }, + "type": "array" + }, + "checksConclusion": { + "type": "string", + "enum": [ + "canceled", + "failed", + "skipped", + "succeeded" + ] + }, + "checksState": { + "type": "string", + "enum": [ + "completed", + "registered", + "running" + ] + }, + "connectBuildsEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "connectConfigurationId": { + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "createdIn": { + "type": "string" + }, + "creator": { + "nullable": true, + "properties": { + "email": { + "type": "string" + }, + "githubLogin": { + "type": "string" + }, + "gitlabLogin": { + "type": "string" + }, + "uid": { + "type": "string" + }, + "username": { + "type": "string" + } + }, + "required": [ + "email", + "uid", + "username" + ], + "type": "object" + }, + "deletedAt": { + "type": "number" + }, + "deploymentHostname": { + "type": "string" + }, + "forced": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "name": { + "type": "string" + }, + "meta": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "monorepoManager": { + "nullable": true, + "type": "string" + }, + "oidcTokenClaims": { + "properties": { + "iss": { + "type": "string" + }, + "sub": { + "type": "string" + }, + "scope": { + "type": "string" + }, + "aud": { + "type": "string" + }, + "owner": { + "type": "string" + }, + "owner_id": { + "type": "string" + }, + "project": { + "type": "string" + }, + "project_id": { + "type": "string" + }, + "environment": { + "type": "string" + }, + "custom_environment_id": { + "type": "string" + }, + "mfe_group_ids": { + "items": { + "type": "string" + }, + "type": "array" + }, + "plan": { + "type": "string" + } + }, + "required": [ + "aud", + "environment", + "iss", + "owner", + "owner_id", + "project", + "project_id", + "scope", + "sub" + ], + "type": "object" + }, + "plan": { + "type": "string", + "enum": [ + "enterprise", + "hobby", + "pro" + ] + }, + "previewCommentsEnabled": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether or not preview comments are enabled for the deployment", + "example": false + }, + "private": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "readyAt": { + "type": "number" + }, + "readyState": { + "type": "string", + "enum": [ + "BLOCKED", + "BUILDING", + "CANCELED", + "ERROR", + "INITIALIZING", + "QUEUED", + "READY" + ] + }, + "readySubstate": { + "type": "string", + "enum": [ + "PROMOTED", + "ROLLING", + "STAGED" + ] + }, + "requestedAt": { + "type": "number" + }, + "target": { + "nullable": true, + "type": "string" + }, + "teamId": { + "nullable": true, + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "LAMBDAS" + ] + }, + "url": { + "type": "string" + }, + "userId": { + "type": "string", + "description": "Present for user creators; omitted for app/integration/system creators." + }, + "withCache": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "createdAt", + "createdIn", + "creator", + "deploymentHostname", + "id", + "name", + "plan", + "private", + "readyState", + "type", + "url" + ], + "type": "object" + }, + "type": "array" + }, + "link": { + "oneOf": [ + { + "properties": { + "org": { + "type": "string" + }, + "repoOwnerId": { + "type": "number", + "description": "A new field, should be included in all new project links, is being added just in time when a deployment is created. This is needed for Protected Git scopes." + }, + "repo": { + "type": "string" + }, + "repoId": { + "type": "number" + }, + "type": { + "type": "string", + "enum": [ + "github" + ] + }, + "createdAt": { + "type": "number" + }, + "deployHooks": { + "items": { + "properties": { + "createdAt": { + "type": "number" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "ref": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "ref", + "url" + ], + "type": "object" + }, + "type": "array" + }, + "gitCredentialId": { + "type": "string" + }, + "updatedAt": { + "type": "number" + }, + "sourceless": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "productionBranch": { + "type": "string" + } + }, + "required": [ + "deployHooks", + "gitCredentialId", + "org", + "productionBranch", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "github-limited" + ] + }, + "repo": { + "type": "string" + }, + "repoId": { + "type": "number" + }, + "createdAt": { + "type": "number" + }, + "updatedAt": { + "type": "number" + }, + "org": { + "type": "string" + }, + "repoOwnerId": { + "type": "number", + "description": "A new field, should be included in all new project links, is being added just in time when a deployment is created. This is needed for Protected Git scopes." + }, + "deployHooks": { + "items": { + "properties": { + "createdAt": { + "type": "number" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "ref": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "ref", + "url" + ], + "type": "object" + }, + "type": "array" + }, + "gitCredentialId": { + "type": "string" + }, + "sourceless": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "productionBranch": { + "type": "string" + } + }, + "required": [ + "deployHooks", + "gitCredentialId", + "org", + "productionBranch", + "type" + ], + "type": "object" + }, + { + "properties": { + "org": { + "type": "string" + }, + "repoOwnerId": { + "type": "number", + "description": "A new field, should be included in all new project links, is being added just in time when a deployment is created. This is needed for Protected Git scopes." + }, + "repo": { + "type": "string" + }, + "repoId": { + "type": "number" + }, + "type": { + "type": "string", + "enum": [ + "github-custom-host" + ] + }, + "host": { + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "deployHooks": { + "items": { + "properties": { + "createdAt": { + "type": "number" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "ref": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "ref", + "url" + ], + "type": "object" + }, + "type": "array" + }, + "gitCredentialId": { + "type": "string" + }, + "updatedAt": { + "type": "number" + }, + "sourceless": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "productionBranch": { + "type": "string" + } + }, + "required": [ + "deployHooks", + "gitCredentialId", + "host", + "org", + "productionBranch", + "type" + ], + "type": "object" + }, + { + "properties": { + "projectId": { + "type": "string" + }, + "projectName": { + "type": "string" + }, + "projectNameWithNamespace": { + "type": "string" + }, + "projectNamespace": { + "type": "string" + }, + "projectOwnerId": { + "type": "number", + "description": "A new field, should be included in all new project links, is being added just in time when a deployment is created. This is needed for Protected Git scopes. This is the id of the top level group that a namespace belongs to. Gitlab supports group nesting (up to 20 levels)." + }, + "projectUrl": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "gitlab" + ] + }, + "createdAt": { + "type": "number" + }, + "deployHooks": { + "items": { + "properties": { + "createdAt": { + "type": "number" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "ref": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "ref", + "url" + ], + "type": "object" + }, + "type": "array" + }, + "gitCredentialId": { + "type": "string" + }, + "updatedAt": { + "type": "number" + }, + "sourceless": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "productionBranch": { + "type": "string" + } + }, + "required": [ + "deployHooks", + "gitCredentialId", + "productionBranch", + "projectId", + "projectName", + "projectNameWithNamespace", + "projectNamespace", + "projectUrl", + "type" + ], + "type": "object" + }, + { + "properties": { + "name": { + "type": "string" + }, + "slug": { + "type": "string" + }, + "owner": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "bitbucket" + ] + }, + "uuid": { + "type": "string" + }, + "workspaceUuid": { + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "deployHooks": { + "items": { + "properties": { + "createdAt": { + "type": "number" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "ref": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "ref", + "url" + ], + "type": "object" + }, + "type": "array" + }, + "gitCredentialId": { + "type": "string" + }, + "updatedAt": { + "type": "number" + }, + "sourceless": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "productionBranch": { + "type": "string" + } + }, + "required": [ + "deployHooks", + "gitCredentialId", + "name", + "owner", + "productionBranch", + "slug", + "type", + "uuid", + "workspaceUuid" + ], + "type": "object" + }, + { + "properties": { + "org": { + "type": "string" + }, + "repo": { + "type": "string" + }, + "repoId": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "vercel" + ] + }, + "createdAt": { + "type": "number" + }, + "deployHooks": { + "items": { + "properties": { + "createdAt": { + "type": "number" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "ref": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "ref", + "url" + ], + "type": "object" + }, + "type": "array" + }, + "gitCredentialId": { + "type": "string" + }, + "updatedAt": { + "type": "number" + }, + "sourceless": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "productionBranch": { + "type": "string" + } + }, + "required": [ + "deployHooks", + "gitCredentialId", + "org", + "productionBranch", + "repo", + "repoId", + "type" + ], + "type": "object" + }, + { + "properties": { + "org": { + "type": "string" + }, + "repo": { + "type": "string" + }, + "repoId": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "v0" + ] + }, + "createdAt": { + "type": "number" + }, + "deployHooks": { + "items": { + "properties": { + "createdAt": { + "type": "number" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "ref": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "ref", + "url" + ], + "type": "object" + }, + "type": "array" + }, + "gitCredentialId": { + "type": "string" + }, + "updatedAt": { + "type": "number" + }, + "sourceless": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "productionBranch": { + "type": "string" + } + }, + "required": [ + "deployHooks", + "gitCredentialId", + "org", + "productionBranch", + "repo", + "repoId", + "type" + ], + "type": "object" + }, + { + "properties": { + "owner": { + "type": "string", + "description": "Owner (namespace) slug, e.g. `acme`." + }, + "repo": { + "type": "string" + }, + "repoId": { + "type": "string", + "description": "Origin repository id." + }, + "ownerId": { + "type": "string", + "description": "Origin namespace id (`ns_…`) of the owner." + }, + "type": { + "type": "string", + "enum": [ + "cursor-origin" + ] + }, + "createdAt": { + "type": "number" + }, + "deployHooks": { + "items": { + "properties": { + "createdAt": { + "type": "number" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "ref": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "ref", + "url" + ], + "type": "object" + }, + "type": "array" + }, + "gitCredentialId": { + "type": "string" + }, + "updatedAt": { + "type": "number" + }, + "sourceless": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "productionBranch": { + "type": "string" + } + }, + "required": [ + "deployHooks", + "gitCredentialId", + "owner", + "ownerId", + "productionBranch", + "repo", + "repoId", + "type" + ], + "type": "object" + } + ] + }, + "name": { + "type": "string" + }, + "nodeVersion": { + "type": "string", + "enum": [ + "10.x", + "12.x", + "14.x", + "16.x", + "18.x", + "20.x", + "22.x", + "24.x", + "8.10.x" + ] + }, + "outputDirectory": { + "nullable": true, + "type": "string" + }, + "passwordProtection": { + "nullable": true, + "type": "object" + }, + "passport": { + "nullable": true, + "properties": { + "deploymentType": { + "type": "string", + "enum": [ + "all", + "all_except_custom_domains", + "preview", + "prod_deployment_urls_and_all_previews" + ] + }, + "connectorId": { + "type": "string" + } + }, + "required": [ + "connectorId", + "deploymentType" + ], + "type": "object" + }, + "resourceConfig": { + "properties": { + "elasticConcurrencyEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "fluid": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "functionDefaultRegions": { + "items": { + "type": "string" + }, + "type": "array" + }, + "functionDefaultTimeout": { + "type": "number" + }, + "functionDefaultMemoryType": { + "type": "string", + "enum": [ + "performance", + "performance_xl", + "standard", + "standard_legacy" + ] + }, + "functionZeroConfigFailover": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "buildMachineType": { + "type": "string", + "enum": [ + "basic", + "enhanced", + "standard", + "turbo" + ] + }, + "buildMachineSelection": { + "type": "string", + "enum": [ + "elastic", + "fixed" + ] + }, + "buildMachineElasticLastUpdated": { + "type": "number" + }, + "buildMachineElasticReason": { + "type": "string", + "enum": [ + "basic-floor", + "build-timeout-failure", + "enospc-failure", + "enterprise-floor", + "high-peak-disk", + "high-peak-memory", + "long-build-duration", + "oom-failure", + "short-build-duration", + "sustained-high-cpu" + ] + }, + "isNSNBDisabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "buildQueue": { + "properties": { + "configuration": { + "type": "string", + "enum": [ + "SKIP_NAMESPACE_QUEUE", + "WAIT_FOR_NAMESPACE_QUEUE" + ] + } + }, + "type": "object" + }, + "enableFunctionsBeta": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "type": "object", + "required": [ + "functionDefaultRegions" + ] + }, + "rollingRelease": { + "nullable": true, + "properties": { + "target": { + "type": "string", + "description": "The environment that the release targets, currently only supports production. Adding in case we want to configure with alias groups or custom environments.", + "example": "production" + }, + "stages": { + "nullable": true, + "items": { + "properties": { + "targetPercentage": { + "type": "number", + "description": "The percentage of traffic to serve to the canary deployment (0-100)", + "example": 25 + }, + "requireApproval": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether or not this stage requires manual approval to proceed", + "example": false + }, + "duration": { + "type": "number", + "description": "Duration in minutes for automatic advancement to the next stage", + "example": 600 + }, + "linearShift": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether to linearly shift traffic over the duration of this stage", + "example": false + } + }, + "required": [ + "targetPercentage" + ], + "type": "object", + "description": "An array of all the stages required during a deployment release. Each stage defines a target percentage and advancement rules. The final stage must always have targetPercentage: 100." + }, + "type": "array", + "description": "An array of all the stages required during a deployment release. Each stage defines a target percentage and advancement rules. The final stage must always have targetPercentage: 100." + }, + "canaryResponseHeader": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether the request served by a canary deployment should return a header indicating a canary was served. Defaults to `false` when omitted.", + "example": false + }, + "gate": { + "properties": { + "enabled": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether automated gating is enabled for this project's rollouts." + }, + "checks": { + "items": { + "properties": { + "type": { + "type": "string", + "enum": [ + "error-rate-5xx" + ], + "description": "The metric this check evaluates." + }, + "minSampleSize": { + "type": "number", + "description": "Minimum number of requests required in the window before the check can fail. Below this, the check is inconclusive rather than failing, so low-traffic stages don't gate on noise. Defaults to `100` when omitted.", + "example": 100 + }, + "excludeStatusCodes": { + "items": { + "type": "number" + }, + "type": "array", + "description": "Response status codes to ignore entirely — dropped from both the numerator (errors) and the denominator (total requests). Defaults to `[]` when omitted.", + "example": [ + 503 + ] + }, + "excludePaths": { + "items": { + "type": "string" + }, + "type": "array", + "description": "Request paths to ignore entirely — dropped from both the numerator (errors) and the denominator (total requests). Matched exactly against the request path with any query string removed; no prefix or glob matching. Defaults to `[]` when omitted.", + "example": [ + "/api/health" + ] + }, + "ingestWatermarkSeconds": { + "type": "number", + "description": "Seconds of ingest lag to allow for: the query's upper bound is `now() - this value`, so the check never reads a window that is still filling. Defaults to `30` when omitted.", + "example": 30 + } + }, + "required": [ + "type" + ], + "type": "object", + "description": "The checks to evaluate. An empty array means nothing is evaluated." + }, + "type": "array", + "description": "The checks to evaluate. An empty array means nothing is evaluated." + }, + "failureThreshold": { + "type": "number", + "description": "How many failing evaluations within {@link windowSize} trip the gate. Defaults to `3` when omitted.", + "example": 3 + }, + "windowSize": { + "type": "number", + "description": "How many of the most recent evaluations {@link failureThreshold} is counted against. Defaults to `5` when omitted.", + "example": 5 + }, + "action": { + "type": "string", + "enum": [ + "pause", + "rollback" + ], + "description": "What to do when the gate trips: pause the rollout, or roll it back." + }, + "dryRun": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "When true, a tripped gate is only reported — {@link action} is not taken." + } + }, + "required": [ + "action", + "checks", + "dryRun", + "enabled" + ], + "type": "object", + "description": "Automated gating configuration. Omitted (the default) means no gating is configured, which is equivalent to `enabled: false`." + } + }, + "required": [ + "target" + ], + "type": "object", + "description": "Project-level rolling release configuration that defines how deployments should be gradually rolled out" + }, + "rootDirectory": { + "nullable": true, + "type": "string" + }, + "serverlessFunctionRegion": { + "type": "string" + }, + "serverlessFunctionZeroConfigFailover": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "speedInsights": { + "properties": { + "id": { + "type": "string" + }, + "enabledAt": { + "type": "number" + }, + "disabledAt": { + "type": "number" + }, + "canceledAt": { + "type": "number" + }, + "hasData": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "dataReceivedAt": { + "type": "number", + "description": "When the first free (not Speed Insights Plus) production data point was observed, in ms. Set once by subscriber-analytics-events; projects that already had data before this field shipped get it backfilled on their next batch, so it reads \"first free data point observed\", not necessarily \"first ever\"." + }, + "paidAt": { + "type": "number" + } + }, + "required": [ + "id" + ], + "type": "object" + }, + "skipGitConnectDuringLink": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "sourceFilesOutsideRootDirectory": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "ssoProtection": { + "nullable": true, + "properties": { + "deploymentType": { + "type": "string", + "enum": [ + "all", + "all_except_custom_domains", + "preview", + "prod_deployment_urls_and_all_previews" + ] + }, + "cve55182MigrationAppliedFrom": { + "nullable": true, + "type": "string", + "enum": [ + "all", + "all_except_custom_domains", + "preview", + "prod_deployment_urls_and_all_previews", + null + ] + }, + "april2026SecurityIncidentMigrationAppliedFrom": { + "nullable": true, + "type": "string", + "enum": [ + "all", + "all_except_custom_domains", + "preview", + "prod_deployment_urls_and_all_previews", + null + ] + } + }, + "required": [ + "deploymentType" + ], + "type": "object" + }, + "targets": { + "additionalProperties": { + "nullable": true, + "properties": { + "id": { + "type": "string" + }, + "alias": { + "items": { + "type": "string" + }, + "type": "array" + }, + "aliasAssigned": { + "nullable": true, + "oneOf": [ + { + "type": "number" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + } + ] + }, + "aliasError": { + "nullable": true, + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" + }, + "aliasFinal": { + "nullable": true, + "type": "string" + }, + "automaticAliases": { + "items": { + "type": "string" + }, + "type": "array" + }, + "branchMatcher": { + "properties": { + "type": { + "type": "string", + "enum": [ + "endsWith", + "equals", + "startsWith" + ], + "description": "The type of matching to perform" + }, + "pattern": { + "type": "string", + "description": "The pattern to match against branch names" + } + }, + "required": [ + "pattern", + "type" + ], + "type": "object" + }, + "buildingAt": { + "type": "number" + }, + "builds": { + "items": { + "properties": { + "use": { + "type": "string" + }, + "src": { + "type": "string" + }, + "dest": { + "type": "string" + } + }, + "required": [ + "use" + ], + "type": "object" + }, + "type": "array" + }, + "checksConclusion": { + "type": "string", + "enum": [ + "canceled", + "failed", + "skipped", + "succeeded" + ] + }, + "checksState": { + "type": "string", + "enum": [ + "completed", + "registered", + "running" + ] + }, + "connectBuildsEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "connectConfigurationId": { + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "createdIn": { + "type": "string" + }, + "creator": { + "nullable": true, + "properties": { + "email": { + "type": "string" + }, + "githubLogin": { + "type": "string" + }, + "gitlabLogin": { + "type": "string" + }, + "uid": { + "type": "string" + }, + "username": { + "type": "string" + } + }, + "required": [ + "email", + "uid", + "username" + ], + "type": "object" + }, + "deletedAt": { + "type": "number" + }, + "deploymentHostname": { + "type": "string" + }, + "forced": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "name": { + "type": "string" + }, + "meta": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "monorepoManager": { + "nullable": true, + "type": "string" + }, + "oidcTokenClaims": { + "properties": { + "iss": { + "type": "string" + }, + "sub": { + "type": "string" + }, + "scope": { + "type": "string" + }, + "aud": { + "type": "string" + }, + "owner": { + "type": "string" + }, + "owner_id": { + "type": "string" + }, + "project": { + "type": "string" + }, + "project_id": { + "type": "string" + }, + "environment": { + "type": "string" + }, + "custom_environment_id": { + "type": "string" + }, + "mfe_group_ids": { + "items": { + "type": "string" + }, + "type": "array" + }, + "plan": { + "type": "string" + } + }, + "required": [ + "aud", + "environment", + "iss", + "owner", + "owner_id", + "project", + "project_id", + "scope", + "sub" + ], + "type": "object" + }, + "plan": { + "type": "string", + "enum": [ + "enterprise", + "hobby", + "pro" + ] + }, + "previewCommentsEnabled": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether or not preview comments are enabled for the deployment", + "example": false + }, + "private": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "readyAt": { + "type": "number" + }, + "readyState": { + "type": "string", + "enum": [ + "BLOCKED", + "BUILDING", + "CANCELED", + "ERROR", + "INITIALIZING", + "QUEUED", + "READY" + ] + }, + "readySubstate": { + "type": "string", + "enum": [ + "PROMOTED", + "ROLLING", + "STAGED" + ] + }, + "requestedAt": { + "type": "number" + }, + "target": { + "nullable": true, + "type": "string" + }, + "teamId": { + "nullable": true, + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "LAMBDAS" + ] + }, + "url": { + "type": "string" + }, + "userId": { + "type": "string", + "description": "Present for user creators; omitted for app/integration/system creators." + }, + "withCache": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "createdAt", + "createdIn", + "creator", + "deploymentHostname", + "id", + "name", + "plan", + "private", + "readyState", + "type", + "url" + ], + "type": "object" + }, + "type": "object" + }, + "transferCompletedAt": { + "type": "number" + }, + "transferStartedAt": { + "type": "number" + }, + "transferToAccountId": { + "type": "string" + }, + "transferredFromAccountId": { + "type": "string" + }, + "trustedSources": { + "nullable": true, + "properties": { + "enableVercelCiSameRepository": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Allow same-team Vercel CI access to preview deployments built from the CI run's repository, using the deployment source rather than the current project repository link. Defaults to enabled when not stored; omitted or null Trusted Sources updates preserve the stored value." + }, + "projects": { + "additionalProperties": { + "properties": { + "label": { + "type": "string" + }, + "customAllow": { + "items": { + "properties": { + "from": { + "oneOf": [ + { + "properties": { + "slugs": { + "items": { + "type": "string" + }, + "type": "array", + "description": "System environment slugs (`production`, `preview`) and/or custom environment slugs defined on the referenced project." + }, + "preset": { + "type": "string", + "enum": [ + "all-custom" + ] + } + }, + "required": [ + "slugs" + ], + "type": "object", + "description": "The source envs on the trusted project that are allowed to access `to`." + }, + { + "properties": { + "slugs": { + "items": { + "type": "string" + }, + "type": "array", + "description": "System environment slugs (`production`, `preview`) and/or custom environment slugs defined on the referenced project." + }, + "preset": { + "type": "string", + "enum": [ + "all-custom" + ] + } + }, + "required": [ + "preset" + ], + "type": "object", + "description": "The source envs on the trusted project that are allowed to access `to`." + } + ] + }, + "to": { + "oneOf": [ + { + "properties": { + "slugs": { + "items": { + "type": "string" + }, + "type": "array", + "description": "System environment slugs (`production`, `preview`) and/or custom environment slugs defined on the referenced project." + }, + "preset": { + "type": "string", + "enum": [ + "all-custom" + ] + } + }, + "required": [ + "slugs" + ], + "type": "object", + "description": "The target envs on the current project that may be accessed." + }, + { + "properties": { + "slugs": { + "items": { + "type": "string" + }, + "type": "array", + "description": "System environment slugs (`production`, `preview`) and/or custom environment slugs defined on the referenced project." + }, + "preset": { + "type": "string", + "enum": [ + "all-custom" + ] + } + }, + "required": [ + "preset" + ], + "type": "object", + "description": "The target envs on the current project that may be accessed." + } + ] + } + }, + "required": [ + "from", + "to" + ], + "type": "object", + "description": "Optional overrides for the default same-env-by-slug matching. Provide explicit rules to allow cross-env access or presets." + }, + "type": "array", + "description": "Optional overrides for the default same-env-by-slug matching. Provide explicit rules to allow cross-env access or presets." + } + }, + "type": "object" + }, + "type": "object" + }, + "oidcProviders": { + "additionalProperties": { + "items": { + "properties": { + "to": { + "oneOf": [ + { + "properties": { + "slugs": { + "items": { + "type": "string" + }, + "type": "array", + "description": "System environment slugs (`production`, `preview`) and/or custom environment slugs defined on the referenced project." + }, + "preset": { + "type": "string", + "enum": [ + "all-custom" + ] + } + }, + "required": [ + "slugs" + ], + "type": "object", + "description": "The target envs on the current project that may be accessed." + }, + { + "properties": { + "slugs": { + "items": { + "type": "string" + }, + "type": "array", + "description": "System environment slugs (`production`, `preview`) and/or custom environment slugs defined on the referenced project." + }, + "preset": { + "type": "string", + "enum": [ + "all-custom" + ] + } + }, + "required": [ + "preset" + ], + "type": "object", + "description": "The target envs on the current project that may be accessed." + } + ] + }, + "label": { + "type": "string" + }, + "claims": { + "additionalProperties": { + "items": { + "type": "string" + }, + "type": "array" + }, + "type": "object" + } + }, + "required": [ + "claims", + "to" + ], + "type": "object" + }, + "type": "array" + }, + "type": "object" + } + }, + "type": "object" + }, + "updatedAt": { + "type": "number" + }, + "live": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "hasActiveBranches": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "gitComments": { + "properties": { + "onPullRequest": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether the Vercel bot should comment on PRs" + }, + "onCommit": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether the Vercel bot should comment on commits" + } + }, + "required": [ + "onCommit", + "onPullRequest" + ], + "type": "object" + }, + "gitProviderOptions": { + "properties": { + "createDeployments": { + "type": "string", + "enum": [ + "disabled", + "enabled" + ], + "description": "Whether the Vercel bot should automatically create GitHub deployments https://docs.github.com/en/rest/deployments/deployments#about-deployments NOTE: repository-dispatch events should be used instead" + }, + "disableRepositoryDispatchEvents": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether the Vercel bot should not automatically create GitHub repository-dispatch events on deployment events. https://vercel.com/docs/git/vercel-for-github#repository-dispatch-events - `true`: disable repository-dispatch events for this project (explicit override of the team setting). - `false`: enable repository-dispatch events for this project (explicit override of the team setting). - absent: inherit from `team.disableRepositoryDispatchEvents`." + }, + "requireVerifiedCommits": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether the project requires commits to be signed \u0026 verified before deployments will be created. - `true`: require verified commits for this project (explicit override of the team setting). - `false`: do not require verified commits (explicit override of the team setting). - absent: inherit from `team.requireVerifiedCommits`." + }, + "gitCommitStatus": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether Vercel should post commit statuses for this project. When omitted, commit statuses remain enabled." + }, + "consolidatedGitCommitStatus": { + "properties": { + "enabled": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether consolidated commit status is enabled." + }, + "propagateFailures": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether to propagate individual deployment failures to the consolidated status." + } + }, + "required": [ + "enabled", + "propagateFailures" + ], + "type": "object", + "description": "Configuration for consolidated git commit status reporting. When enabled, Vercel will post a single consolidated commit status instead of individual statuses for each deployment." + } + }, + "required": [ + "createDeployments" + ], + "type": "object" + }, + "paused": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "webAnalytics": { + "properties": { + "id": { + "type": "string" + }, + "disabledAt": { + "type": "number" + }, + "canceledAt": { + "type": "number" + }, + "enabledAt": { + "type": "number" + }, + "hasData": { + "type": "boolean", + "enum": [ + true + ] + } + }, + "required": [ + "id" + ], + "type": "object" + }, + "security": { + "properties": { + "attackModeEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "attackModeUpdatedAt": { + "type": "number" + }, + "firewallEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "firewallUpdatedAt": { + "type": "number" + }, + "attackModeActiveUntil": { + "nullable": true, + "type": "number" + }, + "firewallConfigVersion": { + "type": "number" + }, + "firewallRoutes": { + "items": { + "properties": { + "src": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "re": { + "type": "string" + }, + "eq": { + "type": "string" + }, + "neq": { + "type": "string" + }, + "inc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "ninc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "pre": { + "type": "string" + }, + "suf": { + "type": "string" + }, + "gt": { + "type": "number" + }, + "gte": { + "type": "number" + }, + "lt": { + "type": "number" + }, + "lte": { + "type": "number" + }, + "list": { + "type": "string" + } + }, + "type": "object" + } + ] + }, + "tierRequirement": { + "type": "string", + "enum": [ + "advanced", + "critical", + "priority" + ] + }, + "has": { + "items": { + "properties": { + "type": { + "type": "string", + "enum": [ + "cookie", + "domain_environment", + "environment", + "header", + "headers", + "host", + "initial_request_path", + "ip_address", + "method", + "path", + "protocol", + "query", + "region", + "scheme", + "trusted_source" + ] + }, + "key": { + "type": "string" + }, + "value": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "re": { + "type": "string" + }, + "eq": { + "type": "string" + }, + "neq": { + "type": "string" + }, + "inc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "ninc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "pre": { + "type": "string" + }, + "suf": { + "type": "string" + }, + "gt": { + "type": "number" + }, + "gte": { + "type": "number" + }, + "lt": { + "type": "number" + }, + "lte": { + "type": "number" + }, + "list": { + "type": "string" + } + }, + "type": "object" + } + ] + } + }, + "required": [ + "type" + ], + "type": "object" + }, + "type": "array" + }, + "missing": { + "items": { + "properties": { + "type": { + "type": "string", + "enum": [ + "cookie", + "domain_environment", + "environment", + "header", + "headers", + "host", + "initial_request_path", + "ip_address", + "method", + "path", + "protocol", + "query", + "region", + "scheme", + "trusted_source" + ] + }, + "key": { + "type": "string" + }, + "value": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "re": { + "type": "string" + }, + "eq": { + "type": "string" + }, + "neq": { + "type": "string" + }, + "inc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "ninc": { + "items": { + "type": "string" + }, + "type": "array" + }, + "pre": { + "type": "string" + }, + "suf": { + "type": "string" + }, + "gt": { + "type": "number" + }, + "gte": { + "type": "number" + }, + "lt": { + "type": "number" + }, + "lte": { + "type": "number" + }, + "list": { + "type": "string" + } + }, + "type": "object" + } + ] + } + }, + "required": [ + "type" + ], + "type": "object" + }, + "type": "array" + }, + "dest": { + "type": "string" + }, + "status": { + "type": "number" + }, + "handle": { + "type": "string", + "enum": [ + "finalize", + "init" + ] + }, + "mitigate": { + "properties": { + "action": { + "type": "string", + "enum": [ + "bypass", + "challenge", + "deny", + "log", + "rate_limit", + "redirect" + ] + }, + "rule_id": { + "type": "string" + }, + "ttl": { + "type": "number" + }, + "erl": { + "properties": { + "algo": { + "type": "string", + "enum": [ + "fixed_window", + "token_bucket" + ] + }, + "window": { + "type": "number" + }, + "limit": { + "type": "number" + }, + "keys": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "algo", + "keys", + "limit", + "window" + ], + "type": "object" + }, + "log_headers": { + "oneOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "string", + "enum": [ + "*" + ] + } + ] + } + }, + "required": [ + "action", + "rule_id" + ], + "type": "object" + }, + "transforms": { + "items": { + "properties": { + "type": { + "type": "string", + "enum": [ + "request.headers" + ] + }, + "op": { + "type": "string", + "enum": [ + "append" + ] + }, + "target": { + "properties": { + "key": { + "type": "string" + } + }, + "required": [ + "key" + ], + "type": "object" + }, + "args": { + "type": "string" + } + }, + "required": [ + "args", + "op", + "target", + "type" + ], + "type": "object" + }, + "type": "array" + } + }, + "type": "object" + }, + "type": "array" + }, + "rulesets": { + "additionalProperties": { + "properties": { + "action": { + "type": "string", + "enum": [ + "allow", + "bypass", + "challenge", + "deny", + "log", + "rate_limit", + "redirect" + ] + }, + "rateLimit": { + "nullable": true, + "properties": { + "algo": { + "type": "string", + "enum": [ + "fixed_window", + "token_bucket" + ] + }, + "window": { + "type": "number" + }, + "limit": { + "type": "number" + }, + "keys": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "algo", + "keys", + "limit", + "window" + ], + "type": "object" + }, + "redirect": { + "nullable": true, + "properties": { + "location": { + "type": "string" + }, + "permanent": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "location", + "permanent" + ], + "type": "object" + }, + "actionDuration": { + "nullable": true, + "type": "string" + }, + "bypassSystem": { + "nullable": true, + "type": "boolean", + "enum": [ + false, + true, + null + ] + }, + "logHeaders": { + "oneOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "string", + "enum": [ + "*" + ] + } + ] + } + }, + "required": [ + "action" + ], + "type": "object" + }, + "type": "object" + }, + "firewallSeawallEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "ja3Enabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "ja4Enabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "firewallBypassIps": { + "items": { + "type": "string" + }, + "type": "array" + }, + "managedRules": { + "nullable": true, + "properties": { + "vercel_ruleset": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "challenge", + "deny", + "log" + ] + } + }, + "required": [ + "active" + ], + "type": "object" + }, + "traffic_sources": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "challenge", + "deny", + "log" + ] + } + }, + "required": [ + "active" + ], + "type": "object" + }, + "bot_filter": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "challenge", + "deny", + "log" + ] + } + }, + "required": [ + "active" + ], + "type": "object" + }, + "ai_bots": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "challenge", + "deny", + "log" + ] + } + }, + "required": [ + "active" + ], + "type": "object" + }, + "owasp": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "challenge", + "deny", + "log" + ] + } + }, + "required": [ + "active" + ], + "type": "object" + } + }, + "required": [ + "ai_bots", + "bot_filter", + "owasp", + "traffic_sources", + "vercel_ruleset" + ], + "type": "object" + }, + "botIdEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "requestLogsKey": { + "items": { + "type": "string" + }, + "type": "array" + }, + "log_headers": { + "oneOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "string", + "enum": [ + "*" + ] + } + ] + }, + "securityPlus": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "securityPlusMetadata": { + "properties": { + "updatedAt": { + "type": "number" + }, + "firstEnabledAt": { + "type": "number", + "description": "Timestamp when the feature was first enabled. Never changes after initial enablement." + } + }, + "required": [ + "updatedAt" + ], + "type": "object" + }, + "pageIntegrityEnabled": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether Page Integrity is enabled for this project. Used by the metadata service to gate DynamoDB lookups against the page-integrity-inventory table." + } + }, + "type": "object" + }, + "oidcTokenConfig": { + "properties": { + "enabled": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether or not to generate OpenID Connect JSON Web Tokens." + }, + "issuerMode": { + "type": "string", + "enum": [ + "global", + "team" + ], + "description": "- team: `https://oidc.vercel.com/[team_slug]` - global: `https://oidc.vercel.com`" + } + }, + "type": "object" + }, + "tier": { + "type": "string", + "enum": [ + "advanced", + "critical", + "priority" + ] + }, + "abuse": { + "properties": { + "scanner": { + "type": "string" + }, + "history": { + "items": { + "properties": { + "scanner": { + "type": "string" + }, + "reason": { + "type": "string" + }, + "by": { + "type": "string" + }, + "byId": { + "type": "string" + }, + "at": { + "type": "number" + } + }, + "required": [ + "at", + "by", + "byId", + "reason", + "scanner" + ], + "type": "object" + }, + "type": "array" + }, + "updatedAt": { + "type": "number" + }, + "block": { + "properties": { + "action": { + "type": "string", + "enum": [ + "blocked" + ] + }, + "reason": { + "type": "string" + }, + "statusCode": { + "type": "number" + }, + "createdAt": { + "type": "number" + }, + "caseId": { + "type": "string" + }, + "actor": { + "type": "string" + }, + "comment": { + "type": "string" + }, + "ineligibleForAppeal": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "isCascading": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "action", + "createdAt", + "reason", + "statusCode" + ], + "type": "object" + }, + "blockHistory": { + "items": { + "oneOf": [ + { + "properties": { + "action": { + "type": "string", + "enum": [ + "blocked" + ] + }, + "reason": { + "type": "string" + }, + "statusCode": { + "type": "number" + }, + "createdAt": { + "type": "number" + }, + "caseId": { + "type": "string" + }, + "actor": { + "type": "string" + }, + "comment": { + "type": "string" + }, + "ineligibleForAppeal": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "isCascading": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "action", + "createdAt", + "reason", + "statusCode" + ], + "type": "object" + }, + { + "properties": { + "action": { + "type": "string", + "enum": [ + "unblocked" + ] + }, + "createdAt": { + "type": "number" + }, + "caseId": { + "type": "string" + }, + "actor": { + "type": "string" + }, + "comment": { + "type": "string" + }, + "ineligibleForAppeal": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "isCascading": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "action", + "createdAt" + ], + "type": "object" + }, + { + "properties": { + "action": { + "type": "string", + "enum": [ + "route-blocked" + ] + }, + "route": { + "oneOf": [ + { + "properties": { + "src": { + "type": "string" + }, + "status": { + "type": "number" + }, + "expiry": { + "type": "number" + } + }, + "required": [ + "src", + "status" + ], + "type": "object" + }, + { + "properties": { + "has": { + "items": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "header" + ] + }, + "key": { + "type": "string", + "enum": [ + "x-vercel-ip-country" + ] + }, + "value": { + "properties": { + "eq": { + "type": "string" + } + }, + "required": [ + "eq" + ], + "type": "object" + } + }, + "required": [ + "key", + "type", + "value" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "host" + ] + }, + "value": { + "properties": { + "eq": { + "type": "string" + } + }, + "required": [ + "eq" + ], + "type": "object" + } + }, + "required": [ + "type", + "value" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "mitigate": { + "properties": { + "action": { + "type": "string", + "enum": [ + "block_legal_cwc" + ] + } + }, + "required": [ + "action" + ], + "type": "object" + }, + "src": { + "type": "string" + } + }, + "required": [ + "has", + "mitigate" + ], + "type": "object" + } + ] + }, + "reason": { + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "caseId": { + "type": "string" + }, + "actor": { + "type": "string" + }, + "comment": { + "type": "string" + }, + "ineligibleForAppeal": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "isCascading": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "action", + "createdAt", + "reason", + "route" + ], + "type": "object" + }, + { + "properties": { + "action": { + "type": "string", + "enum": [ + "route-unblocked" + ] + }, + "route": { + "oneOf": [ + { + "properties": { + "src": { + "type": "string" + }, + "status": { + "type": "number" + }, + "expiry": { + "type": "number" + } + }, + "required": [ + "src", + "status" + ], + "type": "object" + }, + { + "properties": { + "has": { + "items": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "header" + ] + }, + "key": { + "type": "string", + "enum": [ + "x-vercel-ip-country" + ] + }, + "value": { + "properties": { + "eq": { + "type": "string" + } + }, + "required": [ + "eq" + ], + "type": "object" + } + }, + "required": [ + "key", + "type", + "value" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "host" + ] + }, + "value": { + "properties": { + "eq": { + "type": "string" + } + }, + "required": [ + "eq" + ], + "type": "object" + } + }, + "required": [ + "type", + "value" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "mitigate": { + "properties": { + "action": { + "type": "string", + "enum": [ + "block_legal_cwc" + ] + } + }, + "required": [ + "action" + ], + "type": "object" + }, + "src": { + "type": "string" + } + }, + "required": [ + "has", + "mitigate" + ], + "type": "object" + } + ] + }, + "statusCode": { + "type": "number" + }, + "createdAt": { + "type": "number" + }, + "caseId": { + "type": "string" + }, + "actor": { + "type": "string" + }, + "comment": { + "type": "string" + }, + "ineligibleForAppeal": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "isCascading": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "action", + "createdAt", + "route" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "interstitial": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "interstitialHistory": { + "items": { + "properties": { + "action": { + "type": "string", + "enum": [ + "add-deployment-interstitial", + "add-project-interstitial", + "remove-deployment-interstitial", + "remove-project-interstitial" + ] + }, + "createdAt": { + "type": "number" + }, + "caseId": { + "type": "string" + }, + "reason": { + "type": "string" + }, + "actor": { + "type": "string" + }, + "comment": { + "type": "string" + } + }, + "required": [ + "action", + "createdAt" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "history", + "updatedAt" + ], + "type": "object" + }, + "internalRoutes": { + "items": { + "oneOf": [ + { + "properties": { + "src": { + "type": "string" + }, + "status": { + "type": "number" + }, + "expiry": { + "type": "number" + } + }, + "required": [ + "src", + "status" + ], + "type": "object" + }, + { + "properties": { + "has": { + "items": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "header" + ] + }, + "key": { + "type": "string", + "enum": [ + "x-vercel-ip-country" + ] + }, + "value": { + "properties": { + "eq": { + "type": "string" + } + }, + "required": [ + "eq" + ], + "type": "object" + } + }, + "required": [ + "key", + "type", + "value" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "host" + ] + }, + "value": { + "properties": { + "eq": { + "type": "string" + } + }, + "required": [ + "eq" + ], + "type": "object" + } + }, + "required": [ + "type", + "value" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "mitigate": { + "properties": { + "action": { + "type": "string", + "enum": [ + "block_legal_cwc" + ] + } + }, + "required": [ + "action" + ], + "type": "object" + }, + "src": { + "type": "string" + } + }, + "required": [ + "has", + "mitigate" + ], + "type": "object" + } + ] + }, + "type": "array" + } + }, + "required": [ + "accountId", + "alias", + "deploymentExpiration", + "directoryListing", + "id", + "name", + "nodeVersion", + "resourceConfig", + "serverlessFunctionRegion" + ], + "type": "object" + }, + "type": "array" + }, + "pagination": { + "oneOf": [ + { + "properties": { + "count": { + "type": "number", + "description": "Amount of items in the current page.", + "example": 20 + }, + "next": { + "nullable": true, + "type": "string", + "description": "Continuation token that must be used to request the next page. Base32 encoded for safe URL transmission.", + "example": "JBSWY3DPEHPK3PXP" + } + }, + "required": [ + "count", + "next" + ], + "type": "object", + "description": "This object contains information related to the pagination of the current request using continuation tokens. Since CosmosDB doesn't support going to previous pages, only count and next are provided." + }, + { + "$ref": "#/components/schemas/Pagination" + } + ] + } + }, + "required": [ + "pagination", + "projects" + ], + "type": "object" + }, + { + "properties": { + "projects": { + "items": { + "properties": { + "accountId": { + "type": "string" + }, + "creator": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "user" + ] + }, + "via": { + "nullable": true, + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "app" + ] + }, + "app": { + "properties": { + "id": { + "type": "string", + "description": "The internal ID of the Vercel App backing this principal." + }, + "clientId": { + "type": "string", + "description": "The protocol-facing OAuth client ID. This may differ from {@link id} when Client ID Metadata Documents (CIMD) are used." + } + }, + "required": [ + "id" + ], + "type": "object" + } + }, + "required": [ + "app", + "type" + ], + "type": "object", + "description": "Set when a Vercel App or Integration acts on behalf of a {@link User}. Captures user-consented OAuth delegation that the ACL layer may inspect to evaluate scope restrictions. This is NOT for impersonation or token-exchange provenance — those live on `auth.token`, not on the principal." + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "integration" + ] + }, + "integration": { + "properties": { + "integrationId": { + "type": "string" + }, + "configurationId": { + "type": "string" + } + }, + "required": [ + "configurationId", + "integrationId" + ], + "type": "object" + } + }, + "required": [ + "integration", + "type" + ], + "type": "object", + "description": "Set when a Vercel App or Integration acts on behalf of a {@link User}. Captures user-consented OAuth delegation that the ACL layer may inspect to evaluate scope restrictions. This is NOT for impersonation or token-exchange provenance — those live on `auth.token`, not on the principal." + } + ] + }, + "user": { + "properties": { + "id": { + "type": "string" + } + }, + "required": [ + "id" + ], + "type": "object" + } + }, + "required": [ + "type", + "user", + "via" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "app" + ] + }, + "app": { + "properties": { + "id": { + "type": "string", + "description": "The internal ID of the Vercel App backing this principal." + }, + "clientId": { + "type": "string", + "description": "The protocol-facing OAuth client ID. This may differ from {@link id} when Client ID Metadata Documents (CIMD) are used." + } + }, + "required": [ + "id" + ], + "type": "object" + } + }, + "required": [ + "app", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "integration" + ] + }, + "integration": { + "properties": { + "integrationId": { + "type": "string" + }, + "configurationId": { + "type": "string" + } + }, + "required": [ + "configurationId", + "integrationId" + ], + "type": "object" + } + }, + "required": [ + "integration", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "system" + ] + } + }, + "required": [ + "type" + ], + "type": "object" + } + ] + }, + "alias": { + "items": { + "properties": { + "configuredBy": { + "nullable": true, + "type": "string", + "enum": [ + "A", + "CNAME", + "dns-01", + "http", + null + ] + }, + "configuredChangedAt": { + "nullable": true, + "type": "number" + }, + "createdAt": { + "nullable": true, + "type": "number" + }, + "deployment": { + "nullable": true, + "properties": { + "id": { + "type": "string" + }, + "alias": { + "items": { + "type": "string" + }, + "type": "array" + }, + "aliasAssigned": { + "nullable": true, + "oneOf": [ + { + "type": "number" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + } + ] + }, + "aliasError": { + "nullable": true, + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" + }, + "aliasFinal": { + "nullable": true, + "type": "string" + }, + "automaticAliases": { + "items": { + "type": "string" + }, + "type": "array" + }, + "branchMatcher": { + "properties": { + "type": { + "type": "string", + "enum": [ + "endsWith", + "equals", + "startsWith" + ], + "description": "The type of matching to perform" + }, + "pattern": { + "type": "string", + "description": "The pattern to match against branch names" + } + }, + "required": [ + "pattern", + "type" + ], + "type": "object" + }, + "buildingAt": { + "type": "number" + }, + "builds": { + "items": { + "properties": { + "use": { + "type": "string" + }, + "src": { + "type": "string" + }, + "dest": { + "type": "string" + } + }, + "required": [ + "use" + ], + "type": "object" + }, + "type": "array" + }, + "checksConclusion": { + "type": "string", + "enum": [ + "canceled", + "failed", + "skipped", + "succeeded" + ] + }, + "checksState": { + "type": "string", + "enum": [ + "completed", + "registered", + "running" + ] + }, + "connectBuildsEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "connectConfigurationId": { + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "createdIn": { + "type": "string" + }, + "creator": { + "nullable": true, + "properties": { + "email": { + "type": "string" + }, + "githubLogin": { + "type": "string" + }, + "gitlabLogin": { + "type": "string" + }, + "uid": { + "type": "string" + }, + "username": { + "type": "string" + } + }, + "required": [ + "email", + "uid", + "username" + ], + "type": "object" + }, + "deletedAt": { + "type": "number" + }, + "deploymentHostname": { + "type": "string" + }, + "forced": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "name": { + "type": "string" + }, + "meta": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "monorepoManager": { + "nullable": true, + "type": "string" + }, + "oidcTokenClaims": { + "properties": { + "iss": { + "type": "string" + }, + "sub": { + "type": "string" + }, + "scope": { + "type": "string" + }, + "aud": { + "type": "string" + }, + "owner": { + "type": "string" + }, + "owner_id": { + "type": "string" + }, + "project": { + "type": "string" + }, + "project_id": { + "type": "string" + }, + "environment": { + "type": "string" + }, + "custom_environment_id": { + "type": "string" + }, + "mfe_group_ids": { + "items": { + "type": "string" + }, + "type": "array" + }, + "plan": { + "type": "string" + } + }, + "required": [ + "aud", + "environment", + "iss", + "owner", + "owner_id", + "project", + "project_id", + "scope", + "sub" + ], + "type": "object" + }, + "plan": { + "type": "string", + "enum": [ + "enterprise", + "hobby", + "pro" + ] + }, + "previewCommentsEnabled": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether or not preview comments are enabled for the deployment", + "example": false + }, + "private": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "readyAt": { + "type": "number" + }, + "readyState": { + "type": "string", + "enum": [ + "BLOCKED", + "BUILDING", + "CANCELED", + "ERROR", + "INITIALIZING", + "QUEUED", + "READY" + ] + }, + "readySubstate": { + "type": "string", + "enum": [ + "PROMOTED", + "ROLLING", + "STAGED" + ] + }, + "requestedAt": { + "type": "number" + }, + "target": { + "nullable": true, + "type": "string" + }, + "teamId": { + "nullable": true, + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "LAMBDAS" + ] + }, + "url": { + "type": "string" + }, + "userId": { + "type": "string", + "description": "Present for user creators; omitted for app/integration/system creators." + }, + "withCache": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "createdAt", + "createdIn", + "creator", + "deploymentHostname", + "id", + "name", + "plan", + "private", + "readyState", + "type", + "url" + ], + "type": "object" + }, + "domain": { + "type": "string" + }, + "environment": { + "type": "string", + "enum": [ + "preview", + "production" + ] + }, + "gitBranch": { + "nullable": true, + "type": "string" + }, + "redirect": { + "nullable": true, + "type": "string" + }, + "redirectStatusCode": { + "nullable": true, + "type": "number", + "enum": [ + 301, + 302, + 307, + 308, + null + ] + }, + "target": { + "type": "string", + "enum": [ + "PREVIEW", + "PRODUCTION", + "STAGING" + ] + } + }, + "required": [ + "deployment", + "domain", + "environment", + "target" + ], + "type": "object" + }, + "type": "array" + }, + "analytics": { + "properties": { + "id": { + "type": "string" + }, + "canceledAt": { + "nullable": true, + "type": "number" + }, + "disabledAt": { + "type": "number" + }, + "enabledAt": { + "type": "number" + }, + "paidAt": { + "type": "number" + }, + "sampleRatePercent": { + "nullable": true, + "type": "number" + }, + "spendLimitInDollars": { + "nullable": true, + "type": "number" + } + }, + "required": [ + "disabledAt", + "enabledAt", + "id" + ], + "type": "object" + }, + "appliedCve55182Migration": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "speedInsights": { + "properties": { + "id": { + "type": "string" + }, + "enabledAt": { + "type": "number" + }, + "disabledAt": { + "type": "number" + }, + "canceledAt": { + "type": "number" + }, + "hasData": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "dataReceivedAt": { + "type": "number", + "description": "When the first free (not Speed Insights Plus) production data point was observed, in ms. Set once by subscriber-analytics-events; projects that already had data before this field shipped get it backfilled on their next batch, so it reads \"first free data point observed\", not necessarily \"first ever\"." + }, + "paidAt": { + "type": "number" + } + }, + "required": [ + "id" + ], + "type": "object" + }, + "autoExposeSystemEnvs": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "autoAssignCustomDomains": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "autoAssignCustomDomainsUpdatedBy": { + "type": "string" + }, + "buildCommand": { + "nullable": true, + "type": "string" + }, + "commandForIgnoringBuildStep": { + "nullable": true, + "type": "string" + }, + "connectConfigurations": { + "nullable": true, + "items": { + "properties": { + "envId": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "string", + "enum": [ + "preview", + "production" + ] + } + ] + }, + "connectConfigurationId": { + "type": "string" + }, + "dc": { + "type": "string" + }, + "passive": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "buildsEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "aws": { + "properties": { + "subnetIds": { + "items": { + "type": "string" + }, + "type": "array" + }, + "securityGroupId": { + "type": "string" + } + }, + "required": [ + "subnetIds" + ], + "type": "object" + }, + "createdAt": { + "type": "number" + }, + "updatedAt": { + "type": "number" + } + }, + "required": [ + "buildsEnabled", + "connectConfigurationId", + "createdAt", + "envId", + "passive", + "updatedAt" + ], + "type": "object" + }, + "type": "array" + }, + "connectConfigurationId": { + "nullable": true, + "type": "string" + }, + "connectBuildsEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "passiveConnectConfigurationId": { + "nullable": true, + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "customerSupportCodeVisibility": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "crons": { + "properties": { + "enabledAt": { + "type": "number", + "description": "The time the feature was enabled for this project. Note: It enables automatically with the first Deployment that outputs cronjobs." + }, + "disabledAt": { + "nullable": true, + "type": "number", + "description": "The time the feature was disabled for this project." + }, + "updatedAt": { + "type": "number" + }, + "deploymentId": { + "nullable": true, + "type": "string", + "description": "The ID of the Deployment from which the definitions originated." + }, + "definitions": { + "items": { + "properties": { + "host": { + "type": "string", + "description": "The hostname that should be used.", + "example": "vercel.com" + }, + "path": { + "type": "string", + "description": "The path that should be called for the cronjob.", + "example": "/api/crons/sync-something?hello=world" + }, + "schedule": { + "type": "string", + "description": "The cron expression.", + "example": "0 0 * * *" + }, + "source": { + "type": "string", + "enum": [ + "api" + ], + "description": "The origin of this definition. 'api' means created via the API. Undefined means it originated from a deployment (vercel.json)." + }, + "description": { + "type": "string", + "description": "A human-readable description of what this cron job does." + }, + "hostInferred": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether the host was inferred from the production deployment URL rather than explicitly provided." + } + }, + "required": [ + "host", + "path", + "schedule" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "definitions", + "deploymentId", + "disabledAt", + "enabledAt", + "updatedAt" + ], + "type": "object" + }, + "dataCache": { + "properties": { + "userDisabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "storageSizeBytes": { + "nullable": true, + "type": "number" + }, + "unlimited": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "userDisabled" + ], + "type": "object" + }, + "deploymentExpiration": { + "properties": { + "expirationDays": { + "type": "number", + "description": "Number of days to keep non-production deployments (mostly preview deployments) before soft deletion." + }, + "expirationDaysProduction": { + "type": "number", + "description": "Number of days to keep production deployments before soft deletion." + }, + "expirationDaysCanceled": { + "type": "number", + "description": "Number of days to keep canceled deployments before soft deletion." + }, + "expirationDaysErrored": { + "type": "number", + "description": "Number of days to keep errored deployments before soft deletion." + }, + "deploymentsToKeep": { + "type": "number", + "description": "Minimum number of production deployments to keep for this project, even if they are over the production expiration limit." + } + }, + "type": "object", + "description": "Retention policies for deployments. These are enforced at the project level, but we also maintain an instance of this at the team level as a default policy that gets applied to new projects." + }, + "expiration": { + "oneOf": [ + { + "properties": { + "expiresAt": { + "type": "number", + "description": "Unix ms timestamp when the project is scheduled to expire." + } + }, + "required": [ + "expiresAt" + ], + "type": "object" + }, + { + "properties": { + "lockedAt": { + "type": "number", + "description": "Unix ms timestamp when the project was locked." + }, + "lockedBy": { + "type": "string", + "description": "userId of the actor that triggered the lock (system or admin)." + } + }, + "required": [ + "lockedAt", + "lockedBy" + ], + "type": "object" + } + ] + }, + "devCommand": { + "nullable": true, + "type": "string" + }, + "directoryListing": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "installCommand": { + "nullable": true, + "type": "string" + }, + "env": { + "items": { + "properties": { + "target": { + "oneOf": [ + { + "items": { + "type": "string", + "enum": [ + "development", + "development", + "preview", + "preview", + "production" + ] + }, + "type": "array" + }, + { + "type": "string", + "enum": [ + "development", + "development", + "preview", + "preview", + "production" + ] + } + ] + }, + "type": { + "type": "string", + "enum": [ + "encrypted", + "plain", + "secret", + "sensitive", + "system" + ] + }, + "sunsetSecretId": { + "type": "string", + "description": "This is used to identify variables that have been migrated from type secret to sensitive." + }, + "legacyValue": { + "type": "string", + "description": "Legacy now-encryption ciphertext, present after migration swaps value/vsmValue" + }, + "decrypted": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "value": { + "type": "string" + }, + "vsmValue": { + "type": "string" + }, + "id": { + "type": "string" + }, + "key": { + "type": "string" + }, + "configurationId": { + "nullable": true, + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "updatedAt": { + "type": "number" + }, + "createdBy": { + "nullable": true, + "type": "string" + }, + "updatedBy": { + "nullable": true, + "type": "string" + }, + "gitBranch": { + "type": "string" + }, + "visibility": { + "type": "string", + "enum": [ + "config", + "secret" + ], + "description": "User-facing config/secret model. When set, authoritative for new code paths when the env-var-config-secret-ui flag is enabled. Legacy rows omit this field; legacy rows omit it and callers fall back to existing `type` behavior." + }, + "edgeConfigId": { + "nullable": true, + "type": "string" + }, + "edgeConfigTokenId": { + "nullable": true, + "type": "string" + }, + "contentHint": { + "nullable": true, + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "redis-url" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "redis-rest-api-url" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "redis-rest-api-token" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "redis-rest-api-read-only-token" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "blob-read-write-token" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "blob-store-id" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "blob-webhook-public-key" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-url" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-url-non-pooling" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-prisma-url" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-user" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-host" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-password" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-database" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-url-no-ssl" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "integration-store-secret" + ] + }, + "storeId": { + "type": "string" + }, + "integrationId": { + "type": "string" + }, + "integrationProductId": { + "type": "string" + }, + "integrationConfigurationId": { + "type": "string" + } + }, + "required": [ + "integrationConfigurationId", + "integrationId", + "integrationProductId", + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "flags-connection-string" + ] + }, + "projectId": { + "type": "string" + } + }, + "required": [ + "projectId", + "type" + ], + "type": "object" + } + ] + }, + "internalContentHint": { + "nullable": true, + "properties": { + "type": { + "type": "string", + "enum": [ + "flags-secret" + ] + }, + "encryptedValue": { + "type": "string", + "description": "Contains the `value` of the env variable, encrypted with a special key to make decryption possible in the subscriber Lambda." + } + }, + "required": [ + "encryptedValue", + "type" + ], + "type": "object", + "description": "Similar to `contentHints`, but should not be exposed to the user." + }, + "comment": { + "type": "string" + }, + "customEnvironmentIds": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "key", + "type", + "value" + ], + "type": "object" + }, + "type": "array" + }, + "customEnvironments": { + "items": { + "properties": { + "id": { + "type": "string", + "description": "Unique identifier for the custom environment (format: env_*)" + }, + "slug": { + "type": "string", + "description": "URL-friendly name of the environment" + }, + "type": { + "type": "string", + "enum": [ + "development", + "preview", + "production" + ], + "description": "The type of environment (production, preview, or development)" + }, + "description": { + "type": "string", + "description": "Optional description of the environment's purpose" + }, + "branchMatcher": { + "properties": { + "type": { + "type": "string", + "enum": [ + "endsWith", + "equals", + "startsWith" + ], + "description": "The type of matching to perform" + }, + "pattern": { + "type": "string", + "description": "The pattern to match against branch names" + } + }, + "required": [ + "pattern", + "type" + ], + "type": "object", + "description": "Configuration for matching git branches to this environment" + }, + "domains": { + "items": { + "properties": { + "name": { + "type": "string" + }, + "apexName": { + "type": "string" + }, + "projectId": { + "type": "string" + }, + "redirect": { + "nullable": true, + "type": "string" + }, + "redirectStatusCode": { + "nullable": true, + "type": "number", + "enum": [ + 301, + 302, + 307, + 308, + null + ] + }, + "gitBranch": { + "nullable": true, + "type": "string" + }, + "customEnvironmentId": { + "nullable": true, + "type": "string" + }, + "updatedAt": { + "type": "number" + }, + "createdAt": { + "type": "number" + }, + "verified": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "`true` if the domain is verified for use with the project. If `false` it will not be used as an alias on this project until the challenge in `verification` is completed." + }, + "verification": { + "items": { + "properties": { + "type": { + "type": "string" + }, + "domain": { + "type": "string" + }, + "value": { + "type": "string" + }, + "reason": { + "type": "string" + } + }, + "required": [ + "domain", + "reason", + "type", + "value" + ], + "type": "object", + "description": "A list of verification challenges, one of which must be completed to verify the domain for use on the project. After the challenge is complete `POST /projects/:idOrName/domains/:domain/verify` to verify the domain. Possible challenges: - If `verification.type = TXT` the `verification.domain` will be checked for a TXT record matching `verification.value`." + }, + "type": "array", + "description": "A list of verification challenges, one of which must be completed to verify the domain for use on the project. After the challenge is complete `POST /projects/:idOrName/domains/:domain/verify` to verify the domain. Possible challenges: - If `verification.type = TXT` the `verification.domain` will be checked for a TXT record matching `verification.value`." + } + }, + "required": [ + "apexName", + "name", + "projectId", + "verified" + ], + "type": "object", + "description": "List of domains associated with this environment" + }, + "type": "array", + "description": "List of domains associated with this environment" + }, + "currentDeploymentAliases": { + "items": { + "type": "string" + }, + "type": "array", + "description": "List of aliases for the current deployment" + }, + "createdAt": { + "type": "number", + "description": "Timestamp when the environment was created" + }, + "updatedAt": { + "type": "number", + "description": "Timestamp when the environment was last updated" + } + }, + "required": [ + "createdAt", + "id", + "slug", + "type", + "updatedAt" + ], + "type": "object", + "description": "Internal representation of a custom environment with all required properties" + }, + "type": "array" + }, + "framework": { + "nullable": true, + "type": "string", + "enum": [ + "actix-web", + "angular", + "ash", + "astro", + "axum", + "blitzjs", + "brunch", + "bun", + "container", + "create-react-app", + "django", + "docusaurus", + "docusaurus-2", + "dojo", + "eleventy", + "elysia", + "ember", + "eve", + "express", + "factory-eve", + "fastapi", + "fasthtml", + "fastify", + "flask", + "gatsby", + "go", + "gridsome", + "h3", + "hexo", + "hono", + "hugo", + "hydrogen", + "ionic-angular", + "ionic-react", + "jekyll", + "koa", + "mastra", + "middleman", + "nestjs", + "nextjs", + "nitro", + "node", + "nuxtjs", + "parcel", + "polymer", + "preact", + "python", + "react-router", + "redwoodjs", + "remix", + "ruby", + "rust", + "saber", + "sanity", + "sanity-v2", + "sapper", + "scully", + "services", + "solidstart", + "solidstart-1", + "stencil", + "storybook", + "svelte", + "sveltekit", + "sveltekit-1", + "tanstack-start", + "tanstack-start-lovable", + "umijs", + "vite", + "vitepress", + "vue", + "vuepress", + "xmcp", + "zola", + null + ] + }, + "services": { + "items": { + "properties": { + "serviceName": { + "type": "string", + "description": "Service name from the deployment (Service.name)." + }, + "serviceType": { + "type": "string", + "enum": [ + "cron", + "job", + "web", + "worker" + ], + "description": "Service kind (Service.type). Omitted for schemas that do not define one." + }, + "framework": { + "type": "string", + "enum": [ + "actix-web", + "angular", + "ash", + "astro", + "axum", + "blitzjs", + "brunch", + "bun", + "container", + "create-react-app", + "django", + "docusaurus", + "docusaurus-2", + "dojo", + "eleventy", + "elysia", + "ember", + "eve", + "express", + "factory-eve", + "fastapi", + "fasthtml", + "fastify", + "flask", + "gatsby", + "go", + "gridsome", + "h3", + "hexo", + "hono", + "hugo", + "hydrogen", + "ionic-angular", + "ionic-react", + "jekyll", + "koa", + "mastra", + "middleman", + "nestjs", + "nextjs", + "nitro", + "node", + "nuxtjs", + "parcel", + "polymer", + "preact", + "python", + "react-router", + "redwoodjs", + "remix", + "ruby", + "rust", + "saber", + "sanity", + "sanity-v2", + "sapper", + "scully", + "services", + "solidstart", + "solidstart-1", + "stencil", + "storybook", + "svelte", + "sveltekit", + "sveltekit-1", + "tanstack-start", + "tanstack-start-lovable", + "umijs", + "vite", + "vitepress", + "vue", + "vuepress", + "xmcp", + "zola" + ], + "description": "Framework slug, when the service has one (omitted otherwise)." + }, + "runtime": { + "type": "string", + "description": "Generic runtime, e.g. 'node' | 'python' | 'go' | 'ruby' | 'rust' (Service.runtime). Omitted for static builds." + } + }, + "required": [ + "serviceName" + ], + "type": "object" + }, + "type": "array" + }, + "gitForkProtection": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "gitLFS": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "id": { + "type": "string" + }, + "ipBuckets": { + "items": { + "properties": { + "bucket": { + "type": "string" + }, + "default": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "supportUntil": { + "type": "number" + } + }, + "required": [ + "bucket" + ], + "type": "object" + }, + "type": "array" + }, + "jobs": { + "properties": { + "lint": { + "properties": { + "targets": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "targets" + ], + "type": "object" + }, + "typecheck": { + "properties": { + "targets": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "targets" + ], + "type": "object" + }, + "mfe-config-present": { + "properties": { + "targets": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "targets" + ], + "type": "object" + } + }, + "type": "object" + }, + "latestDeployments": { + "items": { + "properties": { + "id": { + "type": "string" + }, + "alias": { + "items": { + "type": "string" + }, + "type": "array" + }, + "aliasAssigned": { + "nullable": true, + "oneOf": [ + { + "type": "number" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + } + ] + }, + "aliasError": { + "nullable": true, + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" + }, + "aliasFinal": { + "nullable": true, + "type": "string" + }, + "automaticAliases": { + "items": { + "type": "string" + }, + "type": "array" + }, + "branchMatcher": { + "properties": { + "type": { + "type": "string", + "enum": [ + "endsWith", + "equals", + "startsWith" + ], + "description": "The type of matching to perform" + }, + "pattern": { + "type": "string", + "description": "The pattern to match against branch names" + } + }, + "required": [ + "pattern", + "type" + ], + "type": "object" + }, + "buildingAt": { + "type": "number" + }, + "builds": { + "items": { + "properties": { + "use": { + "type": "string" + }, + "src": { + "type": "string" + }, + "dest": { + "type": "string" + } + }, + "required": [ + "use" + ], + "type": "object" + }, + "type": "array" + }, + "checksConclusion": { + "type": "string", + "enum": [ + "canceled", + "failed", + "skipped", + "succeeded" + ] + }, + "checksState": { + "type": "string", + "enum": [ + "completed", + "registered", + "running" + ] + }, + "connectBuildsEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "connectConfigurationId": { + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "createdIn": { + "type": "string" + }, + "creator": { + "nullable": true, + "properties": { + "email": { + "type": "string" + }, + "githubLogin": { + "type": "string" + }, + "gitlabLogin": { + "type": "string" + }, + "uid": { + "type": "string" + }, + "username": { + "type": "string" + } + }, + "required": [ + "email", + "uid", + "username" + ], + "type": "object" + }, + "deletedAt": { + "type": "number" + }, + "deploymentHostname": { + "type": "string" + }, + "forced": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "name": { + "type": "string" + }, + "meta": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "monorepoManager": { + "nullable": true, + "type": "string" + }, + "oidcTokenClaims": { + "properties": { + "iss": { + "type": "string" + }, + "sub": { + "type": "string" + }, + "scope": { + "type": "string" + }, + "aud": { + "type": "string" + }, + "owner": { + "type": "string" + }, + "owner_id": { + "type": "string" + }, + "project": { + "type": "string" + }, + "project_id": { + "type": "string" + }, + "environment": { + "type": "string" + }, + "custom_environment_id": { + "type": "string" + }, + "mfe_group_ids": { + "items": { + "type": "string" + }, + "type": "array" + }, + "plan": { + "type": "string" + } + }, + "required": [ + "aud", + "environment", + "iss", + "owner", + "owner_id", + "project", + "project_id", + "scope", + "sub" + ], + "type": "object" + }, + "plan": { + "type": "string", + "enum": [ + "enterprise", + "hobby", + "pro" + ] + }, + "previewCommentsEnabled": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether or not preview comments are enabled for the deployment", + "example": false + }, + "private": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "readyAt": { + "type": "number" + }, + "readyState": { + "type": "string", + "enum": [ + "BLOCKED", + "BUILDING", + "CANCELED", + "ERROR", + "INITIALIZING", + "QUEUED", + "READY" + ] + }, + "readySubstate": { + "type": "string", + "enum": [ + "PROMOTED", + "ROLLING", + "STAGED" + ] + }, + "requestedAt": { + "type": "number" + }, + "target": { + "nullable": true, + "type": "string" + }, + "teamId": { + "nullable": true, + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "LAMBDAS" + ] + }, + "url": { + "type": "string" + }, + "userId": { + "type": "string", + "description": "Present for user creators; omitted for app/integration/system creators." + }, + "withCache": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "createdAt", + "createdIn", + "creator", + "deploymentHostname", + "id", + "name", + "plan", + "private", + "readyState", + "type", + "url" + ], + "type": "object" + }, + "type": "array" + }, + "link": { + "oneOf": [ + { + "properties": { + "org": { + "type": "string" + }, + "repoOwnerId": { + "type": "number", + "description": "A new field, should be included in all new project links, is being added just in time when a deployment is created. This is needed for Protected Git scopes." + }, + "repo": { + "type": "string" + }, + "repoId": { + "type": "number" + }, + "type": { + "type": "string", + "enum": [ + "github" + ] + }, + "createdAt": { + "type": "number" + }, + "deployHooks": { + "items": { + "properties": { + "createdAt": { + "type": "number" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "ref": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "ref", + "url" + ], + "type": "object" + }, + "type": "array" + }, + "gitCredentialId": { + "type": "string" + }, + "updatedAt": { + "type": "number" + }, + "sourceless": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "productionBranch": { + "type": "string" + } + }, + "required": [ + "deployHooks", + "gitCredentialId", + "org", + "productionBranch", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "github-limited" + ] + }, + "repo": { + "type": "string" + }, + "repoId": { + "type": "number" + }, + "createdAt": { + "type": "number" + }, + "updatedAt": { + "type": "number" + }, + "org": { + "type": "string" + }, + "repoOwnerId": { + "type": "number", + "description": "A new field, should be included in all new project links, is being added just in time when a deployment is created. This is needed for Protected Git scopes." + }, + "deployHooks": { + "items": { + "properties": { + "createdAt": { + "type": "number" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "ref": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "ref", + "url" + ], + "type": "object" + }, + "type": "array" + }, + "gitCredentialId": { + "type": "string" + }, + "sourceless": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "productionBranch": { + "type": "string" + } + }, + "required": [ + "deployHooks", + "gitCredentialId", + "org", + "productionBranch", + "type" + ], + "type": "object" + }, + { + "properties": { + "org": { + "type": "string" + }, + "repoOwnerId": { + "type": "number", + "description": "A new field, should be included in all new project links, is being added just in time when a deployment is created. This is needed for Protected Git scopes." + }, + "repo": { + "type": "string" + }, + "repoId": { + "type": "number" + }, + "type": { + "type": "string", + "enum": [ + "github-custom-host" + ] + }, + "host": { + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "deployHooks": { + "items": { + "properties": { + "createdAt": { + "type": "number" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "ref": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "ref", + "url" + ], + "type": "object" + }, + "type": "array" + }, + "gitCredentialId": { + "type": "string" + }, + "updatedAt": { + "type": "number" + }, + "sourceless": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "productionBranch": { + "type": "string" + } + }, + "required": [ + "deployHooks", + "gitCredentialId", + "host", + "org", + "productionBranch", + "type" + ], + "type": "object" + }, + { + "properties": { + "projectId": { + "type": "string" + }, + "projectName": { + "type": "string" + }, + "projectNameWithNamespace": { + "type": "string" + }, + "projectNamespace": { + "type": "string" + }, + "projectOwnerId": { + "type": "number", + "description": "A new field, should be included in all new project links, is being added just in time when a deployment is created. This is needed for Protected Git scopes. This is the id of the top level group that a namespace belongs to. Gitlab supports group nesting (up to 20 levels)." + }, + "projectUrl": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "gitlab" + ] + }, + "createdAt": { + "type": "number" + }, + "deployHooks": { + "items": { + "properties": { + "createdAt": { + "type": "number" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "ref": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "ref", + "url" + ], + "type": "object" + }, + "type": "array" + }, + "gitCredentialId": { + "type": "string" + }, + "updatedAt": { + "type": "number" + }, + "sourceless": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "productionBranch": { + "type": "string" + } + }, + "required": [ + "deployHooks", + "gitCredentialId", + "productionBranch", + "projectId", + "projectName", + "projectNameWithNamespace", + "projectNamespace", + "projectUrl", + "type" + ], + "type": "object" + }, + { + "properties": { + "name": { + "type": "string" + }, + "slug": { + "type": "string" + }, + "owner": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "bitbucket" + ] + }, + "uuid": { + "type": "string" + }, + "workspaceUuid": { + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "deployHooks": { + "items": { + "properties": { + "createdAt": { + "type": "number" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "ref": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "ref", + "url" + ], + "type": "object" + }, + "type": "array" + }, + "gitCredentialId": { + "type": "string" + }, + "updatedAt": { + "type": "number" + }, + "sourceless": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "productionBranch": { + "type": "string" + } + }, + "required": [ + "deployHooks", + "gitCredentialId", + "name", + "owner", + "productionBranch", + "slug", + "type", + "uuid", + "workspaceUuid" + ], + "type": "object" + }, + { + "properties": { + "org": { + "type": "string" + }, + "repo": { + "type": "string" + }, + "repoId": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "vercel" + ] + }, + "createdAt": { + "type": "number" + }, + "deployHooks": { + "items": { + "properties": { + "createdAt": { + "type": "number" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "ref": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "ref", + "url" + ], + "type": "object" + }, + "type": "array" + }, + "gitCredentialId": { + "type": "string" + }, + "updatedAt": { + "type": "number" + }, + "sourceless": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "productionBranch": { + "type": "string" + } + }, + "required": [ + "deployHooks", + "gitCredentialId", + "org", + "productionBranch", + "repo", + "repoId", + "type" + ], + "type": "object" + }, + { + "properties": { + "org": { + "type": "string" + }, + "repo": { + "type": "string" + }, + "repoId": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "v0" + ] + }, + "createdAt": { + "type": "number" + }, + "deployHooks": { + "items": { + "properties": { + "createdAt": { + "type": "number" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "ref": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "ref", + "url" + ], + "type": "object" + }, + "type": "array" + }, + "gitCredentialId": { + "type": "string" + }, + "updatedAt": { + "type": "number" + }, + "sourceless": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "productionBranch": { + "type": "string" + } + }, + "required": [ + "deployHooks", + "gitCredentialId", + "org", + "productionBranch", + "repo", + "repoId", + "type" + ], + "type": "object" + }, + { + "properties": { + "owner": { + "type": "string", + "description": "Owner (namespace) slug, e.g. `acme`." + }, + "repo": { + "type": "string" + }, + "repoId": { + "type": "string", + "description": "Origin repository id." + }, + "ownerId": { + "type": "string", + "description": "Origin namespace id (`ns_…`) of the owner." + }, + "type": { + "type": "string", + "enum": [ + "cursor-origin" + ] + }, + "createdAt": { + "type": "number" + }, + "deployHooks": { + "items": { + "properties": { + "createdAt": { + "type": "number" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "ref": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "ref", + "url" + ], + "type": "object" + }, + "type": "array" + }, + "gitCredentialId": { + "type": "string" + }, + "updatedAt": { + "type": "number" + }, + "sourceless": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "productionBranch": { + "type": "string" + } + }, + "required": [ + "deployHooks", + "gitCredentialId", + "owner", + "ownerId", + "productionBranch", + "repo", + "repoId", + "type" + ], + "type": "object" + } + ] + }, + "blobs": { + "properties": { + "isDefaultApp": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Marks the team-level, Vercel-managed default blob project (`vercel-blob-default-project`) that orphan blob stores are scoped to when connected without an explicit project. Set only by internal storage flows and immutable after creation — guards rely on it to protect the connected stores from being lost when the project is deleted or transferred." + } + }, + "type": "object" + }, + "microfrontends": { + "oneOf": [ + { + "properties": { + "isDefaultApp": { + "type": "boolean", + "enum": [ + true + ] + }, + "updatedAt": { + "type": "number", + "description": "Timestamp when the microfrontends settings were last updated." + }, + "groupIds": { + "type": "array", + "items": { + "type": "string" + }, + "minItems": 1, + "description": "The group IDs of microfrontends that this project belongs to. Each microfrontend project must belong to a microfrontends group that is the set of microfrontends that are used together." + }, + "enabled": { + "type": "boolean", + "enum": [ + true + ], + "description": "Whether microfrontends are enabled for this project." + }, + "defaultRoute": { + "type": "string", + "description": "A path that is used to take screenshots and as the default path in preview links when a domain for this microfrontend is shown in the UI. Includes the leading slash, e.g. `/docs`" + }, + "freeProjectForLegacyLimits": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether the project was part of the legacy limits for hobby and pro-trial before billing was added. This field is only set when the team is upgraded to a paid plan and we are backfilling the subscription status. We cap the subscription to 2 projects and set this field for the 3rd project. When this field is set, the project is not charged for and we do not call any billing APIs for this project." + } + }, + "required": [ + "enabled", + "groupIds", + "isDefaultApp", + "updatedAt" + ], + "type": "object" + }, + { + "properties": { + "isDefaultApp": { + "type": "boolean", + "enum": [ + false + ] + }, + "routeObservabilityToThisProject": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether observability data should be routed to this microfrontend project or a root project." + }, + "doNotRouteWithMicrofrontendsRouting": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether to add microfrontends routing to aliases. This means domains in this project will route as a microfrontend." + }, + "updatedAt": { + "type": "number", + "description": "Timestamp when the microfrontends settings were last updated." + }, + "groupIds": { + "type": "array", + "items": { + "type": "string" + }, + "minItems": 1, + "description": "The group IDs of microfrontends that this project belongs to. Each microfrontend project must belong to a microfrontends group that is the set of microfrontends that are used together." + }, + "enabled": { + "type": "boolean", + "enum": [ + true + ], + "description": "Whether microfrontends are enabled for this project." + }, + "defaultRoute": { + "type": "string", + "description": "A path that is used to take screenshots and as the default path in preview links when a domain for this microfrontend is shown in the UI. Includes the leading slash, e.g. `/docs`" + }, + "freeProjectForLegacyLimits": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether the project was part of the legacy limits for hobby and pro-trial before billing was added. This field is only set when the team is upgraded to a paid plan and we are backfilling the subscription status. We cap the subscription to 2 projects and set this field for the 3rd project. When this field is set, the project is not charged for and we do not call any billing APIs for this project." + } + }, + "required": [ + "enabled", + "groupIds", + "updatedAt" + ], + "type": "object" + }, + { + "properties": { + "updatedAt": { + "type": "number" + }, + "groupIds": { + "type": "array", + "items": {}, + "minItems": 0, + "maxItems": 0 + }, + "enabled": { + "type": "boolean", + "enum": [ + false + ] + }, + "freeProjectForLegacyLimits": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "enabled", + "groupIds", + "updatedAt" + ], + "type": "object" + } + ] + }, + "name": { + "type": "string" + }, + "nodeVersion": { + "type": "string", + "enum": [ + "10.x", + "12.x", + "14.x", + "16.x", + "18.x", + "20.x", + "22.x", + "24.x", + "8.10.x" + ] + }, + "optionsAllowlist": { + "nullable": true, + "properties": { + "paths": { + "items": { + "properties": { + "value": { + "type": "string" + } + }, + "required": [ + "value" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "paths" + ], + "type": "object" + }, + "outputDirectory": { + "nullable": true, + "type": "string" + }, + "passwordProtection": { + "nullable": true, + "type": "object" + }, + "passport": { + "nullable": true, + "properties": { + "deploymentType": { + "type": "string", + "enum": [ + "all", + "all_except_custom_domains", + "preview", + "prod_deployment_urls_and_all_previews" + ] + }, + "connectorId": { + "type": "string" + } + }, + "required": [ + "connectorId", + "deploymentType" + ], + "type": "object" + }, + "protectionConfig": { + "properties": { + "sandboxUrls": { + "properties": { + "inheritDeploymentProtection": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "type": "object" + } + }, + "type": "object" + }, + "sandbox": { + "properties": { + "region": { + "type": "string", + "enum": [ + "arn1", + "bom1", + "cdg1", + "cle1", + "cpt1", + "dub1", + "fra1", + "gru1", + "hkg1", + "hnd1", + "iad1", + "icn1", + "kix1", + "lhr1", + "pdx1", + "sfo1", + "sin1", + "syd1", + "yul1" + ] + }, + "failoverRegions": { + "items": { + "type": "string", + "enum": [ + "arn1", + "bom1", + "cdg1", + "cle1", + "cpt1", + "dub1", + "fra1", + "gru1", + "hkg1", + "hnd1", + "iad1", + "icn1", + "kix1", + "lhr1", + "pdx1", + "sfo1", + "sin1", + "syd1", + "yul1" + ] + }, + "type": "array" + } + }, + "type": "object" + }, + "productionDeploymentsFastLane": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "resourceConfig": { + "properties": { + "elasticConcurrencyEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "fluid": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "functionDefaultRegions": { + "items": { + "type": "string" + }, + "type": "array" + }, + "functionDefaultTimeout": { + "type": "number" + }, + "functionDefaultMemoryType": { + "type": "string", + "enum": [ + "performance", + "performance_xl", + "standard", + "standard_legacy" + ] + }, + "functionZeroConfigFailover": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "buildMachineType": { + "type": "string", + "enum": [ + "basic", + "enhanced", + "standard", + "turbo" + ] + }, + "buildMachineSelection": { + "type": "string", + "enum": [ + "elastic", + "fixed" + ] + }, + "buildMachineElasticLastUpdated": { + "type": "number" + }, + "buildMachineElasticReason": { + "type": "string", + "enum": [ + "basic-floor", + "build-timeout-failure", + "enospc-failure", + "enterprise-floor", + "high-peak-disk", + "high-peak-memory", + "long-build-duration", + "oom-failure", + "short-build-duration", + "sustained-high-cpu" + ] + }, + "isNSNBDisabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "buildQueue": { + "properties": { + "configuration": { + "type": "string", + "enum": [ + "SKIP_NAMESPACE_QUEUE", + "WAIT_FOR_NAMESPACE_QUEUE" + ] + } + }, + "type": "object" + }, + "enableFunctionsBeta": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "type": "object", + "required": [ + "functionDefaultRegions" + ] + }, + "rollbackDescription": { + "properties": { + "userId": { + "type": "string", + "description": "The user who rolled back the project." + }, + "username": { + "type": "string", + "description": "The username of the user who rolled back the project." + }, + "description": { + "type": "string", + "description": "User-supplied explanation of why they rolled back the project. Limited to 250 characters." + }, + "createdAt": { + "type": "number", + "description": "Timestamp of when the rollback was requested." + } + }, + "required": [ + "createdAt", + "description", + "userId", + "username" + ], + "type": "object", + "description": "Description of why a project was rolled back, and by whom. Note that lastAliasRequest contains the from/to details of the rollback." + }, + "rollingRelease": { + "nullable": true, + "properties": { + "target": { + "type": "string", + "description": "The environment that the release targets, currently only supports production. Adding in case we want to configure with alias groups or custom environments.", + "example": "production" + }, + "stages": { + "nullable": true, + "items": { + "properties": { + "targetPercentage": { + "type": "number", + "description": "The percentage of traffic to serve to the canary deployment (0-100)", + "example": 25 + }, + "requireApproval": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether or not this stage requires manual approval to proceed", + "example": false + }, + "duration": { + "type": "number", + "description": "Duration in minutes for automatic advancement to the next stage", + "example": 600 + }, + "linearShift": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether to linearly shift traffic over the duration of this stage", + "example": false + } + }, + "required": [ + "targetPercentage" + ], + "type": "object", + "description": "An array of all the stages required during a deployment release. Each stage defines a target percentage and advancement rules. The final stage must always have targetPercentage: 100." + }, + "type": "array", + "description": "An array of all the stages required during a deployment release. Each stage defines a target percentage and advancement rules. The final stage must always have targetPercentage: 100." + }, + "canaryResponseHeader": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether the request served by a canary deployment should return a header indicating a canary was served. Defaults to `false` when omitted.", + "example": false + }, + "gate": { + "properties": { + "enabled": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether automated gating is enabled for this project's rollouts." + }, + "checks": { + "items": { + "properties": { + "type": { + "type": "string", + "enum": [ + "error-rate-5xx" + ], + "description": "The metric this check evaluates." + }, + "minSampleSize": { + "type": "number", + "description": "Minimum number of requests required in the window before the check can fail. Below this, the check is inconclusive rather than failing, so low-traffic stages don't gate on noise. Defaults to `100` when omitted.", + "example": 100 + }, + "excludeStatusCodes": { + "items": { + "type": "number" + }, + "type": "array", + "description": "Response status codes to ignore entirely — dropped from both the numerator (errors) and the denominator (total requests). Defaults to `[]` when omitted.", + "example": [ + 503 + ] + }, + "excludePaths": { + "items": { + "type": "string" + }, + "type": "array", + "description": "Request paths to ignore entirely — dropped from both the numerator (errors) and the denominator (total requests). Matched exactly against the request path with any query string removed; no prefix or glob matching. Defaults to `[]` when omitted.", + "example": [ + "/api/health" + ] + }, + "ingestWatermarkSeconds": { + "type": "number", + "description": "Seconds of ingest lag to allow for: the query's upper bound is `now() - this value`, so the check never reads a window that is still filling. Defaults to `30` when omitted.", + "example": 30 + } + }, + "required": [ + "type" + ], + "type": "object", + "description": "The checks to evaluate. An empty array means nothing is evaluated." + }, + "type": "array", + "description": "The checks to evaluate. An empty array means nothing is evaluated." + }, + "failureThreshold": { + "type": "number", + "description": "How many failing evaluations within {@link windowSize} trip the gate. Defaults to `3` when omitted.", + "example": 3 + }, + "windowSize": { + "type": "number", + "description": "How many of the most recent evaluations {@link failureThreshold} is counted against. Defaults to `5` when omitted.", + "example": 5 + }, + "action": { + "type": "string", + "enum": [ + "pause", + "rollback" + ], + "description": "What to do when the gate trips: pause the rollout, or roll it back." + }, + "dryRun": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "When true, a tripped gate is only reported — {@link action} is not taken." + } + }, + "required": [ + "action", + "checks", + "dryRun", + "enabled" + ], + "type": "object", + "description": "Automated gating configuration. Omitted (the default) means no gating is configured, which is equivalent to `enabled: false`." + } + }, + "required": [ + "target" + ], + "type": "object", + "description": "Project-level rolling release configuration that defines how deployments should be gradually rolled out" + }, + "defaultResourceConfig": { + "properties": { + "elasticConcurrencyEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "fluid": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "functionDefaultRegions": { + "items": { + "type": "string" + }, + "type": "array" + }, + "functionDefaultTimeout": { + "type": "number" + }, + "functionDefaultMemoryType": { + "type": "string", + "enum": [ + "performance", + "performance_xl", + "standard", + "standard_legacy" + ] + }, + "functionZeroConfigFailover": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "buildMachineType": { + "type": "string", + "enum": [ + "basic", + "enhanced", + "standard", + "turbo" + ] + }, + "buildMachineSelection": { + "type": "string", + "enum": [ + "elastic", + "fixed" + ] + }, + "buildMachineElasticLastUpdated": { + "type": "number" + }, + "buildMachineElasticReason": { + "type": "string", + "enum": [ + "basic-floor", + "build-timeout-failure", + "enospc-failure", + "enterprise-floor", + "high-peak-disk", + "high-peak-memory", + "long-build-duration", + "oom-failure", + "short-build-duration", + "sustained-high-cpu" + ] + }, + "isNSNBDisabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "buildQueue": { + "properties": { + "configuration": { + "type": "string", + "enum": [ + "SKIP_NAMESPACE_QUEUE", + "WAIT_FOR_NAMESPACE_QUEUE" + ] + } + }, + "type": "object" + }, + "enableFunctionsBeta": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "type": "object", + "required": [ + "functionDefaultRegions" + ] + }, + "rootDirectory": { + "nullable": true, + "type": "string" + }, + "serverlessFunctionZeroConfigFailover": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "skewProtectionBoundaryAt": { + "type": "number" + }, + "skewProtectionMaxAge": { + "type": "number" + }, + "skewProtectionAllowedDomains": { + "items": { + "type": "string" + }, + "type": "array" + }, + "skipGitConnectDuringLink": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "staticIps": { + "properties": { + "builds": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "enabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "regions": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "builds", + "enabled", + "regions" + ], + "type": "object" + }, + "sourceFilesOutsideRootDirectory": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "enableAffectedProjectsDeployments": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "enableExternalRewriteCaching": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "ssoProtection": { + "nullable": true, + "properties": { + "deploymentType": { + "type": "string", + "enum": [ + "all", + "all_except_custom_domains", + "preview", + "prod_deployment_urls_and_all_previews" + ] + }, + "cve55182MigrationAppliedFrom": { + "nullable": true, + "type": "string", + "enum": [ + "all", + "all_except_custom_domains", + "preview", + "prod_deployment_urls_and_all_previews", + null + ] + }, + "april2026SecurityIncidentMigrationAppliedFrom": { + "nullable": true, + "type": "string", + "enum": [ + "all", + "all_except_custom_domains", + "preview", + "prod_deployment_urls_and_all_previews", + null + ] + } + }, + "required": [ + "deploymentType" + ], + "type": "object" + }, + "targets": { + "additionalProperties": { + "nullable": true, + "properties": { + "id": { + "type": "string" + }, + "alias": { + "items": { + "type": "string" + }, + "type": "array" + }, + "aliasAssigned": { + "nullable": true, + "oneOf": [ + { + "type": "number" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + } + ] + }, + "aliasError": { + "nullable": true, + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" + }, + "aliasFinal": { + "nullable": true, + "type": "string" + }, + "automaticAliases": { + "items": { + "type": "string" + }, + "type": "array" + }, + "branchMatcher": { + "properties": { + "type": { + "type": "string", + "enum": [ + "endsWith", + "equals", + "startsWith" + ], + "description": "The type of matching to perform" + }, + "pattern": { + "type": "string", + "description": "The pattern to match against branch names" + } + }, + "required": [ + "pattern", + "type" + ], + "type": "object" + }, + "buildingAt": { + "type": "number" + }, + "builds": { + "items": { + "properties": { + "use": { + "type": "string" + }, + "src": { + "type": "string" + }, + "dest": { + "type": "string" + } + }, + "required": [ + "use" + ], + "type": "object" + }, + "type": "array" + }, + "checksConclusion": { + "type": "string", + "enum": [ + "canceled", + "failed", + "skipped", + "succeeded" + ] + }, + "checksState": { + "type": "string", + "enum": [ + "completed", + "registered", + "running" + ] + }, + "connectBuildsEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "connectConfigurationId": { + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "createdIn": { + "type": "string" + }, + "creator": { + "nullable": true, + "properties": { + "email": { + "type": "string" + }, + "githubLogin": { + "type": "string" + }, + "gitlabLogin": { + "type": "string" + }, + "uid": { + "type": "string" + }, + "username": { + "type": "string" + } + }, + "required": [ + "email", + "uid", + "username" + ], + "type": "object" + }, + "deletedAt": { + "type": "number" + }, + "deploymentHostname": { + "type": "string" + }, + "forced": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "name": { + "type": "string" + }, + "meta": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "monorepoManager": { + "nullable": true, + "type": "string" + }, + "oidcTokenClaims": { + "properties": { + "iss": { + "type": "string" + }, + "sub": { + "type": "string" + }, + "scope": { + "type": "string" + }, + "aud": { + "type": "string" + }, + "owner": { + "type": "string" + }, + "owner_id": { + "type": "string" + }, + "project": { + "type": "string" + }, + "project_id": { + "type": "string" + }, + "environment": { + "type": "string" + }, + "custom_environment_id": { + "type": "string" + }, + "mfe_group_ids": { + "items": { + "type": "string" + }, + "type": "array" + }, + "plan": { + "type": "string" + } + }, + "required": [ + "aud", + "environment", + "iss", + "owner", + "owner_id", + "project", + "project_id", + "scope", + "sub" + ], + "type": "object" + }, + "plan": { + "type": "string", + "enum": [ + "enterprise", + "hobby", + "pro" + ] + }, + "previewCommentsEnabled": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether or not preview comments are enabled for the deployment", + "example": false + }, + "private": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "readyAt": { + "type": "number" + }, + "readyState": { + "type": "string", + "enum": [ + "BLOCKED", + "BUILDING", + "CANCELED", + "ERROR", + "INITIALIZING", + "QUEUED", + "READY" + ] + }, + "readySubstate": { + "type": "string", + "enum": [ + "PROMOTED", + "ROLLING", + "STAGED" + ] + }, + "requestedAt": { + "type": "number" + }, + "target": { + "nullable": true, + "type": "string" + }, + "teamId": { + "nullable": true, + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "LAMBDAS" + ] + }, + "url": { + "type": "string" + }, + "userId": { + "type": "string", + "description": "Present for user creators; omitted for app/integration/system creators." + }, + "withCache": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "createdAt", + "createdIn", + "creator", + "deploymentHostname", + "id", + "name", + "plan", + "private", + "readyState", + "type", + "url" + ], + "type": "object" + }, + "type": "object" + }, + "transferCompletedAt": { + "type": "number" + }, + "transferStartedAt": { + "type": "number" + }, + "transferToAccountId": { + "type": "string" + }, + "transferredFromAccountId": { + "type": "string" + }, + "updatedAt": { + "type": "number" + }, + "live": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "enablePreviewFeedback": { + "nullable": true, + "type": "boolean", + "enum": [ + false, + true, + null + ] + }, + "enableProductionFeedback": { + "nullable": true, + "type": "boolean", + "enum": [ + false, + true, + null + ] + }, + "permissions": { + "properties": { + "oauth2Connection": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "user": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "userConnection": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "userMfaConfiguration": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "userPreference": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "userSudo": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "webAuthn": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "accessGroup": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "agent": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aiGatewayApiKey": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aiGatewayApiKeyBypassAll": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aiGatewayApiKeyOwnedBySelf": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aiGatewayApiKeySpendAttribution": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aiGatewayApiKeyZdrExemption": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aiGatewayBudget": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aiGatewayCredits": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aiGatewayPrivateModels": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aiGatewayGuardrails": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aiGatewayRules": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aiGatewaySettings": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aiGatewayTranscripts": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aiGatewayTranscriptsSettings": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aiGatewayUsage": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aiGatewayVirtualModelConfigs": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "alerts": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "alertRules": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aliasGlobal": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "analyticsSampling": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "analyticsUsage": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "apiKey": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "apiKeyAiGateway": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "apiKeyOwnedBySelf": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "oauth2Application": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "vercelAppInstallation": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "vercelAppInstallationRequest": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "auditLog": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "automation": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "billingAddress": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "billingInformation": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "billingInvoice": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "billingInvoiceEmailRecipient": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "billingInvoiceLanguage": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "billingPlan": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "billingPurchaseOrder": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "billingRefund": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "billingTaxId": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "blob": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "blobStoreTokenSet": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "budget": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "cacheArtifact": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "cacheArtifactUsageEvent": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "codeChecks": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "codeOwners": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "ciInvocations": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "ciLogs": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "concurrentBuilds": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "connect": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "connectConfiguration": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "connectLogs": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "connexClient": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "connexClientProject": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "connexContact": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "connexInstallation": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "connexToken": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "buildMachineDefault": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "cursorOriginInstallation": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "dataCacheBillingSettings": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "defaultDeploymentProtection": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "deploymentPolicy": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "domain": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "domainAcceptDelegation": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "domainAuthCodes": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "domainCertificate": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "domainCheckConfig": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "domainMove": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "domainPurchase": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "domainRecord": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "domainTransferIn": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "drain": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "edgeConfig": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "edgeConfigItem": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "edgeConfigSchema": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "edgeConfigToken": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "endpointVerification": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "event": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "fileUpload": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "flagsExplorerSubscription": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "gitRepository": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "imageOptimizationNewPrice": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integration": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integrationAccount": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integrationConfiguration": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integrationConfigurationProjects": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integrationConfigurationRole": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integrationConfigurationTransfer": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integrationDeploymentAction": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integrationEvent": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integrationLog": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integrationResource": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integrationResourceData": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integrationResourceReplCommand": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integrationResourceSecrets": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integrationSSOSession": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integrationStrict": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integrationStoreTokenSet": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integrationVercelConfigurationOverride": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integrationPullRequest": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "ipBlocking": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "jobGlobal": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "kmsIssuer": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "kmsProjectGrant": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "logDrain": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "marketplaceBillingData": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "marketplaceExperimentationEdgeConfigData": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "marketplaceExperimentationItem": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "marketplaceFlexCommit": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "marketplaceInstallationMember": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "marketplaceInvoice": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "marketplaceSettings": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "Monitoring": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "monitoringAlert": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "monitoringChart": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "monitoringQuery": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "monitoringSettings": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "notificationCustomerBudget": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "notificationDeploymentFailed": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "notificationDomainConfiguration": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "notificationDomainExpire": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "notificationDomainMoved": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "notificationDomainPurchase": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "notificationDomainRenewal": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "notificationDomainTransfer": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "notificationDomainUnverified": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "NotificationMonitoringAlert": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "notificationPaymentFailed": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "notificationPreferences": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "notificationStatementOfReasons": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "notificationUsageAlert": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "oidcFederationPolicy": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "observabilityConfiguration": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "observabilityFunnel": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "observabilityNotebook": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "openTelemetryEndpoint": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "ownEvent": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "organization": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "organizationDomain": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "organizationTeam": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "passwordProtectionInvoiceItem": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "paymentMethod": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "permissions": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "postgres": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "postgresStoreTokenSet": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "previewDeploymentSuffix": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "privateCloudAccount": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectTransferIn": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectTransferRequest": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "proTrialOnboarding": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "rateLimit": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "redis": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "redisStoreTokenSet": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "remoteCaching": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "repository": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "samlConfig": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "secret": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "securityConfig": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "sensitiveEnvironmentVariablePolicy": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "sharedEnvVars": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "sharedEnvVarsProduction": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "space": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "spaceRun": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "storeIsLocked": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "storeTokenSetSensitive": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "storeTransfer": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "supportCase": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "supportCaseComment": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "team": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "teamAccessRequest": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "teamFellowMembership": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "teamGitExclusivity": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "teamInvite": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "teamInviteCode": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "teamInviteLink": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "teamJoin": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "teamMemberMfaStatus": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "teamMicrofrontends": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "teamOwnMembership": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "teamOwnMembershipDisconnectSAML": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "teamSudo": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "teamTokenInvalidation": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "token": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "toolbarComment": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "usage": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "usageCycle": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "vcrRepository": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "vpcPeeringConnection": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "webAnalyticsPlan": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "webhook": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "webhook-event": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aliasProject": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aliasProtectionBypass": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "bulkRedirects": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "buildMachine": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "connectConfigurationLink": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "dataCacheNamespace": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "deployment": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "deploymentBuildLogs": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "deploymentCheck": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "deploymentCheckPreview": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "deploymentCheckReRunFromProductionBranch": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "deploymentProductionGit": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "deploymentV0": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "deploymentPreview": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "deploymentPrivate": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "deploymentPromote": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "deploymentRollback": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "edgeCacheNamespace": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "environments": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "job": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "logs": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "logsPreset": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "observabilityData": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "onDemandBuild": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "onDemandConcurrency": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "optionsAllowlist": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "passwordProtection": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "privateLinkEndpoint": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "productionAliasProtectionBypass": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "productionShareableLink": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "project": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectAccessGroup": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectAnalyticsSampling": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectAnalyticsUsage": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectCheck": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectCheckRun": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectDeploymentExpiration": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectDeploymentHook": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectDeploymentProtectionStrict": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectDomain": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectDomainCheckConfig": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectDomainMove": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectDomainVerify": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectEvent": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectEnvVars": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectEnvVarsProduction": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectEnvVarsUnownedByIntegration": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectFlags": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectFlagsProduction": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectFlagsSdkKey": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectFromV0": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectId": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectIntegrationConfiguration": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectLink": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectMember": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectMonitoring": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectOIDCToken": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectPermissions": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectProductionBranch": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectProtectionBypass": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectRollingRelease": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectRoutes": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectSupportCase": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectSupportCaseComment": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectTier": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectTransfer": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectTransferOut": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectUsage": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "pageIntegrity": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "seawallConfig": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "securityPlusConfiguration": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "shareableLink": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "shareableLinkStrict": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "sharedEnvVarConnection": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "skewProtection": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "analytics": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "trustedIps": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "trustedSources": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "v0Chat": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "vercelAuth": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "vercelRun": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "webAnalytics": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "workflowRunData": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + } + }, + "type": "object" + }, + "lastRollbackTarget": { + "nullable": true, + "type": "object" + }, + "lastAliasRequest": { + "nullable": true, + "properties": { + "fromDeploymentId": { + "nullable": true, + "type": "string" + }, + "toDeploymentId": { + "type": "string" + }, + "fromRollingReleaseId": { + "type": "string", + "description": "If rolling back from a rolling release, fromDeploymentId captures the \"base\" of that rolling release, and fromRollingReleaseId captures the \"target\" of that rolling release." + }, + "jobStatus": { + "type": "string", + "enum": [ + "failed", + "in-progress", + "pending", + "skipped", + "succeeded" + ] + }, + "requestedAt": { + "type": "number" + }, + "type": { + "type": "string", + "enum": [ + "promote", + "rollback" + ] + } + }, + "required": [ + "fromDeploymentId", + "jobStatus", + "requestedAt", + "toDeploymentId", + "type" + ], + "type": "object" + }, + "protectionBypass": { + "additionalProperties": { + "oneOf": [ + { + "properties": { + "createdAt": { + "type": "number" + }, + "createdBy": { + "type": "string" + }, + "scope": { + "type": "string", + "enum": [ + "integration-automation-bypass" + ] + }, + "integrationId": { + "type": "string" + }, + "configurationId": { + "type": "string" + } + }, + "required": [ + "configurationId", + "createdAt", + "createdBy", + "integrationId", + "scope" + ], + "type": "object" + }, + { + "properties": { + "createdAt": { + "type": "number" + }, + "createdBy": { + "type": "string" + }, + "scope": { + "type": "string", + "enum": [ + "automation-bypass" + ] + }, + "isEnvVar": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "When there was only one bypass, it was automatically set as an env var on deployments. With multiple bypasses, there is always one bypass that is selected as the default, and gets set as an env var on deployments. As this is a new field, undefined means that the bypass is the env var. If there are any automation bypasses, exactly one must be the env var." + }, + "note": { + "type": "string", + "description": "Optional note about the bypass to be displayed in the UI" + } + }, + "required": [ + "createdAt", + "createdBy", + "scope" + ], + "type": "object" + } + ] + }, + "type": "object" + }, + "hasActiveBranches": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "trustedIps": { + "nullable": true, + "oneOf": [ + { + "properties": { + "deploymentType": { + "type": "string", + "enum": [ + "all", + "all_except_custom_domains", + "preview", + "prod_deployment_urls_and_all_previews", + "production" + ] + }, + "addresses": { + "items": { + "properties": { + "value": { + "type": "string" + }, + "note": { + "type": "string" + } + }, + "required": [ + "value" + ], + "type": "object" + }, + "type": "array" + }, + "protectionMode": { + "type": "string", + "enum": [ + "additional", + "exclusive" + ] + } + }, + "required": [ + "addresses", + "deploymentType", + "protectionMode" + ], + "type": "object" + }, + { + "properties": { + "deploymentType": { + "type": "string", + "enum": [ + "all", + "all_except_custom_domains", + "preview", + "prod_deployment_urls_and_all_previews", + "production" + ] + } + }, + "required": [ + "deploymentType" + ], + "type": "object" + } + ] + }, + "trustedSources": { + "nullable": true, + "properties": { + "enableVercelCiSameRepository": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Allow same-team Vercel CI access to preview deployments built from the CI run's repository, using the deployment source rather than the current project repository link. Defaults to enabled when not stored; omitted or null Trusted Sources updates preserve the stored value." + }, + "projects": { + "additionalProperties": { + "properties": { + "label": { + "type": "string" + }, + "customAllow": { + "items": { + "properties": { + "from": { + "oneOf": [ + { + "properties": { + "slugs": { + "items": { + "type": "string" + }, + "type": "array", + "description": "System environment slugs (`production`, `preview`) and/or custom environment slugs defined on the referenced project." + }, + "preset": { + "type": "string", + "enum": [ + "all-custom" + ] + } + }, + "required": [ + "slugs" + ], + "type": "object", + "description": "The source envs on the trusted project that are allowed to access `to`." + }, + { + "properties": { + "slugs": { + "items": { + "type": "string" + }, + "type": "array", + "description": "System environment slugs (`production`, `preview`) and/or custom environment slugs defined on the referenced project." + }, + "preset": { + "type": "string", + "enum": [ + "all-custom" + ] + } + }, + "required": [ + "preset" + ], + "type": "object", + "description": "The source envs on the trusted project that are allowed to access `to`." + } + ] + }, + "to": { + "oneOf": [ + { + "properties": { + "slugs": { + "items": { + "type": "string" + }, + "type": "array", + "description": "System environment slugs (`production`, `preview`) and/or custom environment slugs defined on the referenced project." + }, + "preset": { + "type": "string", + "enum": [ + "all-custom" + ] + } + }, + "required": [ + "slugs" + ], + "type": "object", + "description": "The target envs on the current project that may be accessed." + }, + { + "properties": { + "slugs": { + "items": { + "type": "string" + }, + "type": "array", + "description": "System environment slugs (`production`, `preview`) and/or custom environment slugs defined on the referenced project." + }, + "preset": { + "type": "string", + "enum": [ + "all-custom" + ] + } + }, + "required": [ + "preset" + ], + "type": "object", + "description": "The target envs on the current project that may be accessed." + } + ] + } + }, + "required": [ + "from", + "to" + ], + "type": "object", + "description": "Optional overrides for the default same-env-by-slug matching. Provide explicit rules to allow cross-env access or presets." + }, + "type": "array", + "description": "Optional overrides for the default same-env-by-slug matching. Provide explicit rules to allow cross-env access or presets." + } + }, + "type": "object" + }, + "type": "object" + }, + "oidcProviders": { + "additionalProperties": { + "items": { + "properties": { + "to": { + "oneOf": [ + { + "properties": { + "slugs": { + "items": { + "type": "string" + }, + "type": "array", + "description": "System environment slugs (`production`, `preview`) and/or custom environment slugs defined on the referenced project." + }, + "preset": { + "type": "string", + "enum": [ + "all-custom" + ] + } + }, + "required": [ + "slugs" + ], + "type": "object", + "description": "The target envs on the current project that may be accessed." + }, + { + "properties": { + "slugs": { + "items": { + "type": "string" + }, + "type": "array", + "description": "System environment slugs (`production`, `preview`) and/or custom environment slugs defined on the referenced project." + }, + "preset": { + "type": "string", + "enum": [ + "all-custom" + ] + } + }, + "required": [ + "preset" + ], + "type": "object", + "description": "The target envs on the current project that may be accessed." + } + ] + }, + "label": { + "type": "string" + }, + "claims": { + "additionalProperties": { + "items": { + "type": "string" + }, + "type": "array" + }, + "type": "object" + } + }, + "required": [ + "claims", + "to" + ], + "type": "object" + }, + "type": "array" + }, + "type": "object" + } + }, + "type": "object" + }, + "gitComments": { + "properties": { + "onPullRequest": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether the Vercel bot should comment on PRs" + }, + "onCommit": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether the Vercel bot should comment on commits" + } + }, + "required": [ + "onCommit", + "onPullRequest" + ], + "type": "object" + }, + "gitProviderOptions": { + "properties": { + "createDeployments": { + "type": "string", + "enum": [ + "disabled", + "enabled" + ], + "description": "Whether the Vercel bot should automatically create GitHub deployments https://docs.github.com/en/rest/deployments/deployments#about-deployments NOTE: repository-dispatch events should be used instead" + }, + "disableRepositoryDispatchEvents": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether the Vercel bot should not automatically create GitHub repository-dispatch events on deployment events. https://vercel.com/docs/git/vercel-for-github#repository-dispatch-events - `true`: disable repository-dispatch events for this project (explicit override of the team setting). - `false`: enable repository-dispatch events for this project (explicit override of the team setting). - absent: inherit from `team.disableRepositoryDispatchEvents`." + }, + "requireVerifiedCommits": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether the project requires commits to be signed \u0026 verified before deployments will be created. - `true`: require verified commits for this project (explicit override of the team setting). - `false`: do not require verified commits (explicit override of the team setting). - absent: inherit from `team.requireVerifiedCommits`." + }, + "gitCommitStatus": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether Vercel should post commit statuses for this project. When omitted, commit statuses remain enabled." + }, + "consolidatedGitCommitStatus": { + "properties": { + "enabled": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether consolidated commit status is enabled." + }, + "propagateFailures": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether to propagate individual deployment failures to the consolidated status." + } + }, + "required": [ + "enabled", + "propagateFailures" + ], + "type": "object", + "description": "Configuration for consolidated git commit status reporting. When enabled, Vercel will post a single consolidated commit status instead of individual statuses for each deployment." + } + }, + "required": [ + "createDeployments" + ], + "type": "object" + }, + "paused": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "concurrencyBucketName": { + "type": "string" + }, + "webAnalytics": { + "properties": { + "id": { + "type": "string" + }, + "disabledAt": { + "type": "number" + }, + "canceledAt": { + "type": "number" + }, + "enabledAt": { + "type": "number" + }, + "hasData": { + "type": "boolean", + "enum": [ + true + ] + } + }, + "required": [ + "id" + ], + "type": "object" + }, + "security": { + "properties": { + "attackModeEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "attackModeUpdatedAt": { + "type": "number" + }, + "firewallEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "firewallUpdatedAt": { + "type": "number" + }, + "attackModeActiveUntil": { + "nullable": true, + "type": "number" + }, + "firewallConfigVersion": { + "type": "number" + }, + "rulesets": { + "additionalProperties": { + "properties": { + "action": { + "type": "string", + "enum": [ + "allow", + "bypass", + "challenge", + "deny", + "log", + "rate_limit", + "redirect" + ] + }, + "rateLimit": { + "nullable": true, + "properties": { + "algo": { + "type": "string", + "enum": [ + "fixed_window", + "token_bucket" + ] + }, + "window": { + "type": "number" + }, + "limit": { + "type": "number" + }, + "keys": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "algo", + "keys", + "limit", + "window" + ], + "type": "object" + }, + "redirect": { + "nullable": true, + "properties": { + "location": { + "type": "string" + }, + "permanent": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "location", + "permanent" + ], + "type": "object" + }, + "actionDuration": { + "nullable": true, + "type": "string" + }, + "bypassSystem": { + "nullable": true, + "type": "boolean", + "enum": [ + false, + true, + null + ] + }, + "logHeaders": { + "oneOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "string", + "enum": [ + "*" + ] + } + ] + } + }, + "required": [ + "action" + ], + "type": "object" + }, + "type": "object" + }, + "firewallSeawallEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "ja3Enabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "ja4Enabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "firewallBypassIps": { + "items": { + "type": "string" + }, + "type": "array" + }, + "managedRules": { + "nullable": true, + "properties": { + "vercel_ruleset": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "challenge", + "deny", + "log" + ] + } + }, + "required": [ + "active" + ], + "type": "object" + }, + "traffic_sources": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "challenge", + "deny", + "log" + ] + } + }, + "required": [ + "active" + ], + "type": "object" + }, + "bot_filter": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "challenge", + "deny", + "log" + ] + } + }, + "required": [ + "active" + ], + "type": "object" + }, + "ai_bots": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "challenge", + "deny", + "log" + ] + } + }, + "required": [ + "active" + ], + "type": "object" + }, + "owasp": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "challenge", + "deny", + "log" + ] + } + }, + "required": [ + "active" + ], + "type": "object" + } + }, + "required": [ + "ai_bots", + "bot_filter", + "owasp", + "traffic_sources", + "vercel_ruleset" + ], + "type": "object" + }, + "botIdEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "log_headers": { + "oneOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "string", + "enum": [ + "*" + ] + } + ] + }, + "securityPlus": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "securityPlusMetadata": { + "properties": { + "updatedAt": { + "type": "number" + }, + "firstEnabledAt": { + "type": "number", + "description": "Timestamp when the feature was first enabled. Never changes after initial enablement." + } + }, + "required": [ + "updatedAt" + ], + "type": "object" + }, + "pageIntegrityEnabled": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether Page Integrity is enabled for this project. Used by the metadata service to gate DynamoDB lookups against the page-integrity-inventory table." + } + }, + "type": "object" + }, + "oidcTokenConfig": { + "properties": { + "enabled": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether or not to generate OpenID Connect JSON Web Tokens." + }, + "issuerMode": { + "type": "string", + "enum": [ + "global", + "team" + ], + "description": "- team: `https://oidc.vercel.com/[team_slug]` - global: `https://oidc.vercel.com`" + } + }, + "type": "object" + }, + "deploymentPolicy": { + "nullable": true, + "properties": { + "gitSources": { + "nullable": true, + "items": { + "properties": { + "sources": { + "items": { + "oneOf": [ + { + "properties": { + "provider": { + "type": "string", + "enum": [ + "bitbucket", + "github" + ] + }, + "org": { + "type": "string" + }, + "repo": { + "type": "string" + } + }, + "required": [ + "org", + "provider" + ], + "type": "object", + "description": "Allowlist entry for GitHub and Bitbucket, whose repos are identified by a flat `org`/`repo` (Bitbucket's workspace/owner maps to `org`, its repo slug to `repo`). Omit `repo` to match any repo in the org. Org is matched case-insensitively." + }, + { + "properties": { + "provider": { + "type": "string", + "enum": [ + "gitlab" + ] + }, + "namespace": { + "type": "string" + }, + "project": { + "type": "string" + } + }, + "required": [ + "namespace", + "provider" + ], + "type": "object", + "description": "Allowlist entry for GitLab, which uses nested groups rather than a flat org/repo. `namespace` is the full group path (e.g. `group` or `group/subgroup`); `project` is the leaf project name. Omit `project` to match any project under the namespace. Namespace is matched case-insensitively." + } + ] + }, + "type": "array" + }, + "enabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "environments": { + "items": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "system" + ] + }, + "target": { + "type": "string", + "enum": [ + "preview", + "production" + ] + } + }, + "required": [ + "target", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "custom" + ] + }, + "environmentId": { + "type": "string" + } + }, + "required": [ + "environmentId", + "type" + ], + "type": "object" + } + ] + }, + "type": "array" + } + }, + "required": [ + "enabled", + "environments", + "sources" + ], + "type": "object", + "description": "`enabled: true` with empty `sources` is deny-all." + }, + "type": "array" + }, + "deploymentSources": { + "nullable": true, + "items": { + "properties": { + "sources": { + "items": { + "type": "string", + "enum": [ + "cli", + "deploy-hook", + "git", + "integration", + "rest-api", + "v0" + ], + "description": "Customer-configurable deployment sources. Every deploy classifies to exactly one. JSON schema in `packages/deployment-policy/schemas/body.ts` enumerates exactly these values. - `'git'` — git provider webhook. - `'cli'` — Vercel CLI (legacy classic-token CLI and SIWV CLI both). - `'rest-api'` — direct user/team-token REST upload. Does NOT cover deploy hooks, Marketplace integrations, or first-party app tokens. - `'deploy-hook'` — project deploy-hook URL. The URL is the credential. - `'integration'` — third-party Marketplace actor: Marketplace integration token, user-delegated OAuth from a Marketplace app, or an unrecognized third-party Vercel App. First-party Vercel Apps are never `'integration'`. - `'v0'` — the v0 product surface (entitlement-gated). v0 deploys through the CLI under the hood, but classifies as its own source so a team can allow or deny v0 independently of `'cli'`. First-party Vercel apps (Toolbar, etc.) classify as `'first-party'` — see `ClassifiedSource` in `./checks`. They're not in this union because they aren't customer-configurable; they bypass `checkDeploymentSources` entirely. v0 is intentionally NOT among them: like the CLI, it's a real product surface and is policy-controllable." + }, + "type": "array" + }, + "enabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "environments": { + "items": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "system" + ] + }, + "target": { + "type": "string", + "enum": [ + "preview", + "production" + ] + } + }, + "required": [ + "target", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "custom" + ] + }, + "environmentId": { + "type": "string" + } + }, + "required": [ + "environmentId", + "type" + ], + "type": "object" + } + ] + }, + "type": "array" + } + }, + "required": [ + "enabled", + "environments", + "sources" + ], + "type": "object", + "description": "`enabled: true` with empty `sources` is deny-all." + }, + "type": "array" + } + }, + "type": "object", + "description": "Project shape. `null` on a rule list clears the project's override for that rule type (fall back to team for every env); omitting is equivalent. Setting `deploymentPolicy` itself to `null` clears every override at once. Kept structurally distinct from {@link TeamDeploymentPolicy} so the two storage locations don't share a type by accident." + }, + "tier": { + "type": "string", + "enum": [ + "advanced", + "critical", + "priority" + ] + }, + "usageStatus": { + "properties": { + "kind": { + "type": "string", + "enum": [ + "flat" + ], + "description": "Billing mode. Always 'flat' for flat-rate projects." + }, + "exceededAllowanceUntil": { + "type": "number", + "description": "Timestamp until which the project has exceeded its CDN allowance." + }, + "bypassThrottleUntil": { + "type": "number", + "description": "Timestamp until which throttling is bypassed (project pays list rates for overage)." + }, + "throttled": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Per-project throttle, set explicitly for this project (e.g. via the per-project Flat Rate CDN endpoint)." + }, + "teamThrottled": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Synced from `team.billing.usageStatus.throttled`. When `true`, the team has throttled all of its projects regardless of `throttled`. The effective throttle the CDN enforces is `throttled || teamThrottled`." + } + }, + "required": [ + "kind" + ], + "type": "object" + }, + "features": { + "properties": { + "webAnalytics": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "type": "object" + }, + "v0": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "v0Created": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "abuse": { + "properties": { + "scanner": { + "type": "string" + }, + "history": { + "items": { + "properties": { + "scanner": { + "type": "string" + }, + "reason": { + "type": "string" + }, + "by": { + "type": "string" + }, + "byId": { + "type": "string" + }, + "at": { + "type": "number" + } + }, + "required": [ + "at", + "by", + "byId", + "reason", + "scanner" + ], + "type": "object" + }, + "type": "array" + }, + "updatedAt": { + "type": "number" + }, + "block": { + "properties": { + "action": { + "type": "string", + "enum": [ + "blocked" + ] + }, + "reason": { + "type": "string" + }, + "statusCode": { + "type": "number" + }, + "createdAt": { + "type": "number" + }, + "caseId": { + "type": "string" + }, + "actor": { + "type": "string" + }, + "comment": { + "type": "string" + }, + "ineligibleForAppeal": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "isCascading": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "action", + "createdAt", + "reason", + "statusCode" + ], + "type": "object" + }, + "blockHistory": { + "items": { + "oneOf": [ + { + "properties": { + "action": { + "type": "string", + "enum": [ + "blocked" + ] + }, + "reason": { + "type": "string" + }, + "statusCode": { + "type": "number" + }, + "createdAt": { + "type": "number" + }, + "caseId": { + "type": "string" + }, + "actor": { + "type": "string" + }, + "comment": { + "type": "string" + }, + "ineligibleForAppeal": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "isCascading": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "action", + "createdAt", + "reason", + "statusCode" + ], + "type": "object" + }, + { + "properties": { + "action": { + "type": "string", + "enum": [ + "unblocked" + ] + }, + "createdAt": { + "type": "number" + }, + "caseId": { + "type": "string" + }, + "actor": { + "type": "string" + }, + "comment": { + "type": "string" + }, + "ineligibleForAppeal": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "isCascading": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "action", + "createdAt" + ], + "type": "object" + }, + { + "properties": { + "action": { + "type": "string", + "enum": [ + "route-blocked" + ] + }, + "route": { + "oneOf": [ + { + "properties": { + "src": { + "type": "string" + }, + "status": { + "type": "number" + }, + "expiry": { + "type": "number" + } + }, + "required": [ + "src", + "status" + ], + "type": "object" + }, + { + "properties": { + "has": { + "items": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "header" + ] + }, + "key": { + "type": "string", + "enum": [ + "x-vercel-ip-country" + ] + }, + "value": { + "properties": { + "eq": { + "type": "string" + } + }, + "required": [ + "eq" + ], + "type": "object" + } + }, + "required": [ + "key", + "type", + "value" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "host" + ] + }, + "value": { + "properties": { + "eq": { + "type": "string" + } + }, + "required": [ + "eq" + ], + "type": "object" + } + }, + "required": [ + "type", + "value" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "mitigate": { + "properties": { + "action": { + "type": "string", + "enum": [ + "block_legal_cwc" + ] + } + }, + "required": [ + "action" + ], + "type": "object" + }, + "src": { + "type": "string" + } + }, + "required": [ + "has", + "mitigate" + ], + "type": "object" + } + ] + }, + "reason": { + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "caseId": { + "type": "string" + }, + "actor": { + "type": "string" + }, + "comment": { + "type": "string" + }, + "ineligibleForAppeal": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "isCascading": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "action", + "createdAt", + "reason", + "route" + ], + "type": "object" + }, + { + "properties": { + "action": { + "type": "string", + "enum": [ + "route-unblocked" + ] + }, + "route": { + "oneOf": [ + { + "properties": { + "src": { + "type": "string" + }, + "status": { + "type": "number" + }, + "expiry": { + "type": "number" + } + }, + "required": [ + "src", + "status" + ], + "type": "object" + }, + { + "properties": { + "has": { + "items": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "header" + ] + }, + "key": { + "type": "string", + "enum": [ + "x-vercel-ip-country" + ] + }, + "value": { + "properties": { + "eq": { + "type": "string" + } + }, + "required": [ + "eq" + ], + "type": "object" + } + }, + "required": [ + "key", + "type", + "value" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "host" + ] + }, + "value": { + "properties": { + "eq": { + "type": "string" + } + }, + "required": [ + "eq" + ], + "type": "object" + } + }, + "required": [ + "type", + "value" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "mitigate": { + "properties": { + "action": { + "type": "string", + "enum": [ + "block_legal_cwc" + ] + } + }, + "required": [ + "action" + ], + "type": "object" + }, + "src": { + "type": "string" + } + }, + "required": [ + "has", + "mitigate" + ], + "type": "object" + } + ] + }, + "statusCode": { + "type": "number" + }, + "createdAt": { + "type": "number" + }, + "caseId": { + "type": "string" + }, + "actor": { + "type": "string" + }, + "comment": { + "type": "string" + }, + "ineligibleForAppeal": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "isCascading": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "action", + "createdAt", + "route" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "interstitial": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "interstitialHistory": { + "items": { + "properties": { + "action": { + "type": "string", + "enum": [ + "add-deployment-interstitial", + "add-project-interstitial", + "remove-deployment-interstitial", + "remove-project-interstitial" + ] + }, + "createdAt": { + "type": "number" + }, + "caseId": { + "type": "string" + }, + "reason": { + "type": "string" + }, + "actor": { + "type": "string" + }, + "comment": { + "type": "string" + } + }, + "required": [ + "action", + "createdAt" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "history", + "updatedAt" + ], + "type": "object" + }, + "internalRoutes": { + "items": { + "oneOf": [ + { + "properties": { + "src": { + "type": "string" + }, + "status": { + "type": "number" + }, + "expiry": { + "type": "number" + } + }, + "required": [ + "src", + "status" + ], + "type": "object" + }, + { + "properties": { + "has": { + "items": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "header" + ] + }, + "key": { + "type": "string", + "enum": [ + "x-vercel-ip-country" + ] + }, + "value": { + "properties": { + "eq": { + "type": "string" + } + }, + "required": [ + "eq" + ], + "type": "object" + } + }, + "required": [ + "key", + "type", + "value" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "host" + ] + }, + "value": { + "properties": { + "eq": { + "type": "string" + } + }, + "required": [ + "eq" + ], + "type": "object" + } + }, + "required": [ + "type", + "value" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "mitigate": { + "properties": { + "action": { + "type": "string", + "enum": [ + "block_legal_cwc" + ] + } + }, + "required": [ + "action" + ], + "type": "object" + }, + "src": { + "type": "string" + } + }, + "required": [ + "has", + "mitigate" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "hasDeployments": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "dismissedToasts": { + "items": { + "properties": { + "key": { + "type": "string" + }, + "dismissedAt": { + "type": "number" + }, + "action": { + "type": "string", + "enum": [ + "accept", + "cancel", + "delete" + ] + }, + "value": { + "nullable": true, + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "properties": { + "previousValue": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + } + ] + }, + "currentValue": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + } + ] + } + }, + "required": [ + "currentValue", + "previousValue" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + } + ] + } + }, + "required": [ + "action", + "dismissedAt", + "key", + "value" + ], + "type": "object" + }, + "type": "array" + }, + "protectedSourcemaps": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "tracing": { + "properties": { + "domains": { + "type": "string" + }, + "ignorePaths": { + "items": { + "type": "string" + }, + "type": "array" + }, + "samplingRules": { + "items": { + "properties": { + "rate": { + "type": "number" + }, + "env": { + "type": "string", + "enum": [ + "preview", + "production" + ] + }, + "requestPath": { + "type": "string" + }, + "destination": { + "type": "string", + "enum": [ + "external", + "internal" + ], + "description": "Which tracing destination this rule applies to. `internal` is the hidden Vercel production-tracing drain (internal delivery); `external` is any customer-configured drain. Derived from the owning drain's delivery type when project tracing is computed; absent on configs persisted before this field existed." + } + }, + "required": [ + "rate" + ], + "type": "object" + }, + "type": "array" + } + }, + "type": "object" + }, + "avatar": { + "nullable": true, + "type": "string" + } + }, + "required": [ + "accountId", + "alias", + "defaultResourceConfig", + "deploymentExpiration", + "directoryListing", + "id", + "name", + "nodeVersion", + "resourceConfig" + ], + "type": "object" + }, + "type": "array" + }, + "pagination": { + "oneOf": [ + { + "properties": { + "count": { + "type": "number", + "description": "Amount of items in the current page.", + "example": 20 + }, + "next": { + "nullable": true, + "type": "string", + "description": "Continuation token that must be used to request the next page. Base32 encoded for safe URL transmission.", + "example": "JBSWY3DPEHPK3PXP" + } + }, + "required": [ + "count", + "next" + ], + "type": "object", + "description": "This object contains information related to the pagination of the current request using continuation tokens. Since CosmosDB doesn't support going to previous pages, only count and next are provided." + }, + { + "$ref": "#/components/schemas/Pagination" + } + ] + } + }, + "required": [ + "pagination", + "projects" + ], + "type": "object" + } + ] + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "410": { + "description": "" + } + }, + "x-vercel-cli": { + "supportedSubcommands": true, + "supportedProduction": false, + "aliases": [ + "ls", + "list" + ] + }, + "parameters": [ + { + "name": "from", + "description": "Query only projects updated after the given timestamp or continuation token.", + "in": "query", + "schema": { + "description": "Query only projects updated after the given timestamp or continuation token.", + "type": "string" + } + }, + { + "name": "gitForkProtection", + "description": "Specifies whether PRs from Git forks should require a team member's authorization before it can be deployed", + "in": "query", + "schema": { + "description": "Specifies whether PRs from Git forks should require a team member's authorization before it can be deployed", + "type": "string", + "enum": [ + "1", + "0" + ], + "example": "1" + } + }, + { + "name": "limit", + "description": "Limit the number of projects returned", + "in": "query", + "schema": { + "description": "Limit the number of projects returned", + "type": "string" + } + }, + { + "name": "search", + "description": "Search projects by the name field", + "in": "query", + "schema": { + "description": "Search projects by the name field", + "type": "string", + "maxLength": 100 + } + }, + { + "name": "repo", + "description": "Filter results by repo. Also used for project count", + "in": "query", + "schema": { + "description": "Filter results by repo. Also used for project count", + "type": "string" + } + }, + { + "name": "repoId", + "description": "Filter results by Repository ID.", + "in": "query", + "schema": { + "description": "Filter results by Repository ID.", + "type": "string" + } + }, + { + "name": "repoUrl", + "description": "Filter results by Repository URL.", + "in": "query", + "schema": { + "description": "Filter results by Repository URL.", + "type": "string", + "example": "https://github.com/vercel/next.js" + } + }, + { + "name": "excludeRepos", + "description": "Filter results by excluding those projects that belong to a repo", + "in": "query", + "schema": { + "description": "Filter results by excluding those projects that belong to a repo", + "type": "string" + } + }, + { + "name": "edgeConfigId", + "description": "Filter results by connected Global Config ID", + "in": "query", + "schema": { + "description": "Filter results by connected Global Config ID", + "type": "string" + } + }, + { + "name": "edgeConfigTokenId", + "description": "Filter results by connected Global Config Token ID", + "in": "query", + "schema": { + "description": "Filter results by connected Global Config Token ID", + "type": "string" + } + }, + { + "name": "deprecated", + "in": "query", + "schema": { + "type": "boolean" + } + }, + { + "name": "elasticConcurrencyEnabled", + "description": "Filter results by projects with elastic concurrency enabled", + "in": "query", + "schema": { + "description": "Filter results by projects with elastic concurrency enabled", + "type": "string", + "enum": [ + "1", + "0" + ], + "example": "1" + } + }, + { + "name": "staticIpsEnabled", + "description": "Filter results by projects with Static IPs enabled", + "in": "query", + "schema": { + "description": "Filter results by projects with Static IPs enabled", + "enum": [ + "0", + "1" + ], + "example": "1", + "type": "string" + } + }, + { + "name": "buildMachineTypes", + "description": "Filter results by effective build machine types. Accepts comma-separated values. Use \"elastic\" for projects with elastic selection and \"default\" for projects without a build machine type set.", + "in": "query", + "schema": { + "description": "Filter results by effective build machine types. Accepts comma-separated values. Use \"elastic\" for projects with elastic selection and \"default\" for projects without a build machine type set.", + "type": "string", + "example": "default,enhanced" + } + }, + { + "name": "buildQueueConfiguration", + "description": "Filter results by build queue configuration. SKIP_NAMESPACE_QUEUE includes projects without a configuration set.", + "in": "query", + "schema": { + "description": "Filter results by build queue configuration. SKIP_NAMESPACE_QUEUE includes projects without a configuration set.", + "type": "string", + "enum": [ + "SKIP_NAMESPACE_QUEUE", + "WAIT_FOR_NAMESPACE_QUEUE" + ], + "example": "SKIP_NAMESPACE_QUEUE" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + } + }, + "/v1/projects/traces": { + "get": { + "description": "Returns the OTEL trace for a given Vercel CLI request.", + "operationId": "getProjectTrace", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Get a project trace by request ID", + "tags": [ + "projects" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "trace": { + "properties": { + "traceId": { + "type": "string" + }, + "resources": { + "items": { + "properties": { + "name": { + "type": "string" + }, + "attributes": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + } + }, + "required": [ + "attributes", + "name" + ], + "type": "object" + }, + "type": "array" + }, + "spans": { + "items": { + "properties": { + "name": { + "type": "string" + }, + "kind": { + "type": "number" + }, + "resource": { + "type": "string" + }, + "library": { + "properties": { + "name": { + "type": "string" + }, + "version": { + "type": "string" + } + }, + "required": [ + "name" + ], + "type": "object" + }, + "spanId": { + "type": "string" + }, + "parentSpanId": { + "type": "string" + }, + "status": { + "properties": { + "code": { + "type": "number" + }, + "message": { + "type": "string" + } + }, + "required": [ + "code" + ], + "type": "object" + }, + "traceState": { + "type": "string" + }, + "traceFlags": { + "type": "number" + }, + "attributes": { + "additionalProperties": true, + "type": "object" + }, + "links": { + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + "events": { + "items": { + "properties": { + "name": { + "type": "string" + }, + "timestamp": { + "items": { + "oneOf": [ + { + "type": "number" + }, + { + "type": "number" + } + ] + }, + "maxItems": 2, + "minItems": 2, + "type": "array" + }, + "attributes": { + "additionalProperties": true, + "type": "object" + } + }, + "required": [ + "attributes", + "name", + "timestamp" + ], + "type": "object" + }, + "type": "array" + }, + "startTime": { + "items": { + "oneOf": [ + { + "type": "number" + }, + { + "type": "number" + } + ] + }, + "maxItems": 2, + "minItems": 2, + "type": "array" + }, + "endTime": { + "items": { + "oneOf": [ + { + "type": "number" + }, + { + "type": "number" + } + ] + }, + "maxItems": 2, + "minItems": 2, + "type": "array" + }, + "duration": { + "items": { + "oneOf": [ + { + "type": "number" + }, + { + "type": "number" + } + ] + }, + "maxItems": 2, + "minItems": 2, + "type": "array" + } + }, + "required": [ + "attributes", + "duration", + "endTime", + "events", + "kind", + "library", + "links", + "name", + "resource", + "spanId", + "startTime", + "status", + "traceFlags" + ], + "type": "object" + }, + "type": "array" + }, + "rootSpanId": { + "type": "string" + } + }, + "required": [ + "spans", + "traceId" + ], + "type": "object" + } + }, + "required": [ + "trace" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "projectId", + "description": "The project ID", + "in": "query", + "required": true, + "schema": { + "description": "The project ID", + "type": "string", + "example": "prj_123", + "maxLength": 150 + } + }, + { + "name": "requestId", + "description": "The Vercel CLI request ID associated with the trace", + "in": "query", + "required": true, + "schema": { + "description": "The Vercel CLI request ID associated with the trace", + "type": "string", + "example": "cli-req-abc", + "maxLength": 256 + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + } + }, + "/v11/projects": { + "post": { + "description": "Allows to create a new project with the provided configuration. It only requires the project `name` but more configuration can be provided to override the defaults.", + "operationId": "createProject", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Create a new project", + "tags": [ + "projects" + ], + "responses": { + "200": { + "description": "The project was successfuly created", + "content": { + "application/json": { + "schema": { + "properties": { + "accountId": { + "type": "string" + }, + "creator": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "user" + ] + }, + "via": { + "nullable": true, + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "app" + ] + }, + "app": { + "properties": { + "id": { + "type": "string", + "description": "The internal ID of the Vercel App backing this principal." + }, + "clientId": { + "type": "string", + "description": "The protocol-facing OAuth client ID. This may differ from {@link id} when Client ID Metadata Documents (CIMD) are used." + } + }, + "required": [ + "id" + ], + "type": "object" + } + }, + "required": [ + "app", + "type" + ], + "type": "object", + "description": "Set when a Vercel App or Integration acts on behalf of a {@link User}. Captures user-consented OAuth delegation that the ACL layer may inspect to evaluate scope restrictions. This is NOT for impersonation or token-exchange provenance — those live on `auth.token`, not on the principal." + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "integration" + ] + }, + "integration": { + "properties": { + "integrationId": { + "type": "string" + }, + "configurationId": { + "type": "string" + } + }, + "required": [ + "configurationId", + "integrationId" + ], + "type": "object" + } + }, + "required": [ + "integration", + "type" + ], + "type": "object", + "description": "Set when a Vercel App or Integration acts on behalf of a {@link User}. Captures user-consented OAuth delegation that the ACL layer may inspect to evaluate scope restrictions. This is NOT for impersonation or token-exchange provenance — those live on `auth.token`, not on the principal." + } + ] + }, + "user": { + "properties": { + "id": { + "type": "string" + } + }, + "required": [ + "id" + ], + "type": "object" + } + }, + "required": [ + "type", + "user", + "via" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "app" + ] + }, + "app": { + "properties": { + "id": { + "type": "string", + "description": "The internal ID of the Vercel App backing this principal." + }, + "clientId": { + "type": "string", + "description": "The protocol-facing OAuth client ID. This may differ from {@link id} when Client ID Metadata Documents (CIMD) are used." + } + }, + "required": [ + "id" + ], + "type": "object" + } + }, + "required": [ + "app", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "integration" + ] + }, + "integration": { + "properties": { + "integrationId": { + "type": "string" + }, + "configurationId": { + "type": "string" + } + }, + "required": [ + "configurationId", + "integrationId" + ], + "type": "object" + } + }, + "required": [ + "integration", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "system" + ] + } + }, + "required": [ + "type" + ], + "type": "object" + } + ] + }, + "alias": { + "items": { + "properties": { + "configuredBy": { + "nullable": true, + "type": "string", + "enum": [ + "A", + "CNAME", + "dns-01", + "http", + null + ] + }, + "configuredChangedAt": { + "nullable": true, + "type": "number" + }, + "createdAt": { + "nullable": true, + "type": "number" + }, + "deployment": { + "nullable": true, + "properties": { + "id": { + "type": "string" + }, + "alias": { + "items": { + "type": "string" + }, + "type": "array" + }, + "aliasAssigned": { + "nullable": true, + "oneOf": [ + { + "type": "number" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + } + ] + }, + "aliasError": { + "nullable": true, + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" + }, + "aliasFinal": { + "nullable": true, + "type": "string" + }, + "automaticAliases": { + "items": { + "type": "string" + }, + "type": "array" + }, + "branchMatcher": { + "properties": { + "type": { + "type": "string", + "enum": [ + "endsWith", + "equals", + "startsWith" + ], + "description": "The type of matching to perform" + }, + "pattern": { + "type": "string", + "description": "The pattern to match against branch names" + } + }, + "required": [ + "pattern", + "type" + ], + "type": "object" + }, + "buildingAt": { + "type": "number" + }, + "builds": { + "items": { + "properties": { + "use": { + "type": "string" + }, + "src": { + "type": "string" + }, + "dest": { + "type": "string" + } + }, + "required": [ + "use" + ], + "type": "object" + }, + "type": "array" + }, + "checksConclusion": { + "type": "string", + "enum": [ + "canceled", + "failed", + "skipped", + "succeeded" + ] + }, + "checksState": { + "type": "string", + "enum": [ + "completed", + "registered", + "running" + ] + }, + "connectBuildsEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "connectConfigurationId": { + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "createdIn": { + "type": "string" + }, + "creator": { + "nullable": true, + "properties": { + "email": { + "type": "string" + }, + "githubLogin": { + "type": "string" + }, + "gitlabLogin": { + "type": "string" + }, + "uid": { + "type": "string" + }, + "username": { + "type": "string" + } + }, + "required": [ + "email", + "uid", + "username" + ], + "type": "object" + }, + "deletedAt": { + "type": "number" + }, + "deploymentHostname": { + "type": "string" + }, + "forced": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "name": { + "type": "string" + }, + "meta": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "monorepoManager": { + "nullable": true, + "type": "string" + }, + "oidcTokenClaims": { + "properties": { + "iss": { + "type": "string" + }, + "sub": { + "type": "string" + }, + "scope": { + "type": "string" + }, + "aud": { + "type": "string" + }, + "owner": { + "type": "string" + }, + "owner_id": { + "type": "string" + }, + "project": { + "type": "string" + }, + "project_id": { + "type": "string" + }, + "environment": { + "type": "string" + }, + "custom_environment_id": { + "type": "string" + }, + "mfe_group_ids": { + "items": { + "type": "string" + }, + "type": "array" + }, + "plan": { + "type": "string" + } + }, + "required": [ + "aud", + "environment", + "iss", + "owner", + "owner_id", + "project", + "project_id", + "scope", + "sub" + ], + "type": "object" + }, + "plan": { + "type": "string", + "enum": [ + "enterprise", + "hobby", + "pro" + ] + }, + "previewCommentsEnabled": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether or not preview comments are enabled for the deployment", + "example": false + }, + "private": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "readyAt": { + "type": "number" + }, + "readyState": { + "type": "string", + "enum": [ + "BLOCKED", + "BUILDING", + "CANCELED", + "ERROR", + "INITIALIZING", + "QUEUED", + "READY" + ] + }, + "readySubstate": { + "type": "string", + "enum": [ + "PROMOTED", + "ROLLING", + "STAGED" + ] + }, + "requestedAt": { + "type": "number" + }, + "target": { + "nullable": true, + "type": "string" + }, + "teamId": { + "nullable": true, + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "LAMBDAS" + ] + }, + "url": { + "type": "string" + }, + "userId": { + "type": "string", + "description": "Present for user creators; omitted for app/integration/system creators." + }, + "withCache": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "createdAt", + "createdIn", + "creator", + "deploymentHostname", + "id", + "name", + "plan", + "private", + "readyState", + "type", + "url" + ], + "type": "object" + }, + "domain": { + "type": "string" + }, + "environment": { + "type": "string", + "enum": [ + "preview", + "production" + ] + }, + "gitBranch": { + "nullable": true, + "type": "string" + }, + "redirect": { + "nullable": true, + "type": "string" + }, + "redirectStatusCode": { + "nullable": true, + "type": "number", + "enum": [ + 301, + 302, + 307, + 308, + null + ] + }, + "target": { + "type": "string", + "enum": [ + "PREVIEW", + "PRODUCTION", + "STAGING" + ] + } + }, + "required": [ + "deployment", + "domain", + "environment", + "target" + ], + "type": "object" + }, + "type": "array" + }, + "analytics": { + "properties": { + "id": { + "type": "string" + }, + "canceledAt": { + "nullable": true, + "type": "number" + }, + "disabledAt": { + "type": "number" + }, + "enabledAt": { + "type": "number" + }, + "paidAt": { + "type": "number" + }, + "sampleRatePercent": { + "nullable": true, + "type": "number" + }, + "spendLimitInDollars": { + "nullable": true, + "type": "number" + } + }, + "required": [ + "disabledAt", + "enabledAt", + "id" + ], + "type": "object" + }, + "appliedCve55182Migration": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "speedInsights": { + "properties": { + "id": { + "type": "string" + }, + "enabledAt": { + "type": "number" + }, + "disabledAt": { + "type": "number" + }, + "canceledAt": { + "type": "number" + }, + "hasData": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "dataReceivedAt": { + "type": "number", + "description": "When the first free (not Speed Insights Plus) production data point was observed, in ms. Set once by subscriber-analytics-events; projects that already had data before this field shipped get it backfilled on their next batch, so it reads \"first free data point observed\", not necessarily \"first ever\"." + }, + "paidAt": { + "type": "number" + } + }, + "required": [ + "id" + ], + "type": "object" + }, + "autoExposeSystemEnvs": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "autoAssignCustomDomains": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "autoAssignCustomDomainsUpdatedBy": { + "type": "string" + }, + "buildCommand": { + "nullable": true, + "type": "string" + }, + "commandForIgnoringBuildStep": { + "nullable": true, + "type": "string" + }, + "connectConfigurations": { + "nullable": true, + "items": { + "properties": { + "envId": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "string", + "enum": [ + "preview", + "production" + ] + } + ] + }, + "connectConfigurationId": { + "type": "string" + }, + "dc": { + "type": "string" + }, + "passive": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "buildsEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "aws": { + "properties": { + "subnetIds": { + "items": { + "type": "string" + }, + "type": "array" + }, + "securityGroupId": { + "type": "string" + } + }, + "required": [ + "subnetIds" + ], + "type": "object" + }, + "createdAt": { + "type": "number" + }, + "updatedAt": { + "type": "number" + } + }, + "required": [ + "buildsEnabled", + "connectConfigurationId", + "createdAt", + "envId", + "passive", + "updatedAt" + ], + "type": "object" + }, + "type": "array" + }, + "connectConfigurationId": { + "nullable": true, + "type": "string" + }, + "connectBuildsEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "passiveConnectConfigurationId": { + "nullable": true, + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "customerSupportCodeVisibility": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "crons": { + "properties": { + "enabledAt": { + "type": "number", + "description": "The time the feature was enabled for this project. Note: It enables automatically with the first Deployment that outputs cronjobs." + }, + "disabledAt": { + "nullable": true, + "type": "number", + "description": "The time the feature was disabled for this project." + }, + "updatedAt": { + "type": "number" + }, + "deploymentId": { + "nullable": true, + "type": "string", + "description": "The ID of the Deployment from which the definitions originated." + }, + "definitions": { + "items": { + "properties": { + "host": { + "type": "string", + "description": "The hostname that should be used.", + "example": "vercel.com" + }, + "path": { + "type": "string", + "description": "The path that should be called for the cronjob.", + "example": "/api/crons/sync-something?hello=world" + }, + "schedule": { + "type": "string", + "description": "The cron expression.", + "example": "0 0 * * *" + }, + "source": { + "type": "string", + "enum": [ + "api" + ], + "description": "The origin of this definition. 'api' means created via the API. Undefined means it originated from a deployment (vercel.json)." + }, + "description": { + "type": "string", + "description": "A human-readable description of what this cron job does." + }, + "hostInferred": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether the host was inferred from the production deployment URL rather than explicitly provided." + } + }, + "required": [ + "host", + "path", + "schedule" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "definitions", + "deploymentId", + "disabledAt", + "enabledAt", + "updatedAt" + ], + "type": "object" + }, + "dataCache": { + "properties": { + "userDisabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "storageSizeBytes": { + "nullable": true, + "type": "number" + }, + "unlimited": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "userDisabled" + ], + "type": "object" + }, + "deploymentExpiration": { + "properties": { + "expirationDays": { + "type": "number", + "description": "Number of days to keep non-production deployments (mostly preview deployments) before soft deletion." + }, + "expirationDaysProduction": { + "type": "number", + "description": "Number of days to keep production deployments before soft deletion." + }, + "expirationDaysCanceled": { + "type": "number", + "description": "Number of days to keep canceled deployments before soft deletion." + }, + "expirationDaysErrored": { + "type": "number", + "description": "Number of days to keep errored deployments before soft deletion." + }, + "deploymentsToKeep": { + "type": "number", + "description": "Minimum number of production deployments to keep for this project, even if they are over the production expiration limit." + } + }, + "type": "object", + "description": "Retention policies for deployments. These are enforced at the project level, but we also maintain an instance of this at the team level as a default policy that gets applied to new projects." + }, + "expiration": { + "oneOf": [ + { + "properties": { + "expiresAt": { + "type": "number", + "description": "Unix ms timestamp when the project is scheduled to expire." + } + }, + "required": [ + "expiresAt" + ], + "type": "object" + }, + { + "properties": { + "lockedAt": { + "type": "number", + "description": "Unix ms timestamp when the project was locked." + }, + "lockedBy": { + "type": "string", + "description": "userId of the actor that triggered the lock (system or admin)." + } + }, + "required": [ + "lockedAt", + "lockedBy" + ], + "type": "object" + } + ] + }, + "devCommand": { + "nullable": true, + "type": "string" + }, + "directoryListing": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "installCommand": { + "nullable": true, + "type": "string" + }, + "env": { + "items": { + "properties": { + "target": { + "oneOf": [ + { + "items": { + "type": "string", + "enum": [ + "development", + "development", + "preview", + "preview", + "production" + ] + }, + "type": "array" + }, + { + "type": "string", + "enum": [ + "development", + "development", + "preview", + "preview", + "production" + ] + } + ] + }, + "type": { + "type": "string", + "enum": [ + "encrypted", + "plain", + "secret", + "sensitive", + "system" + ] + }, + "sunsetSecretId": { + "type": "string", + "description": "This is used to identify variables that have been migrated from type secret to sensitive." + }, + "legacyValue": { + "type": "string", + "description": "Legacy now-encryption ciphertext, present after migration swaps value/vsmValue" + }, + "decrypted": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "value": { + "type": "string" + }, + "vsmValue": { + "type": "string" + }, + "id": { + "type": "string" + }, + "key": { + "type": "string" + }, + "configurationId": { + "nullable": true, + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "updatedAt": { + "type": "number" + }, + "createdBy": { + "nullable": true, + "type": "string" + }, + "updatedBy": { + "nullable": true, + "type": "string" + }, + "gitBranch": { + "type": "string" + }, + "visibility": { + "type": "string", + "enum": [ + "config", + "secret" + ], + "description": "User-facing config/secret model. When set, authoritative for new code paths when the env-var-config-secret-ui flag is enabled. Legacy rows omit this field; legacy rows omit it and callers fall back to existing `type` behavior." + }, + "edgeConfigId": { + "nullable": true, + "type": "string" + }, + "edgeConfigTokenId": { + "nullable": true, + "type": "string" + }, + "contentHint": { + "nullable": true, + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "redis-url" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "redis-rest-api-url" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "redis-rest-api-token" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "redis-rest-api-read-only-token" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "blob-read-write-token" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "blob-store-id" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "blob-webhook-public-key" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-url" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-url-non-pooling" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-prisma-url" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-user" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-host" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-password" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-database" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-url-no-ssl" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "integration-store-secret" + ] + }, + "storeId": { + "type": "string" + }, + "integrationId": { + "type": "string" + }, + "integrationProductId": { + "type": "string" + }, + "integrationConfigurationId": { + "type": "string" + } + }, + "required": [ + "integrationConfigurationId", + "integrationId", + "integrationProductId", + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "flags-connection-string" + ] + }, + "projectId": { + "type": "string" + } + }, + "required": [ + "projectId", + "type" + ], + "type": "object" + } + ] + }, + "internalContentHint": { + "nullable": true, + "properties": { + "type": { + "type": "string", + "enum": [ + "flags-secret" + ] + }, + "encryptedValue": { + "type": "string", + "description": "Contains the `value` of the env variable, encrypted with a special key to make decryption possible in the subscriber Lambda." + } + }, + "required": [ + "encryptedValue", + "type" + ], + "type": "object", + "description": "Similar to `contentHints`, but should not be exposed to the user." + }, + "comment": { + "type": "string" + }, + "customEnvironmentIds": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "key", + "type", + "value" + ], + "type": "object" + }, + "type": "array" + }, + "customEnvironments": { + "items": { + "properties": { + "id": { + "type": "string", + "description": "Unique identifier for the custom environment (format: env_*)" + }, + "slug": { + "type": "string", + "description": "URL-friendly name of the environment" + }, + "type": { + "type": "string", + "enum": [ + "development", + "preview", + "production" + ], + "description": "The type of environment (production, preview, or development)" + }, + "description": { + "type": "string", + "description": "Optional description of the environment's purpose" + }, + "branchMatcher": { + "properties": { + "type": { + "type": "string", + "enum": [ + "endsWith", + "equals", + "startsWith" + ], + "description": "The type of matching to perform" + }, + "pattern": { + "type": "string", + "description": "The pattern to match against branch names" + } + }, + "required": [ + "pattern", + "type" + ], + "type": "object", + "description": "Configuration for matching git branches to this environment" + }, + "domains": { + "items": { + "properties": { + "name": { + "type": "string" + }, + "apexName": { + "type": "string" + }, + "projectId": { + "type": "string" + }, + "redirect": { + "nullable": true, + "type": "string" + }, + "redirectStatusCode": { + "nullable": true, + "type": "number", + "enum": [ + 301, + 302, + 307, + 308, + null + ] + }, + "gitBranch": { + "nullable": true, + "type": "string" + }, + "customEnvironmentId": { + "nullable": true, + "type": "string" + }, + "updatedAt": { + "type": "number" + }, + "createdAt": { + "type": "number" + }, + "verified": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "`true` if the domain is verified for use with the project. If `false` it will not be used as an alias on this project until the challenge in `verification` is completed." + }, + "verification": { + "items": { + "properties": { + "type": { + "type": "string" + }, + "domain": { + "type": "string" + }, + "value": { + "type": "string" + }, + "reason": { + "type": "string" + } + }, + "required": [ + "domain", + "reason", + "type", + "value" + ], + "type": "object", + "description": "A list of verification challenges, one of which must be completed to verify the domain for use on the project. After the challenge is complete `POST /projects/:idOrName/domains/:domain/verify` to verify the domain. Possible challenges: - If `verification.type = TXT` the `verification.domain` will be checked for a TXT record matching `verification.value`." + }, + "type": "array", + "description": "A list of verification challenges, one of which must be completed to verify the domain for use on the project. After the challenge is complete `POST /projects/:idOrName/domains/:domain/verify` to verify the domain. Possible challenges: - If `verification.type = TXT` the `verification.domain` will be checked for a TXT record matching `verification.value`." + } + }, + "required": [ + "apexName", + "name", + "projectId", + "verified" + ], + "type": "object", + "description": "List of domains associated with this environment" + }, + "type": "array", + "description": "List of domains associated with this environment" + }, + "currentDeploymentAliases": { + "items": { + "type": "string" + }, + "type": "array", + "description": "List of aliases for the current deployment" + }, + "createdAt": { + "type": "number", + "description": "Timestamp when the environment was created" + }, + "updatedAt": { + "type": "number", + "description": "Timestamp when the environment was last updated" + } + }, + "required": [ + "createdAt", + "id", + "slug", + "type", + "updatedAt" + ], + "type": "object", + "description": "Internal representation of a custom environment with all required properties" + }, + "type": "array" + }, + "framework": { + "nullable": true, + "type": "string", + "enum": [ + "actix-web", + "angular", + "ash", + "astro", + "axum", + "blitzjs", + "brunch", + "bun", + "container", + "create-react-app", + "django", + "docusaurus", + "docusaurus-2", + "dojo", + "eleventy", + "elysia", + "ember", + "eve", + "express", + "factory-eve", + "fastapi", + "fasthtml", + "fastify", + "flask", + "gatsby", + "go", + "gridsome", + "h3", + "hexo", + "hono", + "hugo", + "hydrogen", + "ionic-angular", + "ionic-react", + "jekyll", + "koa", + "mastra", + "middleman", + "nestjs", + "nextjs", + "nitro", + "node", + "nuxtjs", + "parcel", + "polymer", + "preact", + "python", + "react-router", + "redwoodjs", + "remix", + "ruby", + "rust", + "saber", + "sanity", + "sanity-v2", + "sapper", + "scully", + "services", + "solidstart", + "solidstart-1", + "stencil", + "storybook", + "svelte", + "sveltekit", + "sveltekit-1", + "tanstack-start", + "tanstack-start-lovable", + "umijs", + "vite", + "vitepress", + "vue", + "vuepress", + "xmcp", + "zola", + null + ] + }, + "services": { + "items": { + "properties": { + "serviceName": { + "type": "string", + "description": "Service name from the deployment (Service.name)." + }, + "serviceType": { + "type": "string", + "enum": [ + "cron", + "job", + "web", + "worker" + ], + "description": "Service kind (Service.type). Omitted for schemas that do not define one." + }, + "framework": { + "type": "string", + "enum": [ + "actix-web", + "angular", + "ash", + "astro", + "axum", + "blitzjs", + "brunch", + "bun", + "container", + "create-react-app", + "django", + "docusaurus", + "docusaurus-2", + "dojo", + "eleventy", + "elysia", + "ember", + "eve", + "express", + "factory-eve", + "fastapi", + "fasthtml", + "fastify", + "flask", + "gatsby", + "go", + "gridsome", + "h3", + "hexo", + "hono", + "hugo", + "hydrogen", + "ionic-angular", + "ionic-react", + "jekyll", + "koa", + "mastra", + "middleman", + "nestjs", + "nextjs", + "nitro", + "node", + "nuxtjs", + "parcel", + "polymer", + "preact", + "python", + "react-router", + "redwoodjs", + "remix", + "ruby", + "rust", + "saber", + "sanity", + "sanity-v2", + "sapper", + "scully", + "services", + "solidstart", + "solidstart-1", + "stencil", + "storybook", + "svelte", + "sveltekit", + "sveltekit-1", + "tanstack-start", + "tanstack-start-lovable", + "umijs", + "vite", + "vitepress", + "vue", + "vuepress", + "xmcp", + "zola" + ], + "description": "Framework slug, when the service has one (omitted otherwise)." + }, + "runtime": { + "type": "string", + "description": "Generic runtime, e.g. 'node' | 'python' | 'go' | 'ruby' | 'rust' (Service.runtime). Omitted for static builds." + } + }, + "required": [ + "serviceName" + ], + "type": "object" + }, + "type": "array" + }, + "gitForkProtection": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "gitLFS": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "id": { + "type": "string" + }, + "ipBuckets": { + "items": { + "properties": { + "bucket": { + "type": "string" + }, + "default": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "supportUntil": { + "type": "number" + } + }, + "required": [ + "bucket" + ], + "type": "object" + }, + "type": "array" + }, + "jobs": { + "properties": { + "lint": { + "properties": { + "targets": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "targets" + ], + "type": "object" + }, + "typecheck": { + "properties": { + "targets": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "targets" + ], + "type": "object" + }, + "mfe-config-present": { + "properties": { + "targets": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "targets" + ], + "type": "object" + } + }, + "type": "object" + }, + "latestDeployments": { + "items": { + "properties": { + "id": { + "type": "string" + }, + "alias": { + "items": { + "type": "string" + }, + "type": "array" + }, + "aliasAssigned": { + "nullable": true, + "oneOf": [ + { + "type": "number" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + } + ] + }, + "aliasError": { + "nullable": true, + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" + }, + "aliasFinal": { + "nullable": true, + "type": "string" + }, + "automaticAliases": { + "items": { + "type": "string" + }, + "type": "array" + }, + "branchMatcher": { + "properties": { + "type": { + "type": "string", + "enum": [ + "endsWith", + "equals", + "startsWith" + ], + "description": "The type of matching to perform" + }, + "pattern": { + "type": "string", + "description": "The pattern to match against branch names" + } + }, + "required": [ + "pattern", + "type" + ], + "type": "object" + }, + "buildingAt": { + "type": "number" + }, + "builds": { + "items": { + "properties": { + "use": { + "type": "string" + }, + "src": { + "type": "string" + }, + "dest": { + "type": "string" + } + }, + "required": [ + "use" + ], + "type": "object" + }, + "type": "array" + }, + "checksConclusion": { + "type": "string", + "enum": [ + "canceled", + "failed", + "skipped", + "succeeded" + ] + }, + "checksState": { + "type": "string", + "enum": [ + "completed", + "registered", + "running" + ] + }, + "connectBuildsEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "connectConfigurationId": { + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "createdIn": { + "type": "string" + }, + "creator": { + "nullable": true, + "properties": { + "email": { + "type": "string" + }, + "githubLogin": { + "type": "string" + }, + "gitlabLogin": { + "type": "string" + }, + "uid": { + "type": "string" + }, + "username": { + "type": "string" + } + }, + "required": [ + "email", + "uid", + "username" + ], + "type": "object" + }, + "deletedAt": { + "type": "number" + }, + "deploymentHostname": { + "type": "string" + }, + "forced": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "name": { + "type": "string" + }, + "meta": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "monorepoManager": { + "nullable": true, + "type": "string" + }, + "oidcTokenClaims": { + "properties": { + "iss": { + "type": "string" + }, + "sub": { + "type": "string" + }, + "scope": { + "type": "string" + }, + "aud": { + "type": "string" + }, + "owner": { + "type": "string" + }, + "owner_id": { + "type": "string" + }, + "project": { + "type": "string" + }, + "project_id": { + "type": "string" + }, + "environment": { + "type": "string" + }, + "custom_environment_id": { + "type": "string" + }, + "mfe_group_ids": { + "items": { + "type": "string" + }, + "type": "array" + }, + "plan": { + "type": "string" + } + }, + "required": [ + "aud", + "environment", + "iss", + "owner", + "owner_id", + "project", + "project_id", + "scope", + "sub" + ], + "type": "object" + }, + "plan": { + "type": "string", + "enum": [ + "enterprise", + "hobby", + "pro" + ] + }, + "previewCommentsEnabled": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether or not preview comments are enabled for the deployment", + "example": false + }, + "private": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "readyAt": { + "type": "number" + }, + "readyState": { + "type": "string", + "enum": [ + "BLOCKED", + "BUILDING", + "CANCELED", + "ERROR", + "INITIALIZING", + "QUEUED", + "READY" + ] + }, + "readySubstate": { + "type": "string", + "enum": [ + "PROMOTED", + "ROLLING", + "STAGED" + ] + }, + "requestedAt": { + "type": "number" + }, + "target": { + "nullable": true, + "type": "string" + }, + "teamId": { + "nullable": true, + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "LAMBDAS" + ] + }, + "url": { + "type": "string" + }, + "userId": { + "type": "string", + "description": "Present for user creators; omitted for app/integration/system creators." + }, + "withCache": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "createdAt", + "createdIn", + "creator", + "deploymentHostname", + "id", + "name", + "plan", + "private", + "readyState", + "type", + "url" + ], + "type": "object" + }, + "type": "array" + }, + "link": { + "oneOf": [ + { + "properties": { + "org": { + "type": "string" + }, + "repoOwnerId": { + "type": "number", + "description": "A new field, should be included in all new project links, is being added just in time when a deployment is created. This is needed for Protected Git scopes." + }, + "repo": { + "type": "string" + }, + "repoId": { + "type": "number" + }, + "type": { + "type": "string", + "enum": [ + "github" + ] + }, + "createdAt": { + "type": "number" + }, + "deployHooks": { + "items": { + "properties": { + "createdAt": { + "type": "number" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "ref": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "ref", + "url" + ], + "type": "object" + }, + "type": "array" + }, + "gitCredentialId": { + "type": "string" + }, + "updatedAt": { + "type": "number" + }, + "sourceless": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "productionBranch": { + "type": "string" + } + }, + "required": [ + "deployHooks", + "gitCredentialId", + "org", + "productionBranch", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "github-limited" + ] + }, + "repo": { + "type": "string" + }, + "repoId": { + "type": "number" + }, + "createdAt": { + "type": "number" + }, + "updatedAt": { + "type": "number" + }, + "org": { + "type": "string" + }, + "repoOwnerId": { + "type": "number", + "description": "A new field, should be included in all new project links, is being added just in time when a deployment is created. This is needed for Protected Git scopes." + }, + "deployHooks": { + "items": { + "properties": { + "createdAt": { + "type": "number" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "ref": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "ref", + "url" + ], + "type": "object" + }, + "type": "array" + }, + "gitCredentialId": { + "type": "string" + }, + "sourceless": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "productionBranch": { + "type": "string" + } + }, + "required": [ + "deployHooks", + "gitCredentialId", + "org", + "productionBranch", + "type" + ], + "type": "object" + }, + { + "properties": { + "org": { + "type": "string" + }, + "repoOwnerId": { + "type": "number", + "description": "A new field, should be included in all new project links, is being added just in time when a deployment is created. This is needed for Protected Git scopes." + }, + "repo": { + "type": "string" + }, + "repoId": { + "type": "number" + }, + "type": { + "type": "string", + "enum": [ + "github-custom-host" + ] + }, + "host": { + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "deployHooks": { + "items": { + "properties": { + "createdAt": { + "type": "number" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "ref": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "ref", + "url" + ], + "type": "object" + }, + "type": "array" + }, + "gitCredentialId": { + "type": "string" + }, + "updatedAt": { + "type": "number" + }, + "sourceless": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "productionBranch": { + "type": "string" + } + }, + "required": [ + "deployHooks", + "gitCredentialId", + "host", + "org", + "productionBranch", + "type" + ], + "type": "object" + }, + { + "properties": { + "projectId": { + "type": "string" + }, + "projectName": { + "type": "string" + }, + "projectNameWithNamespace": { + "type": "string" + }, + "projectNamespace": { + "type": "string" + }, + "projectOwnerId": { + "type": "number", + "description": "A new field, should be included in all new project links, is being added just in time when a deployment is created. This is needed for Protected Git scopes. This is the id of the top level group that a namespace belongs to. Gitlab supports group nesting (up to 20 levels)." + }, + "projectUrl": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "gitlab" + ] + }, + "createdAt": { + "type": "number" + }, + "deployHooks": { + "items": { + "properties": { + "createdAt": { + "type": "number" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "ref": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "ref", + "url" + ], + "type": "object" + }, + "type": "array" + }, + "gitCredentialId": { + "type": "string" + }, + "updatedAt": { + "type": "number" + }, + "sourceless": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "productionBranch": { + "type": "string" + } + }, + "required": [ + "deployHooks", + "gitCredentialId", + "productionBranch", + "projectId", + "projectName", + "projectNameWithNamespace", + "projectNamespace", + "projectUrl", + "type" + ], + "type": "object" + }, + { + "properties": { + "name": { + "type": "string" + }, + "slug": { + "type": "string" + }, + "owner": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "bitbucket" + ] + }, + "uuid": { + "type": "string" + }, + "workspaceUuid": { + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "deployHooks": { + "items": { + "properties": { + "createdAt": { + "type": "number" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "ref": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "ref", + "url" + ], + "type": "object" + }, + "type": "array" + }, + "gitCredentialId": { + "type": "string" + }, + "updatedAt": { + "type": "number" + }, + "sourceless": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "productionBranch": { + "type": "string" + } + }, + "required": [ + "deployHooks", + "gitCredentialId", + "name", + "owner", + "productionBranch", + "slug", + "type", + "uuid", + "workspaceUuid" + ], + "type": "object" + }, + { + "properties": { + "org": { + "type": "string" + }, + "repo": { + "type": "string" + }, + "repoId": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "vercel" + ] + }, + "createdAt": { + "type": "number" + }, + "deployHooks": { + "items": { + "properties": { + "createdAt": { + "type": "number" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "ref": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "ref", + "url" + ], + "type": "object" + }, + "type": "array" + }, + "gitCredentialId": { + "type": "string" + }, + "updatedAt": { + "type": "number" + }, + "sourceless": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "productionBranch": { + "type": "string" + } + }, + "required": [ + "deployHooks", + "gitCredentialId", + "org", + "productionBranch", + "repo", + "repoId", + "type" + ], + "type": "object" + }, + { + "properties": { + "org": { + "type": "string" + }, + "repo": { + "type": "string" + }, + "repoId": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "v0" + ] + }, + "createdAt": { + "type": "number" + }, + "deployHooks": { + "items": { + "properties": { + "createdAt": { + "type": "number" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "ref": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "ref", + "url" + ], + "type": "object" + }, + "type": "array" + }, + "gitCredentialId": { + "type": "string" + }, + "updatedAt": { + "type": "number" + }, + "sourceless": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "productionBranch": { + "type": "string" + } + }, + "required": [ + "deployHooks", + "gitCredentialId", + "org", + "productionBranch", + "repo", + "repoId", + "type" + ], + "type": "object" + }, + { + "properties": { + "owner": { + "type": "string", + "description": "Owner (namespace) slug, e.g. `acme`." + }, + "repo": { + "type": "string" + }, + "repoId": { + "type": "string", + "description": "Origin repository id." + }, + "ownerId": { + "type": "string", + "description": "Origin namespace id (`ns_…`) of the owner." + }, + "type": { + "type": "string", + "enum": [ + "cursor-origin" + ] + }, + "createdAt": { + "type": "number" + }, + "deployHooks": { + "items": { + "properties": { + "createdAt": { + "type": "number" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "ref": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "ref", + "url" + ], + "type": "object" + }, + "type": "array" + }, + "gitCredentialId": { + "type": "string" + }, + "updatedAt": { + "type": "number" + }, + "sourceless": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "productionBranch": { + "type": "string" + } + }, + "required": [ + "deployHooks", + "gitCredentialId", + "owner", + "ownerId", + "productionBranch", + "repo", + "repoId", + "type" + ], + "type": "object" + } + ] + }, + "blobs": { + "properties": { + "isDefaultApp": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Marks the team-level, Vercel-managed default blob project (`vercel-blob-default-project`) that orphan blob stores are scoped to when connected without an explicit project. Set only by internal storage flows and immutable after creation — guards rely on it to protect the connected stores from being lost when the project is deleted or transferred." + } + }, + "type": "object" + }, + "microfrontends": { + "oneOf": [ + { + "properties": { + "isDefaultApp": { + "type": "boolean", + "enum": [ + true + ] + }, + "updatedAt": { + "type": "number", + "description": "Timestamp when the microfrontends settings were last updated." + }, + "groupIds": { + "type": "array", + "items": { + "type": "string" + }, + "minItems": 1, + "description": "The group IDs of microfrontends that this project belongs to. Each microfrontend project must belong to a microfrontends group that is the set of microfrontends that are used together." + }, + "enabled": { + "type": "boolean", + "enum": [ + true + ], + "description": "Whether microfrontends are enabled for this project." + }, + "defaultRoute": { + "type": "string", + "description": "A path that is used to take screenshots and as the default path in preview links when a domain for this microfrontend is shown in the UI. Includes the leading slash, e.g. `/docs`" + }, + "freeProjectForLegacyLimits": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether the project was part of the legacy limits for hobby and pro-trial before billing was added. This field is only set when the team is upgraded to a paid plan and we are backfilling the subscription status. We cap the subscription to 2 projects and set this field for the 3rd project. When this field is set, the project is not charged for and we do not call any billing APIs for this project." + } + }, + "required": [ + "enabled", + "groupIds", + "isDefaultApp", + "updatedAt" + ], + "type": "object" + }, + { + "properties": { + "isDefaultApp": { + "type": "boolean", + "enum": [ + false + ] + }, + "routeObservabilityToThisProject": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether observability data should be routed to this microfrontend project or a root project." + }, + "doNotRouteWithMicrofrontendsRouting": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether to add microfrontends routing to aliases. This means domains in this project will route as a microfrontend." + }, + "updatedAt": { + "type": "number", + "description": "Timestamp when the microfrontends settings were last updated." + }, + "groupIds": { + "type": "array", + "items": { + "type": "string" + }, + "minItems": 1, + "description": "The group IDs of microfrontends that this project belongs to. Each microfrontend project must belong to a microfrontends group that is the set of microfrontends that are used together." + }, + "enabled": { + "type": "boolean", + "enum": [ + true + ], + "description": "Whether microfrontends are enabled for this project." + }, + "defaultRoute": { + "type": "string", + "description": "A path that is used to take screenshots and as the default path in preview links when a domain for this microfrontend is shown in the UI. Includes the leading slash, e.g. `/docs`" + }, + "freeProjectForLegacyLimits": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether the project was part of the legacy limits for hobby and pro-trial before billing was added. This field is only set when the team is upgraded to a paid plan and we are backfilling the subscription status. We cap the subscription to 2 projects and set this field for the 3rd project. When this field is set, the project is not charged for and we do not call any billing APIs for this project." + } + }, + "required": [ + "enabled", + "groupIds", + "updatedAt" + ], + "type": "object" + }, + { + "properties": { + "updatedAt": { + "type": "number" + }, + "groupIds": { + "type": "array", + "items": {}, + "minItems": 0, + "maxItems": 0 + }, + "enabled": { + "type": "boolean", + "enum": [ + false + ] + }, + "freeProjectForLegacyLimits": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "enabled", + "groupIds", + "updatedAt" + ], + "type": "object" + } + ] + }, + "name": { + "type": "string" + }, + "nodeVersion": { + "type": "string", + "enum": [ + "10.x", + "12.x", + "14.x", + "16.x", + "18.x", + "20.x", + "22.x", + "24.x", + "8.10.x" + ] + }, + "optionsAllowlist": { + "nullable": true, + "properties": { + "paths": { + "items": { + "properties": { + "value": { + "type": "string" + } + }, + "required": [ + "value" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "paths" + ], + "type": "object" + }, + "outputDirectory": { + "nullable": true, + "type": "string" + }, + "passwordProtection": { + "nullable": true, + "type": "object" + }, + "passport": { + "nullable": true, + "properties": { + "deploymentType": { + "type": "string", + "enum": [ + "all", + "all_except_custom_domains", + "preview", + "prod_deployment_urls_and_all_previews" + ] + }, + "connectorId": { + "type": "string" + } + }, + "required": [ + "connectorId", + "deploymentType" + ], + "type": "object" + }, + "protectionConfig": { + "properties": { + "sandboxUrls": { + "properties": { + "inheritDeploymentProtection": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "type": "object" + } + }, + "type": "object" + }, + "sandbox": { + "properties": { + "region": { + "type": "string", + "enum": [ + "arn1", + "bom1", + "cdg1", + "cle1", + "cpt1", + "dub1", + "fra1", + "gru1", + "hkg1", + "hnd1", + "iad1", + "icn1", + "kix1", + "lhr1", + "pdx1", + "sfo1", + "sin1", + "syd1", + "yul1" + ] + }, + "failoverRegions": { + "items": { + "type": "string", + "enum": [ + "arn1", + "bom1", + "cdg1", + "cle1", + "cpt1", + "dub1", + "fra1", + "gru1", + "hkg1", + "hnd1", + "iad1", + "icn1", + "kix1", + "lhr1", + "pdx1", + "sfo1", + "sin1", + "syd1", + "yul1" + ] + }, + "type": "array" + } + }, + "type": "object" + }, + "productionDeploymentsFastLane": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "resourceConfig": { + "properties": { + "elasticConcurrencyEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "fluid": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "functionDefaultRegions": { + "items": { + "type": "string" + }, + "type": "array" + }, + "functionDefaultTimeout": { + "type": "number" + }, + "functionDefaultMemoryType": { + "type": "string", + "enum": [ + "performance", + "performance_xl", + "standard", + "standard_legacy" + ] + }, + "functionZeroConfigFailover": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "buildMachineType": { + "type": "string", + "enum": [ + "basic", + "enhanced", + "standard", + "turbo" + ] + }, + "buildMachineSelection": { + "type": "string", + "enum": [ + "elastic", + "fixed" + ] + }, + "buildMachineElasticLastUpdated": { + "type": "number" + }, + "buildMachineElasticReason": { + "type": "string", + "enum": [ + "basic-floor", + "build-timeout-failure", + "enospc-failure", + "enterprise-floor", + "high-peak-disk", + "high-peak-memory", + "long-build-duration", + "oom-failure", + "short-build-duration", + "sustained-high-cpu" + ] + }, + "isNSNBDisabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "buildQueue": { + "properties": { + "configuration": { + "type": "string", + "enum": [ + "SKIP_NAMESPACE_QUEUE", + "WAIT_FOR_NAMESPACE_QUEUE" + ] + } + }, + "type": "object" + }, + "enableFunctionsBeta": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "type": "object", + "required": [ + "functionDefaultRegions" + ] + }, + "rollbackDescription": { + "properties": { + "userId": { + "type": "string", + "description": "The user who rolled back the project." + }, + "username": { + "type": "string", + "description": "The username of the user who rolled back the project." + }, + "description": { + "type": "string", + "description": "User-supplied explanation of why they rolled back the project. Limited to 250 characters." + }, + "createdAt": { + "type": "number", + "description": "Timestamp of when the rollback was requested." + } + }, + "required": [ + "createdAt", + "description", + "userId", + "username" + ], + "type": "object", + "description": "Description of why a project was rolled back, and by whom. Note that lastAliasRequest contains the from/to details of the rollback." + }, + "rollingRelease": { + "nullable": true, + "properties": { + "target": { + "type": "string", + "description": "The environment that the release targets, currently only supports production. Adding in case we want to configure with alias groups or custom environments.", + "example": "production" + }, + "stages": { + "nullable": true, + "items": { + "properties": { + "targetPercentage": { + "type": "number", + "description": "The percentage of traffic to serve to the canary deployment (0-100)", + "example": 25 + }, + "requireApproval": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether or not this stage requires manual approval to proceed", + "example": false + }, + "duration": { + "type": "number", + "description": "Duration in minutes for automatic advancement to the next stage", + "example": 600 + }, + "linearShift": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether to linearly shift traffic over the duration of this stage", + "example": false + } + }, + "required": [ + "targetPercentage" + ], + "type": "object", + "description": "An array of all the stages required during a deployment release. Each stage defines a target percentage and advancement rules. The final stage must always have targetPercentage: 100." + }, + "type": "array", + "description": "An array of all the stages required during a deployment release. Each stage defines a target percentage and advancement rules. The final stage must always have targetPercentage: 100." + }, + "canaryResponseHeader": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether the request served by a canary deployment should return a header indicating a canary was served. Defaults to `false` when omitted.", + "example": false + }, + "gate": { + "properties": { + "enabled": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether automated gating is enabled for this project's rollouts." + }, + "checks": { + "items": { + "properties": { + "type": { + "type": "string", + "enum": [ + "error-rate-5xx" + ], + "description": "The metric this check evaluates." + }, + "minSampleSize": { + "type": "number", + "description": "Minimum number of requests required in the window before the check can fail. Below this, the check is inconclusive rather than failing, so low-traffic stages don't gate on noise. Defaults to `100` when omitted.", + "example": 100 + }, + "excludeStatusCodes": { + "items": { + "type": "number" + }, + "type": "array", + "description": "Response status codes to ignore entirely — dropped from both the numerator (errors) and the denominator (total requests). Defaults to `[]` when omitted.", + "example": [ + 503 + ] + }, + "excludePaths": { + "items": { + "type": "string" + }, + "type": "array", + "description": "Request paths to ignore entirely — dropped from both the numerator (errors) and the denominator (total requests). Matched exactly against the request path with any query string removed; no prefix or glob matching. Defaults to `[]` when omitted.", + "example": [ + "/api/health" + ] + }, + "ingestWatermarkSeconds": { + "type": "number", + "description": "Seconds of ingest lag to allow for: the query's upper bound is `now() - this value`, so the check never reads a window that is still filling. Defaults to `30` when omitted.", + "example": 30 + } + }, + "required": [ + "type" + ], + "type": "object", + "description": "The checks to evaluate. An empty array means nothing is evaluated." + }, + "type": "array", + "description": "The checks to evaluate. An empty array means nothing is evaluated." + }, + "failureThreshold": { + "type": "number", + "description": "How many failing evaluations within {@link windowSize} trip the gate. Defaults to `3` when omitted.", + "example": 3 + }, + "windowSize": { + "type": "number", + "description": "How many of the most recent evaluations {@link failureThreshold} is counted against. Defaults to `5` when omitted.", + "example": 5 + }, + "action": { + "type": "string", + "enum": [ + "pause", + "rollback" + ], + "description": "What to do when the gate trips: pause the rollout, or roll it back." + }, + "dryRun": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "When true, a tripped gate is only reported — {@link action} is not taken." + } + }, + "required": [ + "action", + "checks", + "dryRun", + "enabled" + ], + "type": "object", + "description": "Automated gating configuration. Omitted (the default) means no gating is configured, which is equivalent to `enabled: false`." + } + }, + "required": [ + "target" + ], + "type": "object", + "description": "Project-level rolling release configuration that defines how deployments should be gradually rolled out" + }, + "defaultResourceConfig": { + "properties": { + "elasticConcurrencyEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "fluid": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "functionDefaultRegions": { + "items": { + "type": "string" + }, + "type": "array" + }, + "functionDefaultTimeout": { + "type": "number" + }, + "functionDefaultMemoryType": { + "type": "string", + "enum": [ + "performance", + "performance_xl", + "standard", + "standard_legacy" + ] + }, + "functionZeroConfigFailover": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "buildMachineType": { + "type": "string", + "enum": [ + "basic", + "enhanced", + "standard", + "turbo" + ] + }, + "buildMachineSelection": { + "type": "string", + "enum": [ + "elastic", + "fixed" + ] + }, + "buildMachineElasticLastUpdated": { + "type": "number" + }, + "buildMachineElasticReason": { + "type": "string", + "enum": [ + "basic-floor", + "build-timeout-failure", + "enospc-failure", + "enterprise-floor", + "high-peak-disk", + "high-peak-memory", + "long-build-duration", + "oom-failure", + "short-build-duration", + "sustained-high-cpu" + ] + }, + "isNSNBDisabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "buildQueue": { + "properties": { + "configuration": { + "type": "string", + "enum": [ + "SKIP_NAMESPACE_QUEUE", + "WAIT_FOR_NAMESPACE_QUEUE" + ] + } + }, + "type": "object" + }, + "enableFunctionsBeta": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "type": "object", + "required": [ + "functionDefaultRegions" + ] + }, + "rootDirectory": { + "nullable": true, + "type": "string" + }, + "serverlessFunctionZeroConfigFailover": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "skewProtectionBoundaryAt": { + "type": "number" + }, + "skewProtectionMaxAge": { + "type": "number" + }, + "skewProtectionAllowedDomains": { + "items": { + "type": "string" + }, + "type": "array" + }, + "skipGitConnectDuringLink": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "staticIps": { + "properties": { + "builds": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "enabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "regions": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "builds", + "enabled", + "regions" + ], + "type": "object" + }, + "sourceFilesOutsideRootDirectory": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "enableAffectedProjectsDeployments": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "enableExternalRewriteCaching": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "ssoProtection": { + "nullable": true, + "properties": { + "deploymentType": { + "type": "string", + "enum": [ + "all", + "all_except_custom_domains", + "preview", + "prod_deployment_urls_and_all_previews" + ] + }, + "cve55182MigrationAppliedFrom": { + "nullable": true, + "type": "string", + "enum": [ + "all", + "all_except_custom_domains", + "preview", + "prod_deployment_urls_and_all_previews", + null + ] + }, + "april2026SecurityIncidentMigrationAppliedFrom": { + "nullable": true, + "type": "string", + "enum": [ + "all", + "all_except_custom_domains", + "preview", + "prod_deployment_urls_and_all_previews", + null + ] + } + }, + "required": [ + "deploymentType" + ], + "type": "object" + }, + "targets": { + "additionalProperties": { + "nullable": true, + "properties": { + "id": { + "type": "string" + }, + "alias": { + "items": { + "type": "string" + }, + "type": "array" + }, + "aliasAssigned": { + "nullable": true, + "oneOf": [ + { + "type": "number" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + } + ] + }, + "aliasError": { + "nullable": true, + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" + }, + "aliasFinal": { + "nullable": true, + "type": "string" + }, + "automaticAliases": { + "items": { + "type": "string" + }, + "type": "array" + }, + "branchMatcher": { + "properties": { + "type": { + "type": "string", + "enum": [ + "endsWith", + "equals", + "startsWith" + ], + "description": "The type of matching to perform" + }, + "pattern": { + "type": "string", + "description": "The pattern to match against branch names" + } + }, + "required": [ + "pattern", + "type" + ], + "type": "object" + }, + "buildingAt": { + "type": "number" + }, + "builds": { + "items": { + "properties": { + "use": { + "type": "string" + }, + "src": { + "type": "string" + }, + "dest": { + "type": "string" + } + }, + "required": [ + "use" + ], + "type": "object" + }, + "type": "array" + }, + "checksConclusion": { + "type": "string", + "enum": [ + "canceled", + "failed", + "skipped", + "succeeded" + ] + }, + "checksState": { + "type": "string", + "enum": [ + "completed", + "registered", + "running" + ] + }, + "connectBuildsEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "connectConfigurationId": { + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "createdIn": { + "type": "string" + }, + "creator": { + "nullable": true, + "properties": { + "email": { + "type": "string" + }, + "githubLogin": { + "type": "string" + }, + "gitlabLogin": { + "type": "string" + }, + "uid": { + "type": "string" + }, + "username": { + "type": "string" + } + }, + "required": [ + "email", + "uid", + "username" + ], + "type": "object" + }, + "deletedAt": { + "type": "number" + }, + "deploymentHostname": { + "type": "string" + }, + "forced": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "name": { + "type": "string" + }, + "meta": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "monorepoManager": { + "nullable": true, + "type": "string" + }, + "oidcTokenClaims": { + "properties": { + "iss": { + "type": "string" + }, + "sub": { + "type": "string" + }, + "scope": { + "type": "string" + }, + "aud": { + "type": "string" + }, + "owner": { + "type": "string" + }, + "owner_id": { + "type": "string" + }, + "project": { + "type": "string" + }, + "project_id": { + "type": "string" + }, + "environment": { + "type": "string" + }, + "custom_environment_id": { + "type": "string" + }, + "mfe_group_ids": { + "items": { + "type": "string" + }, + "type": "array" + }, + "plan": { + "type": "string" + } + }, + "required": [ + "aud", + "environment", + "iss", + "owner", + "owner_id", + "project", + "project_id", + "scope", + "sub" + ], + "type": "object" + }, + "plan": { + "type": "string", + "enum": [ + "enterprise", + "hobby", + "pro" + ] + }, + "previewCommentsEnabled": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether or not preview comments are enabled for the deployment", + "example": false + }, + "private": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "readyAt": { + "type": "number" + }, + "readyState": { + "type": "string", + "enum": [ + "BLOCKED", + "BUILDING", + "CANCELED", + "ERROR", + "INITIALIZING", + "QUEUED", + "READY" + ] + }, + "readySubstate": { + "type": "string", + "enum": [ + "PROMOTED", + "ROLLING", + "STAGED" + ] + }, + "requestedAt": { + "type": "number" + }, + "target": { + "nullable": true, + "type": "string" + }, + "teamId": { + "nullable": true, + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "LAMBDAS" + ] + }, + "url": { + "type": "string" + }, + "userId": { + "type": "string", + "description": "Present for user creators; omitted for app/integration/system creators." + }, + "withCache": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "createdAt", + "createdIn", + "creator", + "deploymentHostname", + "id", + "name", + "plan", + "private", + "readyState", + "type", + "url" + ], + "type": "object" + }, + "type": "object" + }, + "transferCompletedAt": { + "type": "number" + }, + "transferStartedAt": { + "type": "number" + }, + "transferToAccountId": { + "type": "string" + }, + "transferredFromAccountId": { + "type": "string" + }, + "updatedAt": { + "type": "number" + }, + "live": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "enablePreviewFeedback": { + "nullable": true, + "type": "boolean", + "enum": [ + false, + true, + null + ] + }, + "enableProductionFeedback": { + "nullable": true, + "type": "boolean", + "enum": [ + false, + true, + null + ] + }, + "permissions": { + "properties": { + "oauth2Connection": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "user": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "userConnection": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "userMfaConfiguration": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "userPreference": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "userSudo": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "webAuthn": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "accessGroup": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "agent": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aiGatewayApiKey": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aiGatewayApiKeyBypassAll": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aiGatewayApiKeyOwnedBySelf": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aiGatewayApiKeySpendAttribution": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aiGatewayApiKeyZdrExemption": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aiGatewayBudget": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aiGatewayCredits": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aiGatewayPrivateModels": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aiGatewayGuardrails": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aiGatewayRules": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aiGatewaySettings": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aiGatewayTranscripts": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aiGatewayTranscriptsSettings": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aiGatewayUsage": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aiGatewayVirtualModelConfigs": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "alerts": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "alertRules": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aliasGlobal": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "analyticsSampling": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "analyticsUsage": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "apiKey": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "apiKeyAiGateway": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "apiKeyOwnedBySelf": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "oauth2Application": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "vercelAppInstallation": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "vercelAppInstallationRequest": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "auditLog": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "automation": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "billingAddress": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "billingInformation": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "billingInvoice": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "billingInvoiceEmailRecipient": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "billingInvoiceLanguage": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "billingPlan": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "billingPurchaseOrder": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "billingRefund": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "billingTaxId": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "blob": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "blobStoreTokenSet": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "budget": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "cacheArtifact": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "cacheArtifactUsageEvent": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "codeChecks": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "codeOwners": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "ciInvocations": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "ciLogs": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "concurrentBuilds": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "connect": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "connectConfiguration": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "connectLogs": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "connexClient": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "connexClientProject": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "connexContact": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "connexInstallation": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "connexToken": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "buildMachineDefault": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "cursorOriginInstallation": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "dataCacheBillingSettings": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "defaultDeploymentProtection": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "deploymentPolicy": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "domain": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "domainAcceptDelegation": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "domainAuthCodes": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "domainCertificate": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "domainCheckConfig": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "domainMove": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "domainPurchase": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "domainRecord": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "domainTransferIn": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "drain": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "edgeConfig": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "edgeConfigItem": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "edgeConfigSchema": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "edgeConfigToken": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "endpointVerification": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "event": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "fileUpload": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "flagsExplorerSubscription": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "gitRepository": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "imageOptimizationNewPrice": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integration": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integrationAccount": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integrationConfiguration": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integrationConfigurationProjects": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integrationConfigurationRole": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integrationConfigurationTransfer": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integrationDeploymentAction": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integrationEvent": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integrationLog": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integrationResource": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integrationResourceData": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integrationResourceReplCommand": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integrationResourceSecrets": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integrationSSOSession": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integrationStrict": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integrationStoreTokenSet": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integrationVercelConfigurationOverride": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integrationPullRequest": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "ipBlocking": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "jobGlobal": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "kmsIssuer": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "kmsProjectGrant": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "logDrain": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "marketplaceBillingData": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "marketplaceExperimentationEdgeConfigData": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "marketplaceExperimentationItem": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "marketplaceFlexCommit": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "marketplaceInstallationMember": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "marketplaceInvoice": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "marketplaceSettings": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "Monitoring": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "monitoringAlert": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "monitoringChart": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "monitoringQuery": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "monitoringSettings": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "notificationCustomerBudget": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "notificationDeploymentFailed": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "notificationDomainConfiguration": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "notificationDomainExpire": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "notificationDomainMoved": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "notificationDomainPurchase": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "notificationDomainRenewal": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "notificationDomainTransfer": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "notificationDomainUnverified": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "NotificationMonitoringAlert": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "notificationPaymentFailed": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "notificationPreferences": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "notificationStatementOfReasons": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "notificationUsageAlert": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "oidcFederationPolicy": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "observabilityConfiguration": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "observabilityFunnel": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "observabilityNotebook": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "openTelemetryEndpoint": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "ownEvent": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "organization": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "organizationDomain": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "organizationTeam": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "passwordProtectionInvoiceItem": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "paymentMethod": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "permissions": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "postgres": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "postgresStoreTokenSet": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "previewDeploymentSuffix": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "privateCloudAccount": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectTransferIn": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectTransferRequest": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "proTrialOnboarding": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "rateLimit": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "redis": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "redisStoreTokenSet": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "remoteCaching": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "repository": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "samlConfig": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "secret": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "securityConfig": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "sensitiveEnvironmentVariablePolicy": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "sharedEnvVars": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "sharedEnvVarsProduction": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "space": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "spaceRun": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "storeIsLocked": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "storeTokenSetSensitive": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "storeTransfer": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "supportCase": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "supportCaseComment": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "team": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "teamAccessRequest": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "teamFellowMembership": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "teamGitExclusivity": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "teamInvite": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "teamInviteCode": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "teamInviteLink": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "teamJoin": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "teamMemberMfaStatus": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "teamMicrofrontends": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "teamOwnMembership": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "teamOwnMembershipDisconnectSAML": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "teamSudo": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "teamTokenInvalidation": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "token": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "toolbarComment": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "usage": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "usageCycle": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "vcrRepository": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "vpcPeeringConnection": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "webAnalyticsPlan": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "webhook": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "webhook-event": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aliasProject": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aliasProtectionBypass": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "bulkRedirects": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "buildMachine": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "connectConfigurationLink": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "dataCacheNamespace": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "deployment": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "deploymentBuildLogs": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "deploymentCheck": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "deploymentCheckPreview": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "deploymentCheckReRunFromProductionBranch": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "deploymentProductionGit": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "deploymentV0": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "deploymentPreview": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "deploymentPrivate": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "deploymentPromote": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "deploymentRollback": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "edgeCacheNamespace": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "environments": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "job": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "logs": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "logsPreset": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "observabilityData": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "onDemandBuild": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "onDemandConcurrency": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "optionsAllowlist": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "passwordProtection": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "privateLinkEndpoint": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "productionAliasProtectionBypass": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "productionShareableLink": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "project": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectAccessGroup": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectAnalyticsSampling": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectAnalyticsUsage": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectCheck": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectCheckRun": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectDeploymentExpiration": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectDeploymentHook": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectDeploymentProtectionStrict": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectDomain": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectDomainCheckConfig": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectDomainMove": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectDomainVerify": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectEvent": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectEnvVars": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectEnvVarsProduction": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectEnvVarsUnownedByIntegration": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectFlags": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectFlagsProduction": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectFlagsSdkKey": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectFromV0": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectId": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectIntegrationConfiguration": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectLink": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectMember": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectMonitoring": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectOIDCToken": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectPermissions": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectProductionBranch": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectProtectionBypass": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectRollingRelease": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectRoutes": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectSupportCase": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectSupportCaseComment": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectTier": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectTransfer": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectTransferOut": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectUsage": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "pageIntegrity": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "seawallConfig": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "securityPlusConfiguration": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "shareableLink": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "shareableLinkStrict": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "sharedEnvVarConnection": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "skewProtection": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "analytics": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "trustedIps": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "trustedSources": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "v0Chat": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "vercelAuth": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "vercelRun": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "webAnalytics": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "workflowRunData": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + } + }, + "type": "object" + }, + "lastRollbackTarget": { + "nullable": true, + "type": "object" + }, + "lastAliasRequest": { + "nullable": true, + "properties": { + "fromDeploymentId": { + "nullable": true, + "type": "string" + }, + "toDeploymentId": { + "type": "string" + }, + "fromRollingReleaseId": { + "type": "string", + "description": "If rolling back from a rolling release, fromDeploymentId captures the \"base\" of that rolling release, and fromRollingReleaseId captures the \"target\" of that rolling release." + }, + "jobStatus": { + "type": "string", + "enum": [ + "failed", + "in-progress", + "pending", + "skipped", + "succeeded" + ] + }, + "requestedAt": { + "type": "number" + }, + "type": { + "type": "string", + "enum": [ + "promote", + "rollback" + ] + } + }, + "required": [ + "fromDeploymentId", + "jobStatus", + "requestedAt", + "toDeploymentId", + "type" + ], + "type": "object" + }, + "protectionBypass": { + "additionalProperties": { + "oneOf": [ + { + "properties": { + "createdAt": { + "type": "number" + }, + "createdBy": { + "type": "string" + }, + "scope": { + "type": "string", + "enum": [ + "integration-automation-bypass" + ] + }, + "integrationId": { + "type": "string" + }, + "configurationId": { + "type": "string" + } + }, + "required": [ + "configurationId", + "createdAt", + "createdBy", + "integrationId", + "scope" + ], + "type": "object" + }, + { + "properties": { + "createdAt": { + "type": "number" + }, + "createdBy": { + "type": "string" + }, + "scope": { + "type": "string", + "enum": [ + "automation-bypass" + ] + }, + "isEnvVar": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "When there was only one bypass, it was automatically set as an env var on deployments. With multiple bypasses, there is always one bypass that is selected as the default, and gets set as an env var on deployments. As this is a new field, undefined means that the bypass is the env var. If there are any automation bypasses, exactly one must be the env var." + }, + "note": { + "type": "string", + "description": "Optional note about the bypass to be displayed in the UI" + } + }, + "required": [ + "createdAt", + "createdBy", + "scope" + ], + "type": "object" + } + ] + }, + "type": "object" + }, + "hasActiveBranches": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "trustedIps": { + "nullable": true, + "oneOf": [ + { + "properties": { + "deploymentType": { + "type": "string", + "enum": [ + "all", + "all_except_custom_domains", + "preview", + "prod_deployment_urls_and_all_previews", + "production" + ] + }, + "addresses": { + "items": { + "properties": { + "value": { + "type": "string" + }, + "note": { + "type": "string" + } + }, + "required": [ + "value" + ], + "type": "object" + }, + "type": "array" + }, + "protectionMode": { + "type": "string", + "enum": [ + "additional", + "exclusive" + ] + } + }, + "required": [ + "addresses", + "deploymentType", + "protectionMode" + ], + "type": "object" + }, + { + "properties": { + "deploymentType": { + "type": "string", + "enum": [ + "all", + "all_except_custom_domains", + "preview", + "prod_deployment_urls_and_all_previews", + "production" + ] + } + }, + "required": [ + "deploymentType" + ], + "type": "object" + } + ] + }, + "trustedSources": { + "nullable": true, + "properties": { + "enableVercelCiSameRepository": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Allow same-team Vercel CI access to preview deployments built from the CI run's repository, using the deployment source rather than the current project repository link. Defaults to enabled when not stored; omitted or null Trusted Sources updates preserve the stored value." + }, + "projects": { + "additionalProperties": { + "properties": { + "label": { + "type": "string" + }, + "customAllow": { + "items": { + "properties": { + "from": { + "oneOf": [ + { + "properties": { + "slugs": { + "items": { + "type": "string" + }, + "type": "array", + "description": "System environment slugs (`production`, `preview`) and/or custom environment slugs defined on the referenced project." + }, + "preset": { + "type": "string", + "enum": [ + "all-custom" + ] + } + }, + "required": [ + "slugs" + ], + "type": "object", + "description": "The source envs on the trusted project that are allowed to access `to`." + }, + { + "properties": { + "slugs": { + "items": { + "type": "string" + }, + "type": "array", + "description": "System environment slugs (`production`, `preview`) and/or custom environment slugs defined on the referenced project." + }, + "preset": { + "type": "string", + "enum": [ + "all-custom" + ] + } + }, + "required": [ + "preset" + ], + "type": "object", + "description": "The source envs on the trusted project that are allowed to access `to`." + } + ] + }, + "to": { + "oneOf": [ + { + "properties": { + "slugs": { + "items": { + "type": "string" + }, + "type": "array", + "description": "System environment slugs (`production`, `preview`) and/or custom environment slugs defined on the referenced project." + }, + "preset": { + "type": "string", + "enum": [ + "all-custom" + ] + } + }, + "required": [ + "slugs" + ], + "type": "object", + "description": "The target envs on the current project that may be accessed." + }, + { + "properties": { + "slugs": { + "items": { + "type": "string" + }, + "type": "array", + "description": "System environment slugs (`production`, `preview`) and/or custom environment slugs defined on the referenced project." + }, + "preset": { + "type": "string", + "enum": [ + "all-custom" + ] + } + }, + "required": [ + "preset" + ], + "type": "object", + "description": "The target envs on the current project that may be accessed." + } + ] + } + }, + "required": [ + "from", + "to" + ], + "type": "object", + "description": "Optional overrides for the default same-env-by-slug matching. Provide explicit rules to allow cross-env access or presets." + }, + "type": "array", + "description": "Optional overrides for the default same-env-by-slug matching. Provide explicit rules to allow cross-env access or presets." + } + }, + "type": "object" + }, + "type": "object" + }, + "oidcProviders": { + "additionalProperties": { + "items": { + "properties": { + "to": { + "oneOf": [ + { + "properties": { + "slugs": { + "items": { + "type": "string" + }, + "type": "array", + "description": "System environment slugs (`production`, `preview`) and/or custom environment slugs defined on the referenced project." + }, + "preset": { + "type": "string", + "enum": [ + "all-custom" + ] + } + }, + "required": [ + "slugs" + ], + "type": "object", + "description": "The target envs on the current project that may be accessed." + }, + { + "properties": { + "slugs": { + "items": { + "type": "string" + }, + "type": "array", + "description": "System environment slugs (`production`, `preview`) and/or custom environment slugs defined on the referenced project." + }, + "preset": { + "type": "string", + "enum": [ + "all-custom" + ] + } + }, + "required": [ + "preset" + ], + "type": "object", + "description": "The target envs on the current project that may be accessed." + } + ] + }, + "label": { + "type": "string" + }, + "claims": { + "additionalProperties": { + "items": { + "type": "string" + }, + "type": "array" + }, + "type": "object" + } + }, + "required": [ + "claims", + "to" + ], + "type": "object" + }, + "type": "array" + }, + "type": "object" + } + }, + "type": "object" + }, + "gitComments": { + "properties": { + "onPullRequest": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether the Vercel bot should comment on PRs" + }, + "onCommit": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether the Vercel bot should comment on commits" + } + }, + "required": [ + "onCommit", + "onPullRequest" + ], + "type": "object" + }, + "gitProviderOptions": { + "properties": { + "createDeployments": { + "type": "string", + "enum": [ + "disabled", + "enabled" + ], + "description": "Whether the Vercel bot should automatically create GitHub deployments https://docs.github.com/en/rest/deployments/deployments#about-deployments NOTE: repository-dispatch events should be used instead" + }, + "disableRepositoryDispatchEvents": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether the Vercel bot should not automatically create GitHub repository-dispatch events on deployment events. https://vercel.com/docs/git/vercel-for-github#repository-dispatch-events - `true`: disable repository-dispatch events for this project (explicit override of the team setting). - `false`: enable repository-dispatch events for this project (explicit override of the team setting). - absent: inherit from `team.disableRepositoryDispatchEvents`." + }, + "requireVerifiedCommits": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether the project requires commits to be signed \u0026 verified before deployments will be created. - `true`: require verified commits for this project (explicit override of the team setting). - `false`: do not require verified commits (explicit override of the team setting). - absent: inherit from `team.requireVerifiedCommits`." + }, + "gitCommitStatus": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether Vercel should post commit statuses for this project. When omitted, commit statuses remain enabled." + }, + "consolidatedGitCommitStatus": { + "properties": { + "enabled": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether consolidated commit status is enabled." + }, + "propagateFailures": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether to propagate individual deployment failures to the consolidated status." + } + }, + "required": [ + "enabled", + "propagateFailures" + ], + "type": "object", + "description": "Configuration for consolidated git commit status reporting. When enabled, Vercel will post a single consolidated commit status instead of individual statuses for each deployment." + } + }, + "required": [ + "createDeployments" + ], + "type": "object" + }, + "paused": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "concurrencyBucketName": { + "type": "string" + }, + "webAnalytics": { + "properties": { + "id": { + "type": "string" + }, + "disabledAt": { + "type": "number" + }, + "canceledAt": { + "type": "number" + }, + "enabledAt": { + "type": "number" + }, + "hasData": { + "type": "boolean", + "enum": [ + true + ] + } + }, + "required": [ + "id" + ], + "type": "object" + }, + "security": { + "properties": { + "attackModeEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "attackModeUpdatedAt": { + "type": "number" + }, + "firewallEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "firewallUpdatedAt": { + "type": "number" + }, + "attackModeActiveUntil": { + "nullable": true, + "type": "number" + }, + "firewallConfigVersion": { + "type": "number" + }, + "rulesets": { + "additionalProperties": { + "properties": { + "action": { + "type": "string", + "enum": [ + "allow", + "bypass", + "challenge", + "deny", + "log", + "rate_limit", + "redirect" + ] + }, + "rateLimit": { + "nullable": true, + "properties": { + "algo": { + "type": "string", + "enum": [ + "fixed_window", + "token_bucket" + ] + }, + "window": { + "type": "number" + }, + "limit": { + "type": "number" + }, + "keys": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "algo", + "keys", + "limit", + "window" + ], + "type": "object" + }, + "redirect": { + "nullable": true, + "properties": { + "location": { + "type": "string" + }, + "permanent": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "location", + "permanent" + ], + "type": "object" + }, + "actionDuration": { + "nullable": true, + "type": "string" + }, + "bypassSystem": { + "nullable": true, + "type": "boolean", + "enum": [ + false, + true, + null + ] + }, + "logHeaders": { + "oneOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "string", + "enum": [ + "*" + ] + } + ] + } + }, + "required": [ + "action" + ], + "type": "object" + }, + "type": "object" + }, + "firewallSeawallEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "ja3Enabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "ja4Enabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "firewallBypassIps": { + "items": { + "type": "string" + }, + "type": "array" + }, + "managedRules": { + "nullable": true, + "properties": { + "vercel_ruleset": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "challenge", + "deny", + "log" + ] + } + }, + "required": [ + "active" + ], + "type": "object" + }, + "traffic_sources": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "challenge", + "deny", + "log" + ] + } + }, + "required": [ + "active" + ], + "type": "object" + }, + "bot_filter": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "challenge", + "deny", + "log" + ] + } + }, + "required": [ + "active" + ], + "type": "object" + }, + "ai_bots": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "challenge", + "deny", + "log" + ] + } + }, + "required": [ + "active" + ], + "type": "object" + }, + "owasp": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "challenge", + "deny", + "log" + ] + } + }, + "required": [ + "active" + ], + "type": "object" + } + }, + "required": [ + "ai_bots", + "bot_filter", + "owasp", + "traffic_sources", + "vercel_ruleset" + ], + "type": "object" + }, + "botIdEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "log_headers": { + "oneOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "string", + "enum": [ + "*" + ] + } + ] + }, + "securityPlus": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "securityPlusMetadata": { + "properties": { + "updatedAt": { + "type": "number" + }, + "firstEnabledAt": { + "type": "number", + "description": "Timestamp when the feature was first enabled. Never changes after initial enablement." + } + }, + "required": [ + "updatedAt" + ], + "type": "object" + }, + "pageIntegrityEnabled": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether Page Integrity is enabled for this project. Used by the metadata service to gate DynamoDB lookups against the page-integrity-inventory table." + } + }, + "type": "object" + }, + "oidcTokenConfig": { + "properties": { + "enabled": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether or not to generate OpenID Connect JSON Web Tokens." + }, + "issuerMode": { + "type": "string", + "enum": [ + "global", + "team" + ], + "description": "- team: `https://oidc.vercel.com/[team_slug]` - global: `https://oidc.vercel.com`" + } + }, + "type": "object" + }, + "deploymentPolicy": { + "nullable": true, + "properties": { + "gitSources": { + "nullable": true, + "items": { + "properties": { + "sources": { + "items": { + "oneOf": [ + { + "properties": { + "provider": { + "type": "string", + "enum": [ + "bitbucket", + "github" + ] + }, + "org": { + "type": "string" + }, + "repo": { + "type": "string" + } + }, + "required": [ + "org", + "provider" + ], + "type": "object", + "description": "Allowlist entry for GitHub and Bitbucket, whose repos are identified by a flat `org`/`repo` (Bitbucket's workspace/owner maps to `org`, its repo slug to `repo`). Omit `repo` to match any repo in the org. Org is matched case-insensitively." + }, + { + "properties": { + "provider": { + "type": "string", + "enum": [ + "gitlab" + ] + }, + "namespace": { + "type": "string" + }, + "project": { + "type": "string" + } + }, + "required": [ + "namespace", + "provider" + ], + "type": "object", + "description": "Allowlist entry for GitLab, which uses nested groups rather than a flat org/repo. `namespace` is the full group path (e.g. `group` or `group/subgroup`); `project` is the leaf project name. Omit `project` to match any project under the namespace. Namespace is matched case-insensitively." + } + ] + }, + "type": "array" + }, + "enabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "environments": { + "items": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "system" + ] + }, + "target": { + "type": "string", + "enum": [ + "preview", + "production" + ] + } + }, + "required": [ + "target", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "custom" + ] + }, + "environmentId": { + "type": "string" + } + }, + "required": [ + "environmentId", + "type" + ], + "type": "object" + } + ] + }, + "type": "array" + } + }, + "required": [ + "enabled", + "environments", + "sources" + ], + "type": "object", + "description": "`enabled: true` with empty `sources` is deny-all." + }, + "type": "array" + }, + "deploymentSources": { + "nullable": true, + "items": { + "properties": { + "sources": { + "items": { + "type": "string", + "enum": [ + "cli", + "deploy-hook", + "git", + "integration", + "rest-api", + "v0" + ], + "description": "Customer-configurable deployment sources. Every deploy classifies to exactly one. JSON schema in `packages/deployment-policy/schemas/body.ts` enumerates exactly these values. - `'git'` — git provider webhook. - `'cli'` — Vercel CLI (legacy classic-token CLI and SIWV CLI both). - `'rest-api'` — direct user/team-token REST upload. Does NOT cover deploy hooks, Marketplace integrations, or first-party app tokens. - `'deploy-hook'` — project deploy-hook URL. The URL is the credential. - `'integration'` — third-party Marketplace actor: Marketplace integration token, user-delegated OAuth from a Marketplace app, or an unrecognized third-party Vercel App. First-party Vercel Apps are never `'integration'`. - `'v0'` — the v0 product surface (entitlement-gated). v0 deploys through the CLI under the hood, but classifies as its own source so a team can allow or deny v0 independently of `'cli'`. First-party Vercel apps (Toolbar, etc.) classify as `'first-party'` — see `ClassifiedSource` in `./checks`. They're not in this union because they aren't customer-configurable; they bypass `checkDeploymentSources` entirely. v0 is intentionally NOT among them: like the CLI, it's a real product surface and is policy-controllable." + }, + "type": "array" + }, + "enabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "environments": { + "items": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "system" + ] + }, + "target": { + "type": "string", + "enum": [ + "preview", + "production" + ] + } + }, + "required": [ + "target", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "custom" + ] + }, + "environmentId": { + "type": "string" + } + }, + "required": [ + "environmentId", + "type" + ], + "type": "object" + } + ] + }, + "type": "array" + } + }, + "required": [ + "enabled", + "environments", + "sources" + ], + "type": "object", + "description": "`enabled: true` with empty `sources` is deny-all." + }, + "type": "array" + } + }, + "type": "object", + "description": "Project shape. `null` on a rule list clears the project's override for that rule type (fall back to team for every env); omitting is equivalent. Setting `deploymentPolicy` itself to `null` clears every override at once. Kept structurally distinct from {@link TeamDeploymentPolicy} so the two storage locations don't share a type by accident." + }, + "tier": { + "type": "string", + "enum": [ + "advanced", + "critical", + "priority" + ] + }, + "usageStatus": { + "properties": { + "kind": { + "type": "string", + "enum": [ + "flat" + ], + "description": "Billing mode. Always 'flat' for flat-rate projects." + }, + "exceededAllowanceUntil": { + "type": "number", + "description": "Timestamp until which the project has exceeded its CDN allowance." + }, + "bypassThrottleUntil": { + "type": "number", + "description": "Timestamp until which throttling is bypassed (project pays list rates for overage)." + }, + "throttled": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Per-project throttle, set explicitly for this project (e.g. via the per-project Flat Rate CDN endpoint)." + }, + "teamThrottled": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Synced from `team.billing.usageStatus.throttled`. When `true`, the team has throttled all of its projects regardless of `throttled`. The effective throttle the CDN enforces is `throttled || teamThrottled`." + } + }, + "required": [ + "kind" + ], + "type": "object" + }, + "features": { + "properties": { + "webAnalytics": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "type": "object" + }, + "v0": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "v0Created": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "abuse": { + "properties": { + "scanner": { + "type": "string" + }, + "history": { + "items": { + "properties": { + "scanner": { + "type": "string" + }, + "reason": { + "type": "string" + }, + "by": { + "type": "string" + }, + "byId": { + "type": "string" + }, + "at": { + "type": "number" + } + }, + "required": [ + "at", + "by", + "byId", + "reason", + "scanner" + ], + "type": "object" + }, + "type": "array" + }, + "updatedAt": { + "type": "number" + }, + "block": { + "properties": { + "action": { + "type": "string", + "enum": [ + "blocked" + ] + }, + "reason": { + "type": "string" + }, + "statusCode": { + "type": "number" + }, + "createdAt": { + "type": "number" + }, + "caseId": { + "type": "string" + }, + "actor": { + "type": "string" + }, + "comment": { + "type": "string" + }, + "ineligibleForAppeal": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "isCascading": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "action", + "createdAt", + "reason", + "statusCode" + ], + "type": "object" + }, + "blockHistory": { + "items": { + "oneOf": [ + { + "properties": { + "action": { + "type": "string", + "enum": [ + "blocked" + ] + }, + "reason": { + "type": "string" + }, + "statusCode": { + "type": "number" + }, + "createdAt": { + "type": "number" + }, + "caseId": { + "type": "string" + }, + "actor": { + "type": "string" + }, + "comment": { + "type": "string" + }, + "ineligibleForAppeal": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "isCascading": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "action", + "createdAt", + "reason", + "statusCode" + ], + "type": "object" + }, + { + "properties": { + "action": { + "type": "string", + "enum": [ + "unblocked" + ] + }, + "createdAt": { + "type": "number" + }, + "caseId": { + "type": "string" + }, + "actor": { + "type": "string" + }, + "comment": { + "type": "string" + }, + "ineligibleForAppeal": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "isCascading": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "action", + "createdAt" + ], + "type": "object" + }, + { + "properties": { + "action": { + "type": "string", + "enum": [ + "route-blocked" + ] + }, + "route": { + "oneOf": [ + { + "properties": { + "src": { + "type": "string" + }, + "status": { + "type": "number" + }, + "expiry": { + "type": "number" + } + }, + "required": [ + "src", + "status" + ], + "type": "object" + }, + { + "properties": { + "has": { + "items": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "header" + ] + }, + "key": { + "type": "string", + "enum": [ + "x-vercel-ip-country" + ] + }, + "value": { + "properties": { + "eq": { + "type": "string" + } + }, + "required": [ + "eq" + ], + "type": "object" + } + }, + "required": [ + "key", + "type", + "value" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "host" + ] + }, + "value": { + "properties": { + "eq": { + "type": "string" + } + }, + "required": [ + "eq" + ], + "type": "object" + } + }, + "required": [ + "type", + "value" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "mitigate": { + "properties": { + "action": { + "type": "string", + "enum": [ + "block_legal_cwc" + ] + } + }, + "required": [ + "action" + ], + "type": "object" + }, + "src": { + "type": "string" + } + }, + "required": [ + "has", + "mitigate" + ], + "type": "object" + } + ] + }, + "reason": { + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "caseId": { + "type": "string" + }, + "actor": { + "type": "string" + }, + "comment": { + "type": "string" + }, + "ineligibleForAppeal": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "isCascading": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "action", + "createdAt", + "reason", + "route" + ], + "type": "object" + }, + { + "properties": { + "action": { + "type": "string", + "enum": [ + "route-unblocked" + ] + }, + "route": { + "oneOf": [ + { + "properties": { + "src": { + "type": "string" + }, + "status": { + "type": "number" + }, + "expiry": { + "type": "number" + } + }, + "required": [ + "src", + "status" + ], + "type": "object" + }, + { + "properties": { + "has": { + "items": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "header" + ] + }, + "key": { + "type": "string", + "enum": [ + "x-vercel-ip-country" + ] + }, + "value": { + "properties": { + "eq": { + "type": "string" + } + }, + "required": [ + "eq" + ], + "type": "object" + } + }, + "required": [ + "key", + "type", + "value" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "host" + ] + }, + "value": { + "properties": { + "eq": { + "type": "string" + } + }, + "required": [ + "eq" + ], + "type": "object" + } + }, + "required": [ + "type", + "value" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "mitigate": { + "properties": { + "action": { + "type": "string", + "enum": [ + "block_legal_cwc" + ] + } + }, + "required": [ + "action" + ], + "type": "object" + }, + "src": { + "type": "string" + } + }, + "required": [ + "has", + "mitigate" + ], + "type": "object" + } + ] + }, + "statusCode": { + "type": "number" + }, + "createdAt": { + "type": "number" + }, + "caseId": { + "type": "string" + }, + "actor": { + "type": "string" + }, + "comment": { + "type": "string" + }, + "ineligibleForAppeal": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "isCascading": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "action", + "createdAt", + "route" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "interstitial": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "interstitialHistory": { + "items": { + "properties": { + "action": { + "type": "string", + "enum": [ + "add-deployment-interstitial", + "add-project-interstitial", + "remove-deployment-interstitial", + "remove-project-interstitial" + ] + }, + "createdAt": { + "type": "number" + }, + "caseId": { + "type": "string" + }, + "reason": { + "type": "string" + }, + "actor": { + "type": "string" + }, + "comment": { + "type": "string" + } + }, + "required": [ + "action", + "createdAt" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "history", + "updatedAt" + ], + "type": "object" + }, + "internalRoutes": { + "items": { + "oneOf": [ + { + "properties": { + "src": { + "type": "string" + }, + "status": { + "type": "number" + }, + "expiry": { + "type": "number" + } + }, + "required": [ + "src", + "status" + ], + "type": "object" + }, + { + "properties": { + "has": { + "items": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "header" + ] + }, + "key": { + "type": "string", + "enum": [ + "x-vercel-ip-country" + ] + }, + "value": { + "properties": { + "eq": { + "type": "string" + } + }, + "required": [ + "eq" + ], + "type": "object" + } + }, + "required": [ + "key", + "type", + "value" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "host" + ] + }, + "value": { + "properties": { + "eq": { + "type": "string" + } + }, + "required": [ + "eq" + ], + "type": "object" + } + }, + "required": [ + "type", + "value" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "mitigate": { + "properties": { + "action": { + "type": "string", + "enum": [ + "block_legal_cwc" + ] + } + }, + "required": [ + "action" + ], + "type": "object" + }, + "src": { + "type": "string" + } + }, + "required": [ + "has", + "mitigate" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "hasDeployments": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "dismissedToasts": { + "items": { + "properties": { + "key": { + "type": "string" + }, + "dismissedAt": { + "type": "number" + }, + "action": { + "type": "string", + "enum": [ + "accept", + "cancel", + "delete" + ] + }, + "value": { + "nullable": true, + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "properties": { + "previousValue": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + } + ] + }, + "currentValue": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + } + ] + } + }, + "required": [ + "currentValue", + "previousValue" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + } + ] + } + }, + "required": [ + "action", + "dismissedAt", + "key", + "value" + ], + "type": "object" + }, + "type": "array" + }, + "protectedSourcemaps": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "tracing": { + "properties": { + "domains": { + "type": "string" + }, + "ignorePaths": { + "items": { + "type": "string" + }, + "type": "array" + }, + "samplingRules": { + "items": { + "properties": { + "rate": { + "type": "number" + }, + "env": { + "type": "string", + "enum": [ + "preview", + "production" + ] + }, + "requestPath": { + "type": "string" + }, + "destination": { + "type": "string", + "enum": [ + "external", + "internal" + ], + "description": "Which tracing destination this rule applies to. `internal` is the hidden Vercel production-tracing drain (internal delivery); `external` is any customer-configured drain. Derived from the owning drain's delivery type when project tracing is computed; absent on configs persisted before this field existed." + } + }, + "required": [ + "rate" + ], + "type": "object" + }, + "type": "array" + } + }, + "type": "object" + }, + "avatar": { + "nullable": true, + "type": "string" + } + }, + "required": [ + "accountId", + "alias", + "defaultResourceConfig", + "deploymentExpiration", + "directoryListing", + "id", + "name", + "nodeVersion", + "resourceConfig" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid.\nOne of the provided values in the request query is invalid.\nAt least one environment variable failed validation\nThe Bitbucket Webhook for the project link could not be created\nThe Gitlab Webhook for the project link could not be created" + }, + "401": { + "description": "The request is not authorized." + }, + "402": { + "description": "The account is missing a payment so payment method must be updated\nPro customers are allowed to deploy Serverless Functions to up to `proMaxRegions` regions, or if the project was created before the limit was introduced.\nDeploying to Serverless Functions to multiple regions requires a plan update" + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "409": { + "description": "A project with the provided name already exists." + }, + "410": { + "description": "" + }, + "428": { + "description": "Owner does not have protection add-on" + }, + "429": { + "description": "" + }, + "500": { + "description": "" + } + }, + "x-vercel-cli": { + "supportedSubcommands": true, + "supportedProduction": false, + "bodyArguments": [ + "name" + ] + }, + "parameters": [ + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "additionalProperties": false, + "properties": { + "enablePreviewFeedback": { + "description": "Opt-in to preview toolbar on the project level", + "type": "boolean", + "nullable": true + }, + "enableProductionFeedback": { + "description": "Opt-in to production toolbar on the project level", + "type": "boolean", + "nullable": true + }, + "previewDeploymentsDisabled": { + "description": "Specifies whether preview deployments are disabled for this project.", + "type": "boolean", + "nullable": true + }, + "previewDeploymentSuffix": { + "description": "Custom domain suffix for preview deployments. Takes precedence over team-level suffix. Must be a domain owned by the team.", + "type": "string", + "maxLength": 253, + "nullable": true + }, + "buildCommand": { + "description": "The build command for this project. When `null` is used this value will be automatically detected", + "maxLength": 256, + "type": "string", + "nullable": true + }, + "commandForIgnoringBuildStep": { + "maxLength": 256, + "type": "string", + "nullable": true + }, + "devCommand": { + "description": "The dev command for this project. When `null` is used this value will be automatically detected", + "maxLength": 256, + "type": "string", + "nullable": true + }, + "environmentVariables": { + "description": "Collection of ENV Variables the Project will use", + "items": { + "properties": { + "key": { + "description": "Name of the ENV variable", + "type": "string" + }, + "target": { + "description": "Deployment Target or Targets in which the ENV variable will be used", + "oneOf": [ + { + "enum": [ + "production", + "preview", + "development" + ] + }, + { + "items": { + "enum": [ + "production", + "preview", + "development" + ] + }, + "type": "array" + } + ] + }, + "gitBranch": { + "description": "If defined, the git branch of the environment variable (must have target=preview)", + "type": "string", + "maxLength": 250 + }, + "type": { + "description": "Type of the ENV variable", + "enum": [ + "system", + "encrypted", + "plain", + "sensitive" + ], + "type": "string" + }, + "value": { + "description": "Value for the ENV variable", + "type": "string" + } + }, + "required": [ + "key", + "value", + "target" + ], + "type": "object" + }, + "type": "array" + }, + "framework": { + "description": "The framework that is being used for this project. When `null` is used no framework is selected", + "enum": [ + null, + "container", + "blitzjs", + "nextjs", + "gatsby", + "remix", + "react-router", + "astro", + "hexo", + "eleventy", + "docusaurus-2", + "docusaurus", + "preact", + "solidstart-1", + "solidstart", + "dojo", + "ember", + "vue", + "scully", + "ionic-angular", + "angular", + "polymer", + "svelte", + "sveltekit", + "sveltekit-1", + "ionic-react", + "create-react-app", + "gridsome", + "umijs", + "sapper", + "saber", + "stencil", + "nuxtjs", + "redwoodjs", + "hugo", + "jekyll", + "brunch", + "middleman", + "zola", + "hydrogen", + "vite", + "tanstack-start", + "tanstack-start-lovable", + "vitepress", + "vuepress", + "parcel", + "fastapi", + "flask", + "fasthtml", + "django", + "ash", + "factory-eve", + "eve", + "sanity", + "sanity-v2", + "storybook", + "nitro", + "hono", + "express", + "h3", + "koa", + "nestjs", + "elysia", + "fastify", + "xmcp", + "python", + "ruby", + "rust", + "axum", + "actix-web", + "bun", + "node", + "go", + "services", + "mastra" + ] + }, + "gitRepository": { + "description": "The Git Repository that will be connected to the project. When this is defined, any pushes to the specified connected Git Repository will be automatically deployed", + "properties": { + "repo": { + "description": "The name of the git repository. For example: \\\"vercel/next.js\\\"", + "type": "string" + }, + "type": { + "description": "The Git Provider of the repository", + "enum": [ + "github", + "github-limited", + "gitlab", + "bitbucket", + "vercel", + "cursor-origin" + ] + } + }, + "required": [ + "type", + "repo" + ], + "type": "object" + }, + "installCommand": { + "description": "The install command for this project. When `null` is used this value will be automatically detected", + "maxLength": 256, + "type": "string", + "nullable": true + }, + "name": { + "description": "The desired name for the project", + "example": "a-project-name", + "type": "string", + "maxLength": 100 + }, + "skipGitConnectDuringLink": { + "description": "Opts-out of the message prompting a CLI user to connect a Git repository in `vercel link`.", + "type": "boolean", + "deprecated": true + }, + "ssoProtection": { + "description": "The Vercel Auth setting for the project (historically named \\\"SSO Protection\\\")", + "type": "object", + "properties": { + "deploymentType": { + "type": "string", + "enum": [ + "all", + "preview", + "prod_deployment_urls_and_all_previews", + "all_except_custom_domains" + ] + } + }, + "required": [ + "deploymentType" + ], + "nullable": true + }, + "sandbox": { + "type": "object", + "description": "Specifies the default region and failover regions for sandboxes created in the project", + "properties": { + "region": { + "description": "The Vercel region sandboxes in this project are created in by default.", + "enum": [ + "iad1", + "sfo1", + "cle1", + "cdg1", + "fra1", + "arn1", + "sin1", + "pdx1", + "lhr1", + "icn1", + "bom1", + "cpt1", + "dub1", + "gru1", + "hkg1", + "syd1", + "yul1", + "hnd1", + "kix1" + ], + "example": "iad1" + }, + "failoverRegions": { + "description": "The regions sandboxes in this project fall back to when they cannot be created in `region`.", + "type": "array", + "uniqueItems": true, + "maxItems": 19, + "items": { + "enum": [ + "iad1", + "sfo1", + "cle1", + "cdg1", + "fra1", + "arn1", + "sin1", + "pdx1", + "lhr1", + "icn1", + "bom1", + "cpt1", + "dub1", + "gru1", + "hkg1", + "syd1", + "yul1", + "hnd1", + "kix1" + ] + }, + "example": [ + "sfo1", + "cle1" + ] + } + }, + "additionalProperties": false + }, + "outputDirectory": { + "description": "The output directory of the project. When `null` is used this value will be automatically detected", + "maxLength": 256, + "type": "string", + "nullable": true + }, + "publicSource": { + "deprecated": true, + "description": "Deprecated. Accepted for backwards compatibility but ignored.", + "type": "boolean", + "nullable": true + }, + "rootDirectory": { + "description": "The name of a directory or relative path to the source code of your project. When `null` is used it will default to the project root", + "maxLength": 256, + "type": "string", + "nullable": true + }, + "serverlessFunctionRegion": { + "description": "The region to deploy Serverless Functions in this project", + "maxLength": 4, + "type": "string", + "nullable": true + }, + "serverlessFunctionZeroConfigFailover": { + "description": "Specifies whether Zero Config Failover is enabled for this project.", + "oneOf": [ + { + "type": "boolean" + } + ] + }, + "oidcTokenConfig": { + "description": "OpenID Connect JSON Web Token generation configuration.", + "type": "object", + "additionalProperties": false, + "properties": { + "enabled": { + "description": "Whether or not to generate OpenID Connect JSON Web Tokens.", + "deprecated": true, + "type": "boolean", + "default": true + }, + "issuerMode": { + "description": "team: `https://oidc.vercel.com/[team_slug]` global: `https://oidc.vercel.com`", + "type": "string", + "enum": [ + "team", + "global" + ], + "default": "team" + } + } + }, + "enableAffectedProjectsDeployments": { + "description": "Opt-in to skip deployments when there are no changes to the root directory and its dependencies", + "type": "boolean" + }, + "resourceConfig": { + "properties": { + "buildMachineType": { + "enum": [ + "basic", + "enhanced", + "turbo", + "standard", + "elastic" + ] + }, + "fluid": { + "type": "boolean" + }, + "functionDefaultRegions": { + "description": "The regions to deploy Vercel Functions to for this project", + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "type": "string", + "maxLength": 4 + } + }, + "functionDefaultTimeout": { + "type": "number", + "maximum": 900, + "minimum": 1 + }, + "functionDefaultMemoryType": { + "enum": [ + "standard_legacy", + "standard", + "performance", + "performance_xl" + ] + }, + "functionZeroConfigFailover": { + "description": "Specifies whether Zero Config Failover is enabled for this project.", + "oneOf": [ + { + "type": "boolean" + } + ] + }, + "elasticConcurrencyEnabled": { + "type": "boolean" + }, + "buildMachineSelection": { + "enum": [ + "elastic", + "fixed" + ] + }, + "buildMachineElasticLastUpdated": { + "type": "number" + }, + "buildMachineElasticReason": { + "enum": [ + "oom-failure", + "enospc-failure", + "build-timeout-failure", + "basic-floor", + "high-peak-memory", + "sustained-high-cpu", + "high-peak-disk", + "long-build-duration", + "short-build-duration", + "enterprise-floor" + ] + }, + "isNSNBDisabled": { + "type": "boolean" + }, + "buildQueue": { + "type": "object", + "properties": { + "configuration": { + "type": "string", + "enum": [ + "SKIP_NAMESPACE_QUEUE", + "WAIT_FOR_NAMESPACE_QUEUE" + ] + } + } + }, + "enableFunctionsBeta": { + "type": "boolean" + } + }, + "type": "object", + "description": "Specifies resource override configuration for the project", + "additionalProperties": false + } + }, + "required": [ + "name" + ], + "type": "object" + } + } + } + } + } + }, + "/v1/projects/{idOrName}/token": { + "post": { + "description": "Generates an OIDC token for the project and returns it.", + "operationId": "getProjectToken", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Generate a project OIDC token", + "tags": [ + "projects" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "token": { + "type": "string" + } + }, + "required": [ + "token" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid.\nOne of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "idOrName", + "description": "The project ID or name", + "in": "path", + "required": true, + "schema": { + "description": "The project ID or name", + "type": "string", + "example": "my-project, \u003cprj_id\u003e", + "maxLength": 150 + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "source": { + "description": "The source that is calling the endpoint.", + "type": "string", + "example": "vercel-cli:pull", + "maxLength": 150 + } + } + } + } + } + } + } + }, + "/v1/projects/traces/session": { + "post": { + "description": "Mints a short-lived HS256 JWT scoped to a deployment hostname. The Vercel CLI presents this JWT to the Vercel proxy on requests it wants traced.", + "operationId": "createTraceSession", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Create a trace session token for a deployment", + "tags": [ + "projects" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "token": { + "type": "string" + } + }, + "required": [ + "token" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "410": { + "description": "" + }, + "422": { + "description": "" + } + }, + "parameters": [ + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "projectId", + "hostname" + ], + "additionalProperties": false, + "properties": { + "projectId": { + "type": "string", + "description": "The project ID the deployment belongs to." + }, + "hostname": { + "type": "string", + "description": "The deployment hostname to scope the trace session to." + } + } + } + } + } + } + } + }, + "/v9/projects/{idOrName}": { + "get": { + "description": "Get the information for a specific project by passing either the project `id` or `name` in the URL.", + "operationId": "getProject", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Find a project by id or name", + "tags": [ + "projects" + ], + "responses": { + "200": { + "description": "The project information", + "content": { + "application/json": { + "schema": { + "properties": { + "integrations": { + "items": { + "properties": { + "installationId": { + "type": "string", + "description": "The integration installation ID.", + "example": "icfg_3bwCLgxL8qt5kjRLcv2Dit7F" + }, + "resources": { + "items": { + "properties": { + "externalResourceId": { + "type": "string" + } + }, + "required": [ + "externalResourceId" + ], + "type": "object", + "description": "The list of the installation resources connected to the project." + }, + "type": "array", + "description": "The list of the installation resources connected to the project." + } + }, + "required": [ + "installationId" + ], + "type": "object", + "description": "Integration installation enabled on the project." + }, + "type": "array" + }, + "accountId": { + "type": "string" + }, + "creator": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "user" + ] + }, + "via": { + "nullable": true, + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "app" + ] + }, + "app": { + "properties": { + "id": { + "type": "string", + "description": "The internal ID of the Vercel App backing this principal." + }, + "clientId": { + "type": "string", + "description": "The protocol-facing OAuth client ID. This may differ from {@link id} when Client ID Metadata Documents (CIMD) are used." + } + }, + "required": [ + "id" + ], + "type": "object" + } + }, + "required": [ + "app", + "type" + ], + "type": "object", + "description": "Set when a Vercel App or Integration acts on behalf of a {@link User}. Captures user-consented OAuth delegation that the ACL layer may inspect to evaluate scope restrictions. This is NOT for impersonation or token-exchange provenance — those live on `auth.token`, not on the principal." + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "integration" + ] + }, + "integration": { + "properties": { + "integrationId": { + "type": "string" + }, + "configurationId": { + "type": "string" + } + }, + "required": [ + "configurationId", + "integrationId" + ], + "type": "object" + } + }, + "required": [ + "integration", + "type" + ], + "type": "object", + "description": "Set when a Vercel App or Integration acts on behalf of a {@link User}. Captures user-consented OAuth delegation that the ACL layer may inspect to evaluate scope restrictions. This is NOT for impersonation or token-exchange provenance — those live on `auth.token`, not on the principal." + } + ] + }, + "user": { + "properties": { + "id": { + "type": "string" + } + }, + "required": [ + "id" + ], + "type": "object" + } + }, + "required": [ + "type", + "user", + "via" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "app" + ] + }, + "app": { + "properties": { + "id": { + "type": "string", + "description": "The internal ID of the Vercel App backing this principal." + }, + "clientId": { + "type": "string", + "description": "The protocol-facing OAuth client ID. This may differ from {@link id} when Client ID Metadata Documents (CIMD) are used." + } + }, + "required": [ + "id" + ], + "type": "object" + } + }, + "required": [ + "app", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "integration" + ] + }, + "integration": { + "properties": { + "integrationId": { + "type": "string" + }, + "configurationId": { + "type": "string" + } + }, + "required": [ + "configurationId", + "integrationId" + ], + "type": "object" + } + }, + "required": [ + "integration", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "system" + ] + } + }, + "required": [ + "type" + ], + "type": "object" + } + ] + }, + "alias": { + "items": { + "properties": { + "configuredBy": { + "nullable": true, + "type": "string", + "enum": [ + "A", + "CNAME", + "dns-01", + "http", + null + ] + }, + "configuredChangedAt": { + "nullable": true, + "type": "number" + }, + "createdAt": { + "nullable": true, + "type": "number" + }, + "deployment": { + "nullable": true, + "properties": { + "id": { + "type": "string" + }, + "alias": { + "items": { + "type": "string" + }, + "type": "array" + }, + "aliasAssigned": { + "nullable": true, + "oneOf": [ + { + "type": "number" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + } + ] + }, + "aliasError": { + "nullable": true, + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" + }, + "aliasFinal": { + "nullable": true, + "type": "string" + }, + "automaticAliases": { + "items": { + "type": "string" + }, + "type": "array" + }, + "branchMatcher": { + "properties": { + "type": { + "type": "string", + "enum": [ + "endsWith", + "equals", + "startsWith" + ], + "description": "The type of matching to perform" + }, + "pattern": { + "type": "string", + "description": "The pattern to match against branch names" + } + }, + "required": [ + "pattern", + "type" + ], + "type": "object" + }, + "buildingAt": { + "type": "number" + }, + "builds": { + "items": { + "properties": { + "use": { + "type": "string" + }, + "src": { + "type": "string" + }, + "dest": { + "type": "string" + } + }, + "required": [ + "use" + ], + "type": "object" + }, + "type": "array" + }, + "checksConclusion": { + "type": "string", + "enum": [ + "canceled", + "failed", + "skipped", + "succeeded" + ] + }, + "checksState": { + "type": "string", + "enum": [ + "completed", + "registered", + "running" + ] + }, + "connectBuildsEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "connectConfigurationId": { + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "createdIn": { + "type": "string" + }, + "creator": { + "nullable": true, + "properties": { + "email": { + "type": "string" + }, + "githubLogin": { + "type": "string" + }, + "gitlabLogin": { + "type": "string" + }, + "uid": { + "type": "string" + }, + "username": { + "type": "string" + } + }, + "required": [ + "email", + "uid", + "username" + ], + "type": "object" + }, + "deletedAt": { + "type": "number" + }, + "deploymentHostname": { + "type": "string" + }, + "forced": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "name": { + "type": "string" + }, + "meta": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "monorepoManager": { + "nullable": true, + "type": "string" + }, + "oidcTokenClaims": { + "properties": { + "iss": { + "type": "string" + }, + "sub": { + "type": "string" + }, + "scope": { + "type": "string" + }, + "aud": { + "type": "string" + }, + "owner": { + "type": "string" + }, + "owner_id": { + "type": "string" + }, + "project": { + "type": "string" + }, + "project_id": { + "type": "string" + }, + "environment": { + "type": "string" + }, + "custom_environment_id": { + "type": "string" + }, + "mfe_group_ids": { + "items": { + "type": "string" + }, + "type": "array" + }, + "plan": { + "type": "string" + } + }, + "required": [ + "aud", + "environment", + "iss", + "owner", + "owner_id", + "project", + "project_id", + "scope", + "sub" + ], + "type": "object" + }, + "plan": { + "type": "string", + "enum": [ + "enterprise", + "hobby", + "pro" + ] + }, + "previewCommentsEnabled": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether or not preview comments are enabled for the deployment", + "example": false + }, + "private": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "readyAt": { + "type": "number" + }, + "readyState": { + "type": "string", + "enum": [ + "BLOCKED", + "BUILDING", + "CANCELED", + "ERROR", + "INITIALIZING", + "QUEUED", + "READY" + ] + }, + "readySubstate": { + "type": "string", + "enum": [ + "PROMOTED", + "ROLLING", + "STAGED" + ] + }, + "requestedAt": { + "type": "number" + }, + "target": { + "nullable": true, + "type": "string" + }, + "teamId": { + "nullable": true, + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "LAMBDAS" + ] + }, + "url": { + "type": "string" + }, + "userId": { + "type": "string", + "description": "Present for user creators; omitted for app/integration/system creators." + }, + "withCache": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "createdAt", + "createdIn", + "creator", + "deploymentHostname", + "id", + "name", + "plan", + "private", + "readyState", + "type", + "url" + ], + "type": "object" + }, + "domain": { + "type": "string" + }, + "environment": { + "type": "string", + "enum": [ + "preview", + "production" + ] + }, + "gitBranch": { + "nullable": true, + "type": "string" + }, + "redirect": { + "nullable": true, + "type": "string" + }, + "redirectStatusCode": { + "nullable": true, + "type": "number", + "enum": [ + 301, + 302, + 307, + 308, + null + ] + }, + "target": { + "type": "string", + "enum": [ + "PREVIEW", + "PRODUCTION", + "STAGING" + ] + } + }, + "required": [ + "deployment", + "domain", + "environment", + "target" + ], + "type": "object" + }, + "type": "array" + }, + "analytics": { + "properties": { + "id": { + "type": "string" + }, + "canceledAt": { + "nullable": true, + "type": "number" + }, + "disabledAt": { + "type": "number" + }, + "enabledAt": { + "type": "number" + }, + "paidAt": { + "type": "number" + }, + "sampleRatePercent": { + "nullable": true, + "type": "number" + }, + "spendLimitInDollars": { + "nullable": true, + "type": "number" + } + }, + "required": [ + "disabledAt", + "enabledAt", + "id" + ], + "type": "object" + }, + "appliedCve55182Migration": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "speedInsights": { + "properties": { + "id": { + "type": "string" + }, + "enabledAt": { + "type": "number" + }, + "disabledAt": { + "type": "number" + }, + "canceledAt": { + "type": "number" + }, + "hasData": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "dataReceivedAt": { + "type": "number", + "description": "When the first free (not Speed Insights Plus) production data point was observed, in ms. Set once by subscriber-analytics-events; projects that already had data before this field shipped get it backfilled on their next batch, so it reads \"first free data point observed\", not necessarily \"first ever\"." + }, + "paidAt": { + "type": "number" + } + }, + "required": [ + "id" + ], + "type": "object" + }, + "autoExposeSystemEnvs": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "autoAssignCustomDomains": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "autoAssignCustomDomainsUpdatedBy": { + "type": "string" + }, + "buildCommand": { + "nullable": true, + "type": "string" + }, + "commandForIgnoringBuildStep": { + "nullable": true, + "type": "string" + }, + "connectConfigurations": { + "nullable": true, + "items": { + "properties": { + "envId": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "string", + "enum": [ + "preview", + "production" + ] + } + ] + }, + "connectConfigurationId": { + "type": "string" + }, + "dc": { + "type": "string" + }, + "passive": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "buildsEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "aws": { + "properties": { + "subnetIds": { + "items": { + "type": "string" + }, + "type": "array" + }, + "securityGroupId": { + "type": "string" + } + }, + "required": [ + "subnetIds" + ], + "type": "object" + }, + "createdAt": { + "type": "number" + }, + "updatedAt": { + "type": "number" + } + }, + "required": [ + "buildsEnabled", + "connectConfigurationId", + "createdAt", + "envId", + "passive", + "updatedAt" + ], + "type": "object" + }, + "type": "array" + }, + "connectConfigurationId": { + "nullable": true, + "type": "string" + }, + "connectBuildsEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "passiveConnectConfigurationId": { + "nullable": true, + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "customerSupportCodeVisibility": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "crons": { + "properties": { + "enabledAt": { + "type": "number", + "description": "The time the feature was enabled for this project. Note: It enables automatically with the first Deployment that outputs cronjobs." + }, + "disabledAt": { + "nullable": true, + "type": "number", + "description": "The time the feature was disabled for this project." + }, + "updatedAt": { + "type": "number" + }, + "deploymentId": { + "nullable": true, + "type": "string", + "description": "The ID of the Deployment from which the definitions originated." + }, + "definitions": { + "items": { + "properties": { + "host": { + "type": "string", + "description": "The hostname that should be used.", + "example": "vercel.com" + }, + "path": { + "type": "string", + "description": "The path that should be called for the cronjob.", + "example": "/api/crons/sync-something?hello=world" + }, + "schedule": { + "type": "string", + "description": "The cron expression.", + "example": "0 0 * * *" + }, + "source": { + "type": "string", + "enum": [ + "api" + ], + "description": "The origin of this definition. 'api' means created via the API. Undefined means it originated from a deployment (vercel.json)." + }, + "description": { + "type": "string", + "description": "A human-readable description of what this cron job does." + }, + "hostInferred": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether the host was inferred from the production deployment URL rather than explicitly provided." + } + }, + "required": [ + "host", + "path", + "schedule" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "definitions", + "deploymentId", + "disabledAt", + "enabledAt", + "updatedAt" + ], + "type": "object" + }, + "dataCache": { + "properties": { + "userDisabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "storageSizeBytes": { + "nullable": true, + "type": "number" + }, + "unlimited": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "userDisabled" + ], + "type": "object" + }, + "deploymentExpiration": { + "properties": { + "expirationDays": { + "type": "number", + "description": "Number of days to keep non-production deployments (mostly preview deployments) before soft deletion." + }, + "expirationDaysProduction": { + "type": "number", + "description": "Number of days to keep production deployments before soft deletion." + }, + "expirationDaysCanceled": { + "type": "number", + "description": "Number of days to keep canceled deployments before soft deletion." + }, + "expirationDaysErrored": { + "type": "number", + "description": "Number of days to keep errored deployments before soft deletion." + }, + "deploymentsToKeep": { + "type": "number", + "description": "Minimum number of production deployments to keep for this project, even if they are over the production expiration limit." + } + }, + "type": "object", + "description": "Retention policies for deployments. These are enforced at the project level, but we also maintain an instance of this at the team level as a default policy that gets applied to new projects." + }, + "expiration": { + "oneOf": [ + { + "properties": { + "expiresAt": { + "type": "number", + "description": "Unix ms timestamp when the project is scheduled to expire." + } + }, + "required": [ + "expiresAt" + ], + "type": "object" + }, + { + "properties": { + "lockedAt": { + "type": "number", + "description": "Unix ms timestamp when the project was locked." + }, + "lockedBy": { + "type": "string", + "description": "userId of the actor that triggered the lock (system or admin)." + } + }, + "required": [ + "lockedAt", + "lockedBy" + ], + "type": "object" + } + ] + }, + "devCommand": { + "nullable": true, + "type": "string" + }, + "directoryListing": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "installCommand": { + "nullable": true, + "type": "string" + }, + "env": { + "items": { + "properties": { + "target": { + "oneOf": [ + { + "items": { + "type": "string", + "enum": [ + "development", + "development", + "preview", + "preview", + "production" + ] + }, + "type": "array" + }, + { + "type": "string", + "enum": [ + "production", + "preview", + "development" + ] + } + ] + }, + "type": { + "type": "string", + "enum": [ + "encrypted", + "plain", + "secret", + "sensitive", + "system" + ] + }, + "sunsetSecretId": { + "type": "string", + "description": "This is used to identify variables that have been migrated from type secret to sensitive." + }, + "legacyValue": { + "type": "string", + "description": "Legacy now-encryption ciphertext, present after migration swaps value/vsmValue" + }, + "decrypted": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "value": { + "type": "string" + }, + "vsmValue": { + "type": "string" + }, + "id": { + "type": "string" + }, + "key": { + "type": "string" + }, + "configurationId": { + "nullable": true, + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "updatedAt": { + "type": "number" + }, + "createdBy": { + "nullable": true, + "type": "string" + }, + "updatedBy": { + "nullable": true, + "type": "string" + }, + "gitBranch": { + "type": "string" + }, + "visibility": { + "type": "string", + "enum": [ + "config", + "secret" + ], + "description": "User-facing config/secret model. When set, authoritative for new code paths when the env-var-config-secret-ui flag is enabled. Legacy rows omit this field; legacy rows omit it and callers fall back to existing `type` behavior." + }, + "edgeConfigId": { + "nullable": true, + "type": "string" + }, + "edgeConfigTokenId": { + "nullable": true, + "type": "string" + }, + "contentHint": { + "nullable": true, + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "redis-url" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "redis-rest-api-url" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "redis-rest-api-token" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "redis-rest-api-read-only-token" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "blob-read-write-token" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "blob-store-id" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "blob-webhook-public-key" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-url" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-url-non-pooling" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-prisma-url" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-user" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-host" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-password" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-database" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-url-no-ssl" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "integration-store-secret" + ] + }, + "storeId": { + "type": "string" + }, + "integrationId": { + "type": "string" + }, + "integrationProductId": { + "type": "string" + }, + "integrationConfigurationId": { + "type": "string" + } + }, + "required": [ + "integrationConfigurationId", + "integrationId", + "integrationProductId", + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "flags-connection-string" + ] + }, + "projectId": { + "type": "string" + } + }, + "required": [ + "projectId", + "type" + ], + "type": "object" + } + ] + }, + "internalContentHint": { + "nullable": true, + "properties": { + "type": { + "type": "string", + "enum": [ + "flags-secret" + ] + }, + "encryptedValue": { + "type": "string", + "description": "Contains the `value` of the env variable, encrypted with a special key to make decryption possible in the subscriber Lambda." + } + }, + "required": [ + "encryptedValue", + "type" + ], + "type": "object", + "description": "Similar to `contentHints`, but should not be exposed to the user." + }, + "comment": { + "type": "string" + }, + "customEnvironmentIds": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "key", + "type", + "value" + ], + "type": "object" + }, + "type": "array" + }, + "customEnvironments": { + "items": { + "properties": { + "id": { + "type": "string", + "description": "Unique identifier for the custom environment (format: env_*)" + }, + "slug": { + "type": "string", + "description": "URL-friendly name of the environment" + }, + "type": { + "type": "string", + "enum": [ + "development", + "preview", + "production" + ], + "description": "The type of environment (production, preview, or development)" + }, + "description": { + "type": "string", + "description": "Optional description of the environment's purpose" + }, + "branchMatcher": { + "properties": { + "type": { + "type": "string", + "enum": [ + "endsWith", + "equals", + "startsWith" + ], + "description": "The type of matching to perform" + }, + "pattern": { + "type": "string", + "description": "The pattern to match against branch names" + } + }, + "required": [ + "pattern", + "type" + ], + "type": "object", + "description": "Configuration for matching git branches to this environment" + }, + "domains": { + "items": { + "properties": { + "name": { + "type": "string" + }, + "apexName": { + "type": "string" + }, + "projectId": { + "type": "string" + }, + "redirect": { + "nullable": true, + "type": "string" + }, + "redirectStatusCode": { + "nullable": true, + "type": "number", + "enum": [ + 301, + 302, + 307, + 308, + null + ] + }, + "gitBranch": { + "nullable": true, + "type": "string" + }, + "customEnvironmentId": { + "nullable": true, + "type": "string" + }, + "updatedAt": { + "type": "number" + }, + "createdAt": { + "type": "number" + }, + "verified": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "`true` if the domain is verified for use with the project. If `false` it will not be used as an alias on this project until the challenge in `verification` is completed." + }, + "verification": { + "items": { + "properties": { + "type": { + "type": "string" + }, + "domain": { + "type": "string" + }, + "value": { + "type": "string" + }, + "reason": { + "type": "string" + } + }, + "required": [ + "domain", + "reason", + "type", + "value" + ], + "type": "object", + "description": "A list of verification challenges, one of which must be completed to verify the domain for use on the project. After the challenge is complete `POST /projects/:idOrName/domains/:domain/verify` to verify the domain. Possible challenges: - If `verification.type = TXT` the `verification.domain` will be checked for a TXT record matching `verification.value`." + }, + "type": "array", + "description": "A list of verification challenges, one of which must be completed to verify the domain for use on the project. After the challenge is complete `POST /projects/:idOrName/domains/:domain/verify` to verify the domain. Possible challenges: - If `verification.type = TXT` the `verification.domain` will be checked for a TXT record matching `verification.value`." + } + }, + "required": [ + "apexName", + "name", + "projectId", + "verified" + ], + "type": "object", + "description": "List of domains associated with this environment" + }, + "type": "array", + "description": "List of domains associated with this environment" + }, + "currentDeploymentAliases": { + "items": { + "type": "string" + }, + "type": "array", + "description": "List of aliases for the current deployment" + }, + "createdAt": { + "type": "number", + "description": "Timestamp when the environment was created" + }, + "updatedAt": { + "type": "number", + "description": "Timestamp when the environment was last updated" + } + }, + "required": [ + "createdAt", + "id", + "slug", + "type", + "updatedAt" + ], + "type": "object", + "description": "Internal representation of a custom environment with all required properties" + }, + "type": "array" + }, + "framework": { + "nullable": true, + "type": "string", + "enum": [ + "actix-web", + "angular", + "ash", + "astro", + "axum", + "blitzjs", + "brunch", + "bun", + "container", + "create-react-app", + "django", + "docusaurus", + "docusaurus-2", + "dojo", + "eleventy", + "elysia", + "ember", + "eve", + "express", + "factory-eve", + "fastapi", + "fasthtml", + "fastify", + "flask", + "gatsby", + "go", + "gridsome", + "h3", + "hexo", + "hono", + "hugo", + "hydrogen", + "ionic-angular", + "ionic-react", + "jekyll", + "koa", + "mastra", + "middleman", + "nestjs", + "nextjs", + "nitro", + "node", + "nuxtjs", + "parcel", + "polymer", + "preact", + "python", + "react-router", + "redwoodjs", + "remix", + "ruby", + "rust", + "saber", + "sanity", + "sanity-v2", + "sapper", + "scully", + "services", + "solidstart", + "solidstart-1", + "stencil", + "storybook", + "svelte", + "sveltekit", + "sveltekit-1", + "tanstack-start", + "tanstack-start-lovable", + "umijs", + "vite", + "vitepress", + "vue", + "vuepress", + "xmcp", + "zola", + null + ] + }, + "services": { + "items": { + "properties": { + "serviceName": { + "type": "string", + "description": "Service name from the deployment (Service.name)." + }, + "serviceType": { + "type": "string", + "enum": [ + "cron", + "job", + "web", + "worker" + ], + "description": "Service kind (Service.type). Omitted for schemas that do not define one." + }, + "framework": { + "type": "string", + "enum": [ + "actix-web", + "angular", + "ash", + "astro", + "axum", + "blitzjs", + "brunch", + "bun", + "container", + "create-react-app", + "django", + "docusaurus", + "docusaurus-2", + "dojo", + "eleventy", + "elysia", + "ember", + "eve", + "express", + "factory-eve", + "fastapi", + "fasthtml", + "fastify", + "flask", + "gatsby", + "go", + "gridsome", + "h3", + "hexo", + "hono", + "hugo", + "hydrogen", + "ionic-angular", + "ionic-react", + "jekyll", + "koa", + "mastra", + "middleman", + "nestjs", + "nextjs", + "nitro", + "node", + "nuxtjs", + "parcel", + "polymer", + "preact", + "python", + "react-router", + "redwoodjs", + "remix", + "ruby", + "rust", + "saber", + "sanity", + "sanity-v2", + "sapper", + "scully", + "services", + "solidstart", + "solidstart-1", + "stencil", + "storybook", + "svelte", + "sveltekit", + "sveltekit-1", + "tanstack-start", + "tanstack-start-lovable", + "umijs", + "vite", + "vitepress", + "vue", + "vuepress", + "xmcp", + "zola" + ], + "description": "Framework slug, when the service has one (omitted otherwise)." + }, + "runtime": { + "type": "string", + "description": "Generic runtime, e.g. 'node' | 'python' | 'go' | 'ruby' | 'rust' (Service.runtime). Omitted for static builds." + } + }, + "required": [ + "serviceName" + ], + "type": "object" + }, + "type": "array" + }, + "gitForkProtection": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "gitLFS": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "id": { + "type": "string" + }, + "ipBuckets": { + "items": { + "properties": { + "bucket": { + "type": "string" + }, + "default": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "supportUntil": { + "type": "number" + } + }, + "required": [ + "bucket" + ], + "type": "object" + }, + "type": "array" + }, + "jobs": { + "properties": { + "lint": { + "properties": { + "targets": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "targets" + ], + "type": "object" + }, + "typecheck": { + "properties": { + "targets": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "targets" + ], + "type": "object" + }, + "mfe-config-present": { + "properties": { + "targets": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "targets" + ], + "type": "object" + } + }, + "type": "object" + }, + "latestDeployments": { + "items": { + "properties": { + "id": { + "type": "string" + }, + "alias": { + "items": { + "type": "string" + }, + "type": "array" + }, + "aliasAssigned": { + "nullable": true, + "oneOf": [ + { + "type": "number" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + } + ] + }, + "aliasError": { + "nullable": true, + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" + }, + "aliasFinal": { + "nullable": true, + "type": "string" + }, + "automaticAliases": { + "items": { + "type": "string" + }, + "type": "array" + }, + "branchMatcher": { + "properties": { + "type": { + "type": "string", + "enum": [ + "endsWith", + "equals", + "startsWith" + ], + "description": "The type of matching to perform" + }, + "pattern": { + "type": "string", + "description": "The pattern to match against branch names" + } + }, + "required": [ + "pattern", + "type" + ], + "type": "object" + }, + "buildingAt": { + "type": "number" + }, + "builds": { + "items": { + "properties": { + "use": { + "type": "string" + }, + "src": { + "type": "string" + }, + "dest": { + "type": "string" + } + }, + "required": [ + "use" + ], + "type": "object" + }, + "type": "array" + }, + "checksConclusion": { + "type": "string", + "enum": [ + "canceled", + "failed", + "skipped", + "succeeded" + ] + }, + "checksState": { + "type": "string", + "enum": [ + "completed", + "registered", + "running" + ] + }, + "connectBuildsEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "connectConfigurationId": { + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "createdIn": { + "type": "string" + }, + "creator": { + "nullable": true, + "properties": { + "email": { + "type": "string" + }, + "githubLogin": { + "type": "string" + }, + "gitlabLogin": { + "type": "string" + }, + "uid": { + "type": "string" + }, + "username": { + "type": "string" + } + }, + "required": [ + "email", + "uid", + "username" + ], + "type": "object" + }, + "deletedAt": { + "type": "number" + }, + "deploymentHostname": { + "type": "string" + }, + "forced": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "name": { + "type": "string" + }, + "meta": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "monorepoManager": { + "nullable": true, + "type": "string" + }, + "oidcTokenClaims": { + "properties": { + "iss": { + "type": "string" + }, + "sub": { + "type": "string" + }, + "scope": { + "type": "string" + }, + "aud": { + "type": "string" + }, + "owner": { + "type": "string" + }, + "owner_id": { + "type": "string" + }, + "project": { + "type": "string" + }, + "project_id": { + "type": "string" + }, + "environment": { + "type": "string" + }, + "custom_environment_id": { + "type": "string" + }, + "mfe_group_ids": { + "items": { + "type": "string" + }, + "type": "array" + }, + "plan": { + "type": "string" + } + }, + "required": [ + "aud", + "environment", + "iss", + "owner", + "owner_id", + "project", + "project_id", + "scope", + "sub" + ], + "type": "object" + }, + "plan": { + "type": "string", + "enum": [ + "enterprise", + "hobby", + "pro" + ] + }, + "previewCommentsEnabled": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether or not preview comments are enabled for the deployment", + "example": false + }, + "private": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "readyAt": { + "type": "number" + }, + "readyState": { + "type": "string", + "enum": [ + "BLOCKED", + "BUILDING", + "CANCELED", + "ERROR", + "INITIALIZING", + "QUEUED", + "READY" + ] + }, + "readySubstate": { + "type": "string", + "enum": [ + "PROMOTED", + "ROLLING", + "STAGED" + ] + }, + "requestedAt": { + "type": "number" + }, + "target": { + "nullable": true, + "type": "string" + }, + "teamId": { + "nullable": true, + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "LAMBDAS" + ] + }, + "url": { + "type": "string" + }, + "userId": { + "type": "string", + "description": "Present for user creators; omitted for app/integration/system creators." + }, + "withCache": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "createdAt", + "createdIn", + "creator", + "deploymentHostname", + "id", + "name", + "plan", + "private", + "readyState", + "type", + "url" + ], + "type": "object" + }, + "type": "array" + }, + "link": { + "oneOf": [ + { + "properties": { + "org": { + "type": "string" + }, + "repoOwnerId": { + "type": "number", + "description": "A new field, should be included in all new project links, is being added just in time when a deployment is created. This is needed for Protected Git scopes." + }, + "repo": { + "type": "string" + }, + "repoId": { + "type": "number" + }, + "type": { + "type": "string", + "enum": [ + "github" + ] + }, + "createdAt": { + "type": "number" + }, + "deployHooks": { + "items": { + "properties": { + "createdAt": { + "type": "number" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "ref": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "ref", + "url" + ], + "type": "object" + }, + "type": "array" + }, + "gitCredentialId": { + "type": "string" + }, + "updatedAt": { + "type": "number" + }, + "sourceless": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "productionBranch": { + "type": "string" + } + }, + "required": [ + "deployHooks", + "gitCredentialId", + "org", + "productionBranch", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "github-limited" + ] + }, + "repo": { + "type": "string" + }, + "repoId": { + "type": "number" + }, + "createdAt": { + "type": "number" + }, + "updatedAt": { + "type": "number" + }, + "org": { + "type": "string" + }, + "repoOwnerId": { + "type": "number", + "description": "A new field, should be included in all new project links, is being added just in time when a deployment is created. This is needed for Protected Git scopes." + }, + "deployHooks": { + "items": { + "properties": { + "createdAt": { + "type": "number" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "ref": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "ref", + "url" + ], + "type": "object" + }, + "type": "array" + }, + "gitCredentialId": { + "type": "string" + }, + "sourceless": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "productionBranch": { + "type": "string" + } + }, + "required": [ + "deployHooks", + "gitCredentialId", + "org", + "productionBranch", + "type" + ], + "type": "object" + }, + { + "properties": { + "org": { + "type": "string" + }, + "repoOwnerId": { + "type": "number", + "description": "A new field, should be included in all new project links, is being added just in time when a deployment is created. This is needed for Protected Git scopes." + }, + "repo": { + "type": "string" + }, + "repoId": { + "type": "number" + }, + "type": { + "type": "string", + "enum": [ + "github-custom-host" + ] + }, + "host": { + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "deployHooks": { + "items": { + "properties": { + "createdAt": { + "type": "number" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "ref": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "ref", + "url" + ], + "type": "object" + }, + "type": "array" + }, + "gitCredentialId": { + "type": "string" + }, + "updatedAt": { + "type": "number" + }, + "sourceless": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "productionBranch": { + "type": "string" + } + }, + "required": [ + "deployHooks", + "gitCredentialId", + "host", + "org", + "productionBranch", + "type" + ], + "type": "object" + }, + { + "properties": { + "projectId": { + "type": "string" + }, + "projectName": { + "type": "string" + }, + "projectNameWithNamespace": { + "type": "string" + }, + "projectNamespace": { + "type": "string" + }, + "projectOwnerId": { + "type": "number", + "description": "A new field, should be included in all new project links, is being added just in time when a deployment is created. This is needed for Protected Git scopes. This is the id of the top level group that a namespace belongs to. Gitlab supports group nesting (up to 20 levels)." + }, + "projectUrl": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "gitlab" + ] + }, + "createdAt": { + "type": "number" + }, + "deployHooks": { + "items": { + "properties": { + "createdAt": { + "type": "number" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "ref": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "ref", + "url" + ], + "type": "object" + }, + "type": "array" + }, + "gitCredentialId": { + "type": "string" + }, + "updatedAt": { + "type": "number" + }, + "sourceless": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "productionBranch": { + "type": "string" + } + }, + "required": [ + "deployHooks", + "gitCredentialId", + "productionBranch", + "projectId", + "projectName", + "projectNameWithNamespace", + "projectNamespace", + "projectUrl", + "type" + ], + "type": "object" + }, + { + "properties": { + "name": { + "type": "string" + }, + "slug": { + "type": "string" + }, + "owner": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "bitbucket" + ] + }, + "uuid": { + "type": "string" + }, + "workspaceUuid": { + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "deployHooks": { + "items": { + "properties": { + "createdAt": { + "type": "number" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "ref": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "ref", + "url" + ], + "type": "object" + }, + "type": "array" + }, + "gitCredentialId": { + "type": "string" + }, + "updatedAt": { + "type": "number" + }, + "sourceless": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "productionBranch": { + "type": "string" + } + }, + "required": [ + "deployHooks", + "gitCredentialId", + "name", + "owner", + "productionBranch", + "slug", + "type", + "uuid", + "workspaceUuid" + ], + "type": "object" + }, + { + "properties": { + "org": { + "type": "string" + }, + "repo": { + "type": "string" + }, + "repoId": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "vercel" + ] + }, + "createdAt": { + "type": "number" + }, + "deployHooks": { + "items": { + "properties": { + "createdAt": { + "type": "number" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "ref": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "ref", + "url" + ], + "type": "object" + }, + "type": "array" + }, + "gitCredentialId": { + "type": "string" + }, + "updatedAt": { + "type": "number" + }, + "sourceless": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "productionBranch": { + "type": "string" + } + }, + "required": [ + "deployHooks", + "gitCredentialId", + "org", + "productionBranch", + "repo", + "repoId", + "type" + ], + "type": "object" + }, + { + "properties": { + "org": { + "type": "string" + }, + "repo": { + "type": "string" + }, + "repoId": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "v0" + ] + }, + "createdAt": { + "type": "number" + }, + "deployHooks": { + "items": { + "properties": { + "createdAt": { + "type": "number" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "ref": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "ref", + "url" + ], + "type": "object" + }, + "type": "array" + }, + "gitCredentialId": { + "type": "string" + }, + "updatedAt": { + "type": "number" + }, + "sourceless": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "productionBranch": { + "type": "string" + } + }, + "required": [ + "deployHooks", + "gitCredentialId", + "org", + "productionBranch", + "repo", + "repoId", + "type" + ], + "type": "object" + }, + { + "properties": { + "owner": { + "type": "string", + "description": "Owner (namespace) slug, e.g. `acme`." + }, + "repo": { + "type": "string" + }, + "repoId": { + "type": "string", + "description": "Origin repository id." + }, + "ownerId": { + "type": "string", + "description": "Origin namespace id (`ns_…`) of the owner." + }, + "type": { + "type": "string", + "enum": [ + "cursor-origin" + ] + }, + "createdAt": { + "type": "number" + }, + "deployHooks": { + "items": { + "properties": { + "createdAt": { + "type": "number" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "ref": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "ref", + "url" + ], + "type": "object" + }, + "type": "array" + }, + "gitCredentialId": { + "type": "string" + }, + "updatedAt": { + "type": "number" + }, + "sourceless": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "productionBranch": { + "type": "string" + } + }, + "required": [ + "deployHooks", + "gitCredentialId", + "owner", + "ownerId", + "productionBranch", + "repo", + "repoId", + "type" + ], + "type": "object" + } + ] + }, + "blobs": { + "properties": { + "isDefaultApp": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Marks the team-level, Vercel-managed default blob project (`vercel-blob-default-project`) that orphan blob stores are scoped to when connected without an explicit project. Set only by internal storage flows and immutable after creation — guards rely on it to protect the connected stores from being lost when the project is deleted or transferred." + } + }, + "type": "object" + }, + "microfrontends": { + "oneOf": [ + { + "properties": { + "isDefaultApp": { + "type": "boolean", + "enum": [ + true + ] + }, + "updatedAt": { + "type": "number", + "description": "Timestamp when the microfrontends settings were last updated." + }, + "groupIds": { + "type": "array", + "items": { + "type": "string" + }, + "minItems": 1, + "description": "The group IDs of microfrontends that this project belongs to. Each microfrontend project must belong to a microfrontends group that is the set of microfrontends that are used together." + }, + "enabled": { + "type": "boolean", + "enum": [ + true + ], + "description": "Whether microfrontends are enabled for this project." + }, + "defaultRoute": { + "type": "string", + "description": "A path that is used to take screenshots and as the default path in preview links when a domain for this microfrontend is shown in the UI. Includes the leading slash, e.g. `/docs`" + }, + "freeProjectForLegacyLimits": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether the project was part of the legacy limits for hobby and pro-trial before billing was added. This field is only set when the team is upgraded to a paid plan and we are backfilling the subscription status. We cap the subscription to 2 projects and set this field for the 3rd project. When this field is set, the project is not charged for and we do not call any billing APIs for this project." + } + }, + "required": [ + "enabled", + "groupIds", + "isDefaultApp", + "updatedAt" + ], + "type": "object" + }, + { + "properties": { + "isDefaultApp": { + "type": "boolean", + "enum": [ + false + ] + }, + "routeObservabilityToThisProject": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether observability data should be routed to this microfrontend project or a root project." + }, + "doNotRouteWithMicrofrontendsRouting": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether to add microfrontends routing to aliases. This means domains in this project will route as a microfrontend." + }, + "updatedAt": { + "type": "number", + "description": "Timestamp when the microfrontends settings were last updated." + }, + "groupIds": { + "type": "array", + "items": { + "type": "string" + }, + "minItems": 1, + "description": "The group IDs of microfrontends that this project belongs to. Each microfrontend project must belong to a microfrontends group that is the set of microfrontends that are used together." + }, + "enabled": { + "type": "boolean", + "enum": [ + true + ], + "description": "Whether microfrontends are enabled for this project." + }, + "defaultRoute": { + "type": "string", + "description": "A path that is used to take screenshots and as the default path in preview links when a domain for this microfrontend is shown in the UI. Includes the leading slash, e.g. `/docs`" + }, + "freeProjectForLegacyLimits": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether the project was part of the legacy limits for hobby and pro-trial before billing was added. This field is only set when the team is upgraded to a paid plan and we are backfilling the subscription status. We cap the subscription to 2 projects and set this field for the 3rd project. When this field is set, the project is not charged for and we do not call any billing APIs for this project." + } + }, + "required": [ + "enabled", + "groupIds", + "updatedAt" + ], + "type": "object" + }, + { + "properties": { + "updatedAt": { + "type": "number" + }, + "groupIds": { + "type": "array", + "items": {}, + "minItems": 0, + "maxItems": 0 + }, + "enabled": { + "type": "boolean", + "enum": [ + false + ] + }, + "freeProjectForLegacyLimits": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "enabled", + "groupIds", + "updatedAt" + ], + "type": "object" + } + ] + }, + "name": { + "type": "string" + }, + "nodeVersion": { + "type": "string", + "enum": [ + "10.x", + "12.x", + "14.x", + "16.x", + "18.x", + "20.x", + "22.x", + "24.x", + "8.10.x" + ] + }, + "optionsAllowlist": { + "nullable": true, + "properties": { + "paths": { + "items": { + "properties": { + "value": { + "type": "string" + } + }, + "required": [ + "value" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "paths" + ], + "type": "object" + }, + "outputDirectory": { + "nullable": true, + "type": "string" + }, + "passwordProtection": { + "nullable": true, + "type": "object" + }, + "passport": { + "nullable": true, + "properties": { + "deploymentType": { + "type": "string", + "enum": [ + "all", + "all_except_custom_domains", + "preview", + "prod_deployment_urls_and_all_previews" + ] + }, + "connectorId": { + "type": "string" + } + }, + "required": [ + "connectorId", + "deploymentType" + ], + "type": "object" + }, + "protectionConfig": { + "properties": { + "sandboxUrls": { + "properties": { + "inheritDeploymentProtection": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "type": "object" + } + }, + "type": "object" + }, + "sandbox": { + "properties": { + "region": { + "type": "string", + "enum": [ + "arn1", + "bom1", + "cdg1", + "cle1", + "cpt1", + "dub1", + "fra1", + "gru1", + "hkg1", + "hnd1", + "iad1", + "icn1", + "kix1", + "lhr1", + "pdx1", + "sfo1", + "sin1", + "syd1", + "yul1" + ] + }, + "failoverRegions": { + "items": { + "type": "string", + "enum": [ + "arn1", + "bom1", + "cdg1", + "cle1", + "cpt1", + "dub1", + "fra1", + "gru1", + "hkg1", + "hnd1", + "iad1", + "icn1", + "kix1", + "lhr1", + "pdx1", + "sfo1", + "sin1", + "syd1", + "yul1" + ] + }, + "type": "array" + } + }, + "type": "object" + }, + "productionDeploymentsFastLane": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "resourceConfig": { + "properties": { + "elasticConcurrencyEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "fluid": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "functionDefaultRegions": { + "items": { + "type": "string" + }, + "type": "array" + }, + "functionDefaultTimeout": { + "type": "number" + }, + "functionDefaultMemoryType": { + "type": "string", + "enum": [ + "performance", + "performance_xl", + "standard", + "standard_legacy" + ] + }, + "functionZeroConfigFailover": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "buildMachineType": { + "type": "string", + "enum": [ + "basic", + "enhanced", + "standard", + "turbo" + ] + }, + "buildMachineSelection": { + "type": "string", + "enum": [ + "elastic", + "fixed" + ] + }, + "buildMachineElasticLastUpdated": { + "type": "number" + }, + "buildMachineElasticReason": { + "type": "string", + "enum": [ + "basic-floor", + "build-timeout-failure", + "enospc-failure", + "enterprise-floor", + "high-peak-disk", + "high-peak-memory", + "long-build-duration", + "oom-failure", + "short-build-duration", + "sustained-high-cpu" + ] + }, + "isNSNBDisabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "buildQueue": { + "properties": { + "configuration": { + "type": "string", + "enum": [ + "SKIP_NAMESPACE_QUEUE", + "WAIT_FOR_NAMESPACE_QUEUE" + ] + } + }, + "type": "object" + }, + "enableFunctionsBeta": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "type": "object", + "required": [ + "functionDefaultRegions" + ] + }, + "rollbackDescription": { + "properties": { + "userId": { + "type": "string", + "description": "The user who rolled back the project." + }, + "username": { + "type": "string", + "description": "The username of the user who rolled back the project." + }, + "description": { + "type": "string", + "description": "User-supplied explanation of why they rolled back the project. Limited to 250 characters." + }, + "createdAt": { + "type": "number", + "description": "Timestamp of when the rollback was requested." + } + }, + "required": [ + "createdAt", + "description", + "userId", + "username" + ], + "type": "object", + "description": "Description of why a project was rolled back, and by whom. Note that lastAliasRequest contains the from/to details of the rollback." + }, + "rollingRelease": { + "nullable": true, + "properties": { + "target": { + "type": "string", + "description": "The environment that the release targets, currently only supports production. Adding in case we want to configure with alias groups or custom environments.", + "example": "production" + }, + "stages": { + "nullable": true, + "items": { + "properties": { + "targetPercentage": { + "type": "number", + "description": "The percentage of traffic to serve to the canary deployment (0-100)", + "example": 25 + }, + "requireApproval": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether or not this stage requires manual approval to proceed", + "example": false + }, + "duration": { + "type": "number", + "description": "Duration in minutes for automatic advancement to the next stage", + "example": 600 + }, + "linearShift": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether to linearly shift traffic over the duration of this stage", + "example": false + } + }, + "required": [ + "targetPercentage" + ], + "type": "object", + "description": "An array of all the stages required during a deployment release. Each stage defines a target percentage and advancement rules. The final stage must always have targetPercentage: 100." + }, + "type": "array", + "description": "An array of all the stages required during a deployment release. Each stage defines a target percentage and advancement rules. The final stage must always have targetPercentage: 100." + }, + "canaryResponseHeader": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether the request served by a canary deployment should return a header indicating a canary was served. Defaults to `false` when omitted.", + "example": false + }, + "gate": { + "properties": { + "enabled": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether automated gating is enabled for this project's rollouts." + }, + "checks": { + "items": { + "properties": { + "type": { + "type": "string", + "enum": [ + "error-rate-5xx" + ], + "description": "The metric this check evaluates." + }, + "minSampleSize": { + "type": "number", + "description": "Minimum number of requests required in the window before the check can fail. Below this, the check is inconclusive rather than failing, so low-traffic stages don't gate on noise. Defaults to `100` when omitted.", + "example": 100 + }, + "excludeStatusCodes": { + "items": { + "type": "number" + }, + "type": "array", + "description": "Response status codes to ignore entirely — dropped from both the numerator (errors) and the denominator (total requests). Defaults to `[]` when omitted.", + "example": [ + 503 + ] + }, + "excludePaths": { + "items": { + "type": "string" + }, + "type": "array", + "description": "Request paths to ignore entirely — dropped from both the numerator (errors) and the denominator (total requests). Matched exactly against the request path with any query string removed; no prefix or glob matching. Defaults to `[]` when omitted.", + "example": [ + "/api/health" + ] + }, + "ingestWatermarkSeconds": { + "type": "number", + "description": "Seconds of ingest lag to allow for: the query's upper bound is `now() - this value`, so the check never reads a window that is still filling. Defaults to `30` when omitted.", + "example": 30 + } + }, + "required": [ + "type" + ], + "type": "object", + "description": "The checks to evaluate. An empty array means nothing is evaluated." + }, + "type": "array", + "description": "The checks to evaluate. An empty array means nothing is evaluated." + }, + "failureThreshold": { + "type": "number", + "description": "How many failing evaluations within {@link windowSize} trip the gate. Defaults to `3` when omitted.", + "example": 3 + }, + "windowSize": { + "type": "number", + "description": "How many of the most recent evaluations {@link failureThreshold} is counted against. Defaults to `5` when omitted.", + "example": 5 + }, + "action": { + "type": "string", + "enum": [ + "pause", + "rollback" + ], + "description": "What to do when the gate trips: pause the rollout, or roll it back." + }, + "dryRun": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "When true, a tripped gate is only reported — {@link action} is not taken." + } + }, + "required": [ + "action", + "checks", + "dryRun", + "enabled" + ], + "type": "object", + "description": "Automated gating configuration. Omitted (the default) means no gating is configured, which is equivalent to `enabled: false`." + } + }, + "required": [ + "target" + ], + "type": "object", + "description": "Project-level rolling release configuration that defines how deployments should be gradually rolled out" + }, + "defaultResourceConfig": { + "properties": { + "elasticConcurrencyEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "fluid": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "functionDefaultRegions": { + "items": { + "type": "string" + }, + "type": "array" + }, + "functionDefaultTimeout": { + "type": "number" + }, + "functionDefaultMemoryType": { + "type": "string", + "enum": [ + "performance", + "performance_xl", + "standard", + "standard_legacy" + ] + }, + "functionZeroConfigFailover": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "buildMachineType": { + "type": "string", + "enum": [ + "basic", + "enhanced", + "standard", + "turbo" + ] + }, + "buildMachineSelection": { + "type": "string", + "enum": [ + "elastic", + "fixed" + ] + }, + "buildMachineElasticLastUpdated": { + "type": "number" + }, + "buildMachineElasticReason": { + "type": "string", + "enum": [ + "basic-floor", + "build-timeout-failure", + "enospc-failure", + "enterprise-floor", + "high-peak-disk", + "high-peak-memory", + "long-build-duration", + "oom-failure", + "short-build-duration", + "sustained-high-cpu" + ] + }, + "isNSNBDisabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "buildQueue": { + "properties": { + "configuration": { + "type": "string", + "enum": [ + "SKIP_NAMESPACE_QUEUE", + "WAIT_FOR_NAMESPACE_QUEUE" + ] + } + }, + "type": "object" + }, + "enableFunctionsBeta": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "type": "object", + "required": [ + "functionDefaultRegions" + ] + }, + "rootDirectory": { + "nullable": true, + "type": "string" + }, + "serverlessFunctionZeroConfigFailover": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "skewProtectionBoundaryAt": { + "type": "number" + }, + "skewProtectionMaxAge": { + "type": "number" + }, + "skewProtectionAllowedDomains": { + "items": { + "type": "string" + }, + "type": "array" + }, + "skipGitConnectDuringLink": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "staticIps": { + "properties": { + "builds": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "enabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "regions": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "builds", + "enabled", + "regions" + ], + "type": "object" + }, + "sourceFilesOutsideRootDirectory": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "enableAffectedProjectsDeployments": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "enableExternalRewriteCaching": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "ssoProtection": { + "nullable": true, + "properties": { + "deploymentType": { + "type": "string", + "enum": [ + "all", + "all_except_custom_domains", + "preview", + "prod_deployment_urls_and_all_previews" + ] + }, + "cve55182MigrationAppliedFrom": { + "nullable": true, + "type": "string", + "enum": [ + "all", + "all_except_custom_domains", + "preview", + "prod_deployment_urls_and_all_previews", + null + ] + }, + "april2026SecurityIncidentMigrationAppliedFrom": { + "nullable": true, + "type": "string", + "enum": [ + "all", + "all_except_custom_domains", + "preview", + "prod_deployment_urls_and_all_previews", + null + ] + } + }, + "required": [ + "deploymentType" + ], + "type": "object" + }, + "targets": { + "additionalProperties": { + "nullable": true, + "properties": { + "id": { + "type": "string" + }, + "alias": { + "items": { + "type": "string" + }, + "type": "array" + }, + "aliasAssigned": { + "nullable": true, + "oneOf": [ + { + "type": "number" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + } + ] + }, + "aliasError": { + "nullable": true, + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" + }, + "aliasFinal": { + "nullable": true, + "type": "string" + }, + "automaticAliases": { + "items": { + "type": "string" + }, + "type": "array" + }, + "branchMatcher": { + "properties": { + "type": { + "type": "string", + "enum": [ + "endsWith", + "equals", + "startsWith" + ], + "description": "The type of matching to perform" + }, + "pattern": { + "type": "string", + "description": "The pattern to match against branch names" + } + }, + "required": [ + "pattern", + "type" + ], + "type": "object" + }, + "buildingAt": { + "type": "number" + }, + "builds": { + "items": { + "properties": { + "use": { + "type": "string" + }, + "src": { + "type": "string" + }, + "dest": { + "type": "string" + } + }, + "required": [ + "use" + ], + "type": "object" + }, + "type": "array" + }, + "checksConclusion": { + "type": "string", + "enum": [ + "canceled", + "failed", + "skipped", + "succeeded" + ] + }, + "checksState": { + "type": "string", + "enum": [ + "completed", + "registered", + "running" + ] + }, + "connectBuildsEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "connectConfigurationId": { + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "createdIn": { + "type": "string" + }, + "creator": { + "nullable": true, + "properties": { + "email": { + "type": "string" + }, + "githubLogin": { + "type": "string" + }, + "gitlabLogin": { + "type": "string" + }, + "uid": { + "type": "string" + }, + "username": { + "type": "string" + } + }, + "required": [ + "email", + "uid", + "username" + ], + "type": "object" + }, + "deletedAt": { + "type": "number" + }, + "deploymentHostname": { + "type": "string" + }, + "forced": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "name": { + "type": "string" + }, + "meta": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "monorepoManager": { + "nullable": true, + "type": "string" + }, + "oidcTokenClaims": { + "properties": { + "iss": { + "type": "string" + }, + "sub": { + "type": "string" + }, + "scope": { + "type": "string" + }, + "aud": { + "type": "string" + }, + "owner": { + "type": "string" + }, + "owner_id": { + "type": "string" + }, + "project": { + "type": "string" + }, + "project_id": { + "type": "string" + }, + "environment": { + "type": "string" + }, + "custom_environment_id": { + "type": "string" + }, + "mfe_group_ids": { + "items": { + "type": "string" + }, + "type": "array" + }, + "plan": { + "type": "string" + } + }, + "required": [ + "aud", + "environment", + "iss", + "owner", + "owner_id", + "project", + "project_id", + "scope", + "sub" + ], + "type": "object" + }, + "plan": { + "type": "string", + "enum": [ + "enterprise", + "hobby", + "pro" + ] + }, + "previewCommentsEnabled": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether or not preview comments are enabled for the deployment", + "example": false + }, + "private": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "readyAt": { + "type": "number" + }, + "readyState": { + "type": "string", + "enum": [ + "BLOCKED", + "BUILDING", + "CANCELED", + "ERROR", + "INITIALIZING", + "QUEUED", + "READY" + ] + }, + "readySubstate": { + "type": "string", + "enum": [ + "PROMOTED", + "ROLLING", + "STAGED" + ] + }, + "requestedAt": { + "type": "number" + }, + "target": { + "nullable": true, + "type": "string" + }, + "teamId": { + "nullable": true, + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "LAMBDAS" + ] + }, + "url": { + "type": "string" + }, + "userId": { + "type": "string", + "description": "Present for user creators; omitted for app/integration/system creators." + }, + "withCache": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "createdAt", + "createdIn", + "creator", + "deploymentHostname", + "id", + "name", + "plan", + "private", + "readyState", + "type", + "url" + ], + "type": "object" + }, + "type": "object" + }, + "transferCompletedAt": { + "type": "number" + }, + "transferStartedAt": { + "type": "number" + }, + "transferToAccountId": { + "type": "string" + }, + "transferredFromAccountId": { + "type": "string" + }, + "updatedAt": { + "type": "number" + }, + "live": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "enablePreviewFeedback": { + "nullable": true, + "type": "boolean", + "enum": [ + false, + true, + null + ] + }, + "enableProductionFeedback": { + "nullable": true, + "type": "boolean", + "enum": [ + false, + true, + null + ] + }, + "permissions": { + "properties": { + "oauth2Connection": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "user": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "userConnection": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "userMfaConfiguration": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "userPreference": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "userSudo": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "webAuthn": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "accessGroup": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "agent": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aiGatewayApiKey": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aiGatewayApiKeyBypassAll": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aiGatewayApiKeyOwnedBySelf": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aiGatewayApiKeySpendAttribution": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aiGatewayApiKeyZdrExemption": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aiGatewayBudget": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aiGatewayCredits": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aiGatewayPrivateModels": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aiGatewayGuardrails": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aiGatewayRules": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aiGatewaySettings": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aiGatewayTranscripts": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aiGatewayTranscriptsSettings": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aiGatewayUsage": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aiGatewayVirtualModelConfigs": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "alerts": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "alertRules": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aliasGlobal": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "analyticsSampling": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "analyticsUsage": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "apiKey": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "apiKeyAiGateway": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "apiKeyOwnedBySelf": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "oauth2Application": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "vercelAppInstallation": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "vercelAppInstallationRequest": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "auditLog": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "automation": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "billingAddress": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "billingInformation": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "billingInvoice": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "billingInvoiceEmailRecipient": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "billingInvoiceLanguage": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "billingPlan": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "billingPurchaseOrder": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "billingRefund": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "billingTaxId": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "blob": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "blobStoreTokenSet": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "budget": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "cacheArtifact": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "cacheArtifactUsageEvent": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "codeChecks": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "codeOwners": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "ciInvocations": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "ciLogs": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "concurrentBuilds": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "connect": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "connectConfiguration": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "connectLogs": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "connexClient": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "connexClientProject": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "connexContact": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "connexInstallation": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "connexToken": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "buildMachineDefault": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "cursorOriginInstallation": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "dataCacheBillingSettings": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "defaultDeploymentProtection": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "deploymentPolicy": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "domain": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "domainAcceptDelegation": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "domainAuthCodes": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "domainCertificate": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "domainCheckConfig": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "domainMove": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "domainPurchase": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "domainRecord": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "domainTransferIn": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "drain": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "edgeConfig": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "edgeConfigItem": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "edgeConfigSchema": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "edgeConfigToken": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "endpointVerification": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "event": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "fileUpload": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "flagsExplorerSubscription": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "gitRepository": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "imageOptimizationNewPrice": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integration": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integrationAccount": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integrationConfiguration": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integrationConfigurationProjects": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integrationConfigurationRole": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integrationConfigurationTransfer": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integrationDeploymentAction": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integrationEvent": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integrationLog": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integrationResource": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integrationResourceData": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integrationResourceReplCommand": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integrationResourceSecrets": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integrationSSOSession": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integrationStrict": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integrationStoreTokenSet": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integrationVercelConfigurationOverride": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integrationPullRequest": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "ipBlocking": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "jobGlobal": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "kmsIssuer": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "kmsProjectGrant": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "logDrain": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "marketplaceBillingData": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "marketplaceExperimentationEdgeConfigData": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "marketplaceExperimentationItem": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "marketplaceFlexCommit": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "marketplaceInstallationMember": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "marketplaceInvoice": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "marketplaceSettings": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "Monitoring": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "monitoringAlert": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "monitoringChart": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "monitoringQuery": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "monitoringSettings": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "notificationCustomerBudget": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "notificationDeploymentFailed": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "notificationDomainConfiguration": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "notificationDomainExpire": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "notificationDomainMoved": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "notificationDomainPurchase": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "notificationDomainRenewal": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "notificationDomainTransfer": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "notificationDomainUnverified": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "NotificationMonitoringAlert": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "notificationPaymentFailed": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "notificationPreferences": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "notificationStatementOfReasons": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "notificationUsageAlert": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "oidcFederationPolicy": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "observabilityConfiguration": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "observabilityFunnel": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "observabilityNotebook": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "openTelemetryEndpoint": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "ownEvent": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "organization": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "organizationDomain": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "organizationTeam": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "passwordProtectionInvoiceItem": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "paymentMethod": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "permissions": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "postgres": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "postgresStoreTokenSet": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "previewDeploymentSuffix": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "privateCloudAccount": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectTransferIn": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectTransferRequest": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "proTrialOnboarding": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "rateLimit": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "redis": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "redisStoreTokenSet": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "remoteCaching": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "repository": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "samlConfig": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "secret": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "securityConfig": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "sensitiveEnvironmentVariablePolicy": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "sharedEnvVars": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "sharedEnvVarsProduction": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "space": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "spaceRun": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "storeIsLocked": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "storeTokenSetSensitive": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "storeTransfer": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "supportCase": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "supportCaseComment": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "team": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "teamAccessRequest": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "teamFellowMembership": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "teamGitExclusivity": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "teamInvite": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "teamInviteCode": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "teamInviteLink": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "teamJoin": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "teamMemberMfaStatus": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "teamMicrofrontends": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "teamOwnMembership": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "teamOwnMembershipDisconnectSAML": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "teamSudo": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "teamTokenInvalidation": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "token": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "toolbarComment": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "usage": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "usageCycle": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "vcrRepository": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "vpcPeeringConnection": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "webAnalyticsPlan": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "webhook": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "webhook-event": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aliasProject": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aliasProtectionBypass": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "bulkRedirects": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "buildMachine": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "connectConfigurationLink": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "dataCacheNamespace": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "deployment": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "deploymentBuildLogs": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "deploymentCheck": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "deploymentCheckPreview": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "deploymentCheckReRunFromProductionBranch": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "deploymentProductionGit": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "deploymentV0": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "deploymentPreview": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "deploymentPrivate": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "deploymentPromote": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "deploymentRollback": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "edgeCacheNamespace": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "environments": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "job": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "logs": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "logsPreset": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "observabilityData": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "onDemandBuild": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "onDemandConcurrency": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "optionsAllowlist": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "passwordProtection": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "privateLinkEndpoint": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "productionAliasProtectionBypass": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "productionShareableLink": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "project": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectAccessGroup": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectAnalyticsSampling": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectAnalyticsUsage": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectCheck": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectCheckRun": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectDeploymentExpiration": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectDeploymentHook": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectDeploymentProtectionStrict": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectDomain": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectDomainCheckConfig": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectDomainMove": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectDomainVerify": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectEvent": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectEnvVars": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectEnvVarsProduction": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectEnvVarsUnownedByIntegration": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectFlags": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectFlagsProduction": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectFlagsSdkKey": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectFromV0": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectId": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectIntegrationConfiguration": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectLink": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectMember": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectMonitoring": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectOIDCToken": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectPermissions": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectProductionBranch": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectProtectionBypass": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectRollingRelease": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectRoutes": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectSupportCase": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectSupportCaseComment": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectTier": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectTransfer": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectTransferOut": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectUsage": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "pageIntegrity": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "seawallConfig": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "securityPlusConfiguration": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "shareableLink": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "shareableLinkStrict": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "sharedEnvVarConnection": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "skewProtection": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "analytics": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "trustedIps": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "trustedSources": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "v0Chat": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "vercelAuth": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "vercelRun": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "webAnalytics": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "workflowRunData": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + } + }, + "type": "object" + }, + "lastRollbackTarget": { + "nullable": true, + "type": "object" + }, + "lastAliasRequest": { + "nullable": true, + "properties": { + "fromDeploymentId": { + "nullable": true, + "type": "string" + }, + "toDeploymentId": { + "type": "string" + }, + "fromRollingReleaseId": { + "type": "string", + "description": "If rolling back from a rolling release, fromDeploymentId captures the \"base\" of that rolling release, and fromRollingReleaseId captures the \"target\" of that rolling release." + }, + "jobStatus": { + "type": "string", + "enum": [ + "failed", + "in-progress", + "pending", + "skipped", + "succeeded" + ] + }, + "requestedAt": { + "type": "number" + }, + "type": { + "type": "string", + "enum": [ + "promote", + "rollback" + ] + } + }, + "required": [ + "fromDeploymentId", + "jobStatus", + "requestedAt", + "toDeploymentId", + "type" + ], + "type": "object" + }, + "protectionBypass": { + "additionalProperties": { + "oneOf": [ + { + "properties": { + "createdAt": { + "type": "number" + }, + "createdBy": { + "type": "string" + }, + "scope": { + "type": "string", + "enum": [ + "integration-automation-bypass" + ] + }, + "integrationId": { + "type": "string" + }, + "configurationId": { + "type": "string" + } + }, + "required": [ + "configurationId", + "createdAt", + "createdBy", + "integrationId", + "scope" + ], + "type": "object" + }, + { + "properties": { + "createdAt": { + "type": "number" + }, + "createdBy": { + "type": "string" + }, + "scope": { + "type": "string", + "enum": [ + "automation-bypass" + ] + }, + "isEnvVar": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "When there was only one bypass, it was automatically set as an env var on deployments. With multiple bypasses, there is always one bypass that is selected as the default, and gets set as an env var on deployments. As this is a new field, undefined means that the bypass is the env var. If there are any automation bypasses, exactly one must be the env var." + }, + "note": { + "type": "string", + "description": "Optional note about the bypass to be displayed in the UI" + } + }, + "required": [ + "createdAt", + "createdBy", + "scope" + ], + "type": "object" + } + ] + }, + "type": "object" + }, + "hasActiveBranches": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "trustedIps": { + "nullable": true, + "oneOf": [ + { + "properties": { + "deploymentType": { + "type": "string", + "enum": [ + "all", + "all_except_custom_domains", + "preview", + "prod_deployment_urls_and_all_previews", + "production" + ] + }, + "addresses": { + "items": { + "properties": { + "value": { + "type": "string" + }, + "note": { + "type": "string" + } + }, + "required": [ + "value" + ], + "type": "object" + }, + "type": "array" + }, + "protectionMode": { + "type": "string", + "enum": [ + "additional", + "exclusive" + ] + } + }, + "required": [ + "addresses", + "deploymentType", + "protectionMode" + ], + "type": "object" + }, + { + "properties": { + "deploymentType": { + "type": "string", + "enum": [ + "all", + "all_except_custom_domains", + "preview", + "prod_deployment_urls_and_all_previews", + "production" + ] + } + }, + "required": [ + "deploymentType" + ], + "type": "object" + } + ] + }, + "trustedSources": { + "nullable": true, + "properties": { + "enableVercelCiSameRepository": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Allow same-team Vercel CI access to preview deployments built from the CI run's repository, using the deployment source rather than the current project repository link. Defaults to enabled when not stored; omitted or null Trusted Sources updates preserve the stored value." + }, + "projects": { + "additionalProperties": { + "properties": { + "label": { + "type": "string" + }, + "customAllow": { + "items": { + "properties": { + "from": { + "oneOf": [ + { + "properties": { + "slugs": { + "items": { + "type": "string" + }, + "type": "array", + "description": "System environment slugs (`production`, `preview`) and/or custom environment slugs defined on the referenced project." + }, + "preset": { + "type": "string", + "enum": [ + "all-custom" + ] + } + }, + "required": [ + "slugs" + ], + "type": "object", + "description": "The source envs on the trusted project that are allowed to access `to`." + }, + { + "properties": { + "slugs": { + "items": { + "type": "string" + }, + "type": "array", + "description": "System environment slugs (`production`, `preview`) and/or custom environment slugs defined on the referenced project." + }, + "preset": { + "type": "string", + "enum": [ + "all-custom" + ] + } + }, + "required": [ + "preset" + ], + "type": "object", + "description": "The source envs on the trusted project that are allowed to access `to`." + } + ] + }, + "to": { + "oneOf": [ + { + "properties": { + "slugs": { + "items": { + "type": "string" + }, + "type": "array", + "description": "System environment slugs (`production`, `preview`) and/or custom environment slugs defined on the referenced project." + }, + "preset": { + "type": "string", + "enum": [ + "all-custom" + ] + } + }, + "required": [ + "slugs" + ], + "type": "object", + "description": "The target envs on the current project that may be accessed." + }, + { + "properties": { + "slugs": { + "items": { + "type": "string" + }, + "type": "array", + "description": "System environment slugs (`production`, `preview`) and/or custom environment slugs defined on the referenced project." + }, + "preset": { + "type": "string", + "enum": [ + "all-custom" + ] + } + }, + "required": [ + "preset" + ], + "type": "object", + "description": "The target envs on the current project that may be accessed." + } + ] + } + }, + "required": [ + "from", + "to" + ], + "type": "object", + "description": "Optional overrides for the default same-env-by-slug matching. Provide explicit rules to allow cross-env access or presets." + }, + "type": "array", + "description": "Optional overrides for the default same-env-by-slug matching. Provide explicit rules to allow cross-env access or presets." + } + }, + "type": "object" + }, + "type": "object" + }, + "oidcProviders": { + "additionalProperties": { + "items": { + "properties": { + "to": { + "oneOf": [ + { + "properties": { + "slugs": { + "items": { + "type": "string" + }, + "type": "array", + "description": "System environment slugs (`production`, `preview`) and/or custom environment slugs defined on the referenced project." + }, + "preset": { + "type": "string", + "enum": [ + "all-custom" + ] + } + }, + "required": [ + "slugs" + ], + "type": "object", + "description": "The target envs on the current project that may be accessed." + }, + { + "properties": { + "slugs": { + "items": { + "type": "string" + }, + "type": "array", + "description": "System environment slugs (`production`, `preview`) and/or custom environment slugs defined on the referenced project." + }, + "preset": { + "type": "string", + "enum": [ + "all-custom" + ] + } + }, + "required": [ + "preset" + ], + "type": "object", + "description": "The target envs on the current project that may be accessed." + } + ] + }, + "label": { + "type": "string" + }, + "claims": { + "additionalProperties": { + "items": { + "type": "string" + }, + "type": "array" + }, + "type": "object" + } + }, + "required": [ + "claims", + "to" + ], + "type": "object" + }, + "type": "array" + }, + "type": "object" + } + }, + "type": "object" + }, + "gitComments": { + "properties": { + "onPullRequest": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether the Vercel bot should comment on PRs" + }, + "onCommit": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether the Vercel bot should comment on commits" + } + }, + "required": [ + "onCommit", + "onPullRequest" + ], + "type": "object" + }, + "gitProviderOptions": { + "properties": { + "createDeployments": { + "type": "string", + "enum": [ + "disabled", + "enabled" + ], + "description": "Whether the Vercel bot should automatically create GitHub deployments https://docs.github.com/en/rest/deployments/deployments#about-deployments NOTE: repository-dispatch events should be used instead" + }, + "disableRepositoryDispatchEvents": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether the Vercel bot should not automatically create GitHub repository-dispatch events on deployment events. https://vercel.com/docs/git/vercel-for-github#repository-dispatch-events - `true`: disable repository-dispatch events for this project (explicit override of the team setting). - `false`: enable repository-dispatch events for this project (explicit override of the team setting). - absent: inherit from `team.disableRepositoryDispatchEvents`." + }, + "requireVerifiedCommits": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether the project requires commits to be signed \u0026 verified before deployments will be created. - `true`: require verified commits for this project (explicit override of the team setting). - `false`: do not require verified commits (explicit override of the team setting). - absent: inherit from `team.requireVerifiedCommits`." + }, + "gitCommitStatus": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether Vercel should post commit statuses for this project. When omitted, commit statuses remain enabled." + }, + "consolidatedGitCommitStatus": { + "properties": { + "enabled": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether consolidated commit status is enabled." + }, + "propagateFailures": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether to propagate individual deployment failures to the consolidated status." + } + }, + "required": [ + "enabled", + "propagateFailures" + ], + "type": "object", + "description": "Configuration for consolidated git commit status reporting. When enabled, Vercel will post a single consolidated commit status instead of individual statuses for each deployment." + } + }, + "required": [ + "createDeployments" + ], + "type": "object" + }, + "paused": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "concurrencyBucketName": { + "type": "string" + }, + "webAnalytics": { + "properties": { + "id": { + "type": "string" + }, + "disabledAt": { + "type": "number" + }, + "canceledAt": { + "type": "number" + }, + "enabledAt": { + "type": "number" + }, + "hasData": { + "type": "boolean", + "enum": [ + true + ] + } + }, + "required": [ + "id" + ], + "type": "object" + }, + "security": { + "properties": { + "attackModeEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "attackModeUpdatedAt": { + "type": "number" + }, + "firewallEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "firewallUpdatedAt": { + "type": "number" + }, + "attackModeActiveUntil": { + "nullable": true, + "type": "number" + }, + "firewallConfigVersion": { + "type": "number" + }, + "rulesets": { + "additionalProperties": { + "properties": { + "action": { + "type": "string", + "enum": [ + "allow", + "bypass", + "challenge", + "deny", + "log", + "rate_limit", + "redirect" + ] + }, + "rateLimit": { + "nullable": true, + "properties": { + "algo": { + "type": "string", + "enum": [ + "fixed_window", + "token_bucket" + ] + }, + "window": { + "type": "number" + }, + "limit": { + "type": "number" + }, + "keys": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "algo", + "keys", + "limit", + "window" + ], + "type": "object" + }, + "redirect": { + "nullable": true, + "properties": { + "location": { + "type": "string" + }, + "permanent": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "location", + "permanent" + ], + "type": "object" + }, + "actionDuration": { + "nullable": true, + "type": "string" + }, + "bypassSystem": { + "nullable": true, + "type": "boolean", + "enum": [ + false, + true, + null + ] + }, + "logHeaders": { + "oneOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "string", + "enum": [ + "*" + ] + } + ] + } + }, + "required": [ + "action" + ], + "type": "object" + }, + "type": "object" + }, + "firewallSeawallEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "ja3Enabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "ja4Enabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "firewallBypassIps": { + "items": { + "type": "string" + }, + "type": "array" + }, + "managedRules": { + "nullable": true, + "properties": { + "vercel_ruleset": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "challenge", + "deny", + "log" + ] + } + }, + "required": [ + "active" + ], + "type": "object" + }, + "traffic_sources": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "challenge", + "deny", + "log" + ] + } + }, + "required": [ + "active" + ], + "type": "object" + }, + "bot_filter": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "challenge", + "deny", + "log" + ] + } + }, + "required": [ + "active" + ], + "type": "object" + }, + "ai_bots": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "challenge", + "deny", + "log" + ] + } + }, + "required": [ + "active" + ], + "type": "object" + }, + "owasp": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "challenge", + "deny", + "log" + ] + } + }, + "required": [ + "active" + ], + "type": "object" + } + }, + "required": [ + "ai_bots", + "bot_filter", + "owasp", + "traffic_sources", + "vercel_ruleset" + ], + "type": "object" + }, + "botIdEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "log_headers": { + "oneOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "string", + "enum": [ + "*" + ] + } + ] + }, + "securityPlus": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "securityPlusMetadata": { + "properties": { + "updatedAt": { + "type": "number" + }, + "firstEnabledAt": { + "type": "number", + "description": "Timestamp when the feature was first enabled. Never changes after initial enablement." + } + }, + "required": [ + "updatedAt" + ], + "type": "object" + }, + "pageIntegrityEnabled": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether Page Integrity is enabled for this project. Used by the metadata service to gate DynamoDB lookups against the page-integrity-inventory table." + } + }, + "type": "object" + }, + "oidcTokenConfig": { + "properties": { + "enabled": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether or not to generate OpenID Connect JSON Web Tokens." + }, + "issuerMode": { + "type": "string", + "enum": [ + "global", + "team" + ], + "description": "- team: `https://oidc.vercel.com/[team_slug]` - global: `https://oidc.vercel.com`" + } + }, + "type": "object" + }, + "deploymentPolicy": { + "nullable": true, + "properties": { + "gitSources": { + "nullable": true, + "items": { + "properties": { + "sources": { + "items": { + "oneOf": [ + { + "properties": { + "provider": { + "type": "string", + "enum": [ + "bitbucket", + "github" + ] + }, + "org": { + "type": "string" + }, + "repo": { + "type": "string" + } + }, + "required": [ + "org", + "provider" + ], + "type": "object", + "description": "Allowlist entry for GitHub and Bitbucket, whose repos are identified by a flat `org`/`repo` (Bitbucket's workspace/owner maps to `org`, its repo slug to `repo`). Omit `repo` to match any repo in the org. Org is matched case-insensitively." + }, + { + "properties": { + "provider": { + "type": "string", + "enum": [ + "gitlab" + ] + }, + "namespace": { + "type": "string" + }, + "project": { + "type": "string" + } + }, + "required": [ + "namespace", + "provider" + ], + "type": "object", + "description": "Allowlist entry for GitLab, which uses nested groups rather than a flat org/repo. `namespace` is the full group path (e.g. `group` or `group/subgroup`); `project` is the leaf project name. Omit `project` to match any project under the namespace. Namespace is matched case-insensitively." + } + ] + }, + "type": "array" + }, + "enabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "environments": { + "items": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "system" + ] + }, + "target": { + "type": "string", + "enum": [ + "preview", + "production" + ] + } + }, + "required": [ + "target", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "custom" + ] + }, + "environmentId": { + "type": "string" + } + }, + "required": [ + "environmentId", + "type" + ], + "type": "object" + } + ] + }, + "type": "array" + } + }, + "required": [ + "enabled", + "environments", + "sources" + ], + "type": "object", + "description": "`enabled: true` with empty `sources` is deny-all." + }, + "type": "array" + }, + "deploymentSources": { + "nullable": true, + "items": { + "properties": { + "sources": { + "items": { + "type": "string", + "enum": [ + "cli", + "deploy-hook", + "git", + "integration", + "rest-api", + "v0" + ], + "description": "Customer-configurable deployment sources. Every deploy classifies to exactly one. JSON schema in `packages/deployment-policy/schemas/body.ts` enumerates exactly these values. - `'git'` — git provider webhook. - `'cli'` — Vercel CLI (legacy classic-token CLI and SIWV CLI both). - `'rest-api'` — direct user/team-token REST upload. Does NOT cover deploy hooks, Marketplace integrations, or first-party app tokens. - `'deploy-hook'` — project deploy-hook URL. The URL is the credential. - `'integration'` — third-party Marketplace actor: Marketplace integration token, user-delegated OAuth from a Marketplace app, or an unrecognized third-party Vercel App. First-party Vercel Apps are never `'integration'`. - `'v0'` — the v0 product surface (entitlement-gated). v0 deploys through the CLI under the hood, but classifies as its own source so a team can allow or deny v0 independently of `'cli'`. First-party Vercel apps (Toolbar, etc.) classify as `'first-party'` — see `ClassifiedSource` in `./checks`. They're not in this union because they aren't customer-configurable; they bypass `checkDeploymentSources` entirely. v0 is intentionally NOT among them: like the CLI, it's a real product surface and is policy-controllable." + }, + "type": "array" + }, + "enabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "environments": { + "items": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "system" + ] + }, + "target": { + "type": "string", + "enum": [ + "preview", + "production" + ] + } + }, + "required": [ + "target", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "custom" + ] + }, + "environmentId": { + "type": "string" + } + }, + "required": [ + "environmentId", + "type" + ], + "type": "object" + } + ] + }, + "type": "array" + } + }, + "required": [ + "enabled", + "environments", + "sources" + ], + "type": "object", + "description": "`enabled: true` with empty `sources` is deny-all." + }, + "type": "array" + } + }, + "type": "object", + "description": "Project shape. `null` on a rule list clears the project's override for that rule type (fall back to team for every env); omitting is equivalent. Setting `deploymentPolicy` itself to `null` clears every override at once. Kept structurally distinct from {@link TeamDeploymentPolicy} so the two storage locations don't share a type by accident." + }, + "tier": { + "type": "string", + "enum": [ + "advanced", + "critical", + "priority" + ] + }, + "usageStatus": { + "properties": { + "kind": { + "type": "string", + "enum": [ + "flat" + ], + "description": "Billing mode. Always 'flat' for flat-rate projects." + }, + "exceededAllowanceUntil": { + "type": "number", + "description": "Timestamp until which the project has exceeded its CDN allowance." + }, + "bypassThrottleUntil": { + "type": "number", + "description": "Timestamp until which throttling is bypassed (project pays list rates for overage)." + }, + "throttled": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Per-project throttle, set explicitly for this project (e.g. via the per-project Flat Rate CDN endpoint)." + }, + "teamThrottled": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Synced from `team.billing.usageStatus.throttled`. When `true`, the team has throttled all of its projects regardless of `throttled`. The effective throttle the CDN enforces is `throttled || teamThrottled`." + } + }, + "required": [ + "kind" + ], + "type": "object" + }, + "features": { + "properties": { + "webAnalytics": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "type": "object" + }, + "v0": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "v0Created": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "abuse": { + "properties": { + "scanner": { + "type": "string" + }, + "history": { + "items": { + "properties": { + "scanner": { + "type": "string" + }, + "reason": { + "type": "string" + }, + "by": { + "type": "string" + }, + "byId": { + "type": "string" + }, + "at": { + "type": "number" + } + }, + "required": [ + "at", + "by", + "byId", + "reason", + "scanner" + ], + "type": "object" + }, + "type": "array" + }, + "updatedAt": { + "type": "number" + }, + "block": { + "properties": { + "action": { + "type": "string", + "enum": [ + "blocked" + ] + }, + "reason": { + "type": "string" + }, + "statusCode": { + "type": "number" + }, + "createdAt": { + "type": "number" + }, + "caseId": { + "type": "string" + }, + "actor": { + "type": "string" + }, + "comment": { + "type": "string" + }, + "ineligibleForAppeal": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "isCascading": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "action", + "createdAt", + "reason", + "statusCode" + ], + "type": "object" + }, + "blockHistory": { + "items": { + "oneOf": [ + { + "properties": { + "action": { + "type": "string", + "enum": [ + "blocked" + ] + }, + "reason": { + "type": "string" + }, + "statusCode": { + "type": "number" + }, + "createdAt": { + "type": "number" + }, + "caseId": { + "type": "string" + }, + "actor": { + "type": "string" + }, + "comment": { + "type": "string" + }, + "ineligibleForAppeal": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "isCascading": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "action", + "createdAt", + "reason", + "statusCode" + ], + "type": "object" + }, + { + "properties": { + "action": { + "type": "string", + "enum": [ + "unblocked" + ] + }, + "createdAt": { + "type": "number" + }, + "caseId": { + "type": "string" + }, + "actor": { + "type": "string" + }, + "comment": { + "type": "string" + }, + "ineligibleForAppeal": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "isCascading": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "action", + "createdAt" + ], + "type": "object" + }, + { + "properties": { + "action": { + "type": "string", + "enum": [ + "route-blocked" + ] + }, + "route": { + "oneOf": [ + { + "properties": { + "src": { + "type": "string" + }, + "status": { + "type": "number" + }, + "expiry": { + "type": "number" + } + }, + "required": [ + "src", + "status" + ], + "type": "object" + }, + { + "properties": { + "has": { + "items": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "header" + ] + }, + "key": { + "type": "string", + "enum": [ + "x-vercel-ip-country" + ] + }, + "value": { + "properties": { + "eq": { + "type": "string" + } + }, + "required": [ + "eq" + ], + "type": "object" + } + }, + "required": [ + "key", + "type", + "value" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "host" + ] + }, + "value": { + "properties": { + "eq": { + "type": "string" + } + }, + "required": [ + "eq" + ], + "type": "object" + } + }, + "required": [ + "type", + "value" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "mitigate": { + "properties": { + "action": { + "type": "string", + "enum": [ + "block_legal_cwc" + ] + } + }, + "required": [ + "action" + ], + "type": "object" + }, + "src": { + "type": "string" + } + }, + "required": [ + "has", + "mitigate" + ], + "type": "object" + } + ] + }, + "reason": { + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "caseId": { + "type": "string" + }, + "actor": { + "type": "string" + }, + "comment": { + "type": "string" + }, + "ineligibleForAppeal": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "isCascading": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "action", + "createdAt", + "reason", + "route" + ], + "type": "object" + }, + { + "properties": { + "action": { + "type": "string", + "enum": [ + "route-unblocked" + ] + }, + "route": { + "oneOf": [ + { + "properties": { + "src": { + "type": "string" + }, + "status": { + "type": "number" + }, + "expiry": { + "type": "number" + } + }, + "required": [ + "src", + "status" + ], + "type": "object" + }, + { + "properties": { + "has": { + "items": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "header" + ] + }, + "key": { + "type": "string", + "enum": [ + "x-vercel-ip-country" + ] + }, + "value": { + "properties": { + "eq": { + "type": "string" + } + }, + "required": [ + "eq" + ], + "type": "object" + } + }, + "required": [ + "key", + "type", + "value" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "host" + ] + }, + "value": { + "properties": { + "eq": { + "type": "string" + } + }, + "required": [ + "eq" + ], + "type": "object" + } + }, + "required": [ + "type", + "value" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "mitigate": { + "properties": { + "action": { + "type": "string", + "enum": [ + "block_legal_cwc" + ] + } + }, + "required": [ + "action" + ], + "type": "object" + }, + "src": { + "type": "string" + } + }, + "required": [ + "has", + "mitigate" + ], + "type": "object" + } + ] + }, + "statusCode": { + "type": "number" + }, + "createdAt": { + "type": "number" + }, + "caseId": { + "type": "string" + }, + "actor": { + "type": "string" + }, + "comment": { + "type": "string" + }, + "ineligibleForAppeal": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "isCascading": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "action", + "createdAt", + "route" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "interstitial": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "interstitialHistory": { + "items": { + "properties": { + "action": { + "type": "string", + "enum": [ + "add-deployment-interstitial", + "add-project-interstitial", + "remove-deployment-interstitial", + "remove-project-interstitial" + ] + }, + "createdAt": { + "type": "number" + }, + "caseId": { + "type": "string" + }, + "reason": { + "type": "string" + }, + "actor": { + "type": "string" + }, + "comment": { + "type": "string" + } + }, + "required": [ + "action", + "createdAt" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "history", + "updatedAt" + ], + "type": "object" + }, + "internalRoutes": { + "items": { + "oneOf": [ + { + "properties": { + "src": { + "type": "string" + }, + "status": { + "type": "number" + }, + "expiry": { + "type": "number" + } + }, + "required": [ + "src", + "status" + ], + "type": "object" + }, + { + "properties": { + "has": { + "items": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "header" + ] + }, + "key": { + "type": "string", + "enum": [ + "x-vercel-ip-country" + ] + }, + "value": { + "properties": { + "eq": { + "type": "string" + } + }, + "required": [ + "eq" + ], + "type": "object" + } + }, + "required": [ + "key", + "type", + "value" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "host" + ] + }, + "value": { + "properties": { + "eq": { + "type": "string" + } + }, + "required": [ + "eq" + ], + "type": "object" + } + }, + "required": [ + "type", + "value" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "mitigate": { + "properties": { + "action": { + "type": "string", + "enum": [ + "block_legal_cwc" + ] + } + }, + "required": [ + "action" + ], + "type": "object" + }, + "src": { + "type": "string" + } + }, + "required": [ + "has", + "mitigate" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "hasDeployments": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "dismissedToasts": { + "items": { + "properties": { + "key": { + "type": "string" + }, + "dismissedAt": { + "type": "number" + }, + "action": { + "type": "string", + "enum": [ + "accept", + "cancel", + "delete" + ] + }, + "value": { + "nullable": true, + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "properties": { + "previousValue": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + } + ] + }, + "currentValue": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + } + ] + } + }, + "required": [ + "currentValue", + "previousValue" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + } + ] + } + }, + "required": [ + "action", + "dismissedAt", + "key", + "value" + ], + "type": "object" + }, + "type": "array" + }, + "protectedSourcemaps": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "tracing": { + "properties": { + "domains": { + "type": "string" + }, + "ignorePaths": { + "items": { + "type": "string" + }, + "type": "array" + }, + "samplingRules": { + "items": { + "properties": { + "rate": { + "type": "number" + }, + "env": { + "type": "string", + "enum": [ + "preview", + "production" + ] + }, + "requestPath": { + "type": "string" + }, + "destination": { + "type": "string", + "enum": [ + "external", + "internal" + ], + "description": "Which tracing destination this rule applies to. `internal` is the hidden Vercel production-tracing drain (internal delivery); `external` is any customer-configured drain. Derived from the owning drain's delivery type when project tracing is computed; absent on configs persisted before this field existed." + } + }, + "required": [ + "rate" + ], + "type": "object" + }, + "type": "array" + } + }, + "type": "object" + }, + "avatar": { + "nullable": true, + "type": "string" + } + }, + "required": [ + "accountId", + "alias", + "defaultResourceConfig", + "deploymentExpiration", + "directoryListing", + "id", + "name", + "nodeVersion", + "resourceConfig" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "410": { + "description": "" + } + }, + "x-vercel-cli": { + "supportedSubcommands": true, + "supportedProduction": false, + "aliases": [ + "inspect", + "get" + ] + }, + "parameters": [ + { + "name": "idOrName", + "description": "The unique project identifier or the project name", + "in": "path", + "required": true, + "schema": { + "example": "prj_12HKQaOmR5t5Uy6vdcQsNIiZgHGB", + "description": "The unique project identifier or the project name", + "type": "string" + }, + "x-vercel-cli": { + "kind": "argument" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + }, + "patch": { + "description": "Update the fields of a project using either its `name` or `id`.", + "operationId": "updateProject", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Update an existing project", + "tags": [ + "projects" + ], + "responses": { + "200": { + "description": "The project was successfully updated", + "content": { + "application/json": { + "schema": { + "properties": { + "accountId": { + "type": "string" + }, + "creator": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "user" + ] + }, + "via": { + "nullable": true, + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "app" + ] + }, + "app": { + "properties": { + "id": { + "type": "string", + "description": "The internal ID of the Vercel App backing this principal." + }, + "clientId": { + "type": "string", + "description": "The protocol-facing OAuth client ID. This may differ from {@link id} when Client ID Metadata Documents (CIMD) are used." + } + }, + "required": [ + "id" + ], + "type": "object" + } + }, + "required": [ + "app", + "type" + ], + "type": "object", + "description": "Set when a Vercel App or Integration acts on behalf of a {@link User}. Captures user-consented OAuth delegation that the ACL layer may inspect to evaluate scope restrictions. This is NOT for impersonation or token-exchange provenance — those live on `auth.token`, not on the principal." + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "integration" + ] + }, + "integration": { + "properties": { + "integrationId": { + "type": "string" + }, + "configurationId": { + "type": "string" + } + }, + "required": [ + "configurationId", + "integrationId" + ], + "type": "object" + } + }, + "required": [ + "integration", + "type" + ], + "type": "object", + "description": "Set when a Vercel App or Integration acts on behalf of a {@link User}. Captures user-consented OAuth delegation that the ACL layer may inspect to evaluate scope restrictions. This is NOT for impersonation or token-exchange provenance — those live on `auth.token`, not on the principal." + } + ] + }, + "user": { + "properties": { + "id": { + "type": "string" + } + }, + "required": [ + "id" + ], + "type": "object" + } + }, + "required": [ + "type", + "user", + "via" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "app" + ] + }, + "app": { + "properties": { + "id": { + "type": "string", + "description": "The internal ID of the Vercel App backing this principal." + }, + "clientId": { + "type": "string", + "description": "The protocol-facing OAuth client ID. This may differ from {@link id} when Client ID Metadata Documents (CIMD) are used." + } + }, + "required": [ + "id" + ], + "type": "object" + } + }, + "required": [ + "app", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "integration" + ] + }, + "integration": { + "properties": { + "integrationId": { + "type": "string" + }, + "configurationId": { + "type": "string" + } + }, + "required": [ + "configurationId", + "integrationId" + ], + "type": "object" + } + }, + "required": [ + "integration", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "system" + ] + } + }, + "required": [ + "type" + ], + "type": "object" + } + ] + }, + "alias": { + "items": { + "properties": { + "configuredBy": { + "nullable": true, + "type": "string", + "enum": [ + "A", + "CNAME", + "dns-01", + "http", + null + ] + }, + "configuredChangedAt": { + "nullable": true, + "type": "number" + }, + "createdAt": { + "nullable": true, + "type": "number" + }, + "deployment": { + "nullable": true, + "properties": { + "id": { + "type": "string" + }, + "alias": { + "items": { + "type": "string" + }, + "type": "array" + }, + "aliasAssigned": { + "nullable": true, + "oneOf": [ + { + "type": "number" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + } + ] + }, + "aliasError": { + "nullable": true, + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" + }, + "aliasFinal": { + "nullable": true, + "type": "string" + }, + "automaticAliases": { + "items": { + "type": "string" + }, + "type": "array" + }, + "branchMatcher": { + "properties": { + "type": { + "type": "string", + "enum": [ + "endsWith", + "equals", + "startsWith" + ], + "description": "The type of matching to perform" + }, + "pattern": { + "type": "string", + "description": "The pattern to match against branch names" + } + }, + "required": [ + "pattern", + "type" + ], + "type": "object" + }, + "buildingAt": { + "type": "number" + }, + "builds": { + "items": { + "properties": { + "use": { + "type": "string" + }, + "src": { + "type": "string" + }, + "dest": { + "type": "string" + } + }, + "required": [ + "use" + ], + "type": "object" + }, + "type": "array" + }, + "checksConclusion": { + "type": "string", + "enum": [ + "canceled", + "failed", + "skipped", + "succeeded" + ] + }, + "checksState": { + "type": "string", + "enum": [ + "completed", + "registered", + "running" + ] + }, + "connectBuildsEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "connectConfigurationId": { + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "createdIn": { + "type": "string" + }, + "creator": { + "nullable": true, + "properties": { + "email": { + "type": "string" + }, + "githubLogin": { + "type": "string" + }, + "gitlabLogin": { + "type": "string" + }, + "uid": { + "type": "string" + }, + "username": { + "type": "string" + } + }, + "required": [ + "email", + "uid", + "username" + ], + "type": "object" + }, + "deletedAt": { + "type": "number" + }, + "deploymentHostname": { + "type": "string" + }, + "forced": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "name": { + "type": "string" + }, + "meta": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "monorepoManager": { + "nullable": true, + "type": "string" + }, + "oidcTokenClaims": { + "properties": { + "iss": { + "type": "string" + }, + "sub": { + "type": "string" + }, + "scope": { + "type": "string" + }, + "aud": { + "type": "string" + }, + "owner": { + "type": "string" + }, + "owner_id": { + "type": "string" + }, + "project": { + "type": "string" + }, + "project_id": { + "type": "string" + }, + "environment": { + "type": "string" + }, + "custom_environment_id": { + "type": "string" + }, + "mfe_group_ids": { + "items": { + "type": "string" + }, + "type": "array" + }, + "plan": { + "type": "string" + } + }, + "required": [ + "aud", + "environment", + "iss", + "owner", + "owner_id", + "project", + "project_id", + "scope", + "sub" + ], + "type": "object" + }, + "plan": { + "type": "string", + "enum": [ + "enterprise", + "hobby", + "pro" + ] + }, + "previewCommentsEnabled": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether or not preview comments are enabled for the deployment", + "example": false + }, + "private": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "readyAt": { + "type": "number" + }, + "readyState": { + "type": "string", + "enum": [ + "BLOCKED", + "BUILDING", + "CANCELED", + "ERROR", + "INITIALIZING", + "QUEUED", + "READY" + ] + }, + "readySubstate": { + "type": "string", + "enum": [ + "PROMOTED", + "ROLLING", + "STAGED" + ] + }, + "requestedAt": { + "type": "number" + }, + "target": { + "nullable": true, + "type": "string" + }, + "teamId": { + "nullable": true, + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "LAMBDAS" + ] + }, + "url": { + "type": "string" + }, + "userId": { + "type": "string", + "description": "Present for user creators; omitted for app/integration/system creators." + }, + "withCache": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "createdAt", + "createdIn", + "creator", + "deploymentHostname", + "id", + "name", + "plan", + "private", + "readyState", + "type", + "url" + ], + "type": "object" + }, + "domain": { + "type": "string" + }, + "environment": { + "type": "string", + "enum": [ + "preview", + "production" + ] + }, + "gitBranch": { + "nullable": true, + "type": "string" + }, + "redirect": { + "nullable": true, + "type": "string" + }, + "redirectStatusCode": { + "nullable": true, + "type": "number", + "enum": [ + 301, + 302, + 307, + 308, + null + ] + }, + "target": { + "type": "string", + "enum": [ + "PREVIEW", + "PRODUCTION", + "STAGING" + ] + } + }, + "required": [ + "deployment", + "domain", + "environment", + "target" + ], + "type": "object" + }, + "type": "array" + }, + "analytics": { + "properties": { + "id": { + "type": "string" + }, + "canceledAt": { + "nullable": true, + "type": "number" + }, + "disabledAt": { + "type": "number" + }, + "enabledAt": { + "type": "number" + }, + "paidAt": { + "type": "number" + }, + "sampleRatePercent": { + "nullable": true, + "type": "number" + }, + "spendLimitInDollars": { + "nullable": true, + "type": "number" + } + }, + "required": [ + "disabledAt", + "enabledAt", + "id" + ], + "type": "object" + }, + "appliedCve55182Migration": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "speedInsights": { + "properties": { + "id": { + "type": "string" + }, + "enabledAt": { + "type": "number" + }, + "disabledAt": { + "type": "number" + }, + "canceledAt": { + "type": "number" + }, + "hasData": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "dataReceivedAt": { + "type": "number", + "description": "When the first free (not Speed Insights Plus) production data point was observed, in ms. Set once by subscriber-analytics-events; projects that already had data before this field shipped get it backfilled on their next batch, so it reads \"first free data point observed\", not necessarily \"first ever\"." + }, + "paidAt": { + "type": "number" + } + }, + "required": [ + "id" + ], + "type": "object" + }, + "autoExposeSystemEnvs": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "autoAssignCustomDomains": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "autoAssignCustomDomainsUpdatedBy": { + "type": "string" + }, + "buildCommand": { + "nullable": true, + "type": "string" + }, + "commandForIgnoringBuildStep": { + "nullable": true, + "type": "string" + }, + "connectConfigurations": { + "nullable": true, + "items": { + "properties": { + "envId": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "string", + "enum": [ + "preview", + "production" + ] + } + ] + }, + "connectConfigurationId": { + "type": "string" + }, + "dc": { + "type": "string" + }, + "passive": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "buildsEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "aws": { + "properties": { + "subnetIds": { + "items": { + "type": "string" + }, + "type": "array" + }, + "securityGroupId": { + "type": "string" + } + }, + "required": [ + "subnetIds" + ], + "type": "object" + }, + "createdAt": { + "type": "number" + }, + "updatedAt": { + "type": "number" + } + }, + "required": [ + "buildsEnabled", + "connectConfigurationId", + "createdAt", + "envId", + "passive", + "updatedAt" + ], + "type": "object" + }, + "type": "array" + }, + "connectConfigurationId": { + "nullable": true, + "type": "string" + }, + "connectBuildsEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "passiveConnectConfigurationId": { + "nullable": true, + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "customerSupportCodeVisibility": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "crons": { + "properties": { + "enabledAt": { + "type": "number", + "description": "The time the feature was enabled for this project. Note: It enables automatically with the first Deployment that outputs cronjobs." + }, + "disabledAt": { + "nullable": true, + "type": "number", + "description": "The time the feature was disabled for this project." + }, + "updatedAt": { + "type": "number" + }, + "deploymentId": { + "nullable": true, + "type": "string", + "description": "The ID of the Deployment from which the definitions originated." + }, + "definitions": { + "items": { + "properties": { + "host": { + "type": "string", + "description": "The hostname that should be used.", + "example": "vercel.com" + }, + "path": { + "type": "string", + "description": "The path that should be called for the cronjob.", + "example": "/api/crons/sync-something?hello=world" + }, + "schedule": { + "type": "string", + "description": "The cron expression.", + "example": "0 0 * * *" + }, + "source": { + "type": "string", + "enum": [ + "api" + ], + "description": "The origin of this definition. 'api' means created via the API. Undefined means it originated from a deployment (vercel.json)." + }, + "description": { + "type": "string", + "description": "A human-readable description of what this cron job does." + }, + "hostInferred": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether the host was inferred from the production deployment URL rather than explicitly provided." + } + }, + "required": [ + "host", + "path", + "schedule" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "definitions", + "deploymentId", + "disabledAt", + "enabledAt", + "updatedAt" + ], + "type": "object" + }, + "dataCache": { + "properties": { + "userDisabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "storageSizeBytes": { + "nullable": true, + "type": "number" + }, + "unlimited": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "userDisabled" + ], + "type": "object" + }, + "deploymentExpiration": { + "properties": { + "expirationDays": { + "type": "number", + "description": "Number of days to keep non-production deployments (mostly preview deployments) before soft deletion." + }, + "expirationDaysProduction": { + "type": "number", + "description": "Number of days to keep production deployments before soft deletion." + }, + "expirationDaysCanceled": { + "type": "number", + "description": "Number of days to keep canceled deployments before soft deletion." + }, + "expirationDaysErrored": { + "type": "number", + "description": "Number of days to keep errored deployments before soft deletion." + }, + "deploymentsToKeep": { + "type": "number", + "description": "Minimum number of production deployments to keep for this project, even if they are over the production expiration limit." + } + }, + "type": "object", + "description": "Retention policies for deployments. These are enforced at the project level, but we also maintain an instance of this at the team level as a default policy that gets applied to new projects." + }, + "expiration": { + "oneOf": [ + { + "properties": { + "expiresAt": { + "type": "number", + "description": "Unix ms timestamp when the project is scheduled to expire." + } + }, + "required": [ + "expiresAt" + ], + "type": "object" + }, + { + "properties": { + "lockedAt": { + "type": "number", + "description": "Unix ms timestamp when the project was locked." + }, + "lockedBy": { + "type": "string", + "description": "userId of the actor that triggered the lock (system or admin)." + } + }, + "required": [ + "lockedAt", + "lockedBy" + ], + "type": "object" + } + ] + }, + "devCommand": { + "nullable": true, + "type": "string" + }, + "directoryListing": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "installCommand": { + "nullable": true, + "type": "string" + }, + "env": { + "items": { + "properties": { + "target": { + "oneOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "string", + "enum": [ + "production", + "preview", + "development" + ] + } + ] + }, + "type": { + "type": "string", + "enum": [ + "encrypted", + "plain", + "secret", + "sensitive", + "system" + ] + }, + "sunsetSecretId": { + "type": "string", + "description": "This is used to identify variables that have been migrated from type secret to sensitive." + }, + "legacyValue": { + "type": "string", + "description": "Legacy now-encryption ciphertext, present after migration swaps value/vsmValue" + }, + "decrypted": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "value": { + "type": "string" + }, + "vsmValue": { + "type": "string" + }, + "id": { + "type": "string" + }, + "key": { + "type": "string" + }, + "configurationId": { + "nullable": true, + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "updatedAt": { + "type": "number" + }, + "createdBy": { + "nullable": true, + "type": "string" + }, + "updatedBy": { + "nullable": true, + "type": "string" + }, + "gitBranch": { + "type": "string" + }, + "visibility": { + "type": "string", + "enum": [ + "config", + "secret" + ], + "description": "User-facing config/secret model. When set, authoritative for new code paths when the env-var-config-secret-ui flag is enabled. Legacy rows omit this field; legacy rows omit it and callers fall back to existing `type` behavior." + }, + "edgeConfigId": { + "nullable": true, + "type": "string" + }, + "edgeConfigTokenId": { + "nullable": true, + "type": "string" + }, + "contentHint": { + "nullable": true, + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "redis-url" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "redis-rest-api-url" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "redis-rest-api-token" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "redis-rest-api-read-only-token" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "blob-read-write-token" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "blob-store-id" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "blob-webhook-public-key" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-url" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-url-non-pooling" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-prisma-url" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-user" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-host" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-password" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-database" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-url-no-ssl" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "integration-store-secret" + ] + }, + "storeId": { + "type": "string" + }, + "integrationId": { + "type": "string" + }, + "integrationProductId": { + "type": "string" + }, + "integrationConfigurationId": { + "type": "string" + } + }, + "required": [ + "integrationConfigurationId", + "integrationId", + "integrationProductId", + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "flags-connection-string" + ] + }, + "projectId": { + "type": "string" + } + }, + "required": [ + "projectId", + "type" + ], + "type": "object" + } + ] + }, + "internalContentHint": { + "nullable": true, + "properties": { + "type": { + "type": "string", + "enum": [ + "flags-secret" + ] + }, + "encryptedValue": { + "type": "string", + "description": "Contains the `value` of the env variable, encrypted with a special key to make decryption possible in the subscriber Lambda." + } + }, + "required": [ + "encryptedValue", + "type" + ], + "type": "object", + "description": "Similar to `contentHints`, but should not be exposed to the user." + }, + "comment": { + "type": "string" + }, + "customEnvironmentIds": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "key", + "type", + "value" + ], + "type": "object" + }, + "type": "array" + }, + "customEnvironments": { + "items": { + "properties": { + "id": { + "type": "string", + "description": "Unique identifier for the custom environment (format: env_*)" + }, + "slug": { + "type": "string", + "description": "URL-friendly name of the environment" + }, + "type": { + "type": "string", + "enum": [ + "development", + "preview", + "production" + ], + "description": "The type of environment (production, preview, or development)" + }, + "description": { + "type": "string", + "description": "Optional description of the environment's purpose" + }, + "branchMatcher": { + "properties": { + "type": { + "type": "string", + "enum": [ + "endsWith", + "equals", + "startsWith" + ], + "description": "The type of matching to perform" + }, + "pattern": { + "type": "string", + "description": "The pattern to match against branch names" + } + }, + "required": [ + "pattern", + "type" + ], + "type": "object", + "description": "Configuration for matching git branches to this environment" + }, + "domains": { + "items": { + "properties": { + "name": { + "type": "string" + }, + "apexName": { + "type": "string" + }, + "projectId": { + "type": "string" + }, + "redirect": { + "nullable": true, + "type": "string" + }, + "redirectStatusCode": { + "nullable": true, + "type": "number", + "enum": [ + 301, + 302, + 307, + 308, + null + ] + }, + "gitBranch": { + "nullable": true, + "type": "string" + }, + "customEnvironmentId": { + "nullable": true, + "type": "string" + }, + "updatedAt": { + "type": "number" + }, + "createdAt": { + "type": "number" + }, + "verified": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "`true` if the domain is verified for use with the project. If `false` it will not be used as an alias on this project until the challenge in `verification` is completed." + }, + "verification": { + "items": { + "properties": { + "type": { + "type": "string" + }, + "domain": { + "type": "string" + }, + "value": { + "type": "string" + }, + "reason": { + "type": "string" + } + }, + "required": [ + "domain", + "reason", + "type", + "value" + ], + "type": "object", + "description": "A list of verification challenges, one of which must be completed to verify the domain for use on the project. After the challenge is complete `POST /projects/:idOrName/domains/:domain/verify` to verify the domain. Possible challenges: - If `verification.type = TXT` the `verification.domain` will be checked for a TXT record matching `verification.value`." + }, + "type": "array", + "description": "A list of verification challenges, one of which must be completed to verify the domain for use on the project. After the challenge is complete `POST /projects/:idOrName/domains/:domain/verify` to verify the domain. Possible challenges: - If `verification.type = TXT` the `verification.domain` will be checked for a TXT record matching `verification.value`." + } + }, + "required": [ + "apexName", + "name", + "projectId", + "verified" + ], + "type": "object", + "description": "List of domains associated with this environment" + }, + "type": "array", + "description": "List of domains associated with this environment" + }, + "currentDeploymentAliases": { + "items": { + "type": "string" + }, + "type": "array", + "description": "List of aliases for the current deployment" + }, + "createdAt": { + "type": "number", + "description": "Timestamp when the environment was created" + }, + "updatedAt": { + "type": "number", + "description": "Timestamp when the environment was last updated" + } + }, + "required": [ + "createdAt", + "id", + "slug", + "type", + "updatedAt" + ], + "type": "object", + "description": "Internal representation of a custom environment with all required properties" + }, + "type": "array" + }, + "framework": { + "nullable": true, + "type": "string", + "enum": [ + "actix-web", + "angular", + "ash", + "astro", + "axum", + "blitzjs", + "brunch", + "bun", + "container", + "create-react-app", + "django", + "docusaurus", + "docusaurus-2", + "dojo", + "eleventy", + "elysia", + "ember", + "eve", + "express", + "factory-eve", + "fastapi", + "fasthtml", + "fastify", + "flask", + "gatsby", + "go", + "gridsome", + "h3", + "hexo", + "hono", + "hugo", + "hydrogen", + "ionic-angular", + "ionic-react", + "jekyll", + "koa", + "mastra", + "middleman", + "nestjs", + "nextjs", + "nitro", + "node", + "nuxtjs", + "parcel", + "polymer", + "preact", + "python", + "react-router", + "redwoodjs", + "remix", + "ruby", + "rust", + "saber", + "sanity", + "sanity-v2", + "sapper", + "scully", + "services", + "solidstart", + "solidstart-1", + "stencil", + "storybook", + "svelte", + "sveltekit", + "sveltekit-1", + "tanstack-start", + "tanstack-start-lovable", + "umijs", + "vite", + "vitepress", + "vue", + "vuepress", + "xmcp", + "zola", + null + ] + }, + "services": { + "items": { + "properties": { + "serviceName": { + "type": "string", + "description": "Service name from the deployment (Service.name)." + }, + "serviceType": { + "type": "string", + "enum": [ + "cron", + "job", + "web", + "worker" + ], + "description": "Service kind (Service.type). Omitted for schemas that do not define one." + }, + "framework": { + "type": "string", + "enum": [ + "actix-web", + "angular", + "ash", + "astro", + "axum", + "blitzjs", + "brunch", + "bun", + "container", + "create-react-app", + "django", + "docusaurus", + "docusaurus-2", + "dojo", + "eleventy", + "elysia", + "ember", + "eve", + "express", + "factory-eve", + "fastapi", + "fasthtml", + "fastify", + "flask", + "gatsby", + "go", + "gridsome", + "h3", + "hexo", + "hono", + "hugo", + "hydrogen", + "ionic-angular", + "ionic-react", + "jekyll", + "koa", + "mastra", + "middleman", + "nestjs", + "nextjs", + "nitro", + "node", + "nuxtjs", + "parcel", + "polymer", + "preact", + "python", + "react-router", + "redwoodjs", + "remix", + "ruby", + "rust", + "saber", + "sanity", + "sanity-v2", + "sapper", + "scully", + "services", + "solidstart", + "solidstart-1", + "stencil", + "storybook", + "svelte", + "sveltekit", + "sveltekit-1", + "tanstack-start", + "tanstack-start-lovable", + "umijs", + "vite", + "vitepress", + "vue", + "vuepress", + "xmcp", + "zola" + ], + "description": "Framework slug, when the service has one (omitted otherwise)." + }, + "runtime": { + "type": "string", + "description": "Generic runtime, e.g. 'node' | 'python' | 'go' | 'ruby' | 'rust' (Service.runtime). Omitted for static builds." + } + }, + "required": [ + "serviceName" + ], + "type": "object" + }, + "type": "array" + }, + "gitForkProtection": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "gitLFS": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "id": { + "type": "string" + }, + "ipBuckets": { + "items": { + "properties": { + "bucket": { + "type": "string" + }, + "default": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "supportUntil": { + "type": "number" + } + }, + "required": [ + "bucket" + ], + "type": "object" + }, + "type": "array" + }, + "jobs": { + "properties": { + "lint": { + "properties": { + "targets": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "targets" + ], + "type": "object" + }, + "typecheck": { + "properties": { + "targets": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "targets" + ], + "type": "object" + }, + "mfe-config-present": { + "properties": { + "targets": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "targets" + ], + "type": "object" + } + }, + "type": "object" + }, + "latestDeployments": { + "items": { + "properties": { + "id": { + "type": "string" + }, + "alias": { + "items": { + "type": "string" + }, + "type": "array" + }, + "aliasAssigned": { + "nullable": true, + "oneOf": [ + { + "type": "number" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + } + ] + }, + "aliasError": { + "nullable": true, + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" + }, + "aliasFinal": { + "nullable": true, + "type": "string" + }, + "automaticAliases": { + "items": { + "type": "string" + }, + "type": "array" + }, + "branchMatcher": { + "properties": { + "type": { + "type": "string", + "enum": [ + "endsWith", + "equals", + "startsWith" + ], + "description": "The type of matching to perform" + }, + "pattern": { + "type": "string", + "description": "The pattern to match against branch names" + } + }, + "required": [ + "pattern", + "type" + ], + "type": "object" + }, + "buildingAt": { + "type": "number" + }, + "builds": { + "items": { + "properties": { + "use": { + "type": "string" + }, + "src": { + "type": "string" + }, + "dest": { + "type": "string" + } + }, + "required": [ + "use" + ], + "type": "object" + }, + "type": "array" + }, + "checksConclusion": { + "type": "string", + "enum": [ + "canceled", + "failed", + "skipped", + "succeeded" + ] + }, + "checksState": { + "type": "string", + "enum": [ + "completed", + "registered", + "running" + ] + }, + "connectBuildsEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "connectConfigurationId": { + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "createdIn": { + "type": "string" + }, + "creator": { + "nullable": true, + "properties": { + "email": { + "type": "string" + }, + "githubLogin": { + "type": "string" + }, + "gitlabLogin": { + "type": "string" + }, + "uid": { + "type": "string" + }, + "username": { + "type": "string" + } + }, + "required": [ + "email", + "uid", + "username" + ], + "type": "object" + }, + "deletedAt": { + "type": "number" + }, + "deploymentHostname": { + "type": "string" + }, + "forced": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "name": { + "type": "string" + }, + "meta": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "monorepoManager": { + "nullable": true, + "type": "string" + }, + "oidcTokenClaims": { + "properties": { + "iss": { + "type": "string" + }, + "sub": { + "type": "string" + }, + "scope": { + "type": "string" + }, + "aud": { + "type": "string" + }, + "owner": { + "type": "string" + }, + "owner_id": { + "type": "string" + }, + "project": { + "type": "string" + }, + "project_id": { + "type": "string" + }, + "environment": { + "type": "string" + }, + "custom_environment_id": { + "type": "string" + }, + "mfe_group_ids": { + "items": { + "type": "string" + }, + "type": "array" + }, + "plan": { + "type": "string" + } + }, + "required": [ + "aud", + "environment", + "iss", + "owner", + "owner_id", + "project", + "project_id", + "scope", + "sub" + ], + "type": "object" + }, + "plan": { + "type": "string", + "enum": [ + "enterprise", + "hobby", + "pro" + ] + }, + "previewCommentsEnabled": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether or not preview comments are enabled for the deployment", + "example": false + }, + "private": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "readyAt": { + "type": "number" + }, + "readyState": { + "type": "string", + "enum": [ + "BLOCKED", + "BUILDING", + "CANCELED", + "ERROR", + "INITIALIZING", + "QUEUED", + "READY" + ] + }, + "readySubstate": { + "type": "string", + "enum": [ + "PROMOTED", + "ROLLING", + "STAGED" + ] + }, + "requestedAt": { + "type": "number" + }, + "target": { + "nullable": true, + "type": "string" + }, + "teamId": { + "nullable": true, + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "LAMBDAS" + ] + }, + "url": { + "type": "string" + }, + "userId": { + "type": "string", + "description": "Present for user creators; omitted for app/integration/system creators." + }, + "withCache": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "createdAt", + "createdIn", + "creator", + "deploymentHostname", + "id", + "name", + "plan", + "private", + "readyState", + "type", + "url" + ], + "type": "object" + }, + "type": "array" + }, + "link": { + "oneOf": [ + { + "properties": { + "org": { + "type": "string" + }, + "repoOwnerId": { + "type": "number", + "description": "A new field, should be included in all new project links, is being added just in time when a deployment is created. This is needed for Protected Git scopes." + }, + "repo": { + "type": "string" + }, + "repoId": { + "type": "number" + }, + "type": { + "type": "string", + "enum": [ + "github" + ] + }, + "createdAt": { + "type": "number" + }, + "deployHooks": { + "items": { + "properties": { + "createdAt": { + "type": "number" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "ref": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "ref", + "url" + ], + "type": "object" + }, + "type": "array" + }, + "gitCredentialId": { + "type": "string" + }, + "updatedAt": { + "type": "number" + }, + "sourceless": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "productionBranch": { + "type": "string" + } + }, + "required": [ + "deployHooks", + "gitCredentialId", + "org", + "productionBranch", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "github-limited" + ] + }, + "repo": { + "type": "string" + }, + "repoId": { + "type": "number" + }, + "createdAt": { + "type": "number" + }, + "updatedAt": { + "type": "number" + }, + "org": { + "type": "string" + }, + "repoOwnerId": { + "type": "number", + "description": "A new field, should be included in all new project links, is being added just in time when a deployment is created. This is needed for Protected Git scopes." + }, + "deployHooks": { + "items": { + "properties": { + "createdAt": { + "type": "number" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "ref": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "ref", + "url" + ], + "type": "object" + }, + "type": "array" + }, + "gitCredentialId": { + "type": "string" + }, + "sourceless": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "productionBranch": { + "type": "string" + } + }, + "required": [ + "deployHooks", + "gitCredentialId", + "org", + "productionBranch", + "type" + ], + "type": "object" + }, + { + "properties": { + "org": { + "type": "string" + }, + "repoOwnerId": { + "type": "number", + "description": "A new field, should be included in all new project links, is being added just in time when a deployment is created. This is needed for Protected Git scopes." + }, + "repo": { + "type": "string" + }, + "repoId": { + "type": "number" + }, + "type": { + "type": "string", + "enum": [ + "github-custom-host" + ] + }, + "host": { + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "deployHooks": { + "items": { + "properties": { + "createdAt": { + "type": "number" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "ref": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "ref", + "url" + ], + "type": "object" + }, + "type": "array" + }, + "gitCredentialId": { + "type": "string" + }, + "updatedAt": { + "type": "number" + }, + "sourceless": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "productionBranch": { + "type": "string" + } + }, + "required": [ + "deployHooks", + "gitCredentialId", + "host", + "org", + "productionBranch", + "type" + ], + "type": "object" + }, + { + "properties": { + "projectId": { + "type": "string" + }, + "projectName": { + "type": "string" + }, + "projectNameWithNamespace": { + "type": "string" + }, + "projectNamespace": { + "type": "string" + }, + "projectOwnerId": { + "type": "number", + "description": "A new field, should be included in all new project links, is being added just in time when a deployment is created. This is needed for Protected Git scopes. This is the id of the top level group that a namespace belongs to. Gitlab supports group nesting (up to 20 levels)." + }, + "projectUrl": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "gitlab" + ] + }, + "createdAt": { + "type": "number" + }, + "deployHooks": { + "items": { + "properties": { + "createdAt": { + "type": "number" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "ref": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "ref", + "url" + ], + "type": "object" + }, + "type": "array" + }, + "gitCredentialId": { + "type": "string" + }, + "updatedAt": { + "type": "number" + }, + "sourceless": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "productionBranch": { + "type": "string" + } + }, + "required": [ + "deployHooks", + "gitCredentialId", + "productionBranch", + "projectId", + "projectName", + "projectNameWithNamespace", + "projectNamespace", + "projectUrl", + "type" + ], + "type": "object" + }, + { + "properties": { + "name": { + "type": "string" + }, + "slug": { + "type": "string" + }, + "owner": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "bitbucket" + ] + }, + "uuid": { + "type": "string" + }, + "workspaceUuid": { + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "deployHooks": { + "items": { + "properties": { + "createdAt": { + "type": "number" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "ref": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "ref", + "url" + ], + "type": "object" + }, + "type": "array" + }, + "gitCredentialId": { + "type": "string" + }, + "updatedAt": { + "type": "number" + }, + "sourceless": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "productionBranch": { + "type": "string" + } + }, + "required": [ + "deployHooks", + "gitCredentialId", + "name", + "owner", + "productionBranch", + "slug", + "type", + "uuid", + "workspaceUuid" + ], + "type": "object" + }, + { + "properties": { + "org": { + "type": "string" + }, + "repo": { + "type": "string" + }, + "repoId": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "vercel" + ] + }, + "createdAt": { + "type": "number" + }, + "deployHooks": { + "items": { + "properties": { + "createdAt": { + "type": "number" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "ref": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "ref", + "url" + ], + "type": "object" + }, + "type": "array" + }, + "gitCredentialId": { + "type": "string" + }, + "updatedAt": { + "type": "number" + }, + "sourceless": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "productionBranch": { + "type": "string" + } + }, + "required": [ + "deployHooks", + "gitCredentialId", + "org", + "productionBranch", + "repo", + "repoId", + "type" + ], + "type": "object" + }, + { + "properties": { + "org": { + "type": "string" + }, + "repo": { + "type": "string" + }, + "repoId": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "v0" + ] + }, + "createdAt": { + "type": "number" + }, + "deployHooks": { + "items": { + "properties": { + "createdAt": { + "type": "number" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "ref": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "ref", + "url" + ], + "type": "object" + }, + "type": "array" + }, + "gitCredentialId": { + "type": "string" + }, + "updatedAt": { + "type": "number" + }, + "sourceless": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "productionBranch": { + "type": "string" + } + }, + "required": [ + "deployHooks", + "gitCredentialId", + "org", + "productionBranch", + "repo", + "repoId", + "type" + ], + "type": "object" + }, + { + "properties": { + "owner": { + "type": "string", + "description": "Owner (namespace) slug, e.g. `acme`." + }, + "repo": { + "type": "string" + }, + "repoId": { + "type": "string", + "description": "Origin repository id." + }, + "ownerId": { + "type": "string", + "description": "Origin namespace id (`ns_…`) of the owner." + }, + "type": { + "type": "string", + "enum": [ + "cursor-origin" + ] + }, + "createdAt": { + "type": "number" + }, + "deployHooks": { + "items": { + "properties": { + "createdAt": { + "type": "number" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "ref": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "ref", + "url" + ], + "type": "object" + }, + "type": "array" + }, + "gitCredentialId": { + "type": "string" + }, + "updatedAt": { + "type": "number" + }, + "sourceless": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "productionBranch": { + "type": "string" + } + }, + "required": [ + "deployHooks", + "gitCredentialId", + "owner", + "ownerId", + "productionBranch", + "repo", + "repoId", + "type" + ], + "type": "object" + } + ] + }, + "blobs": { + "properties": { + "isDefaultApp": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Marks the team-level, Vercel-managed default blob project (`vercel-blob-default-project`) that orphan blob stores are scoped to when connected without an explicit project. Set only by internal storage flows and immutable after creation — guards rely on it to protect the connected stores from being lost when the project is deleted or transferred." + } + }, + "type": "object" + }, + "microfrontends": { + "oneOf": [ + { + "properties": { + "isDefaultApp": { + "type": "boolean", + "enum": [ + true + ] + }, + "updatedAt": { + "type": "number", + "description": "Timestamp when the microfrontends settings were last updated." + }, + "groupIds": { + "type": "array", + "items": { + "type": "string" + }, + "minItems": 1, + "description": "The group IDs of microfrontends that this project belongs to. Each microfrontend project must belong to a microfrontends group that is the set of microfrontends that are used together." + }, + "enabled": { + "type": "boolean", + "enum": [ + true + ], + "description": "Whether microfrontends are enabled for this project." + }, + "defaultRoute": { + "type": "string", + "description": "A path that is used to take screenshots and as the default path in preview links when a domain for this microfrontend is shown in the UI. Includes the leading slash, e.g. `/docs`" + }, + "freeProjectForLegacyLimits": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether the project was part of the legacy limits for hobby and pro-trial before billing was added. This field is only set when the team is upgraded to a paid plan and we are backfilling the subscription status. We cap the subscription to 2 projects and set this field for the 3rd project. When this field is set, the project is not charged for and we do not call any billing APIs for this project." + } + }, + "required": [ + "enabled", + "groupIds", + "isDefaultApp", + "updatedAt" + ], + "type": "object" + }, + { + "properties": { + "isDefaultApp": { + "type": "boolean", + "enum": [ + false + ] + }, + "routeObservabilityToThisProject": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether observability data should be routed to this microfrontend project or a root project." + }, + "doNotRouteWithMicrofrontendsRouting": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether to add microfrontends routing to aliases. This means domains in this project will route as a microfrontend." + }, + "updatedAt": { + "type": "number", + "description": "Timestamp when the microfrontends settings were last updated." + }, + "groupIds": { + "type": "array", + "items": { + "type": "string" + }, + "minItems": 1, + "description": "The group IDs of microfrontends that this project belongs to. Each microfrontend project must belong to a microfrontends group that is the set of microfrontends that are used together." + }, + "enabled": { + "type": "boolean", + "enum": [ + true + ], + "description": "Whether microfrontends are enabled for this project." + }, + "defaultRoute": { + "type": "string", + "description": "A path that is used to take screenshots and as the default path in preview links when a domain for this microfrontend is shown in the UI. Includes the leading slash, e.g. `/docs`" + }, + "freeProjectForLegacyLimits": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether the project was part of the legacy limits for hobby and pro-trial before billing was added. This field is only set when the team is upgraded to a paid plan and we are backfilling the subscription status. We cap the subscription to 2 projects and set this field for the 3rd project. When this field is set, the project is not charged for and we do not call any billing APIs for this project." + } + }, + "required": [ + "enabled", + "groupIds", + "updatedAt" + ], + "type": "object" + }, + { + "properties": { + "updatedAt": { + "type": "number" + }, + "groupIds": { + "type": "array", + "items": {}, + "minItems": 0, + "maxItems": 0 + }, + "enabled": { + "type": "boolean", + "enum": [ + false + ] + }, + "freeProjectForLegacyLimits": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "enabled", + "groupIds", + "updatedAt" + ], + "type": "object" + } + ] + }, + "name": { + "type": "string" + }, + "nodeVersion": { + "type": "string", + "enum": [ + "10.x", + "12.x", + "14.x", + "16.x", + "18.x", + "20.x", + "22.x", + "24.x", + "8.10.x" + ] + }, + "optionsAllowlist": { + "nullable": true, + "properties": { + "paths": { + "items": { + "properties": { + "value": { + "type": "string" + } + }, + "required": [ + "value" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "paths" + ], + "type": "object" + }, + "outputDirectory": { + "nullable": true, + "type": "string" + }, + "passwordProtection": { + "nullable": true, + "type": "object" + }, + "passport": { + "nullable": true, + "properties": { + "deploymentType": { + "type": "string", + "enum": [ + "all", + "all_except_custom_domains", + "preview", + "prod_deployment_urls_and_all_previews" + ] + }, + "connectorId": { + "type": "string" + } + }, + "required": [ + "connectorId", + "deploymentType" + ], + "type": "object" + }, + "protectionConfig": { + "properties": { + "sandboxUrls": { + "properties": { + "inheritDeploymentProtection": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "type": "object" + } + }, + "type": "object" + }, + "sandbox": { + "properties": { + "region": { + "type": "string", + "enum": [ + "arn1", + "bom1", + "cdg1", + "cle1", + "cpt1", + "dub1", + "fra1", + "gru1", + "hkg1", + "hnd1", + "iad1", + "icn1", + "kix1", + "lhr1", + "pdx1", + "sfo1", + "sin1", + "syd1", + "yul1" + ] + }, + "failoverRegions": { + "items": { + "type": "string", + "enum": [ + "arn1", + "bom1", + "cdg1", + "cle1", + "cpt1", + "dub1", + "fra1", + "gru1", + "hkg1", + "hnd1", + "iad1", + "icn1", + "kix1", + "lhr1", + "pdx1", + "sfo1", + "sin1", + "syd1", + "yul1" + ] + }, + "type": "array" + } + }, + "type": "object" + }, + "productionDeploymentsFastLane": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "resourceConfig": { + "properties": { + "elasticConcurrencyEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "fluid": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "functionDefaultRegions": { + "items": { + "type": "string" + }, + "type": "array" + }, + "functionDefaultTimeout": { + "type": "number" + }, + "functionDefaultMemoryType": { + "type": "string", + "enum": [ + "performance", + "performance_xl", + "standard", + "standard_legacy" + ] + }, + "functionZeroConfigFailover": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "buildMachineType": { + "type": "string", + "enum": [ + "basic", + "enhanced", + "standard", + "turbo" + ] + }, + "buildMachineSelection": { + "type": "string", + "enum": [ + "elastic", + "fixed" + ] + }, + "buildMachineElasticLastUpdated": { + "type": "number" + }, + "buildMachineElasticReason": { + "type": "string", + "enum": [ + "basic-floor", + "build-timeout-failure", + "enospc-failure", + "enterprise-floor", + "high-peak-disk", + "high-peak-memory", + "long-build-duration", + "oom-failure", + "short-build-duration", + "sustained-high-cpu" + ] + }, + "isNSNBDisabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "buildQueue": { + "properties": { + "configuration": { + "type": "string", + "enum": [ + "SKIP_NAMESPACE_QUEUE", + "WAIT_FOR_NAMESPACE_QUEUE" + ] + } + }, + "type": "object" + }, + "enableFunctionsBeta": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "type": "object", + "required": [ + "functionDefaultRegions" + ] + }, + "rollbackDescription": { + "properties": { + "userId": { + "type": "string", + "description": "The user who rolled back the project." + }, + "username": { + "type": "string", + "description": "The username of the user who rolled back the project." + }, + "description": { + "type": "string", + "description": "User-supplied explanation of why they rolled back the project. Limited to 250 characters." + }, + "createdAt": { + "type": "number", + "description": "Timestamp of when the rollback was requested." + } + }, + "required": [ + "createdAt", + "description", + "userId", + "username" + ], + "type": "object", + "description": "Description of why a project was rolled back, and by whom. Note that lastAliasRequest contains the from/to details of the rollback." + }, + "rollingRelease": { + "nullable": true, + "properties": { + "target": { + "type": "string", + "description": "The environment that the release targets, currently only supports production. Adding in case we want to configure with alias groups or custom environments.", + "example": "production" + }, + "stages": { + "nullable": true, + "items": { + "properties": { + "targetPercentage": { + "type": "number", + "description": "The percentage of traffic to serve to the canary deployment (0-100)", + "example": 25 + }, + "requireApproval": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether or not this stage requires manual approval to proceed", + "example": false + }, + "duration": { + "type": "number", + "description": "Duration in minutes for automatic advancement to the next stage", + "example": 600 + }, + "linearShift": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether to linearly shift traffic over the duration of this stage", + "example": false + } + }, + "required": [ + "targetPercentage" + ], + "type": "object", + "description": "An array of all the stages required during a deployment release. Each stage defines a target percentage and advancement rules. The final stage must always have targetPercentage: 100." + }, + "type": "array", + "description": "An array of all the stages required during a deployment release. Each stage defines a target percentage and advancement rules. The final stage must always have targetPercentage: 100." + }, + "canaryResponseHeader": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether the request served by a canary deployment should return a header indicating a canary was served. Defaults to `false` when omitted.", + "example": false + }, + "gate": { + "properties": { + "enabled": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether automated gating is enabled for this project's rollouts." + }, + "checks": { + "items": { + "properties": { + "type": { + "type": "string", + "enum": [ + "error-rate-5xx" + ], + "description": "The metric this check evaluates." + }, + "minSampleSize": { + "type": "number", + "description": "Minimum number of requests required in the window before the check can fail. Below this, the check is inconclusive rather than failing, so low-traffic stages don't gate on noise. Defaults to `100` when omitted.", + "example": 100 + }, + "excludeStatusCodes": { + "items": { + "type": "number" + }, + "type": "array", + "description": "Response status codes to ignore entirely — dropped from both the numerator (errors) and the denominator (total requests). Defaults to `[]` when omitted.", + "example": [ + 503 + ] + }, + "excludePaths": { + "items": { + "type": "string" + }, + "type": "array", + "description": "Request paths to ignore entirely — dropped from both the numerator (errors) and the denominator (total requests). Matched exactly against the request path with any query string removed; no prefix or glob matching. Defaults to `[]` when omitted.", + "example": [ + "/api/health" + ] + }, + "ingestWatermarkSeconds": { + "type": "number", + "description": "Seconds of ingest lag to allow for: the query's upper bound is `now() - this value`, so the check never reads a window that is still filling. Defaults to `30` when omitted.", + "example": 30 + } + }, + "required": [ + "type" + ], + "type": "object", + "description": "The checks to evaluate. An empty array means nothing is evaluated." + }, + "type": "array", + "description": "The checks to evaluate. An empty array means nothing is evaluated." + }, + "failureThreshold": { + "type": "number", + "description": "How many failing evaluations within {@link windowSize} trip the gate. Defaults to `3` when omitted.", + "example": 3 + }, + "windowSize": { + "type": "number", + "description": "How many of the most recent evaluations {@link failureThreshold} is counted against. Defaults to `5` when omitted.", + "example": 5 + }, + "action": { + "type": "string", + "enum": [ + "pause", + "rollback" + ], + "description": "What to do when the gate trips: pause the rollout, or roll it back." + }, + "dryRun": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "When true, a tripped gate is only reported — {@link action} is not taken." + } + }, + "required": [ + "action", + "checks", + "dryRun", + "enabled" + ], + "type": "object", + "description": "Automated gating configuration. Omitted (the default) means no gating is configured, which is equivalent to `enabled: false`." + } + }, + "required": [ + "target" + ], + "type": "object", + "description": "Project-level rolling release configuration that defines how deployments should be gradually rolled out" + }, + "defaultResourceConfig": { + "properties": { + "elasticConcurrencyEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "fluid": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "functionDefaultRegions": { + "items": { + "type": "string" + }, + "type": "array" + }, + "functionDefaultTimeout": { + "type": "number" + }, + "functionDefaultMemoryType": { + "type": "string", + "enum": [ + "performance", + "performance_xl", + "standard", + "standard_legacy" + ] + }, + "functionZeroConfigFailover": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "buildMachineType": { + "type": "string", + "enum": [ + "basic", + "enhanced", + "standard", + "turbo" + ] + }, + "buildMachineSelection": { + "type": "string", + "enum": [ + "elastic", + "fixed" + ] + }, + "buildMachineElasticLastUpdated": { + "type": "number" + }, + "buildMachineElasticReason": { + "type": "string", + "enum": [ + "basic-floor", + "build-timeout-failure", + "enospc-failure", + "enterprise-floor", + "high-peak-disk", + "high-peak-memory", + "long-build-duration", + "oom-failure", + "short-build-duration", + "sustained-high-cpu" + ] + }, + "isNSNBDisabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "buildQueue": { + "properties": { + "configuration": { + "type": "string", + "enum": [ + "SKIP_NAMESPACE_QUEUE", + "WAIT_FOR_NAMESPACE_QUEUE" + ] + } + }, + "type": "object" + }, + "enableFunctionsBeta": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "type": "object", + "required": [ + "functionDefaultRegions" + ] + }, + "rootDirectory": { + "nullable": true, + "type": "string" + }, + "serverlessFunctionZeroConfigFailover": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "skewProtectionBoundaryAt": { + "type": "number" + }, + "skewProtectionMaxAge": { + "type": "number" + }, + "skewProtectionAllowedDomains": { + "items": { + "type": "string" + }, + "type": "array" + }, + "skipGitConnectDuringLink": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "staticIps": { + "properties": { + "builds": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "enabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "regions": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "builds", + "enabled", + "regions" + ], + "type": "object" + }, + "sourceFilesOutsideRootDirectory": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "enableAffectedProjectsDeployments": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "enableExternalRewriteCaching": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "ssoProtection": { + "nullable": true, + "properties": { + "deploymentType": { + "type": "string", + "enum": [ + "all", + "all_except_custom_domains", + "preview", + "prod_deployment_urls_and_all_previews" + ] + }, + "cve55182MigrationAppliedFrom": { + "nullable": true, + "type": "string", + "enum": [ + "all", + "all_except_custom_domains", + "preview", + "prod_deployment_urls_and_all_previews", + null + ] + }, + "april2026SecurityIncidentMigrationAppliedFrom": { + "nullable": true, + "type": "string", + "enum": [ + "all", + "all_except_custom_domains", + "preview", + "prod_deployment_urls_and_all_previews", + null + ] + } + }, + "required": [ + "deploymentType" + ], + "type": "object" + }, + "targets": { + "additionalProperties": { + "nullable": true, + "properties": { + "id": { + "type": "string" + }, + "alias": { + "items": { + "type": "string" + }, + "type": "array" + }, + "aliasAssigned": { + "nullable": true, + "oneOf": [ + { + "type": "number" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + } + ] + }, + "aliasError": { + "nullable": true, + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" + }, + "aliasFinal": { + "nullable": true, + "type": "string" + }, + "automaticAliases": { + "items": { + "type": "string" + }, + "type": "array" + }, + "branchMatcher": { + "properties": { + "type": { + "type": "string", + "enum": [ + "endsWith", + "equals", + "startsWith" + ], + "description": "The type of matching to perform" + }, + "pattern": { + "type": "string", + "description": "The pattern to match against branch names" + } + }, + "required": [ + "pattern", + "type" + ], + "type": "object" + }, + "buildingAt": { + "type": "number" + }, + "builds": { + "items": { + "properties": { + "use": { + "type": "string" + }, + "src": { + "type": "string" + }, + "dest": { + "type": "string" + } + }, + "required": [ + "use" + ], + "type": "object" + }, + "type": "array" + }, + "checksConclusion": { + "type": "string", + "enum": [ + "canceled", + "failed", + "skipped", + "succeeded" + ] + }, + "checksState": { + "type": "string", + "enum": [ + "completed", + "registered", + "running" + ] + }, + "connectBuildsEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "connectConfigurationId": { + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "createdIn": { + "type": "string" + }, + "creator": { + "nullable": true, + "properties": { + "email": { + "type": "string" + }, + "githubLogin": { + "type": "string" + }, + "gitlabLogin": { + "type": "string" + }, + "uid": { + "type": "string" + }, + "username": { + "type": "string" + } + }, + "required": [ + "email", + "uid", + "username" + ], + "type": "object" + }, + "deletedAt": { + "type": "number" + }, + "deploymentHostname": { + "type": "string" + }, + "forced": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "name": { + "type": "string" + }, + "meta": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "monorepoManager": { + "nullable": true, + "type": "string" + }, + "oidcTokenClaims": { + "properties": { + "iss": { + "type": "string" + }, + "sub": { + "type": "string" + }, + "scope": { + "type": "string" + }, + "aud": { + "type": "string" + }, + "owner": { + "type": "string" + }, + "owner_id": { + "type": "string" + }, + "project": { + "type": "string" + }, + "project_id": { + "type": "string" + }, + "environment": { + "type": "string" + }, + "custom_environment_id": { + "type": "string" + }, + "mfe_group_ids": { + "items": { + "type": "string" + }, + "type": "array" + }, + "plan": { + "type": "string" + } + }, + "required": [ + "aud", + "environment", + "iss", + "owner", + "owner_id", + "project", + "project_id", + "scope", + "sub" + ], + "type": "object" + }, + "plan": { + "type": "string", + "enum": [ + "enterprise", + "hobby", + "pro" + ] + }, + "previewCommentsEnabled": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether or not preview comments are enabled for the deployment", + "example": false + }, + "private": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "readyAt": { + "type": "number" + }, + "readyState": { + "type": "string", + "enum": [ + "BLOCKED", + "BUILDING", + "CANCELED", + "ERROR", + "INITIALIZING", + "QUEUED", + "READY" + ] + }, + "readySubstate": { + "type": "string", + "enum": [ + "PROMOTED", + "ROLLING", + "STAGED" + ] + }, + "requestedAt": { + "type": "number" + }, + "target": { + "nullable": true, + "type": "string" + }, + "teamId": { + "nullable": true, + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "LAMBDAS" + ] + }, + "url": { + "type": "string" + }, + "userId": { + "type": "string", + "description": "Present for user creators; omitted for app/integration/system creators." + }, + "withCache": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "createdAt", + "createdIn", + "creator", + "deploymentHostname", + "id", + "name", + "plan", + "private", + "readyState", + "type", + "url" + ], + "type": "object" + }, + "type": "object" + }, + "transferCompletedAt": { + "type": "number" + }, + "transferStartedAt": { + "type": "number" + }, + "transferToAccountId": { + "type": "string" + }, + "transferredFromAccountId": { + "type": "string" + }, + "updatedAt": { + "type": "number" + }, + "live": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "enablePreviewFeedback": { + "nullable": true, + "type": "boolean", + "enum": [ + false, + true, + null + ] + }, + "enableProductionFeedback": { + "nullable": true, + "type": "boolean", + "enum": [ + false, + true, + null + ] + }, + "permissions": { + "properties": { + "oauth2Connection": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "user": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "userConnection": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "userMfaConfiguration": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "userPreference": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "userSudo": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "webAuthn": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "accessGroup": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "agent": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aiGatewayApiKey": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aiGatewayApiKeyBypassAll": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aiGatewayApiKeyOwnedBySelf": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aiGatewayApiKeySpendAttribution": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aiGatewayApiKeyZdrExemption": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aiGatewayBudget": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aiGatewayCredits": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aiGatewayPrivateModels": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aiGatewayGuardrails": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aiGatewayRules": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aiGatewaySettings": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aiGatewayTranscripts": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aiGatewayTranscriptsSettings": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aiGatewayUsage": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aiGatewayVirtualModelConfigs": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "alerts": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "alertRules": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aliasGlobal": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "analyticsSampling": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "analyticsUsage": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "apiKey": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "apiKeyAiGateway": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "apiKeyOwnedBySelf": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "oauth2Application": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "vercelAppInstallation": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "vercelAppInstallationRequest": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "auditLog": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "automation": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "billingAddress": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "billingInformation": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "billingInvoice": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "billingInvoiceEmailRecipient": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "billingInvoiceLanguage": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "billingPlan": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "billingPurchaseOrder": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "billingRefund": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "billingTaxId": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "blob": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "blobStoreTokenSet": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "budget": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "cacheArtifact": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "cacheArtifactUsageEvent": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "codeChecks": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "codeOwners": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "ciInvocations": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "ciLogs": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "concurrentBuilds": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "connect": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "connectConfiguration": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "connectLogs": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "connexClient": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "connexClientProject": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "connexContact": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "connexInstallation": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "connexToken": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "buildMachineDefault": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "cursorOriginInstallation": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "dataCacheBillingSettings": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "defaultDeploymentProtection": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "deploymentPolicy": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "domain": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "domainAcceptDelegation": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "domainAuthCodes": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "domainCertificate": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "domainCheckConfig": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "domainMove": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "domainPurchase": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "domainRecord": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "domainTransferIn": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "drain": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "edgeConfig": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "edgeConfigItem": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "edgeConfigSchema": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "edgeConfigToken": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "endpointVerification": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "event": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "fileUpload": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "flagsExplorerSubscription": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "gitRepository": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "imageOptimizationNewPrice": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integration": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integrationAccount": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integrationConfiguration": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integrationConfigurationProjects": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integrationConfigurationRole": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integrationConfigurationTransfer": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integrationDeploymentAction": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integrationEvent": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integrationLog": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integrationResource": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integrationResourceData": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integrationResourceReplCommand": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integrationResourceSecrets": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integrationSSOSession": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integrationStrict": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integrationStoreTokenSet": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integrationVercelConfigurationOverride": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integrationPullRequest": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "ipBlocking": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "jobGlobal": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "kmsIssuer": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "kmsProjectGrant": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "logDrain": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "marketplaceBillingData": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "marketplaceExperimentationEdgeConfigData": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "marketplaceExperimentationItem": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "marketplaceFlexCommit": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "marketplaceInstallationMember": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "marketplaceInvoice": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "marketplaceSettings": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "Monitoring": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "monitoringAlert": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "monitoringChart": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "monitoringQuery": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "monitoringSettings": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "notificationCustomerBudget": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "notificationDeploymentFailed": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "notificationDomainConfiguration": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "notificationDomainExpire": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "notificationDomainMoved": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "notificationDomainPurchase": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "notificationDomainRenewal": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "notificationDomainTransfer": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "notificationDomainUnverified": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "NotificationMonitoringAlert": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "notificationPaymentFailed": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "notificationPreferences": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "notificationStatementOfReasons": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "notificationUsageAlert": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "oidcFederationPolicy": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "observabilityConfiguration": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "observabilityFunnel": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "observabilityNotebook": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "openTelemetryEndpoint": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "ownEvent": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "organization": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "organizationDomain": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "organizationTeam": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "passwordProtectionInvoiceItem": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "paymentMethod": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "permissions": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "postgres": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "postgresStoreTokenSet": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "previewDeploymentSuffix": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "privateCloudAccount": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectTransferIn": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectTransferRequest": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "proTrialOnboarding": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "rateLimit": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "redis": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "redisStoreTokenSet": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "remoteCaching": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "repository": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "samlConfig": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "secret": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "securityConfig": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "sensitiveEnvironmentVariablePolicy": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "sharedEnvVars": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "sharedEnvVarsProduction": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "space": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "spaceRun": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "storeIsLocked": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "storeTokenSetSensitive": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "storeTransfer": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "supportCase": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "supportCaseComment": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "team": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "teamAccessRequest": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "teamFellowMembership": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "teamGitExclusivity": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "teamInvite": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "teamInviteCode": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "teamInviteLink": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "teamJoin": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "teamMemberMfaStatus": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "teamMicrofrontends": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "teamOwnMembership": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "teamOwnMembershipDisconnectSAML": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "teamSudo": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "teamTokenInvalidation": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "token": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "toolbarComment": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "usage": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "usageCycle": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "vcrRepository": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "vpcPeeringConnection": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "webAnalyticsPlan": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "webhook": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "webhook-event": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aliasProject": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aliasProtectionBypass": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "bulkRedirects": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "buildMachine": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "connectConfigurationLink": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "dataCacheNamespace": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "deployment": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "deploymentBuildLogs": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "deploymentCheck": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "deploymentCheckPreview": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "deploymentCheckReRunFromProductionBranch": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "deploymentProductionGit": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "deploymentV0": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "deploymentPreview": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "deploymentPrivate": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "deploymentPromote": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "deploymentRollback": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "edgeCacheNamespace": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "environments": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "job": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "logs": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "logsPreset": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "observabilityData": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "onDemandBuild": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "onDemandConcurrency": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "optionsAllowlist": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "passwordProtection": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "privateLinkEndpoint": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "productionAliasProtectionBypass": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "productionShareableLink": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "project": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectAccessGroup": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectAnalyticsSampling": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectAnalyticsUsage": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectCheck": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectCheckRun": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectDeploymentExpiration": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectDeploymentHook": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectDeploymentProtectionStrict": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectDomain": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectDomainCheckConfig": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectDomainMove": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectDomainVerify": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectEvent": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectEnvVars": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectEnvVarsProduction": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectEnvVarsUnownedByIntegration": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectFlags": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectFlagsProduction": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectFlagsSdkKey": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectFromV0": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectId": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectIntegrationConfiguration": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectLink": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectMember": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectMonitoring": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectOIDCToken": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectPermissions": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectProductionBranch": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectProtectionBypass": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectRollingRelease": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectRoutes": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectSupportCase": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectSupportCaseComment": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectTier": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectTransfer": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectTransferOut": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectUsage": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "pageIntegrity": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "seawallConfig": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "securityPlusConfiguration": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "shareableLink": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "shareableLinkStrict": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "sharedEnvVarConnection": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "skewProtection": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "analytics": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "trustedIps": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "trustedSources": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "v0Chat": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "vercelAuth": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "vercelRun": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "webAnalytics": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "workflowRunData": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + } + }, + "type": "object" + }, + "lastRollbackTarget": { + "nullable": true, + "type": "object" + }, + "lastAliasRequest": { + "nullable": true, + "properties": { + "fromDeploymentId": { + "nullable": true, + "type": "string" + }, + "toDeploymentId": { + "type": "string" + }, + "fromRollingReleaseId": { + "type": "string", + "description": "If rolling back from a rolling release, fromDeploymentId captures the \"base\" of that rolling release, and fromRollingReleaseId captures the \"target\" of that rolling release." + }, + "jobStatus": { + "type": "string", + "enum": [ + "failed", + "in-progress", + "pending", + "skipped", + "succeeded" + ] + }, + "requestedAt": { + "type": "number" + }, + "type": { + "type": "string", + "enum": [ + "promote", + "rollback" + ] + } + }, + "required": [ + "fromDeploymentId", + "jobStatus", + "requestedAt", + "toDeploymentId", + "type" + ], + "type": "object" + }, + "protectionBypass": { + "additionalProperties": { + "oneOf": [ + { + "properties": { + "createdAt": { + "type": "number" + }, + "createdBy": { + "type": "string" + }, + "scope": { + "type": "string", + "enum": [ + "integration-automation-bypass" + ] + }, + "integrationId": { + "type": "string" + }, + "configurationId": { + "type": "string" + } + }, + "required": [ + "configurationId", + "createdAt", + "createdBy", + "integrationId", + "scope" + ], + "type": "object" + }, + { + "properties": { + "createdAt": { + "type": "number" + }, + "createdBy": { + "type": "string" + }, + "scope": { + "type": "string", + "enum": [ + "automation-bypass" + ] + }, + "isEnvVar": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "When there was only one bypass, it was automatically set as an env var on deployments. With multiple bypasses, there is always one bypass that is selected as the default, and gets set as an env var on deployments. As this is a new field, undefined means that the bypass is the env var. If there are any automation bypasses, exactly one must be the env var." + }, + "note": { + "type": "string", + "description": "Optional note about the bypass to be displayed in the UI" + } + }, + "required": [ + "createdAt", + "createdBy", + "scope" + ], + "type": "object" + } + ] + }, + "type": "object" + }, + "hasActiveBranches": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "trustedIps": { + "nullable": true, + "oneOf": [ + { + "properties": { + "deploymentType": { + "type": "string", + "enum": [ + "all", + "all_except_custom_domains", + "preview", + "prod_deployment_urls_and_all_previews", + "production" + ] + }, + "addresses": { + "items": { + "properties": { + "value": { + "type": "string" + }, + "note": { + "type": "string" + } + }, + "required": [ + "value" + ], + "type": "object" + }, + "type": "array" + }, + "protectionMode": { + "type": "string", + "enum": [ + "additional", + "exclusive" + ] + } + }, + "required": [ + "addresses", + "deploymentType", + "protectionMode" + ], + "type": "object" + }, + { + "properties": { + "deploymentType": { + "type": "string", + "enum": [ + "all", + "all_except_custom_domains", + "preview", + "prod_deployment_urls_and_all_previews", + "production" + ] + } + }, + "required": [ + "deploymentType" + ], + "type": "object" + } + ] + }, + "trustedSources": { + "nullable": true, + "properties": { + "enableVercelCiSameRepository": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Allow same-team Vercel CI access to preview deployments built from the CI run's repository, using the deployment source rather than the current project repository link. Defaults to enabled when not stored; omitted or null Trusted Sources updates preserve the stored value." + }, + "projects": { + "additionalProperties": { + "properties": { + "label": { + "type": "string" + }, + "customAllow": { + "items": { + "properties": { + "from": { + "oneOf": [ + { + "properties": { + "slugs": { + "items": { + "type": "string" + }, + "type": "array", + "description": "System environment slugs (`production`, `preview`) and/or custom environment slugs defined on the referenced project." + }, + "preset": { + "type": "string", + "enum": [ + "all-custom" + ] + } + }, + "required": [ + "slugs" + ], + "type": "object", + "description": "The source envs on the trusted project that are allowed to access `to`." + }, + { + "properties": { + "slugs": { + "items": { + "type": "string" + }, + "type": "array", + "description": "System environment slugs (`production`, `preview`) and/or custom environment slugs defined on the referenced project." + }, + "preset": { + "type": "string", + "enum": [ + "all-custom" + ] + } + }, + "required": [ + "preset" + ], + "type": "object", + "description": "The source envs on the trusted project that are allowed to access `to`." + } + ] + }, + "to": { + "oneOf": [ + { + "properties": { + "slugs": { + "items": { + "type": "string" + }, + "type": "array", + "description": "System environment slugs (`production`, `preview`) and/or custom environment slugs defined on the referenced project." + }, + "preset": { + "type": "string", + "enum": [ + "all-custom" + ] + } + }, + "required": [ + "slugs" + ], + "type": "object", + "description": "The target envs on the current project that may be accessed." + }, + { + "properties": { + "slugs": { + "items": { + "type": "string" + }, + "type": "array", + "description": "System environment slugs (`production`, `preview`) and/or custom environment slugs defined on the referenced project." + }, + "preset": { + "type": "string", + "enum": [ + "all-custom" + ] + } + }, + "required": [ + "preset" + ], + "type": "object", + "description": "The target envs on the current project that may be accessed." + } + ] + } + }, + "required": [ + "from", + "to" + ], + "type": "object", + "description": "Optional overrides for the default same-env-by-slug matching. Provide explicit rules to allow cross-env access or presets." + }, + "type": "array", + "description": "Optional overrides for the default same-env-by-slug matching. Provide explicit rules to allow cross-env access or presets." + } + }, + "type": "object" + }, + "type": "object" + }, + "oidcProviders": { + "additionalProperties": { + "items": { + "properties": { + "to": { + "oneOf": [ + { + "properties": { + "slugs": { + "items": { + "type": "string" + }, + "type": "array", + "description": "System environment slugs (`production`, `preview`) and/or custom environment slugs defined on the referenced project." + }, + "preset": { + "type": "string", + "enum": [ + "all-custom" + ] + } + }, + "required": [ + "slugs" + ], + "type": "object", + "description": "The target envs on the current project that may be accessed." + }, + { + "properties": { + "slugs": { + "items": { + "type": "string" + }, + "type": "array", + "description": "System environment slugs (`production`, `preview`) and/or custom environment slugs defined on the referenced project." + }, + "preset": { + "type": "string", + "enum": [ + "all-custom" + ] + } + }, + "required": [ + "preset" + ], + "type": "object", + "description": "The target envs on the current project that may be accessed." + } + ] + }, + "label": { + "type": "string" + }, + "claims": { + "additionalProperties": { + "items": { + "type": "string" + }, + "type": "array" + }, + "type": "object" + } + }, + "required": [ + "claims", + "to" + ], + "type": "object" + }, + "type": "array" + }, + "type": "object" + } + }, + "type": "object" + }, + "gitComments": { + "properties": { + "onPullRequest": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether the Vercel bot should comment on PRs" + }, + "onCommit": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether the Vercel bot should comment on commits" + } + }, + "required": [ + "onCommit", + "onPullRequest" + ], + "type": "object" + }, + "gitProviderOptions": { + "properties": { + "createDeployments": { + "type": "string", + "enum": [ + "disabled", + "enabled" + ], + "description": "Whether the Vercel bot should automatically create GitHub deployments https://docs.github.com/en/rest/deployments/deployments#about-deployments NOTE: repository-dispatch events should be used instead" + }, + "disableRepositoryDispatchEvents": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether the Vercel bot should not automatically create GitHub repository-dispatch events on deployment events. https://vercel.com/docs/git/vercel-for-github#repository-dispatch-events - `true`: disable repository-dispatch events for this project (explicit override of the team setting). - `false`: enable repository-dispatch events for this project (explicit override of the team setting). - absent: inherit from `team.disableRepositoryDispatchEvents`." + }, + "requireVerifiedCommits": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether the project requires commits to be signed \u0026 verified before deployments will be created. - `true`: require verified commits for this project (explicit override of the team setting). - `false`: do not require verified commits (explicit override of the team setting). - absent: inherit from `team.requireVerifiedCommits`." + }, + "gitCommitStatus": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether Vercel should post commit statuses for this project. When omitted, commit statuses remain enabled." + }, + "consolidatedGitCommitStatus": { + "properties": { + "enabled": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether consolidated commit status is enabled." + }, + "propagateFailures": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether to propagate individual deployment failures to the consolidated status." + } + }, + "required": [ + "enabled", + "propagateFailures" + ], + "type": "object", + "description": "Configuration for consolidated git commit status reporting. When enabled, Vercel will post a single consolidated commit status instead of individual statuses for each deployment." + } + }, + "required": [ + "createDeployments" + ], + "type": "object" + }, + "paused": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "concurrencyBucketName": { + "type": "string" + }, + "webAnalytics": { + "properties": { + "id": { + "type": "string" + }, + "disabledAt": { + "type": "number" + }, + "canceledAt": { + "type": "number" + }, + "enabledAt": { + "type": "number" + }, + "hasData": { + "type": "boolean", + "enum": [ + true + ] + } + }, + "required": [ + "id" + ], + "type": "object" + }, + "security": { + "properties": { + "attackModeEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "attackModeUpdatedAt": { + "type": "number" + }, + "firewallEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "firewallUpdatedAt": { + "type": "number" + }, + "attackModeActiveUntil": { + "nullable": true, + "type": "number" + }, + "firewallConfigVersion": { + "type": "number" + }, + "rulesets": { + "additionalProperties": { + "properties": { + "action": { + "type": "string", + "enum": [ + "allow", + "bypass", + "challenge", + "deny", + "log", + "rate_limit", + "redirect" + ] + }, + "rateLimit": { + "nullable": true, + "properties": { + "algo": { + "type": "string", + "enum": [ + "fixed_window", + "token_bucket" + ] + }, + "window": { + "type": "number" + }, + "limit": { + "type": "number" + }, + "keys": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "algo", + "keys", + "limit", + "window" + ], + "type": "object" + }, + "redirect": { + "nullable": true, + "properties": { + "location": { + "type": "string" + }, + "permanent": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "location", + "permanent" + ], + "type": "object" + }, + "actionDuration": { + "nullable": true, + "type": "string" + }, + "bypassSystem": { + "nullable": true, + "type": "boolean", + "enum": [ + false, + true, + null + ] + }, + "logHeaders": { + "oneOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "string", + "enum": [ + "*" + ] + } + ] + } + }, + "required": [ + "action" + ], + "type": "object" + }, + "type": "object" + }, + "firewallSeawallEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "ja3Enabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "ja4Enabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "firewallBypassIps": { + "items": { + "type": "string" + }, + "type": "array" + }, + "managedRules": { + "nullable": true, + "properties": { + "vercel_ruleset": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "challenge", + "deny", + "log" + ] + } + }, + "required": [ + "active" + ], + "type": "object" + }, + "traffic_sources": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "challenge", + "deny", + "log" + ] + } + }, + "required": [ + "active" + ], + "type": "object" + }, + "bot_filter": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "challenge", + "deny", + "log" + ] + } + }, + "required": [ + "active" + ], + "type": "object" + }, + "ai_bots": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "challenge", + "deny", + "log" + ] + } + }, + "required": [ + "active" + ], + "type": "object" + }, + "owasp": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "challenge", + "deny", + "log" + ] + } + }, + "required": [ + "active" + ], + "type": "object" + } + }, + "required": [ + "ai_bots", + "bot_filter", + "owasp", + "traffic_sources", + "vercel_ruleset" + ], + "type": "object" + }, + "botIdEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "log_headers": { + "oneOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "string", + "enum": [ + "*" + ] + } + ] + }, + "securityPlus": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "securityPlusMetadata": { + "properties": { + "updatedAt": { + "type": "number" + }, + "firstEnabledAt": { + "type": "number", + "description": "Timestamp when the feature was first enabled. Never changes after initial enablement." + } + }, + "required": [ + "updatedAt" + ], + "type": "object" + }, + "pageIntegrityEnabled": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether Page Integrity is enabled for this project. Used by the metadata service to gate DynamoDB lookups against the page-integrity-inventory table." + } + }, + "type": "object" + }, + "oidcTokenConfig": { + "properties": { + "enabled": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether or not to generate OpenID Connect JSON Web Tokens." + }, + "issuerMode": { + "type": "string", + "enum": [ + "global", + "team" + ], + "description": "- team: `https://oidc.vercel.com/[team_slug]` - global: `https://oidc.vercel.com`" + } + }, + "type": "object" + }, + "deploymentPolicy": { + "nullable": true, + "properties": { + "gitSources": { + "nullable": true, + "items": { + "properties": { + "sources": { + "items": { + "oneOf": [ + { + "properties": { + "provider": { + "type": "string", + "enum": [ + "bitbucket", + "github" + ] + }, + "org": { + "type": "string" + }, + "repo": { + "type": "string" + } + }, + "required": [ + "org", + "provider" + ], + "type": "object", + "description": "Allowlist entry for GitHub and Bitbucket, whose repos are identified by a flat `org`/`repo` (Bitbucket's workspace/owner maps to `org`, its repo slug to `repo`). Omit `repo` to match any repo in the org. Org is matched case-insensitively." + }, + { + "properties": { + "provider": { + "type": "string", + "enum": [ + "gitlab" + ] + }, + "namespace": { + "type": "string" + }, + "project": { + "type": "string" + } + }, + "required": [ + "namespace", + "provider" + ], + "type": "object", + "description": "Allowlist entry for GitLab, which uses nested groups rather than a flat org/repo. `namespace` is the full group path (e.g. `group` or `group/subgroup`); `project` is the leaf project name. Omit `project` to match any project under the namespace. Namespace is matched case-insensitively." + } + ] + }, + "type": "array" + }, + "enabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "environments": { + "items": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "system" + ] + }, + "target": { + "type": "string", + "enum": [ + "preview", + "production" + ] + } + }, + "required": [ + "target", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "custom" + ] + }, + "environmentId": { + "type": "string" + } + }, + "required": [ + "environmentId", + "type" + ], + "type": "object" + } + ] + }, + "type": "array" + } + }, + "required": [ + "enabled", + "environments", + "sources" + ], + "type": "object", + "description": "`enabled: true` with empty `sources` is deny-all." + }, + "type": "array" + }, + "deploymentSources": { + "nullable": true, + "items": { + "properties": { + "sources": { + "items": { + "type": "string", + "enum": [ + "cli", + "deploy-hook", + "git", + "integration", + "rest-api", + "v0" + ], + "description": "Customer-configurable deployment sources. Every deploy classifies to exactly one. JSON schema in `packages/deployment-policy/schemas/body.ts` enumerates exactly these values. - `'git'` — git provider webhook. - `'cli'` — Vercel CLI (legacy classic-token CLI and SIWV CLI both). - `'rest-api'` — direct user/team-token REST upload. Does NOT cover deploy hooks, Marketplace integrations, or first-party app tokens. - `'deploy-hook'` — project deploy-hook URL. The URL is the credential. - `'integration'` — third-party Marketplace actor: Marketplace integration token, user-delegated OAuth from a Marketplace app, or an unrecognized third-party Vercel App. First-party Vercel Apps are never `'integration'`. - `'v0'` — the v0 product surface (entitlement-gated). v0 deploys through the CLI under the hood, but classifies as its own source so a team can allow or deny v0 independently of `'cli'`. First-party Vercel apps (Toolbar, etc.) classify as `'first-party'` — see `ClassifiedSource` in `./checks`. They're not in this union because they aren't customer-configurable; they bypass `checkDeploymentSources` entirely. v0 is intentionally NOT among them: like the CLI, it's a real product surface and is policy-controllable." + }, + "type": "array" + }, + "enabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "environments": { + "items": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "system" + ] + }, + "target": { + "type": "string", + "enum": [ + "preview", + "production" + ] + } + }, + "required": [ + "target", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "custom" + ] + }, + "environmentId": { + "type": "string" + } + }, + "required": [ + "environmentId", + "type" + ], + "type": "object" + } + ] + }, + "type": "array" + } + }, + "required": [ + "enabled", + "environments", + "sources" + ], + "type": "object", + "description": "`enabled: true` with empty `sources` is deny-all." + }, + "type": "array" + } + }, + "type": "object", + "description": "Project shape. `null` on a rule list clears the project's override for that rule type (fall back to team for every env); omitting is equivalent. Setting `deploymentPolicy` itself to `null` clears every override at once. Kept structurally distinct from {@link TeamDeploymentPolicy} so the two storage locations don't share a type by accident." + }, + "tier": { + "type": "string", + "enum": [ + "advanced", + "critical", + "priority" + ] + }, + "usageStatus": { + "properties": { + "kind": { + "type": "string", + "enum": [ + "flat" + ], + "description": "Billing mode. Always 'flat' for flat-rate projects." + }, + "exceededAllowanceUntil": { + "type": "number", + "description": "Timestamp until which the project has exceeded its CDN allowance." + }, + "bypassThrottleUntil": { + "type": "number", + "description": "Timestamp until which throttling is bypassed (project pays list rates for overage)." + }, + "throttled": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Per-project throttle, set explicitly for this project (e.g. via the per-project Flat Rate CDN endpoint)." + }, + "teamThrottled": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Synced from `team.billing.usageStatus.throttled`. When `true`, the team has throttled all of its projects regardless of `throttled`. The effective throttle the CDN enforces is `throttled || teamThrottled`." + } + }, + "required": [ + "kind" + ], + "type": "object" + }, + "features": { + "properties": { + "webAnalytics": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "type": "object" + }, + "v0": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "v0Created": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "abuse": { + "properties": { + "scanner": { + "type": "string" + }, + "history": { + "items": { + "properties": { + "scanner": { + "type": "string" + }, + "reason": { + "type": "string" + }, + "by": { + "type": "string" + }, + "byId": { + "type": "string" + }, + "at": { + "type": "number" + } + }, + "required": [ + "at", + "by", + "byId", + "reason", + "scanner" + ], + "type": "object" + }, + "type": "array" + }, + "updatedAt": { + "type": "number" + }, + "block": { + "properties": { + "action": { + "type": "string", + "enum": [ + "blocked" + ] + }, + "reason": { + "type": "string" + }, + "statusCode": { + "type": "number" + }, + "createdAt": { + "type": "number" + }, + "caseId": { + "type": "string" + }, + "actor": { + "type": "string" + }, + "comment": { + "type": "string" + }, + "ineligibleForAppeal": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "isCascading": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "action", + "createdAt", + "reason", + "statusCode" + ], + "type": "object" + }, + "blockHistory": { + "items": { + "oneOf": [ + { + "properties": { + "action": { + "type": "string", + "enum": [ + "blocked" + ] + }, + "reason": { + "type": "string" + }, + "statusCode": { + "type": "number" + }, + "createdAt": { + "type": "number" + }, + "caseId": { + "type": "string" + }, + "actor": { + "type": "string" + }, + "comment": { + "type": "string" + }, + "ineligibleForAppeal": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "isCascading": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "action", + "createdAt", + "reason", + "statusCode" + ], + "type": "object" + }, + { + "properties": { + "action": { + "type": "string", + "enum": [ + "unblocked" + ] + }, + "createdAt": { + "type": "number" + }, + "caseId": { + "type": "string" + }, + "actor": { + "type": "string" + }, + "comment": { + "type": "string" + }, + "ineligibleForAppeal": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "isCascading": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "action", + "createdAt" + ], + "type": "object" + }, + { + "properties": { + "action": { + "type": "string", + "enum": [ + "route-blocked" + ] + }, + "route": { + "oneOf": [ + { + "properties": { + "src": { + "type": "string" + }, + "status": { + "type": "number" + }, + "expiry": { + "type": "number" + } + }, + "required": [ + "src", + "status" + ], + "type": "object" + }, + { + "properties": { + "has": { + "items": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "header" + ] + }, + "key": { + "type": "string", + "enum": [ + "x-vercel-ip-country" + ] + }, + "value": { + "properties": { + "eq": { + "type": "string" + } + }, + "required": [ + "eq" + ], + "type": "object" + } + }, + "required": [ + "key", + "type", + "value" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "host" + ] + }, + "value": { + "properties": { + "eq": { + "type": "string" + } + }, + "required": [ + "eq" + ], + "type": "object" + } + }, + "required": [ + "type", + "value" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "mitigate": { + "properties": { + "action": { + "type": "string", + "enum": [ + "block_legal_cwc" + ] + } + }, + "required": [ + "action" + ], + "type": "object" + }, + "src": { + "type": "string" + } + }, + "required": [ + "has", + "mitigate" + ], + "type": "object" + } + ] + }, + "reason": { + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "caseId": { + "type": "string" + }, + "actor": { + "type": "string" + }, + "comment": { + "type": "string" + }, + "ineligibleForAppeal": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "isCascading": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "action", + "createdAt", + "reason", + "route" + ], + "type": "object" + }, + { + "properties": { + "action": { + "type": "string", + "enum": [ + "route-unblocked" + ] + }, + "route": { + "oneOf": [ + { + "properties": { + "src": { + "type": "string" + }, + "status": { + "type": "number" + }, + "expiry": { + "type": "number" + } + }, + "required": [ + "src", + "status" + ], + "type": "object" + }, + { + "properties": { + "has": { + "items": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "header" + ] + }, + "key": { + "type": "string", + "enum": [ + "x-vercel-ip-country" + ] + }, + "value": { + "properties": { + "eq": { + "type": "string" + } + }, + "required": [ + "eq" + ], + "type": "object" + } + }, + "required": [ + "key", + "type", + "value" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "host" + ] + }, + "value": { + "properties": { + "eq": { + "type": "string" + } + }, + "required": [ + "eq" + ], + "type": "object" + } + }, + "required": [ + "type", + "value" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "mitigate": { + "properties": { + "action": { + "type": "string", + "enum": [ + "block_legal_cwc" + ] + } + }, + "required": [ + "action" + ], + "type": "object" + }, + "src": { + "type": "string" + } + }, + "required": [ + "has", + "mitigate" + ], + "type": "object" + } + ] + }, + "statusCode": { + "type": "number" + }, + "createdAt": { + "type": "number" + }, + "caseId": { + "type": "string" + }, + "actor": { + "type": "string" + }, + "comment": { + "type": "string" + }, + "ineligibleForAppeal": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "isCascading": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "action", + "createdAt", + "route" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "interstitial": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "interstitialHistory": { + "items": { + "properties": { + "action": { + "type": "string", + "enum": [ + "add-deployment-interstitial", + "add-project-interstitial", + "remove-deployment-interstitial", + "remove-project-interstitial" + ] + }, + "createdAt": { + "type": "number" + }, + "caseId": { + "type": "string" + }, + "reason": { + "type": "string" + }, + "actor": { + "type": "string" + }, + "comment": { + "type": "string" + } + }, + "required": [ + "action", + "createdAt" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "history", + "updatedAt" + ], + "type": "object" + }, + "internalRoutes": { + "items": { + "oneOf": [ + { + "properties": { + "src": { + "type": "string" + }, + "status": { + "type": "number" + }, + "expiry": { + "type": "number" + } + }, + "required": [ + "src", + "status" + ], + "type": "object" + }, + { + "properties": { + "has": { + "items": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "header" + ] + }, + "key": { + "type": "string", + "enum": [ + "x-vercel-ip-country" + ] + }, + "value": { + "properties": { + "eq": { + "type": "string" + } + }, + "required": [ + "eq" + ], + "type": "object" + } + }, + "required": [ + "key", + "type", + "value" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "host" + ] + }, + "value": { + "properties": { + "eq": { + "type": "string" + } + }, + "required": [ + "eq" + ], + "type": "object" + } + }, + "required": [ + "type", + "value" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "mitigate": { + "properties": { + "action": { + "type": "string", + "enum": [ + "block_legal_cwc" + ] + } + }, + "required": [ + "action" + ], + "type": "object" + }, + "src": { + "type": "string" + } + }, + "required": [ + "has", + "mitigate" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "hasDeployments": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "dismissedToasts": { + "items": { + "properties": { + "key": { + "type": "string" + }, + "dismissedAt": { + "type": "number" + }, + "action": { + "type": "string", + "enum": [ + "accept", + "cancel", + "delete" + ] + }, + "value": { + "nullable": true, + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "properties": { + "previousValue": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + } + ] + }, + "currentValue": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + } + ] + } + }, + "required": [ + "currentValue", + "previousValue" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + } + ] + } + }, + "required": [ + "action", + "dismissedAt", + "key", + "value" + ], + "type": "object" + }, + "type": "array" + }, + "protectedSourcemaps": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "tracing": { + "properties": { + "domains": { + "type": "string" + }, + "ignorePaths": { + "items": { + "type": "string" + }, + "type": "array" + }, + "samplingRules": { + "items": { + "properties": { + "rate": { + "type": "number" + }, + "env": { + "type": "string", + "enum": [ + "preview", + "production" + ] + }, + "requestPath": { + "type": "string" + }, + "destination": { + "type": "string", + "enum": [ + "external", + "internal" + ], + "description": "Which tracing destination this rule applies to. `internal` is the hidden Vercel production-tracing drain (internal delivery); `external` is any customer-configured drain. Derived from the owning drain's delivery type when project tracing is computed; absent on configs persisted before this field existed." + } + }, + "required": [ + "rate" + ], + "type": "object" + }, + "type": "array" + } + }, + "type": "object" + }, + "avatar": { + "nullable": true, + "type": "string" + } + }, + "required": [ + "accountId", + "alias", + "defaultResourceConfig", + "deploymentExpiration", + "directoryListing", + "id", + "name", + "nodeVersion", + "resourceConfig" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid.\nOne of the provided values in the request query is invalid.\nTrusted IPs is only accessible for enterprise customers. This plan gate runs before the ACL check below on purpose: it depends only on the team's billing plan, so it can reject unsupported plans deterministically. `auth.can` resolves team membership (a DynamoDB lookup) and rejecting here first avoids depending on that external read for a request that is invalid regardless of authorization." + }, + "401": { + "description": "The request is not authorized." + }, + "402": { + "description": "The account is missing a payment so payment method must be updated\nPro customers are allowed to deploy Serverless Functions to up to `proMaxRegions` regions, or if the project was created before the limit was introduced.\nDeploying to Serverless Functions to multiple regions requires a plan update" + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "409": { + "description": "The provided name for the project is already being used\nThe project is currently being transferred." + }, + "410": { + "description": "" + }, + "428": { + "description": "Owner does not have protection add-on" + }, + "429": { + "description": "" + } + }, + "x-vercel-cli": { + "supportedSubcommands": true, + "supportedProduction": false, + "aliases": [ + "rename" + ], + "bodyArguments": [ + "name" + ] + }, + "parameters": [ + { + "name": "idOrName", + "description": "The unique project identifier or the project name", + "in": "path", + "required": true, + "schema": { + "example": "prj_12HKQaOmR5t5Uy6vdcQsNIiZgHGB", + "description": "The unique project identifier or the project name", + "type": "string" + }, + "x-vercel-cli": { + "kind": "argument" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "additionalProperties": false, + "properties": { + "autoExposeSystemEnvs": { + "type": "boolean" + }, + "autoAssignCustomDomains": { + "type": "boolean" + }, + "autoAssignCustomDomainsUpdatedBy": { + "type": "string" + }, + "buildCommand": { + "description": "The build command for this project. When `null` is used this value will be automatically detected", + "maxLength": 256, + "type": "string", + "nullable": true + }, + "commandForIgnoringBuildStep": { + "maxLength": 256, + "type": "string", + "nullable": true + }, + "customerSupportCodeVisibility": { + "description": "Specifies whether customer support can see git source for a deployment", + "type": "boolean" + }, + "devCommand": { + "description": "The dev command for this project. When `null` is used this value will be automatically detected", + "maxLength": 256, + "type": "string", + "nullable": true + }, + "directoryListing": { + "type": "boolean" + }, + "framework": { + "description": "The framework that is being used for this project. When `null` is used no framework is selected", + "enum": [ + null, + "container", + "blitzjs", + "nextjs", + "gatsby", + "remix", + "react-router", + "astro", + "hexo", + "eleventy", + "docusaurus-2", + "docusaurus", + "preact", + "solidstart-1", + "solidstart", + "dojo", + "ember", + "vue", + "scully", + "ionic-angular", + "angular", + "polymer", + "svelte", + "sveltekit", + "sveltekit-1", + "ionic-react", + "create-react-app", + "gridsome", + "umijs", + "sapper", + "saber", + "stencil", + "nuxtjs", + "redwoodjs", + "hugo", + "jekyll", + "brunch", + "middleman", + "zola", + "hydrogen", + "vite", + "tanstack-start", + "tanstack-start-lovable", + "vitepress", + "vuepress", + "parcel", + "fastapi", + "flask", + "fasthtml", + "django", + "ash", + "factory-eve", + "eve", + "sanity", + "sanity-v2", + "storybook", + "nitro", + "hono", + "express", + "h3", + "koa", + "nestjs", + "elysia", + "fastify", + "xmcp", + "python", + "ruby", + "rust", + "axum", + "actix-web", + "bun", + "node", + "go", + "services", + "mastra" + ], + "type": "string", + "nullable": true + }, + "gitForkProtection": { + "description": "Specifies whether PRs from Git forks should require a team member's authorization before it can be deployed", + "type": "boolean" + }, + "gitLFS": { + "description": "Specifies whether Git LFS is enabled for this project.", + "type": "boolean" + }, + "protectedSourcemaps": { + "description": "Specifies whether sourcemaps are protected and require authentication to access.", + "type": "boolean" + }, + "installCommand": { + "description": "The install command for this project. When `null` is used this value will be automatically detected", + "maxLength": 256, + "type": "string", + "nullable": true + }, + "name": { + "description": "The desired name for the project", + "example": "a-project-name", + "type": "string", + "maxLength": 100 + }, + "nodeVersion": { + "enum": [ + "24.x", + "22.x", + "20.x", + "18.x", + "16.x", + "14.x", + "12.x", + "10.x" + ], + "type": "string" + }, + "outputDirectory": { + "description": "The output directory of the project. When `null` is used this value will be automatically detected", + "maxLength": 256, + "type": "string", + "nullable": true + }, + "previewDeploymentsDisabled": { + "description": "Specifies whether preview deployments are disabled for this project.", + "type": "boolean", + "nullable": true + }, + "previewDeploymentSuffix": { + "description": "Custom domain suffix for preview deployments. Takes precedence over team-level suffix. Must be a domain owned by the team.", + "type": "string", + "maxLength": 253, + "nullable": true + }, + "resourceConfig": { + "properties": { + "buildMachineType": { + "enum": [ + null, + "basic", + "enhanced", + "turbo", + "standard", + "elastic" + ] + }, + "buildMachineSelection": { + "type": "string", + "enum": [ + "elastic", + "fixed" + ] + }, + "buildQueue": { + "type": "object", + "properties": { + "configuration": { + "type": "string", + "enum": [ + "SKIP_NAMESPACE_QUEUE", + "WAIT_FOR_NAMESPACE_QUEUE" + ] + } + } + }, + "fluid": { + "type": "boolean" + }, + "functionDefaultRegions": { + "description": "The regions to deploy Vercel Functions to for this project", + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "type": "string", + "maxLength": 4 + } + }, + "functionDefaultTimeout": { + "type": "number", + "maximum": 900, + "minimum": 1 + }, + "functionDefaultMemoryType": { + "enum": [ + "standard_legacy", + "standard", + "performance", + "performance_xl" + ] + }, + "functionZeroConfigFailover": { + "description": "Specifies whether Zero Config Failover is enabled for this project.", + "oneOf": [ + { + "type": "boolean" + } + ] + }, + "elasticConcurrencyEnabled": { + "type": "boolean" + }, + "buildMachineElasticLastUpdated": { + "type": "number" + }, + "buildMachineElasticReason": { + "enum": [ + "oom-failure", + "enospc-failure", + "build-timeout-failure", + "basic-floor", + "high-peak-memory", + "sustained-high-cpu", + "high-peak-disk", + "long-build-duration", + "short-build-duration", + "enterprise-floor" + ] + }, + "isNSNBDisabled": { + "type": "boolean" + }, + "enableFunctionsBeta": { + "type": "boolean" + } + }, + "type": "object", + "description": "Specifies resource override configuration for the project", + "additionalProperties": false + }, + "publicSource": { + "deprecated": true, + "description": "Deprecated. Accepted for backwards compatibility but ignored.", + "type": "boolean", + "nullable": true + }, + "rootDirectory": { + "description": "The name of a directory or relative path to the source code of your project. When `null` is used it will default to the project root", + "maxLength": 256, + "type": "string", + "nullable": true + }, + "serverlessFunctionRegion": { + "description": "The region to deploy Serverless Functions in this project", + "maxLength": 4, + "type": "string", + "nullable": true + }, + "serverlessFunctionZeroConfigFailover": { + "description": "Specifies whether Zero Config Failover is enabled for this project.", + "oneOf": [ + { + "type": "boolean" + } + ] + }, + "skewProtectionBoundaryAt": { + "description": "Deployments created before this absolute datetime have Skew Protection disabled. Value is in milliseconds since epoch to match \\\"createdAt\\\" fields.", + "minimum": 0, + "type": "integer" + }, + "skewProtectionMaxAge": { + "description": "Deployments created before this rolling window have Skew Protection disabled. Value is in seconds to match \\\"revalidate\\\" fields.", + "minimum": 0, + "type": "integer" + }, + "skewProtectionAllowedDomains": { + "description": "Cross-site domains allowed to fetch skew-protected assets (hostnames, optionally with leading wildcard like *.example.com).", + "type": "array", + "items": { + "type": "string", + "maxLength": 254 + }, + "maxItems": 12 + }, + "skipGitConnectDuringLink": { + "description": "Opts-out of the message prompting a CLI user to connect a Git repository in `vercel link`.", + "type": "boolean", + "deprecated": true + }, + "sourceFilesOutsideRootDirectory": { + "description": "Indicates if there are source files outside of the root directory", + "type": "boolean" + }, + "enablePreviewFeedback": { + "description": "Opt-in to preview toolbar on the project level", + "type": "boolean", + "nullable": true + }, + "enableProductionFeedback": { + "description": "Opt-in to production toolbar on the project level", + "type": "boolean", + "nullable": true + }, + "enableAffectedProjectsDeployments": { + "description": "Opt-in to skip deployments when there are no changes to the root directory and its dependencies", + "type": "boolean" + }, + "enableExternalRewriteCaching": { + "description": "Specifies whether external rewrite caching is enabled for this project.", + "type": "boolean" + }, + "staticIps": { + "additionalProperties": false, + "description": "Manage Static IPs for this project", + "properties": { + "enabled": { + "description": "Opt-in to Static IPs for this project", + "type": "boolean" + } + }, + "required": [ + "enabled" + ], + "type": "object" + }, + "tracing": { + "description": "Tracing configuration for this project", + "type": "object", + "additionalProperties": false, + "properties": { + "domains": { + "description": "Comma-separated list of drain endpoint domains", + "type": "string" + }, + "ignorePaths": { + "description": "Paths to ignore for tracing", + "type": "array", + "items": { + "type": "string" + } + }, + "samplingRules": { + "description": "Sampling rules for trace collection", + "type": "array", + "maxItems": 10, + "items": { + "type": "object", + "additionalProperties": false, + "required": [ + "rate" + ], + "properties": { + "rate": { + "type": "number", + "minimum": 0, + "maximum": 1, + "description": "Sampling rate from 0 to 1" + }, + "env": { + "type": "string", + "enum": [ + "production", + "preview" + ], + "description": "Environment to apply sampling to" + }, + "requestPath": { + "type": "string", + "description": "Request path prefix to apply the sampling rule to" + }, + "destination": { + "type": "string", + "enum": [ + "internal", + "external" + ], + "description": "Tracing destination this rule applies to. Derived server-side when project tracing is computed; accepted here so a computed config can round-trip through this endpoint." + } + } + } + } + }, + "nullable": true + }, + "oidcTokenConfig": { + "description": "OpenID Connect JSON Web Token generation configuration.", + "type": "object", + "additionalProperties": false, + "properties": { + "enabled": { + "description": "Whether or not to generate OpenID Connect JSON Web Tokens.", + "deprecated": true, + "type": "boolean", + "default": true + }, + "issuerMode": { + "description": "team: `https://oidc.vercel.com/[team_slug]` global: `https://oidc.vercel.com`", + "type": "string", + "enum": [ + "team", + "global" + ], + "default": "team" + } + } + }, + "passwordProtection": { + "additionalProperties": false, + "description": "Allows to protect project deployments with a password", + "properties": { + "deploymentType": { + "description": "Specify if the password will apply to every Deployment Target or just Preview", + "enum": [ + "all", + "preview", + "prod_deployment_urls_and_all_previews", + "all_except_custom_domains" + ], + "type": "string" + }, + "password": { + "description": "The password that will be used to protect Project Deployments", + "maxLength": 72, + "type": "string", + "nullable": true + } + }, + "required": [ + "deploymentType" + ], + "type": "object", + "nullable": true + }, + "passport": { + "description": "Passport configuration for the project.", + "type": "object", + "additionalProperties": false, + "properties": { + "connectorId": { + "type": "string" + }, + "deploymentType": { + "type": "string", + "default": "all", + "enum": [ + "all", + "preview", + "prod_deployment_urls_and_all_previews", + "all_except_custom_domains" + ] + } + }, + "required": [ + "connectorId" + ], + "nullable": true + }, + "sandbox": { + "type": "object", + "description": "Specifies the default region and failover regions for sandboxes created in the project", + "properties": { + "region": { + "description": "The Vercel region sandboxes in this project are created in by default.", + "enum": [ + "iad1", + "sfo1", + "cle1", + "cdg1", + "fra1", + "arn1", + "sin1", + "pdx1", + "lhr1", + "icn1", + "bom1", + "cpt1", + "dub1", + "gru1", + "hkg1", + "syd1", + "yul1", + "hnd1", + "kix1" + ], + "example": "iad1" + }, + "failoverRegions": { + "description": "The regions sandboxes in this project fall back to when they cannot be created in `region`.", + "type": "array", + "uniqueItems": true, + "maxItems": 19, + "items": { + "enum": [ + "iad1", + "sfo1", + "cle1", + "cdg1", + "fra1", + "arn1", + "sin1", + "pdx1", + "lhr1", + "icn1", + "bom1", + "cpt1", + "dub1", + "gru1", + "hkg1", + "syd1", + "yul1", + "hnd1", + "kix1" + ] + }, + "example": [ + "sfo1", + "cle1" + ] + } + }, + "additionalProperties": false + }, + "ssoProtection": { + "additionalProperties": false, + "description": "Ensures visitors to your Preview Deployments are logged into Vercel and have a minimum of Viewer access on your team", + "properties": { + "deploymentType": { + "default": "preview", + "description": "Specify if the Vercel Authentication (SSO Protection) will apply to every Deployment Target or just Preview", + "enum": [ + "all", + "preview", + "prod_deployment_urls_and_all_previews", + "all_except_custom_domains" + ], + "type": "string" + } + }, + "required": [ + "deploymentType" + ], + "type": "object", + "nullable": true + }, + "trustedIps": { + "additionalProperties": false, + "description": "Restricts access to deployments based on the incoming request IP address", + "properties": { + "deploymentType": { + "description": "Specify if the Trusted IPs will apply to every Deployment Target or just Preview", + "enum": [ + "all", + "preview", + "production", + "prod_deployment_urls_and_all_previews", + "all_except_custom_domains" + ], + "type": "string" + }, + "addresses": { + "type": "array", + "items": { + "type": "object", + "properties": { + "value": { + "type": "string", + "description": "The IP addresses that are allowlisted. Supports IPv4 addresses and CIDR notations. IPv6 is not supported" + }, + "note": { + "type": "string", + "description": "An optional note explaining what the IP address or subnet is used for", + "maxLength": 20 + } + }, + "required": [ + "value" + ], + "additionalProperties": false + }, + "minItems": 1 + }, + "protectionMode": { + "description": "exclusive: ip match is enough to bypass deployment protection (regardless of other settings). additional: ip must match + any other protection should be also provided (password, vercel auth, shareable link, automation bypass header, automation bypass query param)", + "enum": [ + "exclusive", + "additional" + ], + "type": "string" + } + }, + "required": [ + "deploymentType", + "addresses", + "protectionMode" + ], + "type": "object", + "nullable": true + }, + "trustedSources": { + "type": "object", + "additionalProperties": false, + "description": "Deployment Protection Trusted Sources", + "properties": { + "enableVercelCiSameRepository": { + "type": "boolean", + "description": "Allow same-team Vercel CI access to preview deployments built from the same repository as the CI run. The deployment source repository, not the current project repository link, is authoritative. Defaults to enabled when not stored. Omitting this field preserves its stored value, including when trustedSources is cleared. Set true explicitly to re-enable." + }, + "projects": { + "type": "object", + "maxProperties": 100, + "additionalProperties": { + "type": "object", + "additionalProperties": false, + "properties": { + "label": { + "type": "string", + "maxLength": 100, + "description": "The label or description of the trusted source" + }, + "customAllow": { + "type": "array", + "minItems": 1, + "maxItems": 20, + "items": { + "type": "object", + "additionalProperties": false, + "required": [ + "from", + "to" + ], + "properties": { + "to": { + "type": "object", + "additionalProperties": false, + "description": "A set of environments, expressed as explicit slugs, a named preset, or both. At least one of `slugs` or `preset` must be set.", + "anyOf": [ + { + "required": [ + "slugs" + ] + }, + { + "required": [ + "preset" + ] + } + ], + "properties": { + "slugs": { + "type": "array", + "minItems": 1, + "maxItems": 10, + "uniqueItems": true, + "items": { + "type": "string", + "maxLength": 64, + "description": "A system environment (\\\"production\\\", \\\"preview\\\", or \\\"development\\\") or a custom environment slug" + } + }, + "preset": { + "type": "string", + "enum": [ + "all-custom" + ] + } + } + }, + "from": { + "type": "object", + "additionalProperties": false, + "description": "A set of environments, expressed as explicit slugs, a named preset, or both. At least one of `slugs` or `preset` must be set.", + "anyOf": [ + { + "required": [ + "slugs" + ] + }, + { + "required": [ + "preset" + ] + } + ], + "properties": { + "slugs": { + "type": "array", + "minItems": 1, + "maxItems": 10, + "uniqueItems": true, + "items": { + "type": "string", + "maxLength": 64, + "description": "A system environment (\\\"production\\\", \\\"preview\\\", or \\\"development\\\") or a custom environment slug" + } + }, + "preset": { + "type": "string", + "enum": [ + "all-custom" + ] + } + } + } + } + }, + "description": "Optional overrides for the default same-env-by-slug matching." + } + } + } + }, + "oidcProviders": { + "type": "object", + "maxProperties": 50, + "additionalProperties": { + "type": "array", + "minItems": 1, + "maxItems": 10, + "items": { + "type": "object", + "additionalProperties": false, + "required": [ + "claims", + "to" + ], + "properties": { + "label": { + "type": "string", + "maxLength": 100, + "description": "The label or description of the trusted source" + }, + "to": { + "type": "object", + "additionalProperties": false, + "description": "A set of environments, expressed as explicit slugs, a named preset, or both. At least one of `slugs` or `preset` must be set.", + "anyOf": [ + { + "required": [ + "slugs" + ] + }, + { + "required": [ + "preset" + ] + } + ], + "properties": { + "slugs": { + "type": "array", + "minItems": 1, + "maxItems": 10, + "uniqueItems": true, + "items": { + "type": "string", + "maxLength": 64, + "description": "A system environment (\\\"production\\\", \\\"preview\\\", or \\\"development\\\") or a custom environment slug" + } + }, + "preset": { + "type": "string", + "enum": [ + "all-custom" + ] + } + } + }, + "claims": { + "type": "object", + "minProperties": 1, + "maxProperties": 20, + "additionalProperties": { + "type": "array", + "minItems": 1, + "maxItems": 20, + "items": { + "type": "string", + "maxLength": 256 + } + } + } + } + } + } + } + }, + "nullable": true + }, + "deploymentPolicy": { + "anyOf": [ + { + "type": "object", + "description": "Composable deployment-time policy. Each rule type holds a list of rules, one per environment scope.", + "additionalProperties": false, + "properties": { + "gitSources": { + "anyOf": [ + { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "required": [ + "enabled", + "environments", + "sources" + ], + "properties": { + "enabled": { + "type": "boolean" + }, + "environments": { + "type": "array", + "items": { + "anyOf": [ + { + "type": "object", + "additionalProperties": false, + "required": [ + "type", + "target" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "system" + ] + }, + "target": { + "type": "string", + "enum": [ + "production", + "preview" + ] + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "type", + "environmentId" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "custom" + ] + }, + "environmentId": { + "type": "string" + } + } + } + ] + } + }, + "sources": { + "type": "array", + "items": { + "anyOf": [ + { + "type": "object", + "additionalProperties": false, + "required": [ + "provider", + "org" + ], + "properties": { + "provider": { + "type": "string", + "enum": [ + "github", + "bitbucket" + ] + }, + "org": { + "type": "string" + }, + "repo": { + "type": "string" + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "provider", + "namespace" + ], + "properties": { + "provider": { + "type": "string", + "enum": [ + "gitlab" + ] + }, + "namespace": { + "type": "string" + }, + "project": { + "type": "string" + } + } + } + ] + } + } + } + } + }, + { + "type": "string" + } + ] + }, + "deploymentSources": { + "anyOf": [ + { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "required": [ + "enabled", + "environments", + "sources" + ], + "properties": { + "enabled": { + "type": "boolean" + }, + "environments": { + "type": "array", + "items": { + "anyOf": [ + { + "type": "object", + "additionalProperties": false, + "required": [ + "type", + "target" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "system" + ] + }, + "target": { + "type": "string", + "enum": [ + "production", + "preview" + ] + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "type", + "environmentId" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "custom" + ] + }, + "environmentId": { + "type": "string" + } + } + } + ] + } + }, + "sources": { + "type": "array", + "items": { + "type": "string", + "enum": [ + "git", + "cli", + "rest-api", + "deploy-hook", + "integration", + "v0" + ] + } + } + } + } + }, + { + "type": "string" + } + ] + } + } + }, + { + "type": "string" + } + ] + }, + "optionsAllowlist": { + "additionalProperties": false, + "description": "Specify a list of paths that should not be protected by Deployment Protection to enable Cors preflight requests", + "properties": { + "paths": { + "type": "array", + "items": { + "type": "object", + "properties": { + "value": { + "type": "string", + "description": "The regex path that should not be protected by Deployment Protection", + "pattern": "^/.*" + } + }, + "required": [ + "value" + ], + "additionalProperties": false + }, + "minItems": 1, + "maxItems": 5 + } + }, + "required": [ + "paths" + ], + "type": "object", + "nullable": true + }, + "connectConfigurations": { + "type": "array", + "description": "The list of connections from project environment to Secure Compute network", + "items": { + "additionalProperties": false, + "properties": { + "envId": { + "type": "string", + "description": "The ID of the environment" + }, + "connectConfigurationId": { + "type": "string", + "description": "The ID of the Secure Compute network" + }, + "passive": { + "type": "boolean", + "description": "Whether the configuration should be passive, meaning builds will not run there and only passive Serverless Functions will be deployed" + }, + "buildsEnabled": { + "type": "boolean", + "description": "Flag saying if project builds should use Secure Compute" + } + }, + "required": [ + "envId", + "connectConfigurationId", + "passive", + "buildsEnabled" + ], + "oneOf": [ + { + "type": "object" + } + ] + }, + "minItems": 1, + "nullable": true + }, + "dismissedToasts": { + "description": "An array of objects representing a Dismissed Toast in regards to a Project. Objects are either merged with existing toasts (on key match), or added to the `dimissedToasts` array.`", + "type": "array", + "minItems": 0, + "maxItems": 50, + "items": { + "type": "object", + "additionalProperties": false, + "required": [ + "key", + "dismissedAt", + "action", + "value" + ], + "properties": { + "key": { + "type": "string", + "description": "unique identifier for the dismissed toast" + }, + "dismissedAt": { + "type": "number", + "description": "unix timestamp representing the time the toast was dimissed" + }, + "action": { + "enum": [ + "cancel", + "accept", + "delete" + ], + "description": "Whether the toast was dismissed, the action was accepted, or the dismissal with this key should be removed" + }, + "value": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "string" + }, + { + "type": "boolean" + }, + { + "type": "number" + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "previousValue", + "currentValue" + ], + "properties": { + "previousValue": { + "oneOf": [ + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "string" + } + ] + }, + "currentValue": { + "oneOf": [ + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "string" + } + ] + } + } + } + ] + } + } + } + } + }, + "type": "object" + } + } + }, + "required": true + }, + "x-speakeasy-usage-example": { + "title": "Update an existing project", + "description": "Update the fields of a project using either its name or id.", + "position": 2 + } + }, + "delete": { + "description": "Delete a specific project by passing either the project `id` or `name` in the URL.", + "operationId": "deleteProject", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Delete a Project", + "tags": [ + "projects" + ], + "responses": { + "204": { + "description": "The project was successfuly removed" + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "409": { + "description": "" + }, + "410": { + "description": "" + } + }, + "x-vercel-cli": { + "supportedSubcommands": true, + "supportedProduction": false + }, + "parameters": [ + { + "name": "idOrName", + "description": "The unique project identifier or the project name", + "in": "path", + "required": true, + "schema": { + "example": "prj_12HKQaOmR5t5Uy6vdcQsNIiZgHGB", + "description": "The unique project identifier or the project name", + "type": "string" + }, + "x-vercel-cli": { + "kind": "argument" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + } + }, + "/v1/projects/{idOrName}/avatar": { + "post": { + "description": "Upload an image as the avatar of the project identified by `idOrName`. The request body is the raw bytes of a JPG, PNG, or SVG image; the `Content-Type` header must declare which. SVG payloads are sanitized and optimized server-side before storage. The final SHA-1 of the stored bytes becomes the project's `avatar` value. The actual upload pipeline (validation, sanitization, S3 write, conditional `updateProject`, and event emission) lives in the shared `@api/project-avatar-upload` helper so it can be reused by background workers.", + "operationId": "uploadProjectAvatar", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Upload a project avatar", + "tags": [ + "projects" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "accountId": { + "type": "string" + }, + "creator": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "user" + ] + }, + "via": { + "nullable": true, + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "app" + ] + }, + "app": { + "properties": { + "id": { + "type": "string", + "description": "The internal ID of the Vercel App backing this principal." + }, + "clientId": { + "type": "string", + "description": "The protocol-facing OAuth client ID. This may differ from {@link id} when Client ID Metadata Documents (CIMD) are used." + } + }, + "required": [ + "id" + ], + "type": "object" + } + }, + "required": [ + "app", + "type" + ], + "type": "object", + "description": "Set when a Vercel App or Integration acts on behalf of a {@link User}. Captures user-consented OAuth delegation that the ACL layer may inspect to evaluate scope restrictions. This is NOT for impersonation or token-exchange provenance — those live on `auth.token`, not on the principal." + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "integration" + ] + }, + "integration": { + "properties": { + "integrationId": { + "type": "string" + }, + "configurationId": { + "type": "string" + } + }, + "required": [ + "configurationId", + "integrationId" + ], + "type": "object" + } + }, + "required": [ + "integration", + "type" + ], + "type": "object", + "description": "Set when a Vercel App or Integration acts on behalf of a {@link User}. Captures user-consented OAuth delegation that the ACL layer may inspect to evaluate scope restrictions. This is NOT for impersonation or token-exchange provenance — those live on `auth.token`, not on the principal." + } + ] + }, + "user": { + "properties": { + "id": { + "type": "string" + } + }, + "required": [ + "id" + ], + "type": "object" + } + }, + "required": [ + "type", + "user", + "via" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "app" + ] + }, + "app": { + "properties": { + "id": { + "type": "string", + "description": "The internal ID of the Vercel App backing this principal." + }, + "clientId": { + "type": "string", + "description": "The protocol-facing OAuth client ID. This may differ from {@link id} when Client ID Metadata Documents (CIMD) are used." + } + }, + "required": [ + "id" + ], + "type": "object" + } + }, + "required": [ + "app", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "integration" + ] + }, + "integration": { + "properties": { + "integrationId": { + "type": "string" + }, + "configurationId": { + "type": "string" + } + }, + "required": [ + "configurationId", + "integrationId" + ], + "type": "object" + } + }, + "required": [ + "integration", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "system" + ] + } + }, + "required": [ + "type" + ], + "type": "object" + } + ] + }, + "alias": { + "items": { + "properties": { + "configuredBy": { + "nullable": true, + "type": "string", + "enum": [ + "A", + "CNAME", + "dns-01", + "http", + null + ] + }, + "configuredChangedAt": { + "nullable": true, + "type": "number" + }, + "createdAt": { + "nullable": true, + "type": "number" + }, + "deployment": { + "nullable": true, + "properties": { + "id": { + "type": "string" + }, + "alias": { + "items": { + "type": "string" + }, + "type": "array" + }, + "aliasAssigned": { + "nullable": true, + "oneOf": [ + { + "type": "number" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + } + ] + }, + "aliasError": { + "nullable": true, + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" + }, + "aliasFinal": { + "nullable": true, + "type": "string" + }, + "automaticAliases": { + "items": { + "type": "string" + }, + "type": "array" + }, + "branchMatcher": { + "properties": { + "type": { + "type": "string", + "enum": [ + "endsWith", + "equals", + "startsWith" + ], + "description": "The type of matching to perform" + }, + "pattern": { + "type": "string", + "description": "The pattern to match against branch names" + } + }, + "required": [ + "pattern", + "type" + ], + "type": "object" + }, + "buildingAt": { + "type": "number" + }, + "builds": { + "items": { + "properties": { + "use": { + "type": "string" + }, + "src": { + "type": "string" + }, + "dest": { + "type": "string" + } + }, + "required": [ + "use" + ], + "type": "object" + }, + "type": "array" + }, + "checksConclusion": { + "type": "string", + "enum": [ + "canceled", + "failed", + "skipped", + "succeeded" + ] + }, + "checksState": { + "type": "string", + "enum": [ + "completed", + "registered", + "running" + ] + }, + "connectBuildsEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "connectConfigurationId": { + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "createdIn": { + "type": "string" + }, + "creator": { + "nullable": true, + "properties": { + "email": { + "type": "string" + }, + "githubLogin": { + "type": "string" + }, + "gitlabLogin": { + "type": "string" + }, + "uid": { + "type": "string" + }, + "username": { + "type": "string" + } + }, + "required": [ + "email", + "uid", + "username" + ], + "type": "object" + }, + "deletedAt": { + "type": "number" + }, + "deploymentHostname": { + "type": "string" + }, + "forced": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "name": { + "type": "string" + }, + "meta": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "monorepoManager": { + "nullable": true, + "type": "string" + }, + "oidcTokenClaims": { + "properties": { + "iss": { + "type": "string" + }, + "sub": { + "type": "string" + }, + "scope": { + "type": "string" + }, + "aud": { + "type": "string" + }, + "owner": { + "type": "string" + }, + "owner_id": { + "type": "string" + }, + "project": { + "type": "string" + }, + "project_id": { + "type": "string" + }, + "environment": { + "type": "string" + }, + "custom_environment_id": { + "type": "string" + }, + "mfe_group_ids": { + "items": { + "type": "string" + }, + "type": "array" + }, + "plan": { + "type": "string" + } + }, + "required": [ + "aud", + "environment", + "iss", + "owner", + "owner_id", + "project", + "project_id", + "scope", + "sub" + ], + "type": "object" + }, + "plan": { + "type": "string", + "enum": [ + "enterprise", + "hobby", + "pro" + ] + }, + "previewCommentsEnabled": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether or not preview comments are enabled for the deployment", + "example": false + }, + "private": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "readyAt": { + "type": "number" + }, + "readyState": { + "type": "string", + "enum": [ + "BLOCKED", + "BUILDING", + "CANCELED", + "ERROR", + "INITIALIZING", + "QUEUED", + "READY" + ] + }, + "readySubstate": { + "type": "string", + "enum": [ + "PROMOTED", + "ROLLING", + "STAGED" + ] + }, + "requestedAt": { + "type": "number" + }, + "target": { + "nullable": true, + "type": "string" + }, + "teamId": { + "nullable": true, + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "LAMBDAS" + ] + }, + "url": { + "type": "string" + }, + "userId": { + "type": "string", + "description": "Present for user creators; omitted for app/integration/system creators." + }, + "withCache": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "createdAt", + "createdIn", + "creator", + "deploymentHostname", + "id", + "name", + "plan", + "private", + "readyState", + "type", + "url" + ], + "type": "object" + }, + "domain": { + "type": "string" + }, + "environment": { + "type": "string", + "enum": [ + "preview", + "production" + ] + }, + "gitBranch": { + "nullable": true, + "type": "string" + }, + "redirect": { + "nullable": true, + "type": "string" + }, + "redirectStatusCode": { + "nullable": true, + "type": "number", + "enum": [ + 301, + 302, + 307, + 308, + null + ] + }, + "target": { + "type": "string", + "enum": [ + "PREVIEW", + "PRODUCTION", + "STAGING" + ] + } + }, + "required": [ + "deployment", + "domain", + "environment", + "target" + ], + "type": "object" + }, + "type": "array" + }, + "analytics": { + "properties": { + "id": { + "type": "string" + }, + "canceledAt": { + "nullable": true, + "type": "number" + }, + "disabledAt": { + "type": "number" + }, + "enabledAt": { + "type": "number" + }, + "paidAt": { + "type": "number" + }, + "sampleRatePercent": { + "nullable": true, + "type": "number" + }, + "spendLimitInDollars": { + "nullable": true, + "type": "number" + } + }, + "required": [ + "disabledAt", + "enabledAt", + "id" + ], + "type": "object" + }, + "appliedCve55182Migration": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "speedInsights": { + "properties": { + "id": { + "type": "string" + }, + "enabledAt": { + "type": "number" + }, + "disabledAt": { + "type": "number" + }, + "canceledAt": { + "type": "number" + }, + "hasData": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "dataReceivedAt": { + "type": "number", + "description": "When the first free (not Speed Insights Plus) production data point was observed, in ms. Set once by subscriber-analytics-events; projects that already had data before this field shipped get it backfilled on their next batch, so it reads \"first free data point observed\", not necessarily \"first ever\"." + }, + "paidAt": { + "type": "number" + } + }, + "required": [ + "id" + ], + "type": "object" + }, + "autoExposeSystemEnvs": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "autoAssignCustomDomains": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "autoAssignCustomDomainsUpdatedBy": { + "type": "string" + }, + "buildCommand": { + "nullable": true, + "type": "string" + }, + "commandForIgnoringBuildStep": { + "nullable": true, + "type": "string" + }, + "connectConfigurations": { + "nullable": true, + "items": { + "properties": { + "envId": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "string", + "enum": [ + "preview", + "production" + ] + } + ] + }, + "connectConfigurationId": { + "type": "string" + }, + "dc": { + "type": "string" + }, + "passive": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "buildsEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "aws": { + "properties": { + "subnetIds": { + "items": { + "type": "string" + }, + "type": "array" + }, + "securityGroupId": { + "type": "string" + } + }, + "required": [ + "subnetIds" + ], + "type": "object" + }, + "createdAt": { + "type": "number" + }, + "updatedAt": { + "type": "number" + } + }, + "required": [ + "buildsEnabled", + "connectConfigurationId", + "createdAt", + "envId", + "passive", + "updatedAt" + ], + "type": "object" + }, + "type": "array" + }, + "connectConfigurationId": { + "nullable": true, + "type": "string" + }, + "connectBuildsEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "passiveConnectConfigurationId": { + "nullable": true, + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "customerSupportCodeVisibility": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "crons": { + "properties": { + "enabledAt": { + "type": "number", + "description": "The time the feature was enabled for this project. Note: It enables automatically with the first Deployment that outputs cronjobs." + }, + "disabledAt": { + "nullable": true, + "type": "number", + "description": "The time the feature was disabled for this project." + }, + "updatedAt": { + "type": "number" + }, + "deploymentId": { + "nullable": true, + "type": "string", + "description": "The ID of the Deployment from which the definitions originated." + }, + "definitions": { + "items": { + "properties": { + "host": { + "type": "string", + "description": "The hostname that should be used.", + "example": "vercel.com" + }, + "path": { + "type": "string", + "description": "The path that should be called for the cronjob.", + "example": "/api/crons/sync-something?hello=world" + }, + "schedule": { + "type": "string", + "description": "The cron expression.", + "example": "0 0 * * *" + }, + "source": { + "type": "string", + "enum": [ + "api" + ], + "description": "The origin of this definition. 'api' means created via the API. Undefined means it originated from a deployment (vercel.json)." + }, + "description": { + "type": "string", + "description": "A human-readable description of what this cron job does." + }, + "hostInferred": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether the host was inferred from the production deployment URL rather than explicitly provided." + } + }, + "required": [ + "host", + "path", + "schedule" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "definitions", + "deploymentId", + "disabledAt", + "enabledAt", + "updatedAt" + ], + "type": "object" + }, + "dataCache": { + "properties": { + "userDisabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "storageSizeBytes": { + "nullable": true, + "type": "number" + }, + "unlimited": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "userDisabled" + ], + "type": "object" + }, + "deploymentExpiration": { + "properties": { + "expirationDays": { + "type": "number", + "description": "Number of days to keep non-production deployments (mostly preview deployments) before soft deletion." + }, + "expirationDaysProduction": { + "type": "number", + "description": "Number of days to keep production deployments before soft deletion." + }, + "expirationDaysCanceled": { + "type": "number", + "description": "Number of days to keep canceled deployments before soft deletion." + }, + "expirationDaysErrored": { + "type": "number", + "description": "Number of days to keep errored deployments before soft deletion." + }, + "deploymentsToKeep": { + "type": "number", + "description": "Minimum number of production deployments to keep for this project, even if they are over the production expiration limit." + } + }, + "type": "object", + "description": "Retention policies for deployments. These are enforced at the project level, but we also maintain an instance of this at the team level as a default policy that gets applied to new projects." + }, + "expiration": { + "oneOf": [ + { + "properties": { + "expiresAt": { + "type": "number", + "description": "Unix ms timestamp when the project is scheduled to expire." + } + }, + "required": [ + "expiresAt" + ], + "type": "object" + }, + { + "properties": { + "lockedAt": { + "type": "number", + "description": "Unix ms timestamp when the project was locked." + }, + "lockedBy": { + "type": "string", + "description": "userId of the actor that triggered the lock (system or admin)." + } + }, + "required": [ + "lockedAt", + "lockedBy" + ], + "type": "object" + } + ] + }, + "devCommand": { + "nullable": true, + "type": "string" + }, + "directoryListing": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "installCommand": { + "nullable": true, + "type": "string" + }, + "env": { + "items": { + "properties": { + "target": { + "oneOf": [ + { + "items": { + "type": "string", + "enum": [ + "development", + "development", + "preview", + "preview", + "production" + ] + }, + "type": "array" + }, + { + "type": "string", + "enum": [ + "development", + "development", + "preview", + "preview", + "production" + ] + } + ] + }, + "type": { + "type": "string", + "enum": [ + "encrypted", + "plain", + "secret", + "sensitive", + "system" + ] + }, + "sunsetSecretId": { + "type": "string", + "description": "This is used to identify variables that have been migrated from type secret to sensitive." + }, + "legacyValue": { + "type": "string", + "description": "Legacy now-encryption ciphertext, present after migration swaps value/vsmValue" + }, + "decrypted": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "value": { + "type": "string" + }, + "vsmValue": { + "type": "string" + }, + "id": { + "type": "string" + }, + "key": { + "type": "string" + }, + "configurationId": { + "nullable": true, + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "updatedAt": { + "type": "number" + }, + "createdBy": { + "nullable": true, + "type": "string" + }, + "updatedBy": { + "nullable": true, + "type": "string" + }, + "gitBranch": { + "type": "string" + }, + "visibility": { + "type": "string", + "enum": [ + "config", + "secret" + ], + "description": "User-facing config/secret model. When set, authoritative for new code paths when the env-var-config-secret-ui flag is enabled. Legacy rows omit this field; legacy rows omit it and callers fall back to existing `type` behavior." + }, + "edgeConfigId": { + "nullable": true, + "type": "string" + }, + "edgeConfigTokenId": { + "nullable": true, + "type": "string" + }, + "contentHint": { + "nullable": true, + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "redis-url" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "redis-rest-api-url" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "redis-rest-api-token" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "redis-rest-api-read-only-token" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "blob-read-write-token" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "blob-store-id" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "blob-webhook-public-key" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-url" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-url-non-pooling" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-prisma-url" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-user" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-host" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-password" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-database" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-url-no-ssl" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "integration-store-secret" + ] + }, + "storeId": { + "type": "string" + }, + "integrationId": { + "type": "string" + }, + "integrationProductId": { + "type": "string" + }, + "integrationConfigurationId": { + "type": "string" + } + }, + "required": [ + "integrationConfigurationId", + "integrationId", + "integrationProductId", + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "flags-connection-string" + ] + }, + "projectId": { + "type": "string" + } + }, + "required": [ + "projectId", + "type" + ], + "type": "object" + } + ] + }, + "internalContentHint": { + "nullable": true, + "properties": { + "type": { + "type": "string", + "enum": [ + "flags-secret" + ] + }, + "encryptedValue": { + "type": "string", + "description": "Contains the `value` of the env variable, encrypted with a special key to make decryption possible in the subscriber Lambda." + } + }, + "required": [ + "encryptedValue", + "type" + ], + "type": "object", + "description": "Similar to `contentHints`, but should not be exposed to the user." + }, + "comment": { + "type": "string" + }, + "customEnvironmentIds": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "key", + "type", + "value" + ], + "type": "object" + }, + "type": "array" + }, + "customEnvironments": { + "items": { + "properties": { + "id": { + "type": "string", + "description": "Unique identifier for the custom environment (format: env_*)" + }, + "slug": { + "type": "string", + "description": "URL-friendly name of the environment" + }, + "type": { + "type": "string", + "enum": [ + "development", + "preview", + "production" + ], + "description": "The type of environment (production, preview, or development)" + }, + "description": { + "type": "string", + "description": "Optional description of the environment's purpose" + }, + "branchMatcher": { + "properties": { + "type": { + "type": "string", + "enum": [ + "endsWith", + "equals", + "startsWith" + ], + "description": "The type of matching to perform" + }, + "pattern": { + "type": "string", + "description": "The pattern to match against branch names" + } + }, + "required": [ + "pattern", + "type" + ], + "type": "object", + "description": "Configuration for matching git branches to this environment" + }, + "domains": { + "items": { + "properties": { + "name": { + "type": "string" + }, + "apexName": { + "type": "string" + }, + "projectId": { + "type": "string" + }, + "redirect": { + "nullable": true, + "type": "string" + }, + "redirectStatusCode": { + "nullable": true, + "type": "number", + "enum": [ + 301, + 302, + 307, + 308, + null + ] + }, + "gitBranch": { + "nullable": true, + "type": "string" + }, + "customEnvironmentId": { + "nullable": true, + "type": "string" + }, + "updatedAt": { + "type": "number" + }, + "createdAt": { + "type": "number" + }, + "verified": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "`true` if the domain is verified for use with the project. If `false` it will not be used as an alias on this project until the challenge in `verification` is completed." + }, + "verification": { + "items": { + "properties": { + "type": { + "type": "string" + }, + "domain": { + "type": "string" + }, + "value": { + "type": "string" + }, + "reason": { + "type": "string" + } + }, + "required": [ + "domain", + "reason", + "type", + "value" + ], + "type": "object", + "description": "A list of verification challenges, one of which must be completed to verify the domain for use on the project. After the challenge is complete `POST /projects/:idOrName/domains/:domain/verify` to verify the domain. Possible challenges: - If `verification.type = TXT` the `verification.domain` will be checked for a TXT record matching `verification.value`." + }, + "type": "array", + "description": "A list of verification challenges, one of which must be completed to verify the domain for use on the project. After the challenge is complete `POST /projects/:idOrName/domains/:domain/verify` to verify the domain. Possible challenges: - If `verification.type = TXT` the `verification.domain` will be checked for a TXT record matching `verification.value`." + } + }, + "required": [ + "apexName", + "name", + "projectId", + "verified" + ], + "type": "object", + "description": "List of domains associated with this environment" + }, + "type": "array", + "description": "List of domains associated with this environment" + }, + "currentDeploymentAliases": { + "items": { + "type": "string" + }, + "type": "array", + "description": "List of aliases for the current deployment" + }, + "createdAt": { + "type": "number", + "description": "Timestamp when the environment was created" + }, + "updatedAt": { + "type": "number", + "description": "Timestamp when the environment was last updated" + } + }, + "required": [ + "createdAt", + "id", + "slug", + "type", + "updatedAt" + ], + "type": "object", + "description": "Internal representation of a custom environment with all required properties" + }, + "type": "array" + }, + "framework": { + "nullable": true, + "type": "string", + "enum": [ + "actix-web", + "angular", + "ash", + "astro", + "axum", + "blitzjs", + "brunch", + "bun", + "container", + "create-react-app", + "django", + "docusaurus", + "docusaurus-2", + "dojo", + "eleventy", + "elysia", + "ember", + "eve", + "express", + "factory-eve", + "fastapi", + "fasthtml", + "fastify", + "flask", + "gatsby", + "go", + "gridsome", + "h3", + "hexo", + "hono", + "hugo", + "hydrogen", + "ionic-angular", + "ionic-react", + "jekyll", + "koa", + "mastra", + "middleman", + "nestjs", + "nextjs", + "nitro", + "node", + "nuxtjs", + "parcel", + "polymer", + "preact", + "python", + "react-router", + "redwoodjs", + "remix", + "ruby", + "rust", + "saber", + "sanity", + "sanity-v2", + "sapper", + "scully", + "services", + "solidstart", + "solidstart-1", + "stencil", + "storybook", + "svelte", + "sveltekit", + "sveltekit-1", + "tanstack-start", + "tanstack-start-lovable", + "umijs", + "vite", + "vitepress", + "vue", + "vuepress", + "xmcp", + "zola", + null + ] + }, + "services": { + "items": { + "properties": { + "serviceName": { + "type": "string", + "description": "Service name from the deployment (Service.name)." + }, + "serviceType": { + "type": "string", + "enum": [ + "cron", + "job", + "web", + "worker" + ], + "description": "Service kind (Service.type). Omitted for schemas that do not define one." + }, + "framework": { + "type": "string", + "enum": [ + "actix-web", + "angular", + "ash", + "astro", + "axum", + "blitzjs", + "brunch", + "bun", + "container", + "create-react-app", + "django", + "docusaurus", + "docusaurus-2", + "dojo", + "eleventy", + "elysia", + "ember", + "eve", + "express", + "factory-eve", + "fastapi", + "fasthtml", + "fastify", + "flask", + "gatsby", + "go", + "gridsome", + "h3", + "hexo", + "hono", + "hugo", + "hydrogen", + "ionic-angular", + "ionic-react", + "jekyll", + "koa", + "mastra", + "middleman", + "nestjs", + "nextjs", + "nitro", + "node", + "nuxtjs", + "parcel", + "polymer", + "preact", + "python", + "react-router", + "redwoodjs", + "remix", + "ruby", + "rust", + "saber", + "sanity", + "sanity-v2", + "sapper", + "scully", + "services", + "solidstart", + "solidstart-1", + "stencil", + "storybook", + "svelte", + "sveltekit", + "sveltekit-1", + "tanstack-start", + "tanstack-start-lovable", + "umijs", + "vite", + "vitepress", + "vue", + "vuepress", + "xmcp", + "zola" + ], + "description": "Framework slug, when the service has one (omitted otherwise)." + }, + "runtime": { + "type": "string", + "description": "Generic runtime, e.g. 'node' | 'python' | 'go' | 'ruby' | 'rust' (Service.runtime). Omitted for static builds." + } + }, + "required": [ + "serviceName" + ], + "type": "object" + }, + "type": "array" + }, + "gitForkProtection": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "gitLFS": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "id": { + "type": "string" + }, + "ipBuckets": { + "items": { + "properties": { + "bucket": { + "type": "string" + }, + "default": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "supportUntil": { + "type": "number" + } + }, + "required": [ + "bucket" + ], + "type": "object" + }, + "type": "array" + }, + "jobs": { + "properties": { + "lint": { + "properties": { + "targets": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "targets" + ], + "type": "object" + }, + "typecheck": { + "properties": { + "targets": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "targets" + ], + "type": "object" + }, + "mfe-config-present": { + "properties": { + "targets": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "targets" + ], + "type": "object" + } + }, + "type": "object" + }, + "latestDeployments": { + "items": { + "properties": { + "id": { + "type": "string" + }, + "alias": { + "items": { + "type": "string" + }, + "type": "array" + }, + "aliasAssigned": { + "nullable": true, + "oneOf": [ + { + "type": "number" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + } + ] + }, + "aliasError": { + "nullable": true, + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" + }, + "aliasFinal": { + "nullable": true, + "type": "string" + }, + "automaticAliases": { + "items": { + "type": "string" + }, + "type": "array" + }, + "branchMatcher": { + "properties": { + "type": { + "type": "string", + "enum": [ + "endsWith", + "equals", + "startsWith" + ], + "description": "The type of matching to perform" + }, + "pattern": { + "type": "string", + "description": "The pattern to match against branch names" + } + }, + "required": [ + "pattern", + "type" + ], + "type": "object" + }, + "buildingAt": { + "type": "number" + }, + "builds": { + "items": { + "properties": { + "use": { + "type": "string" + }, + "src": { + "type": "string" + }, + "dest": { + "type": "string" + } + }, + "required": [ + "use" + ], + "type": "object" + }, + "type": "array" + }, + "checksConclusion": { + "type": "string", + "enum": [ + "canceled", + "failed", + "skipped", + "succeeded" + ] + }, + "checksState": { + "type": "string", + "enum": [ + "completed", + "registered", + "running" + ] + }, + "connectBuildsEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "connectConfigurationId": { + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "createdIn": { + "type": "string" + }, + "creator": { + "nullable": true, + "properties": { + "email": { + "type": "string" + }, + "githubLogin": { + "type": "string" + }, + "gitlabLogin": { + "type": "string" + }, + "uid": { + "type": "string" + }, + "username": { + "type": "string" + } + }, + "required": [ + "email", + "uid", + "username" + ], + "type": "object" + }, + "deletedAt": { + "type": "number" + }, + "deploymentHostname": { + "type": "string" + }, + "forced": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "name": { + "type": "string" + }, + "meta": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "monorepoManager": { + "nullable": true, + "type": "string" + }, + "oidcTokenClaims": { + "properties": { + "iss": { + "type": "string" + }, + "sub": { + "type": "string" + }, + "scope": { + "type": "string" + }, + "aud": { + "type": "string" + }, + "owner": { + "type": "string" + }, + "owner_id": { + "type": "string" + }, + "project": { + "type": "string" + }, + "project_id": { + "type": "string" + }, + "environment": { + "type": "string" + }, + "custom_environment_id": { + "type": "string" + }, + "mfe_group_ids": { + "items": { + "type": "string" + }, + "type": "array" + }, + "plan": { + "type": "string" + } + }, + "required": [ + "aud", + "environment", + "iss", + "owner", + "owner_id", + "project", + "project_id", + "scope", + "sub" + ], + "type": "object" + }, + "plan": { + "type": "string", + "enum": [ + "enterprise", + "hobby", + "pro" + ] + }, + "previewCommentsEnabled": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether or not preview comments are enabled for the deployment", + "example": false + }, + "private": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "readyAt": { + "type": "number" + }, + "readyState": { + "type": "string", + "enum": [ + "BLOCKED", + "BUILDING", + "CANCELED", + "ERROR", + "INITIALIZING", + "QUEUED", + "READY" + ] + }, + "readySubstate": { + "type": "string", + "enum": [ + "PROMOTED", + "ROLLING", + "STAGED" + ] + }, + "requestedAt": { + "type": "number" + }, + "target": { + "nullable": true, + "type": "string" + }, + "teamId": { + "nullable": true, + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "LAMBDAS" + ] + }, + "url": { + "type": "string" + }, + "userId": { + "type": "string", + "description": "Present for user creators; omitted for app/integration/system creators." + }, + "withCache": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "createdAt", + "createdIn", + "creator", + "deploymentHostname", + "id", + "name", + "plan", + "private", + "readyState", + "type", + "url" + ], + "type": "object" + }, + "type": "array" + }, + "link": { + "oneOf": [ + { + "properties": { + "org": { + "type": "string" + }, + "repoOwnerId": { + "type": "number", + "description": "A new field, should be included in all new project links, is being added just in time when a deployment is created. This is needed for Protected Git scopes." + }, + "repo": { + "type": "string" + }, + "repoId": { + "type": "number" + }, + "type": { + "type": "string", + "enum": [ + "github" + ] + }, + "createdAt": { + "type": "number" + }, + "deployHooks": { + "items": { + "properties": { + "createdAt": { + "type": "number" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "ref": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "ref", + "url" + ], + "type": "object" + }, + "type": "array" + }, + "gitCredentialId": { + "type": "string" + }, + "updatedAt": { + "type": "number" + }, + "sourceless": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "productionBranch": { + "type": "string" + } + }, + "required": [ + "deployHooks", + "gitCredentialId", + "org", + "productionBranch", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "github-limited" + ] + }, + "repo": { + "type": "string" + }, + "repoId": { + "type": "number" + }, + "createdAt": { + "type": "number" + }, + "updatedAt": { + "type": "number" + }, + "org": { + "type": "string" + }, + "repoOwnerId": { + "type": "number", + "description": "A new field, should be included in all new project links, is being added just in time when a deployment is created. This is needed for Protected Git scopes." + }, + "deployHooks": { + "items": { + "properties": { + "createdAt": { + "type": "number" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "ref": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "ref", + "url" + ], + "type": "object" + }, + "type": "array" + }, + "gitCredentialId": { + "type": "string" + }, + "sourceless": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "productionBranch": { + "type": "string" + } + }, + "required": [ + "deployHooks", + "gitCredentialId", + "org", + "productionBranch", + "type" + ], + "type": "object" + }, + { + "properties": { + "org": { + "type": "string" + }, + "repoOwnerId": { + "type": "number", + "description": "A new field, should be included in all new project links, is being added just in time when a deployment is created. This is needed for Protected Git scopes." + }, + "repo": { + "type": "string" + }, + "repoId": { + "type": "number" + }, + "type": { + "type": "string", + "enum": [ + "github-custom-host" + ] + }, + "host": { + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "deployHooks": { + "items": { + "properties": { + "createdAt": { + "type": "number" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "ref": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "ref", + "url" + ], + "type": "object" + }, + "type": "array" + }, + "gitCredentialId": { + "type": "string" + }, + "updatedAt": { + "type": "number" + }, + "sourceless": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "productionBranch": { + "type": "string" + } + }, + "required": [ + "deployHooks", + "gitCredentialId", + "host", + "org", + "productionBranch", + "type" + ], + "type": "object" + }, + { + "properties": { + "projectId": { + "type": "string" + }, + "projectName": { + "type": "string" + }, + "projectNameWithNamespace": { + "type": "string" + }, + "projectNamespace": { + "type": "string" + }, + "projectOwnerId": { + "type": "number", + "description": "A new field, should be included in all new project links, is being added just in time when a deployment is created. This is needed for Protected Git scopes. This is the id of the top level group that a namespace belongs to. Gitlab supports group nesting (up to 20 levels)." + }, + "projectUrl": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "gitlab" + ] + }, + "createdAt": { + "type": "number" + }, + "deployHooks": { + "items": { + "properties": { + "createdAt": { + "type": "number" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "ref": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "ref", + "url" + ], + "type": "object" + }, + "type": "array" + }, + "gitCredentialId": { + "type": "string" + }, + "updatedAt": { + "type": "number" + }, + "sourceless": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "productionBranch": { + "type": "string" + } + }, + "required": [ + "deployHooks", + "gitCredentialId", + "productionBranch", + "projectId", + "projectName", + "projectNameWithNamespace", + "projectNamespace", + "projectUrl", + "type" + ], + "type": "object" + }, + { + "properties": { + "name": { + "type": "string" + }, + "slug": { + "type": "string" + }, + "owner": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "bitbucket" + ] + }, + "uuid": { + "type": "string" + }, + "workspaceUuid": { + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "deployHooks": { + "items": { + "properties": { + "createdAt": { + "type": "number" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "ref": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "ref", + "url" + ], + "type": "object" + }, + "type": "array" + }, + "gitCredentialId": { + "type": "string" + }, + "updatedAt": { + "type": "number" + }, + "sourceless": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "productionBranch": { + "type": "string" + } + }, + "required": [ + "deployHooks", + "gitCredentialId", + "name", + "owner", + "productionBranch", + "slug", + "type", + "uuid", + "workspaceUuid" + ], + "type": "object" + }, + { + "properties": { + "org": { + "type": "string" + }, + "repo": { + "type": "string" + }, + "repoId": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "vercel" + ] + }, + "createdAt": { + "type": "number" + }, + "deployHooks": { + "items": { + "properties": { + "createdAt": { + "type": "number" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "ref": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "ref", + "url" + ], + "type": "object" + }, + "type": "array" + }, + "gitCredentialId": { + "type": "string" + }, + "updatedAt": { + "type": "number" + }, + "sourceless": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "productionBranch": { + "type": "string" + } + }, + "required": [ + "deployHooks", + "gitCredentialId", + "org", + "productionBranch", + "repo", + "repoId", + "type" + ], + "type": "object" + }, + { + "properties": { + "org": { + "type": "string" + }, + "repo": { + "type": "string" + }, + "repoId": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "v0" + ] + }, + "createdAt": { + "type": "number" + }, + "deployHooks": { + "items": { + "properties": { + "createdAt": { + "type": "number" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "ref": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "ref", + "url" + ], + "type": "object" + }, + "type": "array" + }, + "gitCredentialId": { + "type": "string" + }, + "updatedAt": { + "type": "number" + }, + "sourceless": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "productionBranch": { + "type": "string" + } + }, + "required": [ + "deployHooks", + "gitCredentialId", + "org", + "productionBranch", + "repo", + "repoId", + "type" + ], + "type": "object" + }, + { + "properties": { + "owner": { + "type": "string", + "description": "Owner (namespace) slug, e.g. `acme`." + }, + "repo": { + "type": "string" + }, + "repoId": { + "type": "string", + "description": "Origin repository id." + }, + "ownerId": { + "type": "string", + "description": "Origin namespace id (`ns_…`) of the owner." + }, + "type": { + "type": "string", + "enum": [ + "cursor-origin" + ] + }, + "createdAt": { + "type": "number" + }, + "deployHooks": { + "items": { + "properties": { + "createdAt": { + "type": "number" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "ref": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "ref", + "url" + ], + "type": "object" + }, + "type": "array" + }, + "gitCredentialId": { + "type": "string" + }, + "updatedAt": { + "type": "number" + }, + "sourceless": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "productionBranch": { + "type": "string" + } + }, + "required": [ + "deployHooks", + "gitCredentialId", + "owner", + "ownerId", + "productionBranch", + "repo", + "repoId", + "type" + ], + "type": "object" + } + ] + }, + "blobs": { + "properties": { + "isDefaultApp": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Marks the team-level, Vercel-managed default blob project (`vercel-blob-default-project`) that orphan blob stores are scoped to when connected without an explicit project. Set only by internal storage flows and immutable after creation — guards rely on it to protect the connected stores from being lost when the project is deleted or transferred." + } + }, + "type": "object" + }, + "microfrontends": { + "oneOf": [ + { + "properties": { + "isDefaultApp": { + "type": "boolean", + "enum": [ + true + ] + }, + "updatedAt": { + "type": "number", + "description": "Timestamp when the microfrontends settings were last updated." + }, + "groupIds": { + "type": "array", + "items": { + "type": "string" + }, + "minItems": 1, + "description": "The group IDs of microfrontends that this project belongs to. Each microfrontend project must belong to a microfrontends group that is the set of microfrontends that are used together." + }, + "enabled": { + "type": "boolean", + "enum": [ + true + ], + "description": "Whether microfrontends are enabled for this project." + }, + "defaultRoute": { + "type": "string", + "description": "A path that is used to take screenshots and as the default path in preview links when a domain for this microfrontend is shown in the UI. Includes the leading slash, e.g. `/docs`" + }, + "freeProjectForLegacyLimits": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether the project was part of the legacy limits for hobby and pro-trial before billing was added. This field is only set when the team is upgraded to a paid plan and we are backfilling the subscription status. We cap the subscription to 2 projects and set this field for the 3rd project. When this field is set, the project is not charged for and we do not call any billing APIs for this project." + } + }, + "required": [ + "enabled", + "groupIds", + "isDefaultApp", + "updatedAt" + ], + "type": "object" + }, + { + "properties": { + "isDefaultApp": { + "type": "boolean", + "enum": [ + false + ] + }, + "routeObservabilityToThisProject": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether observability data should be routed to this microfrontend project or a root project." + }, + "doNotRouteWithMicrofrontendsRouting": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether to add microfrontends routing to aliases. This means domains in this project will route as a microfrontend." + }, + "updatedAt": { + "type": "number", + "description": "Timestamp when the microfrontends settings were last updated." + }, + "groupIds": { + "type": "array", + "items": { + "type": "string" + }, + "minItems": 1, + "description": "The group IDs of microfrontends that this project belongs to. Each microfrontend project must belong to a microfrontends group that is the set of microfrontends that are used together." + }, + "enabled": { + "type": "boolean", + "enum": [ + true + ], + "description": "Whether microfrontends are enabled for this project." + }, + "defaultRoute": { + "type": "string", + "description": "A path that is used to take screenshots and as the default path in preview links when a domain for this microfrontend is shown in the UI. Includes the leading slash, e.g. `/docs`" + }, + "freeProjectForLegacyLimits": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether the project was part of the legacy limits for hobby and pro-trial before billing was added. This field is only set when the team is upgraded to a paid plan and we are backfilling the subscription status. We cap the subscription to 2 projects and set this field for the 3rd project. When this field is set, the project is not charged for and we do not call any billing APIs for this project." + } + }, + "required": [ + "enabled", + "groupIds", + "updatedAt" + ], + "type": "object" + }, + { + "properties": { + "updatedAt": { + "type": "number" + }, + "groupIds": { + "type": "array", + "items": {}, + "minItems": 0, + "maxItems": 0 + }, + "enabled": { + "type": "boolean", + "enum": [ + false + ] + }, + "freeProjectForLegacyLimits": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "enabled", + "groupIds", + "updatedAt" + ], + "type": "object" + } + ] + }, + "name": { + "type": "string" + }, + "nodeVersion": { + "type": "string", + "enum": [ + "10.x", + "12.x", + "14.x", + "16.x", + "18.x", + "20.x", + "22.x", + "24.x", + "8.10.x" + ] + }, + "optionsAllowlist": { + "nullable": true, + "properties": { + "paths": { + "items": { + "properties": { + "value": { + "type": "string" + } + }, + "required": [ + "value" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "paths" + ], + "type": "object" + }, + "outputDirectory": { + "nullable": true, + "type": "string" + }, + "passwordProtection": { + "nullable": true, + "type": "object" + }, + "passport": { + "nullable": true, + "properties": { + "deploymentType": { + "type": "string", + "enum": [ + "all", + "all_except_custom_domains", + "preview", + "prod_deployment_urls_and_all_previews" + ] + }, + "connectorId": { + "type": "string" + } + }, + "required": [ + "connectorId", + "deploymentType" + ], + "type": "object" + }, + "protectionConfig": { + "properties": { + "sandboxUrls": { + "properties": { + "inheritDeploymentProtection": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "type": "object" + } + }, + "type": "object" + }, + "sandbox": { + "properties": { + "region": { + "type": "string", + "enum": [ + "arn1", + "bom1", + "cdg1", + "cle1", + "cpt1", + "dub1", + "fra1", + "gru1", + "hkg1", + "hnd1", + "iad1", + "icn1", + "kix1", + "lhr1", + "pdx1", + "sfo1", + "sin1", + "syd1", + "yul1" + ] + }, + "failoverRegions": { + "items": { + "type": "string", + "enum": [ + "arn1", + "bom1", + "cdg1", + "cle1", + "cpt1", + "dub1", + "fra1", + "gru1", + "hkg1", + "hnd1", + "iad1", + "icn1", + "kix1", + "lhr1", + "pdx1", + "sfo1", + "sin1", + "syd1", + "yul1" + ] + }, + "type": "array" + } + }, + "type": "object" + }, + "productionDeploymentsFastLane": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "resourceConfig": { + "properties": { + "elasticConcurrencyEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "fluid": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "functionDefaultRegions": { + "items": { + "type": "string" + }, + "type": "array" + }, + "functionDefaultTimeout": { + "type": "number" + }, + "functionDefaultMemoryType": { + "type": "string", + "enum": [ + "performance", + "performance_xl", + "standard", + "standard_legacy" + ] + }, + "functionZeroConfigFailover": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "buildMachineType": { + "type": "string", + "enum": [ + "basic", + "enhanced", + "standard", + "turbo" + ] + }, + "buildMachineSelection": { + "type": "string", + "enum": [ + "elastic", + "fixed" + ] + }, + "buildMachineElasticLastUpdated": { + "type": "number" + }, + "buildMachineElasticReason": { + "type": "string", + "enum": [ + "basic-floor", + "build-timeout-failure", + "enospc-failure", + "enterprise-floor", + "high-peak-disk", + "high-peak-memory", + "long-build-duration", + "oom-failure", + "short-build-duration", + "sustained-high-cpu" + ] + }, + "isNSNBDisabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "buildQueue": { + "properties": { + "configuration": { + "type": "string", + "enum": [ + "SKIP_NAMESPACE_QUEUE", + "WAIT_FOR_NAMESPACE_QUEUE" + ] + } + }, + "type": "object" + }, + "enableFunctionsBeta": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "type": "object", + "required": [ + "functionDefaultRegions" + ] + }, + "rollbackDescription": { + "properties": { + "userId": { + "type": "string", + "description": "The user who rolled back the project." + }, + "username": { + "type": "string", + "description": "The username of the user who rolled back the project." + }, + "description": { + "type": "string", + "description": "User-supplied explanation of why they rolled back the project. Limited to 250 characters." + }, + "createdAt": { + "type": "number", + "description": "Timestamp of when the rollback was requested." + } + }, + "required": [ + "createdAt", + "description", + "userId", + "username" + ], + "type": "object", + "description": "Description of why a project was rolled back, and by whom. Note that lastAliasRequest contains the from/to details of the rollback." + }, + "rollingRelease": { + "nullable": true, + "properties": { + "target": { + "type": "string", + "description": "The environment that the release targets, currently only supports production. Adding in case we want to configure with alias groups or custom environments.", + "example": "production" + }, + "stages": { + "nullable": true, + "items": { + "properties": { + "targetPercentage": { + "type": "number", + "description": "The percentage of traffic to serve to the canary deployment (0-100)", + "example": 25 + }, + "requireApproval": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether or not this stage requires manual approval to proceed", + "example": false + }, + "duration": { + "type": "number", + "description": "Duration in minutes for automatic advancement to the next stage", + "example": 600 + }, + "linearShift": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether to linearly shift traffic over the duration of this stage", + "example": false + } + }, + "required": [ + "targetPercentage" + ], + "type": "object", + "description": "An array of all the stages required during a deployment release. Each stage defines a target percentage and advancement rules. The final stage must always have targetPercentage: 100." + }, + "type": "array", + "description": "An array of all the stages required during a deployment release. Each stage defines a target percentage and advancement rules. The final stage must always have targetPercentage: 100." + }, + "canaryResponseHeader": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether the request served by a canary deployment should return a header indicating a canary was served. Defaults to `false` when omitted.", + "example": false + }, + "gate": { + "properties": { + "enabled": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether automated gating is enabled for this project's rollouts." + }, + "checks": { + "items": { + "properties": { + "type": { + "type": "string", + "enum": [ + "error-rate-5xx" + ], + "description": "The metric this check evaluates." + }, + "minSampleSize": { + "type": "number", + "description": "Minimum number of requests required in the window before the check can fail. Below this, the check is inconclusive rather than failing, so low-traffic stages don't gate on noise. Defaults to `100` when omitted.", + "example": 100 + }, + "excludeStatusCodes": { + "items": { + "type": "number" + }, + "type": "array", + "description": "Response status codes to ignore entirely — dropped from both the numerator (errors) and the denominator (total requests). Defaults to `[]` when omitted.", + "example": [ + 503 + ] + }, + "excludePaths": { + "items": { + "type": "string" + }, + "type": "array", + "description": "Request paths to ignore entirely — dropped from both the numerator (errors) and the denominator (total requests). Matched exactly against the request path with any query string removed; no prefix or glob matching. Defaults to `[]` when omitted.", + "example": [ + "/api/health" + ] + }, + "ingestWatermarkSeconds": { + "type": "number", + "description": "Seconds of ingest lag to allow for: the query's upper bound is `now() - this value`, so the check never reads a window that is still filling. Defaults to `30` when omitted.", + "example": 30 + } + }, + "required": [ + "type" + ], + "type": "object", + "description": "The checks to evaluate. An empty array means nothing is evaluated." + }, + "type": "array", + "description": "The checks to evaluate. An empty array means nothing is evaluated." + }, + "failureThreshold": { + "type": "number", + "description": "How many failing evaluations within {@link windowSize} trip the gate. Defaults to `3` when omitted.", + "example": 3 + }, + "windowSize": { + "type": "number", + "description": "How many of the most recent evaluations {@link failureThreshold} is counted against. Defaults to `5` when omitted.", + "example": 5 + }, + "action": { + "type": "string", + "enum": [ + "pause", + "rollback" + ], + "description": "What to do when the gate trips: pause the rollout, or roll it back." + }, + "dryRun": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "When true, a tripped gate is only reported — {@link action} is not taken." + } + }, + "required": [ + "action", + "checks", + "dryRun", + "enabled" + ], + "type": "object", + "description": "Automated gating configuration. Omitted (the default) means no gating is configured, which is equivalent to `enabled: false`." + } + }, + "required": [ + "target" + ], + "type": "object", + "description": "Project-level rolling release configuration that defines how deployments should be gradually rolled out" + }, + "defaultResourceConfig": { + "properties": { + "elasticConcurrencyEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "fluid": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "functionDefaultRegions": { + "items": { + "type": "string" + }, + "type": "array" + }, + "functionDefaultTimeout": { + "type": "number" + }, + "functionDefaultMemoryType": { + "type": "string", + "enum": [ + "performance", + "performance_xl", + "standard", + "standard_legacy" + ] + }, + "functionZeroConfigFailover": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "buildMachineType": { + "type": "string", + "enum": [ + "basic", + "enhanced", + "standard", + "turbo" + ] + }, + "buildMachineSelection": { + "type": "string", + "enum": [ + "elastic", + "fixed" + ] + }, + "buildMachineElasticLastUpdated": { + "type": "number" + }, + "buildMachineElasticReason": { + "type": "string", + "enum": [ + "basic-floor", + "build-timeout-failure", + "enospc-failure", + "enterprise-floor", + "high-peak-disk", + "high-peak-memory", + "long-build-duration", + "oom-failure", + "short-build-duration", + "sustained-high-cpu" + ] + }, + "isNSNBDisabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "buildQueue": { + "properties": { + "configuration": { + "type": "string", + "enum": [ + "SKIP_NAMESPACE_QUEUE", + "WAIT_FOR_NAMESPACE_QUEUE" + ] + } + }, + "type": "object" + }, + "enableFunctionsBeta": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "type": "object", + "required": [ + "functionDefaultRegions" + ] + }, + "rootDirectory": { + "nullable": true, + "type": "string" + }, + "serverlessFunctionZeroConfigFailover": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "skewProtectionBoundaryAt": { + "type": "number" + }, + "skewProtectionMaxAge": { + "type": "number" + }, + "skewProtectionAllowedDomains": { + "items": { + "type": "string" + }, + "type": "array" + }, + "skipGitConnectDuringLink": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "staticIps": { + "properties": { + "builds": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "enabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "regions": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "builds", + "enabled", + "regions" + ], + "type": "object" + }, + "sourceFilesOutsideRootDirectory": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "enableAffectedProjectsDeployments": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "enableExternalRewriteCaching": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "ssoProtection": { + "nullable": true, + "properties": { + "deploymentType": { + "type": "string", + "enum": [ + "all", + "all_except_custom_domains", + "preview", + "prod_deployment_urls_and_all_previews" + ] + }, + "cve55182MigrationAppliedFrom": { + "nullable": true, + "type": "string", + "enum": [ + "all", + "all_except_custom_domains", + "preview", + "prod_deployment_urls_and_all_previews", + null + ] + }, + "april2026SecurityIncidentMigrationAppliedFrom": { + "nullable": true, + "type": "string", + "enum": [ + "all", + "all_except_custom_domains", + "preview", + "prod_deployment_urls_and_all_previews", + null + ] + } + }, + "required": [ + "deploymentType" + ], + "type": "object" + }, + "targets": { + "additionalProperties": { + "nullable": true, + "properties": { + "id": { + "type": "string" + }, + "alias": { + "items": { + "type": "string" + }, + "type": "array" + }, + "aliasAssigned": { + "nullable": true, + "oneOf": [ + { + "type": "number" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + } + ] + }, + "aliasError": { + "nullable": true, + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" + }, + "aliasFinal": { + "nullable": true, + "type": "string" + }, + "automaticAliases": { + "items": { + "type": "string" + }, + "type": "array" + }, + "branchMatcher": { + "properties": { + "type": { + "type": "string", + "enum": [ + "endsWith", + "equals", + "startsWith" + ], + "description": "The type of matching to perform" + }, + "pattern": { + "type": "string", + "description": "The pattern to match against branch names" + } + }, + "required": [ + "pattern", + "type" + ], + "type": "object" + }, + "buildingAt": { + "type": "number" + }, + "builds": { + "items": { + "properties": { + "use": { + "type": "string" + }, + "src": { + "type": "string" + }, + "dest": { + "type": "string" + } + }, + "required": [ + "use" + ], + "type": "object" + }, + "type": "array" + }, + "checksConclusion": { + "type": "string", + "enum": [ + "canceled", + "failed", + "skipped", + "succeeded" + ] + }, + "checksState": { + "type": "string", + "enum": [ + "completed", + "registered", + "running" + ] + }, + "connectBuildsEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "connectConfigurationId": { + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "createdIn": { + "type": "string" + }, + "creator": { + "nullable": true, + "properties": { + "email": { + "type": "string" + }, + "githubLogin": { + "type": "string" + }, + "gitlabLogin": { + "type": "string" + }, + "uid": { + "type": "string" + }, + "username": { + "type": "string" + } + }, + "required": [ + "email", + "uid", + "username" + ], + "type": "object" + }, + "deletedAt": { + "type": "number" + }, + "deploymentHostname": { + "type": "string" + }, + "forced": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "name": { + "type": "string" + }, + "meta": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "monorepoManager": { + "nullable": true, + "type": "string" + }, + "oidcTokenClaims": { + "properties": { + "iss": { + "type": "string" + }, + "sub": { + "type": "string" + }, + "scope": { + "type": "string" + }, + "aud": { + "type": "string" + }, + "owner": { + "type": "string" + }, + "owner_id": { + "type": "string" + }, + "project": { + "type": "string" + }, + "project_id": { + "type": "string" + }, + "environment": { + "type": "string" + }, + "custom_environment_id": { + "type": "string" + }, + "mfe_group_ids": { + "items": { + "type": "string" + }, + "type": "array" + }, + "plan": { + "type": "string" + } + }, + "required": [ + "aud", + "environment", + "iss", + "owner", + "owner_id", + "project", + "project_id", + "scope", + "sub" + ], + "type": "object" + }, + "plan": { + "type": "string", + "enum": [ + "enterprise", + "hobby", + "pro" + ] + }, + "previewCommentsEnabled": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether or not preview comments are enabled for the deployment", + "example": false + }, + "private": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "readyAt": { + "type": "number" + }, + "readyState": { + "type": "string", + "enum": [ + "BLOCKED", + "BUILDING", + "CANCELED", + "ERROR", + "INITIALIZING", + "QUEUED", + "READY" + ] + }, + "readySubstate": { + "type": "string", + "enum": [ + "PROMOTED", + "ROLLING", + "STAGED" + ] + }, + "requestedAt": { + "type": "number" + }, + "target": { + "nullable": true, + "type": "string" + }, + "teamId": { + "nullable": true, + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "LAMBDAS" + ] + }, + "url": { + "type": "string" + }, + "userId": { + "type": "string", + "description": "Present for user creators; omitted for app/integration/system creators." + }, + "withCache": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "createdAt", + "createdIn", + "creator", + "deploymentHostname", + "id", + "name", + "plan", + "private", + "readyState", + "type", + "url" + ], + "type": "object" + }, + "type": "object" + }, + "transferCompletedAt": { + "type": "number" + }, + "transferStartedAt": { + "type": "number" + }, + "transferToAccountId": { + "type": "string" + }, + "transferredFromAccountId": { + "type": "string" + }, + "updatedAt": { + "type": "number" + }, + "live": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "enablePreviewFeedback": { + "nullable": true, + "type": "boolean", + "enum": [ + false, + true, + null + ] + }, + "enableProductionFeedback": { + "nullable": true, + "type": "boolean", + "enum": [ + false, + true, + null + ] + }, + "permissions": { + "properties": { + "oauth2Connection": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "user": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "userConnection": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "userMfaConfiguration": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "userPreference": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "userSudo": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "webAuthn": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "accessGroup": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "agent": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aiGatewayApiKey": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aiGatewayApiKeyBypassAll": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aiGatewayApiKeyOwnedBySelf": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aiGatewayApiKeySpendAttribution": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aiGatewayApiKeyZdrExemption": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aiGatewayBudget": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aiGatewayCredits": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aiGatewayPrivateModels": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aiGatewayGuardrails": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aiGatewayRules": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aiGatewaySettings": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aiGatewayTranscripts": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aiGatewayTranscriptsSettings": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aiGatewayUsage": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aiGatewayVirtualModelConfigs": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "alerts": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "alertRules": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aliasGlobal": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "analyticsSampling": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "analyticsUsage": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "apiKey": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "apiKeyAiGateway": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "apiKeyOwnedBySelf": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "oauth2Application": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "vercelAppInstallation": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "vercelAppInstallationRequest": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "auditLog": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "automation": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "billingAddress": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "billingInformation": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "billingInvoice": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "billingInvoiceEmailRecipient": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "billingInvoiceLanguage": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "billingPlan": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "billingPurchaseOrder": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "billingRefund": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "billingTaxId": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "blob": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "blobStoreTokenSet": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "budget": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "cacheArtifact": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "cacheArtifactUsageEvent": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "codeChecks": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "codeOwners": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "ciInvocations": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "ciLogs": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "concurrentBuilds": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "connect": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "connectConfiguration": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "connectLogs": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "connexClient": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "connexClientProject": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "connexContact": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "connexInstallation": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "connexToken": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "buildMachineDefault": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "cursorOriginInstallation": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "dataCacheBillingSettings": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "defaultDeploymentProtection": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "deploymentPolicy": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "domain": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "domainAcceptDelegation": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "domainAuthCodes": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "domainCertificate": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "domainCheckConfig": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "domainMove": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "domainPurchase": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "domainRecord": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "domainTransferIn": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "drain": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "edgeConfig": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "edgeConfigItem": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "edgeConfigSchema": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "edgeConfigToken": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "endpointVerification": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "event": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "fileUpload": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "flagsExplorerSubscription": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "gitRepository": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "imageOptimizationNewPrice": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integration": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integrationAccount": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integrationConfiguration": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integrationConfigurationProjects": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integrationConfigurationRole": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integrationConfigurationTransfer": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integrationDeploymentAction": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integrationEvent": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integrationLog": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integrationResource": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integrationResourceData": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integrationResourceReplCommand": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integrationResourceSecrets": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integrationSSOSession": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integrationStrict": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integrationStoreTokenSet": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integrationVercelConfigurationOverride": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integrationPullRequest": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "ipBlocking": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "jobGlobal": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "kmsIssuer": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "kmsProjectGrant": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "logDrain": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "marketplaceBillingData": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "marketplaceExperimentationEdgeConfigData": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "marketplaceExperimentationItem": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "marketplaceFlexCommit": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "marketplaceInstallationMember": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "marketplaceInvoice": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "marketplaceSettings": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "Monitoring": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "monitoringAlert": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "monitoringChart": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "monitoringQuery": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "monitoringSettings": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "notificationCustomerBudget": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "notificationDeploymentFailed": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "notificationDomainConfiguration": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "notificationDomainExpire": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "notificationDomainMoved": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "notificationDomainPurchase": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "notificationDomainRenewal": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "notificationDomainTransfer": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "notificationDomainUnverified": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "NotificationMonitoringAlert": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "notificationPaymentFailed": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "notificationPreferences": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "notificationStatementOfReasons": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "notificationUsageAlert": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "oidcFederationPolicy": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "observabilityConfiguration": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "observabilityFunnel": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "observabilityNotebook": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "openTelemetryEndpoint": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "ownEvent": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "organization": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "organizationDomain": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "organizationTeam": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "passwordProtectionInvoiceItem": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "paymentMethod": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "permissions": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "postgres": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "postgresStoreTokenSet": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "previewDeploymentSuffix": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "privateCloudAccount": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectTransferIn": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectTransferRequest": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "proTrialOnboarding": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "rateLimit": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "redis": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "redisStoreTokenSet": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "remoteCaching": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "repository": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "samlConfig": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "secret": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "securityConfig": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "sensitiveEnvironmentVariablePolicy": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "sharedEnvVars": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "sharedEnvVarsProduction": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "space": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "spaceRun": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "storeIsLocked": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "storeTokenSetSensitive": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "storeTransfer": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "supportCase": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "supportCaseComment": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "team": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "teamAccessRequest": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "teamFellowMembership": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "teamGitExclusivity": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "teamInvite": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "teamInviteCode": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "teamInviteLink": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "teamJoin": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "teamMemberMfaStatus": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "teamMicrofrontends": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "teamOwnMembership": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "teamOwnMembershipDisconnectSAML": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "teamSudo": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "teamTokenInvalidation": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "token": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "toolbarComment": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "usage": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "usageCycle": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "vcrRepository": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "vpcPeeringConnection": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "webAnalyticsPlan": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "webhook": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "webhook-event": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aliasProject": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aliasProtectionBypass": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "bulkRedirects": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "buildMachine": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "connectConfigurationLink": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "dataCacheNamespace": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "deployment": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "deploymentBuildLogs": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "deploymentCheck": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "deploymentCheckPreview": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "deploymentCheckReRunFromProductionBranch": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "deploymentProductionGit": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "deploymentV0": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "deploymentPreview": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "deploymentPrivate": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "deploymentPromote": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "deploymentRollback": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "edgeCacheNamespace": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "environments": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "job": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "logs": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "logsPreset": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "observabilityData": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "onDemandBuild": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "onDemandConcurrency": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "optionsAllowlist": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "passwordProtection": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "privateLinkEndpoint": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "productionAliasProtectionBypass": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "productionShareableLink": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "project": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectAccessGroup": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectAnalyticsSampling": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectAnalyticsUsage": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectCheck": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectCheckRun": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectDeploymentExpiration": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectDeploymentHook": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectDeploymentProtectionStrict": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectDomain": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectDomainCheckConfig": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectDomainMove": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectDomainVerify": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectEvent": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectEnvVars": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectEnvVarsProduction": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectEnvVarsUnownedByIntegration": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectFlags": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectFlagsProduction": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectFlagsSdkKey": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectFromV0": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectId": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectIntegrationConfiguration": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectLink": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectMember": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectMonitoring": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectOIDCToken": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectPermissions": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectProductionBranch": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectProtectionBypass": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectRollingRelease": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectRoutes": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectSupportCase": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectSupportCaseComment": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectTier": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectTransfer": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectTransferOut": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectUsage": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "pageIntegrity": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "seawallConfig": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "securityPlusConfiguration": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "shareableLink": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "shareableLinkStrict": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "sharedEnvVarConnection": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "skewProtection": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "analytics": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "trustedIps": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "trustedSources": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "v0Chat": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "vercelAuth": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "vercelRun": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "webAnalytics": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "workflowRunData": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + } + }, + "type": "object" + }, + "lastRollbackTarget": { + "nullable": true, + "type": "object" + }, + "lastAliasRequest": { + "nullable": true, + "properties": { + "fromDeploymentId": { + "nullable": true, + "type": "string" + }, + "toDeploymentId": { + "type": "string" + }, + "fromRollingReleaseId": { + "type": "string", + "description": "If rolling back from a rolling release, fromDeploymentId captures the \"base\" of that rolling release, and fromRollingReleaseId captures the \"target\" of that rolling release." + }, + "jobStatus": { + "type": "string", + "enum": [ + "failed", + "in-progress", + "pending", + "skipped", + "succeeded" + ] + }, + "requestedAt": { + "type": "number" + }, + "type": { + "type": "string", + "enum": [ + "promote", + "rollback" + ] + } + }, + "required": [ + "fromDeploymentId", + "jobStatus", + "requestedAt", + "toDeploymentId", + "type" + ], + "type": "object" + }, + "protectionBypass": { + "additionalProperties": { + "oneOf": [ + { + "properties": { + "createdAt": { + "type": "number" + }, + "createdBy": { + "type": "string" + }, + "scope": { + "type": "string", + "enum": [ + "integration-automation-bypass" + ] + }, + "integrationId": { + "type": "string" + }, + "configurationId": { + "type": "string" + } + }, + "required": [ + "configurationId", + "createdAt", + "createdBy", + "integrationId", + "scope" + ], + "type": "object" + }, + { + "properties": { + "createdAt": { + "type": "number" + }, + "createdBy": { + "type": "string" + }, + "scope": { + "type": "string", + "enum": [ + "automation-bypass" + ] + }, + "isEnvVar": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "When there was only one bypass, it was automatically set as an env var on deployments. With multiple bypasses, there is always one bypass that is selected as the default, and gets set as an env var on deployments. As this is a new field, undefined means that the bypass is the env var. If there are any automation bypasses, exactly one must be the env var." + }, + "note": { + "type": "string", + "description": "Optional note about the bypass to be displayed in the UI" + } + }, + "required": [ + "createdAt", + "createdBy", + "scope" + ], + "type": "object" + } + ] + }, + "type": "object" + }, + "hasActiveBranches": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "trustedIps": { + "nullable": true, + "oneOf": [ + { + "properties": { + "deploymentType": { + "type": "string", + "enum": [ + "all", + "all_except_custom_domains", + "preview", + "prod_deployment_urls_and_all_previews", + "production" + ] + }, + "addresses": { + "items": { + "properties": { + "value": { + "type": "string" + }, + "note": { + "type": "string" + } + }, + "required": [ + "value" + ], + "type": "object" + }, + "type": "array" + }, + "protectionMode": { + "type": "string", + "enum": [ + "additional", + "exclusive" + ] + } + }, + "required": [ + "addresses", + "deploymentType", + "protectionMode" + ], + "type": "object" + }, + { + "properties": { + "deploymentType": { + "type": "string", + "enum": [ + "all", + "all_except_custom_domains", + "preview", + "prod_deployment_urls_and_all_previews", + "production" + ] + } + }, + "required": [ + "deploymentType" + ], + "type": "object" + } + ] + }, + "trustedSources": { + "nullable": true, + "properties": { + "enableVercelCiSameRepository": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Allow same-team Vercel CI access to preview deployments built from the CI run's repository, using the deployment source rather than the current project repository link. Defaults to enabled when not stored; omitted or null Trusted Sources updates preserve the stored value." + }, + "projects": { + "additionalProperties": { + "properties": { + "label": { + "type": "string" + }, + "customAllow": { + "items": { + "properties": { + "from": { + "oneOf": [ + { + "properties": { + "slugs": { + "items": { + "type": "string" + }, + "type": "array", + "description": "System environment slugs (`production`, `preview`) and/or custom environment slugs defined on the referenced project." + }, + "preset": { + "type": "string", + "enum": [ + "all-custom" + ] + } + }, + "required": [ + "slugs" + ], + "type": "object", + "description": "The source envs on the trusted project that are allowed to access `to`." + }, + { + "properties": { + "slugs": { + "items": { + "type": "string" + }, + "type": "array", + "description": "System environment slugs (`production`, `preview`) and/or custom environment slugs defined on the referenced project." + }, + "preset": { + "type": "string", + "enum": [ + "all-custom" + ] + } + }, + "required": [ + "preset" + ], + "type": "object", + "description": "The source envs on the trusted project that are allowed to access `to`." + } + ] + }, + "to": { + "oneOf": [ + { + "properties": { + "slugs": { + "items": { + "type": "string" + }, + "type": "array", + "description": "System environment slugs (`production`, `preview`) and/or custom environment slugs defined on the referenced project." + }, + "preset": { + "type": "string", + "enum": [ + "all-custom" + ] + } + }, + "required": [ + "slugs" + ], + "type": "object", + "description": "The target envs on the current project that may be accessed." + }, + { + "properties": { + "slugs": { + "items": { + "type": "string" + }, + "type": "array", + "description": "System environment slugs (`production`, `preview`) and/or custom environment slugs defined on the referenced project." + }, + "preset": { + "type": "string", + "enum": [ + "all-custom" + ] + } + }, + "required": [ + "preset" + ], + "type": "object", + "description": "The target envs on the current project that may be accessed." + } + ] + } + }, + "required": [ + "from", + "to" + ], + "type": "object", + "description": "Optional overrides for the default same-env-by-slug matching. Provide explicit rules to allow cross-env access or presets." + }, + "type": "array", + "description": "Optional overrides for the default same-env-by-slug matching. Provide explicit rules to allow cross-env access or presets." + } + }, + "type": "object" + }, + "type": "object" + }, + "oidcProviders": { + "additionalProperties": { + "items": { + "properties": { + "to": { + "oneOf": [ + { + "properties": { + "slugs": { + "items": { + "type": "string" + }, + "type": "array", + "description": "System environment slugs (`production`, `preview`) and/or custom environment slugs defined on the referenced project." + }, + "preset": { + "type": "string", + "enum": [ + "all-custom" + ] + } + }, + "required": [ + "slugs" + ], + "type": "object", + "description": "The target envs on the current project that may be accessed." + }, + { + "properties": { + "slugs": { + "items": { + "type": "string" + }, + "type": "array", + "description": "System environment slugs (`production`, `preview`) and/or custom environment slugs defined on the referenced project." + }, + "preset": { + "type": "string", + "enum": [ + "all-custom" + ] + } + }, + "required": [ + "preset" + ], + "type": "object", + "description": "The target envs on the current project that may be accessed." + } + ] + }, + "label": { + "type": "string" + }, + "claims": { + "additionalProperties": { + "items": { + "type": "string" + }, + "type": "array" + }, + "type": "object" + } + }, + "required": [ + "claims", + "to" + ], + "type": "object" + }, + "type": "array" + }, + "type": "object" + } + }, + "type": "object" + }, + "gitComments": { + "properties": { + "onPullRequest": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether the Vercel bot should comment on PRs" + }, + "onCommit": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether the Vercel bot should comment on commits" + } + }, + "required": [ + "onCommit", + "onPullRequest" + ], + "type": "object" + }, + "gitProviderOptions": { + "properties": { + "createDeployments": { + "type": "string", + "enum": [ + "disabled", + "enabled" + ], + "description": "Whether the Vercel bot should automatically create GitHub deployments https://docs.github.com/en/rest/deployments/deployments#about-deployments NOTE: repository-dispatch events should be used instead" + }, + "disableRepositoryDispatchEvents": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether the Vercel bot should not automatically create GitHub repository-dispatch events on deployment events. https://vercel.com/docs/git/vercel-for-github#repository-dispatch-events - `true`: disable repository-dispatch events for this project (explicit override of the team setting). - `false`: enable repository-dispatch events for this project (explicit override of the team setting). - absent: inherit from `team.disableRepositoryDispatchEvents`." + }, + "requireVerifiedCommits": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether the project requires commits to be signed \u0026 verified before deployments will be created. - `true`: require verified commits for this project (explicit override of the team setting). - `false`: do not require verified commits (explicit override of the team setting). - absent: inherit from `team.requireVerifiedCommits`." + }, + "gitCommitStatus": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether Vercel should post commit statuses for this project. When omitted, commit statuses remain enabled." + }, + "consolidatedGitCommitStatus": { + "properties": { + "enabled": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether consolidated commit status is enabled." + }, + "propagateFailures": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether to propagate individual deployment failures to the consolidated status." + } + }, + "required": [ + "enabled", + "propagateFailures" + ], + "type": "object", + "description": "Configuration for consolidated git commit status reporting. When enabled, Vercel will post a single consolidated commit status instead of individual statuses for each deployment." + } + }, + "required": [ + "createDeployments" + ], + "type": "object" + }, + "paused": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "concurrencyBucketName": { + "type": "string" + }, + "webAnalytics": { + "properties": { + "id": { + "type": "string" + }, + "disabledAt": { + "type": "number" + }, + "canceledAt": { + "type": "number" + }, + "enabledAt": { + "type": "number" + }, + "hasData": { + "type": "boolean", + "enum": [ + true + ] + } + }, + "required": [ + "id" + ], + "type": "object" + }, + "security": { + "properties": { + "attackModeEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "attackModeUpdatedAt": { + "type": "number" + }, + "firewallEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "firewallUpdatedAt": { + "type": "number" + }, + "attackModeActiveUntil": { + "nullable": true, + "type": "number" + }, + "firewallConfigVersion": { + "type": "number" + }, + "rulesets": { + "additionalProperties": { + "properties": { + "action": { + "type": "string", + "enum": [ + "allow", + "bypass", + "challenge", + "deny", + "log", + "rate_limit", + "redirect" + ] + }, + "rateLimit": { + "nullable": true, + "properties": { + "algo": { + "type": "string", + "enum": [ + "fixed_window", + "token_bucket" + ] + }, + "window": { + "type": "number" + }, + "limit": { + "type": "number" + }, + "keys": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "algo", + "keys", + "limit", + "window" + ], + "type": "object" + }, + "redirect": { + "nullable": true, + "properties": { + "location": { + "type": "string" + }, + "permanent": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "location", + "permanent" + ], + "type": "object" + }, + "actionDuration": { + "nullable": true, + "type": "string" + }, + "bypassSystem": { + "nullable": true, + "type": "boolean", + "enum": [ + false, + true, + null + ] + }, + "logHeaders": { + "oneOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "string", + "enum": [ + "*" + ] + } + ] + } + }, + "required": [ + "action" + ], + "type": "object" + }, + "type": "object" + }, + "firewallSeawallEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "ja3Enabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "ja4Enabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "firewallBypassIps": { + "items": { + "type": "string" + }, + "type": "array" + }, + "managedRules": { + "nullable": true, + "properties": { + "vercel_ruleset": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "challenge", + "deny", + "log" + ] + } + }, + "required": [ + "active" + ], + "type": "object" + }, + "traffic_sources": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "challenge", + "deny", + "log" + ] + } + }, + "required": [ + "active" + ], + "type": "object" + }, + "bot_filter": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "challenge", + "deny", + "log" + ] + } + }, + "required": [ + "active" + ], + "type": "object" + }, + "ai_bots": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "challenge", + "deny", + "log" + ] + } + }, + "required": [ + "active" + ], + "type": "object" + }, + "owasp": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "challenge", + "deny", + "log" + ] + } + }, + "required": [ + "active" + ], + "type": "object" + } + }, + "required": [ + "ai_bots", + "bot_filter", + "owasp", + "traffic_sources", + "vercel_ruleset" + ], + "type": "object" + }, + "botIdEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "log_headers": { + "oneOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "string", + "enum": [ + "*" + ] + } + ] + }, + "securityPlus": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "securityPlusMetadata": { + "properties": { + "updatedAt": { + "type": "number" + }, + "firstEnabledAt": { + "type": "number", + "description": "Timestamp when the feature was first enabled. Never changes after initial enablement." + } + }, + "required": [ + "updatedAt" + ], + "type": "object" + }, + "pageIntegrityEnabled": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether Page Integrity is enabled for this project. Used by the metadata service to gate DynamoDB lookups against the page-integrity-inventory table." + } + }, + "type": "object" + }, + "oidcTokenConfig": { + "properties": { + "enabled": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether or not to generate OpenID Connect JSON Web Tokens." + }, + "issuerMode": { + "type": "string", + "enum": [ + "global", + "team" + ], + "description": "- team: `https://oidc.vercel.com/[team_slug]` - global: `https://oidc.vercel.com`" + } + }, + "type": "object" + }, + "deploymentPolicy": { + "nullable": true, + "properties": { + "gitSources": { + "nullable": true, + "items": { + "properties": { + "sources": { + "items": { + "oneOf": [ + { + "properties": { + "provider": { + "type": "string", + "enum": [ + "bitbucket", + "github" + ] + }, + "org": { + "type": "string" + }, + "repo": { + "type": "string" + } + }, + "required": [ + "org", + "provider" + ], + "type": "object", + "description": "Allowlist entry for GitHub and Bitbucket, whose repos are identified by a flat `org`/`repo` (Bitbucket's workspace/owner maps to `org`, its repo slug to `repo`). Omit `repo` to match any repo in the org. Org is matched case-insensitively." + }, + { + "properties": { + "provider": { + "type": "string", + "enum": [ + "gitlab" + ] + }, + "namespace": { + "type": "string" + }, + "project": { + "type": "string" + } + }, + "required": [ + "namespace", + "provider" + ], + "type": "object", + "description": "Allowlist entry for GitLab, which uses nested groups rather than a flat org/repo. `namespace` is the full group path (e.g. `group` or `group/subgroup`); `project` is the leaf project name. Omit `project` to match any project under the namespace. Namespace is matched case-insensitively." + } + ] + }, + "type": "array" + }, + "enabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "environments": { + "items": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "system" + ] + }, + "target": { + "type": "string", + "enum": [ + "preview", + "production" + ] + } + }, + "required": [ + "target", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "custom" + ] + }, + "environmentId": { + "type": "string" + } + }, + "required": [ + "environmentId", + "type" + ], + "type": "object" + } + ] + }, + "type": "array" + } + }, + "required": [ + "enabled", + "environments", + "sources" + ], + "type": "object", + "description": "`enabled: true` with empty `sources` is deny-all." + }, + "type": "array" + }, + "deploymentSources": { + "nullable": true, + "items": { + "properties": { + "sources": { + "items": { + "type": "string", + "enum": [ + "cli", + "deploy-hook", + "git", + "integration", + "rest-api", + "v0" + ], + "description": "Customer-configurable deployment sources. Every deploy classifies to exactly one. JSON schema in `packages/deployment-policy/schemas/body.ts` enumerates exactly these values. - `'git'` — git provider webhook. - `'cli'` — Vercel CLI (legacy classic-token CLI and SIWV CLI both). - `'rest-api'` — direct user/team-token REST upload. Does NOT cover deploy hooks, Marketplace integrations, or first-party app tokens. - `'deploy-hook'` — project deploy-hook URL. The URL is the credential. - `'integration'` — third-party Marketplace actor: Marketplace integration token, user-delegated OAuth from a Marketplace app, or an unrecognized third-party Vercel App. First-party Vercel Apps are never `'integration'`. - `'v0'` — the v0 product surface (entitlement-gated). v0 deploys through the CLI under the hood, but classifies as its own source so a team can allow or deny v0 independently of `'cli'`. First-party Vercel apps (Toolbar, etc.) classify as `'first-party'` — see `ClassifiedSource` in `./checks`. They're not in this union because they aren't customer-configurable; they bypass `checkDeploymentSources` entirely. v0 is intentionally NOT among them: like the CLI, it's a real product surface and is policy-controllable." + }, + "type": "array" + }, + "enabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "environments": { + "items": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "system" + ] + }, + "target": { + "type": "string", + "enum": [ + "preview", + "production" + ] + } + }, + "required": [ + "target", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "custom" + ] + }, + "environmentId": { + "type": "string" + } + }, + "required": [ + "environmentId", + "type" + ], + "type": "object" + } + ] + }, + "type": "array" + } + }, + "required": [ + "enabled", + "environments", + "sources" + ], + "type": "object", + "description": "`enabled: true` with empty `sources` is deny-all." + }, + "type": "array" + } + }, + "type": "object", + "description": "Project shape. `null` on a rule list clears the project's override for that rule type (fall back to team for every env); omitting is equivalent. Setting `deploymentPolicy` itself to `null` clears every override at once. Kept structurally distinct from {@link TeamDeploymentPolicy} so the two storage locations don't share a type by accident." + }, + "tier": { + "type": "string", + "enum": [ + "advanced", + "critical", + "priority" + ] + }, + "usageStatus": { + "properties": { + "kind": { + "type": "string", + "enum": [ + "flat" + ], + "description": "Billing mode. Always 'flat' for flat-rate projects." + }, + "exceededAllowanceUntil": { + "type": "number", + "description": "Timestamp until which the project has exceeded its CDN allowance." + }, + "bypassThrottleUntil": { + "type": "number", + "description": "Timestamp until which throttling is bypassed (project pays list rates for overage)." + }, + "throttled": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Per-project throttle, set explicitly for this project (e.g. via the per-project Flat Rate CDN endpoint)." + }, + "teamThrottled": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Synced from `team.billing.usageStatus.throttled`. When `true`, the team has throttled all of its projects regardless of `throttled`. The effective throttle the CDN enforces is `throttled || teamThrottled`." + } + }, + "required": [ + "kind" + ], + "type": "object" + }, + "features": { + "properties": { + "webAnalytics": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "type": "object" + }, + "v0": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "v0Created": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "abuse": { + "properties": { + "scanner": { + "type": "string" + }, + "history": { + "items": { + "properties": { + "scanner": { + "type": "string" + }, + "reason": { + "type": "string" + }, + "by": { + "type": "string" + }, + "byId": { + "type": "string" + }, + "at": { + "type": "number" + } + }, + "required": [ + "at", + "by", + "byId", + "reason", + "scanner" + ], + "type": "object" + }, + "type": "array" + }, + "updatedAt": { + "type": "number" + }, + "block": { + "properties": { + "action": { + "type": "string", + "enum": [ + "blocked" + ] + }, + "reason": { + "type": "string" + }, + "statusCode": { + "type": "number" + }, + "createdAt": { + "type": "number" + }, + "caseId": { + "type": "string" + }, + "actor": { + "type": "string" + }, + "comment": { + "type": "string" + }, + "ineligibleForAppeal": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "isCascading": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "action", + "createdAt", + "reason", + "statusCode" + ], + "type": "object" + }, + "blockHistory": { + "items": { + "oneOf": [ + { + "properties": { + "action": { + "type": "string", + "enum": [ + "blocked" + ] + }, + "reason": { + "type": "string" + }, + "statusCode": { + "type": "number" + }, + "createdAt": { + "type": "number" + }, + "caseId": { + "type": "string" + }, + "actor": { + "type": "string" + }, + "comment": { + "type": "string" + }, + "ineligibleForAppeal": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "isCascading": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "action", + "createdAt", + "reason", + "statusCode" + ], + "type": "object" + }, + { + "properties": { + "action": { + "type": "string", + "enum": [ + "unblocked" + ] + }, + "createdAt": { + "type": "number" + }, + "caseId": { + "type": "string" + }, + "actor": { + "type": "string" + }, + "comment": { + "type": "string" + }, + "ineligibleForAppeal": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "isCascading": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "action", + "createdAt" + ], + "type": "object" + }, + { + "properties": { + "action": { + "type": "string", + "enum": [ + "route-blocked" + ] + }, + "route": { + "oneOf": [ + { + "properties": { + "src": { + "type": "string" + }, + "status": { + "type": "number" + }, + "expiry": { + "type": "number" + } + }, + "required": [ + "src", + "status" + ], + "type": "object" + }, + { + "properties": { + "has": { + "items": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "header" + ] + }, + "key": { + "type": "string", + "enum": [ + "x-vercel-ip-country" + ] + }, + "value": { + "properties": { + "eq": { + "type": "string" + } + }, + "required": [ + "eq" + ], + "type": "object" + } + }, + "required": [ + "key", + "type", + "value" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "host" + ] + }, + "value": { + "properties": { + "eq": { + "type": "string" + } + }, + "required": [ + "eq" + ], + "type": "object" + } + }, + "required": [ + "type", + "value" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "mitigate": { + "properties": { + "action": { + "type": "string", + "enum": [ + "block_legal_cwc" + ] + } + }, + "required": [ + "action" + ], + "type": "object" + }, + "src": { + "type": "string" + } + }, + "required": [ + "has", + "mitigate" + ], + "type": "object" + } + ] + }, + "reason": { + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "caseId": { + "type": "string" + }, + "actor": { + "type": "string" + }, + "comment": { + "type": "string" + }, + "ineligibleForAppeal": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "isCascading": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "action", + "createdAt", + "reason", + "route" + ], + "type": "object" + }, + { + "properties": { + "action": { + "type": "string", + "enum": [ + "route-unblocked" + ] + }, + "route": { + "oneOf": [ + { + "properties": { + "src": { + "type": "string" + }, + "status": { + "type": "number" + }, + "expiry": { + "type": "number" + } + }, + "required": [ + "src", + "status" + ], + "type": "object" + }, + { + "properties": { + "has": { + "items": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "header" + ] + }, + "key": { + "type": "string", + "enum": [ + "x-vercel-ip-country" + ] + }, + "value": { + "properties": { + "eq": { + "type": "string" + } + }, + "required": [ + "eq" + ], + "type": "object" + } + }, + "required": [ + "key", + "type", + "value" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "host" + ] + }, + "value": { + "properties": { + "eq": { + "type": "string" + } + }, + "required": [ + "eq" + ], + "type": "object" + } + }, + "required": [ + "type", + "value" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "mitigate": { + "properties": { + "action": { + "type": "string", + "enum": [ + "block_legal_cwc" + ] + } + }, + "required": [ + "action" + ], + "type": "object" + }, + "src": { + "type": "string" + } + }, + "required": [ + "has", + "mitigate" + ], + "type": "object" + } + ] + }, + "statusCode": { + "type": "number" + }, + "createdAt": { + "type": "number" + }, + "caseId": { + "type": "string" + }, + "actor": { + "type": "string" + }, + "comment": { + "type": "string" + }, + "ineligibleForAppeal": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "isCascading": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "action", + "createdAt", + "route" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "interstitial": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "interstitialHistory": { + "items": { + "properties": { + "action": { + "type": "string", + "enum": [ + "add-deployment-interstitial", + "add-project-interstitial", + "remove-deployment-interstitial", + "remove-project-interstitial" + ] + }, + "createdAt": { + "type": "number" + }, + "caseId": { + "type": "string" + }, + "reason": { + "type": "string" + }, + "actor": { + "type": "string" + }, + "comment": { + "type": "string" + } + }, + "required": [ + "action", + "createdAt" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "history", + "updatedAt" + ], + "type": "object" + }, + "internalRoutes": { + "items": { + "oneOf": [ + { + "properties": { + "src": { + "type": "string" + }, + "status": { + "type": "number" + }, + "expiry": { + "type": "number" + } + }, + "required": [ + "src", + "status" + ], + "type": "object" + }, + { + "properties": { + "has": { + "items": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "header" + ] + }, + "key": { + "type": "string", + "enum": [ + "x-vercel-ip-country" + ] + }, + "value": { + "properties": { + "eq": { + "type": "string" + } + }, + "required": [ + "eq" + ], + "type": "object" + } + }, + "required": [ + "key", + "type", + "value" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "host" + ] + }, + "value": { + "properties": { + "eq": { + "type": "string" + } + }, + "required": [ + "eq" + ], + "type": "object" + } + }, + "required": [ + "type", + "value" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "mitigate": { + "properties": { + "action": { + "type": "string", + "enum": [ + "block_legal_cwc" + ] + } + }, + "required": [ + "action" + ], + "type": "object" + }, + "src": { + "type": "string" + } + }, + "required": [ + "has", + "mitigate" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "hasDeployments": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "dismissedToasts": { + "items": { + "properties": { + "key": { + "type": "string" + }, + "dismissedAt": { + "type": "number" + }, + "action": { + "type": "string", + "enum": [ + "accept", + "cancel", + "delete" + ] + }, + "value": { + "nullable": true, + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "properties": { + "previousValue": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + } + ] + }, + "currentValue": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + } + ] + } + }, + "required": [ + "currentValue", + "previousValue" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + } + ] + } + }, + "required": [ + "action", + "dismissedAt", + "key", + "value" + ], + "type": "object" + }, + "type": "array" + }, + "protectedSourcemaps": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "tracing": { + "properties": { + "domains": { + "type": "string" + }, + "ignorePaths": { + "items": { + "type": "string" + }, + "type": "array" + }, + "samplingRules": { + "items": { + "properties": { + "rate": { + "type": "number" + }, + "env": { + "type": "string", + "enum": [ + "preview", + "production" + ] + }, + "requestPath": { + "type": "string" + }, + "destination": { + "type": "string", + "enum": [ + "external", + "internal" + ], + "description": "Which tracing destination this rule applies to. `internal` is the hidden Vercel production-tracing drain (internal delivery); `external` is any customer-configured drain. Derived from the owning drain's delivery type when project tracing is computed; absent on configs persisted before this field existed." + } + }, + "required": [ + "rate" + ], + "type": "object" + }, + "type": "array" + } + }, + "type": "object" + }, + "avatar": { + "nullable": true, + "type": "string" + } + }, + "required": [ + "accountId", + "alias", + "defaultResourceConfig", + "deploymentExpiration", + "directoryListing", + "id", + "name", + "nodeVersion", + "resourceConfig" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "410": { + "description": "" + }, + "413": { + "description": "" + }, + "415": { + "description": "" + } + }, + "parameters": [ + { + "name": "idOrName", + "description": "The unique project identifier or the project name.", + "in": "path", + "required": true, + "schema": { + "description": "The unique project identifier or the project name.", + "type": "string" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/octet-stream": { + "schema": { + "type": "string", + "format": "binary" + } + } + } + } + } + }, + "/v1/projects/{idOrName}/shared-connect-links": { + "patch": { + "description": "Allows configuring Static IPs for a project", + "operationId": "updateStaticIps", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Configures Static IPs for a project", + "tags": [ + "networking", + "static-ips" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "items": { + "properties": { + "envId": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "string", + "enum": [ + "preview", + "production" + ] + } + ] + }, + "connectConfigurationId": { + "type": "string" + }, + "dc": { + "type": "string" + }, + "passive": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "buildsEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "aws": { + "properties": { + "subnetIds": { + "items": { + "type": "string" + }, + "type": "array" + }, + "securityGroupId": { + "type": "string" + } + }, + "required": [ + "subnetIds" + ], + "type": "object" + }, + "createdAt": { + "type": "number" + }, + "updatedAt": { + "type": "number" + } + }, + "required": [ + "buildsEnabled", + "connectConfigurationId", + "createdAt", + "envId", + "passive", + "updatedAt" + ], + "type": "object" + }, + "type": "array" + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid.\nOne of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "402": { + "description": "" + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "409": { + "description": "" + }, + "410": { + "description": "" + }, + "500": { + "description": "" + } + }, + "parameters": [ + { + "name": "idOrName", + "description": "The unique project identifier or the project name", + "in": "path", + "required": true, + "schema": { + "description": "The unique project identifier or the project name", + "type": "string" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "anyOf": [ + { + "required": [ + "builds" + ] + }, + { + "required": [ + "regions" + ] + } + ], + "properties": { + "builds": { + "type": "boolean", + "description": "Whether to use Static IPs for builds." + }, + "regions": { + "type": "array", + "items": { + "type": "string", + "maxLength": 4, + "description": "The region in which to enable Static IPs.", + "example": "iad1" + }, + "minItems": 0, + "maxItems": 3, + "uniqueItems": true + } + } + } + } + } + } + } + }, + "/v9/projects/{idOrName}/custom-environments": { + "post": { + "description": "Creates a custom environment for the current project. Cannot be named 'Production' or 'Preview'.", + "operationId": "createCustomEnvironment", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Create a custom environment for the current project.", + "tags": [ + "environment" + ], + "responses": { + "201": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "id": { + "type": "string", + "description": "Unique identifier for the custom environment (format: env_*)" + }, + "slug": { + "type": "string", + "description": "URL-friendly name of the environment" + }, + "type": { + "type": "string", + "enum": [ + "development", + "preview", + "production" + ], + "description": "The type of environment (production, preview, or development)" + }, + "description": { + "type": "string", + "description": "Optional description of the environment's purpose" + }, + "branchMatcher": { + "properties": { + "type": { + "type": "string", + "enum": [ + "endsWith", + "equals", + "startsWith" + ], + "description": "The type of matching to perform" + }, + "pattern": { + "type": "string", + "description": "The pattern to match against branch names" + } + }, + "required": [ + "pattern", + "type" + ], + "type": "object", + "description": "Configuration for matching git branches to this environment" + }, + "domains": { + "items": { + "properties": { + "name": { + "type": "string" + }, + "apexName": { + "type": "string" + }, + "projectId": { + "type": "string" + }, + "redirect": { + "nullable": true, + "type": "string" + }, + "redirectStatusCode": { + "nullable": true, + "type": "number", + "enum": [ + 301, + 302, + 307, + 308, + null + ] + }, + "gitBranch": { + "nullable": true, + "type": "string" + }, + "customEnvironmentId": { + "nullable": true, + "type": "string" + }, + "updatedAt": { + "type": "number" + }, + "createdAt": { + "type": "number" + }, + "verified": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "`true` if the domain is verified for use with the project. If `false` it will not be used as an alias on this project until the challenge in `verification` is completed." + }, + "verification": { + "items": { + "properties": { + "type": { + "type": "string" + }, + "domain": { + "type": "string" + }, + "value": { + "type": "string" + }, + "reason": { + "type": "string" + } + }, + "required": [ + "domain", + "reason", + "type", + "value" + ], + "type": "object", + "description": "A list of verification challenges, one of which must be completed to verify the domain for use on the project. After the challenge is complete `POST /projects/:idOrName/domains/:domain/verify` to verify the domain. Possible challenges: - If `verification.type = TXT` the `verification.domain` will be checked for a TXT record matching `verification.value`." + }, + "type": "array", + "description": "A list of verification challenges, one of which must be completed to verify the domain for use on the project. After the challenge is complete `POST /projects/:idOrName/domains/:domain/verify` to verify the domain. Possible challenges: - If `verification.type = TXT` the `verification.domain` will be checked for a TXT record matching `verification.value`." + } + }, + "required": [ + "apexName", + "name", + "projectId", + "verified" + ], + "type": "object", + "description": "List of domains associated with this environment" + }, + "type": "array", + "description": "List of domains associated with this environment" + }, + "currentDeploymentAliases": { + "items": { + "type": "string" + }, + "type": "array", + "description": "List of aliases for the current deployment" + }, + "createdAt": { + "type": "number", + "description": "Timestamp when the environment was created" + }, + "updatedAt": { + "type": "number", + "description": "Timestamp when the environment was last updated" + } + }, + "required": [ + "createdAt", + "id", + "slug", + "type", + "updatedAt" + ], + "type": "object", + "description": "Internal representation of a custom environment with all required properties" + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid.\nOne of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "402": { + "description": "The account is missing a payment so payment method must be updated" + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "410": { + "description": "" + }, + "500": { + "description": "" + } + }, + "parameters": [ + { + "name": "idOrName", + "description": "The unique project identifier or the project name", + "in": "path", + "required": true, + "schema": { + "description": "The unique project identifier or the project name", + "type": "string" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "slug": { + "description": "The slug of the custom environment to create.", + "type": "string", + "maxLength": 32 + }, + "description": { + "description": "Description of the custom environment. This is optional.", + "type": "string", + "maxLength": 256 + }, + "branchMatcher": { + "required": [ + "type", + "pattern" + ], + "description": "How we want to determine a matching branch. This is optional.", + "type": "object", + "properties": { + "type": { + "description": "Type of matcher. One of \"equals\", \"startsWith\", or \"endsWith\".", + "enum": [ + "equals", + "startsWith", + "endsWith" + ] + }, + "pattern": { + "description": "Git branch name or portion thereof.", + "type": "string", + "maxLength": 100 + } + } + }, + "copyEnvVarsFrom": { + "description": "Where to copy environment variables from. This is optional.", + "type": "string" + } + } + } + } + } + } + }, + "get": { + "description": "Retrieve custom environments for the project. Must not be named 'Production' or 'Preview'.", + "operationId": "getProjectsByIdOrNameCustomEnvironments", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Retrieve custom environments", + "tags": [ + "environment" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "accountLimit": { + "properties": { + "total": { + "type": "number" + } + }, + "required": [ + "total" + ], + "type": "object", + "description": "The maximum number of custom environments allowed either by the team's plan type or a custom override." + }, + "environments": { + "items": { + "properties": { + "type": { + "type": "string", + "enum": [ + "development", + "preview", + "production" + ], + "description": "The type of environment (production, preview, or development)" + }, + "description": { + "type": "string", + "description": "Optional description of the environment's purpose" + }, + "createdAt": { + "type": "number", + "description": "Timestamp when the environment was created" + }, + "updatedAt": { + "type": "number", + "description": "Timestamp when the environment was last updated" + }, + "slug": { + "type": "string", + "description": "URL-friendly name of the environment" + }, + "id": { + "type": "string", + "description": "Unique identifier for the custom environment (format: env_*)" + }, + "domains": { + "items": { + "properties": { + "name": { + "type": "string" + }, + "apexName": { + "type": "string" + }, + "projectId": { + "type": "string" + }, + "redirect": { + "nullable": true, + "type": "string" + }, + "redirectStatusCode": { + "nullable": true, + "type": "number", + "enum": [ + 301, + 302, + 307, + 308, + null + ] + }, + "gitBranch": { + "nullable": true, + "type": "string" + }, + "customEnvironmentId": { + "nullable": true, + "type": "string" + }, + "updatedAt": { + "type": "number" + }, + "createdAt": { + "type": "number" + }, + "verified": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "`true` if the domain is verified for use with the project. If `false` it will not be used as an alias on this project until the challenge in `verification` is completed." + }, + "verification": { + "items": { + "properties": { + "type": { + "type": "string" + }, + "domain": { + "type": "string" + }, + "value": { + "type": "string" + }, + "reason": { + "type": "string" + } + }, + "required": [ + "domain", + "reason", + "type", + "value" + ], + "type": "object", + "description": "A list of verification challenges, one of which must be completed to verify the domain for use on the project. After the challenge is complete `POST /projects/:idOrName/domains/:domain/verify` to verify the domain. Possible challenges: - If `verification.type = TXT` the `verification.domain` will be checked for a TXT record matching `verification.value`." + }, + "type": "array", + "description": "A list of verification challenges, one of which must be completed to verify the domain for use on the project. After the challenge is complete `POST /projects/:idOrName/domains/:domain/verify` to verify the domain. Possible challenges: - If `verification.type = TXT` the `verification.domain` will be checked for a TXT record matching `verification.value`." + } + }, + "required": [ + "apexName", + "name", + "projectId", + "verified" + ], + "type": "object", + "description": "List of domains associated with this environment" + }, + "type": "array", + "description": "List of domains associated with this environment" + }, + "branchMatcher": { + "properties": { + "type": { + "type": "string", + "enum": [ + "endsWith", + "equals", + "startsWith" + ], + "description": "The type of matching to perform" + }, + "pattern": { + "type": "string", + "description": "The pattern to match against branch names" + } + }, + "required": [ + "pattern", + "type" + ], + "type": "object", + "description": "Configuration for matching git branches to this environment" + }, + "currentDeploymentAliases": { + "items": { + "type": "string" + }, + "type": "array", + "description": "List of aliases for the current deployment" + } + }, + "required": [ + "createdAt", + "id", + "slug", + "type", + "updatedAt" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "accountLimit", + "environments" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "idOrName", + "description": "The unique project identifier or the project name", + "in": "path", + "required": true, + "schema": { + "description": "The unique project identifier or the project name", + "type": "string" + } + }, + { + "name": "gitBranch", + "description": "Fetch custom environments for a specific git branch", + "in": "query", + "required": false, + "schema": { + "description": "Fetch custom environments for a specific git branch", + "type": "string" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + } + }, + "/v9/projects/{idOrName}/custom-environments/{environmentSlugOrId}": { + "get": { + "description": "Retrieve a custom environment for the project. Must not be named 'Production' or 'Preview'.", + "operationId": "getCustomEnvironment", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Retrieve a custom environment", + "tags": [ + "environment" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "id": { + "type": "string", + "description": "Unique identifier for the custom environment (format: env_*)" + }, + "slug": { + "type": "string", + "description": "URL-friendly name of the environment" + }, + "type": { + "type": "string", + "enum": [ + "development", + "preview", + "production" + ], + "description": "The type of environment (production, preview, or development)" + }, + "description": { + "type": "string", + "description": "Optional description of the environment's purpose" + }, + "branchMatcher": { + "properties": { + "type": { + "type": "string", + "enum": [ + "endsWith", + "equals", + "startsWith" + ], + "description": "The type of matching to perform" + }, + "pattern": { + "type": "string", + "description": "The pattern to match against branch names" + } + }, + "required": [ + "pattern", + "type" + ], + "type": "object", + "description": "Configuration for matching git branches to this environment" + }, + "domains": { + "items": { + "properties": { + "name": { + "type": "string" + }, + "apexName": { + "type": "string" + }, + "projectId": { + "type": "string" + }, + "redirect": { + "nullable": true, + "type": "string" + }, + "redirectStatusCode": { + "nullable": true, + "type": "number", + "enum": [ + 301, + 302, + 307, + 308, + null + ] + }, + "gitBranch": { + "nullable": true, + "type": "string" + }, + "customEnvironmentId": { + "nullable": true, + "type": "string" + }, + "updatedAt": { + "type": "number" + }, + "createdAt": { + "type": "number" + }, + "verified": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "`true` if the domain is verified for use with the project. If `false` it will not be used as an alias on this project until the challenge in `verification` is completed." + }, + "verification": { + "items": { + "properties": { + "type": { + "type": "string" + }, + "domain": { + "type": "string" + }, + "value": { + "type": "string" + }, + "reason": { + "type": "string" + } + }, + "required": [ + "domain", + "reason", + "type", + "value" + ], + "type": "object", + "description": "A list of verification challenges, one of which must be completed to verify the domain for use on the project. After the challenge is complete `POST /projects/:idOrName/domains/:domain/verify` to verify the domain. Possible challenges: - If `verification.type = TXT` the `verification.domain` will be checked for a TXT record matching `verification.value`." + }, + "type": "array", + "description": "A list of verification challenges, one of which must be completed to verify the domain for use on the project. After the challenge is complete `POST /projects/:idOrName/domains/:domain/verify` to verify the domain. Possible challenges: - If `verification.type = TXT` the `verification.domain` will be checked for a TXT record matching `verification.value`." + } + }, + "required": [ + "apexName", + "name", + "projectId", + "verified" + ], + "type": "object", + "description": "List of domains associated with this environment" + }, + "type": "array", + "description": "List of domains associated with this environment" + }, + "currentDeploymentAliases": { + "items": { + "type": "string" + }, + "type": "array", + "description": "List of aliases for the current deployment" + }, + "createdAt": { + "type": "number", + "description": "Timestamp when the environment was created" + }, + "updatedAt": { + "type": "number", + "description": "Timestamp when the environment was last updated" + } + }, + "required": [ + "createdAt", + "id", + "slug", + "type", + "updatedAt" + ], + "type": "object", + "description": "Internal representation of a custom environment with all required properties" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "idOrName", + "description": "The unique project identifier or the project name", + "in": "path", + "required": true, + "schema": { + "description": "The unique project identifier or the project name", + "type": "string" + } + }, + { + "name": "environmentSlugOrId", + "description": "The unique custom environment identifier within the project", + "in": "path", + "required": true, + "schema": { + "description": "The unique custom environment identifier within the project", + "type": "string" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + }, + "patch": { + "description": "Update a custom environment for the project. Must not be named 'Production' or 'Preview'.", + "operationId": "updateCustomEnvironment", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Update a custom environment", + "tags": [ + "environment" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "id": { + "type": "string", + "description": "Unique identifier for the custom environment (format: env_*)" + }, + "slug": { + "type": "string", + "description": "URL-friendly name of the environment" + }, + "type": { + "type": "string", + "enum": [ + "development", + "preview", + "production" + ], + "description": "The type of environment (production, preview, or development)" + }, + "description": { + "type": "string", + "description": "Optional description of the environment's purpose" + }, + "branchMatcher": { + "properties": { + "type": { + "type": "string", + "enum": [ + "endsWith", + "equals", + "startsWith" + ], + "description": "The type of matching to perform" + }, + "pattern": { + "type": "string", + "description": "The pattern to match against branch names" + } + }, + "required": [ + "pattern", + "type" + ], + "type": "object", + "description": "Configuration for matching git branches to this environment" + }, + "domains": { + "items": { + "properties": { + "name": { + "type": "string" + }, + "apexName": { + "type": "string" + }, + "projectId": { + "type": "string" + }, + "redirect": { + "nullable": true, + "type": "string" + }, + "redirectStatusCode": { + "nullable": true, + "type": "number", + "enum": [ + 301, + 302, + 307, + 308, + null + ] + }, + "gitBranch": { + "nullable": true, + "type": "string" + }, + "customEnvironmentId": { + "nullable": true, + "type": "string" + }, + "updatedAt": { + "type": "number" + }, + "createdAt": { + "type": "number" + }, + "verified": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "`true` if the domain is verified for use with the project. If `false` it will not be used as an alias on this project until the challenge in `verification` is completed." + }, + "verification": { + "items": { + "properties": { + "type": { + "type": "string" + }, + "domain": { + "type": "string" + }, + "value": { + "type": "string" + }, + "reason": { + "type": "string" + } + }, + "required": [ + "domain", + "reason", + "type", + "value" + ], + "type": "object", + "description": "A list of verification challenges, one of which must be completed to verify the domain for use on the project. After the challenge is complete `POST /projects/:idOrName/domains/:domain/verify` to verify the domain. Possible challenges: - If `verification.type = TXT` the `verification.domain` will be checked for a TXT record matching `verification.value`." + }, + "type": "array", + "description": "A list of verification challenges, one of which must be completed to verify the domain for use on the project. After the challenge is complete `POST /projects/:idOrName/domains/:domain/verify` to verify the domain. Possible challenges: - If `verification.type = TXT` the `verification.domain` will be checked for a TXT record matching `verification.value`." + } + }, + "required": [ + "apexName", + "name", + "projectId", + "verified" + ], + "type": "object", + "description": "List of domains associated with this environment" + }, + "type": "array", + "description": "List of domains associated with this environment" + }, + "currentDeploymentAliases": { + "items": { + "type": "string" + }, + "type": "array", + "description": "List of aliases for the current deployment" + }, + "createdAt": { + "type": "number", + "description": "Timestamp when the environment was created" + }, + "updatedAt": { + "type": "number", + "description": "Timestamp when the environment was last updated" + } + }, + "required": [ + "createdAt", + "id", + "slug", + "type", + "updatedAt" + ], + "type": "object", + "description": "Internal representation of a custom environment with all required properties" + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid.\nOne of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "402": { + "description": "The account is missing a payment so payment method must be updated" + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "410": { + "description": "" + }, + "500": { + "description": "" + } + }, + "parameters": [ + { + "name": "idOrName", + "description": "The unique project identifier or the project name", + "in": "path", + "required": true, + "schema": { + "description": "The unique project identifier or the project name", + "type": "string" + } + }, + { + "name": "environmentSlugOrId", + "description": "The unique custom environment identifier within the project", + "in": "path", + "required": true, + "schema": { + "description": "The unique custom environment identifier within the project", + "type": "string" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "slug": { + "description": "The slug of the custom environment.", + "type": "string", + "maxLength": 32 + }, + "description": { + "description": "Description of the custom environment. This is optional.", + "type": "string", + "maxLength": 256 + }, + "branchMatcher": { + "required": [ + "type", + "pattern" + ], + "description": "How we want to determine a matching branch. This is optional.", + "type": "object", + "properties": { + "type": { + "description": "Type of matcher. One of \"equals\", \"startsWith\", or \"endsWith\".", + "enum": [ + "equals", + "startsWith", + "endsWith" + ] + }, + "pattern": { + "description": "Git branch name or portion thereof.", + "type": "string", + "maxLength": 100 + } + }, + "nullable": true + } + } + } + } + } + } + }, + "delete": { + "description": "Remove a custom environment for the project. Must not be named 'Production' or 'Preview'.", + "operationId": "removeCustomEnvironment", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Remove a custom environment", + "tags": [ + "environment" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "id": { + "type": "string", + "description": "Unique identifier for the custom environment (format: env_*)" + }, + "slug": { + "type": "string", + "description": "URL-friendly name of the environment" + }, + "type": { + "type": "string", + "enum": [ + "development", + "preview", + "production" + ], + "description": "The type of environment (production, preview, or development)" + }, + "description": { + "type": "string", + "description": "Optional description of the environment's purpose" + }, + "branchMatcher": { + "properties": { + "type": { + "type": "string", + "enum": [ + "endsWith", + "equals", + "startsWith" + ], + "description": "The type of matching to perform" + }, + "pattern": { + "type": "string", + "description": "The pattern to match against branch names" + } + }, + "required": [ + "pattern", + "type" + ], + "type": "object", + "description": "Configuration for matching git branches to this environment" + }, + "domains": { + "items": { + "properties": { + "name": { + "type": "string" + }, + "apexName": { + "type": "string" + }, + "projectId": { + "type": "string" + }, + "redirect": { + "nullable": true, + "type": "string" + }, + "redirectStatusCode": { + "nullable": true, + "type": "number", + "enum": [ + 301, + 302, + 307, + 308, + null + ] + }, + "gitBranch": { + "nullable": true, + "type": "string" + }, + "customEnvironmentId": { + "nullable": true, + "type": "string" + }, + "updatedAt": { + "type": "number" + }, + "createdAt": { + "type": "number" + }, + "verified": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "`true` if the domain is verified for use with the project. If `false` it will not be used as an alias on this project until the challenge in `verification` is completed." + }, + "verification": { + "items": { + "properties": { + "type": { + "type": "string" + }, + "domain": { + "type": "string" + }, + "value": { + "type": "string" + }, + "reason": { + "type": "string" + } + }, + "required": [ + "domain", + "reason", + "type", + "value" + ], + "type": "object", + "description": "A list of verification challenges, one of which must be completed to verify the domain for use on the project. After the challenge is complete `POST /projects/:idOrName/domains/:domain/verify` to verify the domain. Possible challenges: - If `verification.type = TXT` the `verification.domain` will be checked for a TXT record matching `verification.value`." + }, + "type": "array", + "description": "A list of verification challenges, one of which must be completed to verify the domain for use on the project. After the challenge is complete `POST /projects/:idOrName/domains/:domain/verify` to verify the domain. Possible challenges: - If `verification.type = TXT` the `verification.domain` will be checked for a TXT record matching `verification.value`." + } + }, + "required": [ + "apexName", + "name", + "projectId", + "verified" + ], + "type": "object", + "description": "List of domains associated with this environment" + }, + "type": "array", + "description": "List of domains associated with this environment" + }, + "currentDeploymentAliases": { + "items": { + "type": "string" + }, + "type": "array", + "description": "List of aliases for the current deployment" + }, + "createdAt": { + "type": "number", + "description": "Timestamp when the environment was created" + }, + "updatedAt": { + "type": "number", + "description": "Timestamp when the environment was last updated" + } + }, + "required": [ + "createdAt", + "id", + "slug", + "type", + "updatedAt" + ], + "type": "object", + "description": "Internal representation of a custom environment with all required properties" + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid.\nOne of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "idOrName", + "description": "The unique project identifier or the project name", + "in": "path", + "required": true, + "schema": { + "description": "The unique project identifier or the project name", + "type": "string" + } + }, + { + "name": "environmentSlugOrId", + "description": "The unique custom environment identifier within the project", + "in": "path", + "required": true, + "schema": { + "description": "The unique custom environment identifier within the project", + "type": "string" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "deleteUnassignedEnvironmentVariables": { + "description": "Delete Environment Variables that are not assigned to any environments.", + "type": "boolean" + } + } + } + } + } + } + } + }, + "/v9/projects/{idOrName}/domains": { + "get": { + "description": "Retrieve the domains associated with a given project by passing either the project `id` or `name` in the URL.", + "operationId": "getProjectDomains", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Retrieve project domains by project by id or name", + "tags": [ + "projects" + ], + "responses": { + "200": { + "description": "Successful response retrieving a list of domains", + "content": { + "application/json": { + "schema": { + "oneOf": [ + { + "properties": { + "domains": { + "items": { + "properties": { + "name": { + "type": "string" + }, + "apexName": { + "type": "string" + }, + "projectId": { + "type": "string" + }, + "redirect": { + "nullable": true, + "type": "string" + }, + "redirectStatusCode": { + "nullable": true, + "type": "number", + "enum": [ + 301, + 302, + 307, + 308, + null + ] + }, + "gitBranch": { + "nullable": true, + "type": "string" + }, + "customEnvironmentId": { + "nullable": true, + "type": "string" + }, + "updatedAt": { + "type": "number" + }, + "createdAt": { + "type": "number" + }, + "verified": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "`true` if the domain is verified for use with the project. If `false` it will not be used as an alias on this project until the challenge in `verification` is completed." + }, + "verification": { + "items": { + "properties": { + "type": { + "type": "string" + }, + "domain": { + "type": "string" + }, + "value": { + "type": "string" + }, + "reason": { + "type": "string" + } + }, + "required": [ + "domain", + "reason", + "type", + "value" + ], + "type": "object", + "description": "A list of verification challenges, one of which must be completed to verify the domain for use on the project. After the challenge is complete `POST /projects/:idOrName/domains/:domain/verify` to verify the domain. Possible challenges: - If `verification.type = TXT` the `verification.domain` will be checked for a TXT record matching `verification.value`." + }, + "type": "array", + "description": "A list of verification challenges, one of which must be completed to verify the domain for use on the project. After the challenge is complete `POST /projects/:idOrName/domains/:domain/verify` to verify the domain. Possible challenges: - If `verification.type = TXT` the `verification.domain` will be checked for a TXT record matching `verification.value`." + } + }, + "required": [ + "apexName", + "name", + "projectId", + "verified" + ], + "type": "object" + }, + "type": "array" + }, + "pagination": { + "properties": { + "count": { + "type": "number" + }, + "next": { + "nullable": true, + "type": "number" + }, + "prev": { + "nullable": true, + "type": "number" + } + }, + "required": [ + "count", + "next", + "prev" + ], + "type": "object" + } + }, + "required": [ + "domains", + "pagination" + ], + "type": "object" + }, + { + "properties": { + "domains": { + "items": { + "properties": { + "name": { + "type": "string" + }, + "apexName": { + "type": "string" + }, + "projectId": { + "type": "string" + }, + "redirect": { + "nullable": true, + "type": "string" + }, + "redirectStatusCode": { + "nullable": true, + "type": "number", + "enum": [ + 301, + 302, + 307, + 308, + null + ] + }, + "gitBranch": { + "nullable": true, + "type": "string" + }, + "customEnvironmentId": { + "nullable": true, + "type": "string" + }, + "updatedAt": { + "type": "number" + }, + "createdAt": { + "type": "number" + }, + "verified": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "`true` if the domain is verified for use with the project. If `false` it will not be used as an alias on this project until the challenge in `verification` is completed." + }, + "verification": { + "items": { + "properties": { + "type": { + "type": "string" + }, + "domain": { + "type": "string" + }, + "value": { + "type": "string" + }, + "reason": { + "type": "string" + } + }, + "required": [ + "domain", + "reason", + "type", + "value" + ], + "type": "object", + "description": "A list of verification challenges, one of which must be completed to verify the domain for use on the project. After the challenge is complete `POST /projects/:idOrName/domains/:domain/verify` to verify the domain. Possible challenges: - If `verification.type = TXT` the `verification.domain` will be checked for a TXT record matching `verification.value`." + }, + "type": "array", + "description": "A list of verification challenges, one of which must be completed to verify the domain for use on the project. After the challenge is complete `POST /projects/:idOrName/domains/:domain/verify` to verify the domain. Possible challenges: - If `verification.type = TXT` the `verification.domain` will be checked for a TXT record matching `verification.value`." + } + }, + "required": [ + "apexName", + "name", + "projectId", + "verified" + ], + "type": "object" + }, + "type": "array" + }, + "pagination": { + "$ref": "#/components/schemas/Pagination" + } + }, + "required": [ + "domains", + "pagination" + ], + "type": "object" + } + ] + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "idOrName", + "description": "The unique project identifier or the project name", + "in": "path", + "required": true, + "schema": { + "description": "The unique project identifier or the project name", + "oneOf": [ + { + "type": "string" + } + ] + } + }, + { + "name": "production", + "description": "Filters only production domains when set to `true`.", + "in": "query", + "required": false, + "schema": { + "default": "false", + "description": "Filters only production domains when set to `true`.", + "enum": [ + "true", + "false" + ] + } + }, + { + "name": "target", + "description": "Filters on the target of the domain. Can be either \"production\", \"preview\"", + "in": "query", + "required": false, + "schema": { + "description": "Filters on the target of the domain. Can be either \"production\", \"preview\"", + "enum": [ + "production", + "preview" + ], + "type": "string" + } + }, + { + "name": "customEnvironmentId", + "description": "The unique custom environment identifier within the project", + "in": "query", + "required": false, + "schema": { + "description": "The unique custom environment identifier within the project", + "type": "string", + "example": "env_123abc4567" + } + }, + { + "name": "gitBranch", + "description": "Filters domains based on specific branch.", + "in": "query", + "required": false, + "schema": { + "description": "Filters domains based on specific branch.", + "type": "string" + } + }, + { + "name": "redirects", + "description": "Excludes redirect project domains when \"false\". Includes redirect project domains when \"true\" (default).", + "in": "query", + "required": false, + "schema": { + "default": "true", + "description": "Excludes redirect project domains when \"false\". Includes redirect project domains when \"true\" (default).", + "enum": [ + "true", + "false" + ] + } + }, + { + "name": "redirect", + "description": "Filters domains based on their redirect target.", + "in": "query", + "required": false, + "schema": { + "description": "Filters domains based on their redirect target.", + "type": "string", + "example": "example.com" + } + }, + { + "name": "verified", + "description": "Filters domains based on their verification status.", + "in": "query", + "required": false, + "schema": { + "description": "Filters domains based on their verification status.", + "enum": [ + "true", + "false" + ] + } + }, + { + "name": "limit", + "description": "Maximum number of domains to list from a request (max 100).", + "in": "query", + "required": false, + "schema": { + "description": "Maximum number of domains to list from a request (max 100).", + "type": "number", + "example": 20 + } + }, + { + "name": "since", + "description": "Get domains created after this JavaScript timestamp.", + "in": "query", + "required": false, + "schema": { + "description": "Get domains created after this JavaScript timestamp.", + "type": "number", + "example": 1609499532000 + } + }, + { + "name": "until", + "description": "Get domains created before this JavaScript timestamp.", + "in": "query", + "required": false, + "schema": { + "description": "Get domains created before this JavaScript timestamp.", + "type": "number", + "example": 1612264332000 + } + }, + { + "name": "order", + "description": "Domains sort order by createdAt", + "in": "query", + "required": false, + "schema": { + "default": "DESC", + "description": "Domains sort order by createdAt", + "enum": [ + "ASC", + "DESC" + ] + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + } + }, + "/v9/projects/{idOrName}/domains/{domain}": { + "get": { + "description": "Get project domain by project id/name and domain name.", + "operationId": "getProjectDomain", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Get a project domain", + "tags": [ + "projects" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "name": { + "type": "string" + }, + "apexName": { + "type": "string" + }, + "projectId": { + "type": "string" + }, + "redirect": { + "nullable": true, + "type": "string" + }, + "redirectStatusCode": { + "nullable": true, + "type": "number", + "enum": [ + 301, + 302, + 307, + 308, + null + ] + }, + "gitBranch": { + "nullable": true, + "type": "string" + }, + "customEnvironmentId": { + "nullable": true, + "type": "string" + }, + "updatedAt": { + "type": "number" + }, + "createdAt": { + "type": "number" + }, + "verified": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "`true` if the domain is verified for use with the project. If `false` it will not be used as an alias on this project until the challenge in `verification` is completed." + }, + "verification": { + "items": { + "properties": { + "type": { + "type": "string" + }, + "domain": { + "type": "string" + }, + "value": { + "type": "string" + }, + "reason": { + "type": "string" + } + }, + "required": [ + "domain", + "reason", + "type", + "value" + ], + "type": "object", + "description": "A list of verification challenges, one of which must be completed to verify the domain for use on the project. After the challenge is complete `POST /projects/:idOrName/domains/:domain/verify` to verify the domain. Possible challenges: - If `verification.type = TXT` the `verification.domain` will be checked for a TXT record matching `verification.value`." + }, + "type": "array", + "description": "A list of verification challenges, one of which must be completed to verify the domain for use on the project. After the challenge is complete `POST /projects/:idOrName/domains/:domain/verify` to verify the domain. Possible challenges: - If `verification.type = TXT` the `verification.domain` will be checked for a TXT record matching `verification.value`." + } + }, + "required": [ + "apexName", + "name", + "projectId", + "verified" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "idOrName", + "description": "The unique project identifier or the project name", + "in": "path", + "required": true, + "schema": { + "description": "The unique project identifier or the project name", + "type": "string" + } + }, + { + "name": "domain", + "description": "The project domain name", + "in": "path", + "required": true, + "schema": { + "description": "The project domain name", + "type": "string", + "example": "www.example.com" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + }, + "patch": { + "description": "Update a project domain's configuration, including the name, git branch and redirect of the domain.", + "operationId": "updateProjectDomain", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Update a project domain", + "tags": [ + "projects" + ], + "responses": { + "200": { + "description": "The domain was updated successfuly", + "content": { + "application/json": { + "schema": { + "properties": { + "name": { + "type": "string" + }, + "apexName": { + "type": "string" + }, + "projectId": { + "type": "string" + }, + "redirect": { + "nullable": true, + "type": "string" + }, + "redirectStatusCode": { + "nullable": true, + "type": "number", + "enum": [ + 301, + 302, + 307, + 308, + null + ] + }, + "gitBranch": { + "nullable": true, + "type": "string" + }, + "customEnvironmentId": { + "nullable": true, + "type": "string" + }, + "updatedAt": { + "type": "number" + }, + "createdAt": { + "type": "number" + }, + "verified": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "`true` if the domain is verified for use with the project. If `false` it will not be used as an alias on this project until the challenge in `verification` is completed." + }, + "verification": { + "items": { + "properties": { + "type": { + "type": "string" + }, + "domain": { + "type": "string" + }, + "value": { + "type": "string" + }, + "reason": { + "type": "string" + } + }, + "required": [ + "domain", + "reason", + "type", + "value" + ], + "type": "object", + "description": "A list of verification challenges, one of which must be completed to verify the domain for use on the project. After the challenge is complete `POST /projects/:idOrName/domains/:domain/verify` to verify the domain. Possible challenges: - If `verification.type = TXT` the `verification.domain` will be checked for a TXT record matching `verification.value`." + }, + "type": "array", + "description": "A list of verification challenges, one of which must be completed to verify the domain for use on the project. After the challenge is complete `POST /projects/:idOrName/domains/:domain/verify` to verify the domain. Possible challenges: - If `verification.type = TXT` the `verification.domain` will be checked for a TXT record matching `verification.value`." + } + }, + "required": [ + "apexName", + "name", + "projectId", + "verified" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid.\nOne of the provided values in the request query is invalid.\nThe domain redirect is not valid" + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "409": { + "description": "The project is currently being transferred" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "idOrName", + "description": "The unique project identifier or the project name", + "in": "path", + "required": true, + "schema": { + "description": "The unique project identifier or the project name", + "type": "string" + } + }, + { + "name": "domain", + "description": "The project domain name", + "in": "path", + "required": true, + "schema": { + "description": "The project domain name", + "type": "string", + "example": "www.example.com" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "gitBranch": { + "description": "Git branch to link the project domain", + "example": null, + "type": "string", + "maxLength": 250, + "nullable": true + }, + "redirect": { + "description": "Target destination domain for redirect", + "example": "foobar.com", + "type": "string", + "nullable": true + }, + "redirectStatusCode": { + "description": "Status code for domain redirect", + "example": 307, + "type": "integer", + "enum": [ + null, + 301, + 302, + 307, + 308 + ], + "nullable": true + } + }, + "type": "object" + } + } + }, + "required": true + } + }, + "delete": { + "description": "Remove a domain from a project by passing the domain name and by specifying the project by either passing the project `id` or `name` in the URL.", + "operationId": "removeProjectDomain", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Remove a domain from a project", + "tags": [ + "projects" + ], + "responses": { + "200": { + "description": "The domain was succesfully removed from the project", + "content": { + "application/json": { + "schema": { + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid.\nOne of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "409": { + "description": "The project is currently being transferred" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "idOrName", + "description": "The unique project identifier or the project name", + "in": "path", + "required": true, + "schema": { + "description": "The unique project identifier or the project name", + "type": "string" + } + }, + { + "name": "domain", + "description": "The project domain name", + "in": "path", + "required": true, + "schema": { + "description": "The project domain name", + "type": "string", + "example": "www.example.com" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "removeRedirects": { + "type": "boolean", + "description": "Whether to remove all domains from this project that redirect to the domain being removed." + } + } + } + } + } + } + } + }, + "/v10/projects/{idOrName}/domains": { + "post": { + "description": "Add a domain to the project by passing its domain name and by specifying the project by either passing the project `id` or `name` in the URL. If the domain is not yet verified to be used on this project, the request will return `verified = false`, and the domain will need to be verified according to the `verification` challenge via `POST /projects/:idOrName/domains/:domain/verify`. If the domain already exists on the project, the request will fail with a `400` status code.", + "operationId": "addProjectDomain", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Add a domain to a project", + "tags": [ + "projects" + ], + "responses": { + "200": { + "description": "The domain was successfully added to the project", + "content": { + "application/json": { + "schema": { + "properties": { + "name": { + "type": "string" + }, + "apexName": { + "type": "string" + }, + "projectId": { + "type": "string" + }, + "redirect": { + "nullable": true, + "type": "string" + }, + "redirectStatusCode": { + "nullable": true, + "type": "number", + "enum": [ + 301, + 302, + 307, + 308, + null + ] + }, + "gitBranch": { + "nullable": true, + "type": "string" + }, + "customEnvironmentId": { + "nullable": true, + "type": "string" + }, + "updatedAt": { + "type": "number" + }, + "createdAt": { + "type": "number" + }, + "verified": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "`true` if the domain is verified for use with the project. If `false` it will not be used as an alias on this project until the challenge in `verification` is completed." + }, + "verification": { + "items": { + "properties": { + "type": { + "type": "string" + }, + "domain": { + "type": "string" + }, + "value": { + "type": "string" + }, + "reason": { + "type": "string" + } + }, + "required": [ + "domain", + "reason", + "type", + "value" + ], + "type": "object", + "description": "A list of verification challenges, one of which must be completed to verify the domain for use on the project. After the challenge is complete `POST /projects/:idOrName/domains/:domain/verify` to verify the domain. Possible challenges: - If `verification.type = TXT` the `verification.domain` will be checked for a TXT record matching `verification.value`." + }, + "type": "array", + "description": "A list of verification challenges, one of which must be completed to verify the domain for use on the project. After the challenge is complete `POST /projects/:idOrName/domains/:domain/verify` to verify the domain. Possible challenges: - If `verification.type = TXT` the `verification.domain` will be checked for a TXT record matching `verification.value`." + } + }, + "required": [ + "apexName", + "name", + "projectId", + "verified" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid.\nOne of the provided values in the request query is invalid.\nThe domain is not valid\nYou can't set both a git branch and a redirect for the domain\nThe domain can not be added because the latest production deployment for the project was not successful\nThe domain redirect is not valid\nA domain cannot redirect to itself\nYou can not set the production branch as a branch for your domain" + }, + "401": { + "description": "The request is not authorized." + }, + "402": { + "description": "The account is missing a payment so payment method must be updated" + }, + "403": { + "description": "You do not have permission to access this resource.\nYou don't have access to the domain you are adding" + }, + "409": { + "description": "The domain is already assigned to another Vercel project\nCannot create project domain since owner already has `domain` on their account, but it's not verified yet.\nCannot create project domain since owner already has `domain` on their account, and it's verified.\nThe domain is not allowed to be used\nThe project is currently being transferred" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "idOrName", + "description": "The unique project identifier or the project name", + "in": "path", + "required": true, + "schema": { + "description": "The unique project identifier or the project name", + "type": "string" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "name": { + "description": "The project domain name", + "example": "www.example.com", + "type": "string" + }, + "gitBranch": { + "description": "Git branch to link the project domain", + "example": null, + "maxLength": 250, + "type": "string", + "nullable": true + }, + "customEnvironmentId": { + "description": "The unique custom environment identifier within the project", + "type": "string" + }, + "redirect": { + "description": "Target destination domain for redirect", + "example": "foobar.com", + "type": "string", + "nullable": true + }, + "redirectStatusCode": { + "description": "Status code for domain redirect", + "example": 307, + "type": "integer", + "enum": [ + null, + 301, + 302, + 307, + 308 + ], + "nullable": true + } + }, + "required": [ + "name" + ], + "type": "object" + } + } + }, + "required": true + } + } + }, + "/v1/projects/{idOrName}/domains/{domain}/move": { + "post": { + "description": "Move one project's domain to another project. Also allows the move of all redirects pointed to that domain in the same project.", + "operationId": "moveProjectDomain", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Move a project domain", + "tags": [ + "projects" + ], + "responses": { + "200": { + "description": "The domain was updated successfuly", + "content": { + "application/json": { + "schema": { + "properties": { + "name": { + "type": "string" + }, + "apexName": { + "type": "string" + }, + "projectId": { + "type": "string" + }, + "redirect": { + "nullable": true, + "type": "string" + }, + "redirectStatusCode": { + "nullable": true, + "type": "number", + "enum": [ + 301, + 302, + 307, + 308, + null + ] + }, + "gitBranch": { + "nullable": true, + "type": "string" + }, + "customEnvironmentId": { + "nullable": true, + "type": "string" + }, + "updatedAt": { + "type": "number" + }, + "createdAt": { + "type": "number" + }, + "verified": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "`true` if the domain is verified for use with the project. If `false` it will not be used as an alias on this project until the challenge in `verification` is completed." + }, + "verification": { + "items": { + "properties": { + "type": { + "type": "string" + }, + "domain": { + "type": "string" + }, + "value": { + "type": "string" + }, + "reason": { + "type": "string" + } + }, + "required": [ + "domain", + "reason", + "type", + "value" + ], + "type": "object", + "description": "A list of verification challenges, one of which must be completed to verify the domain for use on the project. After the challenge is complete `POST /projects/:idOrName/domains/:domain/verify` to verify the domain. Possible challenges: - If `verification.type = TXT` the `verification.domain` will be checked for a TXT record matching `verification.value`." + }, + "type": "array", + "description": "A list of verification challenges, one of which must be completed to verify the domain for use on the project. After the challenge is complete `POST /projects/:idOrName/domains/:domain/verify` to verify the domain. Possible challenges: - If `verification.type = TXT` the `verification.domain` will be checked for a TXT record matching `verification.value`." + } + }, + "required": [ + "apexName", + "name", + "projectId", + "verified" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid.\nOne of the provided values in the request query is invalid.\nThe domain redirect is not valid" + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "409": { + "description": "The project is currently being transferred" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "idOrName", + "description": "The unique project identifier or the project name", + "in": "path", + "required": true, + "schema": { + "description": "The unique project identifier or the project name", + "type": "string" + } + }, + { + "name": "domain", + "description": "The project domain name", + "in": "path", + "required": true, + "schema": { + "description": "The project domain name", + "type": "string", + "example": "www.example.com" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "required": [ + "projectId" + ], + "properties": { + "projectId": { + "description": "The unique target project identifier", + "example": "prj_XLKmu1DyR1eY7zq8UgeRKbA7yVLA", + "oneOf": [ + { + "type": "string" + } + ] + }, + "gitBranch": { + "description": "Git branch to link the project domain", + "example": null, + "type": "string", + "maxLength": 250, + "nullable": true + }, + "redirect": { + "description": "Target destination domain for redirect", + "example": "foobar.com", + "type": "string", + "nullable": true + }, + "redirectStatusCode": { + "description": "Status code for domain redirect", + "example": 307, + "type": "integer", + "enum": [ + null, + 301, + 302, + 307, + 308 + ], + "nullable": true + } + }, + "type": "object" + } + } + } + } + } + }, + "/v9/projects/{idOrName}/domains/{domain}/verify": { + "post": { + "description": "Attempts to verify a project domain with `verified = false` by checking the correctness of the project domain's `verification` challenge.", + "operationId": "verifyProjectDomain", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Verify project domain", + "tags": [ + "projects" + ], + "responses": { + "200": { + "description": "The project domain was verified successfully\nDomain is already verified", + "content": { + "application/json": { + "schema": { + "properties": { + "name": { + "type": "string" + }, + "apexName": { + "type": "string" + }, + "projectId": { + "type": "string" + }, + "redirect": { + "nullable": true, + "type": "string" + }, + "redirectStatusCode": { + "nullable": true, + "type": "number", + "enum": [ + 301, + 302, + 307, + 308, + null + ] + }, + "gitBranch": { + "nullable": true, + "type": "string" + }, + "customEnvironmentId": { + "nullable": true, + "type": "string" + }, + "updatedAt": { + "type": "number" + }, + "createdAt": { + "type": "number" + }, + "verified": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "`true` if the domain is verified for use with the project. If `false` it will not be used as an alias on this project until the challenge in `verification` is completed." + } + }, + "required": [ + "apexName", + "name", + "projectId", + "verified" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid.\nThere is an existing TXT record on the domain verifying it for another project\nThe domain does not have a TXT record that attempts to verify the project domain\nThe TXT record on the domain does not match the expected challenge for the project domain\nProject domain is not assigned to project" + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "idOrName", + "description": "The unique project identifier or the project name", + "in": "path", + "required": true, + "schema": { + "example": "prj_12HKQaOmR5t5Uy6vdcQsNIiZgHGB", + "description": "The unique project identifier or the project name", + "type": "string" + } + }, + { + "name": "domain", + "description": "The domain name you want to verify", + "in": "path", + "required": true, + "schema": { + "description": "The domain name you want to verify", + "type": "string", + "example": "example.com" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + } + }, + "/v10/projects/{idOrName}/env": { + "get": { + "description": "Retrieve the environment variables for a given project by passing either the project `id` or `name` in the URL.", + "operationId": "filterProjectEnvs", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Retrieve the environment variables of a project by id or name", + "tags": [ + "projects" + ], + "responses": { + "200": { + "description": "The list of environment variables for the given project", + "content": { + "application/json": { + "schema": { + "oneOf": [ + { + "properties": { + "securityIssues": { + "items": { + "type": "string", + "enum": [ + "flags-secret-needs-split", + "readable-secret" + ] + }, + "type": "array" + }, + "type": { + "type": "string", + "enum": [ + "encrypted", + "plain", + "secret", + "sensitive", + "system" + ] + }, + "value": { + "type": "string" + }, + "edgeConfigId": { + "nullable": true, + "type": "string" + }, + "edgeConfigTokenId": { + "nullable": true, + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "updatedAt": { + "type": "number" + }, + "system": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "id": { + "type": "string" + }, + "key": { + "type": "string" + }, + "target": { + "oneOf": [ + { + "items": { + "type": "string", + "enum": [ + "development", + "development", + "preview", + "preview", + "production" + ] + }, + "type": "array" + }, + { + "type": "string", + "enum": [ + "development", + "development", + "preview", + "preview", + "production" + ] + } + ] + }, + "gitBranch": { + "type": "string" + }, + "createdBy": { + "nullable": true, + "type": "string" + }, + "updatedBy": { + "nullable": true, + "type": "string" + }, + "sunsetSecretId": { + "type": "string", + "description": "This is used to identify variables that have been migrated from type secret to sensitive." + }, + "legacyValue": { + "type": "string", + "description": "Legacy now-encryption ciphertext, present after migration swaps value/vsmValue" + }, + "decrypted": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "configurationId": { + "nullable": true, + "type": "string" + }, + "visibility": { + "type": "string", + "enum": [ + "config", + "secret" + ], + "description": "User-facing config/secret model. When set, authoritative for new code paths when the env-var-config-secret-ui flag is enabled. Legacy rows omit this field; legacy rows omit it and callers fall back to existing `type` behavior." + }, + "contentHint": { + "nullable": true, + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "redis-url" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "redis-rest-api-url" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "redis-rest-api-token" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "redis-rest-api-read-only-token" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "blob-read-write-token" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "blob-store-id" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "blob-webhook-public-key" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-url" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-url-non-pooling" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-prisma-url" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-user" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-host" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-password" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-database" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-url-no-ssl" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "integration-store-secret" + ] + }, + "storeId": { + "type": "string" + }, + "integrationId": { + "type": "string" + }, + "integrationProductId": { + "type": "string" + }, + "integrationConfigurationId": { + "type": "string" + } + }, + "required": [ + "integrationConfigurationId", + "integrationId", + "integrationProductId", + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "flags-connection-string" + ] + }, + "projectId": { + "type": "string" + } + }, + "required": [ + "projectId", + "type" + ], + "type": "object" + } + ] + }, + "internalContentHint": { + "nullable": true, + "properties": { + "type": { + "type": "string", + "enum": [ + "flags-secret" + ] + }, + "encryptedValue": { + "type": "string", + "description": "Contains the `value` of the env variable, encrypted with a special key to make decryption possible in the subscriber Lambda." + } + }, + "required": [ + "encryptedValue", + "type" + ], + "type": "object", + "description": "Similar to `contentHints`, but should not be exposed to the user." + }, + "comment": { + "type": "string" + }, + "customEnvironmentIds": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "key", + "securityIssues", + "type", + "value" + ], + "type": "object" + }, + { + "properties": { + "envs": { + "items": { + "properties": { + "securityIssues": { + "items": { + "type": "string", + "enum": [ + "flags-secret-needs-split", + "readable-secret" + ] + }, + "type": "array" + }, + "type": { + "type": "string", + "enum": [ + "encrypted", + "plain", + "secret", + "sensitive", + "system" + ] + }, + "value": { + "type": "string" + }, + "edgeConfigId": { + "nullable": true, + "type": "string" + }, + "edgeConfigTokenId": { + "nullable": true, + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "updatedAt": { + "type": "number" + }, + "system": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "id": { + "type": "string" + }, + "key": { + "type": "string" + }, + "target": { + "oneOf": [ + { + "items": { + "type": "string", + "enum": [ + "development", + "development", + "preview", + "preview", + "production" + ] + }, + "type": "array" + }, + { + "type": "string", + "enum": [ + "development", + "development", + "preview", + "preview", + "production" + ] + } + ] + }, + "gitBranch": { + "type": "string" + }, + "createdBy": { + "nullable": true, + "type": "string" + }, + "updatedBy": { + "nullable": true, + "type": "string" + }, + "sunsetSecretId": { + "type": "string", + "description": "This is used to identify variables that have been migrated from type secret to sensitive." + }, + "legacyValue": { + "type": "string", + "description": "Legacy now-encryption ciphertext, present after migration swaps value/vsmValue" + }, + "decrypted": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "configurationId": { + "nullable": true, + "type": "string" + }, + "visibility": { + "type": "string", + "enum": [ + "config", + "secret" + ], + "description": "User-facing config/secret model. When set, authoritative for new code paths when the env-var-config-secret-ui flag is enabled. Legacy rows omit this field; legacy rows omit it and callers fall back to existing `type` behavior." + }, + "contentHint": { + "nullable": true, + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "redis-url" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "redis-rest-api-url" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "redis-rest-api-token" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "redis-rest-api-read-only-token" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "blob-read-write-token" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "blob-store-id" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "blob-webhook-public-key" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-url" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-url-non-pooling" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-prisma-url" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-user" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-host" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-password" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-database" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-url-no-ssl" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "integration-store-secret" + ] + }, + "storeId": { + "type": "string" + }, + "integrationId": { + "type": "string" + }, + "integrationProductId": { + "type": "string" + }, + "integrationConfigurationId": { + "type": "string" + } + }, + "required": [ + "integrationConfigurationId", + "integrationId", + "integrationProductId", + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "flags-connection-string" + ] + }, + "projectId": { + "type": "string" + } + }, + "required": [ + "projectId", + "type" + ], + "type": "object" + } + ] + }, + "internalContentHint": { + "nullable": true, + "properties": { + "type": { + "type": "string", + "enum": [ + "flags-secret" + ] + }, + "encryptedValue": { + "type": "string", + "description": "Contains the `value` of the env variable, encrypted with a special key to make decryption possible in the subscriber Lambda." + } + }, + "required": [ + "encryptedValue", + "type" + ], + "type": "object", + "description": "Similar to `contentHints`, but should not be exposed to the user." + }, + "comment": { + "type": "string" + }, + "customEnvironmentIds": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "key", + "securityIssues", + "type", + "value" + ], + "type": "object" + }, + "type": "array" + }, + "pagination": { + "$ref": "#/components/schemas/Pagination" + } + }, + "required": [ + "envs", + "pagination" + ], + "type": "object" + }, + { + "properties": { + "envs": { + "items": { + "properties": { + "securityIssues": { + "items": { + "type": "string", + "enum": [ + "flags-secret-needs-split", + "readable-secret" + ] + }, + "type": "array" + }, + "type": { + "type": "string", + "enum": [ + "encrypted", + "plain", + "secret", + "sensitive", + "system" + ] + }, + "value": { + "type": "string" + }, + "edgeConfigId": { + "nullable": true, + "type": "string" + }, + "edgeConfigTokenId": { + "nullable": true, + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "updatedAt": { + "type": "number" + }, + "system": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "id": { + "type": "string" + }, + "key": { + "type": "string" + }, + "target": { + "oneOf": [ + { + "items": { + "type": "string", + "enum": [ + "development", + "development", + "preview", + "preview", + "production" + ] + }, + "type": "array" + }, + { + "type": "string", + "enum": [ + "development", + "development", + "preview", + "preview", + "production" + ] + } + ] + }, + "gitBranch": { + "type": "string" + }, + "createdBy": { + "nullable": true, + "type": "string" + }, + "updatedBy": { + "nullable": true, + "type": "string" + }, + "sunsetSecretId": { + "type": "string", + "description": "This is used to identify variables that have been migrated from type secret to sensitive." + }, + "legacyValue": { + "type": "string", + "description": "Legacy now-encryption ciphertext, present after migration swaps value/vsmValue" + }, + "decrypted": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "configurationId": { + "nullable": true, + "type": "string" + }, + "visibility": { + "type": "string", + "enum": [ + "config", + "secret" + ], + "description": "User-facing config/secret model. When set, authoritative for new code paths when the env-var-config-secret-ui flag is enabled. Legacy rows omit this field; legacy rows omit it and callers fall back to existing `type` behavior." + }, + "contentHint": { + "nullable": true, + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "redis-url" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "redis-rest-api-url" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "redis-rest-api-token" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "redis-rest-api-read-only-token" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "blob-read-write-token" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "blob-store-id" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "blob-webhook-public-key" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-url" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-url-non-pooling" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-prisma-url" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-user" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-host" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-password" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-database" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-url-no-ssl" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "integration-store-secret" + ] + }, + "storeId": { + "type": "string" + }, + "integrationId": { + "type": "string" + }, + "integrationProductId": { + "type": "string" + }, + "integrationConfigurationId": { + "type": "string" + } + }, + "required": [ + "integrationConfigurationId", + "integrationId", + "integrationProductId", + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "flags-connection-string" + ] + }, + "projectId": { + "type": "string" + } + }, + "required": [ + "projectId", + "type" + ], + "type": "object" + } + ] + }, + "internalContentHint": { + "nullable": true, + "properties": { + "type": { + "type": "string", + "enum": [ + "flags-secret" + ] + }, + "encryptedValue": { + "type": "string", + "description": "Contains the `value` of the env variable, encrypted with a special key to make decryption possible in the subscriber Lambda." + } + }, + "required": [ + "encryptedValue", + "type" + ], + "type": "object", + "description": "Similar to `contentHints`, but should not be exposed to the user." + }, + "comment": { + "type": "string" + }, + "customEnvironmentIds": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "key", + "securityIssues", + "type", + "value" + ], + "type": "object" + }, + "type": "array" + }, + "hiddenProductionEnvCount": { + "type": "number" + } + }, + "required": [ + "envs", + "hiddenProductionEnvCount" + ], + "type": "object", + "description": "The list of environment variables for the given project" + } + ] + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "410": { + "description": "" + } + }, + "x-vercel-cli": { + "supportedSubcommands": true, + "supportedProduction": false, + "aliases": [ + "ls", + "list" + ] + }, + "parameters": [ + { + "name": "idOrName", + "description": "The unique project identifier or the project name", + "in": "path", + "required": true, + "schema": { + "description": "The unique project identifier or the project name", + "type": "string", + "example": "prj_XLKmu1DyR1eY7zq8UgeRKbA7yVLA" + }, + "x-vercel-cli": { + "kind": "argument" + } + }, + { + "name": "gitBranch", + "description": "If defined, the git branch of the environment variable to filter the results (must have target=preview)", + "in": "query", + "required": false, + "schema": { + "description": "If defined, the git branch of the environment variable to filter the results (must have target=preview)", + "type": "string", + "maxLength": 250, + "example": "feature-1" + } + }, + { + "name": "decrypt", + "description": "If true, the environment variable value will be decrypted", + "in": "query", + "required": false, + "schema": { + "description": "If true, the environment variable value will be decrypted", + "type": "string", + "enum": [ + "true", + "false" + ], + "example": "true", + "deprecated": true + } + }, + { + "name": "source", + "description": "The source that is calling the endpoint.", + "in": "query", + "required": false, + "schema": { + "description": "The source that is calling the endpoint.", + "type": "string", + "example": "vercel-cli:pull" + } + }, + { + "name": "customEnvironmentId", + "description": "The unique custom environment identifier within the project", + "in": "query", + "required": false, + "schema": { + "type": "string", + "description": "The unique custom environment identifier within the project", + "example": "env_123abc4567" + } + }, + { + "name": "customEnvironmentSlug", + "description": "The custom environment slug (name) within the project", + "in": "query", + "required": false, + "schema": { + "type": "string", + "description": "The custom environment slug (name) within the project", + "example": "my-custom-env" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "x-speakeasy-test": false + }, + "post": { + "description": "Create one or more environment variables for a project by passing its `key`, `value`, `type` and `target` and by specifying the project by either passing the project `id` or `name` in the URL. If you include `upsert=true` as a query parameter, a new environment variable will not be created if it already exists but, the existing variable's value will be updated.", + "operationId": "createProjectEnv", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Create one or more environment variables", + "tags": [ + "projects" + ], + "responses": { + "201": { + "description": "The environment variable was created successfully", + "content": { + "application/json": { + "schema": { + "properties": { + "created": { + "oneOf": [ + { + "properties": { + "target": { + "oneOf": [ + { + "items": { + "type": "string", + "enum": [ + "production", + "preview", + "development" + ] + }, + "type": "array" + }, + { + "type": "string", + "enum": [ + "production", + "preview", + "development" + ] + } + ] + }, + "type": { + "type": "string", + "enum": [ + "encrypted", + "plain", + "secret", + "sensitive", + "system" + ] + }, + "sunsetSecretId": { + "type": "string", + "description": "This is used to identify variables that have been migrated from type secret to sensitive." + }, + "legacyValue": { + "type": "string", + "description": "Legacy now-encryption ciphertext, present after migration swaps value/vsmValue" + }, + "decrypted": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "value": { + "type": "string" + }, + "vsmValue": { + "type": "string" + }, + "id": { + "type": "string" + }, + "key": { + "type": "string" + }, + "configurationId": { + "nullable": true, + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "updatedAt": { + "type": "number" + }, + "createdBy": { + "nullable": true, + "type": "string" + }, + "updatedBy": { + "nullable": true, + "type": "string" + }, + "gitBranch": { + "type": "string" + }, + "visibility": { + "type": "string", + "enum": [ + "config", + "secret" + ], + "description": "User-facing config/secret model. When set, authoritative for new code paths when the env-var-config-secret-ui flag is enabled. Legacy rows omit this field; legacy rows omit it and callers fall back to existing `type` behavior." + }, + "edgeConfigId": { + "nullable": true, + "type": "string" + }, + "edgeConfigTokenId": { + "nullable": true, + "type": "string" + }, + "contentHint": { + "nullable": true, + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "redis-url" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "redis-rest-api-url" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "redis-rest-api-token" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "redis-rest-api-read-only-token" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "blob-read-write-token" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "blob-store-id" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "blob-webhook-public-key" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-url" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-url-non-pooling" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-prisma-url" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-user" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-host" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-password" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-database" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-url-no-ssl" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "integration-store-secret" + ] + }, + "storeId": { + "type": "string" + }, + "integrationId": { + "type": "string" + }, + "integrationProductId": { + "type": "string" + }, + "integrationConfigurationId": { + "type": "string" + } + }, + "required": [ + "integrationConfigurationId", + "integrationId", + "integrationProductId", + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "flags-connection-string" + ] + }, + "projectId": { + "type": "string" + } + }, + "required": [ + "projectId", + "type" + ], + "type": "object" + } + ] + }, + "internalContentHint": { + "nullable": true, + "properties": { + "type": { + "type": "string", + "enum": [ + "flags-secret" + ] + }, + "encryptedValue": { + "type": "string", + "description": "Contains the `value` of the env variable, encrypted with a special key to make decryption possible in the subscriber Lambda." + } + }, + "required": [ + "encryptedValue", + "type" + ], + "type": "object", + "description": "Similar to `contentHints`, but should not be exposed to the user." + }, + "comment": { + "type": "string" + }, + "customEnvironmentIds": { + "items": { + "type": "string" + }, + "type": "array" + }, + "system": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "key", + "type", + "value" + ], + "type": "object" + }, + { + "items": { + "properties": { + "target": { + "oneOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "string", + "enum": [ + "production", + "preview", + "development" + ] + } + ] + }, + "type": { + "type": "string", + "enum": [ + "encrypted", + "plain", + "secret", + "sensitive", + "system" + ] + }, + "sunsetSecretId": { + "type": "string", + "description": "This is used to identify variables that have been migrated from type secret to sensitive." + }, + "legacyValue": { + "type": "string", + "description": "Legacy now-encryption ciphertext, present after migration swaps value/vsmValue" + }, + "decrypted": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "value": { + "type": "string" + }, + "vsmValue": { + "type": "string" + }, + "id": { + "type": "string" + }, + "key": { + "type": "string" + }, + "configurationId": { + "nullable": true, + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "updatedAt": { + "type": "number" + }, + "createdBy": { + "nullable": true, + "type": "string" + }, + "updatedBy": { + "nullable": true, + "type": "string" + }, + "gitBranch": { + "type": "string" + }, + "visibility": { + "type": "string", + "enum": [ + "config", + "secret" + ], + "description": "User-facing config/secret model. When set, authoritative for new code paths when the env-var-config-secret-ui flag is enabled. Legacy rows omit this field; legacy rows omit it and callers fall back to existing `type` behavior." + }, + "edgeConfigId": { + "nullable": true, + "type": "string" + }, + "edgeConfigTokenId": { + "nullable": true, + "type": "string" + }, + "contentHint": { + "nullable": true, + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "redis-url" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "redis-rest-api-url" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "redis-rest-api-token" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "redis-rest-api-read-only-token" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "blob-read-write-token" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "blob-store-id" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "blob-webhook-public-key" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-url" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-url-non-pooling" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-prisma-url" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-user" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-host" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-password" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-database" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-url-no-ssl" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "integration-store-secret" + ] + }, + "storeId": { + "type": "string" + }, + "integrationId": { + "type": "string" + }, + "integrationProductId": { + "type": "string" + }, + "integrationConfigurationId": { + "type": "string" + } + }, + "required": [ + "integrationConfigurationId", + "integrationId", + "integrationProductId", + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "flags-connection-string" + ] + }, + "projectId": { + "type": "string" + } + }, + "required": [ + "projectId", + "type" + ], + "type": "object" + } + ] + }, + "internalContentHint": { + "nullable": true, + "properties": { + "type": { + "type": "string", + "enum": [ + "flags-secret" + ] + }, + "encryptedValue": { + "type": "string", + "description": "Contains the `value` of the env variable, encrypted with a special key to make decryption possible in the subscriber Lambda." + } + }, + "required": [ + "encryptedValue", + "type" + ], + "type": "object", + "description": "Similar to `contentHints`, but should not be exposed to the user." + }, + "comment": { + "type": "string" + }, + "customEnvironmentIds": { + "items": { + "type": "string" + }, + "type": "array" + }, + "system": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "key", + "type", + "value" + ], + "type": "object" + }, + "type": "array" + } + ] + }, + "failed": { + "items": { + "properties": { + "error": { + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + }, + "key": { + "type": "string" + }, + "envVarId": { + "type": "string" + }, + "envVarKey": { + "type": "string" + }, + "action": { + "type": "string" + }, + "link": { + "type": "string" + }, + "value": { + "oneOf": [ + { + "type": "string" + }, + { + "items": { + "type": "string", + "enum": [ + "production", + "preview", + "development" + ] + }, + "type": "array" + } + ] + }, + "gitBranch": { + "type": "string" + }, + "target": { + "oneOf": [ + { + "items": { + "type": "string", + "enum": [ + "development", + "development", + "preview", + "preview", + "production" + ] + }, + "type": "array" + }, + { + "type": "string", + "enum": [ + "production", + "preview", + "development" + ] + } + ] + }, + "project": { + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" + } + }, + "required": [ + "error" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "failed" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid.\nOne of the provided values in the request query is invalid.\nThe environment variable coudn't be created because an ongoing update env update is already happening\nThe environment variable coudn't be created because project document is too large" + }, + "401": { + "description": "The request is not authorized." + }, + "402": { + "description": "The account is missing a payment so payment method must be updated" + }, + "403": { + "description": "You do not have permission to access this resource.\nThe environment variable cannot be created because it already exists" + }, + "404": { + "description": "" + }, + "409": { + "description": "" + }, + "410": { + "description": "" + }, + "429": { + "description": "" + }, + "500": { + "description": "" + } + }, + "x-vercel-cli": { + "supportedSubcommands": true, + "supportedProduction": false + }, + "parameters": [ + { + "name": "idOrName", + "description": "The unique project identifier or the project name", + "in": "path", + "required": true, + "schema": { + "description": "The unique project identifier or the project name", + "type": "string", + "example": "prj_XLKmu1DyR1eY7zq8UgeRKbA7yVLA" + }, + "x-vercel-cli": { + "kind": "argument" + } + }, + { + "name": "upsert", + "description": "Allow override of environment variable if it already exists", + "in": "query", + "required": false, + "schema": { + "description": "Allow override of environment variable if it already exists", + "type": "string", + "example": "true" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "oneOf": [ + { + "type": "object", + "required": [ + "key", + "value", + "type" + ], + "anyOf": [ + { + "required": [ + "target" + ] + }, + { + "required": [ + "customEnvironmentIds" + ] + } + ], + "properties": { + "key": { + "description": "The name of the environment variable", + "type": "string", + "example": "API_URL" + }, + "value": { + "description": "The value of the environment variable", + "type": "string", + "example": "https://api.vercel.com" + }, + "type": { + "description": "The type of environment variable", + "type": "string", + "enum": [ + "system", + "encrypted", + "plain", + "sensitive" + ], + "example": "plain" + }, + "target": { + "description": "The target environment of the environment variable", + "type": "array", + "items": { + "enum": [ + "production", + "preview", + "development" + ] + }, + "example": [ + "preview" + ] + }, + "gitBranch": { + "description": "If defined, the git branch of the environment variable (must have target=preview)", + "type": "string", + "maxLength": 250, + "example": "feature-1", + "nullable": true + }, + "comment": { + "type": "string", + "description": "A comment to add context on what this environment variable is for", + "example": "database connection string for production", + "maxLength": 500 + }, + "customEnvironmentIds": { + "type": "array", + "description": "The custom environment IDs associated with the environment variable", + "items": { + "type": "string", + "example": "env_1234567890" + } + } + } + }, + { + "type": "array", + "items": { + "type": "object", + "required": [ + "key", + "value", + "type" + ], + "anyOf": [ + { + "required": [ + "target" + ] + }, + { + "required": [ + "customEnvironmentIds" + ] + } + ], + "properties": { + "key": { + "description": "The name of the environment variable", + "type": "string", + "example": "API_URL" + }, + "value": { + "description": "The value of the environment variable", + "type": "string", + "example": "https://api.vercel.com" + }, + "type": { + "description": "The type of environment variable", + "type": "string", + "enum": [ + "system", + "encrypted", + "plain", + "sensitive" + ], + "example": "plain" + }, + "target": { + "description": "The target environment of the environment variable", + "type": "array", + "items": { + "enum": [ + "production", + "preview", + "development" + ] + }, + "example": [ + "preview" + ] + }, + "gitBranch": { + "description": "If defined, the git branch of the environment variable (must have target=preview)", + "type": "string", + "maxLength": 250, + "example": "feature-1", + "nullable": true + }, + "comment": { + "type": "string", + "description": "A comment to add context on what this environment variable is for", + "example": "database connection string for production", + "maxLength": 500 + }, + "customEnvironmentIds": { + "type": "array", + "description": "The custom environment IDs associated with the environment variable", + "items": { + "type": "string", + "example": "env_1234567890" + } + } + } + } + } + ] + } + } + }, + "required": true + } + } + }, + "/v1/projects/{idOrName}/env/{id}": { + "get": { + "description": "Retrieve the environment variable for a given project.", + "operationId": "getProjectEnv", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Retrieve the decrypted value of an environment variable of a project by id", + "tags": [ + "projects" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "oneOf": [ + { + "properties": { + "decrypted": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "type": { + "type": "string", + "enum": [ + "encrypted", + "plain", + "secret", + "sensitive", + "system" + ] + }, + "edgeConfigId": { + "nullable": true, + "type": "string" + }, + "edgeConfigTokenId": { + "nullable": true, + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "updatedAt": { + "type": "number" + }, + "id": { + "type": "string" + }, + "key": { + "type": "string" + }, + "target": { + "oneOf": [ + { + "items": { + "type": "string", + "enum": [ + "development", + "development", + "preview", + "preview", + "production" + ] + }, + "type": "array" + }, + { + "type": "string", + "enum": [ + "production", + "preview", + "development" + ] + } + ] + }, + "gitBranch": { + "type": "string" + }, + "createdBy": { + "nullable": true, + "type": "string" + }, + "updatedBy": { + "nullable": true, + "type": "string" + }, + "sunsetSecretId": { + "type": "string", + "description": "This is used to identify variables that have been migrated from type secret to sensitive." + }, + "legacyValue": { + "type": "string", + "description": "Legacy now-encryption ciphertext, present after migration swaps value/vsmValue" + }, + "configurationId": { + "nullable": true, + "type": "string" + }, + "visibility": { + "type": "string", + "enum": [ + "config", + "secret" + ], + "description": "User-facing config/secret model. When set, authoritative for new code paths when the env-var-config-secret-ui flag is enabled. Legacy rows omit this field; legacy rows omit it and callers fall back to existing `type` behavior." + }, + "contentHint": { + "nullable": true, + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "redis-url" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "redis-rest-api-url" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "redis-rest-api-token" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "redis-rest-api-read-only-token" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "blob-read-write-token" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "blob-store-id" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "blob-webhook-public-key" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-url" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-url-non-pooling" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-prisma-url" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-user" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-host" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-password" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-database" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-url-no-ssl" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "integration-store-secret" + ] + }, + "storeId": { + "type": "string" + }, + "integrationId": { + "type": "string" + }, + "integrationProductId": { + "type": "string" + }, + "integrationConfigurationId": { + "type": "string" + } + }, + "required": [ + "integrationConfigurationId", + "integrationId", + "integrationProductId", + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "flags-connection-string" + ] + }, + "projectId": { + "type": "string" + } + }, + "required": [ + "projectId", + "type" + ], + "type": "object" + } + ] + }, + "internalContentHint": { + "nullable": true, + "properties": { + "type": { + "type": "string", + "enum": [ + "flags-secret" + ] + }, + "encryptedValue": { + "type": "string", + "description": "Contains the `value` of the env variable, encrypted with a special key to make decryption possible in the subscriber Lambda." + } + }, + "required": [ + "encryptedValue", + "type" + ], + "type": "object", + "description": "Similar to `contentHints`, but should not be exposed to the user." + }, + "comment": { + "type": "string" + }, + "customEnvironmentIds": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "decrypted", + "key", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "encrypted", + "plain", + "secret", + "sensitive", + "system" + ] + }, + "value": { + "type": "string" + }, + "edgeConfigId": { + "nullable": true, + "type": "string" + }, + "edgeConfigTokenId": { + "nullable": true, + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "updatedAt": { + "type": "number" + }, + "id": { + "type": "string" + }, + "key": { + "type": "string" + }, + "target": { + "oneOf": [ + { + "items": { + "type": "string", + "enum": [ + "production", + "preview", + "development" + ] + }, + "type": "array" + }, + { + "type": "string", + "enum": [ + "production", + "preview", + "development" + ] + } + ] + }, + "gitBranch": { + "type": "string" + }, + "createdBy": { + "nullable": true, + "type": "string" + }, + "updatedBy": { + "nullable": true, + "type": "string" + }, + "sunsetSecretId": { + "type": "string", + "description": "This is used to identify variables that have been migrated from type secret to sensitive." + }, + "legacyValue": { + "type": "string", + "description": "Legacy now-encryption ciphertext, present after migration swaps value/vsmValue" + }, + "decrypted": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "configurationId": { + "nullable": true, + "type": "string" + }, + "visibility": { + "type": "string", + "enum": [ + "config", + "secret" + ], + "description": "User-facing config/secret model. When set, authoritative for new code paths when the env-var-config-secret-ui flag is enabled. Legacy rows omit this field; legacy rows omit it and callers fall back to existing `type` behavior." + }, + "contentHint": { + "nullable": true, + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "redis-url" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "redis-rest-api-url" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "redis-rest-api-token" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "redis-rest-api-read-only-token" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "blob-read-write-token" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "blob-store-id" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "blob-webhook-public-key" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-url" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-url-non-pooling" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-prisma-url" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-user" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-host" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-password" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-database" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-url-no-ssl" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "integration-store-secret" + ] + }, + "storeId": { + "type": "string" + }, + "integrationId": { + "type": "string" + }, + "integrationProductId": { + "type": "string" + }, + "integrationConfigurationId": { + "type": "string" + } + }, + "required": [ + "integrationConfigurationId", + "integrationId", + "integrationProductId", + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "flags-connection-string" + ] + }, + "projectId": { + "type": "string" + } + }, + "required": [ + "projectId", + "type" + ], + "type": "object" + } + ] + }, + "internalContentHint": { + "nullable": true, + "properties": { + "type": { + "type": "string", + "enum": [ + "flags-secret" + ] + }, + "encryptedValue": { + "type": "string", + "description": "Contains the `value` of the env variable, encrypted with a special key to make decryption possible in the subscriber Lambda." + } + }, + "required": [ + "encryptedValue", + "type" + ], + "type": "object", + "description": "Similar to `contentHints`, but should not be exposed to the user." + }, + "comment": { + "type": "string" + }, + "customEnvironmentIds": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "key", + "type", + "value" + ], + "type": "object" + } + ] + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "410": { + "description": "" + } + }, + "x-vercel-cli": { + "supportedSubcommands": true, + "supportedProduction": false + }, + "parameters": [ + { + "name": "idOrName", + "description": "The unique project identifier or the project name", + "in": "path", + "required": true, + "schema": { + "description": "The unique project identifier or the project name", + "type": "string", + "example": "prj_XLKmu1DyR1eY7zq8UgeRKbA7yVLA" + }, + "x-vercel-cli": { + "kind": "argument" + } + }, + { + "name": "id", + "description": "The unique ID for the environment variable to get the decrypted value.", + "in": "path", + "required": true, + "schema": { + "description": "The unique ID for the environment variable to get the decrypted value.", + "type": "string" + }, + "x-vercel-cli": { + "kind": "argument" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + } + }, + "/v9/projects/{idOrName}/env/{id}": { + "delete": { + "description": "Delete a specific environment variable for a given project by passing the environment variable identifier and either passing the project `id` or `name` in the URL.", + "operationId": "removeProjectEnv", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Remove an environment variable", + "tags": [ + "projects" + ], + "responses": { + "200": { + "description": "The environment variable was successfully removed", + "content": { + "application/json": { + "schema": { + "oneOf": [ + { + "items": { + "nullable": true, + "properties": { + "type": { + "type": "string", + "enum": [ + "encrypted", + "plain", + "secret", + "sensitive", + "system" + ] + }, + "value": { + "type": "string" + }, + "edgeConfigId": { + "nullable": true, + "type": "string" + }, + "edgeConfigTokenId": { + "nullable": true, + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "updatedAt": { + "type": "number" + }, + "id": { + "type": "string" + }, + "key": { + "type": "string" + }, + "target": { + "oneOf": [ + { + "items": { + "type": "string", + "enum": [ + "development", + "development", + "preview", + "preview", + "production" + ] + }, + "type": "array" + }, + { + "type": "string", + "enum": [ + "production", + "preview", + "development" + ] + } + ] + }, + "gitBranch": { + "type": "string" + }, + "createdBy": { + "nullable": true, + "type": "string" + }, + "updatedBy": { + "nullable": true, + "type": "string" + }, + "sunsetSecretId": { + "type": "string", + "description": "This is used to identify variables that have been migrated from type secret to sensitive." + }, + "legacyValue": { + "type": "string", + "description": "Legacy now-encryption ciphertext, present after migration swaps value/vsmValue" + }, + "decrypted": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "configurationId": { + "nullable": true, + "type": "string" + }, + "visibility": { + "type": "string", + "enum": [ + "config", + "secret" + ], + "description": "User-facing config/secret model. When set, authoritative for new code paths when the env-var-config-secret-ui flag is enabled. Legacy rows omit this field; legacy rows omit it and callers fall back to existing `type` behavior." + }, + "contentHint": { + "nullable": true, + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "redis-url" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "redis-rest-api-url" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "redis-rest-api-token" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "redis-rest-api-read-only-token" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "blob-read-write-token" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "blob-store-id" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "blob-webhook-public-key" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-url" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-url-non-pooling" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-prisma-url" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-user" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-host" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-password" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-database" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-url-no-ssl" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "integration-store-secret" + ] + }, + "storeId": { + "type": "string" + }, + "integrationId": { + "type": "string" + }, + "integrationProductId": { + "type": "string" + }, + "integrationConfigurationId": { + "type": "string" + } + }, + "required": [ + "integrationConfigurationId", + "integrationId", + "integrationProductId", + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "flags-connection-string" + ] + }, + "projectId": { + "type": "string" + } + }, + "required": [ + "projectId", + "type" + ], + "type": "object" + } + ] + }, + "internalContentHint": { + "nullable": true, + "properties": { + "type": { + "type": "string", + "enum": [ + "flags-secret" + ] + }, + "encryptedValue": { + "type": "string", + "description": "Contains the `value` of the env variable, encrypted with a special key to make decryption possible in the subscriber Lambda." + } + }, + "required": [ + "encryptedValue", + "type" + ], + "type": "object", + "description": "Similar to `contentHints`, but should not be exposed to the user." + }, + "comment": { + "type": "string" + }, + "customEnvironmentIds": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "key", + "type", + "value" + ], + "type": "object" + }, + "type": "array" + }, + { + "properties": { + "system": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "type": { + "type": "string", + "enum": [ + "encrypted", + "plain", + "secret", + "sensitive", + "system" + ] + }, + "value": { + "type": "string" + }, + "edgeConfigId": { + "nullable": true, + "type": "string" + }, + "edgeConfigTokenId": { + "nullable": true, + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "updatedAt": { + "type": "number" + }, + "id": { + "type": "string" + }, + "key": { + "type": "string" + }, + "target": { + "oneOf": [ + { + "items": { + "type": "string", + "enum": [ + "development", + "development", + "preview", + "preview", + "production" + ] + }, + "type": "array" + }, + { + "type": "string", + "enum": [ + "production", + "preview", + "development" + ] + } + ] + }, + "gitBranch": { + "type": "string" + }, + "createdBy": { + "nullable": true, + "type": "string" + }, + "updatedBy": { + "nullable": true, + "type": "string" + }, + "sunsetSecretId": { + "type": "string", + "description": "This is used to identify variables that have been migrated from type secret to sensitive." + }, + "legacyValue": { + "type": "string", + "description": "Legacy now-encryption ciphertext, present after migration swaps value/vsmValue" + }, + "decrypted": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "configurationId": { + "nullable": true, + "type": "string" + }, + "visibility": { + "type": "string", + "enum": [ + "config", + "secret" + ], + "description": "User-facing config/secret model. When set, authoritative for new code paths when the env-var-config-secret-ui flag is enabled. Legacy rows omit this field; legacy rows omit it and callers fall back to existing `type` behavior." + }, + "contentHint": { + "nullable": true, + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "redis-url" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "redis-rest-api-url" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "redis-rest-api-token" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "redis-rest-api-read-only-token" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "blob-read-write-token" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "blob-store-id" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "blob-webhook-public-key" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-url" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-url-non-pooling" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-prisma-url" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-user" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-host" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-password" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-database" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-url-no-ssl" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "integration-store-secret" + ] + }, + "storeId": { + "type": "string" + }, + "integrationId": { + "type": "string" + }, + "integrationProductId": { + "type": "string" + }, + "integrationConfigurationId": { + "type": "string" + } + }, + "required": [ + "integrationConfigurationId", + "integrationId", + "integrationProductId", + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "flags-connection-string" + ] + }, + "projectId": { + "type": "string" + } + }, + "required": [ + "projectId", + "type" + ], + "type": "object" + } + ] + }, + "internalContentHint": { + "nullable": true, + "properties": { + "type": { + "type": "string", + "enum": [ + "flags-secret" + ] + }, + "encryptedValue": { + "type": "string", + "description": "Contains the `value` of the env variable, encrypted with a special key to make decryption possible in the subscriber Lambda." + } + }, + "required": [ + "encryptedValue", + "type" + ], + "type": "object", + "description": "Similar to `contentHints`, but should not be exposed to the user." + }, + "comment": { + "type": "string" + }, + "customEnvironmentIds": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "key", + "type", + "value" + ], + "type": "object" + }, + { + "nullable": true, + "properties": { + "type": { + "type": "string", + "enum": [ + "encrypted", + "plain", + "secret", + "sensitive", + "system" + ] + }, + "value": { + "type": "string" + }, + "edgeConfigId": { + "nullable": true, + "type": "string" + }, + "edgeConfigTokenId": { + "nullable": true, + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "updatedAt": { + "type": "number" + }, + "id": { + "type": "string" + }, + "key": { + "type": "string" + }, + "target": { + "oneOf": [ + { + "items": { + "type": "string", + "enum": [ + "development", + "development", + "preview", + "preview", + "production" + ] + }, + "type": "array" + }, + { + "type": "string", + "enum": [ + "production", + "preview", + "development" + ] + } + ] + }, + "gitBranch": { + "type": "string" + }, + "createdBy": { + "nullable": true, + "type": "string" + }, + "updatedBy": { + "nullable": true, + "type": "string" + }, + "sunsetSecretId": { + "type": "string", + "description": "This is used to identify variables that have been migrated from type secret to sensitive." + }, + "legacyValue": { + "type": "string", + "description": "Legacy now-encryption ciphertext, present after migration swaps value/vsmValue" + }, + "decrypted": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "configurationId": { + "nullable": true, + "type": "string" + }, + "visibility": { + "type": "string", + "enum": [ + "config", + "secret" + ], + "description": "User-facing config/secret model. When set, authoritative for new code paths when the env-var-config-secret-ui flag is enabled. Legacy rows omit this field; legacy rows omit it and callers fall back to existing `type` behavior." + }, + "contentHint": { + "nullable": true, + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "redis-url" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "redis-rest-api-url" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "redis-rest-api-token" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "redis-rest-api-read-only-token" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "blob-read-write-token" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "blob-store-id" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "blob-webhook-public-key" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-url" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-url-non-pooling" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-prisma-url" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-user" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-host" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-password" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-database" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-url-no-ssl" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "integration-store-secret" + ] + }, + "storeId": { + "type": "string" + }, + "integrationId": { + "type": "string" + }, + "integrationProductId": { + "type": "string" + }, + "integrationConfigurationId": { + "type": "string" + } + }, + "required": [ + "integrationConfigurationId", + "integrationId", + "integrationProductId", + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "flags-connection-string" + ] + }, + "projectId": { + "type": "string" + } + }, + "required": [ + "projectId", + "type" + ], + "type": "object" + } + ] + }, + "internalContentHint": { + "nullable": true, + "properties": { + "type": { + "type": "string", + "enum": [ + "flags-secret" + ] + }, + "encryptedValue": { + "type": "string", + "description": "Contains the `value` of the env variable, encrypted with a special key to make decryption possible in the subscriber Lambda." + } + }, + "required": [ + "encryptedValue", + "type" + ], + "type": "object", + "description": "Similar to `contentHints`, but should not be exposed to the user." + }, + "comment": { + "type": "string" + }, + "customEnvironmentIds": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "key", + "type", + "value" + ], + "type": "object" + } + ] + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "409": { + "description": "The project is being transfered and removing an environment variable is not possible" + }, + "410": { + "description": "" + } + }, + "x-vercel-cli": { + "supportedSubcommands": true, + "supportedProduction": false + }, + "parameters": [ + { + "name": "idOrName", + "description": "The unique project identifier or the project name", + "in": "path", + "required": true, + "schema": { + "description": "The unique project identifier or the project name", + "type": "string", + "example": "prj_XLKmu1DyR1eY7zq8UgeRKbA7yVLA" + }, + "x-vercel-cli": { + "kind": "argument" + } + }, + { + "name": "id", + "description": "The unique environment variable identifier", + "in": "path", + "required": true, + "schema": { + "description": "The unique environment variable identifier", + "type": "string", + "example": "XMbOEya1gUUO1ir4" + }, + "x-vercel-cli": { + "kind": "argument" + } + }, + { + "name": "customEnvironmentId", + "description": "The unique custom environment identifier within the project", + "in": "query", + "required": false, + "schema": { + "type": "string", + "description": "The unique custom environment identifier within the project", + "example": "env_123abc4567" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + }, + "patch": { + "description": "Edit a specific environment variable for a given project by passing the environment variable identifier and either passing the project `id` or `name` in the URL.", + "operationId": "editProjectEnv", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Edit an environment variable", + "tags": [ + "projects" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "nullable": true, + "properties": { + "type": { + "type": "string", + "enum": [ + "encrypted", + "plain", + "secret", + "sensitive", + "system" + ] + }, + "value": { + "type": "string" + }, + "edgeConfigId": { + "nullable": true, + "type": "string" + }, + "edgeConfigTokenId": { + "nullable": true, + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "updatedAt": { + "type": "number" + }, + "id": { + "type": "string" + }, + "key": { + "type": "string" + }, + "target": { + "oneOf": [ + { + "items": { + "type": "string", + "enum": [ + "development", + "development", + "preview", + "preview", + "production" + ] + }, + "type": "array" + }, + { + "type": "string", + "enum": [ + "development", + "development", + "preview", + "preview", + "production" + ] + } + ] + }, + "gitBranch": { + "type": "string" + }, + "createdBy": { + "nullable": true, + "type": "string" + }, + "updatedBy": { + "nullable": true, + "type": "string" + }, + "sunsetSecretId": { + "type": "string", + "description": "This is used to identify variables that have been migrated from type secret to sensitive." + }, + "legacyValue": { + "type": "string", + "description": "Legacy now-encryption ciphertext, present after migration swaps value/vsmValue" + }, + "decrypted": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "configurationId": { + "nullable": true, + "type": "string" + }, + "visibility": { + "type": "string", + "enum": [ + "config", + "secret" + ], + "description": "User-facing config/secret model. When set, authoritative for new code paths when the env-var-config-secret-ui flag is enabled. Legacy rows omit this field; legacy rows omit it and callers fall back to existing `type` behavior." + }, + "contentHint": { + "nullable": true, + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "redis-url" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "redis-rest-api-url" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "redis-rest-api-token" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "redis-rest-api-read-only-token" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "blob-read-write-token" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "blob-store-id" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "blob-webhook-public-key" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-url" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-url-non-pooling" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-prisma-url" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-user" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-host" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-password" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-database" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-url-no-ssl" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "integration-store-secret" + ] + }, + "storeId": { + "type": "string" + }, + "integrationId": { + "type": "string" + }, + "integrationProductId": { + "type": "string" + }, + "integrationConfigurationId": { + "type": "string" + } + }, + "required": [ + "integrationConfigurationId", + "integrationId", + "integrationProductId", + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "flags-connection-string" + ] + }, + "projectId": { + "type": "string" + } + }, + "required": [ + "projectId", + "type" + ], + "type": "object" + } + ] + }, + "internalContentHint": { + "nullable": true, + "properties": { + "type": { + "type": "string", + "enum": [ + "flags-secret" + ] + }, + "encryptedValue": { + "type": "string", + "description": "Contains the `value` of the env variable, encrypted with a special key to make decryption possible in the subscriber Lambda." + } + }, + "required": [ + "encryptedValue", + "type" + ], + "type": "object", + "description": "Similar to `contentHints`, but should not be exposed to the user." + }, + "comment": { + "type": "string" + }, + "customEnvironmentIds": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "key", + "type", + "value" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid.\nOne of the provided values in the request query is invalid.\nAt least one environment variable failed validation" + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "409": { + "description": "The project is being transfered and removing an environment variable is not possible" + }, + "410": { + "description": "" + }, + "429": { + "description": "" + }, + "500": { + "description": "" + } + }, + "x-vercel-cli": { + "supportedSubcommands": true, + "supportedProduction": false + }, + "parameters": [ + { + "name": "idOrName", + "description": "The unique project identifier or the project name", + "in": "path", + "required": true, + "schema": { + "description": "The unique project identifier or the project name", + "type": "string", + "example": "prj_XLKmu1DyR1eY7zq8UgeRKbA7yVLA" + }, + "x-vercel-cli": { + "kind": "argument" + } + }, + { + "name": "id", + "description": "The unique environment variable identifier", + "in": "path", + "required": true, + "schema": { + "description": "The unique environment variable identifier", + "type": "string", + "example": "XMbOEya1gUUO1ir4" + }, + "x-vercel-cli": { + "kind": "argument" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "additionalProperties": false, + "properties": { + "key": { + "description": "The name of the environment variable", + "type": "string", + "example": "GITHUB_APP_ID" + }, + "target": { + "description": "The target environment of the environment variable", + "type": "array", + "items": { + "enum": [ + "production", + "preview", + "development" + ] + }, + "example": [ + "preview" + ] + }, + "gitBranch": { + "description": "If defined, the git branch of the environment variable (must have target=preview)", + "type": "string", + "maxLength": 250, + "example": "feature-1", + "nullable": true + }, + "type": { + "description": "The type of environment variable", + "type": "string", + "enum": [ + "system", + "encrypted", + "plain", + "sensitive" + ], + "example": "plain" + }, + "value": { + "description": "The value of the environment variable", + "type": "string", + "example": "bkWIjbnxcvo78" + }, + "customEnvironmentIds": { + "type": "array", + "description": "The custom environments that the environment variable should be synced to", + "items": { + "type": "string", + "example": "env_1234567890" + } + }, + "comment": { + "type": "string", + "description": "A comment to add context on what this env var is for", + "example": "database connection string for production", + "maxLength": 500 + } + } + } + } + }, + "required": true + }, + "x-speakeasy-test": false + } + }, + "/v1/projects/{idOrName}/env": { + "delete": { + "description": "Delete multiple environment variables for a given project in a single batch operation.", + "operationId": "batchRemoveProjectEnv", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Batch remove environment variables", + "tags": [ + "projects" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "deleted": { + "type": "number" + }, + "ids": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "deleted", + "ids" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid.\nOne of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "409": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "idOrName", + "description": "The unique project identifier or the project name", + "in": "path", + "required": true, + "schema": { + "description": "The unique project identifier or the project name", + "type": "string", + "example": "prj_XLKmu1DyR1eY7zq8UgeRKbA7yVLA" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "ids" + ], + "properties": { + "ids": { + "description": "Array of environment variable IDs to delete", + "type": "array", + "items": { + "type": "string" + }, + "minItems": 1, + "maxItems": 1000 + } + }, + "additionalProperties": false + } + } + } + } + } + }, + "/v1/projects/{idOrName}/rolling-release/billing": { + "get": { + "description": "Get the Rolling Releases billing status for a project. The team level billing status is used to determine if the project can be configured for rolling releases.", + "operationId": "getRollingReleaseBillingStatus", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Get rolling release billing status", + "tags": [ + "rolling-release" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "oneOf": [ + { + "properties": { + "availableSlots": { + "type": "number", + "enum": [ + 0 + ] + }, + "reason": { + "type": "string", + "enum": [ + "plan_not_supported" + ] + }, + "message": { + "type": "string" + } + }, + "required": [ + "availableSlots", + "message", + "reason" + ], + "type": "object" + }, + { + "properties": { + "availableSlots": { + "type": "string", + "enum": [ + "unlimited" + ] + }, + "reason": { + "type": "string", + "enum": [ + "unlimited_slots" + ] + }, + "message": { + "type": "string" + } + }, + "required": [ + "availableSlots", + "message", + "reason" + ], + "type": "object" + }, + { + "properties": { + "availableSlots": { + "type": "number", + "enum": [ + 0 + ] + }, + "reason": { + "type": "string", + "enum": [ + "no_available_slots" + ] + }, + "message": { + "type": "string" + }, + "enabledProjects": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "availableSlots", + "enabledProjects", + "message", + "reason" + ], + "type": "object" + }, + { + "properties": { + "availableSlots": { + "type": "number" + }, + "reason": { + "type": "string", + "enum": [ + "available_slots" + ] + }, + "message": { + "type": "string" + } + }, + "required": [ + "availableSlots", + "message", + "reason" + ], + "type": "object" + } + ] + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "idOrName", + "description": "Project ID or project name (URL-encoded)", + "in": "path", + "required": true, + "schema": { + "description": "Project ID or project name (URL-encoded)", + "type": "string" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + } + }, + "/v1/projects/{idOrName}/rolling-release/config": { + "get": { + "description": "Get the Rolling Releases configuration for a project. The project-level config is simply a template that will be used for any future rolling release, and not the configuration for any active rolling release.", + "operationId": "getRollingReleaseConfig", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Get rolling release configuration", + "tags": [ + "rolling-release" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "rollingRelease": { + "nullable": true, + "properties": { + "target": { + "type": "string", + "description": "The environment that the release targets, currently only supports production. Adding in case we want to configure with alias groups or custom environments.", + "example": "production" + }, + "stages": { + "nullable": true, + "items": { + "properties": { + "targetPercentage": { + "type": "number", + "description": "The percentage of traffic to serve to the canary deployment (0-100)", + "example": 25 + }, + "requireApproval": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether or not this stage requires manual approval to proceed", + "example": false + }, + "duration": { + "type": "number", + "description": "Duration in minutes for automatic advancement to the next stage", + "example": 600 + }, + "linearShift": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether to linearly shift traffic over the duration of this stage", + "example": false + } + }, + "required": [ + "targetPercentage" + ], + "type": "object", + "description": "An array of all the stages required during a deployment release. Each stage defines a target percentage and advancement rules. The final stage must always have targetPercentage: 100." + }, + "type": "array", + "description": "An array of all the stages required during a deployment release. Each stage defines a target percentage and advancement rules. The final stage must always have targetPercentage: 100." + }, + "canaryResponseHeader": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether the request served by a canary deployment should return a header indicating a canary was served. Defaults to `false` when omitted.", + "example": false + }, + "gate": { + "properties": { + "enabled": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether automated gating is enabled for this project's rollouts." + }, + "checks": { + "items": { + "properties": { + "type": { + "type": "string", + "enum": [ + "error-rate-5xx" + ], + "description": "The metric this check evaluates." + }, + "minSampleSize": { + "type": "number", + "description": "Minimum number of requests required in the window before the check can fail. Below this, the check is inconclusive rather than failing, so low-traffic stages don't gate on noise. Defaults to `100` when omitted.", + "example": 100 + }, + "excludeStatusCodes": { + "items": { + "type": "number" + }, + "type": "array", + "description": "Response status codes to ignore entirely — dropped from both the numerator (errors) and the denominator (total requests). Defaults to `[]` when omitted.", + "example": [ + 503 + ] + }, + "excludePaths": { + "items": { + "type": "string" + }, + "type": "array", + "description": "Request paths to ignore entirely — dropped from both the numerator (errors) and the denominator (total requests). Matched exactly against the request path with any query string removed; no prefix or glob matching. Defaults to `[]` when omitted.", + "example": [ + "/api/health" + ] + }, + "ingestWatermarkSeconds": { + "type": "number", + "description": "Seconds of ingest lag to allow for: the query's upper bound is `now() - this value`, so the check never reads a window that is still filling. Defaults to `30` when omitted.", + "example": 30 + } + }, + "required": [ + "type" + ], + "type": "object", + "description": "The checks to evaluate. An empty array means nothing is evaluated." + }, + "type": "array", + "description": "The checks to evaluate. An empty array means nothing is evaluated." + }, + "failureThreshold": { + "type": "number", + "description": "How many failing evaluations within {@link windowSize} trip the gate. Defaults to `3` when omitted.", + "example": 3 + }, + "windowSize": { + "type": "number", + "description": "How many of the most recent evaluations {@link failureThreshold} is counted against. Defaults to `5` when omitted.", + "example": 5 + }, + "action": { + "type": "string", + "enum": [ + "pause", + "rollback" + ], + "description": "What to do when the gate trips: pause the rollout, or roll it back." + }, + "dryRun": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "When true, a tripped gate is only reported — {@link action} is not taken." + } + }, + "required": [ + "action", + "checks", + "dryRun", + "enabled" + ], + "type": "object", + "description": "Automated gating configuration. Omitted (the default) means no gating is configured, which is equivalent to `enabled: false`." + } + }, + "required": [ + "target" + ], + "type": "object", + "description": "Project-level rolling release configuration that defines how deployments should be gradually rolled out" + } + }, + "required": [ + "rollingRelease" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "idOrName", + "description": "Project ID or project name (URL-encoded)", + "in": "path", + "required": true, + "schema": { + "description": "Project ID or project name (URL-encoded)", + "type": "string" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + }, + "delete": { + "description": "Disable Rolling Releases for a project means that future deployments will not undergo a rolling release. Changing the config never alters a rollout that's already in-flight—it only affects the next production deployment. If you want to also stop the current rollout, call this endpoint to disable the feature, and then call either the /complete or /abort endpoint.", + "operationId": "deleteRollingReleaseConfig", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Delete rolling release configuration", + "tags": [ + "rolling-release" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "rollingRelease": { + "nullable": true + } + }, + "required": [ + "rollingRelease" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "idOrName", + "description": "Project ID or project name (URL-encoded)", + "in": "path", + "required": true, + "schema": { + "description": "Project ID or project name (URL-encoded)", + "type": "string" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + }, + "patch": { + "description": "Update (or disable) Rolling Releases for a project. When disabling with the resolve-on-disable feature flag enabled, any active rolling release document is resolved using the disableRolloutAction parameter: \"abort\" to roll back (default), or \"complete\" to promote the canary to production. When enabling or updating config, changes only affect the next production deployment and do not alter a rollout that's already in-flight. Note: Enabling Rolling Releases automatically enables skew protection on the project with the default value if it wasn't configured already.", + "operationId": "updateRollingReleaseConfig", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Update the rolling release settings for the project", + "tags": [ + "rolling-release" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "oneOf": [ + { + "properties": { + "rollingRelease": { + "nullable": true + } + }, + "required": [ + "rollingRelease" + ], + "type": "object" + }, + { + "properties": { + "rollingRelease": { + "nullable": true, + "properties": { + "stages": { + "nullable": true, + "items": { + "properties": { + "targetPercentage": { + "type": "number", + "description": "The percentage of traffic to serve to the canary deployment (0-100)", + "example": 25 + }, + "requireApproval": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether or not this stage requires manual approval to proceed", + "example": false + }, + "duration": { + "type": "number", + "description": "Duration in minutes for automatic advancement to the next stage", + "example": 600 + }, + "linearShift": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether to linearly shift traffic over the duration of this stage", + "example": false + } + }, + "required": [ + "targetPercentage" + ], + "type": "object", + "description": "A stage object configured for a rolling release once a new deployment is triggered the first stage will be read in the proxy for first time visitors, and if a RNG \u003c targetPercentage then it will serve the new deployment. Upon approval the next stage will be read, etc." + }, + "type": "array" + } + }, + "type": "object" + } + }, + "required": [ + "rollingRelease" + ], + "type": "object" + } + ] + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "idOrName", + "description": "Project ID or project name (URL-encoded)", + "in": "path", + "required": true, + "schema": { + "description": "Project ID or project name (URL-encoded)", + "type": "string" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + } + }, + "/v1/projects/{idOrName}/rolling-release": { + "get": { + "description": "Return the Rolling Release for a project, regardless of whether the rollout is active, aborted, or completed. If the feature is enabled but no deployment has occurred yet, null will be returned.", + "operationId": "getRollingRelease", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Get the active rolling release information for a project", + "tags": [ + "rolling-release" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "rollingRelease": { + "nullable": true, + "properties": { + "state": { + "type": "string", + "enum": [ + "ABORTED", + "ACTIVE", + "COMPLETE" + ], + "description": "The current state of the rolling release", + "example": "ACTIVE" + }, + "substate": { + "nullable": true, + "type": "string", + "enum": [ + "PAUSED", + null + ], + "description": "When set to `PAUSED`, the rollout is frozen at the current percentage until continued." + }, + "currentDeployment": { + "nullable": true, + "properties": { + "name": { + "type": "string", + "description": "The name of the project associated with the deployment at the time that the deployment was created", + "example": "my-project" + }, + "createdAt": { + "type": "number", + "description": "A number containing the date when the deployment was created in milliseconds", + "example": 1540257589405 + }, + "readyState": { + "type": "string", + "enum": [ + "BLOCKED", + "BUILDING", + "CANCELED", + "ERROR", + "INITIALIZING", + "QUEUED", + "READY" + ], + "description": "The state of the deployment depending on the process of deploying, or if it is ready or in an error state", + "example": "READY" + }, + "id": { + "type": "string", + "description": "A string holding the unique ID of the deployment", + "example": "dpl_89qyp1cskzkLrVicDaZoDbjyHuDJ" + }, + "target": { + "nullable": true, + "type": "string", + "enum": [ + "production", + "staging", + null + ], + "description": "If defined, either `staging` if a staging alias in the format `\u003cproject\u003e.\u003cteam\u003e.now.sh` was assigned upon creation, or `production` if the aliases from `alias` were assigned. `null` value indicates the \"preview\" deployment.", + "example": null + }, + "readyStateAt": { + "type": "number" + }, + "source": { + "type": "string", + "enum": [ + "api-trigger-git-deploy", + "cli", + "clone/repo", + "drop", + "git", + "git-deploy-hook", + "import", + "import/repo", + "redeploy", + "v0-web" + ], + "description": "Where was the deployment created from. Best-effort guess for metrics only — not authoritative; do not gate behavior on it.", + "example": "cli" + }, + "url": { + "type": "string", + "description": "A string with the unique URL of the deployment", + "example": "my-instant-deployment-3ij3cxz9qr.now.sh" + } + }, + "required": [ + "createdAt", + "id", + "name", + "readyState", + "url" + ], + "type": "object", + "description": "The current deployment receiving production traffic", + "example": { + "id": "dpl_abc123", + "name": "my-shop@main", + "url": "my-shop.vercel.app", + "target": "production", + "source": "git", + "createdAt": 1716206500000, + "readyState": "READY", + "readyStateAt": 1716206800000 + } + }, + "canaryDeployment": { + "nullable": true, + "properties": { + "name": { + "type": "string", + "description": "The name of the project associated with the deployment at the time that the deployment was created", + "example": "my-project" + }, + "createdAt": { + "type": "number", + "description": "A number containing the date when the deployment was created in milliseconds", + "example": 1540257589405 + }, + "readyState": { + "type": "string", + "enum": [ + "BLOCKED", + "BUILDING", + "CANCELED", + "ERROR", + "INITIALIZING", + "QUEUED", + "READY" + ], + "description": "The state of the deployment depending on the process of deploying, or if it is ready or in an error state", + "example": "READY" + }, + "id": { + "type": "string", + "description": "A string holding the unique ID of the deployment", + "example": "dpl_89qyp1cskzkLrVicDaZoDbjyHuDJ" + }, + "target": { + "nullable": true, + "type": "string", + "enum": [ + "production", + "staging", + null + ], + "description": "If defined, either `staging` if a staging alias in the format `\u003cproject\u003e.\u003cteam\u003e.now.sh` was assigned upon creation, or `production` if the aliases from `alias` were assigned. `null` value indicates the \"preview\" deployment.", + "example": null + }, + "readyStateAt": { + "type": "number" + }, + "source": { + "type": "string", + "enum": [ + "api-trigger-git-deploy", + "cli", + "clone/repo", + "drop", + "git", + "git-deploy-hook", + "import", + "import/repo", + "redeploy", + "v0-web" + ], + "description": "Where was the deployment created from. Best-effort guess for metrics only — not authoritative; do not gate behavior on it.", + "example": "cli" + }, + "url": { + "type": "string", + "description": "A string with the unique URL of the deployment", + "example": "my-instant-deployment-3ij3cxz9qr.now.sh" + } + }, + "required": [ + "createdAt", + "id", + "name", + "readyState", + "url" + ], + "type": "object", + "description": "The canary deployment being rolled out", + "example": { + "id": "dpl_def456", + "name": "my-shop@9c7e2f4", + "url": "9c7e2f4-my-shop.vercel.app", + "target": "production", + "source": "git", + "createdAt": 1716210100000, + "readyState": "READY", + "readyStateAt": 1716210400000 + } + }, + "queuedDeploymentId": { + "nullable": true, + "type": "string", + "description": "The ID of a deployment queued for the next rolling release", + "example": "dpl_ghi789" + }, + "advancementType": { + "type": "string", + "enum": [ + "automatic", + "manual-approval" + ], + "description": "The advancement type of the rolling release", + "example": "manual-approval" + }, + "stages": { + "items": { + "properties": { + "index": { + "type": "number", + "description": "The zero-based index of the stage", + "example": 0 + }, + "isFinalStage": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether or not this stage is the final stage (targetPercentage === 100)", + "example": false + }, + "targetPercentage": { + "type": "number", + "description": "The percentage of traffic to serve to the canary deployment (0-100)", + "example": 25 + }, + "requireApproval": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether or not this stage requires manual approval to proceed" + }, + "duration": { + "nullable": true, + "type": "number", + "description": "Duration in seconds for automatic advancement, null for manual stages or the final stage", + "example": null + }, + "linearShift": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether to linearly shift traffic over the duration of this stage", + "example": false + } + }, + "required": [ + "duration", + "index", + "isFinalStage", + "requireApproval", + "targetPercentage" + ], + "type": "object", + "description": "All stages configured for this rolling release", + "example": [ + { + "index": 0, + "isFinalStage": false, + "targetPercentage": 5, + "requireApproval": true, + "duration": null + }, + { + "index": 1, + "isFinalStage": false, + "targetPercentage": 25, + "requireApproval": true, + "duration": null + }, + { + "index": 2, + "isFinalStage": false, + "targetPercentage": 60, + "requireApproval": true, + "duration": null + }, + { + "index": 3, + "isFinalStage": true, + "targetPercentage": 100, + "requireApproval": false, + "duration": null + } + ] + }, + "type": "array", + "description": "All stages configured for this rolling release", + "example": [ + { + "index": 0, + "isFinalStage": false, + "targetPercentage": 5, + "requireApproval": true, + "duration": null + }, + { + "index": 1, + "isFinalStage": false, + "targetPercentage": 25, + "requireApproval": true, + "duration": null + }, + { + "index": 2, + "isFinalStage": false, + "targetPercentage": 60, + "requireApproval": true, + "duration": null + }, + { + "index": 3, + "isFinalStage": true, + "targetPercentage": 100, + "requireApproval": false, + "duration": null + } + ] + }, + "activeStage": { + "nullable": true, + "properties": { + "index": { + "type": "number", + "description": "The zero-based index of the stage", + "example": 0 + }, + "isFinalStage": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether or not this stage is the final stage (targetPercentage === 100)", + "example": false + }, + "targetPercentage": { + "type": "number", + "description": "The percentage of traffic to serve to the canary deployment (0-100)", + "example": 25 + }, + "requireApproval": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether or not this stage requires manual approval to proceed" + }, + "duration": { + "nullable": true, + "type": "number", + "description": "Duration in seconds for automatic advancement, null for manual stages or the final stage", + "example": null + }, + "linearShift": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether to linearly shift traffic over the duration of this stage", + "example": false + } + }, + "required": [ + "duration", + "index", + "isFinalStage", + "requireApproval", + "targetPercentage" + ], + "type": "object", + "description": "The currently active stage, null if the rollout is aborted", + "example": { + "index": 1, + "isFinalStage": false, + "targetPercentage": 25, + "requireApproval": true, + "duration": null + } + }, + "nextStage": { + "nullable": true, + "properties": { + "index": { + "type": "number", + "description": "The zero-based index of the stage", + "example": 0 + }, + "isFinalStage": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether or not this stage is the final stage (targetPercentage === 100)", + "example": false + }, + "targetPercentage": { + "type": "number", + "description": "The percentage of traffic to serve to the canary deployment (0-100)", + "example": 25 + }, + "requireApproval": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether or not this stage requires manual approval to proceed" + }, + "duration": { + "nullable": true, + "type": "number", + "description": "Duration in seconds for automatic advancement, null for manual stages or the final stage", + "example": null + }, + "linearShift": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether to linearly shift traffic over the duration of this stage", + "example": false + } + }, + "required": [ + "duration", + "index", + "isFinalStage", + "requireApproval", + "targetPercentage" + ], + "type": "object", + "description": "The next stage to be activated, null if not in ACTIVE state", + "example": { + "index": 2, + "isFinalStage": false, + "targetPercentage": 60, + "requireApproval": true, + "duration": null + } + }, + "startedAt": { + "type": "number", + "description": "Unix timestamp in milliseconds when the rolling release started", + "example": 1716210500000 + }, + "updatedAt": { + "type": "number", + "description": "Unix timestamp in milliseconds when the rolling release was last updated", + "example": 1716210600000 + }, + "currentCanaryPercentage": { + "type": "number", + "description": "When set (for example while {@link substate} is `PAUSED`), the canary traffic percentage persisted on the rollout document — use for dashboard display when linear shift is active." + } + }, + "required": [ + "activeStage", + "advancementType", + "canaryDeployment", + "currentDeployment", + "nextStage", + "queuedDeploymentId", + "stages", + "startedAt", + "state", + "substate", + "updatedAt" + ], + "type": "object", + "description": "Rolling release information including configuration and document details, or null if no rolling release exists" + } + }, + "required": [ + "rollingRelease" + ], + "type": "object", + "description": "The response format for rolling release endpoints that return rolling release information" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "idOrName", + "description": "Project ID or project name (URL-encoded)", + "in": "path", + "required": true, + "schema": { + "description": "Project ID or project name (URL-encoded)", + "type": "string" + } + }, + { + "name": "state", + "description": "Filter by rolling release state", + "in": "query", + "required": false, + "schema": { + "description": "Filter by rolling release state", + "type": "string", + "enum": [ + "ACTIVE", + "COMPLETE", + "ABORTED" + ] + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + } + }, + "/v1/projects/{idOrName}/rolling-release/approve-stage": { + "post": { + "description": "Advance a rollout to the next stage. This is only needed when rolling releases is configured to require manual approval.", + "operationId": "approveRollingReleaseStage", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Update the active rolling release to the next stage for a project", + "tags": [ + "rolling-release" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "rollingRelease": { + "nullable": true, + "properties": { + "state": { + "type": "string", + "enum": [ + "ABORTED", + "ACTIVE", + "COMPLETE" + ], + "description": "The current state of the rolling release", + "example": "ACTIVE" + }, + "substate": { + "nullable": true, + "type": "string", + "enum": [ + "PAUSED", + null + ], + "description": "When set to `PAUSED`, the rollout is frozen at the current percentage until continued." + }, + "currentDeployment": { + "nullable": true, + "properties": { + "name": { + "type": "string", + "description": "The name of the project associated with the deployment at the time that the deployment was created", + "example": "my-project" + }, + "createdAt": { + "type": "number", + "description": "A number containing the date when the deployment was created in milliseconds", + "example": 1540257589405 + }, + "readyState": { + "type": "string", + "enum": [ + "BLOCKED", + "BUILDING", + "CANCELED", + "ERROR", + "INITIALIZING", + "QUEUED", + "READY" + ], + "description": "The state of the deployment depending on the process of deploying, or if it is ready or in an error state", + "example": "READY" + }, + "id": { + "type": "string", + "description": "A string holding the unique ID of the deployment", + "example": "dpl_89qyp1cskzkLrVicDaZoDbjyHuDJ" + }, + "target": { + "nullable": true, + "type": "string", + "enum": [ + "production", + "staging", + null + ], + "description": "If defined, either `staging` if a staging alias in the format `\u003cproject\u003e.\u003cteam\u003e.now.sh` was assigned upon creation, or `production` if the aliases from `alias` were assigned. `null` value indicates the \"preview\" deployment.", + "example": null + }, + "readyStateAt": { + "type": "number" + }, + "source": { + "type": "string", + "enum": [ + "api-trigger-git-deploy", + "cli", + "clone/repo", + "drop", + "git", + "git-deploy-hook", + "import", + "import/repo", + "redeploy", + "v0-web" + ], + "description": "Where was the deployment created from. Best-effort guess for metrics only — not authoritative; do not gate behavior on it.", + "example": "cli" + }, + "url": { + "type": "string", + "description": "A string with the unique URL of the deployment", + "example": "my-instant-deployment-3ij3cxz9qr.now.sh" + } + }, + "required": [ + "createdAt", + "id", + "name", + "readyState", + "url" + ], + "type": "object", + "description": "The current deployment receiving production traffic", + "example": { + "id": "dpl_abc123", + "name": "my-shop@main", + "url": "my-shop.vercel.app", + "target": "production", + "source": "git", + "createdAt": 1716206500000, + "readyState": "READY", + "readyStateAt": 1716206800000 + } + }, + "canaryDeployment": { + "nullable": true, + "properties": { + "name": { + "type": "string", + "description": "The name of the project associated with the deployment at the time that the deployment was created", + "example": "my-project" + }, + "createdAt": { + "type": "number", + "description": "A number containing the date when the deployment was created in milliseconds", + "example": 1540257589405 + }, + "readyState": { + "type": "string", + "enum": [ + "BLOCKED", + "BUILDING", + "CANCELED", + "ERROR", + "INITIALIZING", + "QUEUED", + "READY" + ], + "description": "The state of the deployment depending on the process of deploying, or if it is ready or in an error state", + "example": "READY" + }, + "id": { + "type": "string", + "description": "A string holding the unique ID of the deployment", + "example": "dpl_89qyp1cskzkLrVicDaZoDbjyHuDJ" + }, + "target": { + "nullable": true, + "type": "string", + "enum": [ + "production", + "staging", + null + ], + "description": "If defined, either `staging` if a staging alias in the format `\u003cproject\u003e.\u003cteam\u003e.now.sh` was assigned upon creation, or `production` if the aliases from `alias` were assigned. `null` value indicates the \"preview\" deployment.", + "example": null + }, + "readyStateAt": { + "type": "number" + }, + "source": { + "type": "string", + "enum": [ + "api-trigger-git-deploy", + "cli", + "clone/repo", + "drop", + "git", + "git-deploy-hook", + "import", + "import/repo", + "redeploy", + "v0-web" + ], + "description": "Where was the deployment created from. Best-effort guess for metrics only — not authoritative; do not gate behavior on it.", + "example": "cli" + }, + "url": { + "type": "string", + "description": "A string with the unique URL of the deployment", + "example": "my-instant-deployment-3ij3cxz9qr.now.sh" + } + }, + "required": [ + "createdAt", + "id", + "name", + "readyState", + "url" + ], + "type": "object", + "description": "The canary deployment being rolled out", + "example": { + "id": "dpl_def456", + "name": "my-shop@9c7e2f4", + "url": "9c7e2f4-my-shop.vercel.app", + "target": "production", + "source": "git", + "createdAt": 1716210100000, + "readyState": "READY", + "readyStateAt": 1716210400000 + } + }, + "queuedDeploymentId": { + "nullable": true, + "type": "string", + "description": "The ID of a deployment queued for the next rolling release", + "example": "dpl_ghi789" + }, + "advancementType": { + "type": "string", + "enum": [ + "automatic", + "manual-approval" + ], + "description": "The advancement type of the rolling release", + "example": "manual-approval" + }, + "stages": { + "items": { + "properties": { + "index": { + "type": "number", + "description": "The zero-based index of the stage", + "example": 0 + }, + "isFinalStage": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether or not this stage is the final stage (targetPercentage === 100)", + "example": false + }, + "targetPercentage": { + "type": "number", + "description": "The percentage of traffic to serve to the canary deployment (0-100)", + "example": 25 + }, + "requireApproval": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether or not this stage requires manual approval to proceed" + }, + "duration": { + "nullable": true, + "type": "number", + "description": "Duration in seconds for automatic advancement, null for manual stages or the final stage", + "example": null + }, + "linearShift": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether to linearly shift traffic over the duration of this stage", + "example": false + } + }, + "required": [ + "duration", + "index", + "isFinalStage", + "requireApproval", + "targetPercentage" + ], + "type": "object", + "description": "All stages configured for this rolling release", + "example": [ + { + "index": 0, + "isFinalStage": false, + "targetPercentage": 5, + "requireApproval": true, + "duration": null + }, + { + "index": 1, + "isFinalStage": false, + "targetPercentage": 25, + "requireApproval": true, + "duration": null + }, + { + "index": 2, + "isFinalStage": false, + "targetPercentage": 60, + "requireApproval": true, + "duration": null + }, + { + "index": 3, + "isFinalStage": true, + "targetPercentage": 100, + "requireApproval": false, + "duration": null + } + ] + }, + "type": "array", + "description": "All stages configured for this rolling release", + "example": [ + { + "index": 0, + "isFinalStage": false, + "targetPercentage": 5, + "requireApproval": true, + "duration": null + }, + { + "index": 1, + "isFinalStage": false, + "targetPercentage": 25, + "requireApproval": true, + "duration": null + }, + { + "index": 2, + "isFinalStage": false, + "targetPercentage": 60, + "requireApproval": true, + "duration": null + }, + { + "index": 3, + "isFinalStage": true, + "targetPercentage": 100, + "requireApproval": false, + "duration": null + } + ] + }, + "activeStage": { + "nullable": true, + "properties": { + "index": { + "type": "number", + "description": "The zero-based index of the stage", + "example": 0 + }, + "isFinalStage": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether or not this stage is the final stage (targetPercentage === 100)", + "example": false + }, + "targetPercentage": { + "type": "number", + "description": "The percentage of traffic to serve to the canary deployment (0-100)", + "example": 25 + }, + "requireApproval": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether or not this stage requires manual approval to proceed" + }, + "duration": { + "nullable": true, + "type": "number", + "description": "Duration in seconds for automatic advancement, null for manual stages or the final stage", + "example": null + }, + "linearShift": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether to linearly shift traffic over the duration of this stage", + "example": false + } + }, + "required": [ + "duration", + "index", + "isFinalStage", + "requireApproval", + "targetPercentage" + ], + "type": "object", + "description": "The currently active stage, null if the rollout is aborted", + "example": { + "index": 1, + "isFinalStage": false, + "targetPercentage": 25, + "requireApproval": true, + "duration": null + } + }, + "nextStage": { + "nullable": true, + "properties": { + "index": { + "type": "number", + "description": "The zero-based index of the stage", + "example": 0 + }, + "isFinalStage": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether or not this stage is the final stage (targetPercentage === 100)", + "example": false + }, + "targetPercentage": { + "type": "number", + "description": "The percentage of traffic to serve to the canary deployment (0-100)", + "example": 25 + }, + "requireApproval": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether or not this stage requires manual approval to proceed" + }, + "duration": { + "nullable": true, + "type": "number", + "description": "Duration in seconds for automatic advancement, null for manual stages or the final stage", + "example": null + }, + "linearShift": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether to linearly shift traffic over the duration of this stage", + "example": false + } + }, + "required": [ + "duration", + "index", + "isFinalStage", + "requireApproval", + "targetPercentage" + ], + "type": "object", + "description": "The next stage to be activated, null if not in ACTIVE state", + "example": { + "index": 2, + "isFinalStage": false, + "targetPercentage": 60, + "requireApproval": true, + "duration": null + } + }, + "startedAt": { + "type": "number", + "description": "Unix timestamp in milliseconds when the rolling release started", + "example": 1716210500000 + }, + "updatedAt": { + "type": "number", + "description": "Unix timestamp in milliseconds when the rolling release was last updated", + "example": 1716210600000 + }, + "currentCanaryPercentage": { + "type": "number", + "description": "When set (for example while {@link substate} is `PAUSED`), the canary traffic percentage persisted on the rollout document — use for dashboard display when linear shift is active." + } + }, + "required": [ + "activeStage", + "advancementType", + "canaryDeployment", + "currentDeployment", + "nextStage", + "queuedDeploymentId", + "stages", + "startedAt", + "state", + "substate", + "updatedAt" + ], + "type": "object", + "description": "Rolling release information including configuration and document details, or null if no rolling release exists" + } + }, + "required": [ + "rollingRelease" + ], + "type": "object", + "description": "The response format for rolling release endpoints that return rolling release information" + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid.\nOne of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + }, + "500": { + "description": "" + } + }, + "parameters": [ + { + "name": "idOrName", + "description": "Project ID or project name (URL-encoded)", + "in": "path", + "required": true, + "schema": { + "description": "Project ID or project name (URL-encoded)", + "type": "string" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "nextStageIndex", + "canaryDeploymentId" + ], + "properties": { + "nextStageIndex": { + "description": "The index of the stage to transition to", + "type": "number" + }, + "canaryDeploymentId": { + "description": "The id of the canary deployment to approve for the next stage", + "type": "string" + } + } + } + } + } + } + } + }, + "/v1/projects/{idOrName}/rolling-release/start": { + "post": { + "description": "Start a rolling release for a deployment. If a rolling release is already active for the same canary deployment, returns the current state without side effects.", + "operationId": "startRollingRelease", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Start a rolling release for the project", + "tags": [ + "rolling-release" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "rollingRelease": { + "nullable": true, + "properties": { + "state": { + "type": "string", + "enum": [ + "ABORTED", + "ACTIVE", + "COMPLETE" + ], + "description": "The current state of the rolling release", + "example": "ACTIVE" + }, + "substate": { + "nullable": true, + "type": "string", + "enum": [ + "PAUSED", + null + ], + "description": "When set to `PAUSED`, the rollout is frozen at the current percentage until continued." + }, + "currentDeployment": { + "nullable": true, + "properties": { + "name": { + "type": "string", + "description": "The name of the project associated with the deployment at the time that the deployment was created", + "example": "my-project" + }, + "createdAt": { + "type": "number", + "description": "A number containing the date when the deployment was created in milliseconds", + "example": 1540257589405 + }, + "readyState": { + "type": "string", + "enum": [ + "BLOCKED", + "BUILDING", + "CANCELED", + "ERROR", + "INITIALIZING", + "QUEUED", + "READY" + ], + "description": "The state of the deployment depending on the process of deploying, or if it is ready or in an error state", + "example": "READY" + }, + "id": { + "type": "string", + "description": "A string holding the unique ID of the deployment", + "example": "dpl_89qyp1cskzkLrVicDaZoDbjyHuDJ" + }, + "target": { + "nullable": true, + "type": "string", + "enum": [ + "production", + "staging", + null + ], + "description": "If defined, either `staging` if a staging alias in the format `\u003cproject\u003e.\u003cteam\u003e.now.sh` was assigned upon creation, or `production` if the aliases from `alias` were assigned. `null` value indicates the \"preview\" deployment.", + "example": null + }, + "readyStateAt": { + "type": "number" + }, + "source": { + "type": "string", + "enum": [ + "api-trigger-git-deploy", + "cli", + "clone/repo", + "drop", + "git", + "git-deploy-hook", + "import", + "import/repo", + "redeploy", + "v0-web" + ], + "description": "Where was the deployment created from. Best-effort guess for metrics only — not authoritative; do not gate behavior on it.", + "example": "cli" + }, + "url": { + "type": "string", + "description": "A string with the unique URL of the deployment", + "example": "my-instant-deployment-3ij3cxz9qr.now.sh" + } + }, + "required": [ + "createdAt", + "id", + "name", + "readyState", + "url" + ], + "type": "object", + "description": "The current deployment receiving production traffic", + "example": { + "id": "dpl_abc123", + "name": "my-shop@main", + "url": "my-shop.vercel.app", + "target": "production", + "source": "git", + "createdAt": 1716206500000, + "readyState": "READY", + "readyStateAt": 1716206800000 + } + }, + "canaryDeployment": { + "nullable": true, + "properties": { + "name": { + "type": "string", + "description": "The name of the project associated with the deployment at the time that the deployment was created", + "example": "my-project" + }, + "createdAt": { + "type": "number", + "description": "A number containing the date when the deployment was created in milliseconds", + "example": 1540257589405 + }, + "readyState": { + "type": "string", + "enum": [ + "BLOCKED", + "BUILDING", + "CANCELED", + "ERROR", + "INITIALIZING", + "QUEUED", + "READY" + ], + "description": "The state of the deployment depending on the process of deploying, or if it is ready or in an error state", + "example": "READY" + }, + "id": { + "type": "string", + "description": "A string holding the unique ID of the deployment", + "example": "dpl_89qyp1cskzkLrVicDaZoDbjyHuDJ" + }, + "target": { + "nullable": true, + "type": "string", + "enum": [ + "production", + "staging", + null + ], + "description": "If defined, either `staging` if a staging alias in the format `\u003cproject\u003e.\u003cteam\u003e.now.sh` was assigned upon creation, or `production` if the aliases from `alias` were assigned. `null` value indicates the \"preview\" deployment.", + "example": null + }, + "readyStateAt": { + "type": "number" + }, + "source": { + "type": "string", + "enum": [ + "api-trigger-git-deploy", + "cli", + "clone/repo", + "drop", + "git", + "git-deploy-hook", + "import", + "import/repo", + "redeploy", + "v0-web" + ], + "description": "Where was the deployment created from. Best-effort guess for metrics only — not authoritative; do not gate behavior on it.", + "example": "cli" + }, + "url": { + "type": "string", + "description": "A string with the unique URL of the deployment", + "example": "my-instant-deployment-3ij3cxz9qr.now.sh" + } + }, + "required": [ + "createdAt", + "id", + "name", + "readyState", + "url" + ], + "type": "object", + "description": "The canary deployment being rolled out", + "example": { + "id": "dpl_def456", + "name": "my-shop@9c7e2f4", + "url": "9c7e2f4-my-shop.vercel.app", + "target": "production", + "source": "git", + "createdAt": 1716210100000, + "readyState": "READY", + "readyStateAt": 1716210400000 + } + }, + "queuedDeploymentId": { + "nullable": true, + "type": "string", + "description": "The ID of a deployment queued for the next rolling release", + "example": "dpl_ghi789" + }, + "advancementType": { + "type": "string", + "enum": [ + "automatic", + "manual-approval" + ], + "description": "The advancement type of the rolling release", + "example": "manual-approval" + }, + "stages": { + "items": { + "properties": { + "index": { + "type": "number", + "description": "The zero-based index of the stage", + "example": 0 + }, + "isFinalStage": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether or not this stage is the final stage (targetPercentage === 100)", + "example": false + }, + "targetPercentage": { + "type": "number", + "description": "The percentage of traffic to serve to the canary deployment (0-100)", + "example": 25 + }, + "requireApproval": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether or not this stage requires manual approval to proceed" + }, + "duration": { + "nullable": true, + "type": "number", + "description": "Duration in seconds for automatic advancement, null for manual stages or the final stage", + "example": null + }, + "linearShift": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether to linearly shift traffic over the duration of this stage", + "example": false + } + }, + "required": [ + "duration", + "index", + "isFinalStage", + "requireApproval", + "targetPercentage" + ], + "type": "object", + "description": "All stages configured for this rolling release", + "example": [ + { + "index": 0, + "isFinalStage": false, + "targetPercentage": 5, + "requireApproval": true, + "duration": null + }, + { + "index": 1, + "isFinalStage": false, + "targetPercentage": 25, + "requireApproval": true, + "duration": null + }, + { + "index": 2, + "isFinalStage": false, + "targetPercentage": 60, + "requireApproval": true, + "duration": null + }, + { + "index": 3, + "isFinalStage": true, + "targetPercentage": 100, + "requireApproval": false, + "duration": null + } + ] + }, + "type": "array", + "description": "All stages configured for this rolling release", + "example": [ + { + "index": 0, + "isFinalStage": false, + "targetPercentage": 5, + "requireApproval": true, + "duration": null + }, + { + "index": 1, + "isFinalStage": false, + "targetPercentage": 25, + "requireApproval": true, + "duration": null + }, + { + "index": 2, + "isFinalStage": false, + "targetPercentage": 60, + "requireApproval": true, + "duration": null + }, + { + "index": 3, + "isFinalStage": true, + "targetPercentage": 100, + "requireApproval": false, + "duration": null + } + ] + }, + "activeStage": { + "nullable": true, + "properties": { + "index": { + "type": "number", + "description": "The zero-based index of the stage", + "example": 0 + }, + "isFinalStage": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether or not this stage is the final stage (targetPercentage === 100)", + "example": false + }, + "targetPercentage": { + "type": "number", + "description": "The percentage of traffic to serve to the canary deployment (0-100)", + "example": 25 + }, + "requireApproval": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether or not this stage requires manual approval to proceed" + }, + "duration": { + "nullable": true, + "type": "number", + "description": "Duration in seconds for automatic advancement, null for manual stages or the final stage", + "example": null + }, + "linearShift": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether to linearly shift traffic over the duration of this stage", + "example": false + } + }, + "required": [ + "duration", + "index", + "isFinalStage", + "requireApproval", + "targetPercentage" + ], + "type": "object", + "description": "The currently active stage, null if the rollout is aborted", + "example": { + "index": 1, + "isFinalStage": false, + "targetPercentage": 25, + "requireApproval": true, + "duration": null + } + }, + "nextStage": { + "nullable": true, + "properties": { + "index": { + "type": "number", + "description": "The zero-based index of the stage", + "example": 0 + }, + "isFinalStage": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether or not this stage is the final stage (targetPercentage === 100)", + "example": false + }, + "targetPercentage": { + "type": "number", + "description": "The percentage of traffic to serve to the canary deployment (0-100)", + "example": 25 + }, + "requireApproval": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether or not this stage requires manual approval to proceed" + }, + "duration": { + "nullable": true, + "type": "number", + "description": "Duration in seconds for automatic advancement, null for manual stages or the final stage", + "example": null + }, + "linearShift": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether to linearly shift traffic over the duration of this stage", + "example": false + } + }, + "required": [ + "duration", + "index", + "isFinalStage", + "requireApproval", + "targetPercentage" + ], + "type": "object", + "description": "The next stage to be activated, null if not in ACTIVE state", + "example": { + "index": 2, + "isFinalStage": false, + "targetPercentage": 60, + "requireApproval": true, + "duration": null + } + }, + "startedAt": { + "type": "number", + "description": "Unix timestamp in milliseconds when the rolling release started", + "example": 1716210500000 + }, + "updatedAt": { + "type": "number", + "description": "Unix timestamp in milliseconds when the rolling release was last updated", + "example": 1716210600000 + }, + "currentCanaryPercentage": { + "type": "number", + "description": "When set (for example while {@link substate} is `PAUSED`), the canary traffic percentage persisted on the rollout document — use for dashboard display when linear shift is active." + } + }, + "required": [ + "activeStage", + "advancementType", + "canaryDeployment", + "currentDeployment", + "nextStage", + "queuedDeploymentId", + "stages", + "startedAt", + "state", + "substate", + "updatedAt" + ], + "type": "object", + "description": "Rolling release information including configuration and document details, or null if no rolling release exists" + } + }, + "required": [ + "rollingRelease" + ], + "type": "object", + "description": "The response format for rolling release endpoints that return rolling release information" + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid.\nOne of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "409": { + "description": "" + }, + "410": { + "description": "" + }, + "422": { + "description": "" + } + }, + "parameters": [ + { + "name": "idOrName", + "description": "Project ID or project name (URL-encoded)", + "in": "path", + "required": true, + "schema": { + "description": "Project ID or project name (URL-encoded)", + "type": "string" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "canaryDeploymentId" + ], + "properties": { + "canaryDeploymentId": { + "description": "The ID of the canary deployment to start the rolling release for", + "type": "string" + } + } + } + } + } + } + } + }, + "/v1/projects/{idOrName}/rolling-release/complete": { + "post": { + "description": "Force-complete a Rolling Release. The canary deployment will begin serving 100% of the traffic.", + "operationId": "completeRollingRelease", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Complete the rolling release for the project", + "tags": [ + "rolling-release" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "rollingRelease": { + "nullable": true, + "properties": { + "state": { + "type": "string", + "enum": [ + "ABORTED", + "ACTIVE", + "COMPLETE" + ], + "description": "The current state of the rolling release", + "example": "ACTIVE" + }, + "substate": { + "nullable": true, + "type": "string", + "enum": [ + "PAUSED", + null + ], + "description": "When set to `PAUSED`, the rollout is frozen at the current percentage until continued." + }, + "currentDeployment": { + "nullable": true, + "properties": { + "name": { + "type": "string", + "description": "The name of the project associated with the deployment at the time that the deployment was created", + "example": "my-project" + }, + "createdAt": { + "type": "number", + "description": "A number containing the date when the deployment was created in milliseconds", + "example": 1540257589405 + }, + "readyState": { + "type": "string", + "enum": [ + "BLOCKED", + "BUILDING", + "CANCELED", + "ERROR", + "INITIALIZING", + "QUEUED", + "READY" + ], + "description": "The state of the deployment depending on the process of deploying, or if it is ready or in an error state", + "example": "READY" + }, + "id": { + "type": "string", + "description": "A string holding the unique ID of the deployment", + "example": "dpl_89qyp1cskzkLrVicDaZoDbjyHuDJ" + }, + "target": { + "nullable": true, + "type": "string", + "enum": [ + "production", + "staging", + null + ], + "description": "If defined, either `staging` if a staging alias in the format `\u003cproject\u003e.\u003cteam\u003e.now.sh` was assigned upon creation, or `production` if the aliases from `alias` were assigned. `null` value indicates the \"preview\" deployment.", + "example": null + }, + "readyStateAt": { + "type": "number" + }, + "source": { + "type": "string", + "enum": [ + "api-trigger-git-deploy", + "cli", + "clone/repo", + "drop", + "git", + "git-deploy-hook", + "import", + "import/repo", + "redeploy", + "v0-web" + ], + "description": "Where was the deployment created from. Best-effort guess for metrics only — not authoritative; do not gate behavior on it.", + "example": "cli" + }, + "url": { + "type": "string", + "description": "A string with the unique URL of the deployment", + "example": "my-instant-deployment-3ij3cxz9qr.now.sh" + } + }, + "required": [ + "createdAt", + "id", + "name", + "readyState", + "url" + ], + "type": "object", + "description": "The current deployment receiving production traffic", + "example": { + "id": "dpl_abc123", + "name": "my-shop@main", + "url": "my-shop.vercel.app", + "target": "production", + "source": "git", + "createdAt": 1716206500000, + "readyState": "READY", + "readyStateAt": 1716206800000 + } + }, + "canaryDeployment": { + "nullable": true, + "properties": { + "name": { + "type": "string", + "description": "The name of the project associated with the deployment at the time that the deployment was created", + "example": "my-project" + }, + "createdAt": { + "type": "number", + "description": "A number containing the date when the deployment was created in milliseconds", + "example": 1540257589405 + }, + "readyState": { + "type": "string", + "enum": [ + "BLOCKED", + "BUILDING", + "CANCELED", + "ERROR", + "INITIALIZING", + "QUEUED", + "READY" + ], + "description": "The state of the deployment depending on the process of deploying, or if it is ready or in an error state", + "example": "READY" + }, + "id": { + "type": "string", + "description": "A string holding the unique ID of the deployment", + "example": "dpl_89qyp1cskzkLrVicDaZoDbjyHuDJ" + }, + "target": { + "nullable": true, + "type": "string", + "enum": [ + "production", + "staging", + null + ], + "description": "If defined, either `staging` if a staging alias in the format `\u003cproject\u003e.\u003cteam\u003e.now.sh` was assigned upon creation, or `production` if the aliases from `alias` were assigned. `null` value indicates the \"preview\" deployment.", + "example": null + }, + "readyStateAt": { + "type": "number" + }, + "source": { + "type": "string", + "enum": [ + "api-trigger-git-deploy", + "cli", + "clone/repo", + "drop", + "git", + "git-deploy-hook", + "import", + "import/repo", + "redeploy", + "v0-web" + ], + "description": "Where was the deployment created from. Best-effort guess for metrics only — not authoritative; do not gate behavior on it.", + "example": "cli" + }, + "url": { + "type": "string", + "description": "A string with the unique URL of the deployment", + "example": "my-instant-deployment-3ij3cxz9qr.now.sh" + } + }, + "required": [ + "createdAt", + "id", + "name", + "readyState", + "url" + ], + "type": "object", + "description": "The canary deployment being rolled out", + "example": { + "id": "dpl_def456", + "name": "my-shop@9c7e2f4", + "url": "9c7e2f4-my-shop.vercel.app", + "target": "production", + "source": "git", + "createdAt": 1716210100000, + "readyState": "READY", + "readyStateAt": 1716210400000 + } + }, + "queuedDeploymentId": { + "nullable": true, + "type": "string", + "description": "The ID of a deployment queued for the next rolling release", + "example": "dpl_ghi789" + }, + "advancementType": { + "type": "string", + "enum": [ + "automatic", + "manual-approval" + ], + "description": "The advancement type of the rolling release", + "example": "manual-approval" + }, + "stages": { + "items": { + "properties": { + "index": { + "type": "number", + "description": "The zero-based index of the stage", + "example": 0 + }, + "isFinalStage": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether or not this stage is the final stage (targetPercentage === 100)", + "example": false + }, + "targetPercentage": { + "type": "number", + "description": "The percentage of traffic to serve to the canary deployment (0-100)", + "example": 25 + }, + "requireApproval": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether or not this stage requires manual approval to proceed" + }, + "duration": { + "nullable": true, + "type": "number", + "description": "Duration in seconds for automatic advancement, null for manual stages or the final stage", + "example": null + }, + "linearShift": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether to linearly shift traffic over the duration of this stage", + "example": false + } + }, + "required": [ + "duration", + "index", + "isFinalStage", + "requireApproval", + "targetPercentage" + ], + "type": "object", + "description": "All stages configured for this rolling release", + "example": [ + { + "index": 0, + "isFinalStage": false, + "targetPercentage": 5, + "requireApproval": true, + "duration": null + }, + { + "index": 1, + "isFinalStage": false, + "targetPercentage": 25, + "requireApproval": true, + "duration": null + }, + { + "index": 2, + "isFinalStage": false, + "targetPercentage": 60, + "requireApproval": true, + "duration": null + }, + { + "index": 3, + "isFinalStage": true, + "targetPercentage": 100, + "requireApproval": false, + "duration": null + } + ] + }, + "type": "array", + "description": "All stages configured for this rolling release", + "example": [ + { + "index": 0, + "isFinalStage": false, + "targetPercentage": 5, + "requireApproval": true, + "duration": null + }, + { + "index": 1, + "isFinalStage": false, + "targetPercentage": 25, + "requireApproval": true, + "duration": null + }, + { + "index": 2, + "isFinalStage": false, + "targetPercentage": 60, + "requireApproval": true, + "duration": null + }, + { + "index": 3, + "isFinalStage": true, + "targetPercentage": 100, + "requireApproval": false, + "duration": null + } + ] + }, + "activeStage": { + "nullable": true, + "properties": { + "index": { + "type": "number", + "description": "The zero-based index of the stage", + "example": 0 + }, + "isFinalStage": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether or not this stage is the final stage (targetPercentage === 100)", + "example": false + }, + "targetPercentage": { + "type": "number", + "description": "The percentage of traffic to serve to the canary deployment (0-100)", + "example": 25 + }, + "requireApproval": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether or not this stage requires manual approval to proceed" + }, + "duration": { + "nullable": true, + "type": "number", + "description": "Duration in seconds for automatic advancement, null for manual stages or the final stage", + "example": null + }, + "linearShift": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether to linearly shift traffic over the duration of this stage", + "example": false + } + }, + "required": [ + "duration", + "index", + "isFinalStage", + "requireApproval", + "targetPercentage" + ], + "type": "object", + "description": "The currently active stage, null if the rollout is aborted", + "example": { + "index": 1, + "isFinalStage": false, + "targetPercentage": 25, + "requireApproval": true, + "duration": null + } + }, + "nextStage": { + "nullable": true, + "properties": { + "index": { + "type": "number", + "description": "The zero-based index of the stage", + "example": 0 + }, + "isFinalStage": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether or not this stage is the final stage (targetPercentage === 100)", + "example": false + }, + "targetPercentage": { + "type": "number", + "description": "The percentage of traffic to serve to the canary deployment (0-100)", + "example": 25 + }, + "requireApproval": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether or not this stage requires manual approval to proceed" + }, + "duration": { + "nullable": true, + "type": "number", + "description": "Duration in seconds for automatic advancement, null for manual stages or the final stage", + "example": null + }, + "linearShift": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether to linearly shift traffic over the duration of this stage", + "example": false + } + }, + "required": [ + "duration", + "index", + "isFinalStage", + "requireApproval", + "targetPercentage" + ], + "type": "object", + "description": "The next stage to be activated, null if not in ACTIVE state", + "example": { + "index": 2, + "isFinalStage": false, + "targetPercentage": 60, + "requireApproval": true, + "duration": null + } + }, + "startedAt": { + "type": "number", + "description": "Unix timestamp in milliseconds when the rolling release started", + "example": 1716210500000 + }, + "updatedAt": { + "type": "number", + "description": "Unix timestamp in milliseconds when the rolling release was last updated", + "example": 1716210600000 + }, + "currentCanaryPercentage": { + "type": "number", + "description": "When set (for example while {@link substate} is `PAUSED`), the canary traffic percentage persisted on the rollout document — use for dashboard display when linear shift is active." + } + }, + "required": [ + "activeStage", + "advancementType", + "canaryDeployment", + "currentDeployment", + "nextStage", + "queuedDeploymentId", + "stages", + "startedAt", + "state", + "substate", + "updatedAt" + ], + "type": "object", + "description": "Rolling release information including configuration and document details, or null if no rolling release exists" + } + }, + "required": [ + "rollingRelease" + ], + "type": "object", + "description": "The response format for rolling release endpoints that return rolling release information" + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid.\nOne of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "idOrName", + "description": "Project ID or project name (URL-encoded)", + "in": "path", + "required": true, + "schema": { + "description": "Project ID or project name (URL-encoded)", + "type": "string" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "canaryDeploymentId" + ], + "properties": { + "canaryDeploymentId": { + "description": "The ID of the canary deployment to complete", + "type": "string" + } + } + } + } + } + } + } + }, + "/projects/{idOrName}/transfer-request": { + "post": { + "description": "Initiates a project transfer request from one team to another. \u003cbr/\u003e Returns a `code` that remains valid for 24 hours and can be used to accept the transfer request by another team using the `PUT /projects/transfer-request/:code` endpoint. \u003cbr/\u003e Users can also accept the project transfer request using the claim URL: `https://vercel.com/claim-deployment?code=\u003ccode\u003e\u0026returnUrl=\u003creturnUrl\u003e`. \u003cbr/\u003e The `code` parameter specifies the project transfer request code generated using this endpoint. \u003cbr/\u003e The `returnUrl` parameter redirects users to a specific page of the application if the claim URL is invalid or expired.", + "operationId": "createProjectTransferRequest", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Create project transfer request", + "tags": [ + "projects" + ], + "responses": { + "200": { + "description": "The project transfer request has been initiated successfully.", + "content": { + "application/json": { + "schema": { + "properties": { + "code": { + "type": "string" + } + }, + "required": [ + "code" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid.\nOne of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "409": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "idOrName", + "description": "The ID or name of the project to transfer.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "description": "The ID or name of the project to transfer." + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "callbackUrl": { + "type": "string", + "description": "The URL to send a webhook to when the transfer is accepted." + }, + "callbackSecret": { + "type": "string", + "description": "The secret to use to sign the webhook payload with HMAC-SHA256." + } + } + } + } + } + } + } + }, + "/projects/transfer-request/{code}": { + "put": { + "description": "Accept a project transfer request initated by another team. \u003cbr/\u003e The `code` is generated using the `POST /projects/:idOrName/transfer-request` endpoint.", + "operationId": "acceptProjectTransferRequest", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Accept project transfer request", + "tags": [ + "projects" + ], + "responses": { + "202": { + "description": "The project has been transferred successfully.", + "content": { + "application/json": { + "schema": { + "oneOf": [ + { + "properties": { + "partnerCalls": { + "items": { + "properties": { + "installationId": { + "type": "string" + }, + "resourceIds": { + "items": { + "type": "string" + }, + "type": "array" + }, + "result": { + "properties": { + "status": { + "type": "string", + "enum": [ + "errored", + "fulfilled" + ] + }, + "error": { + "type": "object" + }, + "code": { + "type": "string" + } + }, + "required": [ + "status" + ], + "type": "object" + } + }, + "required": [ + "installationId", + "resourceIds", + "result" + ], + "type": "object" + }, + "type": "array" + }, + "resourceTransferErrors": { + "items": { + "type": "object" + }, + "type": "array" + }, + "transferredStoreIds": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "partnerCalls", + "resourceTransferErrors", + "transferredStoreIds" + ], + "type": "object" + }, + { + "type": "object" + } + ] + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid.\nOne of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + }, + "422": { + "description": "" + } + }, + "parameters": [ + { + "name": "code", + "description": "The code of the project transfer request.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "description": "The code of the project transfer request." + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "additionalProperties": false, + "properties": { + "newProjectName": { + "description": "The desired name for the project", + "example": "a-project-name", + "type": "string", + "maxLength": 100 + }, + "paidFeatures": { + "type": "object", + "additionalProperties": false, + "properties": { + "concurrentBuilds": { + "type": "integer", + "nullable": true + }, + "passwordProtection": { + "type": "boolean", + "nullable": true + }, + "previewDeploymentSuffix": { + "type": "boolean", + "nullable": true + } + } + }, + "acceptedPolicies": { + "type": "object", + "additionalProperties": { + "type": "object", + "additionalProperties": { + "type": "string", + "format": "date-time" + }, + "required": [ + "eula", + "privacy" + ], + "properties": { + "eula": { + "type": "string", + "format": "date-time" + }, + "privacy": { + "type": "string", + "format": "date-time" + } + } + } + } + } + } + } + } + } + } + }, + "/v1/projects/{idOrName}/protection-bypass": { + "patch": { + "description": "Update the deployment protection automation bypass for a project", + "operationId": "updateProjectProtectionBypass", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Update Protection Bypass for Automation", + "tags": [ + "projects" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "protectionBypass": { + "additionalProperties": { + "oneOf": [ + { + "properties": { + "createdAt": { + "type": "number" + }, + "createdBy": { + "type": "string" + }, + "scope": { + "type": "string", + "enum": [ + "integration-automation-bypass" + ] + }, + "integrationId": { + "type": "string" + }, + "configurationId": { + "type": "string" + } + }, + "required": [ + "configurationId", + "createdAt", + "createdBy", + "integrationId", + "scope" + ], + "type": "object" + }, + { + "properties": { + "createdAt": { + "type": "number" + }, + "createdBy": { + "type": "string" + }, + "scope": { + "type": "string", + "enum": [ + "automation-bypass" + ] + }, + "isEnvVar": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "When there was only one bypass, it was automatically set as an env var on deployments. With multiple bypasses, there is always one bypass that is selected as the default, and gets set as an env var on deployments. As this is a new field, undefined means that the bypass is the env var. If there are any automation bypasses, exactly one must be the env var." + }, + "note": { + "type": "string", + "description": "Optional note about the bypass to be displayed in the UI" + } + }, + "required": [ + "createdAt", + "createdBy", + "scope" + ], + "type": "object" + } + ] + }, + "type": "object" + } + }, + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid.\nOne of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "409": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "idOrName", + "description": "The unique project identifier or the project name", + "in": "path", + "required": true, + "schema": { + "description": "The unique project identifier or the project name", + "type": "string" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "revoke": { + "description": "Optional instructions for revoking and regenerating a automation bypass", + "type": "object", + "properties": { + "secret": { + "description": "Automation bypass to revoked", + "type": "string" + }, + "regenerate": { + "description": "Whether or not a new automation bypass should be created after the provided secret is revoked", + "type": "boolean" + } + }, + "required": [ + "secret", + "regenerate" + ] + }, + "generate": { + "description": "Generate a new secret. If neither generate or revoke are provided, a new random secret will be generated.", + "type": "object", + "properties": { + "secret": { + "description": "Optional value of the secret to generate, don't send it for oauth2 tokens", + "type": "string", + "pattern": "^[a-zA-Z0-9]{32}$" + }, + "note": { + "type": "string", + "description": "Note to be displayed in the UI for this bypass", + "maxLength": 100 + } + } + }, + "update": { + "description": "Update an existing bypass", + "type": "object", + "required": [ + "secret" + ], + "properties": { + "secret": { + "description": "Automation bypass to updated", + "type": "string" + }, + "isEnvVar": { + "type": "boolean", + "description": "Whether or not this bypass is set as the VERCEL_AUTOMATION_BYPASS_SECRET environment variable on deployments" + }, + "note": { + "type": "string", + "description": "Note to be displayed in the UI for this bypass", + "maxLength": 100 + } + } + } + }, + "additionalProperties": false + } + } + }, + "required": true + } + } + }, + "/v1/projects/{projectId}/rollback/{deploymentId}": { + "post": { + "description": "Allows users to rollback to a deployment.", + "operationId": "requestRollback", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Point production traffic to a previous production deployment by ID", + "tags": [ + "projects" + ], + "responses": { + "201": { + "description": "" + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "402": { + "description": "" + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "409": { + "description": "" + }, + "410": { + "description": "" + }, + "422": { + "description": "" + } + }, + "parameters": [ + { + "name": "projectId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "deploymentId", + "description": "The ID of the deployment to rollback *to*", + "in": "path", + "required": true, + "schema": { + "type": "string", + "description": "The ID of the deployment to rollback *to*" + } + }, + { + "name": "description", + "description": "The reason for the rollback", + "in": "query", + "required": false, + "schema": { + "type": "string", + "description": "The reason for the rollback" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + } + }, + "/v1/projects/{projectId}/rollback/{deploymentId}/update-description": { + "patch": { + "description": "Updates the reason for a rollback, without changing the rollback status itself.", + "operationId": "updateProjectsByProjectIdRollbackByDeploymentIdUpdateDescription", + "security": [], + "summary": "Updates the description for a rollback", + "tags": [ + "projects" + ], + "responses": { + "200": { + "description": "" + }, + "400": { + "description": "One of the provided values in the request body is invalid.\nOne of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "409": { + "description": "" + }, + "410": { + "description": "" + }, + "422": { + "description": "" + } + }, + "parameters": [ + { + "name": "projectId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "deploymentId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "description": { + "type": "string", + "description": "The reason for the rollback" + } + } + } + } + } + } + } + }, + "/v1/projects/{projectId}/microfrontends": { + "patch": { + "description": "Update the microfrontends settings for a project.", + "operationId": "updateMicrofrontends", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Update the microfrontends settings", + "tags": [ + "projects" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "accountId": { + "type": "string" + }, + "creator": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "user" + ] + }, + "via": { + "nullable": true, + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "app" + ] + }, + "app": { + "properties": { + "id": { + "type": "string", + "description": "The internal ID of the Vercel App backing this principal." + }, + "clientId": { + "type": "string", + "description": "The protocol-facing OAuth client ID. This may differ from {@link id} when Client ID Metadata Documents (CIMD) are used." + } + }, + "required": [ + "id" + ], + "type": "object" + } + }, + "required": [ + "app", + "type" + ], + "type": "object", + "description": "Set when a Vercel App or Integration acts on behalf of a {@link User}. Captures user-consented OAuth delegation that the ACL layer may inspect to evaluate scope restrictions. This is NOT for impersonation or token-exchange provenance — those live on `auth.token`, not on the principal." + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "integration" + ] + }, + "integration": { + "properties": { + "integrationId": { + "type": "string" + }, + "configurationId": { + "type": "string" + } + }, + "required": [ + "configurationId", + "integrationId" + ], + "type": "object" + } + }, + "required": [ + "integration", + "type" + ], + "type": "object", + "description": "Set when a Vercel App or Integration acts on behalf of a {@link User}. Captures user-consented OAuth delegation that the ACL layer may inspect to evaluate scope restrictions. This is NOT for impersonation or token-exchange provenance — those live on `auth.token`, not on the principal." + } + ] + }, + "user": { + "properties": { + "id": { + "type": "string" + } + }, + "required": [ + "id" + ], + "type": "object" + } + }, + "required": [ + "type", + "user", + "via" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "app" + ] + }, + "app": { + "properties": { + "id": { + "type": "string", + "description": "The internal ID of the Vercel App backing this principal." + }, + "clientId": { + "type": "string", + "description": "The protocol-facing OAuth client ID. This may differ from {@link id} when Client ID Metadata Documents (CIMD) are used." + } + }, + "required": [ + "id" + ], + "type": "object" + } + }, + "required": [ + "app", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "integration" + ] + }, + "integration": { + "properties": { + "integrationId": { + "type": "string" + }, + "configurationId": { + "type": "string" + } + }, + "required": [ + "configurationId", + "integrationId" + ], + "type": "object" + } + }, + "required": [ + "integration", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "system" + ] + } + }, + "required": [ + "type" + ], + "type": "object" + } + ] + }, + "alias": { + "items": { + "properties": { + "configuredBy": { + "nullable": true, + "type": "string", + "enum": [ + "A", + "CNAME", + "dns-01", + "http", + null + ] + }, + "configuredChangedAt": { + "nullable": true, + "type": "number" + }, + "createdAt": { + "nullable": true, + "type": "number" + }, + "deployment": { + "nullable": true, + "properties": { + "id": { + "type": "string" + }, + "alias": { + "items": { + "type": "string" + }, + "type": "array" + }, + "aliasAssigned": { + "nullable": true, + "oneOf": [ + { + "type": "number" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + } + ] + }, + "aliasError": { + "nullable": true, + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" + }, + "aliasFinal": { + "nullable": true, + "type": "string" + }, + "automaticAliases": { + "items": { + "type": "string" + }, + "type": "array" + }, + "branchMatcher": { + "properties": { + "type": { + "type": "string", + "enum": [ + "endsWith", + "equals", + "startsWith" + ], + "description": "The type of matching to perform" + }, + "pattern": { + "type": "string", + "description": "The pattern to match against branch names" + } + }, + "required": [ + "pattern", + "type" + ], + "type": "object" + }, + "buildingAt": { + "type": "number" + }, + "builds": { + "items": { + "properties": { + "use": { + "type": "string" + }, + "src": { + "type": "string" + }, + "dest": { + "type": "string" + } + }, + "required": [ + "use" + ], + "type": "object" + }, + "type": "array" + }, + "checksConclusion": { + "type": "string", + "enum": [ + "canceled", + "failed", + "skipped", + "succeeded" + ] + }, + "checksState": { + "type": "string", + "enum": [ + "completed", + "registered", + "running" + ] + }, + "connectBuildsEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "connectConfigurationId": { + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "createdIn": { + "type": "string" + }, + "creator": { + "nullable": true, + "properties": { + "email": { + "type": "string" + }, + "githubLogin": { + "type": "string" + }, + "gitlabLogin": { + "type": "string" + }, + "uid": { + "type": "string" + }, + "username": { + "type": "string" + } + }, + "required": [ + "email", + "uid", + "username" + ], + "type": "object" + }, + "deletedAt": { + "type": "number" + }, + "deploymentHostname": { + "type": "string" + }, + "forced": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "name": { + "type": "string" + }, + "meta": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "monorepoManager": { + "nullable": true, + "type": "string" + }, + "oidcTokenClaims": { + "properties": { + "iss": { + "type": "string" + }, + "sub": { + "type": "string" + }, + "scope": { + "type": "string" + }, + "aud": { + "type": "string" + }, + "owner": { + "type": "string" + }, + "owner_id": { + "type": "string" + }, + "project": { + "type": "string" + }, + "project_id": { + "type": "string" + }, + "environment": { + "type": "string" + }, + "custom_environment_id": { + "type": "string" + }, + "mfe_group_ids": { + "items": { + "type": "string" + }, + "type": "array" + }, + "plan": { + "type": "string" + } + }, + "required": [ + "aud", + "environment", + "iss", + "owner", + "owner_id", + "project", + "project_id", + "scope", + "sub" + ], + "type": "object" + }, + "plan": { + "type": "string", + "enum": [ + "enterprise", + "hobby", + "pro" + ] + }, + "previewCommentsEnabled": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether or not preview comments are enabled for the deployment", + "example": false + }, + "private": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "readyAt": { + "type": "number" + }, + "readyState": { + "type": "string", + "enum": [ + "BLOCKED", + "BUILDING", + "CANCELED", + "ERROR", + "INITIALIZING", + "QUEUED", + "READY" + ] + }, + "readySubstate": { + "type": "string", + "enum": [ + "PROMOTED", + "ROLLING", + "STAGED" + ] + }, + "requestedAt": { + "type": "number" + }, + "target": { + "nullable": true, + "type": "string" + }, + "teamId": { + "nullable": true, + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "LAMBDAS" + ] + }, + "url": { + "type": "string" + }, + "userId": { + "type": "string", + "description": "Present for user creators; omitted for app/integration/system creators." + }, + "withCache": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "createdAt", + "createdIn", + "creator", + "deploymentHostname", + "id", + "name", + "plan", + "private", + "readyState", + "type", + "url" + ], + "type": "object" + }, + "domain": { + "type": "string" + }, + "environment": { + "type": "string", + "enum": [ + "preview", + "production" + ] + }, + "gitBranch": { + "nullable": true, + "type": "string" + }, + "redirect": { + "nullable": true, + "type": "string" + }, + "redirectStatusCode": { + "nullable": true, + "type": "number", + "enum": [ + 301, + 302, + 307, + 308, + null + ] + }, + "target": { + "type": "string", + "enum": [ + "PREVIEW", + "PRODUCTION", + "STAGING" + ] + } + }, + "required": [ + "deployment", + "domain", + "environment", + "target" + ], + "type": "object" + }, + "type": "array" + }, + "analytics": { + "properties": { + "id": { + "type": "string" + }, + "canceledAt": { + "nullable": true, + "type": "number" + }, + "disabledAt": { + "type": "number" + }, + "enabledAt": { + "type": "number" + }, + "paidAt": { + "type": "number" + }, + "sampleRatePercent": { + "nullable": true, + "type": "number" + }, + "spendLimitInDollars": { + "nullable": true, + "type": "number" + } + }, + "required": [ + "disabledAt", + "enabledAt", + "id" + ], + "type": "object" + }, + "appliedCve55182Migration": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "speedInsights": { + "properties": { + "id": { + "type": "string" + }, + "enabledAt": { + "type": "number" + }, + "disabledAt": { + "type": "number" + }, + "canceledAt": { + "type": "number" + }, + "hasData": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "dataReceivedAt": { + "type": "number", + "description": "When the first free (not Speed Insights Plus) production data point was observed, in ms. Set once by subscriber-analytics-events; projects that already had data before this field shipped get it backfilled on their next batch, so it reads \"first free data point observed\", not necessarily \"first ever\"." + }, + "paidAt": { + "type": "number" + } + }, + "required": [ + "id" + ], + "type": "object" + }, + "autoExposeSystemEnvs": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "autoAssignCustomDomains": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "autoAssignCustomDomainsUpdatedBy": { + "type": "string" + }, + "buildCommand": { + "nullable": true, + "type": "string" + }, + "commandForIgnoringBuildStep": { + "nullable": true, + "type": "string" + }, + "connectConfigurations": { + "nullable": true, + "items": { + "properties": { + "envId": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "string", + "enum": [ + "preview", + "production" + ] + } + ] + }, + "connectConfigurationId": { + "type": "string" + }, + "dc": { + "type": "string" + }, + "passive": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "buildsEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "aws": { + "properties": { + "subnetIds": { + "items": { + "type": "string" + }, + "type": "array" + }, + "securityGroupId": { + "type": "string" + } + }, + "required": [ + "subnetIds" + ], + "type": "object" + }, + "createdAt": { + "type": "number" + }, + "updatedAt": { + "type": "number" + } + }, + "required": [ + "buildsEnabled", + "connectConfigurationId", + "createdAt", + "envId", + "passive", + "updatedAt" + ], + "type": "object" + }, + "type": "array" + }, + "connectConfigurationId": { + "nullable": true, + "type": "string" + }, + "connectBuildsEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "passiveConnectConfigurationId": { + "nullable": true, + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "customerSupportCodeVisibility": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "crons": { + "properties": { + "enabledAt": { + "type": "number", + "description": "The time the feature was enabled for this project. Note: It enables automatically with the first Deployment that outputs cronjobs." + }, + "disabledAt": { + "nullable": true, + "type": "number", + "description": "The time the feature was disabled for this project." + }, + "updatedAt": { + "type": "number" + }, + "deploymentId": { + "nullable": true, + "type": "string", + "description": "The ID of the Deployment from which the definitions originated." + }, + "definitions": { + "items": { + "properties": { + "host": { + "type": "string", + "description": "The hostname that should be used.", + "example": "vercel.com" + }, + "path": { + "type": "string", + "description": "The path that should be called for the cronjob.", + "example": "/api/crons/sync-something?hello=world" + }, + "schedule": { + "type": "string", + "description": "The cron expression.", + "example": "0 0 * * *" + }, + "source": { + "type": "string", + "enum": [ + "api" + ], + "description": "The origin of this definition. 'api' means created via the API. Undefined means it originated from a deployment (vercel.json)." + }, + "description": { + "type": "string", + "description": "A human-readable description of what this cron job does." + }, + "hostInferred": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether the host was inferred from the production deployment URL rather than explicitly provided." + } + }, + "required": [ + "host", + "path", + "schedule" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "definitions", + "deploymentId", + "disabledAt", + "enabledAt", + "updatedAt" + ], + "type": "object" + }, + "dataCache": { + "properties": { + "userDisabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "storageSizeBytes": { + "nullable": true, + "type": "number" + }, + "unlimited": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "userDisabled" + ], + "type": "object" + }, + "deploymentExpiration": { + "properties": { + "expirationDays": { + "type": "number", + "description": "Number of days to keep non-production deployments (mostly preview deployments) before soft deletion." + }, + "expirationDaysProduction": { + "type": "number", + "description": "Number of days to keep production deployments before soft deletion." + }, + "expirationDaysCanceled": { + "type": "number", + "description": "Number of days to keep canceled deployments before soft deletion." + }, + "expirationDaysErrored": { + "type": "number", + "description": "Number of days to keep errored deployments before soft deletion." + }, + "deploymentsToKeep": { + "type": "number", + "description": "Minimum number of production deployments to keep for this project, even if they are over the production expiration limit." + } + }, + "type": "object", + "description": "Retention policies for deployments. These are enforced at the project level, but we also maintain an instance of this at the team level as a default policy that gets applied to new projects." + }, + "expiration": { + "oneOf": [ + { + "properties": { + "expiresAt": { + "type": "number", + "description": "Unix ms timestamp when the project is scheduled to expire." + } + }, + "required": [ + "expiresAt" + ], + "type": "object" + }, + { + "properties": { + "lockedAt": { + "type": "number", + "description": "Unix ms timestamp when the project was locked." + }, + "lockedBy": { + "type": "string", + "description": "userId of the actor that triggered the lock (system or admin)." + } + }, + "required": [ + "lockedAt", + "lockedBy" + ], + "type": "object" + } + ] + }, + "devCommand": { + "nullable": true, + "type": "string" + }, + "directoryListing": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "installCommand": { + "nullable": true, + "type": "string" + }, + "env": { + "items": { + "properties": { + "target": { + "oneOf": [ + { + "items": { + "type": "string", + "enum": [ + "development", + "development", + "preview", + "preview", + "production" + ] + }, + "type": "array" + }, + { + "type": "string", + "enum": [ + "development", + "development", + "preview", + "preview", + "production" + ] + } + ] + }, + "type": { + "type": "string", + "enum": [ + "encrypted", + "plain", + "secret", + "sensitive", + "system" + ] + }, + "sunsetSecretId": { + "type": "string", + "description": "This is used to identify variables that have been migrated from type secret to sensitive." + }, + "legacyValue": { + "type": "string", + "description": "Legacy now-encryption ciphertext, present after migration swaps value/vsmValue" + }, + "decrypted": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "value": { + "type": "string" + }, + "vsmValue": { + "type": "string" + }, + "id": { + "type": "string" + }, + "key": { + "type": "string" + }, + "configurationId": { + "nullable": true, + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "updatedAt": { + "type": "number" + }, + "createdBy": { + "nullable": true, + "type": "string" + }, + "updatedBy": { + "nullable": true, + "type": "string" + }, + "gitBranch": { + "type": "string" + }, + "visibility": { + "type": "string", + "enum": [ + "config", + "secret" + ], + "description": "User-facing config/secret model. When set, authoritative for new code paths when the env-var-config-secret-ui flag is enabled. Legacy rows omit this field; legacy rows omit it and callers fall back to existing `type` behavior." + }, + "edgeConfigId": { + "nullable": true, + "type": "string" + }, + "edgeConfigTokenId": { + "nullable": true, + "type": "string" + }, + "contentHint": { + "nullable": true, + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "redis-url" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "redis-rest-api-url" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "redis-rest-api-token" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "redis-rest-api-read-only-token" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "blob-read-write-token" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "blob-store-id" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "blob-webhook-public-key" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-url" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-url-non-pooling" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-prisma-url" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-user" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-host" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-password" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-database" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "postgres-url-no-ssl" + ] + }, + "storeId": { + "type": "string" + } + }, + "required": [ + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "integration-store-secret" + ] + }, + "storeId": { + "type": "string" + }, + "integrationId": { + "type": "string" + }, + "integrationProductId": { + "type": "string" + }, + "integrationConfigurationId": { + "type": "string" + } + }, + "required": [ + "integrationConfigurationId", + "integrationId", + "integrationProductId", + "storeId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "flags-connection-string" + ] + }, + "projectId": { + "type": "string" + } + }, + "required": [ + "projectId", + "type" + ], + "type": "object" + } + ] + }, + "internalContentHint": { + "nullable": true, + "properties": { + "type": { + "type": "string", + "enum": [ + "flags-secret" + ] + }, + "encryptedValue": { + "type": "string", + "description": "Contains the `value` of the env variable, encrypted with a special key to make decryption possible in the subscriber Lambda." + } + }, + "required": [ + "encryptedValue", + "type" + ], + "type": "object", + "description": "Similar to `contentHints`, but should not be exposed to the user." + }, + "comment": { + "type": "string" + }, + "customEnvironmentIds": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "key", + "type", + "value" + ], + "type": "object" + }, + "type": "array" + }, + "customEnvironments": { + "items": { + "properties": { + "id": { + "type": "string", + "description": "Unique identifier for the custom environment (format: env_*)" + }, + "slug": { + "type": "string", + "description": "URL-friendly name of the environment" + }, + "type": { + "type": "string", + "enum": [ + "development", + "preview", + "production" + ], + "description": "The type of environment (production, preview, or development)" + }, + "description": { + "type": "string", + "description": "Optional description of the environment's purpose" + }, + "branchMatcher": { + "properties": { + "type": { + "type": "string", + "enum": [ + "endsWith", + "equals", + "startsWith" + ], + "description": "The type of matching to perform" + }, + "pattern": { + "type": "string", + "description": "The pattern to match against branch names" + } + }, + "required": [ + "pattern", + "type" + ], + "type": "object", + "description": "Configuration for matching git branches to this environment" + }, + "domains": { + "items": { + "properties": { + "name": { + "type": "string" + }, + "apexName": { + "type": "string" + }, + "projectId": { + "type": "string" + }, + "redirect": { + "nullable": true, + "type": "string" + }, + "redirectStatusCode": { + "nullable": true, + "type": "number", + "enum": [ + 301, + 302, + 307, + 308, + null + ] + }, + "gitBranch": { + "nullable": true, + "type": "string" + }, + "customEnvironmentId": { + "nullable": true, + "type": "string" + }, + "updatedAt": { + "type": "number" + }, + "createdAt": { + "type": "number" + }, + "verified": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "`true` if the domain is verified for use with the project. If `false` it will not be used as an alias on this project until the challenge in `verification` is completed." + }, + "verification": { + "items": { + "properties": { + "type": { + "type": "string" + }, + "domain": { + "type": "string" + }, + "value": { + "type": "string" + }, + "reason": { + "type": "string" + } + }, + "required": [ + "domain", + "reason", + "type", + "value" + ], + "type": "object", + "description": "A list of verification challenges, one of which must be completed to verify the domain for use on the project. After the challenge is complete `POST /projects/:idOrName/domains/:domain/verify` to verify the domain. Possible challenges: - If `verification.type = TXT` the `verification.domain` will be checked for a TXT record matching `verification.value`." + }, + "type": "array", + "description": "A list of verification challenges, one of which must be completed to verify the domain for use on the project. After the challenge is complete `POST /projects/:idOrName/domains/:domain/verify` to verify the domain. Possible challenges: - If `verification.type = TXT` the `verification.domain` will be checked for a TXT record matching `verification.value`." + } + }, + "required": [ + "apexName", + "name", + "projectId", + "verified" + ], + "type": "object", + "description": "List of domains associated with this environment" + }, + "type": "array", + "description": "List of domains associated with this environment" + }, + "currentDeploymentAliases": { + "items": { + "type": "string" + }, + "type": "array", + "description": "List of aliases for the current deployment" + }, + "createdAt": { + "type": "number", + "description": "Timestamp when the environment was created" + }, + "updatedAt": { + "type": "number", + "description": "Timestamp when the environment was last updated" + } + }, + "required": [ + "createdAt", + "id", + "slug", + "type", + "updatedAt" + ], + "type": "object", + "description": "Internal representation of a custom environment with all required properties" + }, + "type": "array" + }, + "framework": { + "nullable": true, + "type": "string", + "enum": [ + "actix-web", + "angular", + "ash", + "astro", + "axum", + "blitzjs", + "brunch", + "bun", + "container", + "create-react-app", + "django", + "docusaurus", + "docusaurus-2", + "dojo", + "eleventy", + "elysia", + "ember", + "eve", + "express", + "factory-eve", + "fastapi", + "fasthtml", + "fastify", + "flask", + "gatsby", + "go", + "gridsome", + "h3", + "hexo", + "hono", + "hugo", + "hydrogen", + "ionic-angular", + "ionic-react", + "jekyll", + "koa", + "mastra", + "middleman", + "nestjs", + "nextjs", + "nitro", + "node", + "nuxtjs", + "parcel", + "polymer", + "preact", + "python", + "react-router", + "redwoodjs", + "remix", + "ruby", + "rust", + "saber", + "sanity", + "sanity-v2", + "sapper", + "scully", + "services", + "solidstart", + "solidstart-1", + "stencil", + "storybook", + "svelte", + "sveltekit", + "sveltekit-1", + "tanstack-start", + "tanstack-start-lovable", + "umijs", + "vite", + "vitepress", + "vue", + "vuepress", + "xmcp", + "zola", + null + ] + }, + "services": { + "items": { + "properties": { + "serviceName": { + "type": "string", + "description": "Service name from the deployment (Service.name)." + }, + "serviceType": { + "type": "string", + "enum": [ + "cron", + "job", + "web", + "worker" + ], + "description": "Service kind (Service.type). Omitted for schemas that do not define one." + }, + "framework": { + "type": "string", + "enum": [ + "actix-web", + "angular", + "ash", + "astro", + "axum", + "blitzjs", + "brunch", + "bun", + "container", + "create-react-app", + "django", + "docusaurus", + "docusaurus-2", + "dojo", + "eleventy", + "elysia", + "ember", + "eve", + "express", + "factory-eve", + "fastapi", + "fasthtml", + "fastify", + "flask", + "gatsby", + "go", + "gridsome", + "h3", + "hexo", + "hono", + "hugo", + "hydrogen", + "ionic-angular", + "ionic-react", + "jekyll", + "koa", + "mastra", + "middleman", + "nestjs", + "nextjs", + "nitro", + "node", + "nuxtjs", + "parcel", + "polymer", + "preact", + "python", + "react-router", + "redwoodjs", + "remix", + "ruby", + "rust", + "saber", + "sanity", + "sanity-v2", + "sapper", + "scully", + "services", + "solidstart", + "solidstart-1", + "stencil", + "storybook", + "svelte", + "sveltekit", + "sveltekit-1", + "tanstack-start", + "tanstack-start-lovable", + "umijs", + "vite", + "vitepress", + "vue", + "vuepress", + "xmcp", + "zola" + ], + "description": "Framework slug, when the service has one (omitted otherwise)." + }, + "runtime": { + "type": "string", + "description": "Generic runtime, e.g. 'node' | 'python' | 'go' | 'ruby' | 'rust' (Service.runtime). Omitted for static builds." + } + }, + "required": [ + "serviceName" + ], + "type": "object" + }, + "type": "array" + }, + "gitForkProtection": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "gitLFS": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "id": { + "type": "string" + }, + "ipBuckets": { + "items": { + "properties": { + "bucket": { + "type": "string" + }, + "default": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "supportUntil": { + "type": "number" + } + }, + "required": [ + "bucket" + ], + "type": "object" + }, + "type": "array" + }, + "jobs": { + "properties": { + "lint": { + "properties": { + "targets": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "targets" + ], + "type": "object" + }, + "typecheck": { + "properties": { + "targets": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "targets" + ], + "type": "object" + }, + "mfe-config-present": { + "properties": { + "targets": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "targets" + ], + "type": "object" + } + }, + "type": "object" + }, + "latestDeployments": { + "items": { + "properties": { + "id": { + "type": "string" + }, + "alias": { + "items": { + "type": "string" + }, + "type": "array" + }, + "aliasAssigned": { + "nullable": true, + "oneOf": [ + { + "type": "number" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + } + ] + }, + "aliasError": { + "nullable": true, + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" + }, + "aliasFinal": { + "nullable": true, + "type": "string" + }, + "automaticAliases": { + "items": { + "type": "string" + }, + "type": "array" + }, + "branchMatcher": { + "properties": { + "type": { + "type": "string", + "enum": [ + "endsWith", + "equals", + "startsWith" + ], + "description": "The type of matching to perform" + }, + "pattern": { + "type": "string", + "description": "The pattern to match against branch names" + } + }, + "required": [ + "pattern", + "type" + ], + "type": "object" + }, + "buildingAt": { + "type": "number" + }, + "builds": { + "items": { + "properties": { + "use": { + "type": "string" + }, + "src": { + "type": "string" + }, + "dest": { + "type": "string" + } + }, + "required": [ + "use" + ], + "type": "object" + }, + "type": "array" + }, + "checksConclusion": { + "type": "string", + "enum": [ + "canceled", + "failed", + "skipped", + "succeeded" + ] + }, + "checksState": { + "type": "string", + "enum": [ + "completed", + "registered", + "running" + ] + }, + "connectBuildsEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "connectConfigurationId": { + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "createdIn": { + "type": "string" + }, + "creator": { + "nullable": true, + "properties": { + "email": { + "type": "string" + }, + "githubLogin": { + "type": "string" + }, + "gitlabLogin": { + "type": "string" + }, + "uid": { + "type": "string" + }, + "username": { + "type": "string" + } + }, + "required": [ + "email", + "uid", + "username" + ], + "type": "object" + }, + "deletedAt": { + "type": "number" + }, + "deploymentHostname": { + "type": "string" + }, + "forced": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "name": { + "type": "string" + }, + "meta": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "monorepoManager": { + "nullable": true, + "type": "string" + }, + "oidcTokenClaims": { + "properties": { + "iss": { + "type": "string" + }, + "sub": { + "type": "string" + }, + "scope": { + "type": "string" + }, + "aud": { + "type": "string" + }, + "owner": { + "type": "string" + }, + "owner_id": { + "type": "string" + }, + "project": { + "type": "string" + }, + "project_id": { + "type": "string" + }, + "environment": { + "type": "string" + }, + "custom_environment_id": { + "type": "string" + }, + "mfe_group_ids": { + "items": { + "type": "string" + }, + "type": "array" + }, + "plan": { + "type": "string" + } + }, + "required": [ + "aud", + "environment", + "iss", + "owner", + "owner_id", + "project", + "project_id", + "scope", + "sub" + ], + "type": "object" + }, + "plan": { + "type": "string", + "enum": [ + "enterprise", + "hobby", + "pro" + ] + }, + "previewCommentsEnabled": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether or not preview comments are enabled for the deployment", + "example": false + }, + "private": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "readyAt": { + "type": "number" + }, + "readyState": { + "type": "string", + "enum": [ + "BLOCKED", + "BUILDING", + "CANCELED", + "ERROR", + "INITIALIZING", + "QUEUED", + "READY" + ] + }, + "readySubstate": { + "type": "string", + "enum": [ + "PROMOTED", + "ROLLING", + "STAGED" + ] + }, + "requestedAt": { + "type": "number" + }, + "target": { + "nullable": true, + "type": "string" + }, + "teamId": { + "nullable": true, + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "LAMBDAS" + ] + }, + "url": { + "type": "string" + }, + "userId": { + "type": "string", + "description": "Present for user creators; omitted for app/integration/system creators." + }, + "withCache": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "createdAt", + "createdIn", + "creator", + "deploymentHostname", + "id", + "name", + "plan", + "private", + "readyState", + "type", + "url" + ], + "type": "object" + }, + "type": "array" + }, + "link": { + "oneOf": [ + { + "properties": { + "org": { + "type": "string" + }, + "repoOwnerId": { + "type": "number", + "description": "A new field, should be included in all new project links, is being added just in time when a deployment is created. This is needed for Protected Git scopes." + }, + "repo": { + "type": "string" + }, + "repoId": { + "type": "number" + }, + "type": { + "type": "string", + "enum": [ + "github" + ] + }, + "createdAt": { + "type": "number" + }, + "deployHooks": { + "items": { + "properties": { + "createdAt": { + "type": "number" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "ref": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "ref", + "url" + ], + "type": "object" + }, + "type": "array" + }, + "gitCredentialId": { + "type": "string" + }, + "updatedAt": { + "type": "number" + }, + "sourceless": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "productionBranch": { + "type": "string" + } + }, + "required": [ + "deployHooks", + "gitCredentialId", + "org", + "productionBranch", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "github-limited" + ] + }, + "repo": { + "type": "string" + }, + "repoId": { + "type": "number" + }, + "createdAt": { + "type": "number" + }, + "updatedAt": { + "type": "number" + }, + "org": { + "type": "string" + }, + "repoOwnerId": { + "type": "number", + "description": "A new field, should be included in all new project links, is being added just in time when a deployment is created. This is needed for Protected Git scopes." + }, + "deployHooks": { + "items": { + "properties": { + "createdAt": { + "type": "number" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "ref": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "ref", + "url" + ], + "type": "object" + }, + "type": "array" + }, + "gitCredentialId": { + "type": "string" + }, + "sourceless": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "productionBranch": { + "type": "string" + } + }, + "required": [ + "deployHooks", + "gitCredentialId", + "org", + "productionBranch", + "type" + ], + "type": "object" + }, + { + "properties": { + "org": { + "type": "string" + }, + "repoOwnerId": { + "type": "number", + "description": "A new field, should be included in all new project links, is being added just in time when a deployment is created. This is needed for Protected Git scopes." + }, + "repo": { + "type": "string" + }, + "repoId": { + "type": "number" + }, + "type": { + "type": "string", + "enum": [ + "github-custom-host" + ] + }, + "host": { + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "deployHooks": { + "items": { + "properties": { + "createdAt": { + "type": "number" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "ref": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "ref", + "url" + ], + "type": "object" + }, + "type": "array" + }, + "gitCredentialId": { + "type": "string" + }, + "updatedAt": { + "type": "number" + }, + "sourceless": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "productionBranch": { + "type": "string" + } + }, + "required": [ + "deployHooks", + "gitCredentialId", + "host", + "org", + "productionBranch", + "type" + ], + "type": "object" + }, + { + "properties": { + "projectId": { + "type": "string" + }, + "projectName": { + "type": "string" + }, + "projectNameWithNamespace": { + "type": "string" + }, + "projectNamespace": { + "type": "string" + }, + "projectOwnerId": { + "type": "number", + "description": "A new field, should be included in all new project links, is being added just in time when a deployment is created. This is needed for Protected Git scopes. This is the id of the top level group that a namespace belongs to. Gitlab supports group nesting (up to 20 levels)." + }, + "projectUrl": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "gitlab" + ] + }, + "createdAt": { + "type": "number" + }, + "deployHooks": { + "items": { + "properties": { + "createdAt": { + "type": "number" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "ref": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "ref", + "url" + ], + "type": "object" + }, + "type": "array" + }, + "gitCredentialId": { + "type": "string" + }, + "updatedAt": { + "type": "number" + }, + "sourceless": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "productionBranch": { + "type": "string" + } + }, + "required": [ + "deployHooks", + "gitCredentialId", + "productionBranch", + "projectId", + "projectName", + "projectNameWithNamespace", + "projectNamespace", + "projectUrl", + "type" + ], + "type": "object" + }, + { + "properties": { + "name": { + "type": "string" + }, + "slug": { + "type": "string" + }, + "owner": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "bitbucket" + ] + }, + "uuid": { + "type": "string" + }, + "workspaceUuid": { + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "deployHooks": { + "items": { + "properties": { + "createdAt": { + "type": "number" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "ref": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "ref", + "url" + ], + "type": "object" + }, + "type": "array" + }, + "gitCredentialId": { + "type": "string" + }, + "updatedAt": { + "type": "number" + }, + "sourceless": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "productionBranch": { + "type": "string" + } + }, + "required": [ + "deployHooks", + "gitCredentialId", + "name", + "owner", + "productionBranch", + "slug", + "type", + "uuid", + "workspaceUuid" + ], + "type": "object" + }, + { + "properties": { + "org": { + "type": "string" + }, + "repo": { + "type": "string" + }, + "repoId": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "vercel" + ] + }, + "createdAt": { + "type": "number" + }, + "deployHooks": { + "items": { + "properties": { + "createdAt": { + "type": "number" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "ref": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "ref", + "url" + ], + "type": "object" + }, + "type": "array" + }, + "gitCredentialId": { + "type": "string" + }, + "updatedAt": { + "type": "number" + }, + "sourceless": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "productionBranch": { + "type": "string" + } + }, + "required": [ + "deployHooks", + "gitCredentialId", + "org", + "productionBranch", + "repo", + "repoId", + "type" + ], + "type": "object" + }, + { + "properties": { + "org": { + "type": "string" + }, + "repo": { + "type": "string" + }, + "repoId": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "v0" + ] + }, + "createdAt": { + "type": "number" + }, + "deployHooks": { + "items": { + "properties": { + "createdAt": { + "type": "number" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "ref": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "ref", + "url" + ], + "type": "object" + }, + "type": "array" + }, + "gitCredentialId": { + "type": "string" + }, + "updatedAt": { + "type": "number" + }, + "sourceless": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "productionBranch": { + "type": "string" + } + }, + "required": [ + "deployHooks", + "gitCredentialId", + "org", + "productionBranch", + "repo", + "repoId", + "type" + ], + "type": "object" + }, + { + "properties": { + "owner": { + "type": "string", + "description": "Owner (namespace) slug, e.g. `acme`." + }, + "repo": { + "type": "string" + }, + "repoId": { + "type": "string", + "description": "Origin repository id." + }, + "ownerId": { + "type": "string", + "description": "Origin namespace id (`ns_…`) of the owner." + }, + "type": { + "type": "string", + "enum": [ + "cursor-origin" + ] + }, + "createdAt": { + "type": "number" + }, + "deployHooks": { + "items": { + "properties": { + "createdAt": { + "type": "number" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "ref": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "ref", + "url" + ], + "type": "object" + }, + "type": "array" + }, + "gitCredentialId": { + "type": "string" + }, + "updatedAt": { + "type": "number" + }, + "sourceless": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "productionBranch": { + "type": "string" + } + }, + "required": [ + "deployHooks", + "gitCredentialId", + "owner", + "ownerId", + "productionBranch", + "repo", + "repoId", + "type" + ], + "type": "object" + } + ] + }, + "blobs": { + "properties": { + "isDefaultApp": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Marks the team-level, Vercel-managed default blob project (`vercel-blob-default-project`) that orphan blob stores are scoped to when connected without an explicit project. Set only by internal storage flows and immutable after creation — guards rely on it to protect the connected stores from being lost when the project is deleted or transferred." + } + }, + "type": "object" + }, + "microfrontends": { + "oneOf": [ + { + "properties": { + "isDefaultApp": { + "type": "boolean", + "enum": [ + true + ] + }, + "updatedAt": { + "type": "number", + "description": "Timestamp when the microfrontends settings were last updated." + }, + "groupIds": { + "type": "array", + "items": { + "type": "string" + }, + "minItems": 1, + "description": "The group IDs of microfrontends that this project belongs to. Each microfrontend project must belong to a microfrontends group that is the set of microfrontends that are used together." + }, + "enabled": { + "type": "boolean", + "enum": [ + true + ], + "description": "Whether microfrontends are enabled for this project." + }, + "defaultRoute": { + "type": "string", + "description": "A path that is used to take screenshots and as the default path in preview links when a domain for this microfrontend is shown in the UI. Includes the leading slash, e.g. `/docs`" + }, + "freeProjectForLegacyLimits": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether the project was part of the legacy limits for hobby and pro-trial before billing was added. This field is only set when the team is upgraded to a paid plan and we are backfilling the subscription status. We cap the subscription to 2 projects and set this field for the 3rd project. When this field is set, the project is not charged for and we do not call any billing APIs for this project." + } + }, + "required": [ + "enabled", + "groupIds", + "isDefaultApp", + "updatedAt" + ], + "type": "object" + }, + { + "properties": { + "isDefaultApp": { + "type": "boolean", + "enum": [ + false + ] + }, + "routeObservabilityToThisProject": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether observability data should be routed to this microfrontend project or a root project." + }, + "doNotRouteWithMicrofrontendsRouting": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether to add microfrontends routing to aliases. This means domains in this project will route as a microfrontend." + }, + "updatedAt": { + "type": "number", + "description": "Timestamp when the microfrontends settings were last updated." + }, + "groupIds": { + "type": "array", + "items": { + "type": "string" + }, + "minItems": 1, + "description": "The group IDs of microfrontends that this project belongs to. Each microfrontend project must belong to a microfrontends group that is the set of microfrontends that are used together." + }, + "enabled": { + "type": "boolean", + "enum": [ + true + ], + "description": "Whether microfrontends are enabled for this project." + }, + "defaultRoute": { + "type": "string", + "description": "A path that is used to take screenshots and as the default path in preview links when a domain for this microfrontend is shown in the UI. Includes the leading slash, e.g. `/docs`" + }, + "freeProjectForLegacyLimits": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether the project was part of the legacy limits for hobby and pro-trial before billing was added. This field is only set when the team is upgraded to a paid plan and we are backfilling the subscription status. We cap the subscription to 2 projects and set this field for the 3rd project. When this field is set, the project is not charged for and we do not call any billing APIs for this project." + } + }, + "required": [ + "enabled", + "groupIds", + "updatedAt" + ], + "type": "object" + }, + { + "properties": { + "updatedAt": { + "type": "number" + }, + "groupIds": { + "type": "array", + "items": {}, + "minItems": 0, + "maxItems": 0 + }, + "enabled": { + "type": "boolean", + "enum": [ + false + ] + }, + "freeProjectForLegacyLimits": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "enabled", + "groupIds", + "updatedAt" + ], + "type": "object" + } + ] + }, + "name": { + "type": "string" + }, + "nodeVersion": { + "type": "string", + "enum": [ + "10.x", + "12.x", + "14.x", + "16.x", + "18.x", + "20.x", + "22.x", + "24.x", + "8.10.x" + ] + }, + "optionsAllowlist": { + "nullable": true, + "properties": { + "paths": { + "items": { + "properties": { + "value": { + "type": "string" + } + }, + "required": [ + "value" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "paths" + ], + "type": "object" + }, + "outputDirectory": { + "nullable": true, + "type": "string" + }, + "passwordProtection": { + "nullable": true, + "type": "object" + }, + "passport": { + "nullable": true, + "properties": { + "deploymentType": { + "type": "string", + "enum": [ + "all", + "all_except_custom_domains", + "preview", + "prod_deployment_urls_and_all_previews" + ] + }, + "connectorId": { + "type": "string" + } + }, + "required": [ + "connectorId", + "deploymentType" + ], + "type": "object" + }, + "protectionConfig": { + "properties": { + "sandboxUrls": { + "properties": { + "inheritDeploymentProtection": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "type": "object" + } + }, + "type": "object" + }, + "sandbox": { + "properties": { + "region": { + "type": "string", + "enum": [ + "arn1", + "bom1", + "cdg1", + "cle1", + "cpt1", + "dub1", + "fra1", + "gru1", + "hkg1", + "hnd1", + "iad1", + "icn1", + "kix1", + "lhr1", + "pdx1", + "sfo1", + "sin1", + "syd1", + "yul1" + ] + }, + "failoverRegions": { + "items": { + "type": "string", + "enum": [ + "arn1", + "bom1", + "cdg1", + "cle1", + "cpt1", + "dub1", + "fra1", + "gru1", + "hkg1", + "hnd1", + "iad1", + "icn1", + "kix1", + "lhr1", + "pdx1", + "sfo1", + "sin1", + "syd1", + "yul1" + ] + }, + "type": "array" + } + }, + "type": "object" + }, + "productionDeploymentsFastLane": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "resourceConfig": { + "properties": { + "elasticConcurrencyEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "fluid": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "functionDefaultRegions": { + "items": { + "type": "string" + }, + "type": "array" + }, + "functionDefaultTimeout": { + "type": "number" + }, + "functionDefaultMemoryType": { + "type": "string", + "enum": [ + "performance", + "performance_xl", + "standard", + "standard_legacy" + ] + }, + "functionZeroConfigFailover": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "buildMachineType": { + "type": "string", + "enum": [ + "basic", + "enhanced", + "standard", + "turbo" + ] + }, + "buildMachineSelection": { + "type": "string", + "enum": [ + "elastic", + "fixed" + ] + }, + "buildMachineElasticLastUpdated": { + "type": "number" + }, + "buildMachineElasticReason": { + "type": "string", + "enum": [ + "basic-floor", + "build-timeout-failure", + "enospc-failure", + "enterprise-floor", + "high-peak-disk", + "high-peak-memory", + "long-build-duration", + "oom-failure", + "short-build-duration", + "sustained-high-cpu" + ] + }, + "isNSNBDisabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "buildQueue": { + "properties": { + "configuration": { + "type": "string", + "enum": [ + "SKIP_NAMESPACE_QUEUE", + "WAIT_FOR_NAMESPACE_QUEUE" + ] + } + }, + "type": "object" + }, + "enableFunctionsBeta": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "type": "object", + "required": [ + "functionDefaultRegions" + ] + }, + "rollbackDescription": { + "properties": { + "userId": { + "type": "string", + "description": "The user who rolled back the project." + }, + "username": { + "type": "string", + "description": "The username of the user who rolled back the project." + }, + "description": { + "type": "string", + "description": "User-supplied explanation of why they rolled back the project. Limited to 250 characters." + }, + "createdAt": { + "type": "number", + "description": "Timestamp of when the rollback was requested." + } + }, + "required": [ + "createdAt", + "description", + "userId", + "username" + ], + "type": "object", + "description": "Description of why a project was rolled back, and by whom. Note that lastAliasRequest contains the from/to details of the rollback." + }, + "rollingRelease": { + "nullable": true, + "properties": { + "target": { + "type": "string", + "description": "The environment that the release targets, currently only supports production. Adding in case we want to configure with alias groups or custom environments.", + "example": "production" + }, + "stages": { + "nullable": true, + "items": { + "properties": { + "targetPercentage": { + "type": "number", + "description": "The percentage of traffic to serve to the canary deployment (0-100)", + "example": 25 + }, + "requireApproval": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether or not this stage requires manual approval to proceed", + "example": false + }, + "duration": { + "type": "number", + "description": "Duration in minutes for automatic advancement to the next stage", + "example": 600 + }, + "linearShift": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether to linearly shift traffic over the duration of this stage", + "example": false + } + }, + "required": [ + "targetPercentage" + ], + "type": "object", + "description": "An array of all the stages required during a deployment release. Each stage defines a target percentage and advancement rules. The final stage must always have targetPercentage: 100." + }, + "type": "array", + "description": "An array of all the stages required during a deployment release. Each stage defines a target percentage and advancement rules. The final stage must always have targetPercentage: 100." + }, + "canaryResponseHeader": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether the request served by a canary deployment should return a header indicating a canary was served. Defaults to `false` when omitted.", + "example": false + }, + "gate": { + "properties": { + "enabled": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether automated gating is enabled for this project's rollouts." + }, + "checks": { + "items": { + "properties": { + "type": { + "type": "string", + "enum": [ + "error-rate-5xx" + ], + "description": "The metric this check evaluates." + }, + "minSampleSize": { + "type": "number", + "description": "Minimum number of requests required in the window before the check can fail. Below this, the check is inconclusive rather than failing, so low-traffic stages don't gate on noise. Defaults to `100` when omitted.", + "example": 100 + }, + "excludeStatusCodes": { + "items": { + "type": "number" + }, + "type": "array", + "description": "Response status codes to ignore entirely — dropped from both the numerator (errors) and the denominator (total requests). Defaults to `[]` when omitted.", + "example": [ + 503 + ] + }, + "excludePaths": { + "items": { + "type": "string" + }, + "type": "array", + "description": "Request paths to ignore entirely — dropped from both the numerator (errors) and the denominator (total requests). Matched exactly against the request path with any query string removed; no prefix or glob matching. Defaults to `[]` when omitted.", + "example": [ + "/api/health" + ] + }, + "ingestWatermarkSeconds": { + "type": "number", + "description": "Seconds of ingest lag to allow for: the query's upper bound is `now() - this value`, so the check never reads a window that is still filling. Defaults to `30` when omitted.", + "example": 30 + } + }, + "required": [ + "type" + ], + "type": "object", + "description": "The checks to evaluate. An empty array means nothing is evaluated." + }, + "type": "array", + "description": "The checks to evaluate. An empty array means nothing is evaluated." + }, + "failureThreshold": { + "type": "number", + "description": "How many failing evaluations within {@link windowSize} trip the gate. Defaults to `3` when omitted.", + "example": 3 + }, + "windowSize": { + "type": "number", + "description": "How many of the most recent evaluations {@link failureThreshold} is counted against. Defaults to `5` when omitted.", + "example": 5 + }, + "action": { + "type": "string", + "enum": [ + "pause", + "rollback" + ], + "description": "What to do when the gate trips: pause the rollout, or roll it back." + }, + "dryRun": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "When true, a tripped gate is only reported — {@link action} is not taken." + } + }, + "required": [ + "action", + "checks", + "dryRun", + "enabled" + ], + "type": "object", + "description": "Automated gating configuration. Omitted (the default) means no gating is configured, which is equivalent to `enabled: false`." + } + }, + "required": [ + "target" + ], + "type": "object", + "description": "Project-level rolling release configuration that defines how deployments should be gradually rolled out" + }, + "defaultResourceConfig": { + "properties": { + "elasticConcurrencyEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "fluid": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "functionDefaultRegions": { + "items": { + "type": "string" + }, + "type": "array" + }, + "functionDefaultTimeout": { + "type": "number" + }, + "functionDefaultMemoryType": { + "type": "string", + "enum": [ + "performance", + "performance_xl", + "standard", + "standard_legacy" + ] + }, + "functionZeroConfigFailover": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "buildMachineType": { + "type": "string", + "enum": [ + "basic", + "enhanced", + "standard", + "turbo" + ] + }, + "buildMachineSelection": { + "type": "string", + "enum": [ + "elastic", + "fixed" + ] + }, + "buildMachineElasticLastUpdated": { + "type": "number" + }, + "buildMachineElasticReason": { + "type": "string", + "enum": [ + "basic-floor", + "build-timeout-failure", + "enospc-failure", + "enterprise-floor", + "high-peak-disk", + "high-peak-memory", + "long-build-duration", + "oom-failure", + "short-build-duration", + "sustained-high-cpu" + ] + }, + "isNSNBDisabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "buildQueue": { + "properties": { + "configuration": { + "type": "string", + "enum": [ + "SKIP_NAMESPACE_QUEUE", + "WAIT_FOR_NAMESPACE_QUEUE" + ] + } + }, + "type": "object" + }, + "enableFunctionsBeta": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "type": "object", + "required": [ + "functionDefaultRegions" + ] + }, + "rootDirectory": { + "nullable": true, + "type": "string" + }, + "serverlessFunctionZeroConfigFailover": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "skewProtectionBoundaryAt": { + "type": "number" + }, + "skewProtectionMaxAge": { + "type": "number" + }, + "skewProtectionAllowedDomains": { + "items": { + "type": "string" + }, + "type": "array" + }, + "skipGitConnectDuringLink": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "staticIps": { + "properties": { + "builds": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "enabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "regions": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "builds", + "enabled", + "regions" + ], + "type": "object" + }, + "sourceFilesOutsideRootDirectory": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "enableAffectedProjectsDeployments": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "enableExternalRewriteCaching": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "ssoProtection": { + "nullable": true, + "properties": { + "deploymentType": { + "type": "string", + "enum": [ + "all", + "all_except_custom_domains", + "preview", + "prod_deployment_urls_and_all_previews" + ] + }, + "cve55182MigrationAppliedFrom": { + "nullable": true, + "type": "string", + "enum": [ + "all", + "all_except_custom_domains", + "preview", + "prod_deployment_urls_and_all_previews", + null + ] + }, + "april2026SecurityIncidentMigrationAppliedFrom": { + "nullable": true, + "type": "string", + "enum": [ + "all", + "all_except_custom_domains", + "preview", + "prod_deployment_urls_and_all_previews", + null + ] + } + }, + "required": [ + "deploymentType" + ], + "type": "object" + }, + "targets": { + "additionalProperties": { + "nullable": true, + "properties": { + "id": { + "type": "string" + }, + "alias": { + "items": { + "type": "string" + }, + "type": "array" + }, + "aliasAssigned": { + "nullable": true, + "oneOf": [ + { + "type": "number" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + } + ] + }, + "aliasError": { + "nullable": true, + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" + }, + "aliasFinal": { + "nullable": true, + "type": "string" + }, + "automaticAliases": { + "items": { + "type": "string" + }, + "type": "array" + }, + "branchMatcher": { + "properties": { + "type": { + "type": "string", + "enum": [ + "endsWith", + "equals", + "startsWith" + ], + "description": "The type of matching to perform" + }, + "pattern": { + "type": "string", + "description": "The pattern to match against branch names" + } + }, + "required": [ + "pattern", + "type" + ], + "type": "object" + }, + "buildingAt": { + "type": "number" + }, + "builds": { + "items": { + "properties": { + "use": { + "type": "string" + }, + "src": { + "type": "string" + }, + "dest": { + "type": "string" + } + }, + "required": [ + "use" + ], + "type": "object" + }, + "type": "array" + }, + "checksConclusion": { + "type": "string", + "enum": [ + "canceled", + "failed", + "skipped", + "succeeded" + ] + }, + "checksState": { + "type": "string", + "enum": [ + "completed", + "registered", + "running" + ] + }, + "connectBuildsEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "connectConfigurationId": { + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "createdIn": { + "type": "string" + }, + "creator": { + "nullable": true, + "properties": { + "email": { + "type": "string" + }, + "githubLogin": { + "type": "string" + }, + "gitlabLogin": { + "type": "string" + }, + "uid": { + "type": "string" + }, + "username": { + "type": "string" + } + }, + "required": [ + "email", + "uid", + "username" + ], + "type": "object" + }, + "deletedAt": { + "type": "number" + }, + "deploymentHostname": { + "type": "string" + }, + "forced": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "name": { + "type": "string" + }, + "meta": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "monorepoManager": { + "nullable": true, + "type": "string" + }, + "oidcTokenClaims": { + "properties": { + "iss": { + "type": "string" + }, + "sub": { + "type": "string" + }, + "scope": { + "type": "string" + }, + "aud": { + "type": "string" + }, + "owner": { + "type": "string" + }, + "owner_id": { + "type": "string" + }, + "project": { + "type": "string" + }, + "project_id": { + "type": "string" + }, + "environment": { + "type": "string" + }, + "custom_environment_id": { + "type": "string" + }, + "mfe_group_ids": { + "items": { + "type": "string" + }, + "type": "array" + }, + "plan": { + "type": "string" + } + }, + "required": [ + "aud", + "environment", + "iss", + "owner", + "owner_id", + "project", + "project_id", + "scope", + "sub" + ], + "type": "object" + }, + "plan": { + "type": "string", + "enum": [ + "enterprise", + "hobby", + "pro" + ] + }, + "previewCommentsEnabled": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether or not preview comments are enabled for the deployment", + "example": false + }, + "private": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "readyAt": { + "type": "number" + }, + "readyState": { + "type": "string", + "enum": [ + "BLOCKED", + "BUILDING", + "CANCELED", + "ERROR", + "INITIALIZING", + "QUEUED", + "READY" + ] + }, + "readySubstate": { + "type": "string", + "enum": [ + "PROMOTED", + "ROLLING", + "STAGED" + ] + }, + "requestedAt": { + "type": "number" + }, + "target": { + "nullable": true, + "type": "string" + }, + "teamId": { + "nullable": true, + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "LAMBDAS" + ] + }, + "url": { + "type": "string" + }, + "userId": { + "type": "string", + "description": "Present for user creators; omitted for app/integration/system creators." + }, + "withCache": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "createdAt", + "createdIn", + "creator", + "deploymentHostname", + "id", + "name", + "plan", + "private", + "readyState", + "type", + "url" + ], + "type": "object" + }, + "type": "object" + }, + "transferCompletedAt": { + "type": "number" + }, + "transferStartedAt": { + "type": "number" + }, + "transferToAccountId": { + "type": "string" + }, + "transferredFromAccountId": { + "type": "string" + }, + "updatedAt": { + "type": "number" + }, + "live": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "enablePreviewFeedback": { + "nullable": true, + "type": "boolean", + "enum": [ + false, + true, + null + ] + }, + "enableProductionFeedback": { + "nullable": true, + "type": "boolean", + "enum": [ + false, + true, + null + ] + }, + "permissions": { + "properties": { + "oauth2Connection": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "user": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "userConnection": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "userMfaConfiguration": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "userPreference": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "userSudo": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "webAuthn": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "accessGroup": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "agent": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aiGatewayApiKey": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aiGatewayApiKeyBypassAll": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aiGatewayApiKeyOwnedBySelf": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aiGatewayApiKeySpendAttribution": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aiGatewayApiKeyZdrExemption": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aiGatewayBudget": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aiGatewayCredits": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aiGatewayPrivateModels": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aiGatewayGuardrails": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aiGatewayRules": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aiGatewaySettings": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aiGatewayTranscripts": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aiGatewayTranscriptsSettings": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aiGatewayUsage": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aiGatewayVirtualModelConfigs": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "alerts": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "alertRules": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aliasGlobal": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "analyticsSampling": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "analyticsUsage": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "apiKey": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "apiKeyAiGateway": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "apiKeyOwnedBySelf": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "oauth2Application": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "vercelAppInstallation": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "vercelAppInstallationRequest": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "auditLog": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "automation": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "billingAddress": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "billingInformation": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "billingInvoice": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "billingInvoiceEmailRecipient": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "billingInvoiceLanguage": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "billingPlan": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "billingPurchaseOrder": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "billingRefund": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "billingTaxId": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "blob": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "blobStoreTokenSet": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "budget": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "cacheArtifact": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "cacheArtifactUsageEvent": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "codeChecks": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "codeOwners": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "ciInvocations": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "ciLogs": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "concurrentBuilds": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "connect": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "connectConfiguration": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "connectLogs": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "connexClient": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "connexClientProject": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "connexContact": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "connexInstallation": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "connexToken": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "buildMachineDefault": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "cursorOriginInstallation": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "dataCacheBillingSettings": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "defaultDeploymentProtection": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "deploymentPolicy": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "domain": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "domainAcceptDelegation": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "domainAuthCodes": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "domainCertificate": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "domainCheckConfig": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "domainMove": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "domainPurchase": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "domainRecord": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "domainTransferIn": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "drain": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "edgeConfig": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "edgeConfigItem": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "edgeConfigSchema": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "edgeConfigToken": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "endpointVerification": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "event": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "fileUpload": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "flagsExplorerSubscription": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "gitRepository": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "imageOptimizationNewPrice": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integration": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integrationAccount": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integrationConfiguration": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integrationConfigurationProjects": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integrationConfigurationRole": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integrationConfigurationTransfer": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integrationDeploymentAction": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integrationEvent": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integrationLog": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integrationResource": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integrationResourceData": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integrationResourceReplCommand": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integrationResourceSecrets": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integrationSSOSession": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integrationStrict": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integrationStoreTokenSet": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integrationVercelConfigurationOverride": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "integrationPullRequest": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "ipBlocking": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "jobGlobal": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "kmsIssuer": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "kmsProjectGrant": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "logDrain": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "marketplaceBillingData": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "marketplaceExperimentationEdgeConfigData": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "marketplaceExperimentationItem": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "marketplaceFlexCommit": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "marketplaceInstallationMember": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "marketplaceInvoice": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "marketplaceSettings": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "Monitoring": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "monitoringAlert": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "monitoringChart": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "monitoringQuery": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "monitoringSettings": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "notificationCustomerBudget": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "notificationDeploymentFailed": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "notificationDomainConfiguration": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "notificationDomainExpire": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "notificationDomainMoved": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "notificationDomainPurchase": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "notificationDomainRenewal": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "notificationDomainTransfer": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "notificationDomainUnverified": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "NotificationMonitoringAlert": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "notificationPaymentFailed": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "notificationPreferences": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "notificationStatementOfReasons": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "notificationUsageAlert": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "oidcFederationPolicy": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "observabilityConfiguration": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "observabilityFunnel": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "observabilityNotebook": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "openTelemetryEndpoint": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "ownEvent": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "organization": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "organizationDomain": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "organizationTeam": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "passwordProtectionInvoiceItem": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "paymentMethod": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "permissions": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "postgres": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "postgresStoreTokenSet": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "previewDeploymentSuffix": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "privateCloudAccount": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectTransferIn": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectTransferRequest": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "proTrialOnboarding": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "rateLimit": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "redis": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "redisStoreTokenSet": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "remoteCaching": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "repository": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "samlConfig": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "secret": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "securityConfig": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "sensitiveEnvironmentVariablePolicy": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "sharedEnvVars": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "sharedEnvVarsProduction": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "space": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "spaceRun": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "storeIsLocked": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "storeTokenSetSensitive": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "storeTransfer": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "supportCase": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "supportCaseComment": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "team": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "teamAccessRequest": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "teamFellowMembership": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "teamGitExclusivity": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "teamInvite": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "teamInviteCode": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "teamInviteLink": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "teamJoin": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "teamMemberMfaStatus": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "teamMicrofrontends": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "teamOwnMembership": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "teamOwnMembershipDisconnectSAML": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "teamSudo": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "teamTokenInvalidation": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "token": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "toolbarComment": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "usage": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "usageCycle": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "vcrRepository": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "vpcPeeringConnection": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "webAnalyticsPlan": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "webhook": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "webhook-event": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aliasProject": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "aliasProtectionBypass": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "bulkRedirects": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "buildMachine": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "connectConfigurationLink": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "dataCacheNamespace": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "deployment": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "deploymentBuildLogs": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "deploymentCheck": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "deploymentCheckPreview": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "deploymentCheckReRunFromProductionBranch": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "deploymentProductionGit": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "deploymentV0": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "deploymentPreview": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "deploymentPrivate": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "deploymentPromote": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "deploymentRollback": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "edgeCacheNamespace": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "environments": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "job": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "logs": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "logsPreset": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "observabilityData": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "onDemandBuild": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "onDemandConcurrency": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "optionsAllowlist": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "passwordProtection": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "privateLinkEndpoint": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "productionAliasProtectionBypass": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "productionShareableLink": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "project": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectAccessGroup": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectAnalyticsSampling": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectAnalyticsUsage": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectCheck": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectCheckRun": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectDeploymentExpiration": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectDeploymentHook": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectDeploymentProtectionStrict": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectDomain": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectDomainCheckConfig": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectDomainMove": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectDomainVerify": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectEvent": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectEnvVars": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectEnvVarsProduction": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectEnvVarsUnownedByIntegration": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectFlags": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectFlagsProduction": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectFlagsSdkKey": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectFromV0": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectId": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectIntegrationConfiguration": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectLink": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectMember": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectMonitoring": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectOIDCToken": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectPermissions": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectProductionBranch": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectProtectionBypass": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectRollingRelease": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectRoutes": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectSupportCase": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectSupportCaseComment": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectTier": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectTransfer": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectTransferOut": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "projectUsage": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "pageIntegrity": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "seawallConfig": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "securityPlusConfiguration": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "shareableLink": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "shareableLinkStrict": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "sharedEnvVarConnection": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "skewProtection": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "analytics": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "trustedIps": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "trustedSources": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "v0Chat": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "vercelAuth": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "vercelRun": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "webAnalytics": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + }, + "workflowRunData": { + "items": { + "$ref": "#/components/schemas/ACLAction" + }, + "type": "array" + } + }, + "type": "object" + }, + "lastRollbackTarget": { + "nullable": true, + "type": "object" + }, + "lastAliasRequest": { + "nullable": true, + "properties": { + "fromDeploymentId": { + "nullable": true, + "type": "string" + }, + "toDeploymentId": { + "type": "string" + }, + "fromRollingReleaseId": { + "type": "string", + "description": "If rolling back from a rolling release, fromDeploymentId captures the \"base\" of that rolling release, and fromRollingReleaseId captures the \"target\" of that rolling release." + }, + "jobStatus": { + "type": "string", + "enum": [ + "failed", + "in-progress", + "pending", + "skipped", + "succeeded" + ] + }, + "requestedAt": { + "type": "number" + }, + "type": { + "type": "string", + "enum": [ + "promote", + "rollback" + ] + } + }, + "required": [ + "fromDeploymentId", + "jobStatus", + "requestedAt", + "toDeploymentId", + "type" + ], + "type": "object" + }, + "protectionBypass": { + "additionalProperties": { + "oneOf": [ + { + "properties": { + "createdAt": { + "type": "number" + }, + "createdBy": { + "type": "string" + }, + "scope": { + "type": "string", + "enum": [ + "integration-automation-bypass" + ] + }, + "integrationId": { + "type": "string" + }, + "configurationId": { + "type": "string" + } + }, + "required": [ + "configurationId", + "createdAt", + "createdBy", + "integrationId", + "scope" + ], + "type": "object" + }, + { + "properties": { + "createdAt": { + "type": "number" + }, + "createdBy": { + "type": "string" + }, + "scope": { + "type": "string", + "enum": [ + "automation-bypass" + ] + }, + "isEnvVar": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "When there was only one bypass, it was automatically set as an env var on deployments. With multiple bypasses, there is always one bypass that is selected as the default, and gets set as an env var on deployments. As this is a new field, undefined means that the bypass is the env var. If there are any automation bypasses, exactly one must be the env var." + }, + "note": { + "type": "string", + "description": "Optional note about the bypass to be displayed in the UI" + } + }, + "required": [ + "createdAt", + "createdBy", + "scope" + ], + "type": "object" + } + ] + }, + "type": "object" + }, + "hasActiveBranches": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "trustedIps": { + "nullable": true, + "oneOf": [ + { + "properties": { + "deploymentType": { + "type": "string", + "enum": [ + "all", + "all_except_custom_domains", + "preview", + "prod_deployment_urls_and_all_previews", + "production" + ] + }, + "addresses": { + "items": { + "properties": { + "value": { + "type": "string" + }, + "note": { + "type": "string" + } + }, + "required": [ + "value" + ], + "type": "object" + }, + "type": "array" + }, + "protectionMode": { + "type": "string", + "enum": [ + "additional", + "exclusive" + ] + } + }, + "required": [ + "addresses", + "deploymentType", + "protectionMode" + ], + "type": "object" + }, + { + "properties": { + "deploymentType": { + "type": "string", + "enum": [ + "all", + "all_except_custom_domains", + "preview", + "prod_deployment_urls_and_all_previews", + "production" + ] + } + }, + "required": [ + "deploymentType" + ], + "type": "object" + } + ] + }, + "trustedSources": { + "nullable": true, + "properties": { + "enableVercelCiSameRepository": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Allow same-team Vercel CI access to preview deployments built from the CI run's repository, using the deployment source rather than the current project repository link. Defaults to enabled when not stored; omitted or null Trusted Sources updates preserve the stored value." + }, + "projects": { + "additionalProperties": { + "properties": { + "label": { + "type": "string" + }, + "customAllow": { + "items": { + "properties": { + "from": { + "oneOf": [ + { + "properties": { + "slugs": { + "items": { + "type": "string" + }, + "type": "array", + "description": "System environment slugs (`production`, `preview`) and/or custom environment slugs defined on the referenced project." + }, + "preset": { + "type": "string", + "enum": [ + "all-custom" + ] + } + }, + "required": [ + "slugs" + ], + "type": "object", + "description": "The source envs on the trusted project that are allowed to access `to`." + }, + { + "properties": { + "slugs": { + "items": { + "type": "string" + }, + "type": "array", + "description": "System environment slugs (`production`, `preview`) and/or custom environment slugs defined on the referenced project." + }, + "preset": { + "type": "string", + "enum": [ + "all-custom" + ] + } + }, + "required": [ + "preset" + ], + "type": "object", + "description": "The source envs on the trusted project that are allowed to access `to`." + } + ] + }, + "to": { + "oneOf": [ + { + "properties": { + "slugs": { + "items": { + "type": "string" + }, + "type": "array", + "description": "System environment slugs (`production`, `preview`) and/or custom environment slugs defined on the referenced project." + }, + "preset": { + "type": "string", + "enum": [ + "all-custom" + ] + } + }, + "required": [ + "slugs" + ], + "type": "object", + "description": "The target envs on the current project that may be accessed." + }, + { + "properties": { + "slugs": { + "items": { + "type": "string" + }, + "type": "array", + "description": "System environment slugs (`production`, `preview`) and/or custom environment slugs defined on the referenced project." + }, + "preset": { + "type": "string", + "enum": [ + "all-custom" + ] + } + }, + "required": [ + "preset" + ], + "type": "object", + "description": "The target envs on the current project that may be accessed." + } + ] + } + }, + "required": [ + "from", + "to" + ], + "type": "object", + "description": "Optional overrides for the default same-env-by-slug matching. Provide explicit rules to allow cross-env access or presets." + }, + "type": "array", + "description": "Optional overrides for the default same-env-by-slug matching. Provide explicit rules to allow cross-env access or presets." + } + }, + "type": "object" + }, + "type": "object" + }, + "oidcProviders": { + "additionalProperties": { + "items": { + "properties": { + "to": { + "oneOf": [ + { + "properties": { + "slugs": { + "items": { + "type": "string" + }, + "type": "array", + "description": "System environment slugs (`production`, `preview`) and/or custom environment slugs defined on the referenced project." + }, + "preset": { + "type": "string", + "enum": [ + "all-custom" + ] + } + }, + "required": [ + "slugs" + ], + "type": "object", + "description": "The target envs on the current project that may be accessed." + }, + { + "properties": { + "slugs": { + "items": { + "type": "string" + }, + "type": "array", + "description": "System environment slugs (`production`, `preview`) and/or custom environment slugs defined on the referenced project." + }, + "preset": { + "type": "string", + "enum": [ + "all-custom" + ] + } + }, + "required": [ + "preset" + ], + "type": "object", + "description": "The target envs on the current project that may be accessed." + } + ] + }, + "label": { + "type": "string" + }, + "claims": { + "additionalProperties": { + "items": { + "type": "string" + }, + "type": "array" + }, + "type": "object" + } + }, + "required": [ + "claims", + "to" + ], + "type": "object" + }, + "type": "array" + }, + "type": "object" + } + }, + "type": "object" + }, + "gitComments": { + "properties": { + "onPullRequest": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether the Vercel bot should comment on PRs" + }, + "onCommit": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether the Vercel bot should comment on commits" + } + }, + "required": [ + "onCommit", + "onPullRequest" + ], + "type": "object" + }, + "gitProviderOptions": { + "properties": { + "createDeployments": { + "type": "string", + "enum": [ + "disabled", + "enabled" + ], + "description": "Whether the Vercel bot should automatically create GitHub deployments https://docs.github.com/en/rest/deployments/deployments#about-deployments NOTE: repository-dispatch events should be used instead" + }, + "disableRepositoryDispatchEvents": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether the Vercel bot should not automatically create GitHub repository-dispatch events on deployment events. https://vercel.com/docs/git/vercel-for-github#repository-dispatch-events - `true`: disable repository-dispatch events for this project (explicit override of the team setting). - `false`: enable repository-dispatch events for this project (explicit override of the team setting). - absent: inherit from `team.disableRepositoryDispatchEvents`." + }, + "requireVerifiedCommits": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether the project requires commits to be signed \u0026 verified before deployments will be created. - `true`: require verified commits for this project (explicit override of the team setting). - `false`: do not require verified commits (explicit override of the team setting). - absent: inherit from `team.requireVerifiedCommits`." + }, + "gitCommitStatus": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether Vercel should post commit statuses for this project. When omitted, commit statuses remain enabled." + }, + "consolidatedGitCommitStatus": { + "properties": { + "enabled": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether consolidated commit status is enabled." + }, + "propagateFailures": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether to propagate individual deployment failures to the consolidated status." + } + }, + "required": [ + "enabled", + "propagateFailures" + ], + "type": "object", + "description": "Configuration for consolidated git commit status reporting. When enabled, Vercel will post a single consolidated commit status instead of individual statuses for each deployment." + } + }, + "required": [ + "createDeployments" + ], + "type": "object" + }, + "paused": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "concurrencyBucketName": { + "type": "string" + }, + "webAnalytics": { + "properties": { + "id": { + "type": "string" + }, + "disabledAt": { + "type": "number" + }, + "canceledAt": { + "type": "number" + }, + "enabledAt": { + "type": "number" + }, + "hasData": { + "type": "boolean", + "enum": [ + true + ] + } + }, + "required": [ + "id" + ], + "type": "object" + }, + "security": { + "properties": { + "attackModeEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "attackModeUpdatedAt": { + "type": "number" + }, + "firewallEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "firewallUpdatedAt": { + "type": "number" + }, + "attackModeActiveUntil": { + "nullable": true, + "type": "number" + }, + "firewallConfigVersion": { + "type": "number" + }, + "rulesets": { + "additionalProperties": { + "properties": { + "action": { + "type": "string", + "enum": [ + "allow", + "bypass", + "challenge", + "deny", + "log", + "rate_limit", + "redirect" + ] + }, + "rateLimit": { + "nullable": true, + "properties": { + "algo": { + "type": "string", + "enum": [ + "fixed_window", + "token_bucket" + ] + }, + "window": { + "type": "number" + }, + "limit": { + "type": "number" + }, + "keys": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "algo", + "keys", + "limit", + "window" + ], + "type": "object" + }, + "redirect": { + "nullable": true, + "properties": { + "location": { + "type": "string" + }, + "permanent": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "location", + "permanent" + ], + "type": "object" + }, + "actionDuration": { + "nullable": true, + "type": "string" + }, + "bypassSystem": { + "nullable": true, + "type": "boolean", + "enum": [ + false, + true, + null + ] + }, + "logHeaders": { + "oneOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "string", + "enum": [ + "*" + ] + } + ] + } + }, + "required": [ + "action" + ], + "type": "object" + }, + "type": "object" + }, + "firewallSeawallEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "ja3Enabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "ja4Enabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "firewallBypassIps": { + "items": { + "type": "string" + }, + "type": "array" + }, + "managedRules": { + "nullable": true, + "properties": { + "vercel_ruleset": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "challenge", + "deny", + "log" + ] + } + }, + "required": [ + "active" + ], + "type": "object" + }, + "traffic_sources": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "challenge", + "deny", + "log" + ] + } + }, + "required": [ + "active" + ], + "type": "object" + }, + "bot_filter": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "challenge", + "deny", + "log" + ] + } + }, + "required": [ + "active" + ], + "type": "object" + }, + "ai_bots": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "challenge", + "deny", + "log" + ] + } + }, + "required": [ + "active" + ], + "type": "object" + }, + "owasp": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "challenge", + "deny", + "log" + ] + } + }, + "required": [ + "active" + ], + "type": "object" + } + }, + "required": [ + "ai_bots", + "bot_filter", + "owasp", + "traffic_sources", + "vercel_ruleset" + ], + "type": "object" + }, + "botIdEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "log_headers": { + "oneOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "string", + "enum": [ + "*" + ] + } + ] + }, + "securityPlus": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "securityPlusMetadata": { + "properties": { + "updatedAt": { + "type": "number" + }, + "firstEnabledAt": { + "type": "number", + "description": "Timestamp when the feature was first enabled. Never changes after initial enablement." + } + }, + "required": [ + "updatedAt" + ], + "type": "object" + }, + "pageIntegrityEnabled": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether Page Integrity is enabled for this project. Used by the metadata service to gate DynamoDB lookups against the page-integrity-inventory table." + } + }, + "type": "object" + }, + "oidcTokenConfig": { + "properties": { + "enabled": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether or not to generate OpenID Connect JSON Web Tokens." + }, + "issuerMode": { + "type": "string", + "enum": [ + "global", + "team" + ], + "description": "- team: `https://oidc.vercel.com/[team_slug]` - global: `https://oidc.vercel.com`" + } + }, + "type": "object" + }, + "deploymentPolicy": { + "nullable": true, + "properties": { + "gitSources": { + "nullable": true, + "items": { + "properties": { + "sources": { + "items": { + "oneOf": [ + { + "properties": { + "provider": { + "type": "string", + "enum": [ + "bitbucket", + "github" + ] + }, + "org": { + "type": "string" + }, + "repo": { + "type": "string" + } + }, + "required": [ + "org", + "provider" + ], + "type": "object", + "description": "Allowlist entry for GitHub and Bitbucket, whose repos are identified by a flat `org`/`repo` (Bitbucket's workspace/owner maps to `org`, its repo slug to `repo`). Omit `repo` to match any repo in the org. Org is matched case-insensitively." + }, + { + "properties": { + "provider": { + "type": "string", + "enum": [ + "gitlab" + ] + }, + "namespace": { + "type": "string" + }, + "project": { + "type": "string" + } + }, + "required": [ + "namespace", + "provider" + ], + "type": "object", + "description": "Allowlist entry for GitLab, which uses nested groups rather than a flat org/repo. `namespace` is the full group path (e.g. `group` or `group/subgroup`); `project` is the leaf project name. Omit `project` to match any project under the namespace. Namespace is matched case-insensitively." + } + ] + }, + "type": "array" + }, + "enabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "environments": { + "items": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "system" + ] + }, + "target": { + "type": "string", + "enum": [ + "preview", + "production" + ] + } + }, + "required": [ + "target", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "custom" + ] + }, + "environmentId": { + "type": "string" + } + }, + "required": [ + "environmentId", + "type" + ], + "type": "object" + } + ] + }, + "type": "array" + } + }, + "required": [ + "enabled", + "environments", + "sources" + ], + "type": "object", + "description": "`enabled: true` with empty `sources` is deny-all." + }, + "type": "array" + }, + "deploymentSources": { + "nullable": true, + "items": { + "properties": { + "sources": { + "items": { + "type": "string", + "enum": [ + "cli", + "deploy-hook", + "git", + "integration", + "rest-api", + "v0" + ], + "description": "Customer-configurable deployment sources. Every deploy classifies to exactly one. JSON schema in `packages/deployment-policy/schemas/body.ts` enumerates exactly these values. - `'git'` — git provider webhook. - `'cli'` — Vercel CLI (legacy classic-token CLI and SIWV CLI both). - `'rest-api'` — direct user/team-token REST upload. Does NOT cover deploy hooks, Marketplace integrations, or first-party app tokens. - `'deploy-hook'` — project deploy-hook URL. The URL is the credential. - `'integration'` — third-party Marketplace actor: Marketplace integration token, user-delegated OAuth from a Marketplace app, or an unrecognized third-party Vercel App. First-party Vercel Apps are never `'integration'`. - `'v0'` — the v0 product surface (entitlement-gated). v0 deploys through the CLI under the hood, but classifies as its own source so a team can allow or deny v0 independently of `'cli'`. First-party Vercel apps (Toolbar, etc.) classify as `'first-party'` — see `ClassifiedSource` in `./checks`. They're not in this union because they aren't customer-configurable; they bypass `checkDeploymentSources` entirely. v0 is intentionally NOT among them: like the CLI, it's a real product surface and is policy-controllable." + }, + "type": "array" + }, + "enabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "environments": { + "items": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "system" + ] + }, + "target": { + "type": "string", + "enum": [ + "preview", + "production" + ] + } + }, + "required": [ + "target", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "custom" + ] + }, + "environmentId": { + "type": "string" + } + }, + "required": [ + "environmentId", + "type" + ], + "type": "object" + } + ] + }, + "type": "array" + } + }, + "required": [ + "enabled", + "environments", + "sources" + ], + "type": "object", + "description": "`enabled: true` with empty `sources` is deny-all." + }, + "type": "array" + } + }, + "type": "object", + "description": "Project shape. `null` on a rule list clears the project's override for that rule type (fall back to team for every env); omitting is equivalent. Setting `deploymentPolicy` itself to `null` clears every override at once. Kept structurally distinct from {@link TeamDeploymentPolicy} so the two storage locations don't share a type by accident." + }, + "tier": { + "type": "string", + "enum": [ + "advanced", + "critical", + "priority" + ] + }, + "usageStatus": { + "properties": { + "kind": { + "type": "string", + "enum": [ + "flat" + ], + "description": "Billing mode. Always 'flat' for flat-rate projects." + }, + "exceededAllowanceUntil": { + "type": "number", + "description": "Timestamp until which the project has exceeded its CDN allowance." + }, + "bypassThrottleUntil": { + "type": "number", + "description": "Timestamp until which throttling is bypassed (project pays list rates for overage)." + }, + "throttled": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Per-project throttle, set explicitly for this project (e.g. via the per-project Flat Rate CDN endpoint)." + }, + "teamThrottled": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Synced from `team.billing.usageStatus.throttled`. When `true`, the team has throttled all of its projects regardless of `throttled`. The effective throttle the CDN enforces is `throttled || teamThrottled`." + } + }, + "required": [ + "kind" + ], + "type": "object" + }, + "features": { + "properties": { + "webAnalytics": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "type": "object" + }, + "v0": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "v0Created": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "abuse": { + "properties": { + "scanner": { + "type": "string" + }, + "history": { + "items": { + "properties": { + "scanner": { + "type": "string" + }, + "reason": { + "type": "string" + }, + "by": { + "type": "string" + }, + "byId": { + "type": "string" + }, + "at": { + "type": "number" + } + }, + "required": [ + "at", + "by", + "byId", + "reason", + "scanner" + ], + "type": "object" + }, + "type": "array" + }, + "updatedAt": { + "type": "number" + }, + "block": { + "properties": { + "action": { + "type": "string", + "enum": [ + "blocked" + ] + }, + "reason": { + "type": "string" + }, + "statusCode": { + "type": "number" + }, + "createdAt": { + "type": "number" + }, + "caseId": { + "type": "string" + }, + "actor": { + "type": "string" + }, + "comment": { + "type": "string" + }, + "ineligibleForAppeal": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "isCascading": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "action", + "createdAt", + "reason", + "statusCode" + ], + "type": "object" + }, + "blockHistory": { + "items": { + "oneOf": [ + { + "properties": { + "action": { + "type": "string", + "enum": [ + "blocked" + ] + }, + "reason": { + "type": "string" + }, + "statusCode": { + "type": "number" + }, + "createdAt": { + "type": "number" + }, + "caseId": { + "type": "string" + }, + "actor": { + "type": "string" + }, + "comment": { + "type": "string" + }, + "ineligibleForAppeal": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "isCascading": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "action", + "createdAt", + "reason", + "statusCode" + ], + "type": "object" + }, + { + "properties": { + "action": { + "type": "string", + "enum": [ + "unblocked" + ] + }, + "createdAt": { + "type": "number" + }, + "caseId": { + "type": "string" + }, + "actor": { + "type": "string" + }, + "comment": { + "type": "string" + }, + "ineligibleForAppeal": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "isCascading": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "action", + "createdAt" + ], + "type": "object" + }, + { + "properties": { + "action": { + "type": "string", + "enum": [ + "route-blocked" + ] + }, + "route": { + "oneOf": [ + { + "properties": { + "src": { + "type": "string" + }, + "status": { + "type": "number" + }, + "expiry": { + "type": "number" + } + }, + "required": [ + "src", + "status" + ], + "type": "object" + }, + { + "properties": { + "has": { + "items": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "header" + ] + }, + "key": { + "type": "string", + "enum": [ + "x-vercel-ip-country" + ] + }, + "value": { + "properties": { + "eq": { + "type": "string" + } + }, + "required": [ + "eq" + ], + "type": "object" + } + }, + "required": [ + "key", + "type", + "value" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "host" + ] + }, + "value": { + "properties": { + "eq": { + "type": "string" + } + }, + "required": [ + "eq" + ], + "type": "object" + } + }, + "required": [ + "type", + "value" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "mitigate": { + "properties": { + "action": { + "type": "string", + "enum": [ + "block_legal_cwc" + ] + } + }, + "required": [ + "action" + ], + "type": "object" + }, + "src": { + "type": "string" + } + }, + "required": [ + "has", + "mitigate" + ], + "type": "object" + } + ] + }, + "reason": { + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "caseId": { + "type": "string" + }, + "actor": { + "type": "string" + }, + "comment": { + "type": "string" + }, + "ineligibleForAppeal": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "isCascading": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "action", + "createdAt", + "reason", + "route" + ], + "type": "object" + }, + { + "properties": { + "action": { + "type": "string", + "enum": [ + "route-unblocked" + ] + }, + "route": { + "oneOf": [ + { + "properties": { + "src": { + "type": "string" + }, + "status": { + "type": "number" + }, + "expiry": { + "type": "number" + } + }, + "required": [ + "src", + "status" + ], + "type": "object" + }, + { + "properties": { + "has": { + "items": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "header" + ] + }, + "key": { + "type": "string", + "enum": [ + "x-vercel-ip-country" + ] + }, + "value": { + "properties": { + "eq": { + "type": "string" + } + }, + "required": [ + "eq" + ], + "type": "object" + } + }, + "required": [ + "key", + "type", + "value" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "host" + ] + }, + "value": { + "properties": { + "eq": { + "type": "string" + } + }, + "required": [ + "eq" + ], + "type": "object" + } + }, + "required": [ + "type", + "value" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "mitigate": { + "properties": { + "action": { + "type": "string", + "enum": [ + "block_legal_cwc" + ] + } + }, + "required": [ + "action" + ], + "type": "object" + }, + "src": { + "type": "string" + } + }, + "required": [ + "has", + "mitigate" + ], + "type": "object" + } + ] + }, + "statusCode": { + "type": "number" + }, + "createdAt": { + "type": "number" + }, + "caseId": { + "type": "string" + }, + "actor": { + "type": "string" + }, + "comment": { + "type": "string" + }, + "ineligibleForAppeal": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "isCascading": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "action", + "createdAt", + "route" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "interstitial": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "interstitialHistory": { + "items": { + "properties": { + "action": { + "type": "string", + "enum": [ + "add-deployment-interstitial", + "add-project-interstitial", + "remove-deployment-interstitial", + "remove-project-interstitial" + ] + }, + "createdAt": { + "type": "number" + }, + "caseId": { + "type": "string" + }, + "reason": { + "type": "string" + }, + "actor": { + "type": "string" + }, + "comment": { + "type": "string" + } + }, + "required": [ + "action", + "createdAt" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "history", + "updatedAt" + ], + "type": "object" + }, + "internalRoutes": { + "items": { + "oneOf": [ + { + "properties": { + "src": { + "type": "string" + }, + "status": { + "type": "number" + }, + "expiry": { + "type": "number" + } + }, + "required": [ + "src", + "status" + ], + "type": "object" + }, + { + "properties": { + "has": { + "items": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "header" + ] + }, + "key": { + "type": "string", + "enum": [ + "x-vercel-ip-country" + ] + }, + "value": { + "properties": { + "eq": { + "type": "string" + } + }, + "required": [ + "eq" + ], + "type": "object" + } + }, + "required": [ + "key", + "type", + "value" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "host" + ] + }, + "value": { + "properties": { + "eq": { + "type": "string" + } + }, + "required": [ + "eq" + ], + "type": "object" + } + }, + "required": [ + "type", + "value" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "mitigate": { + "properties": { + "action": { + "type": "string", + "enum": [ + "block_legal_cwc" + ] + } + }, + "required": [ + "action" + ], + "type": "object" + }, + "src": { + "type": "string" + } + }, + "required": [ + "has", + "mitigate" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "hasDeployments": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "dismissedToasts": { + "items": { + "properties": { + "key": { + "type": "string" + }, + "dismissedAt": { + "type": "number" + }, + "action": { + "type": "string", + "enum": [ + "accept", + "cancel", + "delete" + ] + }, + "value": { + "nullable": true, + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "properties": { + "previousValue": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + } + ] + }, + "currentValue": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + } + ] + } + }, + "required": [ + "currentValue", + "previousValue" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + } + ] + } + }, + "required": [ + "action", + "dismissedAt", + "key", + "value" + ], + "type": "object" + }, + "type": "array" + }, + "protectedSourcemaps": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "tracing": { + "properties": { + "domains": { + "type": "string" + }, + "ignorePaths": { + "items": { + "type": "string" + }, + "type": "array" + }, + "samplingRules": { + "items": { + "properties": { + "rate": { + "type": "number" + }, + "env": { + "type": "string", + "enum": [ + "preview", + "production" + ] + }, + "requestPath": { + "type": "string" + }, + "destination": { + "type": "string", + "enum": [ + "external", + "internal" + ], + "description": "Which tracing destination this rule applies to. `internal` is the hidden Vercel production-tracing drain (internal delivery); `external` is any customer-configured drain. Derived from the owning drain's delivery type when project tracing is computed; absent on configs persisted before this field existed." + } + }, + "required": [ + "rate" + ], + "type": "object" + }, + "type": "array" + } + }, + "type": "object" + }, + "avatar": { + "nullable": true, + "type": "string" + } + }, + "required": [ + "accountId", + "alias", + "defaultResourceConfig", + "deploymentExpiration", + "directoryListing", + "id", + "name", + "nodeVersion", + "resourceConfig" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid.\nOne of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "409": { + "description": "" + }, + "410": { + "description": "" + }, + "500": { + "description": "" + } + }, + "parameters": [ + { + "name": "projectId", + "description": "The unique project identifier", + "in": "path", + "required": true, + "schema": { + "example": "prj_12HKQaOmR5t5Uy6vdcQsNIiZgHGB", + "description": "The unique project identifier", + "type": "string" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "microfrontendsGroupId": { + "type": "string", + "example": "mfe_12HKQaOmR5t5Uy6vdcQsNIiZgHGB", + "description": "The unique group identifier to add this microfrontend to" + }, + "enabled": { + "type": "boolean", + "example": true, + "description": "Enable or disable microfrontends for the project" + }, + "isDefaultApp": { + "type": "boolean", + "example": true, + "description": "Whether the application is the default application for the microfrontends group" + }, + "defaultRoute": { + "type": "string", + "example": "/home", + "description": "The default route used for screenshots and preview links for the project" + }, + "routeObservabilityToThisProject": { + "type": "boolean", + "description": "Whether observability data should be routed to this project or a root project. Can only be set for child applications." + }, + "doNotRouteWithMicrofrontendsRouting": { + "type": "boolean", + "description": "Whether domains in this project should route as a microfrontend. Can only be set for child applications." + } + } + } + } + } + } + } + }, + "/v10/projects/{projectId}/promote/{deploymentId}": { + "post": { + "description": "Allows users to promote a deployment to production. Note: This does NOT rebuild the deployment. If you need that, then call create-deployments endpoint.", + "operationId": "requestPromote", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Point production traffic to a given deployment", + "tags": [ + "projects" + ], + "responses": { + "201": { + "description": "" + }, + "202": { + "description": "" + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "409": { + "description": "" + }, + "410": { + "description": "" + }, + "422": { + "description": "" + } + }, + "parameters": [ + { + "name": "projectId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "deploymentId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + } + }, + "/v1/projects/{projectId}/promote/aliases": { + "get": { + "description": "Get a list of aliases related to the last promote request with their mapping status", + "operationId": "listPromoteAliases", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Gets a list of aliases with status for the current promote", + "tags": [ + "projects" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "oneOf": [ + { + "type": "object" + }, + { + "properties": { + "aliases": { + "items": { + "properties": { + "status": { + "type": "string" + }, + "alias": { + "type": "string" + }, + "id": { + "type": "string" + } + }, + "required": [ + "alias", + "id", + "status" + ], + "type": "object" + }, + "type": "array" + }, + "pagination": { + "$ref": "#/components/schemas/Pagination" + } + }, + "required": [ + "aliases", + "pagination" + ], + "type": "object" + } + ] + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "projectId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "limit", + "description": "Maximum number of aliases to list from a request (max 100).", + "in": "query", + "required": false, + "schema": { + "description": "Maximum number of aliases to list from a request (max 100).", + "type": "number", + "example": 20, + "maximum": 100 + } + }, + { + "name": "since", + "description": "Get aliases created after this epoch timestamp.", + "in": "query", + "required": false, + "schema": { + "description": "Get aliases created after this epoch timestamp.", + "type": "number", + "example": 1609499532000 + } + }, + { + "name": "until", + "description": "Get aliases created before this epoch timestamp.", + "in": "query", + "required": false, + "schema": { + "description": "Get aliases created before this epoch timestamp.", + "type": "number", + "example": 1612264332000 + } + }, + { + "name": "failedOnly", + "description": "Filter results down to aliases that failed to map to the requested deployment", + "in": "query", + "required": false, + "schema": { + "description": "Filter results down to aliases that failed to map to the requested deployment", + "type": "boolean" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + } + }, + "/v1/projects/{projectId}/pause": { + "post": { + "description": "Pause a project by passing its project `id` in the URL. If the project does not exist given the id then the request will fail with 400 status code. If the project disables auto assigning custom production domains and blocks the active Production Deployment then the request will return with 200 status code.", + "operationId": "pauseProject", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Pause a project", + "tags": [ + "projects" + ], + "responses": { + "200": { + "description": "" + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "410": { + "description": "" + }, + "500": { + "description": "" + } + }, + "parameters": [ + { + "name": "projectId", + "description": "The unique project identifier", + "in": "path", + "required": true, + "schema": { + "type": "string", + "description": "The unique project identifier" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + } + }, + "/v1/projects/{projectId}/unpause": { + "post": { + "description": "Unpause a project by passing its project `id` in the URL. If the project does not exist given the id then the request will fail with 400 status code. If the project enables auto assigning custom production domains and unblocks the active Production Deployment then the request will return with 200 status code.", + "operationId": "unpauseProject", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Unpause a project", + "tags": [ + "projects" + ], + "responses": { + "200": { + "description": "" + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "410": { + "description": "" + }, + "500": { + "description": "" + } + }, + "parameters": [ + { + "name": "projectId", + "description": "The unique project identifier", + "in": "path", + "required": true, + "schema": { + "type": "string", + "description": "The unique project identifier" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + } + }, + "/v2/sandboxes": { + "get": { + "description": "Retrieves a paginated list of named sandboxes belonging to a specific project. Results can be sorted by creation time or name, and optionally filtered by name prefix or status.", + "operationId": "listNamedSandboxes", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "List sandboxes", + "tags": [ + "sandboxes" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "sandboxes": { + "items": { + "$ref": "#/components/schemas/NamedSandbox" + }, + "type": "array" + }, + "pagination": { + "properties": { + "count": { + "type": "number" + }, + "next": { + "nullable": true, + "type": "string" + } + }, + "required": [ + "count", + "next" + ], + "type": "object" + } + }, + "required": [ + "pagination", + "sandboxes" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + }, + "429": { + "description": "" + } + }, + "parameters": [ + { + "name": "project", + "description": "The unique identifier or name of the project to list named sandboxes for.", + "in": "query", + "required": false, + "schema": { + "description": "The unique identifier or name of the project to list named sandboxes for.", + "type": "string", + "example": "prj_abc123" + } + }, + { + "name": "limit", + "description": "Maximum number of named sandboxes to return in the response. Used for pagination.", + "in": "query", + "required": false, + "schema": { + "description": "Maximum number of named sandboxes to return in the response. Used for pagination.", + "type": "number", + "minimum": 1, + "maximum": 50, + "default": 20, + "example": 20 + } + }, + { + "name": "sortBy", + "description": "Field to sort by.", + "in": "query", + "required": false, + "schema": { + "description": "Field to sort by.", + "type": "string", + "enum": [ + "createdAt", + "name", + "statusUpdatedAt", + "currentSnapshotId" + ], + "default": "createdAt" + } + }, + { + "name": "namePrefix", + "description": "Filter named sandboxes whose name starts with this prefix. Only valid when sortBy=name.", + "in": "query", + "required": false, + "schema": { + "description": "Filter named sandboxes whose name starts with this prefix. Only valid when sortBy=name.", + "type": "string" + } + }, + { + "name": "cursor", + "description": "Opaque pagination cursor from a previous response.", + "in": "query", + "required": false, + "schema": { + "description": "Opaque pagination cursor from a previous response.", + "type": "string" + } + }, + { + "name": "sortOrder", + "description": "Sort direction. Defaults to desc.", + "in": "query", + "required": false, + "schema": { + "description": "Sort direction. Defaults to desc.", + "type": "string", + "enum": [ + "asc", + "desc" + ], + "default": "desc" + } + }, + { + "name": "status", + "description": "Filter named sandboxes by status. Only valid when sortBy is createdAt.", + "in": "query", + "required": false, + "schema": { + "description": "Filter named sandboxes by status. Only valid when sortBy is createdAt.", + "type": "string", + "enum": [ + "running", + "stopping", + "stopped" + ] + } + }, + { + "name": "tags", + "description": "Filter sandboxes by tag. Format: \\\"key:value\\\". Only one tag filter is supported at a time.", + "in": "query", + "required": false, + "schema": { + "description": "Filter sandboxes by tag. Format: \\\"key:value\\\". Only one tag filter is supported at a time.", + "anyOf": [ + { + "type": "string" + }, + { + "type": "array", + "items": { + "type": "string" + } + } + ] + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + }, + "post": { + "description": "Creates a named sandbox environment. Named sandboxes have a unique name within a project and support automatic snapshotting on shutdown.", + "operationId": "createSandboxesV2", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Create a named sandbox", + "tags": [ + "sandboxes" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "sandbox": { + "$ref": "#/components/schemas/NamedSandbox" + }, + "session": { + "$ref": "#/components/schemas/Session" + }, + "routes": { + "items": { + "$ref": "#/components/schemas/SandboxPublicRoute" + }, + "type": "array" + } + }, + "required": [ + "routes", + "sandbox", + "session" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "402": { + "description": "The account is missing a payment so payment method must be updated" + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "409": { + "description": "" + }, + "410": { + "description": "" + }, + "422": { + "description": "" + }, + "429": { + "description": "The concurrency limit has been exceeded." + }, + "500": { + "description": "" + } + }, + "parameters": [ + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "additionalProperties": false, + "properties": { + "networkPolicy": { + "oneOf": [ + { + "description": "Network access policy for the sandbox.\\n Controls which external hosts the sandbox can communicate with.\\n Use \\\"allow-all\\\" mode to allow all traffic, \\\"deny-all\\\" to block all traffic or \\\"custom\\\" to provide specific rules.", + "type": "object", + "additionalProperties": false, + "required": [ + "mode" + ], + "properties": { + "mode": { + "description": "The network access policy mode. Use \\\"allow-all\\\" to permit all outbound traffic. Use \\\"deny-all\\\" to block all outbound traffic. Use \\\"custom\\\" to specify explicit allow/deny rules.", + "type": "string", + "enum": [ + "allow-all", + "deny-all", + "custom", + "default-allow", + "default-deny" + ], + "example": "custom" + }, + "allowedDomains": { + "description": "List of domain names the sandbox is allowed to connect to. Only applies when mode is \\\"custom\\\". Supports wildcard patterns (e.g., \\\"*.example.com\\\" matches all subdomains).", + "type": "array", + "example": [ + "api.github.com", + "*.npmjs.org" + ], + "items": { + "type": "string", + "description": "A domain name pattern. Use \\\"*\\\" for wildcard matching of subdomains (e.g., \\\"*.example.com\\\")." + } + }, + "allowedCIDRs": { + "description": "List of IP address ranges (in CIDR notation) the sandbox is allowed to connect to. Traffic to these addresses bypasses domain-based restrictions.", + "type": "array", + "example": [ + "35.192.0.0/12", + "104.16.0.0/12" + ], + "items": { + "type": "string", + "description": "An IPv4 address range in CIDR notation (e.g., \\\"35.192.0.0/12\\\")." + } + }, + "deniedCIDRs": { + "description": "List of IP address ranges (in CIDR notation) the sandbox is blocked from connecting to. These rules take precedence over all allowed rules.", + "type": "array", + "example": [ + "35.192.0.0/12" + ], + "items": { + "type": "string", + "description": "An IP address range in CIDR notation to block." + } + }, + "injectionRules": { + "description": "HTTP header injection rules for outgoing requests matching specific domains. Traffic to matching domains will be intercepted instead of proxied through encrypted connections.", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "required": [ + "domain", + "headers" + ], + "properties": { + "domain": { + "description": "The domain (or pattern) of requests to add headers for. Supports wildcards like *.example.com.", + "type": "string" + }, + "headers": { + "description": "HTTP headers to inject into requests for this domain. Existing headers with the same name will be overridden.", + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "match": { + "description": "Optional L7 match. When provided, the injection rule only applies to requests that satisfy every specified dimension. When multiple injection rules target the same domain they are evaluated in order and the first match wins; a rule without `match` matches any request and shadows later rules for the same domain.", + "type": "object", + "additionalProperties": false, + "properties": { + "path": { + "description": "Match on the request path. Comparison is case-sensitive.", + "type": "object", + "additionalProperties": false, + "properties": { + "exact": { + "type": "string", + "description": "Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys." + }, + "startsWith": { + "type": "string", + "description": "Match values that start with the given prefix." + } + } + }, + "method": { + "type": "array", + "description": "HTTP methods to match. Any single match succeeds (OR semantics).", + "items": { + "type": "string" + } + }, + "queryString": { + "type": "array", + "description": "Query-string entry matchers. Multiple entries are ANDed. Query parameter names and values are both compared case-sensitively (RFC 3986). When a request has multiple values for the same key, any matching value satisfies the matcher.", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "key": { + "description": "Matcher for the entry key (header name or query key).", + "type": "object", + "additionalProperties": false, + "properties": { + "exact": { + "type": "string", + "description": "Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys." + }, + "startsWith": { + "type": "string", + "description": "Match values that start with the given prefix." + } + } + }, + "value": { + "description": "Matcher for the entry value.", + "type": "object", + "additionalProperties": false, + "properties": { + "exact": { + "type": "string", + "description": "Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys." + }, + "startsWith": { + "type": "string", + "description": "Match values that start with the given prefix." + } + } + } + } + } + }, + "headers": { + "type": "array", + "description": "Header matchers. Multiple entries are ANDed. Header names are compared case-insensitively (RFC 9110); header values are compared case-sensitively. When a request has multiple values for the same header, any matching value satisfies the matcher.", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "key": { + "description": "Matcher for the entry key (header name or query key).", + "type": "object", + "additionalProperties": false, + "properties": { + "exact": { + "type": "string", + "description": "Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys." + }, + "startsWith": { + "type": "string", + "description": "Match values that start with the given prefix." + } + } + }, + "value": { + "description": "Matcher for the entry value.", + "type": "object", + "additionalProperties": false, + "properties": { + "exact": { + "type": "string", + "description": "Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys." + }, + "startsWith": { + "type": "string", + "description": "Match values that start with the given prefix." + } + } + } + } + } + } + } + } + } + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "properties": { + "allow": { + "oneOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "description": "A rule applied to requests matching a domain in the network policy. Only one of `transform`, `forwardURL`, or `response` can be specified per rule.", + "type": "object", + "additionalProperties": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "match": { + "description": "Optional L7 match. When provided, the injection rule only applies to requests that satisfy every specified dimension. When multiple injection rules target the same domain they are evaluated in order and the first match wins; a rule without `match` matches any request and shadows later rules for the same domain.", + "type": "object", + "additionalProperties": false, + "properties": { + "path": { + "description": "Match on the request path. Comparison is case-sensitive.", + "type": "object", + "additionalProperties": false, + "properties": { + "exact": { + "type": "string", + "description": "Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys." + }, + "startsWith": { + "type": "string", + "description": "Match values that start with the given prefix." + } + } + }, + "method": { + "type": "array", + "description": "HTTP methods to match. Any single match succeeds (OR semantics).", + "items": { + "type": "string" + } + }, + "queryString": { + "type": "array", + "description": "Query-string entry matchers. Multiple entries are ANDed. Query parameter names and values are both compared case-sensitively (RFC 3986). When a request has multiple values for the same key, any matching value satisfies the matcher.", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "key": { + "description": "Matcher for the entry key (header name or query key).", + "type": "object", + "additionalProperties": false, + "properties": { + "exact": { + "type": "string", + "description": "Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys." + }, + "startsWith": { + "type": "string", + "description": "Match values that start with the given prefix." + } + } + }, + "value": { + "description": "Matcher for the entry value.", + "type": "object", + "additionalProperties": false, + "properties": { + "exact": { + "type": "string", + "description": "Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys." + }, + "startsWith": { + "type": "string", + "description": "Match values that start with the given prefix." + } + } + } + } + } + }, + "headers": { + "type": "array", + "description": "Header matchers. Multiple entries are ANDed. Header names are compared case-insensitively (RFC 9110); header values are compared case-sensitively. When a request has multiple values for the same header, any matching value satisfies the matcher.", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "key": { + "description": "Matcher for the entry key (header name or query key).", + "type": "object", + "additionalProperties": false, + "properties": { + "exact": { + "type": "string", + "description": "Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys." + }, + "startsWith": { + "type": "string", + "description": "Match values that start with the given prefix." + } + } + }, + "value": { + "description": "Matcher for the entry value.", + "type": "object", + "additionalProperties": false, + "properties": { + "exact": { + "type": "string", + "description": "Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys." + }, + "startsWith": { + "type": "string", + "description": "Match values that start with the given prefix." + } + } + } + } + } + } + } + }, + "transform": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "headers": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + } + } + }, + "forwardURL": { + "type": "string", + "description": "HTTP/1.1 proxy URL to forward traffic to. Must not include username, password, query string, or fragment." + }, + "response": { + "description": "Answer matching requests from the proxy with this response instead of forwarding them to the origin. Combine with a `match` on an earlier rule to allow one sub-path and reject the rest of a domain.", + "type": "object", + "additionalProperties": false, + "required": [ + "statusCode" + ], + "properties": { + "statusCode": { + "type": "integer", + "minimum": 200, + "maximum": 599, + "description": "HTTP status code returned to the sandbox." + }, + "headers": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "description": "HTTP response headers. Framing and hop-by-hop headers are managed by the proxy and cannot be set." + }, + "body": { + "type": "string", + "description": "UTF-8 response body. Requires `contentType`." + }, + "contentType": { + "type": "string", + "description": "Value of the `Content-Type` response header. Required when `body` is set." + } + } + } + } + } + } + } + ] + }, + "subnets": { + "type": "object", + "additionalProperties": false, + "properties": { + "allow": { + "type": "array", + "items": { + "type": "string" + } + }, + "deny": { + "type": "array", + "items": { + "type": "string" + } + } + } + } + } + } + ] + }, + "runtime": { + "description": "The runtime environment for the sandbox. Determines the pre-installed language runtimes and tools available.", + "type": "string", + "enum": [ + "node22", + "node24", + "node26", + "python3.13" + ], + "default": "node24", + "example": "node24" + }, + "resources": { + "description": "Resources to define the VM", + "additionalProperties": false, + "type": "object", + "properties": { + "vcpus": { + "description": "The number of virtual CPUs to allocate to the sandbox. Must be 1, or an even number.", + "type": "integer", + "minimum": 1, + "default": 2, + "example": 2 + }, + "memory": { + "description": "The amount of memory in megabytes to allocate to the sandbox. Must equal vcpus * 2048.", + "type": "integer", + "minimum": 2048, + "example": 4096 + } + } + }, + "source": { + "description": "The source from which to initialize the sandbox filesystem. Can be a Git repository, a tarball URL, or an existing snapshot.", + "oneOf": [ + { + "type": "object", + "description": "Clone a Git repository into the sandbox.", + "properties": { + "type": { + "description": "Indicates the source is a Git repository." + }, + "url": { + "type": "string", + "format": "uri", + "description": "The URL of the Git repository to clone.", + "example": "https://github.com/vercel/next.js.git" + }, + "username": { + "type": "string", + "description": "Username for Git authentication. Required together with password for private repositories." + }, + "password": { + "type": "string", + "description": "Password or personal access token for Git authentication. Required together with username for private repositories." + }, + "depth": { + "type": "integer", + "minimum": 1, + "description": "Create a shallow clone with history truncated to the specified number of commits. Useful for faster cloning of large repositories.", + "example": 1 + }, + "revision": { + "type": "string", + "description": "The specific commit SHA, branch name, or tag to checkout after cloning.", + "example": "main" + } + }, + "required": [ + "type", + "url" + ], + "additionalProperties": false + }, + { + "type": "object", + "description": "Download and extract a gzipped tarball into the sandbox.", + "properties": { + "type": { + "description": "Indicates the source is a tarball." + }, + "url": { + "type": "string", + "format": "uri", + "description": "URL of a gzipped tarball (.tar.gz) to download and extract.", + "example": "https://example.com/project.tar.gz" + } + }, + "required": [ + "type", + "url" + ], + "additionalProperties": false + }, + { + "type": "object", + "description": "Restore the sandbox filesystem from an existing snapshot.", + "properties": { + "type": { + "description": "Indicates the source is a snapshot." + }, + "snapshotId": { + "type": "string", + "description": "The unique identifier of the snapshot to restore.", + "example": "snap_abc123" + } + }, + "required": [ + "type", + "snapshotId" + ], + "additionalProperties": false + } + ] + }, + "projectId": { + "description": "The target project slug or ID in which the sandbox will be assigned to.", + "example": "prj_abc123", + "type": "string" + }, + "ports": { + "description": "List of ports to expose from the sandbox. Each port will be accessible via a unique URL. Maximum of 15 ports can be exposed.", + "type": "array", + "maxItems": 15, + "uniqueItems": true, + "example": [ + 3000, + 4000 + ], + "items": { + "type": "integer", + "description": "A port number to expose from the sandbox. Must be between 1024 and 65535.", + "not": { + "enum": [ + 23456 + ] + }, + "maximum": 65535, + "minimum": 1024 + } + }, + "image": { + "type": "string", + "maxLength": 255, + "description": "Image to use for the sandbox." + }, + "timeout": { + "type": "integer", + "description": "Maximum duration in milliseconds that the sandbox can run before being automatically stopped.", + "minimum": 1000, + "example": 300000 + }, + "env": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "description": "Default environment variables for the sandbox. These are inherited by all commands unless overridden.", + "default": {}, + "example": { + "NODE_ENV": "production", + "HELLO": "world" + } + }, + "mounts": { + "type": "object", + "description": "List of drives to mount to the sandbox at the provided path.", + "maxProperties": 4, + "additionalProperties": { + "type": "object", + "additionalProperties": false, + "required": [ + "drive" + ], + "properties": { + "drive": { + "type": "string", + "description": "Name of the drive to mount. The drive must already exist.", + "maxLength": 64, + "pattern": "^[a-zA-Z0-9_-]+$" + }, + "mode": { + "type": "string", + "description": "Mount the drive as read-write, or as a read-only snapshot. One writer is permitted at a time.", + "default": "read-write", + "enum": [ + "snapshot", + "read-write" + ] + } + } + } + }, + "region": { + "type": "string", + "enum": [ + "iad1", + "sfo1", + "cle1", + "cdg1", + "fra1", + "arn1", + "sin1", + "pdx1", + "lhr1", + "icn1", + "bom1", + "cpt1", + "dub1", + "gru1", + "hkg1", + "syd1", + "yul1", + "hnd1", + "kix1" + ], + "default": [ + "iad1", + "sfo1", + "cle1", + "cdg1", + "fra1", + "arn1", + "sin1", + "pdx1", + "lhr1", + "icn1", + "bom1", + "cpt1", + "dub1", + "gru1", + "hkg1", + "syd1", + "yul1", + "hnd1", + "kix1" + ], + "description": "The Vercel region in which to create the sandbox.", + "example": "iad1" + }, + "failoverRegions": { + "type": "array", + "maxItems": 19, + "uniqueItems": true, + "items": { + "type": "string", + "enum": [ + "iad1", + "sfo1", + "cle1", + "cdg1", + "fra1", + "arn1", + "sin1", + "pdx1", + "lhr1", + "icn1", + "bom1", + "cpt1", + "dub1", + "gru1", + "hkg1", + "syd1", + "yul1", + "hnd1", + "kix1" + ] + }, + "description": "The regions the sandbox falls back to when it cannot be created in `region`.", + "example": [ + "sfo1", + "cle1" + ] + }, + "networkId": { + "type": "string", + "maxLength": 255, + "description": "The Connect network id for the target Secure Compute private network." + }, + "name": { + "example": "my-sandbox", + "type": "string", + "pattern": "^[a-zA-Z0-9_-]+$", + "maxLength": 128, + "description": "Name for the sandbox. Must be unique per project and URL-safe (alphanumeric, hyphens, underscores)." + }, + "persistent": { + "description": "Whether the sandbox persists its state across restarts via automatic snapshots. Defaults to true.", + "type": "boolean", + "default": true + }, + "snapshotExpiration": { + "description": "Default snapshot expiration time in milliseconds. Set to 0 to disable expiration. When set, this value is used as the default expiration for all snapshots created for this sandbox.", + "oneOf": [ + {}, + { + "type": "integer" + } + ], + "example": 604800000 + }, + "keepLastSnapshots": { + "description": "Protect the N most recent snapshots with different expiration/deletion behavior.", + "type": "object", + "additionalProperties": false, + "required": [ + "count" + ], + "properties": { + "count": { + "type": "integer", + "minimum": 1, + "maximum": 10, + "description": "Number of most recent snapshots to keep." + }, + "expiration": { + "description": "Expiration time in milliseconds for kept snapshots. Falls back to snapshotExpiration.", + "oneOf": [ + {}, + { + "type": "integer" + } + ] + }, + "deleteEvicted": { + "type": "boolean", + "description": "Whether to immediately delete evicted snapshots. Defaults to true." + } + } + }, + "tags": { + "description": "Key-value tags to associate with the sandbox. Maximum 5 tags.", + "type": "object", + "maxProperties": 5, + "additionalProperties": { + "type": "string", + "maxLength": 256 + }, + "example": { + "env": "staging", + "team": "platform" + } + } + } + } + } + } + } + } + }, + "/v2/sandboxes/drives": { + "get": { + "description": "Retrieves a paginated list of drives belonging to a specific project. Drives are in private beta. Register your interest to get access: https://vercel.com/changelog/drives-for-vercel-sandbox-in-private-beta", + "operationId": "listDrives", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "List drives", + "tags": [ + "sandboxes" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "drives": { + "items": { + "$ref": "#/components/schemas/Drive" + }, + "type": "array" + }, + "pagination": { + "properties": { + "count": { + "type": "number" + }, + "next": { + "nullable": true, + "type": "string" + } + }, + "required": [ + "count", + "next" + ], + "type": "object" + } + }, + "required": [ + "drives", + "pagination" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + }, + "429": { + "description": "" + } + }, + "parameters": [ + { + "name": "projectId", + "description": "The project ID or name associated with the drives. Required unless using a Vercel OIDC token scoped to a project.", + "in": "query", + "required": false, + "schema": { + "type": "string", + "description": "The project ID or name associated with the drives. Required unless using a Vercel OIDC token scoped to a project.", + "example": "prj_abc123" + } + }, + { + "name": "limit", + "description": "Maximum number of drives to return in the response. Used for pagination.", + "in": "query", + "required": false, + "schema": { + "description": "Maximum number of drives to return in the response. Used for pagination.", + "type": "number", + "minimum": 1, + "maximum": 50, + "default": 20, + "example": 20 + } + }, + { + "name": "cursor", + "description": "Opaque pagination cursor from a previous response.", + "in": "query", + "required": false, + "schema": { + "description": "Opaque pagination cursor from a previous response.", + "type": "string" + } + }, + { + "name": "sortBy", + "description": "Field to sort drives by.", + "in": "query", + "required": false, + "schema": { + "description": "Field to sort drives by.", + "type": "string", + "enum": [ + "createdAt", + "updatedAt", + "name" + ], + "default": "createdAt" + } + }, + { + "name": "namePrefix", + "description": "Filter drives whose name starts with this prefix. Only valid when sortBy=name.", + "in": "query", + "required": false, + "schema": { + "description": "Filter drives whose name starts with this prefix. Only valid when sortBy=name.", + "type": "string" + } + }, + { + "name": "sortOrder", + "description": "Sort direction for results.", + "in": "query", + "required": false, + "schema": { + "description": "Sort direction for results.", + "type": "string", + "enum": [ + "asc", + "desc" + ], + "default": "desc" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + } + }, + "/v2/sandboxes/drives/{name}": { + "post": { + "description": "Gets an existing drive by project and name, or creates it when it does not exist. Drives are in private beta. Register your interest to get access: https://vercel.com/changelog/drives-for-vercel-sandbox-in-private-beta", + "operationId": "getOrCreateDrive", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Get or create a drive", + "tags": [ + "sandboxes" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "drive": { + "$ref": "#/components/schemas/Drive" + } + }, + "required": [ + "drive" + ], + "type": "object" + } + } + } + }, + "201": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "drive": { + "$ref": "#/components/schemas/Drive" + } + }, + "required": [ + "drive" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid.\nOne of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "402": { + "description": "The account is missing a payment so payment method must be updated" + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "409": { + "description": "" + }, + "410": { + "description": "" + }, + "429": { + "description": "" + } + }, + "parameters": [ + { + "name": "name", + "description": "Name for the drive. Must be unique per project and URL-safe (alphanumeric, hyphens, underscores).", + "in": "path", + "required": true, + "schema": { + "type": "string", + "description": "Name for the drive. Must be unique per project and URL-safe (alphanumeric, hyphens, underscores).", + "pattern": "^[a-zA-Z0-9_-]+$", + "maxLength": 64, + "example": "workspace" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "additionalProperties": false, + "properties": { + "projectId": { + "type": "string", + "description": "The project ID or name to associate the drive with. Required unless using a Vercel OIDC token scoped to a project.", + "example": "prj_abc123" + }, + "maxSizeBytes": { + "type": "integer", + "description": "Maximum drive size in bytes. Defaults to 1 TiB when omitted (1 GiB for Hobby). The maximum quota is 16 TiB. Request a quota above 16 TiB at https://vercel.com/help." + }, + "region": { + "type": "string", + "description": "Region where the drive is stored. Defaults to iad1.", + "enum": [ + "iad1", + "sfo1", + "cle1", + "cdg1", + "fra1", + "arn1", + "sin1", + "pdx1", + "lhr1", + "icn1", + "bom1", + "cpt1", + "dub1", + "gru1", + "hkg1", + "syd1", + "yul1", + "hnd1", + "kix1" + ], + "default": "iad1", + "example": "iad1" + } + } + } + } + } + } + }, + "delete": { + "description": "Deletes a drive by project and name. Attached drives cannot be deleted. Stop or replace the session currently using the drive before retrying deletion. Drives are in private beta. Register your interest to get access: https://vercel.com/changelog/drives-for-vercel-sandbox-in-private-beta", + "operationId": "deleteDrive", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Delete a drive", + "tags": [ + "sandboxes" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "drive": { + "$ref": "#/components/schemas/Drive" + } + }, + "required": [ + "drive" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "409": { + "description": "" + }, + "410": { + "description": "" + }, + "429": { + "description": "" + } + }, + "parameters": [ + { + "name": "name", + "description": "Name for the drive. Must be unique per project and URL-safe (alphanumeric, hyphens, underscores).", + "in": "path", + "required": true, + "schema": { + "type": "string", + "description": "Name for the drive. Must be unique per project and URL-safe (alphanumeric, hyphens, underscores).", + "pattern": "^[a-zA-Z0-9_-]+$", + "maxLength": 64, + "example": "workspace" + } + }, + { + "name": "projectId", + "description": "The project ID or name associated with the drive. Required unless using a Vercel OIDC token scoped to a project.", + "in": "query", + "required": false, + "schema": { + "type": "string", + "description": "The project ID or name associated with the drive. Required unless using a Vercel OIDC token scoped to a project.", + "example": "prj_abc123" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + } + }, + "/v2/sandboxes/snapshots": { + "get": { + "description": "Retrieves a paginated list of snapshots for a specific project.", + "operationId": "listSessionSnapshots", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "List snapshots", + "tags": [ + "sandboxes" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "oneOf": [ + { + "type": "object" + }, + { + "properties": { + "snapshots": { + "items": { + "$ref": "#/components/schemas/Snapshot" + }, + "type": "array" + }, + "pagination": { + "properties": { + "count": { + "type": "number" + }, + "next": { + "nullable": true, + "type": "string" + } + }, + "required": [ + "count", + "next" + ], + "type": "object" + } + }, + "required": [ + "pagination", + "snapshots" + ], + "type": "object" + } + ] + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + }, + "429": { + "description": "" + } + }, + "parameters": [ + { + "name": "project", + "description": "The unique identifier or name of the project to list snapshots for.", + "in": "query", + "required": false, + "schema": { + "description": "The unique identifier or name of the project to list snapshots for.", + "type": "string", + "example": "prj_abc123" + } + }, + { + "name": "name", + "description": "Name for the sandbox. Must be unique per project and URL-safe (alphanumeric, hyphens, underscores).", + "in": "query", + "required": false, + "schema": { + "description": "Name for the sandbox. Must be unique per project and URL-safe (alphanumeric, hyphens, underscores).", + "type": "string", + "pattern": "^[a-zA-Z0-9_-]+$", + "maxLength": 128, + "example": "my-sandbox" + } + }, + { + "name": "limit", + "description": "Maximum number of snapshots to return in the response. Used for pagination.", + "in": "query", + "required": false, + "schema": { + "description": "Maximum number of snapshots to return in the response. Used for pagination.", + "type": "number", + "minimum": 1, + "maximum": 50, + "default": 20, + "example": 20 + } + }, + { + "name": "cursor", + "description": "Opaque pagination cursor from a previous response.", + "in": "query", + "required": false, + "schema": { + "description": "Opaque pagination cursor from a previous response.", + "type": "string" + } + }, + { + "name": "sortOrder", + "description": "Sort direction for results by creation time.", + "in": "query", + "required": false, + "schema": { + "description": "Sort direction for results by creation time.", + "type": "string", + "enum": [ + "asc", + "desc" + ], + "default": "desc" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + } + }, + "/v2/sandboxes/snapshots/{snapshotId}": { + "get": { + "description": "Retrieves detailed information about a specific snapshot, including its creation time, size, expiration date, and the source session it was created from.", + "operationId": "getSessionSnapshot", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Get a snapshot", + "tags": [ + "sandboxes" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "snapshot": { + "$ref": "#/components/schemas/Snapshot" + } + }, + "required": [ + "snapshot" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + }, + "429": { + "description": "" + } + }, + "parameters": [ + { + "name": "snapshotId", + "description": "The unique identifier of the snapshot to retrieve.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "description": "The unique identifier of the snapshot to retrieve.", + "pattern": "^(?:snap_[A-Za-z0-9]{28}|vhs_[a-z0-9]{28})$", + "maxLength": 33, + "example": "snap_1234567890123456789012345678" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + }, + "delete": { + "description": "Permanently deletes a snapshot and frees its associated storage. This action cannot be undone. After deletion, the snapshot can no longer be used to create new sessions.", + "operationId": "deleteSessionSnapshot", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Delete a snapshot", + "tags": [ + "sandboxes" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "snapshot": { + "$ref": "#/components/schemas/Snapshot" + } + }, + "required": [ + "snapshot" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + }, + "429": { + "description": "" + } + }, + "parameters": [ + { + "name": "snapshotId", + "description": "The unique identifier of the snapshot to delete.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "description": "The unique identifier of the snapshot to delete.", + "pattern": "^(?:snap_[A-Za-z0-9]{28}|vhs_[a-z0-9]{28})$", + "maxLength": 33, + "example": "snap_1234567890123456789012345678" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + } + }, + "/v2/sandboxes/sessions": { + "get": { + "description": "Retrieves a paginated list of sessions belonging to a specific sandbox. Results are sorted by creation time and paginated using an opaque cursor.", + "operationId": "listSessions", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "List sessions", + "tags": [ + "sandboxes" + ], + "responses": { + "200": { + "description": "The list of sessions matching the request filters.", + "content": { + "application/json": { + "schema": { + "oneOf": [ + { + "type": "object" + }, + { + "properties": { + "sessions": { + "items": { + "$ref": "#/components/schemas/Session" + }, + "type": "array" + }, + "pagination": { + "properties": { + "count": { + "type": "number" + }, + "next": { + "nullable": true, + "type": "string" + } + }, + "required": [ + "count", + "next" + ], + "type": "object" + } + }, + "required": [ + "pagination", + "sessions" + ], + "type": "object" + } + ] + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + }, + "429": { + "description": "" + }, + "500": { + "description": "" + } + }, + "parameters": [ + { + "name": "project", + "description": "The unique identifier or name of the project to list sessions for.", + "in": "query", + "required": false, + "schema": { + "description": "The unique identifier or name of the project to list sessions for.", + "type": "string", + "example": "prj_abc123" + } + }, + { + "name": "name", + "description": "Filter sessions by sandbox name. Only sessions belonging to the specified sandbox are returned.", + "in": "query", + "required": false, + "schema": { + "description": "Filter sessions by sandbox name. Only sessions belonging to the specified sandbox are returned.", + "type": "string", + "pattern": "^[a-zA-Z0-9_-]+$", + "maxLength": 128, + "example": "my-sandbox" + } + }, + { + "name": "limit", + "description": "Maximum number of sessions to return in the response. Used for pagination.", + "in": "query", + "required": false, + "schema": { + "description": "Maximum number of sessions to return in the response. Used for pagination.", + "type": "number", + "minimum": 1, + "maximum": 50, + "default": 20, + "example": 20 + } + }, + { + "name": "cursor", + "description": "Opaque pagination cursor from a previous response.", + "in": "query", + "required": false, + "schema": { + "description": "Opaque pagination cursor from a previous response.", + "type": "string" + } + }, + { + "name": "sortOrder", + "description": "Sort direction for results by creation time.", + "in": "query", + "required": false, + "schema": { + "description": "Sort direction for results by creation time.", + "type": "string", + "enum": [ + "asc", + "desc" + ], + "default": "desc" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + } + }, + "/v2/sandboxes/sessions/{sessionId}": { + "get": { + "description": "Retrieves detailed information about a specific session, including its current status, resource configuration, and exposed routes.", + "operationId": "getSession", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Get a session", + "tags": [ + "sandboxes" + ], + "responses": { + "200": { + "description": "The session was retrieved successfully.", + "content": { + "application/json": { + "schema": { + "properties": { + "session": { + "$ref": "#/components/schemas/Session" + }, + "routes": { + "items": { + "$ref": "#/components/schemas/SandboxPublicRoute" + }, + "type": "array" + } + }, + "required": [ + "routes", + "session" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + }, + "429": { + "description": "" + }, + "500": { + "description": "" + } + }, + "parameters": [ + { + "name": "sessionId", + "description": "The unique identifier of the session to retrieve.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "description": "The unique identifier of the session to retrieve.", + "example": "sbx_abc123" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + } + }, + "/v2/sandboxes/{name}": { + "get": { + "description": "Retrieves a named sandbox by name, including its current sandbox and routes. If the sandbox is stopped and resume is true, a new sandbox will be created from the most recent snapshot.", + "operationId": "getNamedSandbox", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Get a named sandbox", + "tags": [ + "sandboxes" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "sandbox": { + "$ref": "#/components/schemas/NamedSandbox" + }, + "session": { + "$ref": "#/components/schemas/Session" + }, + "routes": { + "items": { + "$ref": "#/components/schemas/SandboxPublicRoute" + }, + "type": "array" + }, + "resumed": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "resumed", + "routes", + "sandbox", + "session" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "402": { + "description": "The account is missing a payment so payment method must be updated" + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "409": { + "description": "" + }, + "410": { + "description": "" + }, + "429": { + "description": "The concurrency limit has been exceeded." + }, + "500": { + "description": "" + } + }, + "parameters": [ + { + "name": "name", + "description": "Name for the sandbox. Must be unique per project and URL-safe (alphanumeric, hyphens, underscores).", + "in": "path", + "required": true, + "schema": { + "description": "Name for the sandbox. Must be unique per project and URL-safe (alphanumeric, hyphens, underscores).", + "type": "string", + "pattern": "^[a-zA-Z0-9_-]+$", + "maxLength": 128, + "example": "my-sandbox" + } + }, + { + "name": "projectId", + "description": "The project ID or name (required when not using OIDC token).", + "in": "query", + "required": false, + "schema": { + "type": "string", + "description": "The project ID or name (required when not using OIDC token).", + "example": "prj_abc123" + } + }, + { + "name": "resume", + "description": "Whether to automatically resume a stopped named sandbox by creating a new instance from its snapshot. Defaults to false.", + "in": "query", + "required": false, + "schema": { + "type": "boolean", + "default": false, + "description": "Whether to automatically resume a stopped named sandbox by creating a new instance from its snapshot. Defaults to false." + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + }, + "patch": { + "description": "Updates the configuration of a sandbox. Only the provided fields will be modified; omitted fields remain unchanged.", + "operationId": "updateSandbox", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Update a sandbox", + "tags": [ + "sandboxes" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "oneOf": [ + { + "properties": { + "routes": { + "items": { + "$ref": "#/components/schemas/SandboxPublicRoute" + }, + "type": "array" + }, + "sandbox": { + "$ref": "#/components/schemas/NamedSandbox" + } + }, + "required": [ + "routes", + "sandbox" + ], + "type": "object" + }, + { + "properties": { + "sandbox": { + "$ref": "#/components/schemas/NamedSandbox" + }, + "session": { + "$ref": "#/components/schemas/Session" + }, + "routes": { + "items": { + "$ref": "#/components/schemas/SandboxPublicRoute" + }, + "type": "array" + }, + "resumed": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "resumed", + "routes", + "sandbox", + "session" + ], + "type": "object" + } + ] + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid.\nOne of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "402": { + "description": "The account is missing a payment so payment method must be updated" + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "409": { + "description": "" + }, + "410": { + "description": "" + }, + "422": { + "description": "" + }, + "429": { + "description": "The concurrency limit has been exceeded." + }, + "500": { + "description": "" + } + }, + "parameters": [ + { + "name": "name", + "description": "The sandbox to update.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "description": "The sandbox to update.", + "pattern": "^[a-zA-Z0-9_-]+$", + "maxLength": 128, + "example": "my-sandbox" + } + }, + { + "name": "projectId", + "description": "The project ID that owns the named sandbox. When provided, takes precedence over OIDC project context.", + "in": "query", + "required": false, + "schema": { + "type": "string", + "description": "The project ID that owns the named sandbox. When provided, takes precedence over OIDC project context.", + "maxLength": 128 + } + }, + { + "name": "resume", + "description": "Whether to automatically resume a stopped named sandbox by creating a new instance from its snapshot. Defaults to false.", + "in": "query", + "required": false, + "schema": { + "type": "boolean", + "default": false, + "description": "Whether to automatically resume a stopped named sandbox by creating a new instance from its snapshot. Defaults to false." + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "additionalProperties": false, + "properties": { + "resources": { + "description": "Resources to define the VM", + "additionalProperties": false, + "type": "object", + "properties": { + "vcpus": { + "description": "The number of virtual CPUs to allocate to the sandbox. Must be 1, or an even number.", + "type": "integer", + "minimum": 1, + "example": 2 + }, + "memory": { + "description": "The amount of memory in megabytes to allocate to the sandbox. Must equal vcpus * 2048.", + "type": "integer", + "minimum": 2048, + "example": 4096 + } + } + }, + "runtime": { + "description": "The runtime environment for the sandbox. Determines the pre-installed language runtimes and tools available.", + "type": "string", + "enum": [ + "node22", + "node24", + "node26", + "python3.13" + ], + "example": "node24" + }, + "timeout": { + "type": "integer", + "description": "Maximum duration in milliseconds that the sandbox can run before being automatically stopped.", + "minimum": 1000, + "example": 300000 + }, + "persistent": { + "type": "boolean", + "description": "Whether the sandbox persists its state across restarts via automatic snapshots." + }, + "snapshotExpiration": { + "description": "Default snapshot expiration time in milliseconds. Set to 0 to disable expiration. When set, this value is used as the default expiration for all snapshots created for this sandbox.", + "oneOf": [ + {}, + { + "type": "integer" + } + ], + "example": 604800000 + }, + "keepLastSnapshots": { + "description": "Protect the N most recent snapshots with different expiration/deletion behavior. Set to null to clear.", + "oneOf": [ + { + "type": "string" + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "count" + ], + "properties": { + "count": { + "type": "integer", + "minimum": 1, + "maximum": 10, + "description": "Number of most recent snapshots to keep." + }, + "expiration": { + "description": "Expiration time in milliseconds for kept snapshots. Falls back to snapshotExpiration.", + "oneOf": [ + {}, + { + "type": "integer" + } + ] + }, + "deleteEvicted": { + "type": "boolean", + "description": "Whether to immediately delete evicted snapshots. Defaults to true." + } + } + } + ] + }, + "networkPolicy": { + "oneOf": [ + { + "description": "Network access policy for the sandbox.\\n Controls which external hosts the sandbox can communicate with.\\n Use \\\"allow-all\\\" mode to allow all traffic, \\\"deny-all\\\" to block all traffic or \\\"custom\\\" to provide specific rules.", + "type": "object", + "additionalProperties": false, + "required": [ + "mode" + ], + "properties": { + "mode": { + "description": "The network access policy mode. Use \\\"allow-all\\\" to permit all outbound traffic. Use \\\"deny-all\\\" to block all outbound traffic. Use \\\"custom\\\" to specify explicit allow/deny rules.", + "type": "string", + "enum": [ + "allow-all", + "deny-all", + "custom", + "default-allow", + "default-deny" + ], + "example": "custom" + }, + "allowedDomains": { + "description": "List of domain names the sandbox is allowed to connect to. Only applies when mode is \\\"custom\\\". Supports wildcard patterns (e.g., \\\"*.example.com\\\" matches all subdomains).", + "type": "array", + "example": [ + "api.github.com", + "*.npmjs.org" + ], + "items": { + "type": "string", + "description": "A domain name pattern. Use \\\"*\\\" for wildcard matching of subdomains (e.g., \\\"*.example.com\\\")." + } + }, + "allowedCIDRs": { + "description": "List of IP address ranges (in CIDR notation) the sandbox is allowed to connect to. Traffic to these addresses bypasses domain-based restrictions.", + "type": "array", + "example": [ + "35.192.0.0/12", + "104.16.0.0/12" + ], + "items": { + "type": "string", + "description": "An IPv4 address range in CIDR notation (e.g., \\\"35.192.0.0/12\\\")." + } + }, + "deniedCIDRs": { + "description": "List of IP address ranges (in CIDR notation) the sandbox is blocked from connecting to. These rules take precedence over all allowed rules.", + "type": "array", + "example": [ + "35.192.0.0/12" + ], + "items": { + "type": "string", + "description": "An IP address range in CIDR notation to block." + } + }, + "injectionRules": { + "description": "HTTP header injection rules for outgoing requests matching specific domains. Traffic to matching domains will be intercepted instead of proxied through encrypted connections.", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "required": [ + "domain", + "headers" + ], + "properties": { + "domain": { + "description": "The domain (or pattern) of requests to add headers for. Supports wildcards like *.example.com.", + "type": "string" + }, + "headers": { + "description": "HTTP headers to inject into requests for this domain. Existing headers with the same name will be overridden.", + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "match": { + "description": "Optional L7 match. When provided, the injection rule only applies to requests that satisfy every specified dimension. When multiple injection rules target the same domain they are evaluated in order and the first match wins; a rule without `match` matches any request and shadows later rules for the same domain.", + "type": "object", + "additionalProperties": false, + "properties": { + "path": { + "description": "Match on the request path. Comparison is case-sensitive.", + "type": "object", + "additionalProperties": false, + "properties": { + "exact": { + "type": "string", + "description": "Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys." + }, + "startsWith": { + "type": "string", + "description": "Match values that start with the given prefix." + } + } + }, + "method": { + "type": "array", + "description": "HTTP methods to match. Any single match succeeds (OR semantics).", + "items": { + "type": "string" + } + }, + "queryString": { + "type": "array", + "description": "Query-string entry matchers. Multiple entries are ANDed. Query parameter names and values are both compared case-sensitively (RFC 3986). When a request has multiple values for the same key, any matching value satisfies the matcher.", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "key": { + "description": "Matcher for the entry key (header name or query key).", + "type": "object", + "additionalProperties": false, + "properties": { + "exact": { + "type": "string", + "description": "Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys." + }, + "startsWith": { + "type": "string", + "description": "Match values that start with the given prefix." + } + } + }, + "value": { + "description": "Matcher for the entry value.", + "type": "object", + "additionalProperties": false, + "properties": { + "exact": { + "type": "string", + "description": "Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys." + }, + "startsWith": { + "type": "string", + "description": "Match values that start with the given prefix." + } + } + } + } + } + }, + "headers": { + "type": "array", + "description": "Header matchers. Multiple entries are ANDed. Header names are compared case-insensitively (RFC 9110); header values are compared case-sensitively. When a request has multiple values for the same header, any matching value satisfies the matcher.", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "key": { + "description": "Matcher for the entry key (header name or query key).", + "type": "object", + "additionalProperties": false, + "properties": { + "exact": { + "type": "string", + "description": "Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys." + }, + "startsWith": { + "type": "string", + "description": "Match values that start with the given prefix." + } + } + }, + "value": { + "description": "Matcher for the entry value.", + "type": "object", + "additionalProperties": false, + "properties": { + "exact": { + "type": "string", + "description": "Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys." + }, + "startsWith": { + "type": "string", + "description": "Match values that start with the given prefix." + } + } + } + } + } + } + } + } + } + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "properties": { + "allow": { + "oneOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "description": "A rule applied to requests matching a domain in the network policy. Only one of `transform`, `forwardURL`, or `response` can be specified per rule.", + "type": "object", + "additionalProperties": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "match": { + "description": "Optional L7 match. When provided, the injection rule only applies to requests that satisfy every specified dimension. When multiple injection rules target the same domain they are evaluated in order and the first match wins; a rule without `match` matches any request and shadows later rules for the same domain.", + "type": "object", + "additionalProperties": false, + "properties": { + "path": { + "description": "Match on the request path. Comparison is case-sensitive.", + "type": "object", + "additionalProperties": false, + "properties": { + "exact": { + "type": "string", + "description": "Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys." + }, + "startsWith": { + "type": "string", + "description": "Match values that start with the given prefix." + } + } + }, + "method": { + "type": "array", + "description": "HTTP methods to match. Any single match succeeds (OR semantics).", + "items": { + "type": "string" + } + }, + "queryString": { + "type": "array", + "description": "Query-string entry matchers. Multiple entries are ANDed. Query parameter names and values are both compared case-sensitively (RFC 3986). When a request has multiple values for the same key, any matching value satisfies the matcher.", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "key": { + "description": "Matcher for the entry key (header name or query key).", + "type": "object", + "additionalProperties": false, + "properties": { + "exact": { + "type": "string", + "description": "Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys." + }, + "startsWith": { + "type": "string", + "description": "Match values that start with the given prefix." + } + } + }, + "value": { + "description": "Matcher for the entry value.", + "type": "object", + "additionalProperties": false, + "properties": { + "exact": { + "type": "string", + "description": "Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys." + }, + "startsWith": { + "type": "string", + "description": "Match values that start with the given prefix." + } + } + } + } + } + }, + "headers": { + "type": "array", + "description": "Header matchers. Multiple entries are ANDed. Header names are compared case-insensitively (RFC 9110); header values are compared case-sensitively. When a request has multiple values for the same header, any matching value satisfies the matcher.", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "key": { + "description": "Matcher for the entry key (header name or query key).", + "type": "object", + "additionalProperties": false, + "properties": { + "exact": { + "type": "string", + "description": "Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys." + }, + "startsWith": { + "type": "string", + "description": "Match values that start with the given prefix." + } + } + }, + "value": { + "description": "Matcher for the entry value.", + "type": "object", + "additionalProperties": false, + "properties": { + "exact": { + "type": "string", + "description": "Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys." + }, + "startsWith": { + "type": "string", + "description": "Match values that start with the given prefix." + } + } + } + } + } + } + } + }, + "transform": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "headers": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + } + } + }, + "forwardURL": { + "type": "string", + "description": "HTTP/1.1 proxy URL to forward traffic to. Must not include username, password, query string, or fragment." + }, + "response": { + "description": "Answer matching requests from the proxy with this response instead of forwarding them to the origin. Combine with a `match` on an earlier rule to allow one sub-path and reject the rest of a domain.", + "type": "object", + "additionalProperties": false, + "required": [ + "statusCode" + ], + "properties": { + "statusCode": { + "type": "integer", + "minimum": 200, + "maximum": 599, + "description": "HTTP status code returned to the sandbox." + }, + "headers": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "description": "HTTP response headers. Framing and hop-by-hop headers are managed by the proxy and cannot be set." + }, + "body": { + "type": "string", + "description": "UTF-8 response body. Requires `contentType`." + }, + "contentType": { + "type": "string", + "description": "Value of the `Content-Type` response header. Required when `body` is set." + } + } + } + } + } + } + } + ] + }, + "subnets": { + "type": "object", + "additionalProperties": false, + "properties": { + "allow": { + "type": "array", + "items": { + "type": "string" + } + }, + "deny": { + "type": "array", + "items": { + "type": "string" + } + } + } + } + } + } + ] + }, + "region": { + "type": "string", + "enum": [ + "iad1", + "sfo1", + "cle1", + "cdg1", + "fra1", + "arn1", + "sin1", + "pdx1", + "lhr1", + "icn1", + "bom1", + "cpt1", + "dub1", + "gru1", + "hkg1", + "syd1", + "yul1", + "hnd1", + "kix1" + ], + "description": "The Vercel region in which to create the sandbox.", + "example": "iad1" + }, + "failoverRegions": { + "type": "array", + "maxItems": 19, + "uniqueItems": true, + "items": { + "type": "string", + "enum": [ + "iad1", + "sfo1", + "cle1", + "cdg1", + "fra1", + "arn1", + "sin1", + "pdx1", + "lhr1", + "icn1", + "bom1", + "cpt1", + "dub1", + "gru1", + "hkg1", + "syd1", + "yul1", + "hnd1", + "kix1" + ] + }, + "description": "The regions the sandbox falls back to when it cannot be created in `region`.", + "example": [ + "sfo1", + "cle1" + ] + }, + "mounts": { + "description": "Drives to mount to the sandbox at the provided path. Replaces the current mounts; an empty object removes them all. Changes take effect when the next session starts.", + "type": "object", + "maxProperties": 4, + "additionalProperties": { + "type": "object", + "additionalProperties": false, + "required": [ + "drive" + ], + "properties": { + "drive": { + "type": "string", + "description": "Name of the drive to mount. The drive must already exist.", + "maxLength": 64, + "pattern": "^[a-zA-Z0-9_-]+$" + }, + "mode": { + "type": "string", + "description": "Mount the drive as read-write, or as a read-only snapshot. One writer is permitted at a time.", + "default": "read-write", + "enum": [ + "snapshot", + "read-write" + ] + } + } + } + }, + "networkId": { + "description": "The Connect network id for the target Secure Compute private network. Set to null to remove the sandbox from Secure Compute.", + "oneOf": [ + { + "type": "string" + }, + { + "type": "string", + "maxLength": 255 + } + ] + }, + "env": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "description": "Default environment variables for the sandbox. Set to empty object to clear.", + "example": { + "NODE_ENV": "production", + "HELLO": "world" + } + }, + "ports": { + "description": "List of ports to expose from the sandbox. Each port will be accessible via a unique URL. Maximum of 15 ports can be exposed.", + "type": "array", + "maxItems": 15, + "uniqueItems": true, + "example": [ + 3000, + 4000 + ], + "items": { + "type": "integer", + "description": "A port number to expose from the sandbox. Must be between 1024 and 65535.", + "not": { + "enum": [ + 23456 + ] + }, + "maximum": 65535, + "minimum": 1024 + } + }, + "currentSnapshotId": { + "type": "string", + "maxLength": 128, + "description": "The snapshot ID to set as the current snapshot. Must be active and belong to the same project." + }, + "tags": { + "description": "Key-value tags to associate with the sandbox. Replaces existing tags. Set to empty object to clear. Maximum 5 tags.", + "type": "object", + "maxProperties": 5, + "additionalProperties": { + "type": "string", + "maxLength": 256 + }, + "example": { + "env": "staging", + "team": "platform" + } + } + } + } + } + } + } + }, + "delete": { + "description": "Deletes a sandbox by name. If sandboxes are currently running, they will be stopped first. This operation deletes all sandbox entities with the given name and the named sandbox metadata.", + "operationId": "deleteSandbox", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Delete a sandbox", + "tags": [ + "sandboxes" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "sandbox": { + "$ref": "#/components/schemas/NamedSandbox" + } + }, + "required": [ + "sandbox" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + }, + "429": { + "description": "" + } + }, + "parameters": [ + { + "name": "name", + "description": "The sandbox name to delete.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "description": "The sandbox name to delete.", + "pattern": "^[a-zA-Z0-9_-]+$", + "maxLength": 128, + "example": "my-sandbox" + } + }, + { + "name": "projectId", + "description": "The project ID that owns the named sandbox. When provided, takes precedence over OIDC project context.", + "in": "query", + "required": false, + "schema": { + "type": "string", + "description": "The project ID that owns the named sandbox. When provided, takes precedence over OIDC project context.", + "maxLength": 128 + } + }, + { + "name": "deleteOrphanSnapshots", + "description": "When true, snapshots of the deleted sandbox that are not referenced by any other sandbox are also deleted asynchronously. Defaults to false.", + "in": "query", + "required": false, + "schema": { + "type": "boolean", + "default": false, + "description": "When true, snapshots of the deleted sandbox that are not referenced by any other sandbox are also deleted asynchronously. Defaults to false." + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + } + }, + "/v2/sandboxes/sessions/{sessionId}/cmd": { + "get": { + "description": "Retrieves a list of all commands that have been executed in a session, including their current status, exit codes, and execution times, ordered from the most recent to the oldest.", + "operationId": "listSessionCommands", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "List commands", + "tags": [ + "sandboxes" + ], + "responses": { + "200": { + "description": "The list of commands executed in the session.", + "content": { + "application/json": { + "schema": { + "properties": { + "commands": { + "items": { + "$ref": "#/components/schemas/SessionCommand" + }, + "type": "array" + } + }, + "required": [ + "commands" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + }, + "429": { + "description": "" + } + }, + "parameters": [ + { + "name": "sessionId", + "description": "The unique identifier of the session to list commands for.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "description": "The unique identifier of the session to list commands for.", + "example": "sbx_abc123" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + }, + "post": { + "description": "Executes a shell command inside a running session. The command runs asynchronously and returns immediately with a command ID that can be used to track its progress and retrieve its output. Optionally, use the `wait` parameter to stream the command status until completion.", + "operationId": "runSessionCommand", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Execute a command", + "tags": [ + "sandboxes" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "command": { + "$ref": "#/components/schemas/SessionCommand" + } + }, + "required": [ + "command" + ], + "type": "object" + } + }, + "application/x-ndjson": { + "schema": { + "oneOf": [ + { + "properties": { + "stream": { + "type": "string" + }, + "data": { + "properties": { + "code": { + "type": "string", + "enum": [ + "sandbox_stream_closed" + ] + }, + "message": { + "type": "string", + "enum": [ + "Sandbox stream was closed and is not accepting commands." + ] + } + }, + "required": [ + "code", + "message" + ], + "type": "object" + } + }, + "required": [ + "data", + "stream" + ], + "type": "object" + }, + { + "properties": { + "command": { + "$ref": "#/components/schemas/SessionCommand" + }, + "data": { + "type": "string" + }, + "stream": { + "type": "string" + } + }, + "required": [ + "command", + "data", + "stream" + ], + "type": "object" + }, + { + "oneOf": [ + { + "properties": { + "stream": { + "type": "string" + }, + "data": { + "properties": { + "code": { + "type": "string", + "enum": [ + "sandbox_stream_closed" + ] + }, + "message": { + "type": "string", + "enum": [ + "Sandbox stream was closed and is not accepting commands." + ] + } + }, + "required": [ + "code", + "message" + ], + "type": "object" + } + }, + "required": [ + "data", + "stream" + ], + "type": "object" + }, + { + "properties": { + "data": { + "type": "string" + }, + "stream": { + "type": "string" + } + }, + "required": [ + "data", + "stream" + ], + "type": "object" + } + ] + } + ] + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid.\nOne of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + }, + "422": { + "description": "" + }, + "429": { + "description": "" + }, + "500": { + "description": "" + } + }, + "parameters": [ + { + "name": "sessionId", + "description": "The unique identifier of the session in which to execute the command.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "description": "The unique identifier of the session in which to execute the command.", + "example": "sbx_abc123" + } + }, + { + "name": "cmdId", + "description": "The unique identifier of the command to stream logs for.", + "in": "query", + "required": true, + "schema": { + "type": "string", + "description": "The unique identifier of the command to stream logs for.", + "example": "cmd_abc123" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "additionalProperties": false, + "required": [ + "command" + ], + "properties": { + "command": { + "type": "string", + "description": "The executable or shell command to run. This is the program name without arguments.", + "example": "npm" + }, + "args": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Arguments to pass to the command. Each argument should be a separate array element.", + "example": [ + "install", + "--save", + "lodash" + ] + }, + "cwd": { + "type": "string", + "description": "The working directory in which to execute the command. Defaults to the sandbox home directory if not specified.", + "example": "/home/vercel-sandbox" + }, + "env": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "description": "Additional environment variables to set for this command. These are merged with the sandbox environment.", + "default": {}, + "example": { + "NODE_ENV": "production", + "DEBUG": "true" + } + }, + "sudo": { + "type": "boolean", + "description": "Execute the command with root (superuser) privileges.", + "default": false + }, + "wait": { + "type": "boolean", + "description": "If true, returns an ND-JSON stream that emits the command status when started and again when finished. Useful for synchronously waiting for command completion.", + "default": false + }, + "logs": { + "type": "boolean", + "description": "If true, stream the logs of the command execution in real-time via ND-JSON. This is only applicable if `wait` is also true.", + "default": false + }, + "timeout": { + "type": "integer", + "description": "Maximum duration in milliseconds the command may run before it is killed with SIGKILL, up to 5 hours. Enforced at exec time, independently of `wait`.", + "minimum": 100, + "maximum": 18000000, + "example": 30000 + } + } + } + } + } + } + } + }, + "/v2/sandboxes/sessions/{sessionId}/cmd/{cmdId}": { + "get": { + "description": "Retrieves the current status and details of a command executed in a session. Use the `wait` parameter to block until the command finishes execution.", + "operationId": "getSessionCommand", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Get a command", + "tags": [ + "sandboxes" + ], + "responses": { + "200": { + "description": "The command data along with the exit code if the command did finish.", + "content": { + "application/json": { + "schema": { + "properties": { + "command": { + "$ref": "#/components/schemas/SessionCommand" + } + }, + "required": [ + "command" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + }, + "422": { + "description": "" + }, + "429": { + "description": "" + }, + "500": { + "description": "" + } + }, + "parameters": [ + { + "name": "sessionId", + "description": "The unique identifier of the session containing the command.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "description": "The unique identifier of the session containing the command.", + "example": "sbx_abc123" + } + }, + { + "name": "cmdId", + "description": "The unique identifier of the command to retrieve.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "description": "The unique identifier of the command to retrieve.", + "example": "cmd_abc123" + } + }, + { + "name": "wait", + "description": "If set to \"true\", the request will block until the command finishes execution. Useful for synchronously waiting for command completion.", + "in": "query", + "required": false, + "schema": { + "type": "string", + "description": "If set to \"true\", the request will block until the command finishes execution. Useful for synchronously waiting for command completion.", + "enum": [ + "true", + "false" + ], + "default": "false" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + } + }, + "/v2/sandboxes/sessions/{sessionId}/cmd/{cmdId}/kill": { + "post": { + "description": "Sends a signal to terminate a running command in a session. The signal can be used to gracefully stop (SIGTERM) or forcefully kill (SIGKILL) the process. The command must still be running for this operation to succeed.", + "operationId": "killSessionCommand", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Kill a command", + "tags": [ + "sandboxes" + ], + "responses": { + "200": { + "description": "The command was terminated successfully.", + "content": { + "application/json": { + "schema": { + "properties": { + "command": { + "$ref": "#/components/schemas/SessionCommand" + } + }, + "required": [ + "command" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid.\nOne of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + }, + "422": { + "description": "" + }, + "429": { + "description": "" + }, + "500": { + "description": "" + } + }, + "parameters": [ + { + "name": "cmdId", + "description": "The unique identifier of the command to terminate.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "description": "The unique identifier of the command to terminate.", + "example": "cmd_abc123" + } + }, + { + "name": "sessionId", + "description": "The unique identifier of the session containing the command.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "description": "The unique identifier of the session containing the command.", + "example": "sbx_abc123" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "additionalProperties": false, + "required": [ + "signal" + ], + "properties": { + "signal": { + "type": "number", + "description": "The POSIX signal number to send to the process. Common values: 15 (SIGTERM) for graceful termination, 9 (SIGKILL) for forced termination.", + "example": 15 + } + } + } + } + } + } + } + }, + "/v2/sandboxes/sessions/{sessionId}/cmd/{cmdId}/logs": { + "get": { + "description": "Streams the output of a command in real-time using newline-delimited JSON (ND-JSON). Each entry includes the output data and stream type. Stream types include `stdout`, `stderr`, and `error` (for stream failures).", + "operationId": "getSessionCommandLogs", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Stream command logs", + "tags": [ + "sandboxes" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/x-ndjson": { + "schema": { + "oneOf": [ + { + "properties": { + "stream": { + "type": "string" + }, + "data": { + "properties": { + "code": { + "type": "string", + "enum": [ + "sandbox_stream_closed" + ] + }, + "message": { + "type": "string", + "enum": [ + "Sandbox stream was closed and is not accepting commands." + ] + } + }, + "required": [ + "code", + "message" + ], + "type": "object" + } + }, + "required": [ + "data", + "stream" + ], + "type": "object" + }, + { + "properties": { + "data": { + "type": "string" + }, + "stream": { + "type": "string" + } + }, + "required": [ + "data", + "stream" + ], + "type": "object" + } + ] + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + }, + "422": { + "description": "" + }, + "429": { + "description": "" + }, + "500": { + "description": "" + } + }, + "parameters": [ + { + "name": "sessionId", + "description": "The unique identifier of the session containing the command.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "description": "The unique identifier of the session containing the command.", + "example": "sbx_abc123" + } + }, + { + "name": "cmdId", + "description": "The unique identifier of the command to stream logs for.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "description": "The unique identifier of the command to stream logs for.", + "example": "cmd_abc123" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + } + }, + "/v2/sandboxes/sessions/{sessionId}/stop": { + "post": { + "description": "Stops a running session and releases its allocated resources. All running processes within the session will be terminated. This action cannot be undone. A stopped session cannot be restarted.", + "operationId": "stopSession", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Stop a session", + "tags": [ + "sandboxes" + ], + "responses": { + "200": { + "description": "The session was stopped successfully.", + "content": { + "application/json": { + "schema": { + "oneOf": [ + { + "properties": { + "session": { + "$ref": "#/components/schemas/Session" + } + }, + "required": [ + "session" + ], + "type": "object" + }, + { + "properties": { + "snapshot": { + "$ref": "#/components/schemas/Snapshot" + }, + "sandbox": { + "$ref": "#/components/schemas/NamedSandbox" + }, + "session": { + "$ref": "#/components/schemas/Session" + } + }, + "required": [ + "sandbox", + "session", + "snapshot" + ], + "type": "object" + } + ] + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + }, + "422": { + "description": "" + }, + "429": { + "description": "" + }, + "500": { + "description": "" + } + }, + "parameters": [ + { + "name": "sessionId", + "description": "The unique identifier of the session to stop.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "description": "The unique identifier of the session to stop.", + "example": "sbx_abc123" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + } + }, + "/v2/sandboxes/sessions/{sessionId}/extend-timeout": { + "post": { + "description": "Extends the maximum execution time of a running session. The session must be active and able to accept commands. The total timeout cannot exceed the maximum allowed limit for your account.", + "operationId": "extendSessionTimeout", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Extend session timeout", + "tags": [ + "sandboxes" + ], + "responses": { + "200": { + "description": "The session timeout was extended successfully.", + "content": { + "application/json": { + "schema": { + "properties": { + "session": { + "$ref": "#/components/schemas/Session" + } + }, + "required": [ + "session" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid.\nOne of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + }, + "422": { + "description": "" + }, + "429": { + "description": "" + }, + "500": { + "description": "" + } + }, + "parameters": [ + { + "name": "sessionId", + "description": "The unique identifier of the session to extend the timeout for.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "description": "The unique identifier of the session to extend the timeout for.", + "example": "sbx_abc123" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "additionalProperties": false, + "required": [ + "duration" + ], + "properties": { + "duration": { + "type": "number", + "description": "The amount of time in milliseconds to add to the current timeout. Must be at least 1000ms (1 second).", + "minimum": 1000, + "example": 300000 + } + } + } + } + } + } + } + }, + "/v2/sandboxes/sessions/{sessionId}/network-policy": { + "post": { + "description": "Replaces the network access policy of a running session. Use this to control which external hosts the session can communicate with. This is a full replacement. Any previously configured network rules will be overwritten.", + "operationId": "updateSessionNetworkPolicy", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Update network policy", + "tags": [ + "sandboxes" + ], + "responses": { + "200": { + "description": "The session network policy was updated successfully.", + "content": { + "application/json": { + "schema": { + "properties": { + "session": { + "$ref": "#/components/schemas/Session" + } + }, + "required": [ + "session" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid.\nOne of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + }, + "422": { + "description": "" + }, + "429": { + "description": "" + }, + "500": { + "description": "" + } + }, + "parameters": [ + { + "name": "sessionId", + "description": "The unique identifier of the session to update the network policy for.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "description": "The unique identifier of the session to update the network policy for.", + "example": "sbx_abc123" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "oneOf": [ + { + "properties": { + "mode": { + "description": "The network access policy mode. Use \\\"allow-all\\\" to permit all outbound traffic. Use \\\"deny-all\\\" to block all outbound traffic. Use \\\"custom\\\" to specify explicit allow/deny rules.", + "type": "string", + "enum": [ + "allow-all", + "deny-all", + "custom", + "default-allow", + "default-deny" + ], + "example": "custom" + }, + "allowedDomains": { + "description": "List of domain names the sandbox is allowed to connect to. Only applies when mode is \\\"custom\\\". Supports wildcard patterns (e.g., \\\"*.example.com\\\" matches all subdomains).", + "type": "array", + "example": [ + "api.github.com", + "*.npmjs.org" + ], + "items": { + "type": "string", + "description": "A domain name pattern. Use \\\"*\\\" for wildcard matching of subdomains (e.g., \\\"*.example.com\\\")." + } + }, + "allowedCIDRs": { + "description": "List of IP address ranges (in CIDR notation) the sandbox is allowed to connect to. Traffic to these addresses bypasses domain-based restrictions.", + "type": "array", + "example": [ + "35.192.0.0/12", + "104.16.0.0/12" + ], + "items": { + "type": "string", + "description": "An IPv4 address range in CIDR notation (e.g., \\\"35.192.0.0/12\\\")." + } + }, + "deniedCIDRs": { + "description": "List of IP address ranges (in CIDR notation) the sandbox is blocked from connecting to. These rules take precedence over all allowed rules.", + "type": "array", + "example": [ + "35.192.0.0/12" + ], + "items": { + "type": "string", + "description": "An IP address range in CIDR notation to block." + } + }, + "injectionRules": { + "description": "HTTP header injection rules for outgoing requests matching specific domains. Traffic to matching domains will be intercepted instead of proxied through encrypted connections.", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "required": [ + "domain", + "headers" + ], + "properties": { + "domain": { + "description": "The domain (or pattern) of requests to add headers for. Supports wildcards like *.example.com.", + "type": "string" + }, + "headers": { + "description": "HTTP headers to inject into requests for this domain. Existing headers with the same name will be overridden.", + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "match": { + "description": "Optional L7 match. When provided, the injection rule only applies to requests that satisfy every specified dimension. When multiple injection rules target the same domain they are evaluated in order and the first match wins; a rule without `match` matches any request and shadows later rules for the same domain.", + "type": "object", + "additionalProperties": false, + "properties": { + "path": { + "description": "Match on the request path. Comparison is case-sensitive.", + "type": "object", + "additionalProperties": false, + "properties": { + "exact": { + "type": "string", + "description": "Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys." + }, + "startsWith": { + "type": "string", + "description": "Match values that start with the given prefix." + } + } + }, + "method": { + "type": "array", + "description": "HTTP methods to match. Any single match succeeds (OR semantics).", + "items": { + "type": "string" + } + }, + "queryString": { + "type": "array", + "description": "Query-string entry matchers. Multiple entries are ANDed. Query parameter names and values are both compared case-sensitively (RFC 3986). When a request has multiple values for the same key, any matching value satisfies the matcher.", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "key": { + "description": "Matcher for the entry key (header name or query key).", + "type": "object", + "additionalProperties": false, + "properties": { + "exact": { + "type": "string", + "description": "Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys." + }, + "startsWith": { + "type": "string", + "description": "Match values that start with the given prefix." + } + } + }, + "value": { + "description": "Matcher for the entry value.", + "type": "object", + "additionalProperties": false, + "properties": { + "exact": { + "type": "string", + "description": "Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys." + }, + "startsWith": { + "type": "string", + "description": "Match values that start with the given prefix." + } + } + } + } + } + }, + "headers": { + "type": "array", + "description": "Header matchers. Multiple entries are ANDed. Header names are compared case-insensitively (RFC 9110); header values are compared case-sensitively. When a request has multiple values for the same header, any matching value satisfies the matcher.", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "key": { + "description": "Matcher for the entry key (header name or query key).", + "type": "object", + "additionalProperties": false, + "properties": { + "exact": { + "type": "string", + "description": "Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys." + }, + "startsWith": { + "type": "string", + "description": "Match values that start with the given prefix." + } + } + }, + "value": { + "description": "Matcher for the entry value.", + "type": "object", + "additionalProperties": false, + "properties": { + "exact": { + "type": "string", + "description": "Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys." + }, + "startsWith": { + "type": "string", + "description": "Match values that start with the given prefix." + } + } + } + } + } + } + } + } + } + } + } + }, + "description": "Network access policy for the sandbox.\\n Controls which external hosts the sandbox can communicate with.\\n Use \\\"allow-all\\\" mode to allow all traffic, \\\"deny-all\\\" to block all traffic or \\\"custom\\\" to provide specific rules.", + "type": "object", + "additionalProperties": false, + "required": [ + "mode" + ] + }, + { + "properties": { + "allow": { + "oneOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "description": "A rule applied to requests matching a domain in the network policy. Only one of `transform`, `forwardURL`, or `response` can be specified per rule.", + "type": "object", + "additionalProperties": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "match": { + "description": "Optional L7 match. When provided, the injection rule only applies to requests that satisfy every specified dimension. When multiple injection rules target the same domain they are evaluated in order and the first match wins; a rule without `match` matches any request and shadows later rules for the same domain.", + "type": "object", + "additionalProperties": false, + "properties": { + "path": { + "description": "Match on the request path. Comparison is case-sensitive.", + "type": "object", + "additionalProperties": false, + "properties": { + "exact": { + "type": "string", + "description": "Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys." + }, + "startsWith": { + "type": "string", + "description": "Match values that start with the given prefix." + } + } + }, + "method": { + "type": "array", + "description": "HTTP methods to match. Any single match succeeds (OR semantics).", + "items": { + "type": "string" + } + }, + "queryString": { + "type": "array", + "description": "Query-string entry matchers. Multiple entries are ANDed. Query parameter names and values are both compared case-sensitively (RFC 3986). When a request has multiple values for the same key, any matching value satisfies the matcher.", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "key": { + "description": "Matcher for the entry key (header name or query key).", + "type": "object", + "additionalProperties": false, + "properties": { + "exact": { + "type": "string", + "description": "Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys." + }, + "startsWith": { + "type": "string", + "description": "Match values that start with the given prefix." + } + } + }, + "value": { + "description": "Matcher for the entry value.", + "type": "object", + "additionalProperties": false, + "properties": { + "exact": { + "type": "string", + "description": "Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys." + }, + "startsWith": { + "type": "string", + "description": "Match values that start with the given prefix." + } + } + } + } + } + }, + "headers": { + "type": "array", + "description": "Header matchers. Multiple entries are ANDed. Header names are compared case-insensitively (RFC 9110); header values are compared case-sensitively. When a request has multiple values for the same header, any matching value satisfies the matcher.", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "key": { + "description": "Matcher for the entry key (header name or query key).", + "type": "object", + "additionalProperties": false, + "properties": { + "exact": { + "type": "string", + "description": "Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys." + }, + "startsWith": { + "type": "string", + "description": "Match values that start with the given prefix." + } + } + }, + "value": { + "description": "Matcher for the entry value.", + "type": "object", + "additionalProperties": false, + "properties": { + "exact": { + "type": "string", + "description": "Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys." + }, + "startsWith": { + "type": "string", + "description": "Match values that start with the given prefix." + } + } + } + } + } + } + } + }, + "transform": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "headers": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + } + } + }, + "forwardURL": { + "type": "string", + "description": "HTTP/1.1 proxy URL to forward traffic to. Must not include username, password, query string, or fragment." + }, + "response": { + "description": "Answer matching requests from the proxy with this response instead of forwarding them to the origin. Combine with a `match` on an earlier rule to allow one sub-path and reject the rest of a domain.", + "type": "object", + "additionalProperties": false, + "required": [ + "statusCode" + ], + "properties": { + "statusCode": { + "type": "integer", + "minimum": 200, + "maximum": 599, + "description": "HTTP status code returned to the sandbox." + }, + "headers": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "description": "HTTP response headers. Framing and hop-by-hop headers are managed by the proxy and cannot be set." + }, + "body": { + "type": "string", + "description": "UTF-8 response body. Requires `contentType`." + }, + "contentType": { + "type": "string", + "description": "Value of the `Content-Type` response header. Required when `body` is set." + } + } + } + } + } + } + } + ] + }, + "subnets": { + "type": "object", + "additionalProperties": false, + "properties": { + "allow": { + "type": "array", + "items": { + "type": "string" + } + }, + "deny": { + "type": "array", + "items": { + "type": "string" + } + } + } + } + }, + "type": "object", + "additionalProperties": false + } + ] + } + } + } + } + } + }, + "/v2/sandboxes/sessions/{sessionId}/fs/read": { + "post": { + "description": "Downloads the contents of a file from a session's filesystem. The file content is returned as a binary stream with appropriate Content-Disposition headers for file download.", + "operationId": "readSessionFile", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Read a file", + "tags": [ + "sandboxes" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/octet-stream": { + "schema": { + "type": "string", + "format": "binary" + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid.\nOne of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + }, + "422": { + "description": "" + }, + "429": { + "description": "" + }, + "500": { + "description": "" + } + }, + "parameters": [ + { + "name": "sessionId", + "description": "The unique identifier of the session to read the file from.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "description": "The unique identifier of the session to read the file from.", + "example": "sbx_abc123" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "additionalProperties": false, + "required": [ + "path" + ], + "properties": { + "cwd": { + "description": "The base directory for resolving relative paths. If not specified, paths are resolved from the sandbox home directory.", + "type": "string", + "example": "/home/vercel-sandbox" + }, + "path": { + "description": "The path of the file to read. Can be absolute or relative to the working directory.", + "type": "string", + "example": "dist/agent-output.md" + } + } + } + } + } + } + } + }, + "/v2/sandboxes/sessions/{sessionId}/fs/mkdir": { + "post": { + "description": "Creates a new directory in a session's filesystem. By default, parent directories are created recursively if they don't exist (similar to `mkdir -p`).", + "operationId": "createSessionDirectory", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Create a directory", + "tags": [ + "sandboxes" + ], + "responses": { + "200": { + "description": "The directory was created successfully.", + "content": { + "application/json": { + "schema": { + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid.\nOne of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + }, + "422": { + "description": "" + }, + "429": { + "description": "" + }, + "500": { + "description": "" + } + }, + "parameters": [ + { + "name": "sessionId", + "description": "The unique identifier of the session to create the directory in.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "description": "The unique identifier of the session to create the directory in.", + "example": "sbx_abc123" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "additionalProperties": false, + "required": [ + "path" + ], + "properties": { + "cwd": { + "description": "The base directory for resolving relative paths. If not specified, paths are resolved from the sandbox home directory.", + "type": "string", + "example": "/home/vercel-sandbox" + }, + "path": { + "description": "The path of the directory to create. Can be absolute or relative to the working directory.", + "type": "string", + "example": "src/components" + }, + "recursive": { + "description": "If true, creates parent directories as needed (like `mkdir -p`). If false, fails if parent directories do not exist.", + "type": "boolean", + "default": true + } + } + } + } + } + } + } + }, + "/v2/sandboxes/sessions/{sessionId}/fs/write": { + "post": { + "description": "Uploads and extracts files to a session's filesystem. Files must be uploaded as a gzipped tarball (`.tar.gz`) with the `Content-Type` header set to `application/gzip`. The tarball contents are extracted to the session's working directory, or to a custom directory specified via the `x-cwd` header.", + "operationId": "writeSessionFiles", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Write files", + "tags": [ + "sandboxes" + ], + "responses": { + "200": { + "description": "The files were successfully written to the session.", + "content": { + "application/json": { + "schema": { + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid.\nOne of the provided values in the headers is invalid" + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + }, + "422": { + "description": "" + }, + "429": { + "description": "" + }, + "500": { + "description": "" + } + }, + "parameters": [ + { + "in": "header", + "description": "The target directory where the tarball contents will be extracted. If not specified, files are extracted to the sandbox home directory.", + "schema": { + "type": "string", + "description": "The target directory where the tarball contents will be extracted. If not specified, files are extracted to the sandbox home directory.", + "example": "/home/vercel-sandbox" + }, + "name": "x-cwd" + }, + { + "name": "sessionId", + "description": "The unique identifier of the session to write files to.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "description": "The unique identifier of the session to write files to.", + "example": "sbx_abc123" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + } + }, + "/v2/sandboxes/sessions/{sessionId}/snapshot": { + "post": { + "description": "Creates a point-in-time snapshot of a running session's filesystem. Snapshots can be used to quickly restore a session to a previous state or to create new sessions with pre-configured environments. The session must be running and able to accept commands for a snapshot to be created. The session will be terminated after the snapshot is created.", + "operationId": "createSandboxesSessionsBySessionIdSnapshotV2", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Create a snapshot", + "tags": [ + "sandboxes" + ], + "responses": { + "201": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "snapshot": { + "$ref": "#/components/schemas/Snapshot" + }, + "session": { + "$ref": "#/components/schemas/Session" + } + }, + "required": [ + "session", + "snapshot" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid.\nOne of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "402": { + "description": "The account is missing a payment so payment method must be updated" + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + }, + "422": { + "description": "" + }, + "429": { + "description": "" + }, + "500": { + "description": "" + } + }, + "parameters": [ + { + "name": "sessionId", + "description": "The unique identifier of the session to snapshot.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "description": "The unique identifier of the session to snapshot.", + "example": "sbx_abc123" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "additionalProperties": false, + "properties": { + "expiration": { + "description": "The number of milliseconds after which the snapshot will expire and be deleted. Use 0 for no expiration.", + "oneOf": [ + {}, + { + "type": "integer" + } + ] + } + } + } + } + } + } + } + }, + "/v2/sandboxes/{name}/fork": { + "post": { + "description": "Forks a named sandbox, creating a new named sandbox from the source's configuration. Resources, timeout, ports, tags, network policy, mounts, Connect network, image, persistence, snapshot settings and — unlike the SDK-side fork — environment variables are copied from the source automatically (`interactive` is not). When the source has a snapshot the fork starts from it; otherwise it starts from the source's runtime/image. Any field provided in the request body overrides the value copied from the source.", + "operationId": "createSandboxesByNameForkV2", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Fork a named sandbox", + "tags": [ + "sandboxes" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "sandbox": { + "$ref": "#/components/schemas/NamedSandbox" + }, + "session": { + "$ref": "#/components/schemas/Session" + }, + "routes": { + "items": { + "$ref": "#/components/schemas/SandboxPublicRoute" + }, + "type": "array" + } + }, + "required": [ + "routes", + "sandbox", + "session" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid.\nOne of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "402": { + "description": "The account is missing a payment so payment method must be updated" + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "409": { + "description": "" + }, + "410": { + "description": "" + }, + "422": { + "description": "" + }, + "429": { + "description": "The concurrency limit has been exceeded." + }, + "500": { + "description": "" + } + }, + "parameters": [ + { + "name": "name", + "description": "Name of the source sandbox to fork.", + "in": "path", + "required": true, + "schema": { + "description": "Name of the source sandbox to fork.", + "type": "string", + "pattern": "^[a-zA-Z0-9_-]+$", + "maxLength": 128 + } + }, + { + "name": "projectId", + "description": "The ID of the project the source sandbox belongs to. Required unless authenticating with an OIDC token.", + "in": "query", + "required": false, + "schema": { + "description": "The ID of the project the source sandbox belongs to. Required unless authenticating with an OIDC token.", + "type": "string", + "maxLength": 128 + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "additionalProperties": false, + "properties": { + "networkPolicy": { + "oneOf": [ + { + "description": "Network access policy for the sandbox.\\n Controls which external hosts the sandbox can communicate with.\\n Use \\\"allow-all\\\" mode to allow all traffic, \\\"deny-all\\\" to block all traffic or \\\"custom\\\" to provide specific rules.", + "type": "object", + "additionalProperties": false, + "required": [ + "mode" + ], + "properties": { + "mode": { + "description": "The network access policy mode. Use \\\"allow-all\\\" to permit all outbound traffic. Use \\\"deny-all\\\" to block all outbound traffic. Use \\\"custom\\\" to specify explicit allow/deny rules.", + "type": "string", + "enum": [ + "allow-all", + "deny-all", + "custom", + "default-allow", + "default-deny" + ], + "example": "custom" + }, + "allowedDomains": { + "description": "List of domain names the sandbox is allowed to connect to. Only applies when mode is \\\"custom\\\". Supports wildcard patterns (e.g., \\\"*.example.com\\\" matches all subdomains).", + "type": "array", + "example": [ + "api.github.com", + "*.npmjs.org" + ], + "items": { + "type": "string", + "description": "A domain name pattern. Use \\\"*\\\" for wildcard matching of subdomains (e.g., \\\"*.example.com\\\")." + } + }, + "allowedCIDRs": { + "description": "List of IP address ranges (in CIDR notation) the sandbox is allowed to connect to. Traffic to these addresses bypasses domain-based restrictions.", + "type": "array", + "example": [ + "35.192.0.0/12", + "104.16.0.0/12" + ], + "items": { + "type": "string", + "description": "An IPv4 address range in CIDR notation (e.g., \\\"35.192.0.0/12\\\")." + } + }, + "deniedCIDRs": { + "description": "List of IP address ranges (in CIDR notation) the sandbox is blocked from connecting to. These rules take precedence over all allowed rules.", + "type": "array", + "example": [ + "35.192.0.0/12" + ], + "items": { + "type": "string", + "description": "An IP address range in CIDR notation to block." + } + }, + "injectionRules": { + "description": "HTTP header injection rules for outgoing requests matching specific domains. Traffic to matching domains will be intercepted instead of proxied through encrypted connections.", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "required": [ + "domain", + "headers" + ], + "properties": { + "domain": { + "description": "The domain (or pattern) of requests to add headers for. Supports wildcards like *.example.com.", + "type": "string" + }, + "headers": { + "description": "HTTP headers to inject into requests for this domain. Existing headers with the same name will be overridden.", + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "match": { + "description": "Optional L7 match. When provided, the injection rule only applies to requests that satisfy every specified dimension. When multiple injection rules target the same domain they are evaluated in order and the first match wins; a rule without `match` matches any request and shadows later rules for the same domain.", + "type": "object", + "additionalProperties": false, + "properties": { + "path": { + "description": "Match on the request path. Comparison is case-sensitive.", + "type": "object", + "additionalProperties": false, + "properties": { + "exact": { + "type": "string", + "description": "Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys." + }, + "startsWith": { + "type": "string", + "description": "Match values that start with the given prefix." + } + } + }, + "method": { + "type": "array", + "description": "HTTP methods to match. Any single match succeeds (OR semantics).", + "items": { + "type": "string" + } + }, + "queryString": { + "type": "array", + "description": "Query-string entry matchers. Multiple entries are ANDed. Query parameter names and values are both compared case-sensitively (RFC 3986). When a request has multiple values for the same key, any matching value satisfies the matcher.", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "key": { + "description": "Matcher for the entry key (header name or query key).", + "type": "object", + "additionalProperties": false, + "properties": { + "exact": { + "type": "string", + "description": "Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys." + }, + "startsWith": { + "type": "string", + "description": "Match values that start with the given prefix." + } + } + }, + "value": { + "description": "Matcher for the entry value.", + "type": "object", + "additionalProperties": false, + "properties": { + "exact": { + "type": "string", + "description": "Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys." + }, + "startsWith": { + "type": "string", + "description": "Match values that start with the given prefix." + } + } + } + } + } + }, + "headers": { + "type": "array", + "description": "Header matchers. Multiple entries are ANDed. Header names are compared case-insensitively (RFC 9110); header values are compared case-sensitively. When a request has multiple values for the same header, any matching value satisfies the matcher.", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "key": { + "description": "Matcher for the entry key (header name or query key).", + "type": "object", + "additionalProperties": false, + "properties": { + "exact": { + "type": "string", + "description": "Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys." + }, + "startsWith": { + "type": "string", + "description": "Match values that start with the given prefix." + } + } + }, + "value": { + "description": "Matcher for the entry value.", + "type": "object", + "additionalProperties": false, + "properties": { + "exact": { + "type": "string", + "description": "Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys." + }, + "startsWith": { + "type": "string", + "description": "Match values that start with the given prefix." + } + } + } + } + } + } + } + } + } + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "properties": { + "allow": { + "oneOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "description": "A rule applied to requests matching a domain in the network policy. Only one of `transform`, `forwardURL`, or `response` can be specified per rule.", + "type": "object", + "additionalProperties": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "match": { + "description": "Optional L7 match. When provided, the injection rule only applies to requests that satisfy every specified dimension. When multiple injection rules target the same domain they are evaluated in order and the first match wins; a rule without `match` matches any request and shadows later rules for the same domain.", + "type": "object", + "additionalProperties": false, + "properties": { + "path": { + "description": "Match on the request path. Comparison is case-sensitive.", + "type": "object", + "additionalProperties": false, + "properties": { + "exact": { + "type": "string", + "description": "Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys." + }, + "startsWith": { + "type": "string", + "description": "Match values that start with the given prefix." + } + } + }, + "method": { + "type": "array", + "description": "HTTP methods to match. Any single match succeeds (OR semantics).", + "items": { + "type": "string" + } + }, + "queryString": { + "type": "array", + "description": "Query-string entry matchers. Multiple entries are ANDed. Query parameter names and values are both compared case-sensitively (RFC 3986). When a request has multiple values for the same key, any matching value satisfies the matcher.", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "key": { + "description": "Matcher for the entry key (header name or query key).", + "type": "object", + "additionalProperties": false, + "properties": { + "exact": { + "type": "string", + "description": "Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys." + }, + "startsWith": { + "type": "string", + "description": "Match values that start with the given prefix." + } + } + }, + "value": { + "description": "Matcher for the entry value.", + "type": "object", + "additionalProperties": false, + "properties": { + "exact": { + "type": "string", + "description": "Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys." + }, + "startsWith": { + "type": "string", + "description": "Match values that start with the given prefix." + } + } + } + } + } + }, + "headers": { + "type": "array", + "description": "Header matchers. Multiple entries are ANDed. Header names are compared case-insensitively (RFC 9110); header values are compared case-sensitively. When a request has multiple values for the same header, any matching value satisfies the matcher.", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "key": { + "description": "Matcher for the entry key (header name or query key).", + "type": "object", + "additionalProperties": false, + "properties": { + "exact": { + "type": "string", + "description": "Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys." + }, + "startsWith": { + "type": "string", + "description": "Match values that start with the given prefix." + } + } + }, + "value": { + "description": "Matcher for the entry value.", + "type": "object", + "additionalProperties": false, + "properties": { + "exact": { + "type": "string", + "description": "Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys." + }, + "startsWith": { + "type": "string", + "description": "Match values that start with the given prefix." + } + } + } + } + } + } + } + }, + "transform": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "headers": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + } + } + }, + "forwardURL": { + "type": "string", + "description": "HTTP/1.1 proxy URL to forward traffic to. Must not include username, password, query string, or fragment." + }, + "response": { + "description": "Answer matching requests from the proxy with this response instead of forwarding them to the origin. Combine with a `match` on an earlier rule to allow one sub-path and reject the rest of a domain.", + "type": "object", + "additionalProperties": false, + "required": [ + "statusCode" + ], + "properties": { + "statusCode": { + "type": "integer", + "minimum": 200, + "maximum": 599, + "description": "HTTP status code returned to the sandbox." + }, + "headers": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "description": "HTTP response headers. Framing and hop-by-hop headers are managed by the proxy and cannot be set." + }, + "body": { + "type": "string", + "description": "UTF-8 response body. Requires `contentType`." + }, + "contentType": { + "type": "string", + "description": "Value of the `Content-Type` response header. Required when `body` is set." + } + } + } + } + } + } + } + ] + }, + "subnets": { + "type": "object", + "additionalProperties": false, + "properties": { + "allow": { + "type": "array", + "items": { + "type": "string" + } + }, + "deny": { + "type": "array", + "items": { + "type": "string" + } + } + } + } + } + } + ] + }, + "resources": { + "description": "Resources to define the VM", + "additionalProperties": false, + "type": "object", + "properties": { + "vcpus": { + "description": "The number of virtual CPUs to allocate to the sandbox. Must be 1, or an even number.", + "type": "integer", + "minimum": 1, + "default": 2, + "example": 2 + }, + "memory": { + "description": "The amount of memory in megabytes to allocate to the sandbox. Must equal vcpus * 2048.", + "type": "integer", + "minimum": 2048, + "example": 4096 + } + } + }, + "ports": { + "description": "List of ports to expose from the sandbox. Each port will be accessible via a unique URL. Maximum of 15 ports can be exposed.", + "type": "array", + "maxItems": 15, + "uniqueItems": true, + "example": [ + 3000, + 4000 + ], + "items": { + "type": "integer", + "description": "A port number to expose from the sandbox. Must be between 1024 and 65535.", + "not": { + "enum": [ + 23456 + ] + }, + "maximum": 65535, + "minimum": 1024 + } + }, + "image": { + "type": "string", + "maxLength": 255, + "description": "Image to use for the sandbox." + }, + "timeout": { + "type": "integer", + "description": "Maximum duration in milliseconds that the sandbox can run before being automatically stopped.", + "minimum": 1000, + "example": 300000 + }, + "env": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "description": "Default environment variables for the sandbox. These are inherited by all commands unless overridden.", + "default": {}, + "example": { + "NODE_ENV": "production", + "HELLO": "world" + } + }, + "mounts": { + "type": "object", + "description": "List of drives to mount to the sandbox at the provided path.", + "maxProperties": 4, + "additionalProperties": { + "type": "object", + "additionalProperties": false, + "required": [ + "drive" + ], + "properties": { + "drive": { + "type": "string", + "description": "Name of the drive to mount. The drive must already exist.", + "maxLength": 64, + "pattern": "^[a-zA-Z0-9_-]+$" + }, + "mode": { + "type": "string", + "description": "Mount the drive as read-write, or as a read-only snapshot. One writer is permitted at a time.", + "default": "read-write", + "enum": [ + "snapshot", + "read-write" + ] + } + } + } + }, + "region": { + "type": "string", + "enum": [ + "iad1", + "sfo1", + "cle1", + "cdg1", + "fra1", + "arn1", + "sin1", + "pdx1", + "lhr1", + "icn1", + "bom1", + "cpt1", + "dub1", + "gru1", + "hkg1", + "syd1", + "yul1", + "hnd1", + "kix1" + ], + "default": [ + "iad1", + "sfo1", + "cle1", + "cdg1", + "fra1", + "arn1", + "sin1", + "pdx1", + "lhr1", + "icn1", + "bom1", + "cpt1", + "dub1", + "gru1", + "hkg1", + "syd1", + "yul1", + "hnd1", + "kix1" + ], + "description": "The Vercel region in which to create the sandbox.", + "example": "iad1" + }, + "failoverRegions": { + "type": "array", + "maxItems": 19, + "uniqueItems": true, + "items": { + "type": "string", + "enum": [ + "iad1", + "sfo1", + "cle1", + "cdg1", + "fra1", + "arn1", + "sin1", + "pdx1", + "lhr1", + "icn1", + "bom1", + "cpt1", + "dub1", + "gru1", + "hkg1", + "syd1", + "yul1", + "hnd1", + "kix1" + ] + }, + "description": "The regions the sandbox falls back to when it cannot be created in `region`.", + "example": [ + "sfo1", + "cle1" + ] + }, + "networkId": { + "type": "string", + "maxLength": 255, + "description": "The Connect network id for the target Secure Compute private network." + }, + "name": { + "example": "my-sandbox-fork", + "type": "string", + "pattern": "^[a-zA-Z0-9_-]+$", + "maxLength": 128, + "description": "Name for the forked sandbox. Must be unique per project and URL-safe (alphanumeric, hyphens, underscores). A random name is generated when omitted." + }, + "persistent": { + "description": "Whether the sandbox persists its state across restarts via automatic snapshots. Defaults to the source sandbox setting.", + "type": "boolean" + }, + "snapshotExpiration": { + "description": "Default snapshot expiration time in milliseconds. Set to 0 to disable expiration. When set, this value is used as the default expiration for all snapshots created for this sandbox.", + "oneOf": [ + {}, + { + "type": "integer" + } + ], + "example": 604800000 + }, + "keepLastSnapshots": { + "description": "Protect the N most recent snapshots with different expiration/deletion behavior.", + "type": "object", + "additionalProperties": false, + "required": [ + "count" + ], + "properties": { + "count": { + "type": "integer", + "minimum": 1, + "maximum": 10, + "description": "Number of most recent snapshots to keep." + }, + "expiration": { + "description": "Expiration time in milliseconds for kept snapshots. Falls back to snapshotExpiration.", + "oneOf": [ + {}, + { + "type": "integer" + } + ] + }, + "deleteEvicted": { + "type": "boolean", + "description": "Whether to immediately delete evicted snapshots. Defaults to true." + } + } + }, + "tags": { + "description": "Key-value tags to associate with the sandbox. Maximum 5 tags.", + "type": "object", + "maxProperties": 5, + "additionalProperties": { + "type": "string", + "maxLength": 256 + }, + "example": { + "env": "staging", + "team": "platform" + } + } + } + } + } + } + } + } + }, + "/v3/sandboxes": { + "post": { + "description": "Creates a named sandbox environment. Named sandboxes have a unique name within a project and support automatic snapshotting on shutdown. Unlike v2, this version has no `runtime` parameter: when no `image` is provided (and the sandbox is not restored from a snapshot), the sandbox is created from the default universal image.", + "operationId": "createSandboxesV3", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Create a named sandbox", + "tags": [ + "sandboxes" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "sandbox": { + "$ref": "#/components/schemas/NamedSandbox" + }, + "session": { + "$ref": "#/components/schemas/Session" + }, + "routes": { + "items": { + "$ref": "#/components/schemas/SandboxPublicRoute" + }, + "type": "array" + } + }, + "required": [ + "routes", + "sandbox", + "session" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "402": { + "description": "The account is missing a payment so payment method must be updated" + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "409": { + "description": "" + }, + "410": { + "description": "" + }, + "422": { + "description": "" + }, + "429": { + "description": "The concurrency limit has been exceeded." + }, + "500": { + "description": "" + } + }, + "parameters": [ + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "additionalProperties": false, + "properties": { + "networkPolicy": { + "oneOf": [ + { + "description": "Network access policy for the sandbox.\\n Controls which external hosts the sandbox can communicate with.\\n Use \\\"allow-all\\\" mode to allow all traffic, \\\"deny-all\\\" to block all traffic or \\\"custom\\\" to provide specific rules.", + "type": "object", + "additionalProperties": false, + "required": [ + "mode" + ], + "properties": { + "mode": { + "description": "The network access policy mode. Use \\\"allow-all\\\" to permit all outbound traffic. Use \\\"deny-all\\\" to block all outbound traffic. Use \\\"custom\\\" to specify explicit allow/deny rules.", + "type": "string", + "enum": [ + "allow-all", + "deny-all", + "custom", + "default-allow", + "default-deny" + ], + "example": "custom" + }, + "allowedDomains": { + "description": "List of domain names the sandbox is allowed to connect to. Only applies when mode is \\\"custom\\\". Supports wildcard patterns (e.g., \\\"*.example.com\\\" matches all subdomains).", + "type": "array", + "example": [ + "api.github.com", + "*.npmjs.org" + ], + "items": { + "type": "string", + "description": "A domain name pattern. Use \\\"*\\\" for wildcard matching of subdomains (e.g., \\\"*.example.com\\\")." + } + }, + "allowedCIDRs": { + "description": "List of IP address ranges (in CIDR notation) the sandbox is allowed to connect to. Traffic to these addresses bypasses domain-based restrictions.", + "type": "array", + "example": [ + "35.192.0.0/12", + "104.16.0.0/12" + ], + "items": { + "type": "string", + "description": "An IPv4 address range in CIDR notation (e.g., \\\"35.192.0.0/12\\\")." + } + }, + "deniedCIDRs": { + "description": "List of IP address ranges (in CIDR notation) the sandbox is blocked from connecting to. These rules take precedence over all allowed rules.", + "type": "array", + "example": [ + "35.192.0.0/12" + ], + "items": { + "type": "string", + "description": "An IP address range in CIDR notation to block." + } + }, + "injectionRules": { + "description": "HTTP header injection rules for outgoing requests matching specific domains. Traffic to matching domains will be intercepted instead of proxied through encrypted connections.", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "required": [ + "domain", + "headers" + ], + "properties": { + "domain": { + "description": "The domain (or pattern) of requests to add headers for. Supports wildcards like *.example.com.", + "type": "string" + }, + "headers": { + "description": "HTTP headers to inject into requests for this domain. Existing headers with the same name will be overridden.", + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "match": { + "description": "Optional L7 match. When provided, the injection rule only applies to requests that satisfy every specified dimension. When multiple injection rules target the same domain they are evaluated in order and the first match wins; a rule without `match` matches any request and shadows later rules for the same domain.", + "type": "object", + "additionalProperties": false, + "properties": { + "path": { + "description": "Match on the request path. Comparison is case-sensitive.", + "type": "object", + "additionalProperties": false, + "properties": { + "exact": { + "type": "string", + "description": "Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys." + }, + "startsWith": { + "type": "string", + "description": "Match values that start with the given prefix." + } + } + }, + "method": { + "type": "array", + "description": "HTTP methods to match. Any single match succeeds (OR semantics).", + "items": { + "type": "string" + } + }, + "queryString": { + "type": "array", + "description": "Query-string entry matchers. Multiple entries are ANDed. Query parameter names and values are both compared case-sensitively (RFC 3986). When a request has multiple values for the same key, any matching value satisfies the matcher.", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "key": { + "description": "Matcher for the entry key (header name or query key).", + "type": "object", + "additionalProperties": false, + "properties": { + "exact": { + "type": "string", + "description": "Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys." + }, + "startsWith": { + "type": "string", + "description": "Match values that start with the given prefix." + } + } + }, + "value": { + "description": "Matcher for the entry value.", + "type": "object", + "additionalProperties": false, + "properties": { + "exact": { + "type": "string", + "description": "Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys." + }, + "startsWith": { + "type": "string", + "description": "Match values that start with the given prefix." + } + } + } + } + } + }, + "headers": { + "type": "array", + "description": "Header matchers. Multiple entries are ANDed. Header names are compared case-insensitively (RFC 9110); header values are compared case-sensitively. When a request has multiple values for the same header, any matching value satisfies the matcher.", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "key": { + "description": "Matcher for the entry key (header name or query key).", + "type": "object", + "additionalProperties": false, + "properties": { + "exact": { + "type": "string", + "description": "Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys." + }, + "startsWith": { + "type": "string", + "description": "Match values that start with the given prefix." + } + } + }, + "value": { + "description": "Matcher for the entry value.", + "type": "object", + "additionalProperties": false, + "properties": { + "exact": { + "type": "string", + "description": "Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys." + }, + "startsWith": { + "type": "string", + "description": "Match values that start with the given prefix." + } + } + } + } + } + } + } + } + } + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "properties": { + "allow": { + "oneOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "description": "A rule applied to requests matching a domain in the network policy. Only one of `transform`, `forwardURL`, or `response` can be specified per rule.", + "type": "object", + "additionalProperties": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "match": { + "description": "Optional L7 match. When provided, the injection rule only applies to requests that satisfy every specified dimension. When multiple injection rules target the same domain they are evaluated in order and the first match wins; a rule without `match` matches any request and shadows later rules for the same domain.", + "type": "object", + "additionalProperties": false, + "properties": { + "path": { + "description": "Match on the request path. Comparison is case-sensitive.", + "type": "object", + "additionalProperties": false, + "properties": { + "exact": { + "type": "string", + "description": "Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys." + }, + "startsWith": { + "type": "string", + "description": "Match values that start with the given prefix." + } + } + }, + "method": { + "type": "array", + "description": "HTTP methods to match. Any single match succeeds (OR semantics).", + "items": { + "type": "string" + } + }, + "queryString": { + "type": "array", + "description": "Query-string entry matchers. Multiple entries are ANDed. Query parameter names and values are both compared case-sensitively (RFC 3986). When a request has multiple values for the same key, any matching value satisfies the matcher.", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "key": { + "description": "Matcher for the entry key (header name or query key).", + "type": "object", + "additionalProperties": false, + "properties": { + "exact": { + "type": "string", + "description": "Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys." + }, + "startsWith": { + "type": "string", + "description": "Match values that start with the given prefix." + } + } + }, + "value": { + "description": "Matcher for the entry value.", + "type": "object", + "additionalProperties": false, + "properties": { + "exact": { + "type": "string", + "description": "Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys." + }, + "startsWith": { + "type": "string", + "description": "Match values that start with the given prefix." + } + } + } + } + } + }, + "headers": { + "type": "array", + "description": "Header matchers. Multiple entries are ANDed. Header names are compared case-insensitively (RFC 9110); header values are compared case-sensitively. When a request has multiple values for the same header, any matching value satisfies the matcher.", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "key": { + "description": "Matcher for the entry key (header name or query key).", + "type": "object", + "additionalProperties": false, + "properties": { + "exact": { + "type": "string", + "description": "Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys." + }, + "startsWith": { + "type": "string", + "description": "Match values that start with the given prefix." + } + } + }, + "value": { + "description": "Matcher for the entry value.", + "type": "object", + "additionalProperties": false, + "properties": { + "exact": { + "type": "string", + "description": "Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys." + }, + "startsWith": { + "type": "string", + "description": "Match values that start with the given prefix." + } + } + } + } + } + } + } + }, + "transform": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "headers": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + } + } + }, + "forwardURL": { + "type": "string", + "description": "HTTP/1.1 proxy URL to forward traffic to. Must not include username, password, query string, or fragment." + }, + "response": { + "description": "Answer matching requests from the proxy with this response instead of forwarding them to the origin. Combine with a `match` on an earlier rule to allow one sub-path and reject the rest of a domain.", + "type": "object", + "additionalProperties": false, + "required": [ + "statusCode" + ], + "properties": { + "statusCode": { + "type": "integer", + "minimum": 200, + "maximum": 599, + "description": "HTTP status code returned to the sandbox." + }, + "headers": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "description": "HTTP response headers. Framing and hop-by-hop headers are managed by the proxy and cannot be set." + }, + "body": { + "type": "string", + "description": "UTF-8 response body. Requires `contentType`." + }, + "contentType": { + "type": "string", + "description": "Value of the `Content-Type` response header. Required when `body` is set." + } + } + } + } + } + } + } + ] + }, + "subnets": { + "type": "object", + "additionalProperties": false, + "properties": { + "allow": { + "type": "array", + "items": { + "type": "string" + } + }, + "deny": { + "type": "array", + "items": { + "type": "string" + } + } + } + } + } + } + ] + }, + "resources": { + "description": "Resources to define the VM", + "additionalProperties": false, + "type": "object", + "properties": { + "vcpus": { + "description": "The number of virtual CPUs to allocate to the sandbox. Must be 1, or an even number.", + "type": "integer", + "minimum": 1, + "default": 2, + "example": 2 + }, + "memory": { + "description": "The amount of memory in megabytes to allocate to the sandbox. Must equal vcpus * 2048.", + "type": "integer", + "minimum": 2048, + "example": 4096 + } + } + }, + "source": { + "description": "The source from which to initialize the sandbox filesystem. Can be a Git repository, a tarball URL, or an existing snapshot.", + "oneOf": [ + { + "type": "object", + "description": "Clone a Git repository into the sandbox.", + "properties": { + "type": { + "description": "Indicates the source is a Git repository." + }, + "url": { + "type": "string", + "format": "uri", + "description": "The URL of the Git repository to clone.", + "example": "https://github.com/vercel/next.js.git" + }, + "username": { + "type": "string", + "description": "Username for Git authentication. Required together with password for private repositories." + }, + "password": { + "type": "string", + "description": "Password or personal access token for Git authentication. Required together with username for private repositories." + }, + "depth": { + "type": "integer", + "minimum": 1, + "description": "Create a shallow clone with history truncated to the specified number of commits. Useful for faster cloning of large repositories.", + "example": 1 + }, + "revision": { + "type": "string", + "description": "The specific commit SHA, branch name, or tag to checkout after cloning.", + "example": "main" + } + }, + "required": [ + "type", + "url" + ], + "additionalProperties": false + }, + { + "type": "object", + "description": "Download and extract a gzipped tarball into the sandbox.", + "properties": { + "type": { + "description": "Indicates the source is a tarball." + }, + "url": { + "type": "string", + "format": "uri", + "description": "URL of a gzipped tarball (.tar.gz) to download and extract.", + "example": "https://example.com/project.tar.gz" + } + }, + "required": [ + "type", + "url" + ], + "additionalProperties": false + }, + { + "type": "object", + "description": "Restore the sandbox filesystem from an existing snapshot.", + "properties": { + "type": { + "description": "Indicates the source is a snapshot." + }, + "snapshotId": { + "type": "string", + "description": "The unique identifier of the snapshot to restore.", + "example": "snap_abc123" + } + }, + "required": [ + "type", + "snapshotId" + ], + "additionalProperties": false + } + ] + }, + "projectId": { + "description": "The target project slug or ID in which the sandbox will be assigned to.", + "example": "prj_abc123", + "type": "string" + }, + "ports": { + "description": "List of ports to expose from the sandbox. Each port will be accessible via a unique URL. Maximum of 15 ports can be exposed.", + "type": "array", + "maxItems": 15, + "uniqueItems": true, + "example": [ + 3000, + 4000 + ], + "items": { + "type": "integer", + "description": "A port number to expose from the sandbox. Must be between 1024 and 65535.", + "not": { + "enum": [ + 23456 + ] + }, + "maximum": 65535, + "minimum": 1024 + } + }, + "image": { + "type": "string", + "maxLength": 255, + "description": "Image to use for the sandbox." + }, + "timeout": { + "type": "integer", + "description": "Maximum duration in milliseconds that the sandbox can run before being automatically stopped.", + "minimum": 1000, + "example": 300000 + }, + "env": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "description": "Default environment variables for the sandbox. These are inherited by all commands unless overridden.", + "default": {}, + "example": { + "NODE_ENV": "production", + "HELLO": "world" + } + }, + "mounts": { + "type": "object", + "description": "List of drives to mount to the sandbox at the provided path.", + "maxProperties": 4, + "additionalProperties": { + "type": "object", + "additionalProperties": false, + "required": [ + "drive" + ], + "properties": { + "drive": { + "type": "string", + "description": "Name of the drive to mount. The drive must already exist.", + "maxLength": 64, + "pattern": "^[a-zA-Z0-9_-]+$" + }, + "mode": { + "type": "string", + "description": "Mount the drive as read-write, or as a read-only snapshot. One writer is permitted at a time.", + "default": "read-write", + "enum": [ + "snapshot", + "read-write" + ] + } + } + } + }, + "region": { + "type": "string", + "enum": [ + "iad1", + "sfo1", + "cle1", + "cdg1", + "fra1", + "arn1", + "sin1", + "pdx1", + "lhr1", + "icn1", + "bom1", + "cpt1", + "dub1", + "gru1", + "hkg1", + "syd1", + "yul1", + "hnd1", + "kix1" + ], + "default": [ + "iad1", + "sfo1", + "cle1", + "cdg1", + "fra1", + "arn1", + "sin1", + "pdx1", + "lhr1", + "icn1", + "bom1", + "cpt1", + "dub1", + "gru1", + "hkg1", + "syd1", + "yul1", + "hnd1", + "kix1" + ], + "description": "The Vercel region in which to create the sandbox.", + "example": "iad1" + }, + "failoverRegions": { + "type": "array", + "maxItems": 19, + "uniqueItems": true, + "items": { + "type": "string", + "enum": [ + "iad1", + "sfo1", + "cle1", + "cdg1", + "fra1", + "arn1", + "sin1", + "pdx1", + "lhr1", + "icn1", + "bom1", + "cpt1", + "dub1", + "gru1", + "hkg1", + "syd1", + "yul1", + "hnd1", + "kix1" + ] + }, + "description": "The regions the sandbox falls back to when it cannot be created in `region`.", + "example": [ + "sfo1", + "cle1" + ] + }, + "networkId": { + "type": "string", + "maxLength": 255, + "description": "The Connect network id for the target Secure Compute private network." + }, + "name": { + "example": "my-sandbox", + "type": "string", + "pattern": "^[a-zA-Z0-9_-]+$", + "maxLength": 128, + "description": "Name for the sandbox. Must be unique per project and URL-safe (alphanumeric, hyphens, underscores)." + }, + "persistent": { + "description": "Whether the sandbox persists its state across restarts via automatic snapshots. Defaults to true.", + "type": "boolean", + "default": true + }, + "snapshotExpiration": { + "description": "Default snapshot expiration time in milliseconds. Set to 0 to disable expiration. When set, this value is used as the default expiration for all snapshots created for this sandbox.", + "oneOf": [ + {}, + { + "type": "integer" + } + ], + "example": 604800000 + }, + "keepLastSnapshots": { + "description": "Protect the N most recent snapshots with different expiration/deletion behavior.", + "type": "object", + "additionalProperties": false, + "required": [ + "count" + ], + "properties": { + "count": { + "type": "integer", + "minimum": 1, + "maximum": 10, + "description": "Number of most recent snapshots to keep." + }, + "expiration": { + "description": "Expiration time in milliseconds for kept snapshots. Falls back to snapshotExpiration.", + "oneOf": [ + {}, + { + "type": "integer" + } + ] + }, + "deleteEvicted": { + "type": "boolean", + "description": "Whether to immediately delete evicted snapshots. Defaults to true." + } + } + }, + "tags": { + "description": "Key-value tags to associate with the sandbox. Maximum 5 tags.", + "type": "object", + "maxProperties": 5, + "additionalProperties": { + "type": "string", + "maxLength": 256 + }, + "example": { + "env": "staging", + "team": "platform" + } + } + } + } + } + } + } + } + }, + "/v3/sandboxes/sessions/{sessionId}/snapshot": { + "post": { + "description": "Creates a point-in-time snapshot of a running session's filesystem. Snapshots can be used to quickly restore a session to a previous state or to create new sessions with pre-configured environments. The session must be running and able to accept commands for a snapshot to be created. The session will be terminated after the snapshot is created. Unlike v2, snapshots expire after 7 days when neither the request nor the sandbox configuration specifies an expiration.", + "operationId": "createSandboxesSessionsBySessionIdSnapshotV3", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Create a snapshot", + "tags": [ + "sandboxes" + ], + "responses": { + "201": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "snapshot": { + "$ref": "#/components/schemas/Snapshot" + }, + "session": { + "$ref": "#/components/schemas/Session" + } + }, + "required": [ + "session", + "snapshot" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid.\nOne of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "402": { + "description": "The account is missing a payment so payment method must be updated" + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + }, + "422": { + "description": "" + }, + "429": { + "description": "" + }, + "500": { + "description": "" + } + }, + "parameters": [ + { + "name": "sessionId", + "description": "The unique identifier of the session to snapshot.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "description": "The unique identifier of the session to snapshot.", + "example": "sbx_abc123" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "additionalProperties": false, + "properties": { + "expiration": { + "description": "The number of milliseconds after which the snapshot will expire and be deleted. Defaults to 7 days when neither this field nor the sandbox configuration specifies an expiration. Use 0 for no expiration.", + "oneOf": [ + {}, + { + "type": "integer" + } + ] + } + } + } + } + } + } + } + }, + "/v3/sandboxes/{name}/fork": { + "post": { + "description": "Forks a named sandbox, creating a new named sandbox from the source's configuration. Resources, timeout, ports, tags, network policy, mounts, Connect network, image, persistence, snapshot settings and — unlike the SDK-side fork — environment variables are copied from the source automatically (`interactive` is not). When the source has a snapshot the fork starts from it; otherwise it starts from the source's runtime/image. Any field provided in the request body overrides the value copied from the source. Unlike v2, when neither the body nor the source provides a value, snapshots expire after 7 days by default and persistent sandboxes keep only their most recent snapshot (`keepLastSnapshots: null` disables the limit).", + "operationId": "createSandboxesByNameForkV3", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Fork a named sandbox", + "tags": [ + "sandboxes" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "sandbox": { + "$ref": "#/components/schemas/NamedSandbox" + }, + "session": { + "$ref": "#/components/schemas/Session" + }, + "routes": { + "items": { + "$ref": "#/components/schemas/SandboxPublicRoute" + }, + "type": "array" + } + }, + "required": [ + "routes", + "sandbox", + "session" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid.\nOne of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "402": { + "description": "The account is missing a payment so payment method must be updated" + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "409": { + "description": "" + }, + "410": { + "description": "" + }, + "422": { + "description": "" + }, + "429": { + "description": "The concurrency limit has been exceeded." + }, + "500": { + "description": "" + } + }, + "parameters": [ + { + "name": "name", + "description": "Name of the source sandbox to fork.", + "in": "path", + "required": true, + "schema": { + "description": "Name of the source sandbox to fork.", + "type": "string", + "pattern": "^[a-zA-Z0-9_-]+$", + "maxLength": 128 + } + }, + { + "name": "projectId", + "description": "The ID of the project the source sandbox belongs to. Required unless authenticating with an OIDC token.", + "in": "query", + "required": false, + "schema": { + "description": "The ID of the project the source sandbox belongs to. Required unless authenticating with an OIDC token.", + "type": "string", + "maxLength": 128 + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "additionalProperties": false, + "properties": { + "networkPolicy": { + "oneOf": [ + { + "description": "Network access policy for the sandbox.\\n Controls which external hosts the sandbox can communicate with.\\n Use \\\"allow-all\\\" mode to allow all traffic, \\\"deny-all\\\" to block all traffic or \\\"custom\\\" to provide specific rules.", + "type": "object", + "additionalProperties": false, + "required": [ + "mode" + ], + "properties": { + "mode": { + "description": "The network access policy mode. Use \\\"allow-all\\\" to permit all outbound traffic. Use \\\"deny-all\\\" to block all outbound traffic. Use \\\"custom\\\" to specify explicit allow/deny rules.", + "type": "string", + "enum": [ + "allow-all", + "deny-all", + "custom", + "default-allow", + "default-deny" + ], + "example": "custom" + }, + "allowedDomains": { + "description": "List of domain names the sandbox is allowed to connect to. Only applies when mode is \\\"custom\\\". Supports wildcard patterns (e.g., \\\"*.example.com\\\" matches all subdomains).", + "type": "array", + "example": [ + "api.github.com", + "*.npmjs.org" + ], + "items": { + "type": "string", + "description": "A domain name pattern. Use \\\"*\\\" for wildcard matching of subdomains (e.g., \\\"*.example.com\\\")." + } + }, + "allowedCIDRs": { + "description": "List of IP address ranges (in CIDR notation) the sandbox is allowed to connect to. Traffic to these addresses bypasses domain-based restrictions.", + "type": "array", + "example": [ + "35.192.0.0/12", + "104.16.0.0/12" + ], + "items": { + "type": "string", + "description": "An IPv4 address range in CIDR notation (e.g., \\\"35.192.0.0/12\\\")." + } + }, + "deniedCIDRs": { + "description": "List of IP address ranges (in CIDR notation) the sandbox is blocked from connecting to. These rules take precedence over all allowed rules.", + "type": "array", + "example": [ + "35.192.0.0/12" + ], + "items": { + "type": "string", + "description": "An IP address range in CIDR notation to block." + } + }, + "injectionRules": { + "description": "HTTP header injection rules for outgoing requests matching specific domains. Traffic to matching domains will be intercepted instead of proxied through encrypted connections.", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "required": [ + "domain", + "headers" + ], + "properties": { + "domain": { + "description": "The domain (or pattern) of requests to add headers for. Supports wildcards like *.example.com.", + "type": "string" + }, + "headers": { + "description": "HTTP headers to inject into requests for this domain. Existing headers with the same name will be overridden.", + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "match": { + "description": "Optional L7 match. When provided, the injection rule only applies to requests that satisfy every specified dimension. When multiple injection rules target the same domain they are evaluated in order and the first match wins; a rule without `match` matches any request and shadows later rules for the same domain.", + "type": "object", + "additionalProperties": false, + "properties": { + "path": { + "description": "Match on the request path. Comparison is case-sensitive.", + "type": "object", + "additionalProperties": false, + "properties": { + "exact": { + "type": "string", + "description": "Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys." + }, + "startsWith": { + "type": "string", + "description": "Match values that start with the given prefix." + } + } + }, + "method": { + "type": "array", + "description": "HTTP methods to match. Any single match succeeds (OR semantics).", + "items": { + "type": "string" + } + }, + "queryString": { + "type": "array", + "description": "Query-string entry matchers. Multiple entries are ANDed. Query parameter names and values are both compared case-sensitively (RFC 3986). When a request has multiple values for the same key, any matching value satisfies the matcher.", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "key": { + "description": "Matcher for the entry key (header name or query key).", + "type": "object", + "additionalProperties": false, + "properties": { + "exact": { + "type": "string", + "description": "Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys." + }, + "startsWith": { + "type": "string", + "description": "Match values that start with the given prefix." + } + } + }, + "value": { + "description": "Matcher for the entry value.", + "type": "object", + "additionalProperties": false, + "properties": { + "exact": { + "type": "string", + "description": "Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys." + }, + "startsWith": { + "type": "string", + "description": "Match values that start with the given prefix." + } + } + } + } + } + }, + "headers": { + "type": "array", + "description": "Header matchers. Multiple entries are ANDed. Header names are compared case-insensitively (RFC 9110); header values are compared case-sensitively. When a request has multiple values for the same header, any matching value satisfies the matcher.", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "key": { + "description": "Matcher for the entry key (header name or query key).", + "type": "object", + "additionalProperties": false, + "properties": { + "exact": { + "type": "string", + "description": "Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys." + }, + "startsWith": { + "type": "string", + "description": "Match values that start with the given prefix." + } + } + }, + "value": { + "description": "Matcher for the entry value.", + "type": "object", + "additionalProperties": false, + "properties": { + "exact": { + "type": "string", + "description": "Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys." + }, + "startsWith": { + "type": "string", + "description": "Match values that start with the given prefix." + } + } + } + } + } + } + } + } + } + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "properties": { + "allow": { + "oneOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "description": "A rule applied to requests matching a domain in the network policy. Only one of `transform`, `forwardURL`, or `response` can be specified per rule.", + "type": "object", + "additionalProperties": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "match": { + "description": "Optional L7 match. When provided, the injection rule only applies to requests that satisfy every specified dimension. When multiple injection rules target the same domain they are evaluated in order and the first match wins; a rule without `match` matches any request and shadows later rules for the same domain.", + "type": "object", + "additionalProperties": false, + "properties": { + "path": { + "description": "Match on the request path. Comparison is case-sensitive.", + "type": "object", + "additionalProperties": false, + "properties": { + "exact": { + "type": "string", + "description": "Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys." + }, + "startsWith": { + "type": "string", + "description": "Match values that start with the given prefix." + } + } + }, + "method": { + "type": "array", + "description": "HTTP methods to match. Any single match succeeds (OR semantics).", + "items": { + "type": "string" + } + }, + "queryString": { + "type": "array", + "description": "Query-string entry matchers. Multiple entries are ANDed. Query parameter names and values are both compared case-sensitively (RFC 3986). When a request has multiple values for the same key, any matching value satisfies the matcher.", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "key": { + "description": "Matcher for the entry key (header name or query key).", + "type": "object", + "additionalProperties": false, + "properties": { + "exact": { + "type": "string", + "description": "Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys." + }, + "startsWith": { + "type": "string", + "description": "Match values that start with the given prefix." + } + } + }, + "value": { + "description": "Matcher for the entry value.", + "type": "object", + "additionalProperties": false, + "properties": { + "exact": { + "type": "string", + "description": "Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys." + }, + "startsWith": { + "type": "string", + "description": "Match values that start with the given prefix." + } + } + } + } + } + }, + "headers": { + "type": "array", + "description": "Header matchers. Multiple entries are ANDed. Header names are compared case-insensitively (RFC 9110); header values are compared case-sensitively. When a request has multiple values for the same header, any matching value satisfies the matcher.", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "key": { + "description": "Matcher for the entry key (header name or query key).", + "type": "object", + "additionalProperties": false, + "properties": { + "exact": { + "type": "string", + "description": "Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys." + }, + "startsWith": { + "type": "string", + "description": "Match values that start with the given prefix." + } + } + }, + "value": { + "description": "Matcher for the entry value.", + "type": "object", + "additionalProperties": false, + "properties": { + "exact": { + "type": "string", + "description": "Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys." + }, + "startsWith": { + "type": "string", + "description": "Match values that start with the given prefix." + } + } + } + } + } + } + } + }, + "transform": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "headers": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + } + } + }, + "forwardURL": { + "type": "string", + "description": "HTTP/1.1 proxy URL to forward traffic to. Must not include username, password, query string, or fragment." + }, + "response": { + "description": "Answer matching requests from the proxy with this response instead of forwarding them to the origin. Combine with a `match` on an earlier rule to allow one sub-path and reject the rest of a domain.", + "type": "object", + "additionalProperties": false, + "required": [ + "statusCode" + ], + "properties": { + "statusCode": { + "type": "integer", + "minimum": 200, + "maximum": 599, + "description": "HTTP status code returned to the sandbox." + }, + "headers": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "description": "HTTP response headers. Framing and hop-by-hop headers are managed by the proxy and cannot be set." + }, + "body": { + "type": "string", + "description": "UTF-8 response body. Requires `contentType`." + }, + "contentType": { + "type": "string", + "description": "Value of the `Content-Type` response header. Required when `body` is set." + } + } + } + } + } + } + } + ] + }, + "subnets": { + "type": "object", + "additionalProperties": false, + "properties": { + "allow": { + "type": "array", + "items": { + "type": "string" + } + }, + "deny": { + "type": "array", + "items": { + "type": "string" + } + } + } + } + } + } + ] + }, + "resources": { + "description": "Resources to define the VM", + "additionalProperties": false, + "type": "object", + "properties": { + "vcpus": { + "description": "The number of virtual CPUs to allocate to the sandbox. Must be 1, or an even number.", + "type": "integer", + "minimum": 1, + "default": 2, + "example": 2 + }, + "memory": { + "description": "The amount of memory in megabytes to allocate to the sandbox. Must equal vcpus * 2048.", + "type": "integer", + "minimum": 2048, + "example": 4096 + } + } + }, + "ports": { + "description": "List of ports to expose from the sandbox. Each port will be accessible via a unique URL. Maximum of 15 ports can be exposed.", + "type": "array", + "maxItems": 15, + "uniqueItems": true, + "example": [ + 3000, + 4000 + ], + "items": { + "type": "integer", + "description": "A port number to expose from the sandbox. Must be between 1024 and 65535.", + "not": { + "enum": [ + 23456 + ] + }, + "maximum": 65535, + "minimum": 1024 + } + }, + "image": { + "type": "string", + "maxLength": 255, + "description": "Image to use for the sandbox." + }, + "timeout": { + "type": "integer", + "description": "Maximum duration in milliseconds that the sandbox can run before being automatically stopped.", + "minimum": 1000, + "example": 300000 + }, + "env": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "description": "Default environment variables for the sandbox. These are inherited by all commands unless overridden.", + "default": {}, + "example": { + "NODE_ENV": "production", + "HELLO": "world" + } + }, + "mounts": { + "type": "object", + "description": "List of drives to mount to the sandbox at the provided path.", + "maxProperties": 4, + "additionalProperties": { + "type": "object", + "additionalProperties": false, + "required": [ + "drive" + ], + "properties": { + "drive": { + "type": "string", + "description": "Name of the drive to mount. The drive must already exist.", + "maxLength": 64, + "pattern": "^[a-zA-Z0-9_-]+$" + }, + "mode": { + "type": "string", + "description": "Mount the drive as read-write, or as a read-only snapshot. One writer is permitted at a time.", + "default": "read-write", + "enum": [ + "snapshot", + "read-write" + ] + } + } + } + }, + "region": { + "type": "string", + "enum": [ + "iad1", + "sfo1", + "cle1", + "cdg1", + "fra1", + "arn1", + "sin1", + "pdx1", + "lhr1", + "icn1", + "bom1", + "cpt1", + "dub1", + "gru1", + "hkg1", + "syd1", + "yul1", + "hnd1", + "kix1" + ], + "default": [ + "iad1", + "sfo1", + "cle1", + "cdg1", + "fra1", + "arn1", + "sin1", + "pdx1", + "lhr1", + "icn1", + "bom1", + "cpt1", + "dub1", + "gru1", + "hkg1", + "syd1", + "yul1", + "hnd1", + "kix1" + ], + "description": "The Vercel region in which to create the sandbox.", + "example": "iad1" + }, + "failoverRegions": { + "type": "array", + "maxItems": 19, + "uniqueItems": true, + "items": { + "type": "string", + "enum": [ + "iad1", + "sfo1", + "cle1", + "cdg1", + "fra1", + "arn1", + "sin1", + "pdx1", + "lhr1", + "icn1", + "bom1", + "cpt1", + "dub1", + "gru1", + "hkg1", + "syd1", + "yul1", + "hnd1", + "kix1" + ] + }, + "description": "The regions the sandbox falls back to when it cannot be created in `region`.", + "example": [ + "sfo1", + "cle1" + ] + }, + "networkId": { + "type": "string", + "maxLength": 255, + "description": "The Connect network id for the target Secure Compute private network." + }, + "name": { + "example": "my-sandbox-fork", + "type": "string", + "pattern": "^[a-zA-Z0-9_-]+$", + "maxLength": 128, + "description": "Name for the forked sandbox. Must be unique per project and URL-safe (alphanumeric, hyphens, underscores). A random name is generated when omitted." + }, + "persistent": { + "description": "Whether the sandbox persists its state across restarts via automatic snapshots. Defaults to the source sandbox setting.", + "type": "boolean" + }, + "snapshotExpiration": { + "description": "Default snapshot expiration time in milliseconds. Defaults to 7 days. Set to 0 to disable expiration. When set, this value is used as the default expiration for all snapshots created for this sandbox.", + "oneOf": [ + {}, + { + "type": "integer" + } + ], + "example": 604800000 + }, + "keepLastSnapshots": { + "description": "Protect the N most recent snapshots with different expiration/deletion behavior. Persistent sandboxes default to keeping only the last snapshot (evicted snapshots are deleted). Set to null to disable the limit.", + "oneOf": [ + { + "type": "string" + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "count" + ], + "properties": { + "count": { + "type": "integer", + "minimum": 1, + "maximum": 10, + "description": "Number of most recent snapshots to keep." + }, + "expiration": { + "description": "Expiration time in milliseconds for kept snapshots. Falls back to snapshotExpiration.", + "oneOf": [ + {}, + { + "type": "integer" + } + ] + }, + "deleteEvicted": { + "type": "boolean", + "description": "Whether to immediately delete evicted snapshots. Defaults to true." + } + } + } + ] + }, + "tags": { + "description": "Key-value tags to associate with the sandbox. Maximum 5 tags.", + "type": "object", + "maxProperties": 5, + "additionalProperties": { + "type": "string", + "maxLength": 256 + }, + "example": { + "env": "staging", + "team": "platform" + } + } + } + } + } + } + } + } + }, + "/v4/sandboxes": { + "post": { + "description": "Creates a named sandbox environment. Named sandboxes have a unique name within a project and support automatic snapshotting on shutdown. When no `image` is provided (and the sandbox is not restored from a snapshot), the sandbox is created from the default universal image. Unlike v3, snapshots expire after 7 days by default and persistent sandboxes keep only their most recent snapshot unless `keepLastSnapshots` is configured otherwise (or set to `null` to disable the limit).", + "operationId": "createSandboxesV4", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Create a named sandbox", + "tags": [ + "sandboxes" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "sandbox": { + "$ref": "#/components/schemas/NamedSandbox" + }, + "session": { + "$ref": "#/components/schemas/Session" + }, + "routes": { + "items": { + "$ref": "#/components/schemas/SandboxPublicRoute" + }, + "type": "array" + } + }, + "required": [ + "routes", + "sandbox", + "session" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "402": { + "description": "The account is missing a payment so payment method must be updated" + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "409": { + "description": "" + }, + "410": { + "description": "" + }, + "422": { + "description": "" + }, + "429": { + "description": "The concurrency limit has been exceeded." + }, + "500": { + "description": "" + } + }, + "parameters": [ + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "additionalProperties": false, + "properties": { + "networkPolicy": { + "oneOf": [ + { + "description": "Network access policy for the sandbox.\\n Controls which external hosts the sandbox can communicate with.\\n Use \\\"allow-all\\\" mode to allow all traffic, \\\"deny-all\\\" to block all traffic or \\\"custom\\\" to provide specific rules.", + "type": "object", + "additionalProperties": false, + "required": [ + "mode" + ], + "properties": { + "mode": { + "description": "The network access policy mode. Use \\\"allow-all\\\" to permit all outbound traffic. Use \\\"deny-all\\\" to block all outbound traffic. Use \\\"custom\\\" to specify explicit allow/deny rules.", + "type": "string", + "enum": [ + "allow-all", + "deny-all", + "custom", + "default-allow", + "default-deny" + ], + "example": "custom" + }, + "allowedDomains": { + "description": "List of domain names the sandbox is allowed to connect to. Only applies when mode is \\\"custom\\\". Supports wildcard patterns (e.g., \\\"*.example.com\\\" matches all subdomains).", + "type": "array", + "example": [ + "api.github.com", + "*.npmjs.org" + ], + "items": { + "type": "string", + "description": "A domain name pattern. Use \\\"*\\\" for wildcard matching of subdomains (e.g., \\\"*.example.com\\\")." + } + }, + "allowedCIDRs": { + "description": "List of IP address ranges (in CIDR notation) the sandbox is allowed to connect to. Traffic to these addresses bypasses domain-based restrictions.", + "type": "array", + "example": [ + "35.192.0.0/12", + "104.16.0.0/12" + ], + "items": { + "type": "string", + "description": "An IPv4 address range in CIDR notation (e.g., \\\"35.192.0.0/12\\\")." + } + }, + "deniedCIDRs": { + "description": "List of IP address ranges (in CIDR notation) the sandbox is blocked from connecting to. These rules take precedence over all allowed rules.", + "type": "array", + "example": [ + "35.192.0.0/12" + ], + "items": { + "type": "string", + "description": "An IP address range in CIDR notation to block." + } + }, + "injectionRules": { + "description": "HTTP header injection rules for outgoing requests matching specific domains. Traffic to matching domains will be intercepted instead of proxied through encrypted connections.", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "required": [ + "domain", + "headers" + ], + "properties": { + "domain": { + "description": "The domain (or pattern) of requests to add headers for. Supports wildcards like *.example.com.", + "type": "string" + }, + "headers": { + "description": "HTTP headers to inject into requests for this domain. Existing headers with the same name will be overridden.", + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "match": { + "description": "Optional L7 match. When provided, the injection rule only applies to requests that satisfy every specified dimension. When multiple injection rules target the same domain they are evaluated in order and the first match wins; a rule without `match` matches any request and shadows later rules for the same domain.", + "type": "object", + "additionalProperties": false, + "properties": { + "path": { + "description": "Match on the request path. Comparison is case-sensitive.", + "type": "object", + "additionalProperties": false, + "properties": { + "exact": { + "type": "string", + "description": "Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys." + }, + "startsWith": { + "type": "string", + "description": "Match values that start with the given prefix." + } + } + }, + "method": { + "type": "array", + "description": "HTTP methods to match. Any single match succeeds (OR semantics).", + "items": { + "type": "string" + } + }, + "queryString": { + "type": "array", + "description": "Query-string entry matchers. Multiple entries are ANDed. Query parameter names and values are both compared case-sensitively (RFC 3986). When a request has multiple values for the same key, any matching value satisfies the matcher.", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "key": { + "description": "Matcher for the entry key (header name or query key).", + "type": "object", + "additionalProperties": false, + "properties": { + "exact": { + "type": "string", + "description": "Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys." + }, + "startsWith": { + "type": "string", + "description": "Match values that start with the given prefix." + } + } + }, + "value": { + "description": "Matcher for the entry value.", + "type": "object", + "additionalProperties": false, + "properties": { + "exact": { + "type": "string", + "description": "Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys." + }, + "startsWith": { + "type": "string", + "description": "Match values that start with the given prefix." + } + } + } + } + } + }, + "headers": { + "type": "array", + "description": "Header matchers. Multiple entries are ANDed. Header names are compared case-insensitively (RFC 9110); header values are compared case-sensitively. When a request has multiple values for the same header, any matching value satisfies the matcher.", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "key": { + "description": "Matcher for the entry key (header name or query key).", + "type": "object", + "additionalProperties": false, + "properties": { + "exact": { + "type": "string", + "description": "Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys." + }, + "startsWith": { + "type": "string", + "description": "Match values that start with the given prefix." + } + } + }, + "value": { + "description": "Matcher for the entry value.", + "type": "object", + "additionalProperties": false, + "properties": { + "exact": { + "type": "string", + "description": "Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys." + }, + "startsWith": { + "type": "string", + "description": "Match values that start with the given prefix." + } + } + } + } + } + } + } + } + } + } + } + } + }, + { + "type": "object", + "additionalProperties": false, + "properties": { + "allow": { + "oneOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "description": "A rule applied to requests matching a domain in the network policy. Only one of `transform`, `forwardURL`, or `response` can be specified per rule.", + "type": "object", + "additionalProperties": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "match": { + "description": "Optional L7 match. When provided, the injection rule only applies to requests that satisfy every specified dimension. When multiple injection rules target the same domain they are evaluated in order and the first match wins; a rule without `match` matches any request and shadows later rules for the same domain.", + "type": "object", + "additionalProperties": false, + "properties": { + "path": { + "description": "Match on the request path. Comparison is case-sensitive.", + "type": "object", + "additionalProperties": false, + "properties": { + "exact": { + "type": "string", + "description": "Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys." + }, + "startsWith": { + "type": "string", + "description": "Match values that start with the given prefix." + } + } + }, + "method": { + "type": "array", + "description": "HTTP methods to match. Any single match succeeds (OR semantics).", + "items": { + "type": "string" + } + }, + "queryString": { + "type": "array", + "description": "Query-string entry matchers. Multiple entries are ANDed. Query parameter names and values are both compared case-sensitively (RFC 3986). When a request has multiple values for the same key, any matching value satisfies the matcher.", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "key": { + "description": "Matcher for the entry key (header name or query key).", + "type": "object", + "additionalProperties": false, + "properties": { + "exact": { + "type": "string", + "description": "Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys." + }, + "startsWith": { + "type": "string", + "description": "Match values that start with the given prefix." + } + } + }, + "value": { + "description": "Matcher for the entry value.", + "type": "object", + "additionalProperties": false, + "properties": { + "exact": { + "type": "string", + "description": "Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys." + }, + "startsWith": { + "type": "string", + "description": "Match values that start with the given prefix." + } + } + } + } + } + }, + "headers": { + "type": "array", + "description": "Header matchers. Multiple entries are ANDed. Header names are compared case-insensitively (RFC 9110); header values are compared case-sensitively. When a request has multiple values for the same header, any matching value satisfies the matcher.", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "key": { + "description": "Matcher for the entry key (header name or query key).", + "type": "object", + "additionalProperties": false, + "properties": { + "exact": { + "type": "string", + "description": "Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys." + }, + "startsWith": { + "type": "string", + "description": "Match values that start with the given prefix." + } + } + }, + "value": { + "description": "Matcher for the entry value.", + "type": "object", + "additionalProperties": false, + "properties": { + "exact": { + "type": "string", + "description": "Match the value exactly. Case-sensitive for paths, header values, and methods; case-insensitive for domains and header keys." + }, + "startsWith": { + "type": "string", + "description": "Match values that start with the given prefix." + } + } + } + } + } + } + } + }, + "transform": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "headers": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + } + } + }, + "forwardURL": { + "type": "string", + "description": "HTTP/1.1 proxy URL to forward traffic to. Must not include username, password, query string, or fragment." + }, + "response": { + "description": "Answer matching requests from the proxy with this response instead of forwarding them to the origin. Combine with a `match` on an earlier rule to allow one sub-path and reject the rest of a domain.", + "type": "object", + "additionalProperties": false, + "required": [ + "statusCode" + ], + "properties": { + "statusCode": { + "type": "integer", + "minimum": 200, + "maximum": 599, + "description": "HTTP status code returned to the sandbox." + }, + "headers": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "description": "HTTP response headers. Framing and hop-by-hop headers are managed by the proxy and cannot be set." + }, + "body": { + "type": "string", + "description": "UTF-8 response body. Requires `contentType`." + }, + "contentType": { + "type": "string", + "description": "Value of the `Content-Type` response header. Required when `body` is set." + } + } + } + } + } + } + } + ] + }, + "subnets": { + "type": "object", + "additionalProperties": false, + "properties": { + "allow": { + "type": "array", + "items": { + "type": "string" + } + }, + "deny": { + "type": "array", + "items": { + "type": "string" + } + } + } + } + } + } + ] + }, + "resources": { + "description": "Resources to define the VM", + "additionalProperties": false, + "type": "object", + "properties": { + "vcpus": { + "description": "The number of virtual CPUs to allocate to the sandbox. Must be 1, or an even number.", + "type": "integer", + "minimum": 1, + "default": 2, + "example": 2 + }, + "memory": { + "description": "The amount of memory in megabytes to allocate to the sandbox. Must equal vcpus * 2048.", + "type": "integer", + "minimum": 2048, + "example": 4096 + } + } + }, + "source": { + "description": "The source from which to initialize the sandbox filesystem. Can be a Git repository, a tarball URL, or an existing snapshot.", + "oneOf": [ + { + "type": "object", + "description": "Clone a Git repository into the sandbox.", + "properties": { + "type": { + "description": "Indicates the source is a Git repository." + }, + "url": { + "type": "string", + "format": "uri", + "description": "The URL of the Git repository to clone.", + "example": "https://github.com/vercel/next.js.git" + }, + "username": { + "type": "string", + "description": "Username for Git authentication. Required together with password for private repositories." + }, + "password": { + "type": "string", + "description": "Password or personal access token for Git authentication. Required together with username for private repositories." + }, + "depth": { + "type": "integer", + "minimum": 1, + "description": "Create a shallow clone with history truncated to the specified number of commits. Useful for faster cloning of large repositories.", + "example": 1 + }, + "revision": { + "type": "string", + "description": "The specific commit SHA, branch name, or tag to checkout after cloning.", + "example": "main" + } + }, + "required": [ + "type", + "url" + ], + "additionalProperties": false + }, + { + "type": "object", + "description": "Download and extract a gzipped tarball into the sandbox.", + "properties": { + "type": { + "description": "Indicates the source is a tarball." + }, + "url": { + "type": "string", + "format": "uri", + "description": "URL of a gzipped tarball (.tar.gz) to download and extract.", + "example": "https://example.com/project.tar.gz" + } + }, + "required": [ + "type", + "url" + ], + "additionalProperties": false + }, + { + "type": "object", + "description": "Restore the sandbox filesystem from an existing snapshot.", + "properties": { + "type": { + "description": "Indicates the source is a snapshot." + }, + "snapshotId": { + "type": "string", + "description": "The unique identifier of the snapshot to restore.", + "example": "snap_abc123" + } + }, + "required": [ + "type", + "snapshotId" + ], + "additionalProperties": false + } + ] + }, + "projectId": { + "description": "The target project slug or ID in which the sandbox will be assigned to.", + "example": "prj_abc123", + "type": "string" + }, + "ports": { + "description": "List of ports to expose from the sandbox. Each port will be accessible via a unique URL. Maximum of 15 ports can be exposed.", + "type": "array", + "maxItems": 15, + "uniqueItems": true, + "example": [ + 3000, + 4000 + ], + "items": { + "type": "integer", + "description": "A port number to expose from the sandbox. Must be between 1024 and 65535.", + "not": { + "enum": [ + 23456 + ] + }, + "maximum": 65535, + "minimum": 1024 + } + }, + "image": { + "type": "string", + "maxLength": 255, + "description": "Image to use for the sandbox." + }, + "timeout": { + "type": "integer", + "description": "Maximum duration in milliseconds that the sandbox can run before being automatically stopped.", + "minimum": 1000, + "example": 300000 + }, + "env": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "description": "Default environment variables for the sandbox. These are inherited by all commands unless overridden.", + "default": {}, + "example": { + "NODE_ENV": "production", + "HELLO": "world" + } + }, + "mounts": { + "type": "object", + "description": "List of drives to mount to the sandbox at the provided path.", + "maxProperties": 4, + "additionalProperties": { + "type": "object", + "additionalProperties": false, + "required": [ + "drive" + ], + "properties": { + "drive": { + "type": "string", + "description": "Name of the drive to mount. The drive must already exist.", + "maxLength": 64, + "pattern": "^[a-zA-Z0-9_-]+$" + }, + "mode": { + "type": "string", + "description": "Mount the drive as read-write, or as a read-only snapshot. One writer is permitted at a time.", + "default": "read-write", + "enum": [ + "snapshot", + "read-write" + ] + } + } + } + }, + "region": { + "type": "string", + "enum": [ + "iad1", + "sfo1", + "cle1", + "cdg1", + "fra1", + "arn1", + "sin1", + "pdx1", + "lhr1", + "icn1", + "bom1", + "cpt1", + "dub1", + "gru1", + "hkg1", + "syd1", + "yul1", + "hnd1", + "kix1" + ], + "default": [ + "iad1", + "sfo1", + "cle1", + "cdg1", + "fra1", + "arn1", + "sin1", + "pdx1", + "lhr1", + "icn1", + "bom1", + "cpt1", + "dub1", + "gru1", + "hkg1", + "syd1", + "yul1", + "hnd1", + "kix1" + ], + "description": "The Vercel region in which to create the sandbox.", + "example": "iad1" + }, + "failoverRegions": { + "type": "array", + "maxItems": 19, + "uniqueItems": true, + "items": { + "type": "string", + "enum": [ + "iad1", + "sfo1", + "cle1", + "cdg1", + "fra1", + "arn1", + "sin1", + "pdx1", + "lhr1", + "icn1", + "bom1", + "cpt1", + "dub1", + "gru1", + "hkg1", + "syd1", + "yul1", + "hnd1", + "kix1" + ] + }, + "description": "The regions the sandbox falls back to when it cannot be created in `region`.", + "example": [ + "sfo1", + "cle1" + ] + }, + "networkId": { + "type": "string", + "maxLength": 255, + "description": "The Connect network id for the target Secure Compute private network." + }, + "name": { + "example": "my-sandbox", + "type": "string", + "pattern": "^[a-zA-Z0-9_-]+$", + "maxLength": 128, + "description": "Name for the sandbox. Must be unique per project and URL-safe (alphanumeric, hyphens, underscores)." + }, + "persistent": { + "description": "Whether the sandbox persists its state across restarts via automatic snapshots. Defaults to true.", + "type": "boolean", + "default": true + }, + "snapshotExpiration": { + "description": "Default snapshot expiration time in milliseconds. Defaults to 7 days. Set to 0 to disable expiration. When set, this value is used as the default expiration for all snapshots created for this sandbox.", + "oneOf": [ + {}, + { + "type": "integer" + } + ], + "example": 604800000 + }, + "keepLastSnapshots": { + "description": "Protect the N most recent snapshots with different expiration/deletion behavior. Persistent sandboxes default to keeping only the last snapshot (evicted snapshots are deleted). Set to null to disable the limit.", + "oneOf": [ + { + "type": "string" + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "count" + ], + "properties": { + "count": { + "type": "integer", + "minimum": 1, + "maximum": 10, + "description": "Number of most recent snapshots to keep." + }, + "expiration": { + "description": "Expiration time in milliseconds for kept snapshots. Falls back to snapshotExpiration.", + "oneOf": [ + {}, + { + "type": "integer" + } + ] + }, + "deleteEvicted": { + "type": "boolean", + "description": "Whether to immediately delete evicted snapshots. Defaults to true." + } + } + } + ] + }, + "tags": { + "description": "Key-value tags to associate with the sandbox. Maximum 5 tags.", + "type": "object", + "maxProperties": 5, + "additionalProperties": { + "type": "string", + "maxLength": 256 + }, + "example": { + "env": "staging", + "team": "platform" + } + } + } + } + } + } + } + } + }, + "/v1/security/attack-mode": { + "post": { + "description": "Update the setting for determining if the project has Attack Challenge mode enabled.", + "operationId": "updateAttackChallengeMode", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Update Attack Challenge mode", + "tags": [ + "security" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "attackModeEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "attackModeUpdatedAt": { + "type": "number" + } + }, + "required": [ + "attackModeEnabled", + "attackModeUpdatedAt" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "oneOf": [ + { + "required": [ + "projectId", + "attackModeEnabled", + "attackModeActiveUntil" + ], + "properties": { + "projectId": { + "type": "string" + }, + "attackModeEnabled": { + "type": "boolean" + }, + "attackModeActiveUntil": { + "type": "number" + } + } + }, + { + "type": "object", + "required": [ + "projectId", + "attackModeEnabled" + ], + "properties": { + "projectId": { + "type": "string" + }, + "attackModeEnabled": { + "type": "boolean" + } + } + } + ] + } + } + }, + "required": true + } + } + }, + "/v1/security/firewall/config": { + "get": { + "description": "Lists WAF configs for a project", + "operationId": "getSecurityFirewallConfig", + "security": [], + "summary": "Returns activated WAF config", + "tags": [ + "security" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "active": { + "nullable": true, + "properties": { + "ownerId": { + "type": "string" + }, + "projectKey": { + "type": "string" + }, + "id": { + "type": "string" + }, + "version": { + "type": "number" + }, + "updatedAt": { + "type": "string" + }, + "firewallEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "crs": { + "properties": { + "sd": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "deny", + "log" + ] + } + }, + "required": [ + "action", + "active" + ], + "type": "object" + }, + "ma": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "deny", + "log" + ] + } + }, + "required": [ + "action", + "active" + ], + "type": "object" + }, + "lfi": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "deny", + "log" + ] + } + }, + "required": [ + "action", + "active" + ], + "type": "object" + }, + "rfi": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "deny", + "log" + ] + } + }, + "required": [ + "action", + "active" + ], + "type": "object" + }, + "rce": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "deny", + "log" + ] + } + }, + "required": [ + "action", + "active" + ], + "type": "object" + }, + "php": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "deny", + "log" + ] + } + }, + "required": [ + "action", + "active" + ], + "type": "object" + }, + "gen": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "deny", + "log" + ] + } + }, + "required": [ + "action", + "active" + ], + "type": "object" + }, + "xss": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "deny", + "log" + ] + } + }, + "required": [ + "action", + "active" + ], + "type": "object" + }, + "sqli": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "deny", + "log" + ] + } + }, + "required": [ + "action", + "active" + ], + "type": "object" + }, + "sf": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "deny", + "log" + ] + } + }, + "required": [ + "action", + "active" + ], + "type": "object" + }, + "java": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "deny", + "log" + ] + } + }, + "required": [ + "action", + "active" + ], + "type": "object" + } + }, + "required": [ + "gen", + "java", + "lfi", + "ma", + "php", + "rce", + "rfi", + "sd", + "sf", + "sqli", + "xss" + ], + "type": "object" + }, + "rules": { + "items": { + "oneOf": [ + { + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "conditionGroup": { + "items": { + "properties": { + "conditions": { + "items": { + "properties": { + "type": { + "type": "string", + "enum": [ + "bot_category", + "bot_name", + "bot_protection", + "bot_status", + "cookie", + "domain_environment", + "environment", + "geo_as_number", + "geo_city", + "geo_continent", + "geo_country", + "geo_country_region", + "header", + "host", + "ip_address", + "ja3_digest", + "ja4_digest", + "method", + "path", + "protocol", + "query", + "rate_limit_api_id", + "raw_path", + "region", + "route", + "ruleset", + "scheme", + "server_action", + "shared_condition", + "target_path", + "traffic_source", + "trusted_source", + "user_agent" + ] + }, + "op": { + "type": "string", + "enum": [ + "eq", + "ex", + "gt", + "gte", + "inc", + "list", + "lt", + "lte", + "neq", + "nex", + "ninc", + "pre", + "re", + "sub", + "suf" + ] + }, + "neg": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "key": { + "type": "string" + }, + "value": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "items": { + "type": "string" + }, + "type": "array" + } + ] + } + }, + "required": [ + "op", + "type" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "conditions" + ], + "type": "object" + }, + "type": "array" + }, + "action": { + "properties": { + "mitigate": { + "properties": { + "action": { + "type": "string", + "enum": [ + "allow", + "bypass", + "challenge", + "deny", + "log", + "rate_limit", + "redirect" + ] + }, + "rateLimit": { + "nullable": true, + "properties": { + "algo": { + "type": "string", + "enum": [ + "fixed_window", + "token_bucket" + ] + }, + "window": { + "type": "number" + }, + "limit": { + "type": "number" + }, + "keys": { + "items": { + "type": "string" + }, + "type": "array" + }, + "action": { + "nullable": true, + "type": "string", + "enum": [ + "challenge", + "deny", + "log", + "rate_limit", + null + ] + } + }, + "required": [ + "algo", + "keys", + "limit", + "window" + ], + "type": "object" + }, + "redirect": { + "nullable": true, + "properties": { + "location": { + "type": "string" + }, + "permanent": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "location", + "permanent" + ], + "type": "object" + }, + "actionDuration": { + "nullable": true, + "type": "string" + }, + "bypassSystem": { + "nullable": true, + "type": "boolean", + "enum": [ + false, + true, + null + ] + }, + "logHeaders": { + "oneOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "string", + "enum": [ + "*" + ] + } + ] + } + }, + "required": [ + "action" + ], + "type": "object" + } + }, + "type": "object" + }, + "valid": { + "type": "boolean", + "enum": [ + true + ] + }, + "validationErrors": { + "nullable": true + } + }, + "required": [ + "action", + "active", + "conditionGroup", + "id", + "name", + "valid", + "validationErrors" + ], + "type": "object" + }, + { + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "conditionGroup": { + "items": { + "properties": { + "conditions": { + "items": { + "properties": { + "type": { + "type": "string", + "enum": [ + "bot_category", + "bot_name", + "bot_protection", + "bot_status", + "cookie", + "domain_environment", + "environment", + "geo_as_number", + "geo_city", + "geo_continent", + "geo_country", + "geo_country_region", + "header", + "host", + "ip_address", + "ja3_digest", + "ja4_digest", + "method", + "path", + "protocol", + "query", + "rate_limit_api_id", + "raw_path", + "region", + "route", + "ruleset", + "scheme", + "server_action", + "shared_condition", + "target_path", + "traffic_source", + "trusted_source", + "user_agent" + ] + }, + "op": { + "type": "string", + "enum": [ + "eq", + "ex", + "gt", + "gte", + "inc", + "list", + "lt", + "lte", + "neq", + "nex", + "ninc", + "pre", + "re", + "sub", + "suf" + ] + }, + "neg": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "key": { + "type": "string" + }, + "value": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "items": { + "type": "string" + }, + "type": "array" + } + ] + } + }, + "required": [ + "op", + "type" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "conditions" + ], + "type": "object" + }, + "type": "array" + }, + "action": { + "properties": { + "mitigate": { + "properties": { + "action": { + "type": "string", + "enum": [ + "allow", + "bypass", + "challenge", + "deny", + "log", + "rate_limit", + "redirect" + ] + }, + "rateLimit": { + "nullable": true, + "properties": { + "algo": { + "type": "string", + "enum": [ + "fixed_window", + "token_bucket" + ] + }, + "window": { + "type": "number" + }, + "limit": { + "type": "number" + }, + "keys": { + "items": { + "type": "string" + }, + "type": "array" + }, + "action": { + "nullable": true, + "type": "string", + "enum": [ + "challenge", + "deny", + "log", + "rate_limit", + null + ] + } + }, + "required": [ + "algo", + "keys", + "limit", + "window" + ], + "type": "object" + }, + "redirect": { + "nullable": true, + "properties": { + "location": { + "type": "string" + }, + "permanent": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "location", + "permanent" + ], + "type": "object" + }, + "actionDuration": { + "nullable": true, + "type": "string" + }, + "bypassSystem": { + "nullable": true, + "type": "boolean", + "enum": [ + false, + true, + null + ] + }, + "logHeaders": { + "oneOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "string", + "enum": [ + "*" + ] + } + ] + } + }, + "required": [ + "action" + ], + "type": "object" + } + }, + "type": "object" + }, + "valid": { + "type": "boolean", + "enum": [ + false + ] + }, + "validationErrors": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "action", + "active", + "conditionGroup", + "id", + "name", + "valid", + "validationErrors" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "ips": { + "items": { + "properties": { + "id": { + "type": "string" + }, + "hostname": { + "type": "string" + }, + "ip": { + "type": "string" + }, + "notes": { + "type": "string" + }, + "action": { + "type": "string", + "enum": [ + "bypass", + "challenge", + "deny", + "log" + ] + } + }, + "required": [ + "action", + "hostname", + "id", + "ip" + ], + "type": "object" + }, + "type": "array" + }, + "rulesets": { + "oneOf": [ + { + "items": { + "properties": { + "description": { + "type": "string" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "conditionGroup": { + "items": { + "properties": { + "conditions": { + "items": { + "properties": { + "type": { + "type": "string", + "enum": [ + "bot_category", + "bot_name", + "bot_protection", + "bot_status", + "cookie", + "domain_environment", + "environment", + "geo_as_number", + "geo_city", + "geo_continent", + "geo_country", + "geo_country_region", + "header", + "host", + "ip_address", + "ja3_digest", + "ja4_digest", + "method", + "path", + "protocol", + "query", + "rate_limit_api_id", + "raw_path", + "region", + "route", + "ruleset", + "scheme", + "server_action", + "shared_condition", + "target_path", + "traffic_source", + "trusted_source", + "user_agent" + ] + }, + "op": { + "type": "string", + "enum": [ + "eq", + "ex", + "gt", + "gte", + "inc", + "list", + "lt", + "lte", + "neq", + "nex", + "ninc", + "pre", + "re", + "sub", + "suf" + ] + }, + "neg": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "key": { + "type": "string" + }, + "value": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "items": { + "type": "string" + }, + "type": "array" + } + ] + } + }, + "required": [ + "op", + "type" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "conditions" + ], + "type": "object" + }, + "type": "array" + }, + "action": { + "properties": { + "mitigate": { + "properties": { + "action": { + "type": "string", + "enum": [ + "allow", + "bypass", + "challenge", + "deny", + "log", + "rate_limit", + "redirect" + ] + }, + "rateLimit": { + "nullable": true, + "properties": { + "algo": { + "type": "string", + "enum": [ + "fixed_window", + "token_bucket" + ] + }, + "window": { + "type": "number" + }, + "limit": { + "type": "number" + }, + "keys": { + "items": { + "type": "string" + }, + "type": "array" + }, + "action": { + "nullable": true, + "type": "string", + "enum": [ + "challenge", + "deny", + "log", + "rate_limit", + null + ] + } + }, + "required": [ + "algo", + "keys", + "limit", + "window" + ], + "type": "object" + }, + "redirect": { + "nullable": true, + "properties": { + "location": { + "type": "string" + }, + "permanent": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "location", + "permanent" + ], + "type": "object" + }, + "actionDuration": { + "nullable": true, + "type": "string" + }, + "bypassSystem": { + "nullable": true, + "type": "boolean", + "enum": [ + false, + true, + null + ] + }, + "logHeaders": { + "oneOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "string", + "enum": [ + "*" + ] + } + ] + } + }, + "required": [ + "action" + ], + "type": "object" + } + }, + "type": "object" + } + }, + "required": [ + "active", + "conditionGroup", + "id", + "name" + ], + "type": "object" + }, + "type": "array" + }, + { + "additionalProperties": { + "properties": { + "action": { + "type": "string", + "enum": [ + "allow", + "bypass", + "challenge", + "deny", + "log", + "rate_limit", + "redirect" + ] + }, + "rateLimit": { + "nullable": true, + "properties": { + "algo": { + "type": "string", + "enum": [ + "fixed_window", + "token_bucket" + ] + }, + "window": { + "type": "number" + }, + "limit": { + "type": "number" + }, + "keys": { + "items": { + "type": "string" + }, + "type": "array" + }, + "action": { + "nullable": true, + "type": "string", + "enum": [ + "challenge", + "deny", + "log", + "rate_limit", + null + ] + } + }, + "required": [ + "algo", + "keys", + "limit", + "window" + ], + "type": "object" + }, + "redirect": { + "nullable": true, + "properties": { + "location": { + "type": "string" + }, + "permanent": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "location", + "permanent" + ], + "type": "object" + }, + "actionDuration": { + "nullable": true, + "type": "string" + }, + "bypassSystem": { + "nullable": true, + "type": "boolean", + "enum": [ + false, + true, + null + ] + }, + "logHeaders": { + "oneOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "string", + "enum": [ + "*" + ] + } + ] + } + }, + "required": [ + "action" + ], + "type": "object" + }, + "type": "object" + } + ] + }, + "conditions": { + "items": { + "properties": { + "description": { + "type": "string" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "conditionGroup": { + "items": { + "properties": { + "conditions": { + "items": { + "properties": { + "type": { + "type": "string", + "enum": [ + "bot_category", + "bot_name", + "bot_protection", + "bot_status", + "cookie", + "domain_environment", + "environment", + "geo_as_number", + "geo_city", + "geo_continent", + "geo_country", + "geo_country_region", + "header", + "host", + "ip_address", + "ja3_digest", + "ja4_digest", + "method", + "path", + "protocol", + "query", + "rate_limit_api_id", + "raw_path", + "region", + "route", + "ruleset", + "scheme", + "server_action", + "shared_condition", + "target_path", + "traffic_source", + "trusted_source", + "user_agent" + ] + }, + "op": { + "type": "string", + "enum": [ + "eq", + "ex", + "gt", + "gte", + "inc", + "list", + "lt", + "lte", + "neq", + "nex", + "ninc", + "pre", + "re", + "sub", + "suf" + ] + }, + "neg": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "key": { + "type": "string" + }, + "value": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "items": { + "type": "string" + }, + "type": "array" + } + ] + } + }, + "required": [ + "op", + "type" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "conditions" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "active", + "conditionGroup", + "id", + "name" + ], + "type": "object" + }, + "type": "array" + }, + "changes": { + "items": { + "type": "object" + }, + "type": "array" + }, + "managedRules": { + "properties": { + "bot_protection": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "challenge", + "deny", + "log" + ] + }, + "updatedAt": { + "type": "string" + }, + "userId": { + "type": "string" + }, + "username": { + "type": "string" + } + }, + "required": [ + "active" + ], + "type": "object" + }, + "ai_bots": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "challenge", + "deny", + "log" + ] + }, + "updatedAt": { + "type": "string" + }, + "userId": { + "type": "string" + }, + "username": { + "type": "string" + } + }, + "required": [ + "active" + ], + "type": "object" + }, + "owasp": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "challenge", + "deny", + "log" + ] + }, + "updatedAt": { + "type": "string" + }, + "userId": { + "type": "string" + }, + "username": { + "type": "string" + } + }, + "required": [ + "active" + ], + "type": "object" + }, + "vercel_ruleset": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "challenge", + "deny", + "log" + ] + }, + "updatedAt": { + "type": "string" + }, + "userId": { + "type": "string" + }, + "username": { + "type": "string" + } + }, + "required": [ + "active" + ], + "type": "object" + }, + "traffic_sources": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "challenge", + "deny", + "log" + ] + }, + "updatedAt": { + "type": "string" + }, + "userId": { + "type": "string" + }, + "username": { + "type": "string" + } + }, + "required": [ + "active" + ], + "type": "object" + } + }, + "type": "object" + }, + "botIdEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "logHeaders": { + "oneOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "string", + "enum": [ + "*" + ] + } + ] + } + }, + "required": [ + "changes", + "firewallEnabled", + "id", + "ips", + "ownerId", + "projectKey", + "rules", + "updatedAt", + "version" + ], + "type": "object" + }, + "draft": { + "nullable": true, + "properties": { + "ownerId": { + "type": "string" + }, + "projectKey": { + "type": "string" + }, + "id": { + "type": "string" + }, + "version": { + "type": "number" + }, + "updatedAt": { + "type": "string" + }, + "firewallEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "crs": { + "properties": { + "sd": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "deny", + "log" + ] + } + }, + "required": [ + "action", + "active" + ], + "type": "object" + }, + "ma": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "deny", + "log" + ] + } + }, + "required": [ + "action", + "active" + ], + "type": "object" + }, + "lfi": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "deny", + "log" + ] + } + }, + "required": [ + "action", + "active" + ], + "type": "object" + }, + "rfi": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "deny", + "log" + ] + } + }, + "required": [ + "action", + "active" + ], + "type": "object" + }, + "rce": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "deny", + "log" + ] + } + }, + "required": [ + "action", + "active" + ], + "type": "object" + }, + "php": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "deny", + "log" + ] + } + }, + "required": [ + "action", + "active" + ], + "type": "object" + }, + "gen": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "deny", + "log" + ] + } + }, + "required": [ + "action", + "active" + ], + "type": "object" + }, + "xss": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "deny", + "log" + ] + } + }, + "required": [ + "action", + "active" + ], + "type": "object" + }, + "sqli": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "deny", + "log" + ] + } + }, + "required": [ + "action", + "active" + ], + "type": "object" + }, + "sf": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "deny", + "log" + ] + } + }, + "required": [ + "action", + "active" + ], + "type": "object" + }, + "java": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "deny", + "log" + ] + } + }, + "required": [ + "action", + "active" + ], + "type": "object" + } + }, + "required": [ + "gen", + "java", + "lfi", + "ma", + "php", + "rce", + "rfi", + "sd", + "sf", + "sqli", + "xss" + ], + "type": "object" + }, + "rules": { + "items": { + "oneOf": [ + { + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "conditionGroup": { + "items": { + "properties": { + "conditions": { + "items": { + "properties": { + "type": { + "type": "string", + "enum": [ + "bot_category", + "bot_name", + "bot_protection", + "bot_status", + "cookie", + "domain_environment", + "environment", + "geo_as_number", + "geo_city", + "geo_continent", + "geo_country", + "geo_country_region", + "header", + "host", + "ip_address", + "ja3_digest", + "ja4_digest", + "method", + "path", + "protocol", + "query", + "rate_limit_api_id", + "raw_path", + "region", + "route", + "ruleset", + "scheme", + "server_action", + "shared_condition", + "target_path", + "traffic_source", + "trusted_source", + "user_agent" + ] + }, + "op": { + "type": "string", + "enum": [ + "eq", + "ex", + "gt", + "gte", + "inc", + "list", + "lt", + "lte", + "neq", + "nex", + "ninc", + "pre", + "re", + "sub", + "suf" + ] + }, + "neg": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "key": { + "type": "string" + }, + "value": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "items": { + "type": "string" + }, + "type": "array" + } + ] + } + }, + "required": [ + "op", + "type" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "conditions" + ], + "type": "object" + }, + "type": "array" + }, + "action": { + "properties": { + "mitigate": { + "properties": { + "action": { + "type": "string", + "enum": [ + "allow", + "bypass", + "challenge", + "deny", + "log", + "rate_limit", + "redirect" + ] + }, + "rateLimit": { + "nullable": true, + "properties": { + "algo": { + "type": "string", + "enum": [ + "fixed_window", + "token_bucket" + ] + }, + "window": { + "type": "number" + }, + "limit": { + "type": "number" + }, + "keys": { + "items": { + "type": "string" + }, + "type": "array" + }, + "action": { + "nullable": true, + "type": "string", + "enum": [ + "challenge", + "deny", + "log", + "rate_limit", + null + ] + } + }, + "required": [ + "algo", + "keys", + "limit", + "window" + ], + "type": "object" + }, + "redirect": { + "nullable": true, + "properties": { + "location": { + "type": "string" + }, + "permanent": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "location", + "permanent" + ], + "type": "object" + }, + "actionDuration": { + "nullable": true, + "type": "string" + }, + "bypassSystem": { + "nullable": true, + "type": "boolean", + "enum": [ + false, + true, + null + ] + }, + "logHeaders": { + "oneOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "string", + "enum": [ + "*" + ] + } + ] + } + }, + "required": [ + "action" + ], + "type": "object" + } + }, + "type": "object" + }, + "valid": { + "type": "boolean", + "enum": [ + true + ] + }, + "validationErrors": { + "nullable": true + } + }, + "required": [ + "action", + "active", + "conditionGroup", + "id", + "name", + "valid", + "validationErrors" + ], + "type": "object" + }, + { + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "conditionGroup": { + "items": { + "properties": { + "conditions": { + "items": { + "properties": { + "type": { + "type": "string", + "enum": [ + "bot_category", + "bot_name", + "bot_protection", + "bot_status", + "cookie", + "domain_environment", + "environment", + "geo_as_number", + "geo_city", + "geo_continent", + "geo_country", + "geo_country_region", + "header", + "host", + "ip_address", + "ja3_digest", + "ja4_digest", + "method", + "path", + "protocol", + "query", + "rate_limit_api_id", + "raw_path", + "region", + "route", + "ruleset", + "scheme", + "server_action", + "shared_condition", + "target_path", + "traffic_source", + "trusted_source", + "user_agent" + ] + }, + "op": { + "type": "string", + "enum": [ + "eq", + "ex", + "gt", + "gte", + "inc", + "list", + "lt", + "lte", + "neq", + "nex", + "ninc", + "pre", + "re", + "sub", + "suf" + ] + }, + "neg": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "key": { + "type": "string" + }, + "value": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "items": { + "type": "string" + }, + "type": "array" + } + ] + } + }, + "required": [ + "op", + "type" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "conditions" + ], + "type": "object" + }, + "type": "array" + }, + "action": { + "properties": { + "mitigate": { + "properties": { + "action": { + "type": "string", + "enum": [ + "allow", + "bypass", + "challenge", + "deny", + "log", + "rate_limit", + "redirect" + ] + }, + "rateLimit": { + "nullable": true, + "properties": { + "algo": { + "type": "string", + "enum": [ + "fixed_window", + "token_bucket" + ] + }, + "window": { + "type": "number" + }, + "limit": { + "type": "number" + }, + "keys": { + "items": { + "type": "string" + }, + "type": "array" + }, + "action": { + "nullable": true, + "type": "string", + "enum": [ + "challenge", + "deny", + "log", + "rate_limit", + null + ] + } + }, + "required": [ + "algo", + "keys", + "limit", + "window" + ], + "type": "object" + }, + "redirect": { + "nullable": true, + "properties": { + "location": { + "type": "string" + }, + "permanent": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "location", + "permanent" + ], + "type": "object" + }, + "actionDuration": { + "nullable": true, + "type": "string" + }, + "bypassSystem": { + "nullable": true, + "type": "boolean", + "enum": [ + false, + true, + null + ] + }, + "logHeaders": { + "oneOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "string", + "enum": [ + "*" + ] + } + ] + } + }, + "required": [ + "action" + ], + "type": "object" + } + }, + "type": "object" + }, + "valid": { + "type": "boolean", + "enum": [ + false + ] + }, + "validationErrors": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "action", + "active", + "conditionGroup", + "id", + "name", + "valid", + "validationErrors" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "ips": { + "items": { + "properties": { + "id": { + "type": "string" + }, + "hostname": { + "type": "string" + }, + "ip": { + "type": "string" + }, + "notes": { + "type": "string" + }, + "action": { + "type": "string", + "enum": [ + "bypass", + "challenge", + "deny", + "log" + ] + } + }, + "required": [ + "action", + "hostname", + "id", + "ip" + ], + "type": "object" + }, + "type": "array" + }, + "rulesets": { + "oneOf": [ + { + "items": { + "properties": { + "description": { + "type": "string" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "conditionGroup": { + "items": { + "properties": { + "conditions": { + "items": { + "properties": { + "type": { + "type": "string", + "enum": [ + "bot_category", + "bot_name", + "bot_protection", + "bot_status", + "cookie", + "domain_environment", + "environment", + "geo_as_number", + "geo_city", + "geo_continent", + "geo_country", + "geo_country_region", + "header", + "host", + "ip_address", + "ja3_digest", + "ja4_digest", + "method", + "path", + "protocol", + "query", + "rate_limit_api_id", + "raw_path", + "region", + "route", + "ruleset", + "scheme", + "server_action", + "shared_condition", + "target_path", + "traffic_source", + "trusted_source", + "user_agent" + ] + }, + "op": { + "type": "string", + "enum": [ + "eq", + "ex", + "gt", + "gte", + "inc", + "list", + "lt", + "lte", + "neq", + "nex", + "ninc", + "pre", + "re", + "sub", + "suf" + ] + }, + "neg": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "key": { + "type": "string" + }, + "value": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "items": { + "type": "string" + }, + "type": "array" + } + ] + } + }, + "required": [ + "op", + "type" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "conditions" + ], + "type": "object" + }, + "type": "array" + }, + "action": { + "properties": { + "mitigate": { + "properties": { + "action": { + "type": "string", + "enum": [ + "allow", + "bypass", + "challenge", + "deny", + "log", + "rate_limit", + "redirect" + ] + }, + "rateLimit": { + "nullable": true, + "properties": { + "algo": { + "type": "string", + "enum": [ + "fixed_window", + "token_bucket" + ] + }, + "window": { + "type": "number" + }, + "limit": { + "type": "number" + }, + "keys": { + "items": { + "type": "string" + }, + "type": "array" + }, + "action": { + "nullable": true, + "type": "string", + "enum": [ + "challenge", + "deny", + "log", + "rate_limit", + null + ] + } + }, + "required": [ + "algo", + "keys", + "limit", + "window" + ], + "type": "object" + }, + "redirect": { + "nullable": true, + "properties": { + "location": { + "type": "string" + }, + "permanent": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "location", + "permanent" + ], + "type": "object" + }, + "actionDuration": { + "nullable": true, + "type": "string" + }, + "bypassSystem": { + "nullable": true, + "type": "boolean", + "enum": [ + false, + true, + null + ] + }, + "logHeaders": { + "oneOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "string", + "enum": [ + "*" + ] + } + ] + } + }, + "required": [ + "action" + ], + "type": "object" + } + }, + "type": "object" + } + }, + "required": [ + "active", + "conditionGroup", + "id", + "name" + ], + "type": "object" + }, + "type": "array" + }, + { + "additionalProperties": { + "properties": { + "action": { + "type": "string", + "enum": [ + "allow", + "bypass", + "challenge", + "deny", + "log", + "rate_limit", + "redirect" + ] + }, + "rateLimit": { + "nullable": true, + "properties": { + "algo": { + "type": "string", + "enum": [ + "fixed_window", + "token_bucket" + ] + }, + "window": { + "type": "number" + }, + "limit": { + "type": "number" + }, + "keys": { + "items": { + "type": "string" + }, + "type": "array" + }, + "action": { + "nullable": true, + "type": "string", + "enum": [ + "challenge", + "deny", + "log", + "rate_limit", + null + ] + } + }, + "required": [ + "algo", + "keys", + "limit", + "window" + ], + "type": "object" + }, + "redirect": { + "nullable": true, + "properties": { + "location": { + "type": "string" + }, + "permanent": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "location", + "permanent" + ], + "type": "object" + }, + "actionDuration": { + "nullable": true, + "type": "string" + }, + "bypassSystem": { + "nullable": true, + "type": "boolean", + "enum": [ + false, + true, + null + ] + }, + "logHeaders": { + "oneOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "string", + "enum": [ + "*" + ] + } + ] + } + }, + "required": [ + "action" + ], + "type": "object" + }, + "type": "object" + } + ] + }, + "conditions": { + "items": { + "properties": { + "description": { + "type": "string" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "conditionGroup": { + "items": { + "properties": { + "conditions": { + "items": { + "properties": { + "type": { + "type": "string", + "enum": [ + "bot_category", + "bot_name", + "bot_protection", + "bot_status", + "cookie", + "domain_environment", + "environment", + "geo_as_number", + "geo_city", + "geo_continent", + "geo_country", + "geo_country_region", + "header", + "host", + "ip_address", + "ja3_digest", + "ja4_digest", + "method", + "path", + "protocol", + "query", + "rate_limit_api_id", + "raw_path", + "region", + "route", + "ruleset", + "scheme", + "server_action", + "shared_condition", + "target_path", + "traffic_source", + "trusted_source", + "user_agent" + ] + }, + "op": { + "type": "string", + "enum": [ + "eq", + "ex", + "gt", + "gte", + "inc", + "list", + "lt", + "lte", + "neq", + "nex", + "ninc", + "pre", + "re", + "sub", + "suf" + ] + }, + "neg": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "key": { + "type": "string" + }, + "value": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "items": { + "type": "string" + }, + "type": "array" + } + ] + } + }, + "required": [ + "op", + "type" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "conditions" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "active", + "conditionGroup", + "id", + "name" + ], + "type": "object" + }, + "type": "array" + }, + "changes": { + "items": { + "type": "object" + }, + "type": "array" + }, + "managedRules": { + "properties": { + "bot_protection": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "challenge", + "deny", + "log" + ] + }, + "updatedAt": { + "type": "string" + }, + "userId": { + "type": "string" + }, + "username": { + "type": "string" + } + }, + "required": [ + "active" + ], + "type": "object" + }, + "ai_bots": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "challenge", + "deny", + "log" + ] + }, + "updatedAt": { + "type": "string" + }, + "userId": { + "type": "string" + }, + "username": { + "type": "string" + } + }, + "required": [ + "active" + ], + "type": "object" + }, + "owasp": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "challenge", + "deny", + "log" + ] + }, + "updatedAt": { + "type": "string" + }, + "userId": { + "type": "string" + }, + "username": { + "type": "string" + } + }, + "required": [ + "active" + ], + "type": "object" + }, + "vercel_ruleset": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "challenge", + "deny", + "log" + ] + }, + "updatedAt": { + "type": "string" + }, + "userId": { + "type": "string" + }, + "username": { + "type": "string" + } + }, + "required": [ + "active" + ], + "type": "object" + }, + "traffic_sources": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "challenge", + "deny", + "log" + ] + }, + "updatedAt": { + "type": "string" + }, + "userId": { + "type": "string" + }, + "username": { + "type": "string" + } + }, + "required": [ + "active" + ], + "type": "object" + } + }, + "type": "object" + }, + "botIdEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "logHeaders": { + "oneOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "string", + "enum": [ + "*" + ] + } + ] + } + }, + "required": [ + "changes", + "firewallEnabled", + "id", + "ips", + "ownerId", + "projectKey", + "rules", + "updatedAt", + "version" + ], + "type": "object" + }, + "versions": { + "items": { + "properties": { + "ownerId": { + "type": "string" + }, + "projectKey": { + "type": "string" + }, + "id": { + "type": "string" + }, + "version": { + "type": "number" + }, + "updatedAt": { + "type": "string" + }, + "firewallEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "crs": { + "properties": { + "sd": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "deny", + "log" + ] + } + }, + "required": [ + "action", + "active" + ], + "type": "object" + }, + "ma": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "deny", + "log" + ] + } + }, + "required": [ + "action", + "active" + ], + "type": "object" + }, + "lfi": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "deny", + "log" + ] + } + }, + "required": [ + "action", + "active" + ], + "type": "object" + }, + "rfi": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "deny", + "log" + ] + } + }, + "required": [ + "action", + "active" + ], + "type": "object" + }, + "rce": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "deny", + "log" + ] + } + }, + "required": [ + "action", + "active" + ], + "type": "object" + }, + "php": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "deny", + "log" + ] + } + }, + "required": [ + "action", + "active" + ], + "type": "object" + }, + "gen": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "deny", + "log" + ] + } + }, + "required": [ + "action", + "active" + ], + "type": "object" + }, + "xss": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "deny", + "log" + ] + } + }, + "required": [ + "action", + "active" + ], + "type": "object" + }, + "sqli": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "deny", + "log" + ] + } + }, + "required": [ + "action", + "active" + ], + "type": "object" + }, + "sf": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "deny", + "log" + ] + } + }, + "required": [ + "action", + "active" + ], + "type": "object" + }, + "java": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "deny", + "log" + ] + } + }, + "required": [ + "action", + "active" + ], + "type": "object" + } + }, + "required": [ + "gen", + "java", + "lfi", + "ma", + "php", + "rce", + "rfi", + "sd", + "sf", + "sqli", + "xss" + ], + "type": "object" + }, + "rules": { + "items": { + "oneOf": [ + { + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "conditionGroup": { + "items": { + "properties": { + "conditions": { + "items": { + "properties": { + "type": { + "type": "string", + "enum": [ + "bot_category", + "bot_name", + "bot_protection", + "bot_status", + "cookie", + "domain_environment", + "environment", + "geo_as_number", + "geo_city", + "geo_continent", + "geo_country", + "geo_country_region", + "header", + "host", + "ip_address", + "ja3_digest", + "ja4_digest", + "method", + "path", + "protocol", + "query", + "rate_limit_api_id", + "raw_path", + "region", + "route", + "ruleset", + "scheme", + "server_action", + "shared_condition", + "target_path", + "traffic_source", + "trusted_source", + "user_agent" + ] + }, + "op": { + "type": "string", + "enum": [ + "eq", + "ex", + "gt", + "gte", + "inc", + "list", + "lt", + "lte", + "neq", + "nex", + "ninc", + "pre", + "re", + "sub", + "suf" + ] + }, + "neg": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "key": { + "type": "string" + }, + "value": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "items": { + "type": "string" + }, + "type": "array" + } + ] + } + }, + "required": [ + "op", + "type" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "conditions" + ], + "type": "object" + }, + "type": "array" + }, + "action": { + "properties": { + "mitigate": { + "properties": { + "action": { + "type": "string", + "enum": [ + "allow", + "bypass", + "challenge", + "deny", + "log", + "rate_limit", + "redirect" + ] + }, + "rateLimit": { + "nullable": true, + "properties": { + "algo": { + "type": "string", + "enum": [ + "fixed_window", + "token_bucket" + ] + }, + "window": { + "type": "number" + }, + "limit": { + "type": "number" + }, + "keys": { + "items": { + "type": "string" + }, + "type": "array" + }, + "action": { + "nullable": true, + "type": "string", + "enum": [ + "challenge", + "deny", + "log", + "rate_limit", + null + ] + } + }, + "required": [ + "algo", + "keys", + "limit", + "window" + ], + "type": "object" + }, + "redirect": { + "nullable": true, + "properties": { + "location": { + "type": "string" + }, + "permanent": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "location", + "permanent" + ], + "type": "object" + }, + "actionDuration": { + "nullable": true, + "type": "string" + }, + "bypassSystem": { + "nullable": true, + "type": "boolean", + "enum": [ + false, + true, + null + ] + }, + "logHeaders": { + "oneOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "string", + "enum": [ + "*" + ] + } + ] + } + }, + "required": [ + "action" + ], + "type": "object" + } + }, + "type": "object" + }, + "valid": { + "type": "boolean", + "enum": [ + true + ] + }, + "validationErrors": { + "nullable": true + } + }, + "required": [ + "action", + "active", + "conditionGroup", + "id", + "name", + "valid", + "validationErrors" + ], + "type": "object" + }, + { + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "conditionGroup": { + "items": { + "properties": { + "conditions": { + "items": { + "properties": { + "type": { + "type": "string", + "enum": [ + "bot_category", + "bot_name", + "bot_protection", + "bot_status", + "cookie", + "domain_environment", + "environment", + "geo_as_number", + "geo_city", + "geo_continent", + "geo_country", + "geo_country_region", + "header", + "host", + "ip_address", + "ja3_digest", + "ja4_digest", + "method", + "path", + "protocol", + "query", + "rate_limit_api_id", + "raw_path", + "region", + "route", + "ruleset", + "scheme", + "server_action", + "shared_condition", + "target_path", + "traffic_source", + "trusted_source", + "user_agent" + ] + }, + "op": { + "type": "string", + "enum": [ + "eq", + "ex", + "gt", + "gte", + "inc", + "list", + "lt", + "lte", + "neq", + "nex", + "ninc", + "pre", + "re", + "sub", + "suf" + ] + }, + "neg": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "key": { + "type": "string" + }, + "value": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "items": { + "type": "string" + }, + "type": "array" + } + ] + } + }, + "required": [ + "op", + "type" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "conditions" + ], + "type": "object" + }, + "type": "array" + }, + "action": { + "properties": { + "mitigate": { + "properties": { + "action": { + "type": "string", + "enum": [ + "allow", + "bypass", + "challenge", + "deny", + "log", + "rate_limit", + "redirect" + ] + }, + "rateLimit": { + "nullable": true, + "properties": { + "algo": { + "type": "string", + "enum": [ + "fixed_window", + "token_bucket" + ] + }, + "window": { + "type": "number" + }, + "limit": { + "type": "number" + }, + "keys": { + "items": { + "type": "string" + }, + "type": "array" + }, + "action": { + "nullable": true, + "type": "string", + "enum": [ + "challenge", + "deny", + "log", + "rate_limit", + null + ] + } + }, + "required": [ + "algo", + "keys", + "limit", + "window" + ], + "type": "object" + }, + "redirect": { + "nullable": true, + "properties": { + "location": { + "type": "string" + }, + "permanent": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "location", + "permanent" + ], + "type": "object" + }, + "actionDuration": { + "nullable": true, + "type": "string" + }, + "bypassSystem": { + "nullable": true, + "type": "boolean", + "enum": [ + false, + true, + null + ] + }, + "logHeaders": { + "oneOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "string", + "enum": [ + "*" + ] + } + ] + } + }, + "required": [ + "action" + ], + "type": "object" + } + }, + "type": "object" + }, + "valid": { + "type": "boolean", + "enum": [ + false + ] + }, + "validationErrors": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "action", + "active", + "conditionGroup", + "id", + "name", + "valid", + "validationErrors" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "ips": { + "items": { + "properties": { + "id": { + "type": "string" + }, + "hostname": { + "type": "string" + }, + "ip": { + "type": "string" + }, + "notes": { + "type": "string" + }, + "action": { + "type": "string", + "enum": [ + "bypass", + "challenge", + "deny", + "log" + ] + } + }, + "required": [ + "action", + "hostname", + "id", + "ip" + ], + "type": "object" + }, + "type": "array" + }, + "rulesets": { + "oneOf": [ + { + "items": { + "properties": { + "description": { + "type": "string" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "conditionGroup": { + "items": { + "properties": { + "conditions": { + "items": { + "properties": { + "type": { + "type": "string", + "enum": [ + "bot_category", + "bot_name", + "bot_protection", + "bot_status", + "cookie", + "domain_environment", + "environment", + "geo_as_number", + "geo_city", + "geo_continent", + "geo_country", + "geo_country_region", + "header", + "host", + "ip_address", + "ja3_digest", + "ja4_digest", + "method", + "path", + "protocol", + "query", + "rate_limit_api_id", + "raw_path", + "region", + "route", + "ruleset", + "scheme", + "server_action", + "shared_condition", + "target_path", + "traffic_source", + "trusted_source", + "user_agent" + ] + }, + "op": { + "type": "string", + "enum": [ + "eq", + "ex", + "gt", + "gte", + "inc", + "list", + "lt", + "lte", + "neq", + "nex", + "ninc", + "pre", + "re", + "sub", + "suf" + ] + }, + "neg": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "key": { + "type": "string" + }, + "value": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "items": { + "type": "string" + }, + "type": "array" + } + ] + } + }, + "required": [ + "op", + "type" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "conditions" + ], + "type": "object" + }, + "type": "array" + }, + "action": { + "properties": { + "mitigate": { + "properties": { + "action": { + "type": "string", + "enum": [ + "allow", + "bypass", + "challenge", + "deny", + "log", + "rate_limit", + "redirect" + ] + }, + "rateLimit": { + "nullable": true, + "properties": { + "algo": { + "type": "string", + "enum": [ + "fixed_window", + "token_bucket" + ] + }, + "window": { + "type": "number" + }, + "limit": { + "type": "number" + }, + "keys": { + "items": { + "type": "string" + }, + "type": "array" + }, + "action": { + "nullable": true, + "type": "string", + "enum": [ + "challenge", + "deny", + "log", + "rate_limit", + null + ] + } + }, + "required": [ + "algo", + "keys", + "limit", + "window" + ], + "type": "object" + }, + "redirect": { + "nullable": true, + "properties": { + "location": { + "type": "string" + }, + "permanent": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "location", + "permanent" + ], + "type": "object" + }, + "actionDuration": { + "nullable": true, + "type": "string" + }, + "bypassSystem": { + "nullable": true, + "type": "boolean", + "enum": [ + false, + true, + null + ] + }, + "logHeaders": { + "oneOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "string", + "enum": [ + "*" + ] + } + ] + } + }, + "required": [ + "action" + ], + "type": "object" + } + }, + "type": "object" + } + }, + "required": [ + "active", + "conditionGroup", + "id", + "name" + ], + "type": "object" + }, + "type": "array" + }, + { + "additionalProperties": { + "properties": { + "action": { + "type": "string", + "enum": [ + "allow", + "bypass", + "challenge", + "deny", + "log", + "rate_limit", + "redirect" + ] + }, + "rateLimit": { + "nullable": true, + "properties": { + "algo": { + "type": "string", + "enum": [ + "fixed_window", + "token_bucket" + ] + }, + "window": { + "type": "number" + }, + "limit": { + "type": "number" + }, + "keys": { + "items": { + "type": "string" + }, + "type": "array" + }, + "action": { + "nullable": true, + "type": "string", + "enum": [ + "challenge", + "deny", + "log", + "rate_limit", + null + ] + } + }, + "required": [ + "algo", + "keys", + "limit", + "window" + ], + "type": "object" + }, + "redirect": { + "nullable": true, + "properties": { + "location": { + "type": "string" + }, + "permanent": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "location", + "permanent" + ], + "type": "object" + }, + "actionDuration": { + "nullable": true, + "type": "string" + }, + "bypassSystem": { + "nullable": true, + "type": "boolean", + "enum": [ + false, + true, + null + ] + }, + "logHeaders": { + "oneOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "string", + "enum": [ + "*" + ] + } + ] + } + }, + "required": [ + "action" + ], + "type": "object" + }, + "type": "object" + } + ] + }, + "conditions": { + "items": { + "properties": { + "description": { + "type": "string" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "conditionGroup": { + "items": { + "properties": { + "conditions": { + "items": { + "properties": { + "type": { + "type": "string", + "enum": [ + "bot_category", + "bot_name", + "bot_protection", + "bot_status", + "cookie", + "domain_environment", + "environment", + "geo_as_number", + "geo_city", + "geo_continent", + "geo_country", + "geo_country_region", + "header", + "host", + "ip_address", + "ja3_digest", + "ja4_digest", + "method", + "path", + "protocol", + "query", + "rate_limit_api_id", + "raw_path", + "region", + "route", + "ruleset", + "scheme", + "server_action", + "shared_condition", + "target_path", + "traffic_source", + "trusted_source", + "user_agent" + ] + }, + "op": { + "type": "string", + "enum": [ + "eq", + "ex", + "gt", + "gte", + "inc", + "list", + "lt", + "lte", + "neq", + "nex", + "ninc", + "pre", + "re", + "sub", + "suf" + ] + }, + "neg": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "key": { + "type": "string" + }, + "value": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "items": { + "type": "string" + }, + "type": "array" + } + ] + } + }, + "required": [ + "op", + "type" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "conditions" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "active", + "conditionGroup", + "id", + "name" + ], + "type": "object" + }, + "type": "array" + }, + "changes": { + "items": { + "type": "object" + }, + "type": "array" + }, + "managedRules": { + "properties": { + "bot_protection": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "challenge", + "deny", + "log" + ] + }, + "updatedAt": { + "type": "string" + }, + "userId": { + "type": "string" + }, + "username": { + "type": "string" + } + }, + "required": [ + "active" + ], + "type": "object" + }, + "ai_bots": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "challenge", + "deny", + "log" + ] + }, + "updatedAt": { + "type": "string" + }, + "userId": { + "type": "string" + }, + "username": { + "type": "string" + } + }, + "required": [ + "active" + ], + "type": "object" + }, + "owasp": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "challenge", + "deny", + "log" + ] + }, + "updatedAt": { + "type": "string" + }, + "userId": { + "type": "string" + }, + "username": { + "type": "string" + } + }, + "required": [ + "active" + ], + "type": "object" + }, + "vercel_ruleset": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "challenge", + "deny", + "log" + ] + }, + "updatedAt": { + "type": "string" + }, + "userId": { + "type": "string" + }, + "username": { + "type": "string" + } + }, + "required": [ + "active" + ], + "type": "object" + }, + "traffic_sources": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "challenge", + "deny", + "log" + ] + }, + "updatedAt": { + "type": "string" + }, + "userId": { + "type": "string" + }, + "username": { + "type": "string" + } + }, + "required": [ + "active" + ], + "type": "object" + } + }, + "type": "object" + }, + "botIdEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "logHeaders": { + "oneOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "string", + "enum": [ + "*" + ] + } + ] + } + }, + "required": [ + "changes", + "firewallEnabled", + "id", + "ips", + "ownerId", + "projectKey", + "rules", + "updatedAt", + "version" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "active", + "draft", + "versions" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "" + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [] + }, + "put": { + "description": "Set the firewall configuration to provided rules and settings. Creates or overwrite the existing firewall configuration.", + "operationId": "putFirewallConfig", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Put Firewall Configuration", + "tags": [ + "security" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "active": { + "properties": { + "ownerId": { + "type": "string" + }, + "projectKey": { + "type": "string" + }, + "id": { + "type": "string" + }, + "version": { + "type": "number" + }, + "updatedAt": { + "type": "string" + }, + "firewallEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "crs": { + "properties": { + "sd": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "deny", + "log" + ] + } + }, + "required": [ + "action", + "active" + ], + "type": "object", + "description": "Scanner Detection - Detect and prevent reconnaissance activities from network scanning tools." + }, + "ma": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "deny", + "log" + ] + } + }, + "required": [ + "action", + "active" + ], + "type": "object", + "description": "Multipart Attack - Block attempts to bypass security controls using multipart/form-data encoding." + }, + "lfi": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "deny", + "log" + ] + } + }, + "required": [ + "action", + "active" + ], + "type": "object", + "description": "Local File Inclusion Attack - Prevent unauthorized access to local files through web applications." + }, + "rfi": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "deny", + "log" + ] + } + }, + "required": [ + "action", + "active" + ], + "type": "object", + "description": "Remote File Inclusion Attack - Prohibit unauthorized upload or execution of remote files." + }, + "rce": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "deny", + "log" + ] + } + }, + "required": [ + "action", + "active" + ], + "type": "object", + "description": "Remote Execution Attack - Prevent unauthorized execution of remote scripts or commands." + }, + "php": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "deny", + "log" + ] + } + }, + "required": [ + "action", + "active" + ], + "type": "object", + "description": "PHP Attack - Safeguard against vulnerability exploits in PHP-based applications." + }, + "gen": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "deny", + "log" + ] + } + }, + "required": [ + "action", + "active" + ], + "type": "object", + "description": "Generic Attack - Provide broad protection from various undefined or novel attack vectors." + }, + "xss": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "deny", + "log" + ] + } + }, + "required": [ + "action", + "active" + ], + "type": "object", + "description": "XSS Attack - Prevent injection of malicious scripts into trusted webpages." + }, + "sqli": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "deny", + "log" + ] + } + }, + "required": [ + "action", + "active" + ], + "type": "object", + "description": "SQL Injection Attack - Prohibit unauthorized use of SQL commands to manipulate databases." + }, + "sf": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "deny", + "log" + ] + } + }, + "required": [ + "action", + "active" + ], + "type": "object", + "description": "Session Fixation Attack - Prevent unauthorized takeover of user sessions by enforcing unique session IDs." + }, + "java": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "deny", + "log" + ] + } + }, + "required": [ + "action", + "active" + ], + "type": "object", + "description": "Java Attack - Mitigate risks of exploitation targeting Java-based applications or components." + } + }, + "required": [ + "gen", + "java", + "lfi", + "ma", + "php", + "rce", + "rfi", + "sd", + "sf", + "sqli", + "xss" + ], + "type": "object", + "description": "Custom Ruleset" + }, + "rules": { + "items": { + "oneOf": [ + { + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "conditionGroup": { + "items": { + "properties": { + "conditions": { + "items": { + "properties": { + "type": { + "type": "string", + "enum": [ + "bot_category", + "bot_name", + "bot_protection", + "bot_status", + "cookie", + "domain_environment", + "environment", + "geo_as_number", + "geo_city", + "geo_continent", + "geo_country", + "geo_country_region", + "header", + "host", + "ip_address", + "ja3_digest", + "ja4_digest", + "method", + "path", + "protocol", + "query", + "rate_limit_api_id", + "raw_path", + "region", + "route", + "ruleset", + "scheme", + "server_action", + "shared_condition", + "target_path", + "traffic_source", + "trusted_source", + "user_agent" + ] + }, + "op": { + "type": "string", + "enum": [ + "eq", + "ex", + "gt", + "gte", + "inc", + "list", + "lt", + "lte", + "neq", + "nex", + "ninc", + "pre", + "re", + "sub", + "suf" + ] + }, + "neg": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "key": { + "type": "string" + }, + "value": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "items": { + "type": "string" + }, + "type": "array" + } + ] + } + }, + "required": [ + "op", + "type" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "conditions" + ], + "type": "object" + }, + "type": "array" + }, + "action": { + "properties": { + "mitigate": { + "properties": { + "action": { + "type": "string", + "enum": [ + "allow", + "bypass", + "challenge", + "deny", + "log", + "rate_limit", + "redirect" + ] + }, + "rateLimit": { + "nullable": true, + "properties": { + "algo": { + "type": "string", + "enum": [ + "fixed_window", + "token_bucket" + ] + }, + "window": { + "type": "number" + }, + "limit": { + "type": "number" + }, + "keys": { + "items": { + "type": "string" + }, + "type": "array" + }, + "action": { + "nullable": true, + "type": "string", + "enum": [ + "challenge", + "deny", + "log", + "rate_limit", + null + ] + } + }, + "required": [ + "algo", + "keys", + "limit", + "window" + ], + "type": "object" + }, + "redirect": { + "nullable": true, + "properties": { + "location": { + "type": "string" + }, + "permanent": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "location", + "permanent" + ], + "type": "object" + }, + "actionDuration": { + "nullable": true, + "type": "string" + }, + "bypassSystem": { + "nullable": true, + "type": "boolean", + "enum": [ + false, + true, + null + ] + }, + "logHeaders": { + "oneOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "string", + "enum": [ + "*" + ] + } + ] + } + }, + "required": [ + "action" + ], + "type": "object" + } + }, + "type": "object" + }, + "valid": { + "type": "boolean", + "enum": [ + true + ] + }, + "validationErrors": { + "nullable": true + } + }, + "required": [ + "action", + "active", + "conditionGroup", + "id", + "name", + "valid", + "validationErrors" + ], + "type": "object" + }, + { + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "conditionGroup": { + "items": { + "properties": { + "conditions": { + "items": { + "properties": { + "type": { + "type": "string", + "enum": [ + "bot_category", + "bot_name", + "bot_protection", + "bot_status", + "cookie", + "domain_environment", + "environment", + "geo_as_number", + "geo_city", + "geo_continent", + "geo_country", + "geo_country_region", + "header", + "host", + "ip_address", + "ja3_digest", + "ja4_digest", + "method", + "path", + "protocol", + "query", + "rate_limit_api_id", + "raw_path", + "region", + "route", + "ruleset", + "scheme", + "server_action", + "shared_condition", + "target_path", + "traffic_source", + "trusted_source", + "user_agent" + ] + }, + "op": { + "type": "string", + "enum": [ + "eq", + "ex", + "gt", + "gte", + "inc", + "list", + "lt", + "lte", + "neq", + "nex", + "ninc", + "pre", + "re", + "sub", + "suf" + ] + }, + "neg": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "key": { + "type": "string" + }, + "value": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "items": { + "type": "string" + }, + "type": "array" + } + ] + } + }, + "required": [ + "op", + "type" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "conditions" + ], + "type": "object" + }, + "type": "array" + }, + "action": { + "properties": { + "mitigate": { + "properties": { + "action": { + "type": "string", + "enum": [ + "allow", + "bypass", + "challenge", + "deny", + "log", + "rate_limit", + "redirect" + ] + }, + "rateLimit": { + "nullable": true, + "properties": { + "algo": { + "type": "string", + "enum": [ + "fixed_window", + "token_bucket" + ] + }, + "window": { + "type": "number" + }, + "limit": { + "type": "number" + }, + "keys": { + "items": { + "type": "string" + }, + "type": "array" + }, + "action": { + "nullable": true, + "type": "string", + "enum": [ + "challenge", + "deny", + "log", + "rate_limit", + null + ] + } + }, + "required": [ + "algo", + "keys", + "limit", + "window" + ], + "type": "object" + }, + "redirect": { + "nullable": true, + "properties": { + "location": { + "type": "string" + }, + "permanent": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "location", + "permanent" + ], + "type": "object" + }, + "actionDuration": { + "nullable": true, + "type": "string" + }, + "bypassSystem": { + "nullable": true, + "type": "boolean", + "enum": [ + false, + true, + null + ] + }, + "logHeaders": { + "oneOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "string", + "enum": [ + "*" + ] + } + ] + } + }, + "required": [ + "action" + ], + "type": "object" + } + }, + "type": "object" + }, + "valid": { + "type": "boolean", + "enum": [ + false + ] + }, + "validationErrors": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "action", + "active", + "conditionGroup", + "id", + "name", + "valid", + "validationErrors" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "ips": { + "items": { + "properties": { + "id": { + "type": "string" + }, + "hostname": { + "type": "string" + }, + "ip": { + "type": "string" + }, + "notes": { + "type": "string" + }, + "action": { + "type": "string", + "enum": [ + "bypass", + "challenge", + "deny", + "log" + ] + } + }, + "required": [ + "action", + "hostname", + "id", + "ip" + ], + "type": "object" + }, + "type": "array" + }, + "rulesets": { + "oneOf": [ + { + "items": { + "properties": { + "description": { + "type": "string" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "conditionGroup": { + "items": { + "properties": { + "conditions": { + "items": { + "properties": { + "type": { + "type": "string", + "enum": [ + "bot_category", + "bot_name", + "bot_protection", + "bot_status", + "cookie", + "domain_environment", + "environment", + "geo_as_number", + "geo_city", + "geo_continent", + "geo_country", + "geo_country_region", + "header", + "host", + "ip_address", + "ja3_digest", + "ja4_digest", + "method", + "path", + "protocol", + "query", + "rate_limit_api_id", + "raw_path", + "region", + "route", + "ruleset", + "scheme", + "server_action", + "shared_condition", + "target_path", + "traffic_source", + "trusted_source", + "user_agent" + ] + }, + "op": { + "type": "string", + "enum": [ + "eq", + "ex", + "gt", + "gte", + "inc", + "list", + "lt", + "lte", + "neq", + "nex", + "ninc", + "pre", + "re", + "sub", + "suf" + ] + }, + "neg": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "key": { + "type": "string" + }, + "value": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "items": { + "type": "string" + }, + "type": "array" + } + ] + } + }, + "required": [ + "op", + "type" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "conditions" + ], + "type": "object" + }, + "type": "array" + }, + "action": { + "properties": { + "mitigate": { + "properties": { + "action": { + "type": "string", + "enum": [ + "allow", + "bypass", + "challenge", + "deny", + "log", + "rate_limit", + "redirect" + ] + }, + "rateLimit": { + "nullable": true, + "properties": { + "algo": { + "type": "string", + "enum": [ + "fixed_window", + "token_bucket" + ] + }, + "window": { + "type": "number" + }, + "limit": { + "type": "number" + }, + "keys": { + "items": { + "type": "string" + }, + "type": "array" + }, + "action": { + "nullable": true, + "type": "string", + "enum": [ + "challenge", + "deny", + "log", + "rate_limit", + null + ] + } + }, + "required": [ + "algo", + "keys", + "limit", + "window" + ], + "type": "object" + }, + "redirect": { + "nullable": true, + "properties": { + "location": { + "type": "string" + }, + "permanent": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "location", + "permanent" + ], + "type": "object" + }, + "actionDuration": { + "nullable": true, + "type": "string" + }, + "bypassSystem": { + "nullable": true, + "type": "boolean", + "enum": [ + false, + true, + null + ] + }, + "logHeaders": { + "oneOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "string", + "enum": [ + "*" + ] + } + ] + } + }, + "required": [ + "action" + ], + "type": "object" + } + }, + "type": "object" + } + }, + "required": [ + "active", + "conditionGroup", + "id", + "name" + ], + "type": "object" + }, + "type": "array" + }, + { + "additionalProperties": { + "properties": { + "action": { + "type": "string", + "enum": [ + "allow", + "bypass", + "challenge", + "deny", + "log", + "rate_limit", + "redirect" + ] + }, + "rateLimit": { + "nullable": true, + "properties": { + "algo": { + "type": "string", + "enum": [ + "fixed_window", + "token_bucket" + ] + }, + "window": { + "type": "number" + }, + "limit": { + "type": "number" + }, + "keys": { + "items": { + "type": "string" + }, + "type": "array" + }, + "action": { + "nullable": true, + "type": "string", + "enum": [ + "challenge", + "deny", + "log", + "rate_limit", + null + ] + } + }, + "required": [ + "algo", + "keys", + "limit", + "window" + ], + "type": "object" + }, + "redirect": { + "nullable": true, + "properties": { + "location": { + "type": "string" + }, + "permanent": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "location", + "permanent" + ], + "type": "object" + }, + "actionDuration": { + "nullable": true, + "type": "string" + }, + "bypassSystem": { + "nullable": true, + "type": "boolean", + "enum": [ + false, + true, + null + ] + }, + "logHeaders": { + "oneOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "string", + "enum": [ + "*" + ] + } + ] + } + }, + "required": [ + "action" + ], + "type": "object" + }, + "type": "object" + } + ] + }, + "conditions": { + "items": { + "properties": { + "description": { + "type": "string" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "conditionGroup": { + "items": { + "properties": { + "conditions": { + "items": { + "properties": { + "type": { + "type": "string", + "enum": [ + "bot_category", + "bot_name", + "bot_protection", + "bot_status", + "cookie", + "domain_environment", + "environment", + "geo_as_number", + "geo_city", + "geo_continent", + "geo_country", + "geo_country_region", + "header", + "host", + "ip_address", + "ja3_digest", + "ja4_digest", + "method", + "path", + "protocol", + "query", + "rate_limit_api_id", + "raw_path", + "region", + "route", + "ruleset", + "scheme", + "server_action", + "shared_condition", + "target_path", + "traffic_source", + "trusted_source", + "user_agent" + ] + }, + "op": { + "type": "string", + "enum": [ + "eq", + "ex", + "gt", + "gte", + "inc", + "list", + "lt", + "lte", + "neq", + "nex", + "ninc", + "pre", + "re", + "sub", + "suf" + ] + }, + "neg": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "key": { + "type": "string" + }, + "value": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "items": { + "type": "string" + }, + "type": "array" + } + ] + } + }, + "required": [ + "op", + "type" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "conditions" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "active", + "conditionGroup", + "id", + "name" + ], + "type": "object" + }, + "type": "array" + }, + "changes": { + "items": { + "type": "object" + }, + "type": "array" + }, + "managedRules": { + "properties": { + "bot_protection": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "challenge", + "deny", + "log" + ] + }, + "updatedAt": { + "type": "string" + }, + "userId": { + "type": "string" + }, + "username": { + "type": "string" + } + }, + "required": [ + "active" + ], + "type": "object" + }, + "ai_bots": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "challenge", + "deny", + "log" + ] + }, + "updatedAt": { + "type": "string" + }, + "userId": { + "type": "string" + }, + "username": { + "type": "string" + } + }, + "required": [ + "active" + ], + "type": "object" + }, + "owasp": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "challenge", + "deny", + "log" + ] + }, + "updatedAt": { + "type": "string" + }, + "userId": { + "type": "string" + }, + "username": { + "type": "string" + } + }, + "required": [ + "active" + ], + "type": "object" + }, + "vercel_ruleset": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "challenge", + "deny", + "log" + ] + }, + "updatedAt": { + "type": "string" + }, + "userId": { + "type": "string" + }, + "username": { + "type": "string" + } + }, + "required": [ + "active" + ], + "type": "object" + }, + "traffic_sources": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "challenge", + "deny", + "log" + ] + }, + "updatedAt": { + "type": "string" + }, + "userId": { + "type": "string" + }, + "username": { + "type": "string" + } + }, + "required": [ + "active" + ], + "type": "object" + } + }, + "type": "object" + }, + "botIdEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "logHeaders": { + "oneOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "string", + "enum": [ + "*" + ] + } + ] + } + }, + "required": [ + "changes", + "firewallEnabled", + "id", + "ips", + "ownerId", + "projectKey", + "rules", + "updatedAt", + "version" + ], + "type": "object" + } + }, + "required": [ + "active" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid.\nOne of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "402": { + "description": "" + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + }, + "500": { + "description": "" + } + }, + "parameters": [ + { + "name": "projectId", + "in": "query", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "firewallEnabled": { + "type": "boolean" + }, + "managedRules": { + "type": "object" + }, + "crs": { + "type": "object", + "properties": { + "sd": { + "type": "object", + "properties": { + "active": { + "type": "boolean" + }, + "action": { + "type": "string", + "enum": [ + "deny", + "log" + ] + } + }, + "required": [ + "active", + "action" + ], + "additionalProperties": false, + "description": "Scanner Detection - Detect and prevent reconnaissance activities from network scanning tools." + }, + "ma": { + "type": "object", + "properties": { + "active": { + "type": "boolean" + }, + "action": { + "type": "string", + "enum": [ + "deny", + "log" + ] + } + }, + "required": [ + "active", + "action" + ], + "additionalProperties": false, + "description": "Multipart Attack - Block attempts to bypass security controls using multipart/form-data encoding." + }, + "lfi": { + "type": "object", + "properties": { + "active": { + "type": "boolean" + }, + "action": { + "type": "string", + "enum": [ + "deny", + "log" + ] + } + }, + "required": [ + "active", + "action" + ], + "additionalProperties": false, + "description": "Local File Inclusion Attack - Prevent unauthorized access to local files through web applications." + }, + "rfi": { + "type": "object", + "properties": { + "active": { + "type": "boolean" + }, + "action": { + "type": "string", + "enum": [ + "deny", + "log" + ] + } + }, + "required": [ + "active", + "action" + ], + "additionalProperties": false, + "description": "Remote File Inclusion Attack - Prohibit unauthorized upload or execution of remote files." + }, + "rce": { + "type": "object", + "properties": { + "active": { + "type": "boolean" + }, + "action": { + "type": "string", + "enum": [ + "deny", + "log" + ] + } + }, + "required": [ + "active", + "action" + ], + "additionalProperties": false, + "description": "Remote Execution Attack - Prevent unauthorized execution of remote scripts or commands." + }, + "php": { + "type": "object", + "properties": { + "active": { + "type": "boolean" + }, + "action": { + "type": "string", + "enum": [ + "deny", + "log" + ] + } + }, + "required": [ + "active", + "action" + ], + "additionalProperties": false, + "description": "PHP Attack - Safeguard against vulnerability exploits in PHP-based applications." + }, + "gen": { + "type": "object", + "properties": { + "active": { + "type": "boolean" + }, + "action": { + "type": "string", + "enum": [ + "deny", + "log" + ] + } + }, + "required": [ + "active", + "action" + ], + "additionalProperties": false, + "description": "Generic Attack - Provide broad protection from various undefined or novel attack vectors." + }, + "xss": { + "type": "object", + "properties": { + "active": { + "type": "boolean" + }, + "action": { + "type": "string", + "enum": [ + "deny", + "log" + ] + } + }, + "required": [ + "active", + "action" + ], + "additionalProperties": false, + "description": "XSS Attack - Prevent injection of malicious scripts into trusted webpages." + }, + "sqli": { + "type": "object", + "properties": { + "active": { + "type": "boolean" + }, + "action": { + "type": "string", + "enum": [ + "deny", + "log" + ] + } + }, + "required": [ + "active", + "action" + ], + "additionalProperties": false, + "description": "SQL Injection Attack - Prohibit unauthorized use of SQL commands to manipulate databases." + }, + "sf": { + "type": "object", + "properties": { + "active": { + "type": "boolean" + }, + "action": { + "type": "string", + "enum": [ + "deny", + "log" + ] + } + }, + "required": [ + "active", + "action" + ], + "additionalProperties": false, + "description": "Session Fixation Attack - Prevent unauthorized takeover of user sessions by enforcing unique session IDs." + }, + "java": { + "type": "object", + "properties": { + "active": { + "type": "boolean" + }, + "action": { + "type": "string", + "enum": [ + "deny", + "log" + ] + } + }, + "required": [ + "active", + "action" + ], + "additionalProperties": false, + "description": "Java Attack - Mitigate risks of exploitation targeting Java-based applications or components." + } + }, + "additionalProperties": false, + "description": "Custom Ruleset" + }, + "rules": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string", + "maxLength": 160 + }, + "description": { + "type": "string", + "maxLength": 256 + }, + "active": { + "type": "boolean" + }, + "conditionGroup": { + "type": "array", + "items": { + "type": "object", + "properties": { + "conditions": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "host", + "path", + "method", + "header", + "query", + "cookie", + "target_path", + "route", + "raw_path", + "ip_address", + "region", + "protocol", + "scheme", + "environment", + "domain_environment", + "user_agent", + "geo_continent", + "geo_country", + "geo_country_region", + "geo_city", + "geo_as_number", + "ja4_digest", + "ja3_digest", + "rate_limit_api_id", + "server_action", + "bot_name", + "bot_category", + "bot_status", + "bot_protection", + "shared_condition", + "traffic_source", + "ruleset" + ], + "description": "[Parameter](https://vercel.com/docs/security/vercel-waf/rule-configuration#parameters) from the incoming traffic." + }, + "op": { + "type": "string", + "enum": [ + "re", + "eq", + "neq", + "ex", + "nex", + "inc", + "ninc", + "pre", + "suf", + "sub", + "gt", + "gte", + "lt", + "lte", + "list" + ] + }, + "neg": { + "type": "boolean" + }, + "key": { + "type": "string" + }, + "value": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "array", + "items": { + "type": "string" + }, + "maxItems": 75 + }, + { + "type": "number" + } + ] + } + }, + "required": [ + "type", + "op" + ], + "additionalProperties": false + }, + "maxItems": 65 + } + }, + "required": [ + "conditions" + ], + "additionalProperties": false + }, + "maxItems": 25 + }, + "action": { + "type": "object", + "properties": { + "mitigate": { + "type": "object", + "properties": { + "action": { + "type": "string", + "enum": [ + "log", + "challenge", + "deny", + "bypass", + "rate_limit", + "redirect" + ] + }, + "rateLimit": { + "anyOf": [ + { + "type": "object", + "properties": { + "algo": { + "type": "string", + "enum": [ + "fixed_window", + "token_bucket" + ] + }, + "window": { + "type": "number" + }, + "limit": { + "type": "number" + }, + "keys": { + "type": "array", + "items": { + "type": "string" + } + }, + "action": { + "anyOf": [ + { + "type": "string", + "enum": [ + "log", + "challenge", + "deny", + "rate_limit" + ] + }, + {} + ], + "nullable": true + } + }, + "required": [ + "algo", + "window", + "limit", + "keys" + ], + "additionalProperties": false + }, + {} + ], + "nullable": true + }, + "redirect": { + "anyOf": [ + { + "type": "object", + "properties": { + "location": { + "type": "string" + }, + "permanent": { + "type": "boolean" + } + }, + "required": [ + "location", + "permanent" + ], + "additionalProperties": false + }, + {} + ], + "nullable": true + }, + "actionDuration": { + "type": "string", + "nullable": true + }, + "bypassSystem": { + "type": "boolean", + "nullable": true + }, + "logHeaders": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "array", + "items": { + "type": "string" + } + } + ] + } + }, + "required": [ + "action" + ], + "additionalProperties": false + } + }, + "additionalProperties": false + }, + "valid": { + "type": "boolean" + }, + "validationErrors": { + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "string" + } + ] + } + }, + "required": [ + "name", + "active", + "conditionGroup", + "action" + ], + "additionalProperties": false + } + }, + "rulesets": { + "anyOf": [ + { + "type": "array", + "maxItems": 25, + "items": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string", + "maxLength": 160 + }, + "description": { + "type": "string", + "maxLength": 256 + }, + "active": { + "type": "boolean" + }, + "conditionGroup": { + "type": "array", + "items": { + "type": "object", + "properties": { + "conditions": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "host", + "path", + "method", + "header", + "query", + "cookie", + "target_path", + "route", + "raw_path", + "ip_address", + "region", + "protocol", + "scheme", + "environment", + "domain_environment", + "user_agent", + "geo_continent", + "geo_country", + "geo_country_region", + "geo_city", + "geo_as_number", + "ja4_digest", + "ja3_digest", + "rate_limit_api_id", + "server_action", + "bot_name", + "bot_category", + "bot_status", + "bot_protection", + "shared_condition", + "traffic_source", + "ruleset" + ] + }, + "op": { + "type": "string", + "enum": [ + "re", + "eq", + "neq", + "ex", + "nex", + "inc", + "ninc", + "pre", + "suf", + "sub", + "gt", + "gte", + "lt", + "lte", + "list" + ] + }, + "neg": { + "type": "boolean" + }, + "key": { + "type": "string" + }, + "value": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "array", + "items": { + "type": "string" + }, + "maxItems": 75 + }, + { + "type": "number" + } + ] + } + }, + "required": [ + "type", + "op" + ], + "additionalProperties": false + }, + "maxItems": 65 + } + }, + "required": [ + "conditions" + ], + "additionalProperties": false + }, + "maxItems": 25 + }, + "action": { + "type": "object", + "properties": { + "mitigate": { + "type": "object", + "properties": { + "action": { + "type": "string", + "enum": [ + "deny", + "challenge", + "log" + ] + } + }, + "required": [ + "action" + ], + "additionalProperties": false + } + }, + "additionalProperties": false + }, + "valid": { + "type": "boolean" + }, + "validationErrors": { + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "string" + } + ] + } + }, + "required": [ + "name", + "active", + "conditionGroup" + ], + "additionalProperties": false + } + }, + { + "type": "object", + "maxProperties": 25, + "additionalProperties": { + "type": "object", + "properties": { + "action": { + "type": "string", + "enum": [ + "deny", + "challenge", + "log", + "allow" + ] + } + }, + "required": [ + "action" + ], + "additionalProperties": false + } + } + ] + }, + "ips": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "hostname": { + "type": "string" + }, + "ip": { + "type": "string" + }, + "notes": { + "type": "string" + }, + "action": { + "type": "string", + "enum": [ + "deny", + "challenge", + "log", + "bypass" + ] + } + }, + "required": [ + "hostname", + "ip", + "action" + ], + "additionalProperties": false + } + }, + "botIdEnabled": { + "type": "boolean" + }, + "logHeaders": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "array", + "items": { + "type": "string" + } + } + ] + } + }, + "required": [ + "firewallEnabled" + ], + "additionalProperties": false + } + } + }, + "required": true + } + }, + "patch": { + "description": "Process updates to modify the existing firewall config for a project", + "operationId": "updateFirewallConfig", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Update Firewall Configuration", + "tags": [ + "security" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid.\nOne of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "402": { + "description": "" + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + }, + "500": { + "description": "" + } + }, + "parameters": [ + { + "name": "projectId", + "in": "query", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "oneOf": [ + { + "description": "Add a ruleset", + "type": "object", + "properties": { + "action": { + "type": "string", + "enum": [ + "firewallEnabled" + ] + }, + "id": { + "nullable": true + }, + "value": { + "type": "object", + "properties": { + "name": { + "type": "string", + "maxLength": 160 + }, + "description": { + "type": "string", + "maxLength": 256 + }, + "active": { + "type": "boolean" + }, + "conditionGroup": { + "type": "array", + "items": { + "type": "object", + "properties": { + "conditions": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "host", + "path", + "method", + "header", + "query", + "cookie", + "target_path", + "route", + "raw_path", + "ip_address", + "region", + "protocol", + "scheme", + "environment", + "domain_environment", + "user_agent", + "geo_continent", + "geo_country", + "geo_country_region", + "geo_city", + "geo_as_number", + "ja4_digest", + "ja3_digest", + "rate_limit_api_id", + "server_action", + "bot_name", + "bot_category", + "bot_status", + "bot_protection", + "shared_condition", + "traffic_source", + "ruleset" + ] + }, + "op": { + "type": "string", + "enum": [ + "re", + "eq", + "neq", + "ex", + "nex", + "inc", + "ninc", + "pre", + "suf", + "sub", + "gt", + "gte", + "lt", + "lte", + "list" + ] + }, + "neg": { + "type": "boolean" + }, + "key": { + "type": "string" + }, + "value": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "array", + "items": { + "type": "string" + }, + "maxItems": 75 + }, + { + "type": "number" + } + ] + } + }, + "required": [ + "type", + "op" + ], + "additionalProperties": false + }, + "maxItems": 65 + } + }, + "required": [ + "conditions" + ], + "additionalProperties": false + }, + "maxItems": 25 + }, + "action": { + "type": "object", + "properties": { + "mitigate": { + "type": "object", + "properties": { + "action": { + "type": "string", + "enum": [ + "deny", + "challenge", + "log" + ] + } + }, + "required": [ + "action" + ], + "additionalProperties": false + } + }, + "additionalProperties": false + }, + "valid": { + "type": "boolean" + }, + "validationErrors": { + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "string" + } + ] + } + }, + "required": [ + "name", + "active", + "conditionGroup" + ], + "additionalProperties": false + } + }, + "required": [ + "action", + "value" + ], + "additionalProperties": false + }, + { + "description": "Update a ruleset", + "type": "object", + "properties": { + "action": { + "type": "string", + "enum": [ + "rules.insert" + ] + }, + "id": { + "nullable": true + }, + "value": { + "type": "object", + "properties": { + "name": { + "type": "string", + "maxLength": 160 + }, + "description": { + "type": "string", + "maxLength": 256 + }, + "active": { + "type": "boolean" + }, + "conditionGroup": { + "type": "array", + "items": { + "type": "object", + "properties": { + "conditions": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "host", + "path", + "method", + "header", + "query", + "cookie", + "target_path", + "route", + "raw_path", + "ip_address", + "region", + "protocol", + "scheme", + "environment", + "domain_environment", + "user_agent", + "geo_continent", + "geo_country", + "geo_country_region", + "geo_city", + "geo_as_number", + "ja4_digest", + "ja3_digest", + "rate_limit_api_id", + "server_action", + "bot_name", + "bot_category", + "bot_status", + "bot_protection", + "shared_condition", + "traffic_source", + "ruleset" + ] + }, + "op": { + "type": "string", + "enum": [ + "re", + "eq", + "neq", + "ex", + "nex", + "inc", + "ninc", + "pre", + "suf", + "sub", + "gt", + "gte", + "lt", + "lte", + "list" + ] + }, + "neg": { + "type": "boolean" + }, + "key": { + "type": "string" + }, + "value": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "array", + "items": { + "type": "string" + }, + "maxItems": 75 + }, + { + "type": "number" + } + ] + } + }, + "required": [ + "type", + "op" + ], + "additionalProperties": false + }, + "maxItems": 65 + } + }, + "required": [ + "conditions" + ], + "additionalProperties": false + }, + "maxItems": 25 + }, + "action": { + "type": "object", + "properties": { + "mitigate": { + "type": "object", + "properties": { + "action": { + "type": "string", + "enum": [ + "deny", + "challenge", + "log" + ] + } + }, + "required": [ + "action" + ], + "additionalProperties": false + } + }, + "additionalProperties": false + }, + "valid": { + "type": "boolean" + }, + "validationErrors": { + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "string" + } + ] + } + }, + "required": [ + "name", + "active", + "conditionGroup" + ], + "additionalProperties": false + } + }, + "required": [ + "action", + "id", + "value" + ], + "additionalProperties": false + }, + { + "description": "Remove a ruleset", + "type": "object", + "properties": { + "action": { + "type": "string", + "enum": [ + "rules.update" + ] + }, + "id": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "required": [ + "action", + "id" + ], + "additionalProperties": false + }, + { + "description": "Reorder a ruleset", + "type": "object", + "properties": { + "action": { + "type": "string", + "enum": [ + "rules.remove" + ] + }, + "id": { + "type": "string" + }, + "value": { + "nullable": true + } + }, + "required": [ + "action", + "id", + "value" + ], + "additionalProperties": false + }, + { + "description": "Add a named condition", + "type": "object", + "properties": { + "action": { + "type": "string", + "enum": [ + "rules.priority" + ] + }, + "id": { + "type": "string" + }, + "value": { + "type": "object", + "properties": { + "name": { + "type": "string", + "maxLength": 160 + }, + "description": { + "type": "string", + "maxLength": 256 + }, + "active": { + "type": "boolean" + }, + "conditionGroup": { + "type": "array", + "items": { + "type": "object", + "properties": { + "conditions": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "host", + "path", + "method", + "header", + "query", + "cookie", + "target_path", + "route", + "raw_path", + "ip_address", + "region", + "protocol", + "scheme", + "environment", + "domain_environment", + "user_agent", + "geo_continent", + "geo_country", + "geo_country_region", + "geo_city", + "geo_as_number", + "ja4_digest", + "ja3_digest", + "rate_limit_api_id", + "server_action", + "bot_name", + "bot_category", + "bot_status", + "bot_protection", + "shared_condition", + "traffic_source", + "ruleset" + ] + }, + "op": { + "type": "string", + "enum": [ + "re", + "eq", + "neq", + "ex", + "nex", + "inc", + "ninc", + "pre", + "suf", + "sub", + "gt", + "gte", + "lt", + "lte", + "list" + ] + }, + "neg": { + "type": "boolean" + }, + "key": { + "type": "string" + }, + "value": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "array", + "items": { + "type": "string" + }, + "maxItems": 75 + }, + { + "type": "number" + } + ] + } + }, + "required": [ + "type", + "op" + ], + "additionalProperties": false + }, + "maxItems": 65 + } + }, + "required": [ + "conditions" + ], + "additionalProperties": false + }, + "maxItems": 25 + }, + "valid": { + "type": "boolean" + }, + "validationErrors": { + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "string" + } + ] + } + }, + "required": [ + "name", + "active", + "conditionGroup" + ], + "additionalProperties": false + } + }, + "required": [ + "action", + "value" + ], + "additionalProperties": false + }, + { + "description": "Update a named condition", + "type": "object", + "properties": { + "action": { + "type": "string", + "enum": [ + "crs.update" + ] + }, + "id": { + "type": "string" + }, + "value": { + "type": "object", + "properties": { + "name": { + "type": "string", + "maxLength": 160 + }, + "description": { + "type": "string", + "maxLength": 256 + }, + "active": { + "type": "boolean" + }, + "conditionGroup": { + "type": "array", + "items": { + "type": "object", + "properties": { + "conditions": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "host", + "path", + "method", + "header", + "query", + "cookie", + "target_path", + "route", + "raw_path", + "ip_address", + "region", + "protocol", + "scheme", + "environment", + "domain_environment", + "user_agent", + "geo_continent", + "geo_country", + "geo_country_region", + "geo_city", + "geo_as_number", + "ja4_digest", + "ja3_digest", + "rate_limit_api_id", + "server_action", + "bot_name", + "bot_category", + "bot_status", + "bot_protection", + "shared_condition", + "traffic_source", + "ruleset" + ] + }, + "op": { + "type": "string", + "enum": [ + "re", + "eq", + "neq", + "ex", + "nex", + "inc", + "ninc", + "pre", + "suf", + "sub", + "gt", + "gte", + "lt", + "lte", + "list" + ] + }, + "neg": { + "type": "boolean" + }, + "key": { + "type": "string" + }, + "value": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "array", + "items": { + "type": "string" + }, + "maxItems": 75 + }, + { + "type": "number" + } + ] + } + }, + "required": [ + "type", + "op" + ], + "additionalProperties": false + }, + "maxItems": 65 + } + }, + "required": [ + "conditions" + ], + "additionalProperties": false + }, + "maxItems": 25 + }, + "valid": { + "type": "boolean" + }, + "validationErrors": { + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "string" + } + ] + } + }, + "required": [ + "name", + "active", + "conditionGroup" + ], + "additionalProperties": false + } + }, + "required": [ + "action", + "id", + "value" + ], + "additionalProperties": false + }, + { + "description": "Remove a named condition", + "type": "object", + "properties": { + "action": { + "type": "string", + "enum": [ + "crs.disable" + ] + }, + "id": { + "nullable": true + }, + "value": { + "nullable": true + } + }, + "required": [ + "action", + "id" + ], + "additionalProperties": false + }, + { + "description": "Set the action for a consumed ruleset (project scope)", + "type": "object", + "properties": { + "action": { + "type": "string", + "enum": [ + "ip.insert" + ] + }, + "id": { + "maxLength": 180, + "nullable": true + }, + "value": { + "type": "object", + "properties": { + "action": { + "type": "string", + "enum": [ + "deny", + "challenge", + "log", + "allow" + ] + } + }, + "required": [ + "action" + ], + "additionalProperties": false + } + }, + "required": [ + "action", + "id", + "value" + ], + "additionalProperties": false + }, + { + "description": "Remove the action for a consumed ruleset (project scope)", + "type": "object", + "properties": { + "action": { + "type": "string", + "enum": [ + "ip.update" + ] + }, + "id": { + "type": "string", + "maxLength": 180 + }, + "value": { + "type": "string" + } + }, + "required": [ + "action", + "id" + ], + "additionalProperties": false + }, + { + "description": "Enable Firewall", + "type": "object", + "properties": { + "action": { + "type": "string", + "enum": [ + "ip.remove" + ] + }, + "id": { + "type": "string" + }, + "value": { + "nullable": true + } + }, + "required": [ + "action", + "value" + ], + "additionalProperties": false + }, + { + "description": "Add a custom rule", + "type": "object", + "properties": { + "action": { + "type": "string", + "enum": [ + "managedRules.update" + ] + }, + "id": { + "type": "string" + }, + "value": { + "type": "object", + "properties": { + "name": { + "type": "string", + "maxLength": 160 + }, + "description": { + "type": "string", + "maxLength": 256 + }, + "active": { + "type": "boolean" + }, + "conditionGroup": { + "type": "array", + "items": { + "type": "object", + "properties": { + "conditions": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "host", + "path", + "method", + "header", + "query", + "cookie", + "target_path", + "route", + "raw_path", + "ip_address", + "region", + "protocol", + "scheme", + "environment", + "domain_environment", + "user_agent", + "geo_continent", + "geo_country", + "geo_country_region", + "geo_city", + "geo_as_number", + "ja4_digest", + "ja3_digest", + "rate_limit_api_id", + "server_action", + "bot_name", + "bot_category", + "bot_status", + "bot_protection", + "shared_condition", + "traffic_source", + "ruleset" + ] + }, + "op": { + "type": "string", + "enum": [ + "re", + "eq", + "neq", + "ex", + "nex", + "inc", + "ninc", + "pre", + "suf", + "sub", + "gt", + "gte", + "lt", + "lte", + "list" + ] + }, + "neg": { + "type": "boolean" + }, + "key": { + "type": "string" + }, + "value": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "array", + "items": { + "type": "string" + }, + "maxItems": 75 + }, + { + "type": "number" + } + ] + } + }, + "required": [ + "type", + "op" + ], + "additionalProperties": false + }, + "maxItems": 65 + } + }, + "required": [ + "conditions" + ], + "additionalProperties": false + }, + "maxItems": 25 + }, + "action": { + "type": "object", + "properties": { + "mitigate": { + "type": "object", + "properties": { + "action": { + "type": "string", + "enum": [ + "log", + "challenge", + "deny", + "bypass", + "rate_limit", + "redirect" + ] + }, + "rateLimit": { + "anyOf": [ + { + "type": "object", + "properties": { + "algo": { + "type": "string", + "enum": [ + "fixed_window", + "token_bucket" + ] + }, + "window": { + "type": "number" + }, + "limit": { + "type": "number" + }, + "keys": { + "type": "array", + "items": { + "type": "string" + } + }, + "action": { + "anyOf": [ + { + "type": "string", + "enum": [ + "log", + "challenge", + "deny", + "rate_limit" + ] + }, + { + "type": "string" + } + ] + } + }, + "required": [ + "algo", + "window", + "limit", + "keys" + ], + "additionalProperties": false + }, + { + "type": "string" + } + ] + }, + "redirect": { + "anyOf": [ + { + "type": "object", + "properties": { + "location": { + "type": "string" + }, + "permanent": { + "type": "boolean" + } + }, + "required": [ + "location", + "permanent" + ], + "additionalProperties": false + }, + { + "type": "string" + } + ] + }, + "actionDuration": { + "type": "string", + "nullable": true + }, + "bypassSystem": { + "type": "boolean", + "nullable": true + }, + "logHeaders": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "array", + "items": { + "type": "string" + } + } + ] + } + }, + "required": [ + "action" + ], + "additionalProperties": false + } + }, + "additionalProperties": false + }, + "valid": { + "type": "boolean" + }, + "validationErrors": { + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "string" + } + ] + } + }, + "required": [ + "name", + "active", + "conditionGroup", + "action" + ], + "additionalProperties": false + } + }, + "required": [ + "action", + "value" + ], + "additionalProperties": false + }, + { + "description": "Update a custom rule", + "type": "object", + "properties": { + "action": { + "type": "string" + }, + "id": { + "type": "string" + }, + "value": { + "type": "object", + "properties": { + "name": { + "type": "string", + "maxLength": 160 + }, + "description": { + "type": "string", + "maxLength": 256 + }, + "active": { + "type": "boolean" + }, + "conditionGroup": { + "type": "array", + "items": { + "type": "object", + "properties": { + "conditions": { + "type": "array", + "items": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "host", + "path", + "method", + "header", + "query", + "cookie", + "target_path", + "route", + "raw_path", + "ip_address", + "region", + "protocol", + "scheme", + "environment", + "domain_environment", + "user_agent", + "geo_continent", + "geo_country", + "geo_country_region", + "geo_city", + "geo_as_number", + "ja4_digest", + "ja3_digest", + "rate_limit_api_id", + "server_action", + "bot_name", + "bot_category", + "bot_status", + "bot_protection", + "shared_condition", + "traffic_source", + "ruleset" + ] + }, + "op": { + "type": "string", + "enum": [ + "re", + "eq", + "neq", + "ex", + "nex", + "inc", + "ninc", + "pre", + "suf", + "sub", + "gt", + "gte", + "lt", + "lte", + "list" + ] + }, + "neg": { + "type": "boolean" + }, + "key": { + "type": "string" + }, + "value": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "array", + "items": { + "type": "string" + }, + "maxItems": 75 + }, + { + "type": "number" + } + ] + } + }, + "required": [ + "type", + "op" + ], + "additionalProperties": false + }, + "maxItems": 65 + } + }, + "required": [ + "conditions" + ], + "additionalProperties": false + }, + "maxItems": 25 + }, + "action": { + "type": "object", + "properties": { + "mitigate": { + "type": "object", + "properties": { + "action": { + "type": "string", + "enum": [ + "log", + "challenge", + "deny", + "bypass", + "rate_limit", + "redirect" + ] + }, + "rateLimit": { + "anyOf": [ + { + "type": "object", + "properties": { + "algo": { + "type": "string", + "enum": [ + "fixed_window", + "token_bucket" + ] + }, + "window": { + "type": "number" + }, + "limit": { + "type": "number" + }, + "keys": { + "type": "array", + "items": { + "type": "string" + } + }, + "action": { + "anyOf": [ + { + "type": "string", + "enum": [ + "log", + "challenge", + "deny", + "rate_limit" + ] + }, + { + "type": "string" + } + ] + } + }, + "required": [ + "algo", + "window", + "limit", + "keys" + ], + "additionalProperties": false + }, + { + "type": "string" + } + ] + }, + "redirect": { + "anyOf": [ + { + "type": "object", + "properties": { + "location": { + "type": "string" + }, + "permanent": { + "type": "boolean" + } + }, + "required": [ + "location", + "permanent" + ], + "additionalProperties": false + }, + { + "type": "string" + } + ] + }, + "actionDuration": { + "type": "string", + "nullable": true + }, + "bypassSystem": { + "type": "boolean", + "nullable": true + }, + "logHeaders": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "array", + "items": { + "type": "string" + } + } + ] + } + }, + "required": [ + "action" + ], + "additionalProperties": false + } + }, + "additionalProperties": false + }, + "valid": { + "type": "boolean" + }, + "validationErrors": { + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "string" + } + ] + } + }, + "required": [ + "name", + "active", + "conditionGroup", + "action" + ], + "additionalProperties": false + } + }, + "required": [ + "action", + "id", + "value" + ], + "additionalProperties": false + }, + { + "description": "Remove a custom rule", + "type": "object", + "properties": { + "action": { + "type": "string" + }, + "id": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "required": [ + "action", + "id" + ], + "additionalProperties": false + }, + { + "description": "Reorder a custom rule", + "type": "object", + "properties": { + "action": { + "type": "string" + }, + "id": { + "type": "string" + }, + "value": { + "type": "number" + } + }, + "required": [ + "action", + "id", + "value" + ], + "additionalProperties": false + }, + { + "description": "Enable a managed rule", + "type": "object", + "properties": { + "action": { + "type": "string" + }, + "id": { + "type": "string", + "enum": [ + "sd", + "ma", + "lfi", + "rfi", + "rce", + "php", + "gen", + "xss", + "sqli", + "sf", + "java" + ] + }, + "value": { + "type": "object", + "properties": { + "active": { + "type": "boolean" + }, + "action": { + "type": "string", + "enum": [ + "deny", + "log" + ] + } + }, + "required": [ + "active", + "action" + ], + "additionalProperties": false + } + }, + "required": [ + "action", + "id", + "value" + ], + "additionalProperties": false + }, + { + "description": "Disable a managed rule", + "type": "object", + "properties": { + "action": { + "type": "string" + }, + "id": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "required": [ + "action" + ], + "additionalProperties": false + }, + { + "description": "Add an IP Blocking rule", + "type": "object", + "properties": { + "action": { + "type": "string" + }, + "id": { + "type": "string" + }, + "value": { + "type": "object", + "properties": { + "hostname": { + "type": "string" + }, + "ip": { + "type": "string" + }, + "notes": { + "type": "string" + }, + "action": { + "type": "string", + "enum": [ + "deny", + "challenge", + "log", + "bypass" + ] + } + }, + "required": [ + "hostname", + "ip", + "action" + ], + "additionalProperties": false + } + }, + "required": [ + "action", + "value" + ], + "additionalProperties": false + }, + { + "description": "Update an IP Blocking rule", + "type": "object", + "properties": { + "action": { + "type": "string" + }, + "id": { + "type": "string" + }, + "value": { + "type": "object", + "properties": { + "hostname": { + "type": "string" + }, + "ip": { + "type": "string" + }, + "notes": { + "type": "string" + }, + "action": { + "type": "string", + "enum": [ + "deny", + "challenge", + "log", + "bypass" + ] + } + }, + "required": [ + "hostname", + "ip", + "action" + ], + "additionalProperties": false + } + }, + "required": [ + "action", + "id", + "value" + ], + "additionalProperties": false + }, + { + "description": "Remove an IP Blocking rule", + "type": "object", + "properties": { + "action": { + "type": "string" + }, + "id": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "required": [ + "action", + "id" + ], + "additionalProperties": false + }, + { + "description": "Update a managed ruleset", + "type": "object", + "properties": { + "action": { + "type": "string" + }, + "id": { + "type": "string", + "enum": [ + "ai_bots", + "bot_filter", + "bot_protection", + "traffic_sources", + "vercel_ruleset", + "owasp" + ] + }, + "value": { + "type": "object", + "properties": { + "action": { + "type": "string", + "enum": [ + "log", + "challenge", + "deny" + ] + }, + "active": { + "type": "boolean" + } + }, + "required": [ + "active" + ], + "additionalProperties": false + } + }, + "required": [ + "action", + "id", + "value" + ], + "additionalProperties": false + }, + { + "description": "Update a managed rule group", + "type": "object", + "properties": { + "action": { + "type": "string" + }, + "id": { + "type": "string", + "enum": [ + "ai_bots", + "bot_filter", + "bot_protection", + "traffic_sources", + "vercel_ruleset", + "owasp" + ] + }, + "value": { + "type": "object", + "additionalProperties": { + "type": "object", + "properties": { + "active": { + "type": "boolean" + }, + "action": { + "type": "string", + "enum": [ + "log", + "challenge", + "deny" + ] + } + }, + "required": [ + "active" + ], + "additionalProperties": false + } + } + }, + "required": [ + "action", + "id", + "value" + ], + "additionalProperties": false + }, + { + "description": "Toggle bot ID", + "type": "object", + "properties": { + "action": { + "type": "string" + }, + "id": { + "type": "string" + }, + "value": { + "type": "boolean" + } + }, + "required": [ + "action", + "value" + ], + "additionalProperties": false + }, + { + "description": "Update log headers configuration", + "type": "object", + "properties": { + "action": { + "type": "string" + }, + "id": { + "type": "string" + }, + "value": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "string" + } + ] + } + }, + "required": [ + "action", + "value" + ], + "additionalProperties": false + } + ] + } + } + }, + "required": true + } + } + }, + "/v1/security/firewall/config/{configVersion}": { + "get": { + "description": "Retrieve the specified firewall configuration for a project. The deployed configVersion will be `active`", + "operationId": "getFirewallConfig", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Read Firewall Configuration", + "tags": [ + "security" + ], + "responses": { + "200": { + "description": "If the firewall configuration includes a [custom managed ruleset](https://vercel.com/docs/security/vercel-waf/managed-rulesets), it will include a `crs` item that has the following values: sd: Scanner Detection ma: Multipart Attack lfi: Local File Inclusion Attack rfi: Remote File Inclusion Attack rce: Remote Execution Attack php: PHP Attack gen: Generic Attack xss: XSS Attack sqli: SQL Injection Attack sf: Session Fixation Attack java: Java Attack", + "content": { + "application/json": { + "schema": { + "properties": { + "ownerId": { + "type": "string" + }, + "projectKey": { + "type": "string" + }, + "id": { + "type": "string" + }, + "version": { + "type": "number" + }, + "updatedAt": { + "type": "string" + }, + "firewallEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "crs": { + "properties": { + "sd": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "deny", + "log" + ] + } + }, + "required": [ + "action", + "active" + ], + "type": "object", + "description": "Scanner Detection - Detect and prevent reconnaissance activities from network scanning tools." + }, + "ma": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "deny", + "log" + ] + } + }, + "required": [ + "action", + "active" + ], + "type": "object", + "description": "Multipart Attack - Block attempts to bypass security controls using multipart/form-data encoding." + }, + "lfi": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "deny", + "log" + ] + } + }, + "required": [ + "action", + "active" + ], + "type": "object", + "description": "Local File Inclusion Attack - Prevent unauthorized access to local files through web applications." + }, + "rfi": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "deny", + "log" + ] + } + }, + "required": [ + "action", + "active" + ], + "type": "object", + "description": "Remote File Inclusion Attack - Prohibit unauthorized upload or execution of remote files." + }, + "rce": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "deny", + "log" + ] + } + }, + "required": [ + "action", + "active" + ], + "type": "object", + "description": "Remote Execution Attack - Prevent unauthorized execution of remote scripts or commands." + }, + "php": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "deny", + "log" + ] + } + }, + "required": [ + "action", + "active" + ], + "type": "object", + "description": "PHP Attack - Safeguard against vulnerability exploits in PHP-based applications." + }, + "gen": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "deny", + "log" + ] + } + }, + "required": [ + "action", + "active" + ], + "type": "object", + "description": "Generic Attack - Provide broad protection from various undefined or novel attack vectors." + }, + "xss": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "deny", + "log" + ] + } + }, + "required": [ + "action", + "active" + ], + "type": "object", + "description": "XSS Attack - Prevent injection of malicious scripts into trusted webpages." + }, + "sqli": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "deny", + "log" + ] + } + }, + "required": [ + "action", + "active" + ], + "type": "object", + "description": "SQL Injection Attack - Prohibit unauthorized use of SQL commands to manipulate databases." + }, + "sf": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "deny", + "log" + ] + } + }, + "required": [ + "action", + "active" + ], + "type": "object", + "description": "Session Fixation Attack - Prevent unauthorized takeover of user sessions by enforcing unique session IDs." + }, + "java": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "deny", + "log" + ] + } + }, + "required": [ + "action", + "active" + ], + "type": "object", + "description": "Java Attack - Mitigate risks of exploitation targeting Java-based applications or components." + } + }, + "required": [ + "gen", + "java", + "lfi", + "ma", + "php", + "rce", + "rfi", + "sd", + "sf", + "sqli", + "xss" + ], + "type": "object", + "description": "Custom Ruleset" + }, + "rules": { + "items": { + "oneOf": [ + { + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "conditionGroup": { + "items": { + "properties": { + "conditions": { + "items": { + "properties": { + "type": { + "type": "string", + "enum": [ + "bot_category", + "bot_name", + "bot_protection", + "bot_status", + "cookie", + "domain_environment", + "environment", + "geo_as_number", + "geo_city", + "geo_continent", + "geo_country", + "geo_country_region", + "header", + "host", + "ip_address", + "ja3_digest", + "ja4_digest", + "method", + "path", + "protocol", + "query", + "rate_limit_api_id", + "raw_path", + "region", + "route", + "ruleset", + "scheme", + "server_action", + "shared_condition", + "target_path", + "traffic_source", + "trusted_source", + "user_agent" + ] + }, + "op": { + "type": "string", + "enum": [ + "eq", + "ex", + "gt", + "gte", + "inc", + "list", + "lt", + "lte", + "neq", + "nex", + "ninc", + "pre", + "re", + "sub", + "suf" + ] + }, + "neg": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "key": { + "type": "string" + }, + "value": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "items": { + "type": "string" + }, + "type": "array" + } + ] + } + }, + "required": [ + "op", + "type" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "conditions" + ], + "type": "object" + }, + "type": "array" + }, + "action": { + "properties": { + "mitigate": { + "properties": { + "action": { + "type": "string", + "enum": [ + "allow", + "bypass", + "challenge", + "deny", + "log", + "rate_limit", + "redirect" + ] + }, + "rateLimit": { + "nullable": true, + "properties": { + "algo": { + "type": "string", + "enum": [ + "fixed_window", + "token_bucket" + ] + }, + "window": { + "type": "number" + }, + "limit": { + "type": "number" + }, + "keys": { + "items": { + "type": "string" + }, + "type": "array" + }, + "action": { + "nullable": true, + "type": "string", + "enum": [ + "challenge", + "deny", + "log", + "rate_limit", + null + ] + } + }, + "required": [ + "algo", + "keys", + "limit", + "window" + ], + "type": "object" + }, + "redirect": { + "nullable": true, + "properties": { + "location": { + "type": "string" + }, + "permanent": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "location", + "permanent" + ], + "type": "object" + }, + "actionDuration": { + "nullable": true, + "type": "string" + }, + "bypassSystem": { + "nullable": true, + "type": "boolean", + "enum": [ + false, + true, + null + ] + }, + "logHeaders": { + "oneOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "string", + "enum": [ + "*" + ] + } + ] + } + }, + "required": [ + "action" + ], + "type": "object" + } + }, + "type": "object" + }, + "valid": { + "type": "boolean", + "enum": [ + true + ] + }, + "validationErrors": { + "nullable": true + } + }, + "required": [ + "action", + "active", + "conditionGroup", + "id", + "name", + "valid", + "validationErrors" + ], + "type": "object" + }, + { + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "conditionGroup": { + "items": { + "properties": { + "conditions": { + "items": { + "properties": { + "type": { + "type": "string", + "enum": [ + "bot_category", + "bot_name", + "bot_protection", + "bot_status", + "cookie", + "domain_environment", + "environment", + "geo_as_number", + "geo_city", + "geo_continent", + "geo_country", + "geo_country_region", + "header", + "host", + "ip_address", + "ja3_digest", + "ja4_digest", + "method", + "path", + "protocol", + "query", + "rate_limit_api_id", + "raw_path", + "region", + "route", + "ruleset", + "scheme", + "server_action", + "shared_condition", + "target_path", + "traffic_source", + "trusted_source", + "user_agent" + ] + }, + "op": { + "type": "string", + "enum": [ + "eq", + "ex", + "gt", + "gte", + "inc", + "list", + "lt", + "lte", + "neq", + "nex", + "ninc", + "pre", + "re", + "sub", + "suf" + ] + }, + "neg": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "key": { + "type": "string" + }, + "value": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "items": { + "type": "string" + }, + "type": "array" + } + ] + } + }, + "required": [ + "op", + "type" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "conditions" + ], + "type": "object" + }, + "type": "array" + }, + "action": { + "properties": { + "mitigate": { + "properties": { + "action": { + "type": "string", + "enum": [ + "allow", + "bypass", + "challenge", + "deny", + "log", + "rate_limit", + "redirect" + ] + }, + "rateLimit": { + "nullable": true, + "properties": { + "algo": { + "type": "string", + "enum": [ + "fixed_window", + "token_bucket" + ] + }, + "window": { + "type": "number" + }, + "limit": { + "type": "number" + }, + "keys": { + "items": { + "type": "string" + }, + "type": "array" + }, + "action": { + "nullable": true, + "type": "string", + "enum": [ + "challenge", + "deny", + "log", + "rate_limit", + null + ] + } + }, + "required": [ + "algo", + "keys", + "limit", + "window" + ], + "type": "object" + }, + "redirect": { + "nullable": true, + "properties": { + "location": { + "type": "string" + }, + "permanent": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "location", + "permanent" + ], + "type": "object" + }, + "actionDuration": { + "nullable": true, + "type": "string" + }, + "bypassSystem": { + "nullable": true, + "type": "boolean", + "enum": [ + false, + true, + null + ] + }, + "logHeaders": { + "oneOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "string", + "enum": [ + "*" + ] + } + ] + } + }, + "required": [ + "action" + ], + "type": "object" + } + }, + "type": "object" + }, + "valid": { + "type": "boolean", + "enum": [ + false + ] + }, + "validationErrors": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "action", + "active", + "conditionGroup", + "id", + "name", + "valid", + "validationErrors" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "ips": { + "items": { + "properties": { + "id": { + "type": "string" + }, + "hostname": { + "type": "string" + }, + "ip": { + "type": "string" + }, + "notes": { + "type": "string" + }, + "action": { + "type": "string", + "enum": [ + "bypass", + "challenge", + "deny", + "log" + ] + } + }, + "required": [ + "action", + "hostname", + "id", + "ip" + ], + "type": "object" + }, + "type": "array" + }, + "rulesets": { + "oneOf": [ + { + "items": { + "properties": { + "description": { + "type": "string" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "conditionGroup": { + "items": { + "properties": { + "conditions": { + "items": { + "properties": { + "type": { + "type": "string", + "enum": [ + "bot_category", + "bot_name", + "bot_protection", + "bot_status", + "cookie", + "domain_environment", + "environment", + "geo_as_number", + "geo_city", + "geo_continent", + "geo_country", + "geo_country_region", + "header", + "host", + "ip_address", + "ja3_digest", + "ja4_digest", + "method", + "path", + "protocol", + "query", + "rate_limit_api_id", + "raw_path", + "region", + "route", + "ruleset", + "scheme", + "server_action", + "shared_condition", + "target_path", + "traffic_source", + "trusted_source", + "user_agent" + ] + }, + "op": { + "type": "string", + "enum": [ + "eq", + "ex", + "gt", + "gte", + "inc", + "list", + "lt", + "lte", + "neq", + "nex", + "ninc", + "pre", + "re", + "sub", + "suf" + ] + }, + "neg": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "key": { + "type": "string" + }, + "value": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "items": { + "type": "string" + }, + "type": "array" + } + ] + } + }, + "required": [ + "op", + "type" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "conditions" + ], + "type": "object" + }, + "type": "array" + }, + "action": { + "properties": { + "mitigate": { + "properties": { + "action": { + "type": "string", + "enum": [ + "allow", + "bypass", + "challenge", + "deny", + "log", + "rate_limit", + "redirect" + ] + }, + "rateLimit": { + "nullable": true, + "properties": { + "algo": { + "type": "string", + "enum": [ + "fixed_window", + "token_bucket" + ] + }, + "window": { + "type": "number" + }, + "limit": { + "type": "number" + }, + "keys": { + "items": { + "type": "string" + }, + "type": "array" + }, + "action": { + "nullable": true, + "type": "string", + "enum": [ + "challenge", + "deny", + "log", + "rate_limit", + null + ] + } + }, + "required": [ + "algo", + "keys", + "limit", + "window" + ], + "type": "object" + }, + "redirect": { + "nullable": true, + "properties": { + "location": { + "type": "string" + }, + "permanent": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "location", + "permanent" + ], + "type": "object" + }, + "actionDuration": { + "nullable": true, + "type": "string" + }, + "bypassSystem": { + "nullable": true, + "type": "boolean", + "enum": [ + false, + true, + null + ] + }, + "logHeaders": { + "oneOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "string", + "enum": [ + "*" + ] + } + ] + } + }, + "required": [ + "action" + ], + "type": "object" + } + }, + "type": "object" + } + }, + "required": [ + "active", + "conditionGroup", + "id", + "name" + ], + "type": "object" + }, + "type": "array" + }, + { + "additionalProperties": { + "properties": { + "action": { + "type": "string", + "enum": [ + "allow", + "bypass", + "challenge", + "deny", + "log", + "rate_limit", + "redirect" + ] + }, + "rateLimit": { + "nullable": true, + "properties": { + "algo": { + "type": "string", + "enum": [ + "fixed_window", + "token_bucket" + ] + }, + "window": { + "type": "number" + }, + "limit": { + "type": "number" + }, + "keys": { + "items": { + "type": "string" + }, + "type": "array" + }, + "action": { + "nullable": true, + "type": "string", + "enum": [ + "challenge", + "deny", + "log", + "rate_limit", + null + ] + } + }, + "required": [ + "algo", + "keys", + "limit", + "window" + ], + "type": "object" + }, + "redirect": { + "nullable": true, + "properties": { + "location": { + "type": "string" + }, + "permanent": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "location", + "permanent" + ], + "type": "object" + }, + "actionDuration": { + "nullable": true, + "type": "string" + }, + "bypassSystem": { + "nullable": true, + "type": "boolean", + "enum": [ + false, + true, + null + ] + }, + "logHeaders": { + "oneOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "string", + "enum": [ + "*" + ] + } + ] + } + }, + "required": [ + "action" + ], + "type": "object" + }, + "type": "object" + } + ] + }, + "conditions": { + "items": { + "properties": { + "description": { + "type": "string" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "conditionGroup": { + "items": { + "properties": { + "conditions": { + "items": { + "properties": { + "type": { + "type": "string", + "enum": [ + "bot_category", + "bot_name", + "bot_protection", + "bot_status", + "cookie", + "domain_environment", + "environment", + "geo_as_number", + "geo_city", + "geo_continent", + "geo_country", + "geo_country_region", + "header", + "host", + "ip_address", + "ja3_digest", + "ja4_digest", + "method", + "path", + "protocol", + "query", + "rate_limit_api_id", + "raw_path", + "region", + "route", + "ruleset", + "scheme", + "server_action", + "shared_condition", + "target_path", + "traffic_source", + "trusted_source", + "user_agent" + ] + }, + "op": { + "type": "string", + "enum": [ + "eq", + "ex", + "gt", + "gte", + "inc", + "list", + "lt", + "lte", + "neq", + "nex", + "ninc", + "pre", + "re", + "sub", + "suf" + ] + }, + "neg": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "key": { + "type": "string" + }, + "value": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "items": { + "type": "string" + }, + "type": "array" + } + ] + } + }, + "required": [ + "op", + "type" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "conditions" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "active", + "conditionGroup", + "id", + "name" + ], + "type": "object" + }, + "type": "array" + }, + "changes": { + "items": { + "type": "object" + }, + "type": "array" + }, + "managedRules": { + "properties": { + "bot_protection": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "challenge", + "deny", + "log" + ] + }, + "updatedAt": { + "type": "string" + }, + "userId": { + "type": "string" + }, + "username": { + "type": "string" + } + }, + "required": [ + "active" + ], + "type": "object" + }, + "ai_bots": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "challenge", + "deny", + "log" + ] + }, + "updatedAt": { + "type": "string" + }, + "userId": { + "type": "string" + }, + "username": { + "type": "string" + } + }, + "required": [ + "active" + ], + "type": "object" + }, + "owasp": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "challenge", + "deny", + "log" + ] + }, + "updatedAt": { + "type": "string" + }, + "userId": { + "type": "string" + }, + "username": { + "type": "string" + } + }, + "required": [ + "active" + ], + "type": "object" + }, + "vercel_ruleset": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "challenge", + "deny", + "log" + ] + }, + "updatedAt": { + "type": "string" + }, + "userId": { + "type": "string" + }, + "username": { + "type": "string" + } + }, + "required": [ + "active" + ], + "type": "object" + }, + "traffic_sources": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "challenge", + "deny", + "log" + ] + }, + "updatedAt": { + "type": "string" + }, + "userId": { + "type": "string" + }, + "username": { + "type": "string" + } + }, + "required": [ + "active" + ], + "type": "object" + } + }, + "type": "object" + }, + "botIdEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "logHeaders": { + "oneOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "string", + "enum": [ + "*" + ] + } + ] + } + }, + "required": [ + "changes", + "firewallEnabled", + "id", + "ips", + "ownerId", + "projectKey", + "rules", + "updatedAt", + "version" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "projectId", + "in": "query", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + }, + { + "description": "The deployed configVersion for the firewall configuration", + "in": "path", + "name": "configVersion", + "required": true, + "schema": { + "type": "string" + } + } + ] + }, + "delete": { + "description": "Promotes a draft WAF config to an active config", + "operationId": "deleteSecurityFirewallConfigByConfigVersion", + "security": [], + "summary": "Returns activated WAF config", + "tags": [ + "security" + ], + "responses": { + "204": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "string", + "enum": [ + "" + ] + } + } + } + }, + "400": { + "description": "" + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + }, + "500": { + "description": "" + } + }, + "parameters": [ + { + "description": "The deployed configVersion for the firewall configuration", + "in": "path", + "name": "configVersion", + "required": true, + "schema": { + "type": "string" + } + } + ] + } + }, + "/v1/security/firewall/config/{configVersion}/activate": { + "post": { + "description": "Promotes a draft WAF config to an active config", + "operationId": "createSecurityFirewallConfigByConfigVersionActivate", + "security": [], + "summary": "Returns activated WAF config", + "tags": [ + "security" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "ownerId": { + "type": "string" + }, + "projectKey": { + "type": "string" + }, + "id": { + "type": "string" + }, + "version": { + "type": "number" + }, + "updatedAt": { + "type": "string" + }, + "firewallEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "crs": { + "properties": { + "sd": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "deny", + "log" + ] + } + }, + "required": [ + "action", + "active" + ], + "type": "object" + }, + "ma": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "deny", + "log" + ] + } + }, + "required": [ + "action", + "active" + ], + "type": "object" + }, + "lfi": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "deny", + "log" + ] + } + }, + "required": [ + "action", + "active" + ], + "type": "object" + }, + "rfi": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "deny", + "log" + ] + } + }, + "required": [ + "action", + "active" + ], + "type": "object" + }, + "rce": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "deny", + "log" + ] + } + }, + "required": [ + "action", + "active" + ], + "type": "object" + }, + "php": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "deny", + "log" + ] + } + }, + "required": [ + "action", + "active" + ], + "type": "object" + }, + "gen": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "deny", + "log" + ] + } + }, + "required": [ + "action", + "active" + ], + "type": "object" + }, + "xss": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "deny", + "log" + ] + } + }, + "required": [ + "action", + "active" + ], + "type": "object" + }, + "sqli": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "deny", + "log" + ] + } + }, + "required": [ + "action", + "active" + ], + "type": "object" + }, + "sf": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "deny", + "log" + ] + } + }, + "required": [ + "action", + "active" + ], + "type": "object" + }, + "java": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "deny", + "log" + ] + } + }, + "required": [ + "action", + "active" + ], + "type": "object" + } + }, + "required": [ + "gen", + "java", + "lfi", + "ma", + "php", + "rce", + "rfi", + "sd", + "sf", + "sqli", + "xss" + ], + "type": "object" + }, + "rules": { + "items": { + "oneOf": [ + { + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "conditionGroup": { + "items": { + "properties": { + "conditions": { + "items": { + "properties": { + "type": { + "type": "string", + "enum": [ + "bot_category", + "bot_name", + "bot_protection", + "bot_status", + "cookie", + "domain_environment", + "environment", + "geo_as_number", + "geo_city", + "geo_continent", + "geo_country", + "geo_country_region", + "header", + "host", + "ip_address", + "ja3_digest", + "ja4_digest", + "method", + "path", + "protocol", + "query", + "rate_limit_api_id", + "raw_path", + "region", + "route", + "ruleset", + "scheme", + "server_action", + "shared_condition", + "target_path", + "traffic_source", + "trusted_source", + "user_agent" + ] + }, + "op": { + "type": "string", + "enum": [ + "eq", + "ex", + "gt", + "gte", + "inc", + "list", + "lt", + "lte", + "neq", + "nex", + "ninc", + "pre", + "re", + "sub", + "suf" + ] + }, + "neg": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "key": { + "type": "string" + }, + "value": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "items": { + "type": "string" + }, + "type": "array" + } + ] + } + }, + "required": [ + "op", + "type" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "conditions" + ], + "type": "object" + }, + "type": "array" + }, + "action": { + "properties": { + "mitigate": { + "properties": { + "action": { + "type": "string", + "enum": [ + "allow", + "bypass", + "challenge", + "deny", + "log", + "rate_limit", + "redirect" + ] + }, + "rateLimit": { + "nullable": true, + "properties": { + "algo": { + "type": "string", + "enum": [ + "fixed_window", + "token_bucket" + ] + }, + "window": { + "type": "number" + }, + "limit": { + "type": "number" + }, + "keys": { + "items": { + "type": "string" + }, + "type": "array" + }, + "action": { + "nullable": true, + "type": "string", + "enum": [ + "challenge", + "deny", + "log", + "rate_limit", + null + ] + } + }, + "required": [ + "algo", + "keys", + "limit", + "window" + ], + "type": "object" + }, + "redirect": { + "nullable": true, + "properties": { + "location": { + "type": "string" + }, + "permanent": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "location", + "permanent" + ], + "type": "object" + }, + "actionDuration": { + "nullable": true, + "type": "string" + }, + "bypassSystem": { + "nullable": true, + "type": "boolean", + "enum": [ + false, + true, + null + ] + }, + "logHeaders": { + "oneOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "string", + "enum": [ + "*" + ] + } + ] + } + }, + "required": [ + "action" + ], + "type": "object" + } + }, + "type": "object" + }, + "valid": { + "type": "boolean", + "enum": [ + true + ] + }, + "validationErrors": { + "nullable": true + } + }, + "required": [ + "action", + "active", + "conditionGroup", + "id", + "name", + "valid", + "validationErrors" + ], + "type": "object" + }, + { + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "conditionGroup": { + "items": { + "properties": { + "conditions": { + "items": { + "properties": { + "type": { + "type": "string", + "enum": [ + "bot_category", + "bot_name", + "bot_protection", + "bot_status", + "cookie", + "domain_environment", + "environment", + "geo_as_number", + "geo_city", + "geo_continent", + "geo_country", + "geo_country_region", + "header", + "host", + "ip_address", + "ja3_digest", + "ja4_digest", + "method", + "path", + "protocol", + "query", + "rate_limit_api_id", + "raw_path", + "region", + "route", + "ruleset", + "scheme", + "server_action", + "shared_condition", + "target_path", + "traffic_source", + "trusted_source", + "user_agent" + ] + }, + "op": { + "type": "string", + "enum": [ + "eq", + "ex", + "gt", + "gte", + "inc", + "list", + "lt", + "lte", + "neq", + "nex", + "ninc", + "pre", + "re", + "sub", + "suf" + ] + }, + "neg": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "key": { + "type": "string" + }, + "value": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "items": { + "type": "string" + }, + "type": "array" + } + ] + } + }, + "required": [ + "op", + "type" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "conditions" + ], + "type": "object" + }, + "type": "array" + }, + "action": { + "properties": { + "mitigate": { + "properties": { + "action": { + "type": "string", + "enum": [ + "allow", + "bypass", + "challenge", + "deny", + "log", + "rate_limit", + "redirect" + ] + }, + "rateLimit": { + "nullable": true, + "properties": { + "algo": { + "type": "string", + "enum": [ + "fixed_window", + "token_bucket" + ] + }, + "window": { + "type": "number" + }, + "limit": { + "type": "number" + }, + "keys": { + "items": { + "type": "string" + }, + "type": "array" + }, + "action": { + "nullable": true, + "type": "string", + "enum": [ + "challenge", + "deny", + "log", + "rate_limit", + null + ] + } + }, + "required": [ + "algo", + "keys", + "limit", + "window" + ], + "type": "object" + }, + "redirect": { + "nullable": true, + "properties": { + "location": { + "type": "string" + }, + "permanent": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "location", + "permanent" + ], + "type": "object" + }, + "actionDuration": { + "nullable": true, + "type": "string" + }, + "bypassSystem": { + "nullable": true, + "type": "boolean", + "enum": [ + false, + true, + null + ] + }, + "logHeaders": { + "oneOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "string", + "enum": [ + "*" + ] + } + ] + } + }, + "required": [ + "action" + ], + "type": "object" + } + }, + "type": "object" + }, + "valid": { + "type": "boolean", + "enum": [ + false + ] + }, + "validationErrors": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "action", + "active", + "conditionGroup", + "id", + "name", + "valid", + "validationErrors" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "ips": { + "items": { + "properties": { + "id": { + "type": "string" + }, + "hostname": { + "type": "string" + }, + "ip": { + "type": "string" + }, + "notes": { + "type": "string" + }, + "action": { + "type": "string", + "enum": [ + "bypass", + "challenge", + "deny", + "log" + ] + } + }, + "required": [ + "action", + "hostname", + "id", + "ip" + ], + "type": "object" + }, + "type": "array" + }, + "rulesets": { + "oneOf": [ + { + "items": { + "properties": { + "description": { + "type": "string" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "conditionGroup": { + "items": { + "properties": { + "conditions": { + "items": { + "properties": { + "type": { + "type": "string", + "enum": [ + "bot_category", + "bot_name", + "bot_protection", + "bot_status", + "cookie", + "domain_environment", + "environment", + "geo_as_number", + "geo_city", + "geo_continent", + "geo_country", + "geo_country_region", + "header", + "host", + "ip_address", + "ja3_digest", + "ja4_digest", + "method", + "path", + "protocol", + "query", + "rate_limit_api_id", + "raw_path", + "region", + "route", + "ruleset", + "scheme", + "server_action", + "shared_condition", + "target_path", + "traffic_source", + "trusted_source", + "user_agent" + ] + }, + "op": { + "type": "string", + "enum": [ + "eq", + "ex", + "gt", + "gte", + "inc", + "list", + "lt", + "lte", + "neq", + "nex", + "ninc", + "pre", + "re", + "sub", + "suf" + ] + }, + "neg": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "key": { + "type": "string" + }, + "value": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "items": { + "type": "string" + }, + "type": "array" + } + ] + } + }, + "required": [ + "op", + "type" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "conditions" + ], + "type": "object" + }, + "type": "array" + }, + "action": { + "properties": { + "mitigate": { + "properties": { + "action": { + "type": "string", + "enum": [ + "allow", + "bypass", + "challenge", + "deny", + "log", + "rate_limit", + "redirect" + ] + }, + "rateLimit": { + "nullable": true, + "properties": { + "algo": { + "type": "string", + "enum": [ + "fixed_window", + "token_bucket" + ] + }, + "window": { + "type": "number" + }, + "limit": { + "type": "number" + }, + "keys": { + "items": { + "type": "string" + }, + "type": "array" + }, + "action": { + "nullable": true, + "type": "string", + "enum": [ + "challenge", + "deny", + "log", + "rate_limit", + null + ] + } + }, + "required": [ + "algo", + "keys", + "limit", + "window" + ], + "type": "object" + }, + "redirect": { + "nullable": true, + "properties": { + "location": { + "type": "string" + }, + "permanent": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "location", + "permanent" + ], + "type": "object" + }, + "actionDuration": { + "nullable": true, + "type": "string" + }, + "bypassSystem": { + "nullable": true, + "type": "boolean", + "enum": [ + false, + true, + null + ] + }, + "logHeaders": { + "oneOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "string", + "enum": [ + "*" + ] + } + ] + } + }, + "required": [ + "action" + ], + "type": "object" + } + }, + "type": "object" + } + }, + "required": [ + "active", + "conditionGroup", + "id", + "name" + ], + "type": "object" + }, + "type": "array" + }, + { + "additionalProperties": { + "properties": { + "action": { + "type": "string", + "enum": [ + "allow", + "bypass", + "challenge", + "deny", + "log", + "rate_limit", + "redirect" + ] + }, + "rateLimit": { + "nullable": true, + "properties": { + "algo": { + "type": "string", + "enum": [ + "fixed_window", + "token_bucket" + ] + }, + "window": { + "type": "number" + }, + "limit": { + "type": "number" + }, + "keys": { + "items": { + "type": "string" + }, + "type": "array" + }, + "action": { + "nullable": true, + "type": "string", + "enum": [ + "challenge", + "deny", + "log", + "rate_limit", + null + ] + } + }, + "required": [ + "algo", + "keys", + "limit", + "window" + ], + "type": "object" + }, + "redirect": { + "nullable": true, + "properties": { + "location": { + "type": "string" + }, + "permanent": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "location", + "permanent" + ], + "type": "object" + }, + "actionDuration": { + "nullable": true, + "type": "string" + }, + "bypassSystem": { + "nullable": true, + "type": "boolean", + "enum": [ + false, + true, + null + ] + }, + "logHeaders": { + "oneOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "string", + "enum": [ + "*" + ] + } + ] + } + }, + "required": [ + "action" + ], + "type": "object" + }, + "type": "object" + } + ] + }, + "conditions": { + "items": { + "properties": { + "description": { + "type": "string" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "conditionGroup": { + "items": { + "properties": { + "conditions": { + "items": { + "properties": { + "type": { + "type": "string", + "enum": [ + "bot_category", + "bot_name", + "bot_protection", + "bot_status", + "cookie", + "domain_environment", + "environment", + "geo_as_number", + "geo_city", + "geo_continent", + "geo_country", + "geo_country_region", + "header", + "host", + "ip_address", + "ja3_digest", + "ja4_digest", + "method", + "path", + "protocol", + "query", + "rate_limit_api_id", + "raw_path", + "region", + "route", + "ruleset", + "scheme", + "server_action", + "shared_condition", + "target_path", + "traffic_source", + "trusted_source", + "user_agent" + ] + }, + "op": { + "type": "string", + "enum": [ + "eq", + "ex", + "gt", + "gte", + "inc", + "list", + "lt", + "lte", + "neq", + "nex", + "ninc", + "pre", + "re", + "sub", + "suf" + ] + }, + "neg": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "key": { + "type": "string" + }, + "value": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "items": { + "type": "string" + }, + "type": "array" + } + ] + } + }, + "required": [ + "op", + "type" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "conditions" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "active", + "conditionGroup", + "id", + "name" + ], + "type": "object" + }, + "type": "array" + }, + "changes": { + "items": { + "type": "object" + }, + "type": "array" + }, + "managedRules": { + "properties": { + "bot_protection": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "challenge", + "deny", + "log" + ] + }, + "updatedAt": { + "type": "string" + }, + "userId": { + "type": "string" + }, + "username": { + "type": "string" + } + }, + "required": [ + "active" + ], + "type": "object" + }, + "ai_bots": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "challenge", + "deny", + "log" + ] + }, + "updatedAt": { + "type": "string" + }, + "userId": { + "type": "string" + }, + "username": { + "type": "string" + } + }, + "required": [ + "active" + ], + "type": "object" + }, + "owasp": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "challenge", + "deny", + "log" + ] + }, + "updatedAt": { + "type": "string" + }, + "userId": { + "type": "string" + }, + "username": { + "type": "string" + } + }, + "required": [ + "active" + ], + "type": "object" + }, + "vercel_ruleset": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "challenge", + "deny", + "log" + ] + }, + "updatedAt": { + "type": "string" + }, + "userId": { + "type": "string" + }, + "username": { + "type": "string" + } + }, + "required": [ + "active" + ], + "type": "object" + }, + "traffic_sources": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "challenge", + "deny", + "log" + ] + }, + "updatedAt": { + "type": "string" + }, + "userId": { + "type": "string" + }, + "username": { + "type": "string" + } + }, + "required": [ + "active" + ], + "type": "object" + } + }, + "type": "object" + }, + "botIdEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "logHeaders": { + "oneOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "string", + "enum": [ + "*" + ] + } + ] + } + }, + "required": [ + "changes", + "firewallEnabled", + "id", + "ips", + "ownerId", + "projectKey", + "rules", + "updatedAt", + "version" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "" + }, + "401": { + "description": "The request is not authorized." + }, + "402": { + "description": "" + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + }, + "500": { + "description": "" + } + }, + "parameters": [ + { + "description": "The deployed configVersion for the firewall configuration", + "in": "path", + "name": "configVersion", + "required": true, + "schema": { + "type": "string" + } + } + ] + } + }, + "/v1/security/firewall/attack-status": { + "get": { + "description": "Retrieve active attack data within the last N days (default: 1 day)", + "operationId": "getActiveAttackStatus", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Read active attack data", + "tags": [ + "security" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "oneOf": [ + { + "type": "object" + }, + { + "properties": { + "anomalies": { + "items": { + "properties": { + "projectId": { + "type": "string" + }, + "ownerId": { + "type": "string" + }, + "startTime": { + "type": "number" + }, + "endTime": { + "nullable": true, + "type": "number" + }, + "atMinute": { + "type": "number" + }, + "state": { + "type": "string" + }, + "affectedHostMap": { + "additionalProperties": { + "properties": { + "anomalyAlerts": { + "additionalProperties": { + "properties": { + "at_minute": { + "type": "string" + }, + "zscore": { + "type": "number" + }, + "total_requests_minute": { + "type": "number" + }, + "avg_requests": { + "type": "number" + }, + "stddev_requests": { + "type": "number" + } + }, + "required": [ + "at_minute", + "avg_requests", + "stddev_requests", + "total_requests_minute", + "zscore" + ], + "type": "object" + }, + "type": "object" + }, + "ddosAlerts": { + "additionalProperties": { + "properties": { + "atMinute": { + "type": "string" + }, + "totalReqs": { + "type": "number" + } + }, + "required": [ + "atMinute", + "totalReqs" + ], + "type": "object" + }, + "type": "object" + } + }, + "type": "object" + }, + "type": "object" + } + }, + "required": [ + "affectedHostMap", + "atMinute", + "endTime", + "ownerId", + "projectId", + "startTime" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "anomalies" + ], + "type": "object" + } + ] + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "projectId", + "in": "query", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "since", + "in": "query", + "required": false, + "schema": { + "type": "number", + "minimum": 1 + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "x-speakeasy-test": false + } + }, + "/v1/security/firewall/bypass": { + "get": { + "description": "Retrieve the system bypass rules configured for the specified project", + "operationId": "getBypassIp", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Read System Bypass", + "tags": [ + "security" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "result": { + "items": { + "properties": { + "OwnerId": { + "type": "string" + }, + "Id": { + "type": "string" + }, + "Domain": { + "type": "string" + }, + "Ip": { + "type": "string" + }, + "Action": { + "type": "string", + "enum": [ + "block", + "bypass" + ] + }, + "ProjectId": { + "type": "string" + }, + "IsProjectRule": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "Note": { + "type": "string" + }, + "CreatedAt": { + "type": "string" + }, + "ActorId": { + "type": "string" + }, + "UpdatedAt": { + "type": "string" + }, + "UpdatedAtHour": { + "type": "string" + }, + "DeletedAt": { + "type": "string" + }, + "ExpiresAt": { + "nullable": true, + "type": "number" + } + }, + "required": [ + "CreatedAt", + "Domain", + "Id", + "Ip", + "OwnerId", + "UpdatedAt", + "UpdatedAtHour" + ], + "type": "object" + }, + "type": "array" + }, + "pagination": { + "properties": { + "OwnerId": { + "type": "string" + }, + "Id": { + "type": "string" + } + }, + "required": [ + "Id", + "OwnerId" + ], + "type": "object" + } + }, + "required": [ + "result" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "402": { + "description": "" + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + }, + "500": { + "description": "" + } + }, + "parameters": [ + { + "name": "projectId", + "in": "query", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "limit", + "in": "query", + "required": false, + "schema": { + "type": "number", + "example": 10, + "maximum": 256 + } + }, + { + "name": "sourceIp", + "description": "Filter by source IP", + "in": "query", + "required": false, + "schema": { + "description": "Filter by source IP", + "type": "string", + "maxLength": 49 + } + }, + { + "name": "domain", + "description": "Filter by domain", + "in": "query", + "required": false, + "schema": { + "description": "Filter by domain", + "type": "string", + "pattern": "([a-z]+[a-z.]+)$", + "maxLength": 2544 + } + }, + { + "name": "projectScope", + "description": "Filter by project scoped rules", + "in": "query", + "required": false, + "schema": { + "description": "Filter by project scoped rules", + "type": "boolean" + } + }, + { + "name": "offset", + "description": "Used for pagination. Retrieves results after the provided id", + "in": "query", + "required": false, + "schema": { + "description": "Used for pagination. Retrieves results after the provided id", + "type": "string", + "maxLength": 2560 + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + }, + "post": { + "description": "Create new system bypass rules", + "operationId": "addBypassIp", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Create System Bypass Rule", + "tags": [ + "security" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "oneOf": [ + { + "properties": { + "ok": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "result": { + "items": { + "properties": { + "OwnerId": { + "type": "string" + }, + "Id": { + "type": "string" + }, + "Domain": { + "type": "string" + }, + "Ip": { + "type": "string" + }, + "ProjectId": { + "type": "string" + }, + "Note": { + "type": "string" + }, + "IsProjectRule": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "Domain", + "Id", + "IsProjectRule", + "Note", + "OwnerId", + "ProjectId" + ], + "type": "object" + }, + "type": "array" + }, + "pagination": { + "nullable": true + } + }, + "required": [ + "ok", + "pagination", + "result" + ], + "type": "object" + }, + { + "properties": { + "ok": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "result": { + "items": { + "properties": { + "OwnerId": { + "type": "string" + }, + "Id": { + "type": "string" + }, + "Domain": { + "type": "string" + }, + "Ip": { + "type": "string" + }, + "Action": { + "type": "string", + "enum": [ + "block", + "bypass" + ] + }, + "ProjectId": { + "type": "string" + }, + "IsProjectRule": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "Note": { + "type": "string" + }, + "CreatedAt": { + "type": "string" + }, + "ActorId": { + "type": "string" + }, + "UpdatedAt": { + "type": "string" + }, + "UpdatedAtHour": { + "type": "string" + }, + "DeletedAt": { + "type": "string" + }, + "ExpiresAt": { + "nullable": true, + "type": "number" + } + }, + "required": [ + "CreatedAt", + "Domain", + "Id", + "Ip", + "OwnerId", + "UpdatedAt", + "UpdatedAtHour" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "ok" + ], + "type": "object" + } + ] + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid.\nOne of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "402": { + "description": "" + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + }, + "500": { + "description": "" + } + }, + "parameters": [ + { + "name": "projectId", + "in": "query", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "additionalProperties": false, + "oneOf": [ + { + "required": [ + "domain" + ] + }, + { + "required": [ + "projectScope" + ] + } + ], + "properties": { + "domain": { + "type": "string", + "pattern": "([a-z]+[a-z.]+)$", + "maxLength": 2544 + }, + "projectScope": { + "type": "boolean", + "description": "If the specified bypass will apply to all domains for a project." + }, + "sourceIp": { + "type": "string" + }, + "allSources": { + "type": "boolean" + }, + "ttl": { + "type": "number", + "description": "Time to live in milliseconds" + }, + "note": { + "type": "string", + "maxLength": 500 + } + } + } + } + } + } + }, + "delete": { + "description": "Remove system bypass rules", + "operationId": "removeBypassIp", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Remove System Bypass Rule", + "tags": [ + "security" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "ok": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "ok" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid.\nOne of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "402": { + "description": "" + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + }, + "500": { + "description": "" + } + }, + "parameters": [ + { + "name": "projectId", + "in": "query", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "additionalProperties": false, + "oneOf": [ + { + "required": [ + "domain" + ] + }, + { + "required": [ + "projectScope" + ] + } + ], + "properties": { + "domain": { + "type": "string", + "pattern": "([a-z]+[a-z.]+)$", + "maxLength": 2544 + }, + "projectScope": { + "type": "boolean" + }, + "sourceIp": { + "type": "string" + }, + "allSources": { + "type": "boolean" + }, + "note": { + "type": "string", + "maxLength": 500 + } + } + } + } + } + } + } + }, + "/v1/security/firewall/events": { + "get": { + "description": "Retrieve firewall actions for a project Rule names are resolved against the project's *current* active firewall configuration and the team's active rulesets, so a rule that has since been renamed reports its new name and one that has been deleted reports `null`. System rules such as `sys_dos_mitigation` and `ip_blocking` have no configured name and always report `null`.", + "operationId": "getSecurityFirewallEvents", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Read Firewall Actions by Project", + "tags": [ + "security" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "actions": { + "items": { + "properties": { + "ruleName": { + "nullable": true, + "type": "string" + }, + "startTime": { + "type": "string" + }, + "endTime": { + "type": "string" + }, + "isActive": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action_type": { + "type": "string" + }, + "action": { + "type": "string" + }, + "ruleId": { + "nullable": true, + "type": "string" + }, + "host": { + "type": "string" + }, + "public_ip": { + "type": "string" + }, + "count": { + "type": "number" + } + }, + "required": [ + "action", + "action_type", + "count", + "endTime", + "host", + "isActive", + "public_ip", + "ruleId", + "ruleName", + "startTime" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "actions" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "408": { + "description": "" + }, + "410": { + "description": "" + }, + "500": { + "description": "" + } + }, + "parameters": [ + { + "name": "projectId", + "in": "query", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "startTimestamp", + "in": "query", + "required": false, + "schema": { + "type": "number" + } + }, + { + "name": "endTimestamp", + "in": "query", + "required": false, + "schema": { + "type": "number" + } + }, + { + "name": "hosts", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + } + }, + "/v1/security/firewall/config/generate-rule": { + "post": { + "description": "Generate a firewall rule from a natural language description.", + "operationId": "generateFirewallRule", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Generate a firewall rule from natural language", + "tags": [ + "security" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "rule": { + "properties": { + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "conditionGroup": { + "items": { + "properties": { + "conditions": { + "items": { + "properties": { + "type": { + "type": "string" + }, + "op": { + "type": "string" + }, + "neg": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "key": { + "type": "string" + }, + "value": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "items": { + "type": "string" + }, + "type": "array" + } + ] + } + }, + "required": [ + "op", + "type" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "conditions" + ], + "type": "object" + }, + "type": "array" + }, + "action": { + "properties": { + "mitigate": { + "properties": { + "action": { + "type": "string" + }, + "rateLimit": { + "nullable": true, + "properties": { + "algo": { + "type": "string" + }, + "window": { + "type": "number" + }, + "limit": { + "type": "number" + }, + "keys": { + "items": { + "type": "string" + }, + "type": "array" + }, + "action": { + "nullable": true, + "type": "string" + } + }, + "required": [ + "algo", + "keys", + "limit", + "window" + ], + "type": "object" + }, + "redirect": { + "nullable": true, + "properties": { + "location": { + "type": "string" + }, + "permanent": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "location", + "permanent" + ], + "type": "object" + }, + "actionDuration": { + "nullable": true, + "type": "string" + } + }, + "required": [ + "action" + ], + "type": "object" + } + }, + "type": "object" + } + }, + "required": [ + "action", + "active", + "conditionGroup", + "name" + ], + "type": "object" + }, + "error": { + "type": "string" + } + }, + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "408": { + "description": "" + }, + "410": { + "description": "" + }, + "500": { + "description": "" + } + }, + "parameters": [ + { + "name": "projectId", + "in": "query", + "schema": { + "type": "string" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + } + }, + "/speed-insights/toggle": { + "post": { + "description": "", + "operationId": "createSpeedInsightsToggle", + "security": [], + "tags": [], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "value": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "value" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid.\nOne of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "402": { + "description": "" + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "projectId", + "in": "query", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "value": { + "type": "boolean" + } + }, + "required": [ + "value" + ], + "type": "object" + } + } + } + } + } + }, + "/storage/stores/{id}": { + "get": { + "description": "", + "operationId": "getStorageStoresById", + "security": [], + "summary": "Get a store", + "tags": [ + "storage" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "store": { + "type": "object", + "properties": { + "projectsMetadata": { + "items": { + "properties": { + "id": { + "type": "string" + }, + "projectId": { + "type": "string" + }, + "name": { + "type": "string" + }, + "framework": { + "nullable": true, + "type": "string", + "enum": [ + "actix-web", + "angular", + "ash", + "astro", + "axum", + "blitzjs", + "brunch", + "bun", + "container", + "create-react-app", + "django", + "docusaurus", + "docusaurus-2", + "dojo", + "eleventy", + "elysia", + "ember", + "eve", + "express", + "factory-eve", + "fastapi", + "fasthtml", + "fastify", + "flask", + "gatsby", + "go", + "gridsome", + "h3", + "hexo", + "hono", + "hugo", + "hydrogen", + "ionic-angular", + "ionic-react", + "jekyll", + "koa", + "mastra", + "middleman", + "nestjs", + "nextjs", + "nitro", + "node", + "nuxtjs", + "parcel", + "polymer", + "preact", + "python", + "react-router", + "redwoodjs", + "remix", + "ruby", + "rust", + "saber", + "sanity", + "sanity-v2", + "sapper", + "scully", + "services", + "solidstart", + "solidstart-1", + "stencil", + "storybook", + "svelte", + "sveltekit", + "sveltekit-1", + "tanstack-start", + "tanstack-start-lovable", + "umijs", + "vite", + "vitepress", + "vue", + "vuepress", + "xmcp", + "zola", + null + ] + }, + "latestDeployment": { + "type": "string" + }, + "environments": { + "items": { + "type": "string" + }, + "type": "array" + }, + "envVarPrefix": { + "nullable": true, + "type": "string" + }, + "environmentVariables": { + "items": { + "type": "string" + }, + "type": "array" + }, + "deployments": { + "properties": { + "required": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "actions": { + "items": { + "properties": { + "slug": { + "type": "string" + }, + "environments": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "environments", + "slug" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "actions", + "required" + ], + "type": "object" + }, + "makeEnvVarsSensitive": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "envVarPrefix", + "environmentVariables", + "environments", + "id", + "name", + "projectId" + ], + "type": "object" + }, + "type": "array" + }, + "projectFilter": { + "properties": { + "git": { + "properties": { + "providers": { + "oneOf": [ + { + "items": { + "type": "string", + "enum": [ + "bitbucket", + "github", + "gitlab" + ] + }, + "type": "array" + }, + { + "type": "string", + "enum": [ + "*" + ] + } + ] + }, + "owners": { + "items": { + "type": "string" + }, + "type": "array" + }, + "repos": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "providers" + ], + "type": "object" + } + }, + "type": "object" + }, + "totalConnectedProjects": { + "type": "number" + }, + "usageQuotaExceeded": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "status": { + "nullable": true, + "type": "string", + "enum": [ + "available", + "error", + "initializing", + "limits-exceeded-suspended", + "limits-exceeded-suspended-store-count", + "onboarding", + "suspended", + "uninstalled", + null + ] + } + }, + "required": [ + "projectsMetadata", + "status", + "usageQuotaExceeded" + ] + } + }, + "required": [ + "store" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "skip-metadata", + "in": "query", + "required": false, + "schema": { + "type": "boolean" + } + }, + { + "name": "include-guides", + "in": "query", + "required": false, + "schema": { + "type": "boolean" + } + } + ] + } + }, + "/storage/stores/blob": { + "post": { + "description": "", + "operationId": "createStorageStoresBlob", + "security": [], + "summary": "Create a Blob store", + "tags": [ + "storage" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "store": { + "nullable": true, + "type": "object", + "properties": { + "projectsMetadata": { + "items": { + "properties": { + "id": { + "type": "string" + }, + "projectId": { + "type": "string" + }, + "name": { + "type": "string" + }, + "framework": { + "nullable": true, + "type": "string", + "enum": [ + "actix-web", + "angular", + "ash", + "astro", + "axum", + "blitzjs", + "brunch", + "bun", + "container", + "create-react-app", + "django", + "docusaurus", + "docusaurus-2", + "dojo", + "eleventy", + "elysia", + "ember", + "eve", + "express", + "factory-eve", + "fastapi", + "fasthtml", + "fastify", + "flask", + "gatsby", + "go", + "gridsome", + "h3", + "hexo", + "hono", + "hugo", + "hydrogen", + "ionic-angular", + "ionic-react", + "jekyll", + "koa", + "mastra", + "middleman", + "nestjs", + "nextjs", + "nitro", + "node", + "nuxtjs", + "parcel", + "polymer", + "preact", + "python", + "react-router", + "redwoodjs", + "remix", + "ruby", + "rust", + "saber", + "sanity", + "sanity-v2", + "sapper", + "scully", + "services", + "solidstart", + "solidstart-1", + "stencil", + "storybook", + "svelte", + "sveltekit", + "sveltekit-1", + "tanstack-start", + "tanstack-start-lovable", + "umijs", + "vite", + "vitepress", + "vue", + "vuepress", + "xmcp", + "zola", + null + ] + }, + "latestDeployment": { + "type": "string" + }, + "environments": { + "items": { + "type": "string" + }, + "type": "array" + }, + "envVarPrefix": { + "nullable": true, + "type": "string" + }, + "environmentVariables": { + "items": { + "type": "string" + }, + "type": "array" + }, + "deployments": { + "properties": { + "required": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "actions": { + "items": { + "properties": { + "slug": { + "type": "string" + }, + "environments": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "environments", + "slug" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "actions", + "required" + ], + "type": "object" + }, + "makeEnvVarsSensitive": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "envVarPrefix", + "environmentVariables", + "environments", + "id", + "name", + "projectId" + ], + "type": "object" + }, + "type": "array" + }, + "projectFilter": { + "properties": { + "git": { + "properties": { + "providers": { + "oneOf": [ + { + "items": { + "type": "string", + "enum": [ + "bitbucket", + "github", + "gitlab" + ] + }, + "type": "array" + }, + { + "type": "string", + "enum": [ + "*" + ] + } + ] + }, + "owners": { + "items": { + "type": "string" + }, + "type": "array" + }, + "repos": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "providers" + ], + "type": "object" + } + }, + "type": "object" + }, + "totalConnectedProjects": { + "type": "number" + }, + "usageQuotaExceeded": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "status": { + "nullable": true, + "type": "string", + "enum": [ + "available", + "error", + "initializing", + "limits-exceeded-suspended", + "limits-exceeded-suspended-store-count", + "onboarding", + "suspended", + "uninstalled", + null + ] + }, + "access": { + "type": "string", + "enum": [ + "private", + "public" + ] + }, + "kind": { + "type": "string", + "enum": [ + "project-default", + "user-created" + ], + "description": "A project-default store is a private blob store that is lazily created per-project, uses OIDC auth instead of read-write tokens, and cannot be modified through standard store mutation APIs. Undefined for legacy stores." + }, + "projectId": { + "type": "string", + "description": "The project this store is scoped to. Set for project-default stores and user-created stores with enforced project association." + }, + "size": { + "type": "number" + }, + "count": { + "type": "number" + }, + "region": { + "type": "string", + "enum": [ + "arn1", + "bom1", + "cdg1", + "cle1", + "cpt1", + "dub1", + "dxb1", + "fra1", + "gru1", + "hkg1", + "hnd1", + "iad1", + "icn1", + "kix1", + "lhr1", + "pdx1", + "sfo1", + "sin1", + "syd1", + "yul1" + ] + }, + "isTokenExpired": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "count", + "isTokenExpired", + "projectsMetadata", + "region", + "size", + "status", + "usageQuotaExceeded" + ] + } + }, + "required": [ + "store" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "402": { + "description": "The account is missing a payment so payment method must be updated" + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "409": { + "description": "" + }, + "410": { + "description": "" + }, + "429": { + "description": "" + } + }, + "parameters": [], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "name" + ], + "properties": { + "name": { + "type": "string", + "maxLength": 70 + }, + "region": { + "type": "string", + "enum": [ + "arn1", + "bom1", + "cdg1", + "cle1", + "cpt1", + "dub1", + "dxb1", + "fra1", + "gru1", + "hkg1", + "hnd1", + "iad1", + "icn1", + "kix1", + "lhr1", + "pdx1", + "sfo1", + "sin1", + "syd1", + "yul1" + ] + }, + "access": { + "type": "string", + "enum": [ + "public", + "private" + ], + "default": "public" + }, + "projectId": { + "type": "string", + "maxLength": 50 + } + } + } + } + } + } + } + }, + "/storage/stores/blob/{id}": { + "delete": { + "description": "", + "operationId": "deleteStorageStoresBlobById", + "security": [], + "summary": "Delete a Blob store", + "tags": [ + "storage" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "id": { + "type": "string" + } + }, + "required": [ + "id" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "409": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ] + } + }, + "/v1/storage/stores/integration/direct": { + "post": { + "description": "Creates an integration store with automatic billing plan handling. For free resources, omit `billingPlanId` to auto-discover free plans. For paid resources, provide a `billingPlanId` from the billing plans endpoint.", + "operationId": "createIntegrationStoreDirect", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Create integration store (free and paid plans)", + "tags": [ + "integrations" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "store": { + "nullable": true, + "type": "object", + "properties": { + "projectsMetadata": { + "items": { + "properties": { + "id": { + "type": "string" + }, + "projectId": { + "type": "string" + }, + "name": { + "type": "string" + }, + "framework": { + "nullable": true, + "type": "string", + "enum": [ + "actix-web", + "angular", + "ash", + "astro", + "axum", + "blitzjs", + "brunch", + "bun", + "container", + "create-react-app", + "django", + "docusaurus", + "docusaurus-2", + "dojo", + "eleventy", + "elysia", + "ember", + "eve", + "express", + "factory-eve", + "fastapi", + "fasthtml", + "fastify", + "flask", + "gatsby", + "go", + "gridsome", + "h3", + "hexo", + "hono", + "hugo", + "hydrogen", + "ionic-angular", + "ionic-react", + "jekyll", + "koa", + "mastra", + "middleman", + "nestjs", + "nextjs", + "nitro", + "node", + "nuxtjs", + "parcel", + "polymer", + "preact", + "python", + "react-router", + "redwoodjs", + "remix", + "ruby", + "rust", + "saber", + "sanity", + "sanity-v2", + "sapper", + "scully", + "services", + "solidstart", + "solidstart-1", + "stencil", + "storybook", + "svelte", + "sveltekit", + "sveltekit-1", + "tanstack-start", + "tanstack-start-lovable", + "umijs", + "vite", + "vitepress", + "vue", + "vuepress", + "xmcp", + "zola", + null + ] + }, + "latestDeployment": { + "type": "string" + }, + "environments": { + "items": { + "type": "string" + }, + "type": "array" + }, + "envVarPrefix": { + "nullable": true, + "type": "string" + }, + "environmentVariables": { + "items": { + "type": "string" + }, + "type": "array" + }, + "deployments": { + "properties": { + "required": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "actions": { + "items": { + "properties": { + "slug": { + "type": "string" + }, + "environments": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "environments", + "slug" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "actions", + "required" + ], + "type": "object" + }, + "makeEnvVarsSensitive": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "envVarPrefix", + "environmentVariables", + "environments", + "id", + "name", + "projectId" + ], + "type": "object" + }, + "type": "array" + }, + "projectFilter": { + "properties": { + "git": { + "properties": { + "providers": { + "oneOf": [ + { + "items": { + "type": "string", + "enum": [ + "bitbucket", + "github", + "gitlab" + ] + }, + "type": "array" + }, + { + "type": "string", + "enum": [ + "*" + ] + } + ] + }, + "owners": { + "items": { + "type": "string" + }, + "type": "array" + }, + "repos": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "providers" + ], + "type": "object" + } + }, + "type": "object" + }, + "totalConnectedProjects": { + "type": "number" + }, + "usageQuotaExceeded": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "status": { + "nullable": true, + "type": "string", + "enum": [ + "available", + "error", + "initializing", + "limits-exceeded-suspended", + "limits-exceeded-suspended-store-count", + "onboarding", + "suspended", + "uninstalled", + null + ] + }, + "ownership": { + "type": "string", + "enum": [ + "linked", + "owned", + "sandbox" + ] + }, + "capabilities": { + "properties": { + "mcp": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "mcpReadonly": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "sso": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "billable": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "transferable": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "secretsSync": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "secretRotation": { + "oneOf": [ + { + "properties": { + "maxDelayHours": { + "type": "number" + }, + "customRotationWarning": { + "type": "string" + } + }, + "required": [ + "maxDelayHours" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false + ] + } + ] + }, + "projects": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "v0": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "autoSensitive": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "agentTools": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "type": "object" + }, + "metadata": { + "additionalProperties": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "items": { + "type": "number" + }, + "type": "array" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + } + ] + }, + "type": "object" + }, + "externalResourceId": { + "type": "string" + }, + "externalResourceStatus": { + "nullable": true, + "type": "string", + "enum": [ + "error", + "onboarding", + "pending", + "ready", + "resumed", + "suspended", + "uninstalled", + null + ] + }, + "directPartnerConsoleUrl": { + "type": "string" + }, + "product": { + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "slug": { + "type": "string" + }, + "iconUrl": { + "type": "string" + }, + "capabilities": { + "properties": { + "mcp": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "mcpReadonly": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "sso": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "billable": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "transferable": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "secretsSync": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "secretRotation": { + "oneOf": [ + { + "properties": { + "maxDelayHours": { + "type": "number" + }, + "customRotationWarning": { + "type": "string" + } + }, + "required": [ + "maxDelayHours" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false + ] + } + ] + }, + "sandbox": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "linking": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "projects": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "v0": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "importResource": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "connectedImportResource": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "nativeImportResource": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "databaseUI": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "v0Flavors": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "autoSensitive": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "agentTools": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "type": "object" + }, + "shortDescription": { + "type": "string" + }, + "metadataSchema": { + "properties": { + "type": { + "type": "string", + "enum": [ + "object" + ] + }, + "properties": { + "additionalProperties": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "string" + ] + }, + "ui:control": { + "type": "string", + "enum": [ + "input" + ] + }, + "default": { + "type": "string" + }, + "enum": { + "items": { + "type": "string" + }, + "type": "array" + }, + "maxLength": { + "type": "number" + }, + "minLength": { + "type": "number" + }, + "pattern": { + "type": "string" + }, + "description": { + "type": "string" + }, + "ui:label": { + "type": "string" + }, + "ui:read-only": { + "oneOf": [ + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + }, + { + "type": "string", + "enum": [ + "create", + "update" + ] + } + ] + }, + "ui:hidden": { + "oneOf": [ + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + }, + { + "type": "string", + "enum": [ + "create", + "update" + ] + } + ] + }, + "ui:disabled": { + "oneOf": [ + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + }, + { + "type": "string", + "enum": [ + "create", + "update" + ] + } + ] + }, + "ui:description": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + } + ] + }, + "ui:formatted-value": { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + "ui:paid-only": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "ui:placeholder": { + "type": "string" + } + }, + "required": [ + "type", + "ui:control" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "number" + ] + }, + "ui:control": { + "type": "string", + "enum": [ + "input" + ] + }, + "default": { + "type": "number" + }, + "maximum": { + "type": "number" + }, + "exclusiveMaximum": { + "type": "number" + }, + "minimum": { + "type": "number" + }, + "exclusiveMinimum": { + "type": "number" + }, + "description": { + "type": "string" + }, + "ui:label": { + "type": "string" + }, + "ui:read-only": { + "oneOf": [ + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + }, + { + "type": "string", + "enum": [ + "create", + "update" + ] + } + ] + }, + "ui:hidden": { + "oneOf": [ + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + }, + { + "type": "string", + "enum": [ + "create", + "update" + ] + } + ] + }, + "ui:disabled": { + "oneOf": [ + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + }, + { + "type": "string", + "enum": [ + "create", + "update" + ] + } + ] + }, + "ui:description": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + } + ] + }, + "ui:formatted-value": { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + "ui:paid-only": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "ui:placeholder": { + "type": "string" + } + }, + "required": [ + "type", + "ui:control" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "boolean" + ] + }, + "ui:control": { + "type": "string", + "enum": [ + "toggle" + ] + }, + "default": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "description": { + "type": "string" + }, + "ui:label": { + "type": "string" + }, + "ui:read-only": { + "oneOf": [ + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + }, + { + "type": "string", + "enum": [ + "create", + "update" + ] + } + ] + }, + "ui:hidden": { + "oneOf": [ + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + }, + { + "type": "string", + "enum": [ + "create", + "update" + ] + } + ] + }, + "ui:disabled": { + "oneOf": [ + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + }, + { + "type": "string", + "enum": [ + "create", + "update" + ] + } + ] + }, + "ui:description": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + } + ] + }, + "ui:formatted-value": { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + "ui:paid-only": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "type", + "ui:control" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "array" + ] + }, + "items": { + "properties": { + "type": { + "type": "string", + "enum": [ + "number" + ] + }, + "default": { + "type": "number" + }, + "maximum": { + "type": "number" + }, + "exclusiveMaximum": { + "type": "number" + }, + "minimum": { + "type": "number" + }, + "exclusiveMinimum": { + "type": "number" + }, + "description": { + "type": "string" + } + }, + "required": [ + "type" + ], + "type": "object" + }, + "ui:control": { + "type": "string", + "enum": [ + "slider" + ] + }, + "ui:steps": { + "items": { + "type": "number" + }, + "type": "array" + }, + "default": { + "items": { + "type": "number" + }, + "type": "array" + }, + "maxItems": { + "type": "number" + }, + "minItems": { + "type": "number" + }, + "description": { + "type": "string" + }, + "ui:label": { + "type": "string" + }, + "ui:read-only": { + "oneOf": [ + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + }, + { + "type": "string", + "enum": [ + "create", + "update" + ] + } + ] + }, + "ui:hidden": { + "oneOf": [ + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + }, + { + "type": "string", + "enum": [ + "create", + "update" + ] + } + ] + }, + "ui:disabled": { + "oneOf": [ + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + }, + { + "type": "string", + "enum": [ + "create", + "update" + ] + } + ] + }, + "ui:description": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + } + ] + }, + "ui:formatted-value": { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + "ui:paid-only": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "items", + "type", + "ui:control", + "ui:steps" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "string" + ] + }, + "ui:control": { + "type": "string", + "enum": [ + "select" + ] + }, + "ui:options": { + "items": { + "properties": { + "value": { + "type": "string" + }, + "label": { + "type": "string" + }, + "description": { + "type": "string" + }, + "disabled": { + "oneOf": [ + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + }, + { + "type": "string", + "enum": [ + "create", + "update" + ] + } + ] + }, + "hidden": { + "oneOf": [ + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + }, + { + "type": "string", + "enum": [ + "create", + "update" + ] + } + ] + } + }, + "required": [ + "label", + "value" + ], + "type": "object" + }, + "type": "array" + }, + "default": { + "type": "string" + }, + "enum": { + "items": { + "type": "string" + }, + "type": "array" + }, + "maxLength": { + "type": "number" + }, + "minLength": { + "type": "number" + }, + "pattern": { + "type": "string" + }, + "description": { + "type": "string" + }, + "ui:label": { + "type": "string" + }, + "ui:read-only": { + "oneOf": [ + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + }, + { + "type": "string", + "enum": [ + "create", + "update" + ] + } + ] + }, + "ui:hidden": { + "oneOf": [ + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + }, + { + "type": "string", + "enum": [ + "create", + "update" + ] + } + ] + }, + "ui:disabled": { + "oneOf": [ + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + }, + { + "type": "string", + "enum": [ + "create", + "update" + ] + } + ] + }, + "ui:description": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + } + ] + }, + "ui:formatted-value": { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + "ui:paid-only": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "ui:placeholder": { + "type": "string" + } + }, + "required": [ + "type", + "ui:control", + "ui:options" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "string" + ] + }, + "ui:control": { + "type": "string", + "enum": [ + "radio-button" + ] + }, + "ui:options": { + "items": { + "properties": { + "value": { + "type": "string" + }, + "label": { + "type": "string" + }, + "description": { + "type": "string" + }, + "disabled": { + "oneOf": [ + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + }, + { + "type": "string", + "enum": [ + "create", + "update" + ] + } + ] + }, + "hidden": { + "oneOf": [ + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + }, + { + "type": "string", + "enum": [ + "create", + "update" + ] + } + ] + } + }, + "required": [ + "label", + "value" + ], + "type": "object" + }, + "type": "array" + }, + "default": { + "type": "string" + }, + "enum": { + "items": { + "type": "string" + }, + "type": "array" + }, + "maxLength": { + "type": "number" + }, + "minLength": { + "type": "number" + }, + "pattern": { + "type": "string" + }, + "description": { + "type": "string" + }, + "ui:label": { + "type": "string" + }, + "ui:read-only": { + "oneOf": [ + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + }, + { + "type": "string", + "enum": [ + "create", + "update" + ] + } + ] + }, + "ui:hidden": { + "oneOf": [ + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + }, + { + "type": "string", + "enum": [ + "create", + "update" + ] + } + ] + }, + "ui:disabled": { + "oneOf": [ + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + }, + { + "type": "string", + "enum": [ + "create", + "update" + ] + } + ] + }, + "ui:description": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + } + ] + }, + "ui:formatted-value": { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + "ui:paid-only": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "ui:placeholder": { + "type": "string" + } + }, + "required": [ + "type", + "ui:control", + "ui:options" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "array" + ] + }, + "items": { + "properties": { + "type": { + "type": "string", + "enum": [ + "string" + ] + }, + "default": { + "type": "string" + }, + "enum": { + "items": { + "type": "string" + }, + "type": "array" + }, + "maxLength": { + "type": "number" + }, + "minLength": { + "type": "number" + }, + "pattern": { + "type": "string" + }, + "description": { + "type": "string" + } + }, + "required": [ + "type" + ], + "type": "object" + }, + "ui:control": { + "type": "string", + "enum": [ + "multi-select" + ] + }, + "ui:options": { + "items": { + "properties": { + "value": { + "type": "string" + }, + "label": { + "type": "string" + }, + "description": { + "type": "string" + }, + "disabled": { + "oneOf": [ + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + }, + { + "type": "string", + "enum": [ + "create", + "update" + ] + } + ] + }, + "hidden": { + "oneOf": [ + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + }, + { + "type": "string", + "enum": [ + "create", + "update" + ] + } + ] + } + }, + "required": [ + "label", + "value" + ], + "type": "object" + }, + "type": "array" + }, + "default": { + "items": { + "type": "string" + }, + "type": "array" + }, + "maxItems": { + "type": "number" + }, + "minItems": { + "type": "number" + }, + "description": { + "type": "string" + }, + "ui:label": { + "type": "string" + }, + "ui:read-only": { + "oneOf": [ + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + }, + { + "type": "string", + "enum": [ + "create", + "update" + ] + } + ] + }, + "ui:hidden": { + "oneOf": [ + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + }, + { + "type": "string", + "enum": [ + "create", + "update" + ] + } + ] + }, + "ui:disabled": { + "oneOf": [ + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + }, + { + "type": "string", + "enum": [ + "create", + "update" + ] + } + ] + }, + "ui:description": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + } + ] + }, + "ui:formatted-value": { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + "ui:paid-only": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "ui:placeholder": { + "type": "string" + }, + "example": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "items", + "type", + "ui:control", + "ui:options" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "string" + ] + }, + "ui:control": { + "type": "string", + "enum": [ + "vercel-region" + ] + }, + "ui:options": { + "items": { + "oneOf": [ + { + "properties": { + "value": { + "type": "string" + }, + "label": { + "type": "string" + }, + "description": { + "type": "string" + }, + "disabled": { + "oneOf": [ + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + }, + { + "type": "string", + "enum": [ + "create", + "update" + ] + } + ] + }, + "hidden": { + "oneOf": [ + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + }, + { + "type": "string", + "enum": [ + "create", + "update" + ] + } + ] + } + }, + "required": [ + "label", + "value" + ], + "type": "object" + }, + { + "type": "string" + }, + { + "properties": { + "value": { + "type": "string" + }, + "description": { + "type": "string" + }, + "disabled": { + "oneOf": [ + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + }, + { + "type": "string", + "enum": [ + "create", + "update" + ] + } + ] + }, + "hidden": { + "oneOf": [ + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + }, + { + "type": "string", + "enum": [ + "create", + "update" + ] + } + ] + } + }, + "required": [ + "value" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "default": { + "type": "string" + }, + "enum": { + "items": { + "type": "string" + }, + "type": "array" + }, + "maxLength": { + "type": "number" + }, + "minLength": { + "type": "number" + }, + "pattern": { + "type": "string" + }, + "description": { + "type": "string" + }, + "ui:label": { + "type": "string" + }, + "ui:read-only": { + "oneOf": [ + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + }, + { + "type": "string", + "enum": [ + "create", + "update" + ] + } + ] + }, + "ui:hidden": { + "oneOf": [ + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + }, + { + "type": "string", + "enum": [ + "create", + "update" + ] + } + ] + }, + "ui:disabled": { + "oneOf": [ + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + }, + { + "type": "string", + "enum": [ + "create", + "update" + ] + } + ] + }, + "ui:description": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + } + ] + }, + "ui:formatted-value": { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + "ui:paid-only": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "ui:placeholder": { + "type": "string" + } + }, + "required": [ + "type", + "ui:control", + "ui:options" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "array" + ] + }, + "items": { + "properties": { + "type": { + "type": "string", + "enum": [ + "string" + ] + }, + "default": { + "type": "string" + }, + "enum": { + "items": { + "type": "string" + }, + "type": "array" + }, + "maxLength": { + "type": "number" + }, + "minLength": { + "type": "number" + }, + "pattern": { + "type": "string" + }, + "description": { + "type": "string" + } + }, + "required": [ + "type" + ], + "type": "object" + }, + "ui:control": { + "type": "string", + "enum": [ + "multi-vercel-region" + ] + }, + "ui:options": { + "items": { + "oneOf": [ + { + "properties": { + "value": { + "type": "string" + }, + "label": { + "type": "string" + }, + "description": { + "type": "string" + }, + "disabled": { + "oneOf": [ + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + }, + { + "type": "string", + "enum": [ + "create", + "update" + ] + } + ] + }, + "hidden": { + "oneOf": [ + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + }, + { + "type": "string", + "enum": [ + "create", + "update" + ] + } + ] + } + }, + "required": [ + "label", + "value" + ], + "type": "object" + }, + { + "type": "string" + }, + { + "properties": { + "value": { + "type": "string" + }, + "description": { + "type": "string" + }, + "disabled": { + "oneOf": [ + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + }, + { + "type": "string", + "enum": [ + "create", + "update" + ] + } + ] + }, + "hidden": { + "oneOf": [ + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + }, + { + "type": "string", + "enum": [ + "create", + "update" + ] + } + ] + } + }, + "required": [ + "value" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "default": { + "items": { + "type": "string" + }, + "type": "array" + }, + "maxItems": { + "type": "number" + }, + "minItems": { + "type": "number" + }, + "description": { + "type": "string" + }, + "ui:label": { + "type": "string" + }, + "ui:read-only": { + "oneOf": [ + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + }, + { + "type": "string", + "enum": [ + "create", + "update" + ] + } + ] + }, + "ui:hidden": { + "oneOf": [ + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + }, + { + "type": "string", + "enum": [ + "create", + "update" + ] + } + ] + }, + "ui:disabled": { + "oneOf": [ + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + }, + { + "type": "string", + "enum": [ + "create", + "update" + ] + } + ] + }, + "ui:description": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + } + ] + }, + "ui:formatted-value": { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + "ui:paid-only": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "ui:placeholder": { + "type": "string" + }, + "example": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "items", + "type", + "ui:control", + "ui:options" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "string" + ] + }, + "ui:control": { + "type": "string", + "enum": [ + "vercel-country" + ] + }, + "ui:options": { + "items": { + "oneOf": [ + { + "properties": { + "value": { + "type": "string" + }, + "label": { + "type": "string" + }, + "description": { + "type": "string" + }, + "disabled": { + "oneOf": [ + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + }, + { + "type": "string", + "enum": [ + "create", + "update" + ] + } + ] + }, + "hidden": { + "oneOf": [ + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + }, + { + "type": "string", + "enum": [ + "create", + "update" + ] + } + ] + } + }, + "required": [ + "label", + "value" + ], + "type": "object" + }, + { + "type": "string" + }, + { + "properties": { + "value": { + "type": "string" + }, + "description": { + "type": "string" + }, + "disabled": { + "oneOf": [ + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + }, + { + "type": "string", + "enum": [ + "create", + "update" + ] + } + ] + }, + "hidden": { + "oneOf": [ + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + }, + { + "type": "string", + "enum": [ + "create", + "update" + ] + } + ] + } + }, + "required": [ + "value" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "default": { + "type": "string" + }, + "enum": { + "items": { + "type": "string" + }, + "type": "array" + }, + "maxLength": { + "type": "number" + }, + "minLength": { + "type": "number" + }, + "pattern": { + "type": "string" + }, + "description": { + "type": "string" + }, + "ui:label": { + "type": "string" + }, + "ui:read-only": { + "oneOf": [ + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + }, + { + "type": "string", + "enum": [ + "create", + "update" + ] + } + ] + }, + "ui:hidden": { + "oneOf": [ + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + }, + { + "type": "string", + "enum": [ + "create", + "update" + ] + } + ] + }, + "ui:disabled": { + "oneOf": [ + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + }, + { + "type": "string", + "enum": [ + "create", + "update" + ] + } + ] + }, + "ui:description": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + } + ] + }, + "ui:formatted-value": { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + "ui:paid-only": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "ui:placeholder": { + "type": "string" + } + }, + "required": [ + "type", + "ui:control", + "ui:options" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "string" + ] + }, + "ui:control": { + "type": "string", + "enum": [ + "domain" + ] + }, + "default": { + "type": "string" + }, + "enum": { + "items": { + "type": "string" + }, + "type": "array" + }, + "maxLength": { + "type": "number" + }, + "minLength": { + "type": "number" + }, + "pattern": { + "type": "string" + }, + "description": { + "type": "string" + }, + "ui:label": { + "type": "string" + }, + "ui:read-only": { + "oneOf": [ + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + }, + { + "type": "string", + "enum": [ + "create", + "update" + ] + } + ] + }, + "ui:hidden": { + "oneOf": [ + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + }, + { + "type": "string", + "enum": [ + "create", + "update" + ] + } + ] + }, + "ui:disabled": { + "oneOf": [ + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + }, + { + "type": "string", + "enum": [ + "create", + "update" + ] + } + ] + }, + "ui:description": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + } + ] + }, + "ui:formatted-value": { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + "ui:paid-only": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "ui:placeholder": { + "type": "string" + } + }, + "required": [ + "type", + "ui:control" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "string" + ] + }, + "ui:control": { + "type": "string", + "enum": [ + "git-namespace" + ] + }, + "description": { + "type": "string" + }, + "ui:label": { + "type": "string" + }, + "ui:read-only": { + "oneOf": [ + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + }, + { + "type": "string", + "enum": [ + "create", + "update" + ] + } + ] + }, + "ui:hidden": { + "oneOf": [ + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + }, + { + "type": "string", + "enum": [ + "create", + "update" + ] + } + ] + }, + "ui:disabled": { + "oneOf": [ + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + }, + { + "type": "string", + "enum": [ + "create", + "update" + ] + } + ] + }, + "ui:description": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + } + ] + }, + "ui:formatted-value": { + "properties": { + "expr": { + "type": "string" + } + }, + "required": [ + "expr" + ], + "type": "object" + }, + "ui:paid-only": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "ui:placeholder": { + "type": "string" + }, + "git:providers": { + "items": { + "type": "string", + "enum": [ + "bitbucket", + "github", + "gitlab" + ] + }, + "type": "array" + } + }, + "required": [ + "type", + "ui:control" + ], + "type": "object" + } + ] + }, + "type": "object" + }, + "required": { + "items": { + "type": "string" + }, + "type": "array" + }, + "ui:order": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "properties", + "type" + ], + "type": "object" + }, + "resourceLinks": { + "items": { + "properties": { + "href": { + "type": "string" + }, + "title": { + "type": "string" + } + }, + "required": [ + "href", + "title" + ], + "type": "object" + }, + "type": "array" + }, + "tags": { + "items": { + "type": "string", + "enum": [ + "ai", + "authentication", + "blob", + "checks", + "drains", + "edge-config", + "experimentation", + "kv", + "libsql", + "logDrain", + "mcp", + "messaging", + "mysql", + "observability", + "other", + "postgres", + "rds", + "redis", + "sqlite", + "storage", + "tag_agents", + "tag_ai", + "tag_analytics", + "tag_authentication", + "tag_checks", + "tag_cms", + "tag_code_repository", + "tag_code_review", + "tag_code_security", + "tag_code_testing", + "tag_commerce", + "tag_databases", + "tag_dev_tools", + "tag_experimentation", + "tag_flags", + "tag_logDrain", + "tag_logging", + "tag_messaging", + "tag_monitoring", + "tag_observability", + "tag_other", + "tag_payments", + "tag_performance", + "tag_productivity", + "tag_searching", + "tag_security", + "tag_storage", + "tag_support_agent", + "tag_testing", + "tag_traceDrain", + "tag_video", + "tag_web_automation", + "tag_workflow", + "traceDrain", + "vector", + "video", + "workflow" + ] + }, + "type": "array" + }, + "projectConnectionScopes": { + "items": { + "type": "string", + "enum": [ + "read-write:deployment", + "read-write:deployment-check", + "read-write:domain", + "read-write:drains", + "read-write:global-project-env-vars", + "read-write:integration-deployment-action", + "read-write:log-drain", + "read-write:project-env-vars", + "read-write:project-protection-bypass", + "read:deployment", + "read:domain", + "read:project" + ] + }, + "type": "array" + }, + "showSSOLinkOnProjectConnection": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "disableResourceRenaming": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "resourceTitle": { + "type": "string", + "description": "Custom resource title to display during installation and configuration. If not provided, defaults to protocol-based defaults.", + "example": "Instance" + }, + "agentSkills": { + "items": { + "type": "string" + }, + "type": "array", + "description": "URLs to skills/guides for how AI agents should use this product. Providers can specify these to help agents understand how to interact with their integration." + }, + "repl": { + "properties": { + "enabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "supportsReadOnlyMode": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "welcomeMessage": { + "type": "string" + } + }, + "required": [ + "enabled", + "supportsReadOnlyMode" + ], + "type": "object" + }, + "guides": { + "items": { + "properties": { + "framework": { + "type": "string" + }, + "title": { + "type": "string" + }, + "steps": { + "items": { + "properties": { + "title": { + "type": "string" + }, + "content": { + "type": "string" + }, + "actions": { + "items": { + "properties": { + "type": { + "type": "string", + "enum": [ + "add_drain", + "configure_project_connections", + "connect_to_project" + ] + } + }, + "required": [ + "type" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "content", + "title" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "framework", + "steps", + "title" + ], + "type": "object" + }, + "type": "array" + }, + "integration": { + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "slug": { + "type": "string" + }, + "supportsInstallationBillingPlans": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "icon": { + "type": "string" + }, + "capabilities": { + "properties": { + "provisioning": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "mcp": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "mcpReadonly": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "sso": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "billable": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "transferable": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "templateCloneOnly": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "checks": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "connectedProvisioning": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "secretRotation": { + "oneOf": [ + { + "properties": { + "maxDelayHours": { + "type": "number" + }, + "customRotationWarning": { + "type": "string" + } + }, + "required": [ + "maxDelayHours" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false + ] + } + ] + }, + "importResource": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "connectedImportResource": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "nativeImportResource": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "requiresBrowserInstall": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "v0Flavors": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "flexCommitEligible": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "updateConfiguration": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "maxAllowedTeams": { + "type": "number" + } + }, + "type": "object" + }, + "flags": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "icon", + "id", + "name", + "slug" + ], + "type": "object" + }, + "integrationConfigurationId": { + "type": "string" + }, + "supportedProtocols": { + "items": { + "type": "string", + "enum": [ + "ai", + "authentication", + "checks", + "experimentation", + "logDrain", + "messaging", + "observability", + "other", + "storage", + "traceDrain", + "video", + "workflow" + ] + }, + "type": "array" + }, + "primaryProtocol": { + "type": "string", + "enum": [ + "ai", + "authentication", + "checks", + "experimentation", + "logDrain", + "messaging", + "observability", + "other", + "storage", + "traceDrain", + "video", + "workflow" + ] + }, + "logDrainStatus": { + "type": "string", + "enum": [ + "disabled", + "enabled" + ] + } + }, + "required": [ + "integration", + "integrationConfigurationId", + "supportedProtocols" + ], + "type": "object" + }, + "protocolSettings": { + "properties": { + "experimentation": { + "properties": { + "edgeConfigSyncingEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "edgeConfigId": { + "type": "string" + }, + "globalConfigId": { + "type": "string" + }, + "globalConfigSyncingEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "edgeConfigTokenId": { + "type": "string" + } + }, + "type": "object" + }, + "authentication": { + "properties": { + "appUrls": { + "items": { + "properties": { + "url": { + "type": "string" + }, + "target": { + "type": "string", + "enum": [ + "development", + "preview", + "production" + ] + } + }, + "required": [ + "target", + "url" + ], + "type": "object" + }, + "type": "array" + } + }, + "type": "object" + } + }, + "type": "object" + }, + "notification": { + "properties": { + "title": { + "type": "string" + }, + "level": { + "type": "string", + "enum": [ + "error", + "info", + "warn" + ] + }, + "message": { + "type": "string" + }, + "href": { + "type": "string" + } + }, + "required": [ + "level", + "title" + ], + "type": "object" + }, + "secrets": { + "items": { + "properties": { + "name": { + "type": "string" + }, + "length": { + "type": "number" + }, + "frameworkPublishable": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "length", + "name" + ], + "type": "object" + }, + "type": "array" + }, + "billingPlan": { + "properties": { + "id": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "prepayment", + "subscription" + ] + }, + "description": { + "type": "string" + }, + "name": { + "type": "string" + }, + "scope": { + "type": "string", + "enum": [ + "installation", + "resource" + ] + }, + "paymentMethodRequired": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "preauthorizationAmount": { + "type": "number" + }, + "initialCharge": { + "type": "string" + }, + "minimumAmount": { + "type": "string" + }, + "maximumAmount": { + "type": "string" + }, + "maximumAmountAutoPurchasePerPeriod": { + "type": "string" + }, + "cost": { + "type": "string" + }, + "details": { + "items": { + "properties": { + "label": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "required": [ + "label" + ], + "type": "object" + }, + "type": "array" + }, + "highlightedDetails": { + "items": { + "properties": { + "label": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "required": [ + "label" + ], + "type": "object" + }, + "type": "array" + }, + "quote": { + "items": { + "properties": { + "line": { + "type": "string" + }, + "amount": { + "type": "string" + } + }, + "required": [ + "amount", + "line" + ], + "type": "object" + }, + "type": "array" + }, + "effectiveDate": { + "type": "string" + }, + "disabled": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "description", + "id", + "name", + "paymentMethodRequired", + "scope", + "type" + ], + "type": "object" + }, + "secretRotationRequestedAt": { + "type": "number", + "description": "The timestamp when secret rotation was requested." + }, + "secretRotationRequestedReason": { + "type": "string", + "description": "The reason for the secret rotation request." + }, + "secretRotationRequestedBy": { + "type": "string", + "description": "The ID of the user/team who requested the secret rotation." + }, + "secretRotationCompletedAt": { + "type": "number", + "description": "The timestamp when secret rotation was completed." + }, + "parentId": { + "type": "string", + "description": "The ID of the parent resource. Used to establish a parent-child relationship between resources, such as sandbox resources linking to their owner account resource." + }, + "targets": { + "items": { + "type": "string", + "enum": [ + "development", + "preview", + "production" + ], + "description": "The deployment targets that this resource is available for." + }, + "type": "array", + "description": "The deployment targets that this resource is available for." + } + }, + "required": [ + "externalResourceId", + "product", + "projectsMetadata", + "secrets", + "status", + "usageQuotaExceeded" + ] + } + }, + "required": [ + "store" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "402": { + "description": "The account is missing a payment so payment method must be updated" + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "409": { + "description": "" + }, + "410": { + "description": "" + }, + "500": { + "description": "" + } + }, + "parameters": [ + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "name", + "integrationConfigurationId", + "integrationProductIdOrSlug" + ], + "properties": { + "name": { + "type": "string", + "maxLength": 128, + "description": "Human-readable name for the storage resource", + "example": "my-dev-database" + }, + "integrationConfigurationId": { + "type": "string", + "description": "ID of your integration configuration. Get this from GET /v1/integrations/configurations", + "example": "icfg_cuwj0AdCdH3BwWT4LPijCC7t", + "pattern": "^icfg_[a-zA-Z0-9]+$" + }, + "integrationProductIdOrSlug": { + "type": "string", + "description": "ID or slug of the integration product. Get available products from GET /v1/integrations/configuration/{id}/products", + "example": "iap_postgres_db", + "oneOf": [ + { + "pattern": "^iap_[a-zA-Z0-9_]+$", + "description": "Product ID format" + }, + { + "pattern": "^[a-z0-9-]+$", + "description": "Product slug format" + } + ] + }, + "metadata": { + "type": "object", + "description": "Optional key-value pairs for resource metadata", + "additionalProperties": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + }, + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "array", + "items": { + "type": "number" + } + } + ] + }, + "example": { + "environment": "development", + "project": "my-app", + "tags": [ + "database", + "postgres" + ] + } + }, + "externalId": { + "type": "string", + "description": "Optional external identifier for tracking purposes", + "example": "dev-db-001" + }, + "protocolSettings": { + "type": "object", + "description": "Protocol-specific configuration settings", + "additionalProperties": true, + "example": { + "experimentation": { + "edgeConfigSyncingEnabled": true + } + } + }, + "source": { + "type": "string", + "enum": [ + "marketplace", + "deploy-button", + "external", + "v0", + "resource-claims", + "cli", + "oauth", + "backoffice", + "import-recommended-integrations", + "organization" + ], + "description": "Source of the store creation request", + "example": "marketplace", + "default": "marketplace" + }, + "billingPlanId": { + "type": "string", + "description": "ID of the billing plan for paid resources. Get available plans from GET /integrations/integration/{id}/products/{productId}/plans. If not provided, automatically discovers free billing plans.", + "example": "bp_abc123def456" + }, + "paymentMethodId": { + "type": "string", + "description": "Payment method ID for paid resources. Optional - uses default payment method if not provided.", + "example": "pm_1AbcDefGhiJklMno" + }, + "prepaymentAmountCents": { + "type": "number", + "minimum": 50, + "description": "Amount in cents for prepayment billing plans. Required only for prepayment plans with variable amounts.", + "example": 5000 + } + } + } + } + } + } + } + }, + "/v3/teams/{teamId}/members": { + "get": { + "description": "Get a paginated list of team members for the provided team.", + "operationId": "getTeamMembers", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "List team members", + "tags": [ + "teams" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "members": { + "items": { + "properties": { + "avatar": { + "type": "string", + "description": "ID of the file for the Avatar of this member.", + "example": "123a6c5209bc3778245d011443644c8d27dc2c50" + }, + "confirmed": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Boolean that indicates if this member was confirmed by an owner.", + "example": true + }, + "email": { + "type": "string", + "description": "The email of this member.", + "example": "jane.doe@example.com" + }, + "github": { + "properties": { + "login": { + "type": "string" + } + }, + "type": "object", + "description": "Information about the GitHub account for this user." + }, + "gitlab": { + "properties": { + "login": { + "type": "string" + } + }, + "type": "object", + "description": "Information about the GitLab account of this user." + }, + "bitbucket": { + "properties": { + "login": { + "type": "string" + } + }, + "type": "object", + "description": "Information about the Bitbucket account of this user." + }, + "role": { + "type": "string", + "enum": [ + "BILLING", + "CONTRIBUTOR", + "DEVELOPER", + "MEMBER", + "OWNER", + "SECURITY", + "VIEWER", + "VIEWER_FOR_PLUS" + ], + "description": "Role of this user in the team.", + "example": "OWNER" + }, + "uid": { + "type": "string", + "description": "The ID of this user.", + "example": "zTuNVUXEAvvnNN3IaqinkyMw" + }, + "username": { + "type": "string", + "description": "The unique username of this user.", + "example": "jane-doe" + }, + "name": { + "type": "string", + "description": "The name of this user.", + "example": "Jane Doe" + }, + "createdAt": { + "type": "number", + "description": "Timestamp in milliseconds when this member was added.", + "example": 1588720733602 + }, + "accessRequestedAt": { + "type": "number", + "description": "Timestamp in milliseconds for when this team member was accepted by an owner.", + "example": 1588820733602 + }, + "joinedFrom": { + "properties": { + "origin": { + "type": "string", + "enum": [ + "account-update", + "bitbucket", + "dsync", + "feedback", + "github", + "gitlab", + "import", + "link", + "mail", + "nsnb-auto-approve", + "nsnb-hobby-upgrade", + "nsnb-invite", + "nsnb-redeploy", + "nsnb-redeploy-attribution-card", + "nsnb-request-access", + "nsnb-viewer-upgrade", + "organization-teams", + "saml", + "teams" + ] + }, + "commitId": { + "type": "string" + }, + "repoId": { + "type": "string" + }, + "repoPath": { + "type": "string" + }, + "gitUserId": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "gitUserLogin": { + "type": "string" + }, + "ssoUserId": { + "type": "string" + }, + "ssoConnectedAt": { + "type": "number" + }, + "idpUserId": { + "type": "string" + }, + "dsyncUserId": { + "type": "string" + }, + "dsyncConnectedAt": { + "type": "number" + } + }, + "required": [ + "origin" + ], + "type": "object", + "description": "Map with information about the members origin if they joined by requesting access." + }, + "projects": { + "items": { + "properties": { + "name": { + "type": "string" + }, + "id": { + "type": "string" + }, + "role": { + "type": "string", + "enum": [ + "ADMIN", + "PROJECT_DEVELOPER", + "PROJECT_GUEST", + "PROJECT_VIEWER" + ] + } + }, + "required": [ + "id", + "name" + ], + "type": "object", + "description": "Array of project memberships" + }, + "type": "array", + "description": "Array of project memberships" + }, + "isEnterpriseManaged": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Indicates whether the user is managed by an enterprise." + } + }, + "required": [ + "confirmed", + "createdAt", + "email", + "role", + "uid", + "username" + ], + "type": "object" + }, + "type": "array" + }, + "emailInviteCodes": { + "items": { + "properties": { + "accessGroups": { + "items": { + "type": "string" + }, + "type": "array" + }, + "id": { + "type": "string" + }, + "email": { + "type": "string" + }, + "role": { + "type": "string", + "enum": [ + "BILLING", + "CONTRIBUTOR", + "DEVELOPER", + "MEMBER", + "OWNER", + "SECURITY", + "VIEWER", + "VIEWER_FOR_PLUS" + ] + }, + "teamRoles": { + "items": { + "type": "string", + "enum": [ + "BILLING", + "CONTRIBUTOR", + "DEVELOPER", + "MEMBER", + "OWNER", + "SECURITY", + "VIEWER", + "VIEWER_FOR_PLUS" + ] + }, + "type": "array" + }, + "teamPermissions": { + "items": { + "type": "string", + "enum": [ + "AiGatewayApiKeyOwnedBySelf", + "AiGatewayBudgetManager", + "AiGatewayCredits", + "AiGatewaySettings", + "AiGatewayTranscriptsManager", + "AiGatewayTranscriptsViewer", + "ConnectorManager", + "CreateProject", + "EnvVariableManager", + "EnvironmentManager", + "FullProductionDeployment", + "IntegrationManager", + "OrgAdmin", + "OrgViewer", + "UsageViewer", + "V0Builder", + "V0Chatter", + "V0Viewer", + "WorkflowDecryptor" + ] + }, + "type": "array" + }, + "isDSyncUser": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "createdAt": { + "type": "number" + }, + "expired": { + "type": "boolean", + "enum": [ + true + ] + }, + "projects": { + "additionalProperties": { + "type": "string", + "enum": [ + "ADMIN", + "PROJECT_DEVELOPER", + "PROJECT_GUEST", + "PROJECT_VIEWER" + ] + }, + "type": "object" + }, + "entitlements": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "id", + "isDSyncUser" + ], + "type": "object" + }, + "type": "array" + }, + "pagination": { + "properties": { + "hasNext": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "count": { + "type": "number", + "description": "Amount of items in the current page.", + "example": 20 + }, + "next": { + "nullable": true, + "type": "number", + "description": "Timestamp that must be used to request the next page.", + "example": 1540095775951 + }, + "prev": { + "nullable": true, + "type": "number", + "description": "Timestamp that must be used to request the previous page.", + "example": 1540095775951 + } + }, + "required": [ + "count", + "hasNext", + "next", + "prev" + ], + "type": "object" + } + }, + "required": [ + "members", + "pagination" + ], + "type": "object", + "x-vercel-cli": { + "displayColumns": { + "username": "members[].username", + "email": "members[].email", + "role": "members[].role", + "joinedFrom": "members[].joinedFrom.origin", + "createdAt": "members[].createdAt" + } + } + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + } + }, + "x-vercel-cli": { + "supportedSubcommands": true, + "supportedProduction": false, + "aliases": [ + "members" + ] + }, + "parameters": [ + { + "name": "limit", + "description": "Limit how many teams should be returned", + "in": "query", + "required": false, + "schema": { + "description": "Limit how many teams should be returned", + "example": 20, + "minimum": 1, + "type": "number" + } + }, + { + "name": "since", + "description": "Timestamp in milliseconds to only include members added since then.", + "in": "query", + "required": false, + "schema": { + "description": "Timestamp in milliseconds to only include members added since then.", + "example": 1540095775951, + "type": "number" + } + }, + { + "name": "until", + "description": "Timestamp in milliseconds to only include members added until then.", + "in": "query", + "required": false, + "schema": { + "description": "Timestamp in milliseconds to only include members added until then.", + "example": 1540095775951, + "type": "number" + } + }, + { + "name": "search", + "description": "Search team members by their name, username, and email.", + "in": "query", + "required": false, + "schema": { + "description": "Search team members by their name, username, and email.", + "type": "string" + } + }, + { + "name": "role", + "description": "Only return members with the specified team role.", + "in": "query", + "required": false, + "schema": { + "description": "Only return members with the specified team role.", + "example": "OWNER", + "type": "string", + "enum": [ + "OWNER", + "MEMBER", + "DEVELOPER", + "SECURITY", + "BILLING", + "VIEWER", + "VIEWER_FOR_PLUS", + "CONTRIBUTOR" + ] + } + }, + { + "name": "excludeProject", + "description": "Exclude members who belong to the specified project.", + "in": "query", + "required": false, + "schema": { + "description": "Exclude members who belong to the specified project.", + "type": "string" + } + }, + { + "name": "eligibleMembersForProjectId", + "description": "Include team members who are eligible to be members of the specified project.", + "in": "query", + "required": false, + "schema": { + "description": "Include team members who are eligible to be members of the specified project.", + "type": "string" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "path", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + }, + "required": true, + "x-vercel-cli": { + "kind": "argument" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "x-speakeasy-test": false + } + }, + "/v2/teams/{teamId}/members": { + "post": { + "description": "Invite a user to join the team specified in the URL. The authenticated user needs to be an `OWNER` in order to successfully invoke this endpoint. The user to be invited must be specified by email.", + "operationId": "inviteUserToTeam", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Invite a user", + "tags": [ + "teams" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InvitedTeamMember" + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid.\nOne of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource.\nThe authenticated user must be a team owner to perform the action" + }, + "410": { + "description": "" + }, + "503": { + "description": "" + } + }, + "x-vercel-cli": { + "supportedSubcommands": true, + "supportedProduction": false, + "aliases": [ + "invite" + ] + }, + "parameters": [ + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "path", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + }, + "required": true, + "x-vercel-cli": { + "kind": "argument" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "type": "object", + "required": [ + "email" + ], + "properties": { + "email": { + "type": "string", + "format": "email", + "description": "The email address of the user to invite", + "example": "john@example.com" + }, + "role": { + "type": "string", + "enum": [ + "OWNER", + "MEMBER", + "DEVELOPER", + "SECURITY", + "BILLING", + "VIEWER", + "VIEWER_FOR_PLUS", + "CONTRIBUTOR" + ], + "default": "VIEWER", + "description": "The role of the user to invite", + "example": "VIEWER" + }, + "projects": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "required": [ + "role", + "projectId" + ], + "properties": { + "projectId": { + "type": "string", + "maxLength": 64, + "example": "prj_ndlgr43fadlPyCtREAqxxdyFK", + "description": "The ID of the project." + }, + "role": { + "type": "string", + "enum": [ + "ADMIN", + "PROJECT_VIEWER", + "PROJECT_DEVELOPER", + "PROJECT_GUEST" + ], + "example": "ADMIN", + "description": "Sets the project roles for the invited user" + } + } + } + } + } + } + } + } + } + } + } + }, + "/v1/teams/{teamId}/request": { + "post": { + "description": "Request access to a team as a member. An owner has to approve the request. Only 100 users can request access to a team at the same time.", + "operationId": "requestAccessToTeam", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Request access to a team", + "tags": [ + "teams" + ], + "responses": { + "200": { + "description": "Successfuly requested access to the team.", + "content": { + "application/json": { + "schema": { + "properties": { + "teamSlug": { + "type": "string" + }, + "teamName": { + "type": "string" + }, + "confirmed": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "joinedFrom": { + "properties": { + "origin": { + "type": "string", + "enum": [ + "account-update", + "bitbucket", + "dsync", + "feedback", + "github", + "gitlab", + "import", + "link", + "mail", + "nsnb-auto-approve", + "nsnb-hobby-upgrade", + "nsnb-invite", + "nsnb-redeploy", + "nsnb-redeploy-attribution-card", + "nsnb-request-access", + "nsnb-viewer-upgrade", + "organization-teams", + "saml", + "teams" + ] + }, + "commitId": { + "type": "string" + }, + "repoId": { + "type": "string" + }, + "repoPath": { + "type": "string" + }, + "gitUserId": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "gitUserLogin": { + "type": "string" + }, + "ssoUserId": { + "type": "string" + }, + "ssoConnectedAt": { + "type": "number" + }, + "idpUserId": { + "type": "string" + }, + "dsyncUserId": { + "type": "string" + }, + "dsyncConnectedAt": { + "type": "number" + } + }, + "required": [ + "origin" + ], + "type": "object" + }, + "accessRequestedAt": { + "type": "number" + }, + "github": { + "nullable": true, + "properties": { + "login": { + "type": "string" + } + }, + "type": "object" + }, + "gitlab": { + "nullable": true, + "properties": { + "login": { + "type": "string" + } + }, + "type": "object" + }, + "bitbucket": { + "nullable": true, + "properties": { + "login": { + "type": "string" + } + }, + "type": "object" + } + }, + "required": [ + "bitbucket", + "github", + "gitlab", + "teamName", + "teamSlug" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid.\nOne of the provided values in the request query is invalid." + }, + "401": { + "description": "" + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "The team was not found." + }, + "410": { + "description": "" + }, + "429": { + "description": "" + }, + "503": { + "description": "" + } + }, + "parameters": [ + { + "name": "teamId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "description": "The unique team identifier", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "additionalProperties": false, + "required": [ + "joinedFrom" + ], + "properties": { + "joinedFrom": { + "type": "object", + "additionalProperties": false, + "required": [ + "origin" + ], + "properties": { + "origin": { + "type": "string", + "enum": [ + "import", + "teams", + "github", + "gitlab", + "bitbucket", + "feedback", + "organization-teams" + ], + "description": "The origin of the request.", + "example": "github" + }, + "commitId": { + "type": "string", + "description": "The commit sha if the origin is a git provider.", + "example": "f498d25d8bd654b578716203be73084b31130cd7" + }, + "repoId": { + "type": "string", + "description": "The ID of the repository for the given Git provider.", + "example": "67753070" + }, + "repoPath": { + "type": "string", + "description": "The path to the repository for the given Git provider.", + "example": "jane-doe/example" + }, + "gitUserId": { + "description": "The ID of the Git account of the user who requests access.", + "example": 103053343, + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "gitUserLogin": { + "type": "string", + "description": "The login name for the Git account of the user who requests access.", + "example": "jane-doe" + } + } + } + } + } + } + }, + "required": true + } + } + }, + "/v1/teams/{teamId}/request/{userId}": { + "get": { + "description": "Check the status of a join request. It'll respond with a 404 if the request has been declined. If no `userId` path segment was provided, this endpoint will instead return the status of the authenticated user.", + "operationId": "getTeamAccessRequest", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Get access request status", + "tags": [ + "teams" + ], + "responses": { + "200": { + "description": "Successfully", + "content": { + "application/json": { + "schema": { + "properties": { + "teamSlug": { + "type": "string", + "description": "The slug of the team.", + "example": "my-team" + }, + "teamName": { + "type": "string", + "description": "The name of the team.", + "example": "My Team" + }, + "confirmed": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Current status of the membership. Will be `true` if confirmed, if pending it'll be `false`.", + "example": false + }, + "joinedFrom": { + "properties": { + "origin": { + "type": "string", + "enum": [ + "account-update", + "bitbucket", + "dsync", + "feedback", + "github", + "gitlab", + "import", + "link", + "mail", + "nsnb-auto-approve", + "nsnb-hobby-upgrade", + "nsnb-invite", + "nsnb-redeploy", + "nsnb-redeploy-attribution-card", + "nsnb-request-access", + "nsnb-viewer-upgrade", + "organization-teams", + "saml", + "teams" + ] + }, + "commitId": { + "type": "string" + }, + "repoId": { + "type": "string" + }, + "repoPath": { + "type": "string" + }, + "gitUserId": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "gitUserLogin": { + "type": "string" + }, + "ssoUserId": { + "type": "string" + }, + "ssoConnectedAt": { + "type": "number" + }, + "idpUserId": { + "type": "string" + }, + "dsyncUserId": { + "type": "string" + }, + "dsyncConnectedAt": { + "type": "number" + } + }, + "required": [ + "origin" + ], + "type": "object", + "description": "A map that describes the origin from where the user joined." + }, + "accessRequestedAt": { + "type": "number", + "description": "Timestamp in milliseconds when the user requested access to the team.", + "example": 1588720733602 + }, + "github": { + "nullable": true, + "properties": { + "login": { + "type": "string" + } + }, + "type": "object", + "description": "Map of the connected GitHub account." + }, + "gitlab": { + "nullable": true, + "properties": { + "login": { + "type": "string" + } + }, + "type": "object", + "description": "Map of the connected GitLab account." + }, + "bitbucket": { + "nullable": true, + "properties": { + "login": { + "type": "string" + } + }, + "type": "object", + "description": "Map of the connected Bitbucket account." + } + }, + "required": [ + "accessRequestedAt", + "bitbucket", + "confirmed", + "github", + "gitlab", + "joinedFrom", + "teamName", + "teamSlug" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid.\nUser is already a confirmed member of the team and did not request access. Only visible when the authenticated user does have access to the team." + }, + "401": { + "description": "" + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "The provided user doesn't have a membership.\nTeam was not found." + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "userId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "description": "The unique user identifier" + } + }, + { + "name": "teamId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "description": "The unique team identifier", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + } + ] + } + }, + "/v1/teams/{teamId}/members/teams/join": { + "post": { + "description": "Join a team with a provided invite code or team ID.", + "operationId": "joinTeam", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Join a team", + "tags": [ + "teams" + ], + "responses": { + "200": { + "description": "Successfully joined a team.", + "content": { + "application/json": { + "schema": { + "properties": { + "teamId": { + "type": "string", + "description": "The ID of the team the user joined.", + "example": "team_LLHUOMOoDlqOp8wPE4kFo9pE" + }, + "slug": { + "type": "string", + "description": "The slug of the team the user joined.", + "example": "my-team" + }, + "name": { + "type": "string", + "description": "The name of the team the user joined.", + "example": "My Team" + }, + "from": { + "type": "string", + "description": "The origin of how the user joined.", + "example": "email" + } + }, + "required": [ + "from", + "name", + "slug", + "teamId" + ], + "type": "object", + "description": "Successfully joined a team." + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid." + }, + "401": { + "description": "" + }, + "402": { + "description": "" + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + }, + "503": { + "description": "" + } + }, + "parameters": [ + { + "name": "teamId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "description": "The unique team identifier", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "inviteCode": { + "type": "string", + "description": "The invite code to join the team.", + "example": "fisdh38aejkeivn34nslfore9vjtn4ls" + } + } + } + } + }, + "required": true + } + } + }, + "/v1/teams/{teamId}/members/{uid}": { + "patch": { + "description": "Update the membership of a Team Member on the Team specified by `teamId`, such as changing the _role_ of the member, or confirming a request to join the Team for an unconfirmed member. The authenticated user must be an `OWNER` of the Team.", + "operationId": "updateTeamMember", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Update a Team Member", + "tags": [ + "teams" + ], + "responses": { + "200": { + "description": "Successfully updated the membership.", + "content": { + "application/json": { + "schema": { + "properties": { + "id": { + "type": "string", + "description": "ID of the team." + } + }, + "required": [ + "id" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid.\nOne of the provided values in the request query is invalid.\nCannot disconnect SSO from a Team member that does not have a SSO connection.\nCannot confirm a member that is already confirmed.\nCannot confirm a member that did not request access." + }, + "401": { + "description": "The request is not authorized.\nTeam members can only be updated by an owner, or by the authenticated user if they are only disconnecting their SAML connection to the Team." + }, + "402": { + "description": "" + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "The provided user is not part of this team.\nA user with the specified ID does not exist." + }, + "409": { + "description": "" + }, + "410": { + "description": "" + }, + "500": { + "description": "" + } + }, + "parameters": [ + { + "name": "uid", + "description": "The ID of the member.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "description": "The ID of the member.", + "example": "ndfasllgPyCtREAqxxdyFKb" + } + }, + { + "name": "teamId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "description": "The unique team identifier", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "confirmed": { + "type": "boolean", + "enum": [ + true + ], + "description": "Accept a user who requested access to the team.", + "example": true + }, + "role": { + "type": "string", + "description": "The role in the team of the member.", + "example": "VIEWER", + "default": "MEMBER" + }, + "teamPermissions": { + "type": "array", + "description": "The team permissions to set for the member. Permissions must be compatible with the team roles assigned to the member.", + "example": [ + "CreateProject", + "FullProductionDeployment" + ], + "items": { + "type": "string", + "enum": [ + "ConnectorManager", + "IntegrationManager", + "CreateProject", + "FullProductionDeployment", + "UsageViewer", + "EnvVariableManager", + "EnvironmentManager", + "WorkflowDecryptor", + "OrgAdmin", + "OrgViewer", + "AiGatewaySettings", + "AiGatewayCredits", + "AiGatewayApiKeyOwnedBySelf", + "AiGatewayBudgetManager", + "AiGatewayTranscriptsManager", + "AiGatewayTranscriptsViewer", + "V0Builder", + "V0Chatter", + "V0Viewer" + ] + } + }, + "projects": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "required": [ + "role", + "projectId" + ], + "properties": { + "projectId": { + "type": "string", + "maxLength": 256, + "example": "prj_ndlgr43fadlPyCtREAqxxdyFK", + "description": "The ID of the project." + }, + "role": { + "type": "string", + "example": "ADMIN", + "description": "The project role of the member that will be added. \\\"null\\\" will remove this project level role.", + "nullable": true, + "enum": [ + "ADMIN", + "PROJECT_VIEWER", + "PROJECT_DEVELOPER", + null + ] + } + } + } + }, + "joinedFrom": { + "additionalProperties": false, + "type": "object", + "properties": { + "ssoUserId": { + "nullable": true + } + } + } + } + } + } + }, + "required": true + } + }, + "delete": { + "description": "Remove a Team Member from the Team, or dismiss a user that requested access, or leave a team. Directory Sync members can be removed when their directory email is absent or does not match the user's primary or verified secondary emails.", + "operationId": "removeTeamMember", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Remove a Team Member", + "tags": [ + "teams" + ], + "responses": { + "200": { + "description": "Successfully removed a member of the team.", + "content": { + "application/json": { + "schema": { + "properties": { + "id": { + "type": "string", + "description": "ID of the team." + } + }, + "required": [ + "id" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource.\nNot authorized to update the team." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + }, + "503": { + "description": "" + } + }, + "parameters": [ + { + "name": "uid", + "description": "The user ID of the member.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "description": "The user ID of the member.", + "example": "ndlgr43fadlPyCtREAqxxdyFK" + } + }, + { + "name": "newDefaultTeamId", + "description": "The ID of the team to set as the new default team for the Northstar user.", + "in": "query", + "required": false, + "schema": { + "type": "string", + "description": "The ID of the team to set as the new default team for the Northstar user.", + "example": "team_nllPyCtREAqxxdyFKbbMDlxd" + } + }, + { + "name": "teamId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "description": "The unique team identifier", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + } + ] + } + }, + "/v2/teams/{teamId}": { + "get": { + "description": "Get information for the Team specified by the `teamId` parameter.", + "operationId": "getTeam", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Get a Team", + "tags": [ + "teams" + ], + "responses": { + "200": { + "description": "The requested team", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Team" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource.\nNot authorized to access the team." + }, + "404": { + "description": "Team was not found." + }, + "410": { + "description": "" + } + }, + "x-vercel-cli": { + "supportedSubcommands": true, + "supportedProduction": false, + "aliases": [ + "get" + ] + }, + "parameters": [ + { + "name": "slug", + "in": "query", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "path", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + }, + "required": true, + "x-vercel-cli": { + "kind": "argument" + } + } + ] + }, + "patch": { + "description": "Update the information of a Team specified by the `teamId` parameter. The request body should contain the information that will be updated on the Team.", + "operationId": "patchTeam", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Update a Team", + "tags": [ + "teams" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Team" + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "402": { + "description": "" + }, + "403": { + "description": "You do not have permission to access this resource.\nNot authorized to update the team. Must be an OWNER." + }, + "410": { + "description": "" + }, + "428": { + "description": "Owner does not have protection add-on" + } + }, + "x-vercel-cli": { + "supportedSubcommands": true, + "supportedProduction": false, + "aliases": [ + "update" + ] + }, + "parameters": [ + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "path", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + }, + "required": true, + "x-vercel-cli": { + "kind": "argument" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "additionalProperties": false, + "properties": { + "avatar": { + "type": "string", + "maxLength": 40, + "pattern": "^[0-9a-f]+$", + "description": "The hash value of an uploaded image, or `null` to clear the avatar.", + "nullable": true + }, + "description": { + "type": "string", + "maxLength": 140, + "example": "Our mission is to make cloud computing accessible to everyone", + "description": "A short text that describes the team." + }, + "emailDomain": { + "type": "string", + "format": "regex", + "example": "example.com", + "nullable": true + }, + "name": { + "type": "string", + "maxLength": 256, + "example": "My Team", + "description": "The name of the team." + }, + "previewDeploymentSuffix": { + "type": "string", + "format": "hostname", + "example": "example.dev", + "description": "Suffix that will be used for all preview deployments.", + "nullable": true + }, + "regenerateInviteCode": { + "type": "boolean", + "example": true, + "description": "Create a new invite code and replace the current one." + }, + "saml": { + "type": "object", + "additionalProperties": false, + "properties": { + "enforced": { + "type": "boolean", + "example": true, + "description": "Require that members of the team use SAML Single Sign-On." + }, + "roles": { + "type": "object", + "description": "Directory groups to role or access group mappings.", + "additionalProperties": { + "anyOf": [ + { + "type": "string", + "enum": [ + "OWNER", + "MEMBER", + "DEVELOPER", + "SECURITY", + "BILLING", + "VIEWER", + "VIEWER_FOR_PLUS", + "CONTRIBUTOR" + ] + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "accessGroupId" + ], + "properties": { + "accessGroupId": { + "type": "string", + "pattern": "^ag_[A-z0-9_ -]+$" + } + } + } + ] + } + } + } + }, + "slug": { + "type": "string", + "example": "my-team", + "description": "A new slug for the team." + }, + "enablePreviewFeedback": { + "type": "string", + "example": "on", + "description": "Enable preview toolbar: one of on, off or default." + }, + "enableProductionFeedback": { + "type": "string", + "example": "on", + "description": "Enable production toolbar: one of on, off or default." + }, + "sensitiveEnvironmentVariablePolicy": { + "type": "string", + "example": "on", + "description": "Sensitive environment variable policy: one of on, off or default." + }, + "disjunctiveProductionSecretPolicy": { + "type": "string", + "example": "on", + "description": "Require production secrets to be in their own environment group: one of on, off or default." + }, + "remoteCaching": { + "type": "object", + "description": "Whether or not remote caching is enabled for the team", + "additionalProperties": false, + "properties": { + "enabled": { + "type": "boolean", + "example": true, + "description": "Enable or disable remote caching for the team." + } + } + }, + "hideIpAddresses": { + "type": "boolean", + "example": false, + "description": "Display or hide IP addresses in Monitoring queries." + }, + "hideIpAddressesInLogDrains": { + "type": "boolean", + "example": false, + "description": "Display or hide IP addresses in Log Drains." + }, + "dpAccessRequestsMode": { + "type": "string", + "enum": [ + "all", + "none", + "email-domain" + ], + "example": "none", + "description": "Controls who can request access to protected deployments." + }, + "requireVerifiedCommits": { + "type": "boolean", + "example": true, + "description": "When enabled, all projects in the team require commits to be signed and verified by the git provider before deployments will be created." + }, + "disableRepositoryDispatchEvents": { + "type": "boolean", + "example": false, + "description": "Default for projects in the team. When `true`, projects in this team will not emit GitHub repository-dispatch events on deployment events unless the project explicitly overrides this setting." + }, + "defaultDeploymentProtection": { + "type": "object", + "description": "Default deployment protection settings for new projects.", + "additionalProperties": false, + "properties": { + "passwordProtection": { + "additionalProperties": false, + "description": "Allows to protect project deployments with a password", + "properties": { + "deploymentType": { + "description": "Specify if the password will apply to every Deployment Target or just Preview", + "enum": [ + "all", + "preview", + "prod_deployment_urls_and_all_previews", + "all_except_custom_domains" + ], + "type": "string" + }, + "password": { + "description": "The password that will be used to protect Project Deployments", + "maxLength": 72, + "type": "string", + "nullable": true + } + }, + "required": [ + "deploymentType" + ], + "type": "object", + "nullable": true + }, + "ssoProtection": { + "additionalProperties": false, + "description": "Ensures visitors to your Preview Deployments are logged into Vercel and have a minimum of Viewer access on your team", + "properties": { + "deploymentType": { + "default": "preview", + "description": "Specify if the Vercel Authentication (SSO Protection) will apply to every Deployment Target or just Preview", + "enum": [ + "all", + "preview", + "prod_deployment_urls_and_all_previews", + "all_except_custom_domains" + ], + "type": "string" + } + }, + "required": [ + "deploymentType" + ], + "type": "object", + "nullable": true + } + } + }, + "defaultPassport": { + "description": "Default Passport configuration for new projects.", + "type": "object", + "additionalProperties": false, + "properties": { + "connectorId": { + "type": "string" + }, + "deploymentType": { + "type": "string", + "default": "all", + "enum": [ + "all", + "preview", + "prod_deployment_urls_and_all_previews", + "all_except_custom_domains" + ] + } + }, + "required": [ + "connectorId" + ], + "nullable": true + }, + "defaultExpirationSettings": { + "properties": { + "expiration": { + "description": "The time period to keep non-production deployments for", + "example": "1y", + "type": "string", + "enum": [ + "3y", + "2y", + "1y", + "6m", + "3m", + "2m", + "1m", + "2w", + "1w", + "1d", + "unlimited" + ] + }, + "expirationProduction": { + "description": "The time period to keep production deployments for", + "example": "1y", + "type": "string", + "enum": [ + "3y", + "2y", + "1y", + "6m", + "3m", + "2m", + "1m", + "2w", + "1w", + "1d", + "unlimited" + ] + }, + "expirationCanceled": { + "description": "The time period to keep canceled deployments for", + "example": "1y", + "type": "string", + "enum": [ + "1y", + "6m", + "3m", + "2m", + "1m", + "2w", + "1w", + "1d", + "unlimited" + ] + }, + "expirationErrored": { + "description": "The time period to keep errored deployments for", + "example": "1y", + "type": "string", + "enum": [ + "1y", + "6m", + "3m", + "2m", + "1m", + "2w", + "1w", + "1d", + "unlimited" + ] + } + }, + "type": "object", + "additionalProperties": false + }, + "deploymentPolicy": { + "anyOf": [ + { + "type": "object", + "description": "Composable deployment-time policy. Each rule type holds a list of rules, one per environment scope.", + "additionalProperties": false, + "properties": { + "gitSources": { + "anyOf": [ + { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "required": [ + "enabled", + "environments", + "sources" + ], + "properties": { + "enabled": { + "type": "boolean" + }, + "environments": { + "type": "array", + "items": { + "anyOf": [ + { + "type": "object", + "additionalProperties": false, + "required": [ + "type", + "target" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "system" + ] + }, + "target": { + "type": "string", + "enum": [ + "production", + "preview" + ] + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "type", + "environmentId" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "custom" + ] + }, + "environmentId": { + "type": "string" + } + } + } + ] + } + }, + "sources": { + "type": "array", + "items": { + "anyOf": [ + { + "type": "object", + "additionalProperties": false, + "required": [ + "provider", + "org" + ], + "properties": { + "provider": { + "type": "string", + "enum": [ + "github", + "bitbucket" + ] + }, + "org": { + "type": "string" + }, + "repo": { + "type": "string" + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "provider", + "namespace" + ], + "properties": { + "provider": { + "type": "string", + "enum": [ + "gitlab" + ] + }, + "namespace": { + "type": "string" + }, + "project": { + "type": "string" + } + } + } + ] + } + } + } + } + }, + { + "type": "string" + } + ] + }, + "deploymentSources": { + "anyOf": [ + { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "required": [ + "enabled", + "environments", + "sources" + ], + "properties": { + "enabled": { + "type": "boolean" + }, + "environments": { + "type": "array", + "items": { + "anyOf": [ + { + "type": "object", + "additionalProperties": false, + "required": [ + "type", + "target" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "system" + ] + }, + "target": { + "type": "string", + "enum": [ + "production", + "preview" + ] + } + } + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "type", + "environmentId" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "custom" + ] + }, + "environmentId": { + "type": "string" + } + } + } + ] + } + }, + "sources": { + "type": "array", + "items": { + "type": "string", + "enum": [ + "git", + "cli", + "rest-api", + "deploy-hook", + "integration", + "v0" + ] + } + } + } + } + }, + { + "type": "string" + } + ] + } + } + }, + { + "type": "string" + } + ] + }, + "strictDeploymentProtectionSettings": { + "type": "object", + "description": "When enabled, deployment protection settings require stricter permissions (owner-only).", + "additionalProperties": false, + "properties": { + "enabled": { + "type": "boolean", + "example": true, + "description": "Enable or disable strict deployment protection settings." + } + }, + "required": [ + "enabled" + ] + }, + "strictShareableLinks": { + "type": "object", + "description": "When enabled, creating shareable links requires Owner role.", + "additionalProperties": false, + "properties": { + "enabled": { + "type": "boolean", + "example": true, + "description": "Enable or disable requiring Owner role to create shareable links." + } + }, + "required": [ + "enabled" + ] + }, + "strictPasswordProtectionSettings": { + "type": "object", + "description": "When enabled, adding, changing, or removing project password protection requires Owner role.", + "additionalProperties": false, + "properties": { + "enabled": { + "type": "boolean", + "example": true, + "description": "Enable or disable requiring Owner role to change project password protection." + } + }, + "required": [ + "enabled" + ] + }, + "strictConnectors": { + "type": "object", + "description": "When enabled, creating and managing connectors requires Owner role.", + "additionalProperties": false, + "properties": { + "enabled": { + "type": "boolean", + "example": true, + "description": "Enable or disable requiring Owner role to manage connectors." + } + }, + "required": [ + "enabled" + ] + }, + "nsnbConfig": { + "anyOf": [ + { + "type": "object", + "description": "NSNB configuration for the team.", + "additionalProperties": false, + "properties": { + "preference": { + "type": "string", + "enum": [ + "auto-approval", + "manual-approval", + "block" + ], + "description": "The NSNB preference for the team." + } + }, + "required": [ + "preference" + ] + }, + { + "type": "string" + } + ] + }, + "defaultProjectJobs": { + "oneOf": [ + { + "description": "Default job configuration applied to new projects created in this team.", + "type": "object", + "additionalProperties": false, + "properties": { + "lint": { + "type": "object", + "additionalProperties": false, + "properties": { + "targets": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [ + "targets" + ] + }, + "typecheck": { + "type": "object", + "additionalProperties": false, + "properties": { + "targets": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [ + "targets" + ] + } + } + }, + { + "type": "string" + } + ] + }, + "resourceConfig": { + "type": "object", + "description": "Resource configuration for the team.", + "additionalProperties": false, + "properties": { + "buildMachine": { + "type": "object", + "description": "Build machine configuration.", + "additionalProperties": false, + "properties": { + "default": { + "type": "string", + "enum": [ + "basic", + "enhanced", + "turbo", + "standard", + "elastic" + ], + "example": "standard", + "description": "Default build machine type for new builds: standard, enhanced, turbo, or elastic." + } + } + } + } + } + } + } + } + }, + "required": true + } + } + }, + "/v2/teams": { + "get": { + "description": "Get a paginated list of all the Teams the authenticated User is a member of.", + "operationId": "getTeams", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "List all teams", + "tags": [ + "teams" + ], + "responses": { + "200": { + "description": "A paginated list of teams.", + "content": { + "application/json": { + "schema": { + "properties": { + "teams": { + "items": { + "oneOf": [ + { + "$ref": "#/components/schemas/Team" + }, + { + "$ref": "#/components/schemas/TeamLimited" + } + ] + }, + "type": "array" + }, + "pagination": { + "$ref": "#/components/schemas/Pagination" + } + }, + "required": [ + "pagination", + "teams" + ], + "type": "object", + "description": "A paginated list of teams.", + "x-vercel-cli": { + "displayColumns": { + "name": "teams[].name", + "id": "teams[].id", + "slug": "teams[].slug", + "role": "teams[].membership.role", + "createdAt": "teams[].createdAt" + } + } + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "" + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "410": { + "description": "" + }, + "500": { + "description": "" + } + }, + "x-vercel-cli": { + "supportedSubcommands": true, + "supportedProduction": false, + "aliases": [ + "list" + ] + }, + "parameters": [ + { + "name": "limit", + "description": "Maximum number of Teams which may be returned.", + "in": "query", + "schema": { + "description": "Maximum number of Teams which may be returned.", + "example": 20, + "type": "number" + } + }, + { + "name": "since", + "description": "Timestamp (in milliseconds) to only include Teams created since then.", + "in": "query", + "schema": { + "description": "Timestamp (in milliseconds) to only include Teams created since then.", + "example": 1540095775951, + "type": "number" + } + }, + { + "name": "until", + "description": "Timestamp (in milliseconds) to only include Teams created until then.", + "in": "query", + "schema": { + "description": "Timestamp (in milliseconds) to only include Teams created until then.", + "example": 1540095775951, + "type": "number" + } + } + ] + } + }, + "/v1/teams": { + "post": { + "description": "Create a new Team under your account. You need to send a POST request with the desired Team slug, and optionally the Team name.", + "operationId": "createTeam", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Create a Team", + "tags": [ + "teams" + ], + "responses": { + "200": { + "description": "The team was created successfully", + "content": { + "application/json": { + "schema": { + "properties": { + "id": { + "type": "string", + "description": "Id of the created team", + "example": "team_nLlpyC6RE1qxqglFKbrMxlud" + }, + "slug": { + "type": "string" + } + }, + "required": [ + "id", + "slug" + ], + "type": "object", + "description": "The team was created successfully" + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid.\nThe slug is already in use" + }, + "401": { + "description": "" + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "409": { + "description": "" + }, + "410": { + "description": "" + } + }, + "x-vercel-cli": { + "supportedSubcommands": true, + "supportedProduction": false, + "aliases": [ + "create" + ] + }, + "parameters": [], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "additionalProperties": false, + "required": [ + "slug" + ], + "properties": { + "slug": { + "example": "a-random-team", + "description": "The desired slug for the Team", + "type": "string", + "maxLength": 48 + }, + "name": { + "example": "A Random Team", + "description": "The desired name for the Team. It will be generated from the provided slug if nothing is provided", + "type": "string", + "maxLength": 256 + }, + "attribution": { + "type": "object", + "description": "Attribution information for the session or current page", + "properties": { + "sessionReferrer": { + "type": "string", + "description": "Session referrer" + }, + "landingPage": { + "type": "string", + "description": "Session landing page" + }, + "pageBeforeConversionPage": { + "type": "string", + "description": "Referrer to the signup page" + }, + "utm": { + "type": "object", + "properties": { + "utmSource": { + "type": "string", + "description": "UTM source" + }, + "utmMedium": { + "type": "string", + "description": "UTM medium" + }, + "utmCampaign": { + "type": "string", + "description": "UTM campaign" + }, + "utmTerm": { + "type": "string", + "description": "UTM term" + } + } + } + } + } + } + } + } + }, + "required": true + } + } + }, + "/v1/teams/{teamId}/dsync-roles": { + "post": { + "description": "Update the Directory Sync role mappings for a Team. This endpoint allows updating the mapping between directory groups and team roles or access groups.", + "operationId": "postTeamDsyncRoles", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Update Team Directory Sync Role Mappings", + "tags": [ + "teams" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "ok": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "ok" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "path", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + }, + "required": true + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "additionalProperties": false, + "required": [ + "roles" + ], + "properties": { + "roles": { + "type": "object", + "description": "Directory groups to role or access group mappings.", + "additionalProperties": { + "anyOf": [ + { + "type": "string", + "enum": [ + "OWNER", + "MEMBER", + "DEVELOPER", + "SECURITY", + "BILLING", + "VIEWER", + "VIEWER_FOR_PLUS", + "CONTRIBUTOR" + ] + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "accessGroupId" + ], + "properties": { + "accessGroupId": { + "type": "string", + "pattern": "^ag_[A-z0-9_ -]+$" + } + } + } + ] + } + } + } + } + } + } + } + } + }, + "/v1/teams/{teamId}": { + "delete": { + "description": "Delete a team under your account. You need to send a `DELETE` request with the desired team `id`. An optional array of reasons for deletion may also be sent.", + "operationId": "deleteTeam", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Delete a Team", + "tags": [ + "teams" + ], + "responses": { + "200": { + "description": "The Team was successfully deleted", + "content": { + "application/json": { + "schema": { + "properties": { + "id": { + "type": "string", + "description": "The ID of the deleted Team", + "example": "team_LLHUOMOoDlqOp8wPE4kFo9pE" + }, + "newDefaultTeamIdError": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Signifies whether the default team update has failed, when newDefaultTeamId is provided in request query.", + "example": true + } + }, + "required": [ + "id" + ], + "type": "object", + "description": "The Team was successfully deleted" + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid.\nOne of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "402": { + "description": "" + }, + "403": { + "description": "You do not have permission to access this resource.\nThe authenticated user can't access the team" + }, + "409": { + "description": "" + }, + "410": { + "description": "" + }, + "503": { + "description": "" + } + }, + "parameters": [ + { + "name": "newDefaultTeamId", + "description": "Id of the team to be set as the new default team", + "in": "query", + "required": false, + "schema": { + "type": "string", + "description": "Id of the team to be set as the new default team", + "example": "team_LLHUOMOoDlqOp8wPE4kFo9pE" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "path", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + }, + "required": true + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "additionalProperties": false, + "properties": { + "reasons": { + "type": "array", + "description": "Optional array of objects that describe the reason why the team is being deleted.", + "items": { + "type": "object", + "description": "An object describing the reason why the team is being deleted.", + "required": [ + "slug", + "description" + ], + "additionalProperties": false, + "properties": { + "slug": { + "type": "string", + "description": "Idenitifier slug of the reason why the team is being deleted." + }, + "description": { + "type": "string", + "description": "Description of the reason why the team is being deleted." + } + } + } + } + } + } + } + }, + "required": true + } + } + }, + "/v1/teams/{teamId}/invites/{inviteId}": { + "delete": { + "description": "Delete an active Team invite code.", + "operationId": "deleteTeamInviteCode", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Delete a Team invite code", + "tags": [ + "teams" + ], + "responses": { + "200": { + "description": "Successfully deleted Team invite code.", + "content": { + "application/json": { + "schema": { + "properties": { + "id": { + "type": "string", + "description": "ID of the team." + } + }, + "required": [ + "id" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource.\nInvite managed by directory sync\nNot authorized to access this team." + }, + "404": { + "description": "Team invite code not found." + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "inviteId", + "description": "The Team invite code ID.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "description": "The Team invite code ID.", + "example": "2wn2hudbr4chb1ecywo9dvzo7g9sscs6mzcz8htdde0txyom4l" + } + }, + { + "name": "teamId", + "description": "The Team identifier to perform the request on behalf of.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "description": "The Team identifier to perform the request on behalf of.", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + } + ] + } + }, + "/v1/teams/{teamId}/microfrontends/{groupId}": { + "patch": { + "description": "Updates a microfrontends group's settings.", + "operationId": "updateMicrofrontendsGroup", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Update a microfrontends group", + "tags": [ + "teams" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "updatedMicrofrontendsGroup": { + "properties": { + "name": { + "type": "string" + }, + "slug": { + "type": "string" + }, + "id": { + "type": "string" + }, + "fallbackEnvironment": { + "type": "string" + }, + "enablePolyrepoBranchRouting": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "id" + ], + "type": "object" + } + }, + "required": [ + "updatedMicrofrontendsGroup" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid.\nOne of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "groupId", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "path", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + }, + "required": true + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "name": { + "type": "string", + "example": "MFE Group 1", + "description": "The new name for the existing microfrontends group." + }, + "fallbackEnvironment": { + "type": "string", + "description": "The new fallback environment for the microfrontends group. Must be \"SAME_ENV\", \"PRODUCTION\", or a valid custom environment slug from the default app." + }, + "enablePolyrepoBranchRouting": { + "type": "boolean", + "description": "Whether Preview Deployments can link to branches with the same name in other Git repositories." + } + } + } + } + } + } + }, + "delete": { + "description": "Deletes a microfrontends group from the team associated with the group ID.", + "operationId": "deleteMicrofrontendsGroup", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Delete a microfrontends group", + "tags": [ + "teams" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + }, + "500": { + "description": "" + } + }, + "parameters": [ + { + "name": "groupId", + "description": "The microfrontend group ID to delete.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "example": "mfe_", + "description": "The microfrontend group ID to delete." + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "path", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + }, + "required": true + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + } + }, + "/v2/files": { + "post": { + "description": "Before you create a deployment you need to upload the required files for that deployment. To do it, you need to first upload each file to this endpoint. Once that's completed, you can create a new deployment with the uploaded files. The file content must be placed inside the body of the request. In the case of a successful response you'll receive a status code 200 with an empty body.", + "operationId": "uploadFile", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Upload Deployment Files", + "tags": [ + "deployments" + ], + "responses": { + "200": { + "description": "File already uploaded\nFile successfully uploaded", + "content": { + "application/json": { + "schema": { + "oneOf": [ + { + "properties": { + "urls": { + "items": { + "type": "string" + }, + "type": "array", + "description": "Array of URLs where the file was updated", + "example": [ + "example-upload.aws.com" + ] + } + }, + "required": [ + "urls" + ], + "type": "object" + }, + { + "type": "object" + } + ] + } + } + } + }, + "400": { + "description": "One of the provided values in the headers is invalid\nDigest is not valid\nFile size is not valid" + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "410": { + "description": "" + }, + "426": { + "description": "" + } + }, + "parameters": [ + { + "in": "header", + "description": "The file size in bytes", + "schema": { + "description": "The file size in bytes", + "type": "number" + }, + "name": "Content-Length" + }, + { + "in": "header", + "description": "The file SHA1 used to check the integrity", + "schema": { + "type": "string", + "description": "The file SHA1 used to check the integrity", + "maxLength": 40 + }, + "name": "x-vercel-digest" + }, + { + "in": "header", + "description": "The file SHA1 used to check the integrity", + "schema": { + "type": "string", + "description": "The file SHA1 used to check the integrity", + "maxLength": 40, + "deprecated": true + }, + "name": "x-now-digest" + }, + { + "in": "header", + "description": "The file size as an alternative to `Content-Length`", + "schema": { + "type": "number", + "deprecated": true, + "description": "The file size as an alternative to `Content-Length`" + }, + "name": "x-now-size" + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/octet-stream": { + "schema": { + "type": "string", + "format": "binary" + } + } + } + } + } + }, + "/v6/user/tokens": { + "get": { + "description": "Retrieve a list of the current User's authentication tokens.", + "operationId": "listAuthTokens", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "List Auth Tokens", + "tags": [ + "authentication" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "oneOf": [ + { + "properties": { + "tokens": { + "items": { + "$ref": "#/components/schemas/AuthToken" + }, + "type": "array" + }, + "pagination": { + "properties": { + "count": { + "type": "number" + }, + "next": { + "nullable": true, + "type": "string" + }, + "prev": { + "nullable": true, + "type": "string" + } + }, + "required": [ + "count", + "next", + "prev" + ], + "type": "object" + } + }, + "required": [ + "pagination", + "tokens" + ], + "type": "object" + }, + { + "properties": { + "tokens": { + "items": { + "$ref": "#/components/schemas/AuthToken" + }, + "type": "array" + }, + "pagination": { + "$ref": "#/components/schemas/Pagination" + } + }, + "required": [ + "pagination", + "tokens" + ], + "type": "object" + } + ] + } + } + } + }, + "400": { + "description": "" + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "410": { + "description": "" + } + }, + "x-vercel-cli": { + "supportedSubcommands": true, + "supportedProduction": false, + "aliases": [ + "list" + ] + }, + "parameters": [] + } + }, + "/v3/user/tokens": { + "post": { + "description": "Creates and returns a new authentication token for the currently authenticated User. The `bearerToken` property is only provided once, in the response body, so be sure to save it on the client for use with API requests.", + "operationId": "createAuthToken", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Create an Auth Token", + "tags": [ + "authentication" + ], + "responses": { + "200": { + "description": "Successful response.", + "content": { + "application/json": { + "schema": { + "properties": { + "token": { + "$ref": "#/components/schemas/AuthToken" + }, + "bearerToken": { + "type": "string", + "description": "The authentication token's actual value. This token is only provided in this response, and can never be retrieved again in the future. Be sure to save it somewhere safe!", + "example": "uRKJSTt0L4RaSkiMj41QTkxM" + } + }, + "required": [ + "bearerToken", + "token" + ], + "type": "object", + "description": "Successful response." + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "additionalProperties": false, + "required": [ + "name" + ], + "properties": { + "name": { + "type": "string" + }, + "expiresAt": { + "type": "number" + }, + "projectId": { + "type": "string", + "description": "The ID of the project to scope this token to" + } + } + } + } + }, + "required": true + } + } + }, + "/v5/user/tokens/{tokenId}": { + "get": { + "description": "Retrieve metadata about an authentication token belonging to the currently authenticated User.", + "operationId": "getAuthToken", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Get Auth Token Metadata", + "tags": [ + "authentication" + ], + "responses": { + "200": { + "description": "Successful response.", + "content": { + "application/json": { + "schema": { + "properties": { + "token": { + "$ref": "#/components/schemas/AuthToken" + } + }, + "required": [ + "token" + ], + "type": "object", + "description": "Successful response." + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "" + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "Token not found with the requested `tokenId`." + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "tokenId", + "description": "The identifier of the token to retrieve. The special value \"current\" may be supplied, which returns the metadata for the token that the current HTTP request is authenticated with.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "description": "The identifier of the token to retrieve. The special value \"current\" may be supplied, which returns the metadata for the token that the current HTTP request is authenticated with.", + "example": "5d9f2ebd38ddca62e5d51e9c1704c72530bdc8bfdd41e782a6687c48399e8391" + } + } + ] + } + }, + "/v3/user/tokens/{tokenId}": { + "delete": { + "description": "Invalidate an authentication token, such that it will no longer be valid for future HTTP requests.", + "operationId": "deleteAuthToken", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Delete an authentication token", + "tags": [ + "authentication" + ], + "responses": { + "200": { + "description": "Authentication token successfully deleted.", + "content": { + "application/json": { + "schema": { + "properties": { + "tokenId": { + "type": "string", + "description": "The unique identifier of the token that was deleted.", + "example": "5d9f2ebd38ddca62e5d51e9c1704c72530bdc8bfdd41e782a6687c48399e8391" + } + }, + "required": [ + "tokenId" + ], + "type": "object", + "description": "Authentication token successfully deleted." + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "" + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "Token not found with the requested `tokenId`." + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "tokenId", + "description": "The identifier of the token to invalidate. The special value \"current\" may be supplied, which invalidates the token that the HTTP request was authenticated with.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "description": "The identifier of the token to invalidate. The special value \"current\" may be supplied, which invalidates the token that the HTTP request was authenticated with.", + "example": "5d9f2ebd38ddca62e5d51e9c1704c72530bdc8bfdd41e782a6687c48399e8391" + } + } + ] + } + }, + "/v2/user": { + "get": { + "description": "Retrieves information related to the currently authenticated User.", + "operationId": "getAuthUser", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Get the User", + "tags": [ + "user" + ], + "responses": { + "200": { + "description": "Successful response.", + "content": { + "application/json": { + "schema": { + "properties": { + "user": { + "oneOf": [ + { + "$ref": "#/components/schemas/AuthUser" + }, + { + "$ref": "#/components/schemas/AuthUserLimited" + } + ] + } + }, + "required": [ + "user" + ], + "type": "object", + "description": "Successful response.", + "x-vercel-cli": { + "displayProperty": "user", + "displayColumns": { + "name": "user.name", + "id": "user.id", + "email": "user.email", + "username": "user.username", + "defaultTeamId": "user.defaultTeamId", + "createdAt": "user.createdAt", + "blockedAt": "user.softBlock.blockedAt", + "blockedReason": "user.softBlock.reason" + } + } + } + } + } + }, + "302": { + "description": "" + }, + "400": { + "description": "" + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "409": { + "description": "" + }, + "410": { + "description": "" + } + }, + "x-vercel-cli": { + "supportedSubcommands": true, + "supportedProduction": false + }, + "parameters": [], + "x-speakeasy-test": false + } + }, + "/v1/user": { + "delete": { + "description": "Initiates the deletion process for the currently authenticated User, by sending a deletion confirmation email. The email contains a link that the user needs to visit in order to proceed with the deletion process.", + "operationId": "requestDelete", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Delete User Account", + "tags": [ + "user" + ], + "responses": { + "202": { + "description": "Response indicating that the User deletion process has been initiated, and a confirmation email has been sent.", + "content": { + "application/json": { + "schema": { + "properties": { + "id": { + "type": "string", + "description": "Unique identifier of the User who has initiated deletion." + }, + "email": { + "type": "string", + "description": "Email address of the User who has initiated deletion." + }, + "message": { + "type": "string", + "description": "User deletion progress status.", + "example": "Verification email sent" + } + }, + "required": [ + "email", + "id", + "message" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid." + }, + "401": { + "description": "" + }, + "402": { + "description": "" + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "410": { + "description": "" + } + }, + "parameters": [], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "additionalProperties": false, + "properties": { + "reasons": { + "type": "array", + "description": "Optional array of objects that describe the reason why the User account is being deleted.", + "items": { + "type": "object", + "description": "An object describing the reason why the User account is being deleted.", + "required": [ + "slug", + "description" + ], + "additionalProperties": false, + "properties": { + "slug": { + "type": "string", + "description": "Idenitifier slug of the reason why the User account is being deleted." + }, + "description": { + "type": "string", + "description": "Description of the reason why the User account is being deleted." + } + } + } + } + } + } + } + }, + "required": true + } + } + }, + "/v1/vcr/repository": { + "post": { + "description": "Create a container registry repository for a project.", + "operationId": "createRepository", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Create a repository", + "tags": [ + "vcr" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "repository": { + "$ref": "#/components/schemas/VcrRepository" + } + }, + "required": [ + "repository" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "402": { + "description": "The account is missing a payment so payment method must be updated" + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "409": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "additionalProperties": false, + "required": [ + "projectId", + "name" + ], + "properties": { + "projectId": { + "type": "string", + "description": "Project ID. Missing or empty values return HTTP 400." + }, + "name": { + "type": "string", + "pattern": "^[a-z0-9]+(?:(?:\\\\.|_|__|-+)[a-z0-9]+)*$", + "maxLength": 255, + "description": "Single Docker repository name component.", + "example": "nginx" + } + } + } + } + } + } + }, + "get": { + "description": "List container registry repositories for a project.", + "operationId": "listRepositories", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "List repositories", + "tags": [ + "vcr" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/VcrRepositoryList" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "projectId", + "description": "Project ID. Missing or empty values return HTTP 400.", + "in": "query", + "required": true, + "schema": { + "type": "string", + "description": "Project ID. Missing or empty values return HTTP 400." + } + }, + { + "name": "limit", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "minimum": 1, + "maximum": 1000 + } + }, + { + "name": "cursor", + "description": "Opaque pagination cursor returned by a previous list response.", + "in": "query", + "required": false, + "schema": { + "type": "string", + "maxLength": 1024, + "description": "Opaque pagination cursor returned by a previous list response." + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + } + }, + "/v1/vcr/repository/{idOrName}": { + "get": { + "description": "Fetch a container registry repository for a project by ID or name.", + "operationId": "getRepository", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Get a repository", + "tags": [ + "vcr" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "repository": { + "$ref": "#/components/schemas/VcrRepository" + } + }, + "required": [ + "repository" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "projectId", + "description": "Project ID. Missing or empty values return HTTP 400.", + "in": "query", + "required": true, + "schema": { + "type": "string", + "description": "Project ID. Missing or empty values return HTTP 400." + } + }, + { + "name": "idOrName", + "in": "path", + "required": true, + "schema": { + "type": "string", + "maxLength": 255 + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + }, + "delete": { + "description": "Schedule a repository for deletion. The repository is marked so it disappears from list/get immediately; subscriber-vcr reclaims every image (manifests, blobs, tags and rows) and finally deletes the repository row asynchronously via the VcrRepositoryRemoved event.", + "operationId": "deleteRepository", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Delete a repository", + "tags": [ + "vcr" + ], + "responses": { + "202": { + "description": "", + "content": { + "application/json": { + "schema": { + "nullable": true + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "projectId", + "description": "Project ID. Missing or empty values return HTTP 400.", + "in": "query", + "required": true, + "schema": { + "type": "string", + "description": "Project ID. Missing or empty values return HTTP 400." + } + }, + { + "name": "idOrName", + "in": "path", + "required": true, + "schema": { + "type": "string", + "maxLength": 255 + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + } + }, + "/v1/vcr/repository/{idOrName}/images": { + "get": { + "description": "List images for a container registry repository, including their tags.", + "operationId": "listRepositoryImages", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "List repository images", + "tags": [ + "vcr" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/VcrImageList" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "projectId", + "description": "Project ID. Missing or empty values return HTTP 400.", + "in": "query", + "required": true, + "schema": { + "type": "string", + "description": "Project ID. Missing or empty values return HTTP 400." + } + }, + { + "name": "idOrName", + "in": "path", + "required": true, + "schema": { + "type": "string", + "maxLength": 255 + } + }, + { + "name": "limit", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "minimum": 1, + "maximum": 100 + } + }, + { + "name": "cursor", + "description": "Opaque pagination cursor returned by a previous list response.", + "in": "query", + "required": false, + "schema": { + "type": "string", + "maxLength": 1024, + "description": "Opaque pagination cursor returned by a previous list response." + } + }, + { + "name": "untagged", + "in": "query", + "required": false, + "schema": { + "type": "boolean" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + } + }, + "/v1/vcr/repository/{idOrName}/permissions": { + "post": { + "description": "Grant a team access to a VCR repository. Sharing applies to the whole repository.", + "operationId": "addRepositoryPermission", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Add a repository permission", + "tags": [ + "vcr" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "permission": { + "$ref": "#/components/schemas/VcrRepositoryPermission" + } + }, + "required": [ + "permission" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid.\nOne of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "projectId", + "description": "Project ID. Missing or empty values return HTTP 400.", + "in": "query", + "required": true, + "schema": { + "type": "string", + "description": "Project ID. Missing or empty values return HTTP 400." + } + }, + { + "name": "idOrName", + "in": "path", + "required": true, + "schema": { + "type": "string", + "maxLength": 255 + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "additionalProperties": false, + "properties": { + "teamId": { + "type": "string", + "pattern": "^team_[a-zA-Z0-9]+$", + "maxLength": 64, + "description": "ID of a team that is granted access to a repository.", + "example": "team_LLHUOMOoDlqOp8wPE4kFo9pE" + }, + "teamSlug": { + "type": "string", + "pattern": "^[a-z0-9](?:[a-z0-9-]{0,46}[a-z0-9])?$", + "maxLength": 64, + "description": "Slug of a team that is granted access to a repository.", + "example": "my-team" + } + } + } + } + } + } + }, + "delete": { + "description": "Revoke a team's access to a VCR repository.", + "operationId": "removeRepositoryPermission", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Remove a repository permission", + "tags": [ + "vcr" + ], + "responses": { + "204": { + "description": "", + "content": { + "application/json": { + "schema": { + "nullable": true + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid.\nOne of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "projectId", + "description": "Project ID. Missing or empty values return HTTP 400.", + "in": "query", + "required": true, + "schema": { + "type": "string", + "description": "Project ID. Missing or empty values return HTTP 400." + } + }, + { + "name": "idOrName", + "in": "path", + "required": true, + "schema": { + "type": "string", + "maxLength": 255 + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "additionalProperties": false, + "properties": { + "teamId": { + "type": "string", + "pattern": "^team_[a-zA-Z0-9]+$", + "maxLength": 64, + "description": "ID of a team that is granted access to a repository.", + "example": "team_LLHUOMOoDlqOp8wPE4kFo9pE" + }, + "teamSlug": { + "type": "string", + "pattern": "^[a-z0-9](?:[a-z0-9-]{0,46}[a-z0-9])?$", + "maxLength": 64, + "description": "Slug of a team that is granted access to a repository.", + "example": "my-team" + } + } + } + } + } + } + }, + "get": { + "description": "List the teams a VCR repository is shared with.", + "operationId": "listRepositoryPermissions", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "List repository permissions", + "tags": [ + "vcr" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/VcrRepositoryPermissionList" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "projectId", + "description": "Project ID. Missing or empty values return HTTP 400.", + "in": "query", + "required": true, + "schema": { + "type": "string", + "description": "Project ID. Missing or empty values return HTTP 400." + } + }, + { + "name": "idOrName", + "in": "path", + "required": true, + "schema": { + "type": "string", + "maxLength": 255 + } + }, + { + "name": "limit", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "minimum": 1, + "maximum": 100 + } + }, + { + "name": "cursor", + "description": "Opaque pagination cursor returned by a previous list response.", + "in": "query", + "required": false, + "schema": { + "type": "string", + "maxLength": 1024, + "description": "Opaque pagination cursor returned by a previous list response." + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + } + }, + "/v1/vcr/repository/{idOrName}/permissions/all": { + "delete": { + "description": "Revoke every team's access to a VCR repository. Clearing an unshared repository is a no-op.", + "operationId": "clearRepositoryPermissions", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Clear all repository permissions", + "tags": [ + "vcr" + ], + "responses": { + "204": { + "description": "", + "content": { + "application/json": { + "schema": { + "nullable": true + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "projectId", + "description": "Project ID. Missing or empty values return HTTP 400.", + "in": "query", + "required": true, + "schema": { + "type": "string", + "description": "Project ID. Missing or empty values return HTTP 400." + } + }, + { + "name": "idOrName", + "in": "path", + "required": true, + "schema": { + "type": "string", + "maxLength": 255 + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + } + }, + "/v1/vcr/repository/{idOrName}/tags": { + "get": { + "description": "List a repository's tags.", + "operationId": "listRepositoryTags", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "List repository tags", + "tags": [ + "vcr" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "tags": { + "items": { + "properties": { + "tag": { + "type": "string" + }, + "manifestDigest": { + "type": "string" + }, + "imageId": { + "type": "string" + }, + "kind": { + "type": "string", + "enum": [ + "attestation", + "index", + "manifest" + ] + }, + "platform": { + "type": "string" + }, + "arch": { + "type": "string" + }, + "pushedBy": { + "type": "string" + }, + "status": { + "nullable": true, + "type": "string", + "enum": [ + "preparing", + "ready", + "unoptimized", + null + ] + }, + "sizeInBytes": { + "type": "number" + }, + "createdAt": { + "type": "string" + }, + "updatedAt": { + "type": "string" + } + }, + "required": [ + "createdAt", + "imageId", + "kind", + "manifestDigest", + "sizeInBytes", + "status", + "tag", + "updatedAt" + ], + "type": "object" + }, + "type": "array" + }, + "nextCursor": { + "type": "string" + } + }, + "required": [ + "tags" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "projectId", + "description": "Project ID. Missing or empty values return HTTP 400.", + "in": "query", + "required": true, + "schema": { + "type": "string", + "description": "Project ID. Missing or empty values return HTTP 400." + } + }, + { + "name": "idOrName", + "in": "path", + "required": true, + "schema": { + "type": "string", + "maxLength": 255 + } + }, + { + "name": "limit", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "minimum": 1, + "maximum": 100 + } + }, + { + "name": "cursor", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "sortBy", + "description": "Field to sort the non-pinned tags by.", + "in": "query", + "required": false, + "schema": { + "description": "Field to sort the non-pinned tags by.", + "type": "string", + "enum": [ + "updatedAt", + "tag" + ], + "default": "updatedAt" + } + }, + { + "name": "sortOrder", + "description": "Sort direction. Defaults to desc.", + "in": "query", + "required": false, + "schema": { + "description": "Sort direction. Defaults to desc.", + "type": "string", + "enum": [ + "asc", + "desc" + ], + "default": "desc" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + } + }, + "/v1/vcr/repository/{idOrName}/tags/{tag}": { + "get": { + "description": "Fetch a single tag from a repository, including the backing image's metadata and VHS-readiness status.", + "operationId": "getRepositoryTag", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Get a repository tag", + "tags": [ + "vcr" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "tag": { + "$ref": "#/components/schemas/VcrTag" + } + }, + "required": [ + "tag" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "projectId", + "description": "Project ID. Missing or empty values return HTTP 400.", + "in": "query", + "required": true, + "schema": { + "type": "string", + "description": "Project ID. Missing or empty values return HTTP 400." + } + }, + { + "name": "idOrName", + "in": "path", + "required": true, + "schema": { + "type": "string", + "maxLength": 255 + } + }, + { + "name": "tag", + "in": "path", + "required": true, + "schema": { + "type": "string", + "maxLength": 255 + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + } + }, + "/v1/vcr/repository/{idOrName}/images/{imageIdOrDigest}": { + "get": { + "description": "Fetch an individual image from a repository, including its tags and Dockerfile history entries with discriminated layer details for UI rendering. The image may be addressed by its internal id (`image_...`) or by its manifest digest (`sha256:...`).", + "operationId": "getRepositoryImage", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Get a repository image", + "tags": [ + "vcr" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "image": { + "$ref": "#/components/schemas/VcrImageDetail" + } + }, + "required": [ + "image" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "projectId", + "description": "Project ID. Missing or empty values return HTTP 400.", + "in": "query", + "required": true, + "schema": { + "type": "string", + "description": "Project ID. Missing or empty values return HTTP 400." + } + }, + { + "name": "idOrName", + "in": "path", + "required": true, + "schema": { + "type": "string", + "maxLength": 255 + } + }, + { + "name": "imageIdOrDigest", + "description": "The internal image id (`image_...`) or the image manifest digest (`sha256:...`).", + "in": "path", + "required": true, + "schema": { + "type": "string", + "maxLength": 255, + "description": "The internal image id (`image_...`) or the image manifest digest (`sha256:...`)." + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + } + }, + "/v1/vcr/repository/{idOrName}/images/{imageId}": { + "delete": { + "description": "Schedule an image for deletion. The image is marked so it disappears from list/get immediately; subscriber-vcr reclaims the manifest, blobs, tags and row asynchronously via the VcrManifestRemoved event.", + "operationId": "deleteRepositoryImage", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Delete a repository image", + "tags": [ + "vcr" + ], + "responses": { + "202": { + "description": "", + "content": { + "application/json": { + "schema": { + "nullable": true + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "projectId", + "description": "Project ID. Missing or empty values return HTTP 400.", + "in": "query", + "required": true, + "schema": { + "type": "string", + "description": "Project ID. Missing or empty values return HTTP 400." + } + }, + { + "name": "idOrName", + "in": "path", + "required": true, + "schema": { + "type": "string", + "maxLength": 255 + } + }, + { + "name": "imageId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "maxLength": 255 + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + } + }, + "/v2/": { + "get": { + "description": "GET /v2/ Docker Registry v2 version check. Returns a 401 challenge when no credentials are provided, prompting the Docker client to send auth. With valid credentials, returns 200 so the client can proceed.", + "operationId": "getRoot", + "security": [], + "summary": "Check registry API version support", + "tags": [ + "vcr" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object" + } + } + } + }, + "400": { + "description": "" + }, + "401": { + "description": "The request is not authorized." + }, + "402": { + "description": "The account is missing a payment so payment method must be updated" + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [] + } + }, + "/v2/{teamSlug}/{projectSlug}/{repositoryName}/blobs/{digest}": { + "head": { + "description": "HEAD /v2/:teamSlug/:projectSlug/:repositoryName/blobs/:digest Check whether a blob exists. Used by the Docker client before pushing a layer to avoid re-uploading content that already exists.", + "operationId": "headByTeamSlugByProjectSlugByRepositoryNameBlobsByDigest", + "security": [], + "summary": "Check if a blob exists", + "tags": [ + "vcr" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "nullable": true + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "402": { + "description": "The account is missing a payment so payment method must be updated" + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "teamSlug", + "description": "Single Docker repository team slug component.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "pattern": "^[a-z0-9](?:[a-z0-9-]{0,46}[a-z0-9])?$", + "maxLength": 255, + "description": "Single Docker repository team slug component.", + "example": "team-slug" + } + }, + { + "name": "projectSlug", + "description": "Single Docker repository project slug component.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "pattern": "^[a-z0-9](?:[a-z0-9-]{0,46}[a-z0-9])?$", + "maxLength": 255, + "description": "Single Docker repository project slug component.", + "example": "project-slug" + } + }, + { + "name": "repositoryName", + "description": "Single Docker repository name component.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "pattern": "^[a-z0-9]+(?:(?:\\\\.|_|__|-+)[a-z0-9]+)*$", + "maxLength": 255, + "description": "Single Docker repository name component.", + "example": "nginx" + } + }, + { + "name": "digest", + "description": "Content-addressable digest (algorithm:hex).", + "in": "path", + "required": true, + "schema": { + "type": "string", + "pattern": "^[A-Za-z0-9_+.-]+:[A-Fa-f0-9]+$", + "maxLength": 255, + "description": "Content-addressable digest (algorithm:hex).", + "example": "sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + } + ] + }, + "get": { + "description": "GET /v2/:teamSlug/:projectSlug/:repositoryName/blobs/:digest Fetch a blob by digest.", + "operationId": "getByTeamSlugByProjectSlugByRepositoryNameBlobsByDigest", + "security": [], + "summary": "Download a blob", + "tags": [ + "vcr" + ], + "responses": { + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "402": { + "description": "The account is missing a payment so payment method must be updated" + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + }, + "416": { + "description": "" + } + }, + "parameters": [ + { + "name": "teamSlug", + "description": "Single Docker repository team slug component.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "pattern": "^[a-z0-9](?:[a-z0-9-]{0,46}[a-z0-9])?$", + "maxLength": 255, + "description": "Single Docker repository team slug component.", + "example": "team-slug" + } + }, + { + "name": "projectSlug", + "description": "Single Docker repository project slug component.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "pattern": "^[a-z0-9](?:[a-z0-9-]{0,46}[a-z0-9])?$", + "maxLength": 255, + "description": "Single Docker repository project slug component.", + "example": "project-slug" + } + }, + { + "name": "repositoryName", + "description": "Single Docker repository name component.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "pattern": "^[a-z0-9]+(?:(?:\\\\.|_|__|-+)[a-z0-9]+)*$", + "maxLength": 255, + "description": "Single Docker repository name component.", + "example": "nginx" + } + }, + { + "name": "digest", + "description": "Content-addressable digest (algorithm:hex).", + "in": "path", + "required": true, + "schema": { + "type": "string", + "pattern": "^[A-Za-z0-9_+.-]+:[A-Fa-f0-9]+$", + "maxLength": 255, + "description": "Content-addressable digest (algorithm:hex).", + "example": "sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + } + ] + }, + "delete": { + "description": "DELETE /v2/:teamSlug/:projectSlug/:repositoryName/blobs/:digest Blob deletion is intentionally not supported. Matches the behaviour of most public registries.", + "operationId": "deleteByTeamSlugByProjectSlugByRepositoryNameBlobsByDigest", + "security": [], + "summary": "Delete a blob", + "tags": [ + "vcr" + ], + "responses": { + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "402": { + "description": "The account is missing a payment so payment method must be updated" + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "405": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "teamSlug", + "description": "Single Docker repository team slug component.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "pattern": "^[a-z0-9](?:[a-z0-9-]{0,46}[a-z0-9])?$", + "maxLength": 255, + "description": "Single Docker repository team slug component.", + "example": "team-slug" + } + }, + { + "name": "projectSlug", + "description": "Single Docker repository project slug component.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "pattern": "^[a-z0-9](?:[a-z0-9-]{0,46}[a-z0-9])?$", + "maxLength": 255, + "description": "Single Docker repository project slug component.", + "example": "project-slug" + } + }, + { + "name": "repositoryName", + "description": "Single Docker repository name component.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "pattern": "^[a-z0-9]+(?:(?:\\\\.|_|__|-+)[a-z0-9]+)*$", + "maxLength": 255, + "description": "Single Docker repository name component.", + "example": "nginx" + } + }, + { + "name": "digest", + "description": "Content-addressable digest (algorithm:hex).", + "in": "path", + "required": true, + "schema": { + "type": "string", + "pattern": "^[A-Za-z0-9_+.-]+:[A-Fa-f0-9]+$", + "maxLength": 255, + "description": "Content-addressable digest (algorithm:hex).", + "example": "sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + } + ] + } + }, + "/v2/{teamSlug}/{projectSlug}/{repositoryName}/blobs/uploads/{uuid}": { + "get": { + "description": "GET /v2/:teamSlug/:projectSlug/:repositoryName/blobs/uploads/:uuid Query the status of an in-progress blob upload. Used by clients to resume a partial upload after an interruption.", + "operationId": "getByTeamSlugByProjectSlugByRepositoryNameBlobsUploadsByUuid", + "security": [], + "summary": "Get blob upload status", + "tags": [ + "vcr" + ], + "responses": { + "204": { + "description": "", + "content": { + "application/json": { + "schema": { + "nullable": true + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "402": { + "description": "The account is missing a payment so payment method must be updated" + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "teamSlug", + "description": "Single Docker repository team slug component.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "pattern": "^[a-z0-9](?:[a-z0-9-]{0,46}[a-z0-9])?$", + "maxLength": 255, + "description": "Single Docker repository team slug component.", + "example": "team-slug" + } + }, + { + "name": "projectSlug", + "description": "Single Docker repository project slug component.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "pattern": "^[a-z0-9](?:[a-z0-9-]{0,46}[a-z0-9])?$", + "maxLength": 255, + "description": "Single Docker repository project slug component.", + "example": "project-slug" + } + }, + { + "name": "repositoryName", + "description": "Single Docker repository name component.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "pattern": "^[a-z0-9]+(?:(?:\\\\.|_|__|-+)[a-z0-9]+)*$", + "maxLength": 255, + "description": "Single Docker repository name component.", + "example": "nginx" + } + }, + { + "name": "uuid", + "description": "Blob upload session identifier.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "pattern": "^[a-f0-9]{40}$", + "maxLength": 40, + "description": "Blob upload session identifier.", + "example": "0123456789abcdef0123456789abcdef01234567" + } + } + ] + }, + "delete": { + "description": "DELETE /v2/:teamSlug/:projectSlug/:repositoryName/blobs/uploads/:uuid Cancel an in-flight blob upload. Aborts the underlying S3 multipart upload (if one was started) and discards the session.", + "operationId": "deleteByTeamSlugByProjectSlugByRepositoryNameBlobsUploadsByUuid", + "security": [], + "summary": "Cancel a blob upload", + "tags": [ + "vcr" + ], + "responses": { + "204": { + "description": "", + "content": { + "application/json": { + "schema": { + "nullable": true + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "402": { + "description": "The account is missing a payment so payment method must be updated" + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "teamSlug", + "description": "Single Docker repository team slug component.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "pattern": "^[a-z0-9](?:[a-z0-9-]{0,46}[a-z0-9])?$", + "maxLength": 255, + "description": "Single Docker repository team slug component.", + "example": "team-slug" + } + }, + { + "name": "projectSlug", + "description": "Single Docker repository project slug component.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "pattern": "^[a-z0-9](?:[a-z0-9-]{0,46}[a-z0-9])?$", + "maxLength": 255, + "description": "Single Docker repository project slug component.", + "example": "project-slug" + } + }, + { + "name": "repositoryName", + "description": "Single Docker repository name component.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "pattern": "^[a-z0-9]+(?:(?:\\\\.|_|__|-+)[a-z0-9]+)*$", + "maxLength": 255, + "description": "Single Docker repository name component.", + "example": "nginx" + } + }, + { + "name": "uuid", + "description": "Blob upload session identifier.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "pattern": "^[a-f0-9]{40}$", + "maxLength": 40, + "description": "Blob upload session identifier.", + "example": "0123456789abcdef0123456789abcdef01234567" + } + } + ] + }, + "patch": { + "description": "PATCH /v2/:teamSlug/:projectSlug/:repositoryName/blobs/uploads/:uuid Upload a chunk of blob data. The request body is streamed directly to S3 as a multipart upload part while hashing incrementally. The client may call this multiple times for chunked uploads.", + "operationId": "updateByTeamSlugByProjectSlugByRepositoryNameBlobsUploadsByUuid", + "security": [], + "summary": "Upload a blob chunk", + "tags": [ + "vcr" + ], + "responses": { + "202": { + "description": "", + "content": { + "application/json": { + "schema": { + "nullable": true + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "402": { + "description": "The account is missing a payment so payment method must be updated" + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + }, + "413": { + "description": "" + } + }, + "parameters": [ + { + "name": "teamSlug", + "description": "Single Docker repository team slug component.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "pattern": "^[a-z0-9](?:[a-z0-9-]{0,46}[a-z0-9])?$", + "maxLength": 255, + "description": "Single Docker repository team slug component.", + "example": "team-slug" + } + }, + { + "name": "projectSlug", + "description": "Single Docker repository project slug component.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "pattern": "^[a-z0-9](?:[a-z0-9-]{0,46}[a-z0-9])?$", + "maxLength": 255, + "description": "Single Docker repository project slug component.", + "example": "project-slug" + } + }, + { + "name": "repositoryName", + "description": "Single Docker repository name component.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "pattern": "^[a-z0-9]+(?:(?:\\\\.|_|__|-+)[a-z0-9]+)*$", + "maxLength": 255, + "description": "Single Docker repository name component.", + "example": "nginx" + } + }, + { + "name": "uuid", + "description": "Blob upload session identifier.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "pattern": "^[a-f0-9]{40}$", + "maxLength": 40, + "description": "Blob upload session identifier.", + "example": "0123456789abcdef0123456789abcdef01234567" + } + } + ] + }, + "put": { + "description": "PUT /v2/:teamSlug/:projectSlug/:repositoryName/blobs/uploads/:uuid?digest=\u003cdigest\u003e Complete the blob upload. This may include a final chunk of data in the request body (monolithic upload) or just finalize a previous chunked upload.", + "operationId": "replaceByTeamSlugByProjectSlugByRepositoryNameBlobsUploadsByUuid", + "security": [], + "summary": "Complete a blob upload", + "tags": [ + "vcr" + ], + "responses": { + "201": { + "description": "", + "content": { + "application/json": { + "schema": { + "nullable": true + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "402": { + "description": "The account is missing a payment so payment method must be updated" + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + }, + "413": { + "description": "" + } + }, + "parameters": [ + { + "name": "teamSlug", + "description": "Single Docker repository team slug component.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "pattern": "^[a-z0-9](?:[a-z0-9-]{0,46}[a-z0-9])?$", + "maxLength": 255, + "description": "Single Docker repository team slug component.", + "example": "team-slug" + } + }, + { + "name": "projectSlug", + "description": "Single Docker repository project slug component.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "pattern": "^[a-z0-9](?:[a-z0-9-]{0,46}[a-z0-9])?$", + "maxLength": 255, + "description": "Single Docker repository project slug component.", + "example": "project-slug" + } + }, + { + "name": "repositoryName", + "description": "Single Docker repository name component.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "pattern": "^[a-z0-9]+(?:(?:\\\\.|_|__|-+)[a-z0-9]+)*$", + "maxLength": 255, + "description": "Single Docker repository name component.", + "example": "nginx" + } + }, + { + "name": "uuid", + "description": "Blob upload session identifier.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "pattern": "^[a-f0-9]{40}$", + "maxLength": 40, + "description": "Blob upload session identifier.", + "example": "0123456789abcdef0123456789abcdef01234567" + } + }, + { + "name": "digest", + "description": "Content-addressable digest (algorithm:hex).", + "in": "query", + "required": true, + "schema": { + "type": "string", + "pattern": "^[A-Za-z0-9_+.-]+:[A-Fa-f0-9]+$", + "maxLength": 255, + "description": "Content-addressable digest (algorithm:hex).", + "example": "sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + } + ] + } + }, + "/v2/{teamSlug}/{projectSlug}/{repositoryName}/blobs/uploads/": { + "post": { + "description": "POST /v2/:teamSlug/:projectSlug/:repositoryName/blobs/uploads/[?mount=\u003cdigest\u003e\u0026from=\u003crepo\u003e] Initiate a blob upload. Returns a UUID in the Location header that the client uses for subsequent PATCH (chunk) and PUT (complete) requests.", + "operationId": "createByTeamSlugByProjectSlugByRepositoryNameBlobsUploads", + "security": [], + "summary": "Start a blob upload", + "tags": [ + "vcr" + ], + "responses": { + "202": { + "description": "", + "content": { + "application/json": { + "schema": { + "nullable": true + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "402": { + "description": "The account is missing a payment so payment method must be updated" + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "teamSlug", + "description": "Single Docker repository team slug component.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "pattern": "^[a-z0-9](?:[a-z0-9-]{0,46}[a-z0-9])?$", + "maxLength": 255, + "description": "Single Docker repository team slug component.", + "example": "team-slug" + } + }, + { + "name": "projectSlug", + "description": "Single Docker repository project slug component.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "pattern": "^[a-z0-9](?:[a-z0-9-]{0,46}[a-z0-9])?$", + "maxLength": 255, + "description": "Single Docker repository project slug component.", + "example": "project-slug" + } + }, + { + "name": "repositoryName", + "description": "Single Docker repository name component.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "pattern": "^[a-z0-9]+(?:(?:\\\\.|_|__|-+)[a-z0-9]+)*$", + "maxLength": 255, + "description": "Single Docker repository name component.", + "example": "nginx" + } + }, + { + "name": "mount", + "description": "Digest of the blob to mount from another repository.", + "in": "query", + "required": false, + "schema": { + "type": "string", + "pattern": "^[A-Za-z0-9_+.-]+:[A-Fa-f0-9]+$", + "maxLength": 255, + "description": "Digest of the blob to mount from another repository." + } + }, + { + "name": "from", + "description": "Source repository to mount the blob from.", + "in": "query", + "required": false, + "schema": { + "type": "string", + "pattern": "^[a-z0-9](?:[a-z0-9-]{0,46}[a-z0-9])?\\\\/[a-z0-9](?:[a-z0-9-]{0,46}[a-z0-9])?\\\\/[a-z0-9]+(?:(?:\\\\.|_|__|-+)[a-z0-9]+)*$", + "maxLength": 255, + "description": "Source repository to mount the blob from." + } + } + ] + } + }, + "/v2/{teamSlug}/{projectSlug}/{repositoryName}/manifests/{reference}": { + "put": { + "description": "PUT /v2/:teamSlug/:projectSlug/:repositoryName/manifests/:reference Upload an image manifest. The digest is computed from the body and returned in the Docker-Content-Digest header.", + "operationId": "replaceByTeamSlugByProjectSlugByRepositoryNameManifestsByReference", + "security": [], + "summary": "Push an image manifest", + "tags": [ + "vcr" + ], + "responses": { + "201": { + "description": "", + "content": { + "application/json": { + "schema": { + "nullable": true + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "402": { + "description": "The account is missing a payment so payment method must be updated" + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + }, + "413": { + "description": "" + } + }, + "parameters": [ + { + "name": "teamSlug", + "description": "Single Docker repository team slug component.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "pattern": "^[a-z0-9](?:[a-z0-9-]{0,46}[a-z0-9])?$", + "maxLength": 255, + "description": "Single Docker repository team slug component.", + "example": "team-slug" + } + }, + { + "name": "projectSlug", + "description": "Single Docker repository project slug component.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "pattern": "^[a-z0-9](?:[a-z0-9-]{0,46}[a-z0-9])?$", + "maxLength": 255, + "description": "Single Docker repository project slug component.", + "example": "project-slug" + } + }, + { + "name": "repositoryName", + "description": "Single Docker repository name component.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "pattern": "^[a-z0-9]+(?:(?:\\\\.|_|__|-+)[a-z0-9]+)*$", + "maxLength": 255, + "description": "Single Docker repository name component.", + "example": "nginx" + } + }, + { + "name": "reference", + "description": "Manifest reference: a tag or digest.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "pattern": "^(?:[a-zA-Z0-9_][a-zA-Z0-9._-]{0,127}|[A-Za-z0-9_+.-]+:[A-Fa-f0-9]+)$", + "maxLength": 255, + "description": "Manifest reference: a tag or digest.", + "example": "latest" + } + } + ] + }, + "head": { + "description": "HEAD /v2/:teamSlug/:projectSlug/:repositoryName/manifests/:reference Check whether a manifest exists. Used by Docker client during push to determine if a manifest (or config blob referenced by digest) is already present.", + "operationId": "headByTeamSlugByProjectSlugByRepositoryNameManifestsByReference", + "security": [], + "summary": "Check if a manifest exists", + "tags": [ + "vcr" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "nullable": true + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "402": { + "description": "The account is missing a payment so payment method must be updated" + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "teamSlug", + "description": "Single Docker repository team slug component.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "pattern": "^[a-z0-9](?:[a-z0-9-]{0,46}[a-z0-9])?$", + "maxLength": 255, + "description": "Single Docker repository team slug component.", + "example": "team-slug" + } + }, + { + "name": "projectSlug", + "description": "Single Docker repository project slug component.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "pattern": "^[a-z0-9](?:[a-z0-9-]{0,46}[a-z0-9])?$", + "maxLength": 255, + "description": "Single Docker repository project slug component.", + "example": "project-slug" + } + }, + { + "name": "repositoryName", + "description": "Single Docker repository name component.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "pattern": "^[a-z0-9]+(?:(?:\\\\.|_|__|-+)[a-z0-9]+)*$", + "maxLength": 255, + "description": "Single Docker repository name component.", + "example": "nginx" + } + }, + { + "name": "reference", + "description": "Manifest reference: a tag or digest.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "pattern": "^(?:[a-zA-Z0-9_][a-zA-Z0-9._-]{0,127}|[A-Za-z0-9_+.-]+:[A-Fa-f0-9]+)$", + "maxLength": 255, + "description": "Manifest reference: a tag or digest.", + "example": "latest" + } + } + ] + }, + "get": { + "description": "GET /v2/:teamSlug/:projectSlug/:repositoryName/manifests/:reference Fetch a manifest by tag or digest.", + "operationId": "getByTeamSlugByProjectSlugByRepositoryNameManifestsByReference", + "security": [], + "summary": "Pull an image manifest", + "tags": [ + "vcr" + ], + "responses": { + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "402": { + "description": "The account is missing a payment so payment method must be updated" + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "teamSlug", + "description": "Single Docker repository team slug component.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "pattern": "^[a-z0-9](?:[a-z0-9-]{0,46}[a-z0-9])?$", + "maxLength": 255, + "description": "Single Docker repository team slug component.", + "example": "team-slug" + } + }, + { + "name": "projectSlug", + "description": "Single Docker repository project slug component.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "pattern": "^[a-z0-9](?:[a-z0-9-]{0,46}[a-z0-9])?$", + "maxLength": 255, + "description": "Single Docker repository project slug component.", + "example": "project-slug" + } + }, + { + "name": "repositoryName", + "description": "Single Docker repository name component.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "pattern": "^[a-z0-9]+(?:(?:\\\\.|_|__|-+)[a-z0-9]+)*$", + "maxLength": 255, + "description": "Single Docker repository name component.", + "example": "nginx" + } + }, + { + "name": "reference", + "description": "Manifest reference: a tag or digest.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "pattern": "^(?:[a-zA-Z0-9_][a-zA-Z0-9._-]{0,127}|[A-Za-z0-9_+.-]+:[A-Fa-f0-9]+)$", + "maxLength": 255, + "description": "Manifest reference: a tag or digest.", + "example": "latest" + } + } + ] + }, + "delete": { + "description": "DELETE /v2/:teamSlug/:projectSlug/:repositoryName/manifests/:reference Reference must be a digest.", + "operationId": "deleteByTeamSlugByProjectSlugByRepositoryNameManifestsByReference", + "security": [], + "summary": "Delete an image manifest", + "tags": [ + "vcr" + ], + "responses": { + "202": { + "description": "", + "content": { + "application/json": { + "schema": { + "nullable": true + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "402": { + "description": "The account is missing a payment so payment method must be updated" + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "teamSlug", + "description": "Single Docker repository team slug component.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "pattern": "^[a-z0-9](?:[a-z0-9-]{0,46}[a-z0-9])?$", + "maxLength": 255, + "description": "Single Docker repository team slug component.", + "example": "team-slug" + } + }, + { + "name": "projectSlug", + "description": "Single Docker repository project slug component.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "pattern": "^[a-z0-9](?:[a-z0-9-]{0,46}[a-z0-9])?$", + "maxLength": 255, + "description": "Single Docker repository project slug component.", + "example": "project-slug" + } + }, + { + "name": "repositoryName", + "description": "Single Docker repository name component.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "pattern": "^[a-z0-9]+(?:(?:\\\\.|_|__|-+)[a-z0-9]+)*$", + "maxLength": 255, + "description": "Single Docker repository name component.", + "example": "nginx" + } + }, + { + "name": "reference", + "description": "Content-addressable digest (algorithm:hex).", + "in": "path", + "required": true, + "schema": { + "type": "string", + "pattern": "^[A-Za-z0-9_+.-]+:[A-Fa-f0-9]+$", + "maxLength": 255, + "description": "Content-addressable digest (algorithm:hex).", + "example": "sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + } + ] + } + }, + "/v2/{teamSlug}/{projectSlug}/{repositoryName}/tags/list": { + "get": { + "description": "GET /v2/:teamSlug/:projectSlug/:repositoryName/tags/list List the tags in a repository.", + "operationId": "getByTeamSlugByProjectSlugByRepositoryNameTagsList", + "security": [], + "summary": "List image tags", + "tags": [ + "vcr" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "name": { + "type": "string" + }, + "tags": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "name", + "tags" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "402": { + "description": "The account is missing a payment so payment method must be updated" + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "teamSlug", + "description": "Single Docker repository team slug component.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "pattern": "^[a-z0-9](?:[a-z0-9-]{0,46}[a-z0-9])?$", + "maxLength": 255, + "description": "Single Docker repository team slug component.", + "example": "team-slug" + } + }, + { + "name": "projectSlug", + "description": "Single Docker repository project slug component.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "pattern": "^[a-z0-9](?:[a-z0-9-]{0,46}[a-z0-9])?$", + "maxLength": 255, + "description": "Single Docker repository project slug component.", + "example": "project-slug" + } + }, + { + "name": "repositoryName", + "description": "Single Docker repository name component.", + "in": "path", + "required": true, + "schema": { + "type": "string", + "pattern": "^[a-z0-9]+(?:(?:\\\\.|_|__|-+)[a-z0-9]+)*$", + "maxLength": 255, + "description": "Single Docker repository name component.", + "example": "nginx" + } + }, + { + "name": "n", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "minimum": 1, + "maximum": 1000 + } + }, + { + "name": "last", + "description": "Opaque pagination cursor returned by a previous list response.", + "in": "query", + "required": false, + "schema": { + "type": "string", + "maxLength": 1024, + "description": "Opaque pagination cursor returned by a previous list response." + } + } + ] + } + }, + "/web/insights/toggle": { + "post": { + "description": "", + "operationId": "createWebInsightsToggle", + "security": [], + "tags": [], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "value": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "value" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid.\nOne of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "projectId", + "in": "query", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "value": { + "type": "boolean" + } + }, + "required": [ + "value" + ], + "type": "object" + } + } + } + } + } + }, + "/v1/query/web-analytics/visits/aggregate": { + "get": { + "description": "Counts pageviews on a project, within the requested date range. Results are either aggregated or broken down over time. Results can additionally be broken down by one dimension, and filtered by multiple dimensions.", + "operationId": "aggregatePageviews", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Aggregates page views", + "tags": [ + "web-analytics" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "version": { + "type": "number" + }, + "query": { + "properties": { + "since": { + "type": "string" + }, + "until": { + "type": "string" + }, + "groupBy": { + "items": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "string", + "enum": [ + "browserName", + "country", + "deviceType", + "environment", + "flags", + "osName", + "referrerHostname", + "requestPath", + "route", + "utmCampaign", + "utmContent", + "utmMedium", + "utmSource", + "utmTerm" + ] + } + ] + }, + "type": "array" + }, + "filter": { + "type": "string" + }, + "limit": { + "type": "number" + } + }, + "required": [ + "limit", + "since", + "until" + ], + "type": "object" + }, + "data": { + "oneOf": [ + { + "items": { + "properties": { + "projectId": { + "type": "string" + }, + "country": { + "type": "string" + }, + "deviceType": { + "type": "string" + }, + "environment": { + "type": "string" + }, + "requestPath": { + "type": "string" + }, + "referrerHostname": { + "type": "string" + }, + "osName": { + "type": "string" + }, + "browserName": { + "type": "string" + }, + "route": { + "type": "string" + }, + "utmSource": { + "type": "string" + }, + "utmMedium": { + "type": "string" + }, + "utmCampaign": { + "type": "string" + }, + "utmContent": { + "type": "string" + }, + "utmTerm": { + "type": "string" + }, + "flags": { + "type": "string" + }, + "errorMessage": { + "type": "string" + }, + "entryRevalidateSeconds": { + "type": "string" + }, + "projectName": { + "type": "string" + }, + "deploymentId": { + "type": "string" + }, + "pathType": { + "type": "string" + }, + "pathTypeVariant": { + "type": "string" + }, + "requestHostname": { + "type": "string" + }, + "requestResolvedIp": { + "type": "string" + }, + "requestMethod": { + "type": "string" + }, + "requestExtension": { + "type": "string" + }, + "requestId": { + "type": "string" + }, + "requestApi": { + "type": "string" + }, + "referrerUrl": { + "type": "string" + }, + "serverActionName": { + "type": "string" + }, + "httpStatus": { + "type": "string" + }, + "errorCode": { + "type": "string" + }, + "source": { + "type": "string" + }, + "edgeType": { + "type": "string" + }, + "reason": { + "type": "string" + }, + "edgeNetworkRegion": { + "type": "string" + }, + "functionRegion": { + "type": "string" + }, + "imageTransformationRegion": { + "type": "string" + }, + "dataCacheRegion": { + "type": "string" + }, + "cause": { + "type": "string" + }, + "runtime": { + "type": "string" + }, + "provider": { + "type": "string" + }, + "isrCacheRegion": { + "type": "string" + }, + "isrAction": { + "type": "string" + }, + "cacheResult": { + "type": "string" + }, + "cacheOperation": { + "type": "string" + }, + "cacheHostname": { + "type": "string" + }, + "cachePath": { + "type": "string" + }, + "cacheHitState": { + "type": "string" + }, + "cacheHitLevel": { + "type": "string" + }, + "cacheApi": { + "type": "string" + }, + "cacheReason": { + "type": "string" + }, + "pprState": { + "type": "string" + }, + "clientIp": { + "type": "string" + }, + "clientIpCountry": { + "type": "string" + }, + "clientUserAgent": { + "type": "string" + }, + "httpAccept": { + "type": "string" + }, + "clientJa4Digest": { + "type": "string" + }, + "asnId": { + "type": "string" + }, + "asnName": { + "type": "string" + }, + "botName": { + "type": "string" + }, + "botCategory": { + "type": "string" + }, + "botCategoryLegacy": { + "type": "string" + }, + "botVerified": { + "type": "string" + }, + "botCheckResult": { + "type": "string" + }, + "deepAnalysisCheck": { + "type": "string" + }, + "wafAction": { + "type": "string" + }, + "wafRuleId": { + "type": "string" + }, + "ruleCategory": { + "type": "string" + }, + "skewProtection": { + "type": "string" + }, + "functionStartType": { + "type": "string" + }, + "functionDispatcher": { + "type": "string" + }, + "isAdditionalRequest": { + "type": "string" + }, + "originHostname": { + "type": "string" + }, + "originPath": { + "type": "string" + }, + "originRoute": { + "type": "string" + }, + "fetchType": { + "type": "string" + }, + "fetchIndex": { + "type": "string" + }, + "imageSource": { + "type": "string" + }, + "sourceImage": { + "type": "string" + }, + "sourceImagePathname": { + "type": "string" + }, + "sourceImageHostname": { + "type": "string" + }, + "sourceImageHash": { + "type": "string" + }, + "optimizedQuality": { + "type": "string" + }, + "optimizedWidthPixels": { + "type": "string" + }, + "optimizedFormatMimeType": { + "type": "string" + }, + "vdcOperationOrigin": { + "type": "string" + }, + "entryName": { + "type": "string" + }, + "entryId": { + "type": "string" + }, + "entryItemId": { + "type": "string" + }, + "tagName": { + "type": "string" + }, + "cacheTags": { + "type": "string" + }, + "storeId": { + "type": "string" + }, + "storeName": { + "type": "string" + }, + "blobOperationType": { + "type": "string" + }, + "blobOperationLevel": { + "type": "string" + }, + "visitorId": { + "type": "string" + }, + "eventName": { + "type": "string" + }, + "attributionTarget": { + "type": "string" + }, + "attributionEventName": { + "type": "string" + }, + "metricName": { + "type": "string" + }, + "attributes": { + "type": "string" + }, + "flagKey": { + "type": "string" + }, + "flagVariant": { + "type": "string" + }, + "flagEvaluationReason": { + "type": "string" + }, + "flagClientName": { + "type": "string" + }, + "sdkKeyId": { + "type": "string" + }, + "sdkKeyEnvironment": { + "type": "string" + }, + "reportingProjectId": { + "type": "string" + }, + "reportingProjectName": { + "type": "string" + }, + "eventData": { + "type": "string" + }, + "middlewareAction": { + "type": "string" + }, + "middlewareActionTarget": { + "type": "string" + }, + "aiModel": { + "type": "string" + }, + "aiGatewayModelId": { + "type": "string" + }, + "aiProvider": { + "type": "string" + }, + "aiModelType": { + "type": "string" + }, + "servedSpeed": { + "type": "string" + }, + "virtualModelSlug": { + "type": "string" + }, + "virtualModelKind": { + "type": "string" + }, + "inferenceEndpointSlug": { + "type": "string" + }, + "inferenceScope": { + "type": "string" + }, + "inferenceGeoRegion": { + "type": "string" + }, + "inferenceProviderRegion": { + "type": "string" + }, + "requestedInferenceRegion": { + "type": "string" + }, + "costCurrency": { + "type": "string" + }, + "marketCostCurrency": { + "type": "string" + }, + "cachedInputTokensCurrency": { + "type": "string" + }, + "cacheCreationInputTokensCurrency": { + "type": "string" + }, + "cacheCreation1hInputTokensCurrency": { + "type": "string" + }, + "surchargeCostCurrency": { + "type": "string" + }, + "gatewayCostCurrency": { + "type": "string" + }, + "keyId": { + "type": "string" + }, + "keyName": { + "type": "string" + }, + "authMethod": { + "type": "string" + }, + "appName": { + "type": "string" + }, + "codingAgent": { + "type": "string" + }, + "isByok": { + "type": "string" + }, + "spendAttribution": { + "type": "string" + }, + "isPrivateModel": { + "type": "string" + }, + "isStreaming": { + "type": "string" + }, + "isRequestZdr": { + "type": "string" + }, + "hipaaRequested": { + "type": "string" + }, + "quotaRequested": { + "type": "string" + }, + "quotaEntityId": { + "type": "string" + }, + "quotaEntityType": { + "type": "string" + }, + "videoResolution": { + "type": "string" + }, + "videoAspectRatio": { + "type": "string" + }, + "piiRedactionApplied": { + "type": "string" + }, + "moderationApplied": { + "type": "string" + }, + "queueName": { + "type": "string" + }, + "consumerGroup": { + "type": "string" + }, + "messageId": { + "type": "string" + }, + "eventType": { + "type": "string" + }, + "notificationUrl": { + "type": "string" + }, + "queueRegion": { + "type": "string" + }, + "sandboxSessionId": { + "type": "string" + }, + "sandboxName": { + "type": "string" + }, + "workflowRunId": { + "type": "string" + }, + "workflowName": { + "type": "string" + }, + "workflowStatus": { + "type": "string" + }, + "stepRunId": { + "type": "string" + }, + "workflowStepName": { + "type": "string" + }, + "workflowEventType": { + "type": "string" + }, + "region": { + "type": "string" + }, + "specVersion": { + "type": "string" + }, + "contentType": { + "type": "string" + }, + "rewriteDestinationHostname": { + "type": "string" + }, + "externalRewriteTargetHost": { + "type": "string" + }, + "externalRewriteTargetPath": { + "type": "string" + }, + "commitSha": { + "type": "string" + }, + "reviewConclusion": { + "type": "string" + }, + "pullRequestNumber": { + "type": "string" + }, + "repositoryName": { + "type": "string" + }, + "repositoryOwner": { + "type": "string" + }, + "reviewStatus": { + "type": "string" + }, + "pullRequestState": { + "type": "string" + }, + "triggeringTag": { + "type": "string" + }, + "redirectLocation": { + "type": "string" + }, + "microfrontendsResponseReason": { + "type": "string" + }, + "microfrontendsMatchedPath": { + "type": "string" + }, + "microfrontendsDefaultAppDeploymentId": { + "type": "string" + }, + "microfrontendsDefaultAppProjectId": { + "type": "string" + }, + "service": { + "type": "string" + }, + "isPrefetchRequest": { + "type": "string" + }, + "spendReportGroupBy": { + "type": "string" + }, + "spendReportDatePart": { + "type": "string" + }, + "providerAttemptCanonicalSlug": { + "type": "string" + }, + "providerAttemptCredentialType": { + "type": "string" + }, + "providerAttemptSuccess": { + "type": "string" + }, + "providerAttemptStatusCode": { + "type": "string" + }, + "providerAttemptTimeout": { + "type": "string" + }, + "providerAttemptIsFinal": { + "type": "string" + }, + "providerAttemptNumber": { + "type": "string" + }, + "providerAttemptTotalInRequest": { + "type": "string" + }, + "generationId": { + "type": "string" + }, + "sessionId": { + "type": "string" + }, + "contentCaptureStatus": { + "type": "string" + }, + "contentCaptureInputs": { + "type": "string" + }, + "contentCaptureOutputs": { + "type": "string" + }, + "transcriptStatus": { + "type": "string" + }, + "transcriptInputs": { + "type": "string" + }, + "transcriptOutputs": { + "type": "string" + }, + "providerAttemptError": { + "type": "string" + }, + "providerAttemptSafetyIdentifier": { + "type": "string" + }, + "providerAttemptDevSafetyIdentifier": { + "type": "string" + }, + "providerAttemptRegion": { + "type": "string" + }, + "providerAttemptModelIndex": { + "type": "string" + }, + "toolCallType": { + "type": "string" + }, + "toolCallProvider": { + "type": "string" + }, + "toolCallSuccess": { + "type": "string" + }, + "toolCallErrorType": { + "type": "string" + }, + "toolCallStatusCode": { + "type": "string" + }, + "environmentId": { + "type": "string" + }, + "billableRegion": { + "type": "string" + }, + "direction": { + "type": "string" + }, + "networkTenancy": { + "type": "string" + }, + "trafficSource": { + "type": "string" + }, + "networkId": { + "type": "string" + }, + "privatelinkEndpointId": { + "type": "string" + }, + "privatelinkDnsName": { + "type": "string" + }, + "privatelinkIpAddress": { + "type": "string" + }, + "timestamp": { + "type": "string", + "format": "date-time" + } + }, + "type": "object", + "required": [ + "timestamp" + ] + }, + "type": "array" + }, + { + "items": { + "properties": { + "projectId": { + "type": "string" + }, + "country": { + "type": "string" + }, + "deviceType": { + "type": "string" + }, + "environment": { + "type": "string" + }, + "requestPath": { + "type": "string" + }, + "referrerHostname": { + "type": "string" + }, + "osName": { + "type": "string" + }, + "browserName": { + "type": "string" + }, + "route": { + "type": "string" + }, + "utmSource": { + "type": "string" + }, + "utmMedium": { + "type": "string" + }, + "utmCampaign": { + "type": "string" + }, + "utmContent": { + "type": "string" + }, + "utmTerm": { + "type": "string" + }, + "flags": { + "type": "string" + }, + "errorMessage": { + "type": "string" + }, + "entryRevalidateSeconds": { + "type": "string" + }, + "projectName": { + "type": "string" + }, + "deploymentId": { + "type": "string" + }, + "pathType": { + "type": "string" + }, + "pathTypeVariant": { + "type": "string" + }, + "requestHostname": { + "type": "string" + }, + "requestResolvedIp": { + "type": "string" + }, + "requestMethod": { + "type": "string" + }, + "requestExtension": { + "type": "string" + }, + "requestId": { + "type": "string" + }, + "requestApi": { + "type": "string" + }, + "referrerUrl": { + "type": "string" + }, + "serverActionName": { + "type": "string" + }, + "httpStatus": { + "type": "string" + }, + "errorCode": { + "type": "string" + }, + "source": { + "type": "string" + }, + "edgeType": { + "type": "string" + }, + "reason": { + "type": "string" + }, + "edgeNetworkRegion": { + "type": "string" + }, + "functionRegion": { + "type": "string" + }, + "imageTransformationRegion": { + "type": "string" + }, + "dataCacheRegion": { + "type": "string" + }, + "cause": { + "type": "string" + }, + "runtime": { + "type": "string" + }, + "provider": { + "type": "string" + }, + "isrCacheRegion": { + "type": "string" + }, + "isrAction": { + "type": "string" + }, + "cacheResult": { + "type": "string" + }, + "cacheOperation": { + "type": "string" + }, + "cacheHostname": { + "type": "string" + }, + "cachePath": { + "type": "string" + }, + "cacheHitState": { + "type": "string" + }, + "cacheHitLevel": { + "type": "string" + }, + "cacheApi": { + "type": "string" + }, + "cacheReason": { + "type": "string" + }, + "pprState": { + "type": "string" + }, + "clientIp": { + "type": "string" + }, + "clientIpCountry": { + "type": "string" + }, + "clientUserAgent": { + "type": "string" + }, + "httpAccept": { + "type": "string" + }, + "clientJa4Digest": { + "type": "string" + }, + "asnId": { + "type": "string" + }, + "asnName": { + "type": "string" + }, + "botName": { + "type": "string" + }, + "botCategory": { + "type": "string" + }, + "botCategoryLegacy": { + "type": "string" + }, + "botVerified": { + "type": "string" + }, + "botCheckResult": { + "type": "string" + }, + "deepAnalysisCheck": { + "type": "string" + }, + "wafAction": { + "type": "string" + }, + "wafRuleId": { + "type": "string" + }, + "ruleCategory": { + "type": "string" + }, + "skewProtection": { + "type": "string" + }, + "functionStartType": { + "type": "string" + }, + "functionDispatcher": { + "type": "string" + }, + "isAdditionalRequest": { + "type": "string" + }, + "originHostname": { + "type": "string" + }, + "originPath": { + "type": "string" + }, + "originRoute": { + "type": "string" + }, + "fetchType": { + "type": "string" + }, + "fetchIndex": { + "type": "string" + }, + "imageSource": { + "type": "string" + }, + "sourceImage": { + "type": "string" + }, + "sourceImagePathname": { + "type": "string" + }, + "sourceImageHostname": { + "type": "string" + }, + "sourceImageHash": { + "type": "string" + }, + "optimizedQuality": { + "type": "string" + }, + "optimizedWidthPixels": { + "type": "string" + }, + "optimizedFormatMimeType": { + "type": "string" + }, + "vdcOperationOrigin": { + "type": "string" + }, + "entryName": { + "type": "string" + }, + "entryId": { + "type": "string" + }, + "entryItemId": { + "type": "string" + }, + "tagName": { + "type": "string" + }, + "cacheTags": { + "type": "string" + }, + "storeId": { + "type": "string" + }, + "storeName": { + "type": "string" + }, + "blobOperationType": { + "type": "string" + }, + "blobOperationLevel": { + "type": "string" + }, + "visitorId": { + "type": "string" + }, + "eventName": { + "type": "string" + }, + "attributionTarget": { + "type": "string" + }, + "attributionEventName": { + "type": "string" + }, + "metricName": { + "type": "string" + }, + "attributes": { + "type": "string" + }, + "flagKey": { + "type": "string" + }, + "flagVariant": { + "type": "string" + }, + "flagEvaluationReason": { + "type": "string" + }, + "flagClientName": { + "type": "string" + }, + "sdkKeyId": { + "type": "string" + }, + "sdkKeyEnvironment": { + "type": "string" + }, + "reportingProjectId": { + "type": "string" + }, + "reportingProjectName": { + "type": "string" + }, + "eventData": { + "type": "string" + }, + "middlewareAction": { + "type": "string" + }, + "middlewareActionTarget": { + "type": "string" + }, + "aiModel": { + "type": "string" + }, + "aiGatewayModelId": { + "type": "string" + }, + "aiProvider": { + "type": "string" + }, + "aiModelType": { + "type": "string" + }, + "servedSpeed": { + "type": "string" + }, + "virtualModelSlug": { + "type": "string" + }, + "virtualModelKind": { + "type": "string" + }, + "inferenceEndpointSlug": { + "type": "string" + }, + "inferenceScope": { + "type": "string" + }, + "inferenceGeoRegion": { + "type": "string" + }, + "inferenceProviderRegion": { + "type": "string" + }, + "requestedInferenceRegion": { + "type": "string" + }, + "costCurrency": { + "type": "string" + }, + "marketCostCurrency": { + "type": "string" + }, + "cachedInputTokensCurrency": { + "type": "string" + }, + "cacheCreationInputTokensCurrency": { + "type": "string" + }, + "cacheCreation1hInputTokensCurrency": { + "type": "string" + }, + "surchargeCostCurrency": { + "type": "string" + }, + "gatewayCostCurrency": { + "type": "string" + }, + "keyId": { + "type": "string" + }, + "keyName": { + "type": "string" + }, + "authMethod": { + "type": "string" + }, + "appName": { + "type": "string" + }, + "codingAgent": { + "type": "string" + }, + "isByok": { + "type": "string" + }, + "spendAttribution": { + "type": "string" + }, + "isPrivateModel": { + "type": "string" + }, + "isStreaming": { + "type": "string" + }, + "isRequestZdr": { + "type": "string" + }, + "hipaaRequested": { + "type": "string" + }, + "quotaRequested": { + "type": "string" + }, + "quotaEntityId": { + "type": "string" + }, + "quotaEntityType": { + "type": "string" + }, + "videoResolution": { + "type": "string" + }, + "videoAspectRatio": { + "type": "string" + }, + "piiRedactionApplied": { + "type": "string" + }, + "moderationApplied": { + "type": "string" + }, + "queueName": { + "type": "string" + }, + "consumerGroup": { + "type": "string" + }, + "messageId": { + "type": "string" + }, + "eventType": { + "type": "string" + }, + "notificationUrl": { + "type": "string" + }, + "queueRegion": { + "type": "string" + }, + "sandboxSessionId": { + "type": "string" + }, + "sandboxName": { + "type": "string" + }, + "workflowRunId": { + "type": "string" + }, + "workflowName": { + "type": "string" + }, + "workflowStatus": { + "type": "string" + }, + "stepRunId": { + "type": "string" + }, + "workflowStepName": { + "type": "string" + }, + "workflowEventType": { + "type": "string" + }, + "region": { + "type": "string" + }, + "specVersion": { + "type": "string" + }, + "contentType": { + "type": "string" + }, + "rewriteDestinationHostname": { + "type": "string" + }, + "externalRewriteTargetHost": { + "type": "string" + }, + "externalRewriteTargetPath": { + "type": "string" + }, + "commitSha": { + "type": "string" + }, + "reviewConclusion": { + "type": "string" + }, + "pullRequestNumber": { + "type": "string" + }, + "repositoryName": { + "type": "string" + }, + "repositoryOwner": { + "type": "string" + }, + "reviewStatus": { + "type": "string" + }, + "pullRequestState": { + "type": "string" + }, + "triggeringTag": { + "type": "string" + }, + "redirectLocation": { + "type": "string" + }, + "microfrontendsResponseReason": { + "type": "string" + }, + "microfrontendsMatchedPath": { + "type": "string" + }, + "microfrontendsDefaultAppDeploymentId": { + "type": "string" + }, + "microfrontendsDefaultAppProjectId": { + "type": "string" + }, + "service": { + "type": "string" + }, + "isPrefetchRequest": { + "type": "string" + }, + "spendReportGroupBy": { + "type": "string" + }, + "spendReportDatePart": { + "type": "string" + }, + "providerAttemptCanonicalSlug": { + "type": "string" + }, + "providerAttemptCredentialType": { + "type": "string" + }, + "providerAttemptSuccess": { + "type": "string" + }, + "providerAttemptStatusCode": { + "type": "string" + }, + "providerAttemptTimeout": { + "type": "string" + }, + "providerAttemptIsFinal": { + "type": "string" + }, + "providerAttemptNumber": { + "type": "string" + }, + "providerAttemptTotalInRequest": { + "type": "string" + }, + "generationId": { + "type": "string" + }, + "sessionId": { + "type": "string" + }, + "contentCaptureStatus": { + "type": "string" + }, + "contentCaptureInputs": { + "type": "string" + }, + "contentCaptureOutputs": { + "type": "string" + }, + "transcriptStatus": { + "type": "string" + }, + "transcriptInputs": { + "type": "string" + }, + "transcriptOutputs": { + "type": "string" + }, + "providerAttemptError": { + "type": "string" + }, + "providerAttemptSafetyIdentifier": { + "type": "string" + }, + "providerAttemptDevSafetyIdentifier": { + "type": "string" + }, + "providerAttemptRegion": { + "type": "string" + }, + "providerAttemptModelIndex": { + "type": "string" + }, + "toolCallType": { + "type": "string" + }, + "toolCallProvider": { + "type": "string" + }, + "toolCallSuccess": { + "type": "string" + }, + "toolCallErrorType": { + "type": "string" + }, + "toolCallStatusCode": { + "type": "string" + }, + "environmentId": { + "type": "string" + }, + "billableRegion": { + "type": "string" + }, + "direction": { + "type": "string" + }, + "networkTenancy": { + "type": "string" + }, + "trafficSource": { + "type": "string" + }, + "networkId": { + "type": "string" + }, + "privatelinkEndpointId": { + "type": "string" + }, + "privatelinkDnsName": { + "type": "string" + }, + "privatelinkIpAddress": { + "type": "string" + } + }, + "required": [ + "aiGatewayModelId", + "aiModel", + "aiModelType", + "aiProvider", + "appName", + "asnId", + "asnName", + "attributes", + "attributionEventName", + "attributionTarget", + "authMethod", + "billableRegion", + "blobOperationLevel", + "blobOperationType", + "botCategory", + "botCategoryLegacy", + "botCheckResult", + "botName", + "botVerified", + "browserName", + "cacheApi", + "cacheCreation1hInputTokensCurrency", + "cacheCreationInputTokensCurrency", + "cacheHitLevel", + "cacheHitState", + "cacheHostname", + "cacheOperation", + "cachePath", + "cacheReason", + "cacheResult", + "cacheTags", + "cachedInputTokensCurrency", + "cause", + "clientIp", + "clientIpCountry", + "clientJa4Digest", + "clientUserAgent", + "codingAgent", + "commitSha", + "consumerGroup", + "contentCaptureInputs", + "contentCaptureOutputs", + "contentCaptureStatus", + "contentType", + "costCurrency", + "country", + "dataCacheRegion", + "deepAnalysisCheck", + "deploymentId", + "deviceType", + "direction", + "edgeNetworkRegion", + "edgeType", + "entryId", + "entryItemId", + "entryName", + "entryRevalidateSeconds", + "environment", + "environmentId", + "errorCode", + "errorMessage", + "eventData", + "eventName", + "eventType", + "externalRewriteTargetHost", + "externalRewriteTargetPath", + "fetchIndex", + "fetchType", + "flagClientName", + "flagEvaluationReason", + "flagKey", + "flagVariant", + "flags", + "functionDispatcher", + "functionRegion", + "functionStartType", + "gatewayCostCurrency", + "generationId", + "hipaaRequested", + "httpAccept", + "httpStatus", + "imageSource", + "imageTransformationRegion", + "inferenceEndpointSlug", + "inferenceGeoRegion", + "inferenceProviderRegion", + "inferenceScope", + "isAdditionalRequest", + "isByok", + "isPrefetchRequest", + "isPrivateModel", + "isRequestZdr", + "isStreaming", + "isrAction", + "isrCacheRegion", + "keyId", + "keyName", + "marketCostCurrency", + "messageId", + "metricName", + "microfrontendsDefaultAppDeploymentId", + "microfrontendsDefaultAppProjectId", + "microfrontendsMatchedPath", + "microfrontendsResponseReason", + "middlewareAction", + "middlewareActionTarget", + "moderationApplied", + "networkId", + "networkTenancy", + "notificationUrl", + "optimizedFormatMimeType", + "optimizedQuality", + "optimizedWidthPixels", + "originHostname", + "originPath", + "originRoute", + "osName", + "pathType", + "pathTypeVariant", + "piiRedactionApplied", + "pprState", + "privatelinkDnsName", + "privatelinkEndpointId", + "privatelinkIpAddress", + "projectId", + "projectName", + "provider", + "providerAttemptCanonicalSlug", + "providerAttemptCredentialType", + "providerAttemptDevSafetyIdentifier", + "providerAttemptError", + "providerAttemptIsFinal", + "providerAttemptModelIndex", + "providerAttemptNumber", + "providerAttemptRegion", + "providerAttemptSafetyIdentifier", + "providerAttemptStatusCode", + "providerAttemptSuccess", + "providerAttemptTimeout", + "providerAttemptTotalInRequest", + "pullRequestNumber", + "pullRequestState", + "queueName", + "queueRegion", + "quotaEntityId", + "quotaEntityType", + "quotaRequested", + "reason", + "redirectLocation", + "referrerHostname", + "referrerUrl", + "region", + "reportingProjectId", + "reportingProjectName", + "repositoryName", + "repositoryOwner", + "requestApi", + "requestExtension", + "requestHostname", + "requestId", + "requestMethod", + "requestPath", + "requestResolvedIp", + "requestedInferenceRegion", + "reviewConclusion", + "reviewStatus", + "rewriteDestinationHostname", + "route", + "ruleCategory", + "runtime", + "sandboxName", + "sandboxSessionId", + "sdkKeyEnvironment", + "sdkKeyId", + "servedSpeed", + "serverActionName", + "service", + "sessionId", + "skewProtection", + "source", + "sourceImage", + "sourceImageHash", + "sourceImageHostname", + "sourceImagePathname", + "specVersion", + "spendAttribution", + "spendReportDatePart", + "spendReportGroupBy", + "stepRunId", + "storeId", + "storeName", + "surchargeCostCurrency", + "tagName", + "toolCallErrorType", + "toolCallProvider", + "toolCallStatusCode", + "toolCallSuccess", + "toolCallType", + "trafficSource", + "transcriptInputs", + "transcriptOutputs", + "transcriptStatus", + "triggeringTag", + "utmCampaign", + "utmContent", + "utmMedium", + "utmSource", + "utmTerm", + "vdcOperationOrigin", + "videoAspectRatio", + "videoResolution", + "virtualModelKind", + "virtualModelSlug", + "visitorId", + "wafAction", + "wafRuleId", + "workflowEventType", + "workflowName", + "workflowRunId", + "workflowStatus", + "workflowStepName" + ], + "type": "object", + "additionalProperties": { + "nullable": true, + "type": "number" + } + }, + "type": "array" + } + ] + } + }, + "required": [ + "data", + "query", + "version" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "402": { + "description": "" + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "projectId", + "description": "The project identifier or the project name", + "in": "query", + "required": true, + "schema": { + "description": "The project identifier or the project name", + "example": "prj_XLKmu1DyR1eY7zq8UgeRKbA7yVLA", + "type": "string" + } + }, + { + "name": "by", + "description": "Up to two dimensions used to break down results.\n\nAt most one time granularity is allowed: hour, day, week, month, year.\n\nOther dimensions: country, deviceType, environment, requestPath, referrerHostname, osName, browserName, route, utmSource, utmMedium, utmCampaign, utmContent, utmTerm.\n\nJSON dimensions: flags. Used bare, it breaks down results by key, for example flags returns one group per flag name. With a key, it breaks down results by that key's value, for example flags/beta_banner. Wrap keys containing characters other than letters, digits, and underscores in single quotes, for example flags/'my-flag'.", + "in": "query", + "required": true, + "schema": { + "description": "Up to two dimensions used to break down results.\n\nAt most one time granularity is allowed: hour, day, week, month, year.\n\nOther dimensions: country, deviceType, environment, requestPath, referrerHostname, osName, browserName, route, utmSource, utmMedium, utmCampaign, utmContent, utmTerm.\n\nJSON dimensions: flags. Used bare, it breaks down results by key, for example flags returns one group per flag name. With a key, it breaks down results by that key's value, for example flags/beta_banner. Wrap keys containing characters other than letters, digits, and underscores in single quotes, for example flags/'my-flag'.", + "example": [ + "day", + "country" + ], + "type": "array", + "minItems": 1, + "maxItems": 2, + "uniqueItems": true, + "items": { + "type": "string", + "anyOf": [ + { + "enum": [ + "hour", + "day", + "week", + "month", + "year", + "country", + "deviceType", + "environment", + "requestPath", + "referrerHostname", + "osName", + "browserName", + "route", + "utmSource", + "utmMedium", + "utmCampaign", + "utmContent", + "utmTerm", + "flags" + ] + }, + { + "pattern": "^(flags)(/([0-9A-Za-z_]+|'([^']|'')*'))+$" + } + ], + "errorMessage": "`by` items should be equal to one of the allowed values \"hour, day, week, month, year, country, deviceType, environment, requestPath, referrerHostname, osName, browserName, route, utmSource, utmMedium, utmCampaign, utmContent, utmTerm, flags\", or a JSON dimension key such as \"flags/\u003cname\u003e\"" + } + } + }, + { + "name": "since", + "description": "Timestamp in milliseconds, or a valid Date string.\n\nSelects data from (including) this date and time.\nWill be adjusted according to the desired time granularity.", + "in": "query", + "required": true, + "schema": { + "description": "Timestamp in milliseconds, or a valid Date string.\n\nSelects data from (including) this date and time.\nWill be adjusted according to the desired time granularity.", + "example": "2024-09-01T00:00:00.000Z", + "anyOf": [ + { + "type": "number" + }, + { + "type": "string" + } + ] + } + }, + { + "name": "until", + "description": "Timestamp in milliseconds, or a valid Date string.\n\nSelects data until (including) this date.\nWill be adjusted according to the desired time granularity.", + "in": "query", + "required": true, + "schema": { + "description": "Timestamp in milliseconds, or a valid Date string.\n\nSelects data until (including) this date.\nWill be adjusted according to the desired time granularity.", + "example": "2024-09-08T00:00:00.000Z", + "anyOf": [ + { + "type": "number" + }, + { + "type": "string" + } + ] + } + }, + { + "name": "limit", + "description": "Number of distinct results, default to 10. Other results are grouped into \"Others\" group.", + "in": "query", + "required": false, + "schema": { + "description": "Number of distinct results, default to 10. Other results are grouped into \"Others\" group.", + "default": 10, + "example": 3, + "type": "integer", + "minimum": 1, + "maximum": 100 + } + }, + { + "name": "filter", + "description": "OData-compliant filter. Encode the value when sending it in a URL.\n\nAllows filtering on one or multiple dimensions. By default, filters for production environment only.\n\nSupported dimensions: country, deviceType, environment, requestPath, referrerHostname, osName, browserName, route, utmSource, utmMedium, utmCampaign, utmContent, utmTerm.\n\nJSON dimensions filtered by key: flags/\u003cname\u003e, for example flags/beta_banner eq 'true'. Wrap keys containing characters other than letters, digits, and underscores in single quotes, for example flags/'my-flag' eq 'true'.\n\nSupported operations include eq, ne, in, and logical operators and, or, not with parentheses. Functions such as startswith are supported by the OData parser.", + "in": "query", + "required": false, + "schema": { + "description": "OData-compliant filter. Encode the value when sending it in a URL.\n\nAllows filtering on one or multiple dimensions. By default, filters for production environment only.\n\nSupported dimensions: country, deviceType, environment, requestPath, referrerHostname, osName, browserName, route, utmSource, utmMedium, utmCampaign, utmContent, utmTerm.\n\nJSON dimensions filtered by key: flags/\u003cname\u003e, for example flags/beta_banner eq 'true'. Wrap keys containing characters other than letters, digits, and underscores in single quotes, for example flags/'my-flag' eq 'true'.\n\nSupported operations include eq, ne, in, and logical operators and, or, not with parentheses. Functions such as startswith are supported by the OData parser.", + "example": "requestPath eq '/docs'", + "type": "string" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + } + }, + "/v1/query/web-analytics/events/aggregate": { + "get": { + "description": "Counts custom events on a project, within the requested date range. Results are either aggregated or broken down over time. Results can additionally be broken down by one dimension, and filtered by multiple dimensions.", + "operationId": "aggregateEvents", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Aggregates custom events", + "tags": [ + "web-analytics" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "version": { + "type": "number" + }, + "query": { + "properties": { + "since": { + "type": "string" + }, + "until": { + "type": "string" + }, + "groupBy": { + "items": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "string", + "enum": [ + "browserName", + "country", + "deviceType", + "environment", + "eventData", + "eventName", + "flags", + "osName", + "referrerHostname", + "requestPath", + "route", + "utmCampaign", + "utmContent", + "utmMedium", + "utmSource", + "utmTerm" + ] + } + ] + }, + "type": "array" + }, + "filter": { + "type": "string" + }, + "limit": { + "type": "number" + } + }, + "required": [ + "limit", + "since", + "until" + ], + "type": "object" + }, + "data": { + "oneOf": [ + { + "items": { + "properties": { + "projectId": { + "type": "string" + }, + "country": { + "type": "string" + }, + "deviceType": { + "type": "string" + }, + "environment": { + "type": "string" + }, + "requestPath": { + "type": "string" + }, + "referrerHostname": { + "type": "string" + }, + "osName": { + "type": "string" + }, + "browserName": { + "type": "string" + }, + "route": { + "type": "string" + }, + "utmSource": { + "type": "string" + }, + "utmMedium": { + "type": "string" + }, + "utmCampaign": { + "type": "string" + }, + "utmContent": { + "type": "string" + }, + "utmTerm": { + "type": "string" + }, + "flags": { + "type": "string" + }, + "errorMessage": { + "type": "string" + }, + "entryRevalidateSeconds": { + "type": "string" + }, + "projectName": { + "type": "string" + }, + "deploymentId": { + "type": "string" + }, + "pathType": { + "type": "string" + }, + "pathTypeVariant": { + "type": "string" + }, + "requestHostname": { + "type": "string" + }, + "requestResolvedIp": { + "type": "string" + }, + "requestMethod": { + "type": "string" + }, + "requestExtension": { + "type": "string" + }, + "requestId": { + "type": "string" + }, + "requestApi": { + "type": "string" + }, + "referrerUrl": { + "type": "string" + }, + "serverActionName": { + "type": "string" + }, + "httpStatus": { + "type": "string" + }, + "errorCode": { + "type": "string" + }, + "source": { + "type": "string" + }, + "edgeType": { + "type": "string" + }, + "reason": { + "type": "string" + }, + "edgeNetworkRegion": { + "type": "string" + }, + "functionRegion": { + "type": "string" + }, + "imageTransformationRegion": { + "type": "string" + }, + "dataCacheRegion": { + "type": "string" + }, + "cause": { + "type": "string" + }, + "runtime": { + "type": "string" + }, + "provider": { + "type": "string" + }, + "isrCacheRegion": { + "type": "string" + }, + "isrAction": { + "type": "string" + }, + "cacheResult": { + "type": "string" + }, + "cacheOperation": { + "type": "string" + }, + "cacheHostname": { + "type": "string" + }, + "cachePath": { + "type": "string" + }, + "cacheHitState": { + "type": "string" + }, + "cacheHitLevel": { + "type": "string" + }, + "cacheApi": { + "type": "string" + }, + "cacheReason": { + "type": "string" + }, + "pprState": { + "type": "string" + }, + "clientIp": { + "type": "string" + }, + "clientIpCountry": { + "type": "string" + }, + "clientUserAgent": { + "type": "string" + }, + "httpAccept": { + "type": "string" + }, + "clientJa4Digest": { + "type": "string" + }, + "asnId": { + "type": "string" + }, + "asnName": { + "type": "string" + }, + "botName": { + "type": "string" + }, + "botCategory": { + "type": "string" + }, + "botCategoryLegacy": { + "type": "string" + }, + "botVerified": { + "type": "string" + }, + "botCheckResult": { + "type": "string" + }, + "deepAnalysisCheck": { + "type": "string" + }, + "wafAction": { + "type": "string" + }, + "wafRuleId": { + "type": "string" + }, + "ruleCategory": { + "type": "string" + }, + "skewProtection": { + "type": "string" + }, + "functionStartType": { + "type": "string" + }, + "functionDispatcher": { + "type": "string" + }, + "isAdditionalRequest": { + "type": "string" + }, + "originHostname": { + "type": "string" + }, + "originPath": { + "type": "string" + }, + "originRoute": { + "type": "string" + }, + "fetchType": { + "type": "string" + }, + "fetchIndex": { + "type": "string" + }, + "imageSource": { + "type": "string" + }, + "sourceImage": { + "type": "string" + }, + "sourceImagePathname": { + "type": "string" + }, + "sourceImageHostname": { + "type": "string" + }, + "sourceImageHash": { + "type": "string" + }, + "optimizedQuality": { + "type": "string" + }, + "optimizedWidthPixels": { + "type": "string" + }, + "optimizedFormatMimeType": { + "type": "string" + }, + "vdcOperationOrigin": { + "type": "string" + }, + "entryName": { + "type": "string" + }, + "entryId": { + "type": "string" + }, + "entryItemId": { + "type": "string" + }, + "tagName": { + "type": "string" + }, + "cacheTags": { + "type": "string" + }, + "storeId": { + "type": "string" + }, + "storeName": { + "type": "string" + }, + "blobOperationType": { + "type": "string" + }, + "blobOperationLevel": { + "type": "string" + }, + "visitorId": { + "type": "string" + }, + "eventName": { + "type": "string" + }, + "attributionTarget": { + "type": "string" + }, + "attributionEventName": { + "type": "string" + }, + "metricName": { + "type": "string" + }, + "attributes": { + "type": "string" + }, + "flagKey": { + "type": "string" + }, + "flagVariant": { + "type": "string" + }, + "flagEvaluationReason": { + "type": "string" + }, + "flagClientName": { + "type": "string" + }, + "sdkKeyId": { + "type": "string" + }, + "sdkKeyEnvironment": { + "type": "string" + }, + "reportingProjectId": { + "type": "string" + }, + "reportingProjectName": { + "type": "string" + }, + "eventData": { + "type": "string" + }, + "middlewareAction": { + "type": "string" + }, + "middlewareActionTarget": { + "type": "string" + }, + "aiModel": { + "type": "string" + }, + "aiGatewayModelId": { + "type": "string" + }, + "aiProvider": { + "type": "string" + }, + "aiModelType": { + "type": "string" + }, + "servedSpeed": { + "type": "string" + }, + "virtualModelSlug": { + "type": "string" + }, + "virtualModelKind": { + "type": "string" + }, + "inferenceEndpointSlug": { + "type": "string" + }, + "inferenceScope": { + "type": "string" + }, + "inferenceGeoRegion": { + "type": "string" + }, + "inferenceProviderRegion": { + "type": "string" + }, + "requestedInferenceRegion": { + "type": "string" + }, + "costCurrency": { + "type": "string" + }, + "marketCostCurrency": { + "type": "string" + }, + "cachedInputTokensCurrency": { + "type": "string" + }, + "cacheCreationInputTokensCurrency": { + "type": "string" + }, + "cacheCreation1hInputTokensCurrency": { + "type": "string" + }, + "surchargeCostCurrency": { + "type": "string" + }, + "gatewayCostCurrency": { + "type": "string" + }, + "keyId": { + "type": "string" + }, + "keyName": { + "type": "string" + }, + "authMethod": { + "type": "string" + }, + "appName": { + "type": "string" + }, + "codingAgent": { + "type": "string" + }, + "isByok": { + "type": "string" + }, + "spendAttribution": { + "type": "string" + }, + "isPrivateModel": { + "type": "string" + }, + "isStreaming": { + "type": "string" + }, + "isRequestZdr": { + "type": "string" + }, + "hipaaRequested": { + "type": "string" + }, + "quotaRequested": { + "type": "string" + }, + "quotaEntityId": { + "type": "string" + }, + "quotaEntityType": { + "type": "string" + }, + "videoResolution": { + "type": "string" + }, + "videoAspectRatio": { + "type": "string" + }, + "piiRedactionApplied": { + "type": "string" + }, + "moderationApplied": { + "type": "string" + }, + "queueName": { + "type": "string" + }, + "consumerGroup": { + "type": "string" + }, + "messageId": { + "type": "string" + }, + "eventType": { + "type": "string" + }, + "notificationUrl": { + "type": "string" + }, + "queueRegion": { + "type": "string" + }, + "sandboxSessionId": { + "type": "string" + }, + "sandboxName": { + "type": "string" + }, + "workflowRunId": { + "type": "string" + }, + "workflowName": { + "type": "string" + }, + "workflowStatus": { + "type": "string" + }, + "stepRunId": { + "type": "string" + }, + "workflowStepName": { + "type": "string" + }, + "workflowEventType": { + "type": "string" + }, + "region": { + "type": "string" + }, + "specVersion": { + "type": "string" + }, + "contentType": { + "type": "string" + }, + "rewriteDestinationHostname": { + "type": "string" + }, + "externalRewriteTargetHost": { + "type": "string" + }, + "externalRewriteTargetPath": { + "type": "string" + }, + "commitSha": { + "type": "string" + }, + "reviewConclusion": { + "type": "string" + }, + "pullRequestNumber": { + "type": "string" + }, + "repositoryName": { + "type": "string" + }, + "repositoryOwner": { + "type": "string" + }, + "reviewStatus": { + "type": "string" + }, + "pullRequestState": { + "type": "string" + }, + "triggeringTag": { + "type": "string" + }, + "redirectLocation": { + "type": "string" + }, + "microfrontendsResponseReason": { + "type": "string" + }, + "microfrontendsMatchedPath": { + "type": "string" + }, + "microfrontendsDefaultAppDeploymentId": { + "type": "string" + }, + "microfrontendsDefaultAppProjectId": { + "type": "string" + }, + "service": { + "type": "string" + }, + "isPrefetchRequest": { + "type": "string" + }, + "spendReportGroupBy": { + "type": "string" + }, + "spendReportDatePart": { + "type": "string" + }, + "providerAttemptCanonicalSlug": { + "type": "string" + }, + "providerAttemptCredentialType": { + "type": "string" + }, + "providerAttemptSuccess": { + "type": "string" + }, + "providerAttemptStatusCode": { + "type": "string" + }, + "providerAttemptTimeout": { + "type": "string" + }, + "providerAttemptIsFinal": { + "type": "string" + }, + "providerAttemptNumber": { + "type": "string" + }, + "providerAttemptTotalInRequest": { + "type": "string" + }, + "generationId": { + "type": "string" + }, + "sessionId": { + "type": "string" + }, + "contentCaptureStatus": { + "type": "string" + }, + "contentCaptureInputs": { + "type": "string" + }, + "contentCaptureOutputs": { + "type": "string" + }, + "transcriptStatus": { + "type": "string" + }, + "transcriptInputs": { + "type": "string" + }, + "transcriptOutputs": { + "type": "string" + }, + "providerAttemptError": { + "type": "string" + }, + "providerAttemptSafetyIdentifier": { + "type": "string" + }, + "providerAttemptDevSafetyIdentifier": { + "type": "string" + }, + "providerAttemptRegion": { + "type": "string" + }, + "providerAttemptModelIndex": { + "type": "string" + }, + "toolCallType": { + "type": "string" + }, + "toolCallProvider": { + "type": "string" + }, + "toolCallSuccess": { + "type": "string" + }, + "toolCallErrorType": { + "type": "string" + }, + "toolCallStatusCode": { + "type": "string" + }, + "environmentId": { + "type": "string" + }, + "billableRegion": { + "type": "string" + }, + "direction": { + "type": "string" + }, + "networkTenancy": { + "type": "string" + }, + "trafficSource": { + "type": "string" + }, + "networkId": { + "type": "string" + }, + "privatelinkEndpointId": { + "type": "string" + }, + "privatelinkDnsName": { + "type": "string" + }, + "privatelinkIpAddress": { + "type": "string" + }, + "timestamp": { + "type": "string", + "format": "date-time" + } + }, + "type": "object", + "required": [ + "timestamp" + ] + }, + "type": "array" + }, + { + "items": { + "properties": { + "projectId": { + "type": "string" + }, + "country": { + "type": "string" + }, + "deviceType": { + "type": "string" + }, + "environment": { + "type": "string" + }, + "requestPath": { + "type": "string" + }, + "referrerHostname": { + "type": "string" + }, + "osName": { + "type": "string" + }, + "browserName": { + "type": "string" + }, + "route": { + "type": "string" + }, + "utmSource": { + "type": "string" + }, + "utmMedium": { + "type": "string" + }, + "utmCampaign": { + "type": "string" + }, + "utmContent": { + "type": "string" + }, + "utmTerm": { + "type": "string" + }, + "flags": { + "type": "string" + }, + "errorMessage": { + "type": "string" + }, + "entryRevalidateSeconds": { + "type": "string" + }, + "projectName": { + "type": "string" + }, + "deploymentId": { + "type": "string" + }, + "pathType": { + "type": "string" + }, + "pathTypeVariant": { + "type": "string" + }, + "requestHostname": { + "type": "string" + }, + "requestResolvedIp": { + "type": "string" + }, + "requestMethod": { + "type": "string" + }, + "requestExtension": { + "type": "string" + }, + "requestId": { + "type": "string" + }, + "requestApi": { + "type": "string" + }, + "referrerUrl": { + "type": "string" + }, + "serverActionName": { + "type": "string" + }, + "httpStatus": { + "type": "string" + }, + "errorCode": { + "type": "string" + }, + "source": { + "type": "string" + }, + "edgeType": { + "type": "string" + }, + "reason": { + "type": "string" + }, + "edgeNetworkRegion": { + "type": "string" + }, + "functionRegion": { + "type": "string" + }, + "imageTransformationRegion": { + "type": "string" + }, + "dataCacheRegion": { + "type": "string" + }, + "cause": { + "type": "string" + }, + "runtime": { + "type": "string" + }, + "provider": { + "type": "string" + }, + "isrCacheRegion": { + "type": "string" + }, + "isrAction": { + "type": "string" + }, + "cacheResult": { + "type": "string" + }, + "cacheOperation": { + "type": "string" + }, + "cacheHostname": { + "type": "string" + }, + "cachePath": { + "type": "string" + }, + "cacheHitState": { + "type": "string" + }, + "cacheHitLevel": { + "type": "string" + }, + "cacheApi": { + "type": "string" + }, + "cacheReason": { + "type": "string" + }, + "pprState": { + "type": "string" + }, + "clientIp": { + "type": "string" + }, + "clientIpCountry": { + "type": "string" + }, + "clientUserAgent": { + "type": "string" + }, + "httpAccept": { + "type": "string" + }, + "clientJa4Digest": { + "type": "string" + }, + "asnId": { + "type": "string" + }, + "asnName": { + "type": "string" + }, + "botName": { + "type": "string" + }, + "botCategory": { + "type": "string" + }, + "botCategoryLegacy": { + "type": "string" + }, + "botVerified": { + "type": "string" + }, + "botCheckResult": { + "type": "string" + }, + "deepAnalysisCheck": { + "type": "string" + }, + "wafAction": { + "type": "string" + }, + "wafRuleId": { + "type": "string" + }, + "ruleCategory": { + "type": "string" + }, + "skewProtection": { + "type": "string" + }, + "functionStartType": { + "type": "string" + }, + "functionDispatcher": { + "type": "string" + }, + "isAdditionalRequest": { + "type": "string" + }, + "originHostname": { + "type": "string" + }, + "originPath": { + "type": "string" + }, + "originRoute": { + "type": "string" + }, + "fetchType": { + "type": "string" + }, + "fetchIndex": { + "type": "string" + }, + "imageSource": { + "type": "string" + }, + "sourceImage": { + "type": "string" + }, + "sourceImagePathname": { + "type": "string" + }, + "sourceImageHostname": { + "type": "string" + }, + "sourceImageHash": { + "type": "string" + }, + "optimizedQuality": { + "type": "string" + }, + "optimizedWidthPixels": { + "type": "string" + }, + "optimizedFormatMimeType": { + "type": "string" + }, + "vdcOperationOrigin": { + "type": "string" + }, + "entryName": { + "type": "string" + }, + "entryId": { + "type": "string" + }, + "entryItemId": { + "type": "string" + }, + "tagName": { + "type": "string" + }, + "cacheTags": { + "type": "string" + }, + "storeId": { + "type": "string" + }, + "storeName": { + "type": "string" + }, + "blobOperationType": { + "type": "string" + }, + "blobOperationLevel": { + "type": "string" + }, + "visitorId": { + "type": "string" + }, + "eventName": { + "type": "string" + }, + "attributionTarget": { + "type": "string" + }, + "attributionEventName": { + "type": "string" + }, + "metricName": { + "type": "string" + }, + "attributes": { + "type": "string" + }, + "flagKey": { + "type": "string" + }, + "flagVariant": { + "type": "string" + }, + "flagEvaluationReason": { + "type": "string" + }, + "flagClientName": { + "type": "string" + }, + "sdkKeyId": { + "type": "string" + }, + "sdkKeyEnvironment": { + "type": "string" + }, + "reportingProjectId": { + "type": "string" + }, + "reportingProjectName": { + "type": "string" + }, + "eventData": { + "type": "string" + }, + "middlewareAction": { + "type": "string" + }, + "middlewareActionTarget": { + "type": "string" + }, + "aiModel": { + "type": "string" + }, + "aiGatewayModelId": { + "type": "string" + }, + "aiProvider": { + "type": "string" + }, + "aiModelType": { + "type": "string" + }, + "servedSpeed": { + "type": "string" + }, + "virtualModelSlug": { + "type": "string" + }, + "virtualModelKind": { + "type": "string" + }, + "inferenceEndpointSlug": { + "type": "string" + }, + "inferenceScope": { + "type": "string" + }, + "inferenceGeoRegion": { + "type": "string" + }, + "inferenceProviderRegion": { + "type": "string" + }, + "requestedInferenceRegion": { + "type": "string" + }, + "costCurrency": { + "type": "string" + }, + "marketCostCurrency": { + "type": "string" + }, + "cachedInputTokensCurrency": { + "type": "string" + }, + "cacheCreationInputTokensCurrency": { + "type": "string" + }, + "cacheCreation1hInputTokensCurrency": { + "type": "string" + }, + "surchargeCostCurrency": { + "type": "string" + }, + "gatewayCostCurrency": { + "type": "string" + }, + "keyId": { + "type": "string" + }, + "keyName": { + "type": "string" + }, + "authMethod": { + "type": "string" + }, + "appName": { + "type": "string" + }, + "codingAgent": { + "type": "string" + }, + "isByok": { + "type": "string" + }, + "spendAttribution": { + "type": "string" + }, + "isPrivateModel": { + "type": "string" + }, + "isStreaming": { + "type": "string" + }, + "isRequestZdr": { + "type": "string" + }, + "hipaaRequested": { + "type": "string" + }, + "quotaRequested": { + "type": "string" + }, + "quotaEntityId": { + "type": "string" + }, + "quotaEntityType": { + "type": "string" + }, + "videoResolution": { + "type": "string" + }, + "videoAspectRatio": { + "type": "string" + }, + "piiRedactionApplied": { + "type": "string" + }, + "moderationApplied": { + "type": "string" + }, + "queueName": { + "type": "string" + }, + "consumerGroup": { + "type": "string" + }, + "messageId": { + "type": "string" + }, + "eventType": { + "type": "string" + }, + "notificationUrl": { + "type": "string" + }, + "queueRegion": { + "type": "string" + }, + "sandboxSessionId": { + "type": "string" + }, + "sandboxName": { + "type": "string" + }, + "workflowRunId": { + "type": "string" + }, + "workflowName": { + "type": "string" + }, + "workflowStatus": { + "type": "string" + }, + "stepRunId": { + "type": "string" + }, + "workflowStepName": { + "type": "string" + }, + "workflowEventType": { + "type": "string" + }, + "region": { + "type": "string" + }, + "specVersion": { + "type": "string" + }, + "contentType": { + "type": "string" + }, + "rewriteDestinationHostname": { + "type": "string" + }, + "externalRewriteTargetHost": { + "type": "string" + }, + "externalRewriteTargetPath": { + "type": "string" + }, + "commitSha": { + "type": "string" + }, + "reviewConclusion": { + "type": "string" + }, + "pullRequestNumber": { + "type": "string" + }, + "repositoryName": { + "type": "string" + }, + "repositoryOwner": { + "type": "string" + }, + "reviewStatus": { + "type": "string" + }, + "pullRequestState": { + "type": "string" + }, + "triggeringTag": { + "type": "string" + }, + "redirectLocation": { + "type": "string" + }, + "microfrontendsResponseReason": { + "type": "string" + }, + "microfrontendsMatchedPath": { + "type": "string" + }, + "microfrontendsDefaultAppDeploymentId": { + "type": "string" + }, + "microfrontendsDefaultAppProjectId": { + "type": "string" + }, + "service": { + "type": "string" + }, + "isPrefetchRequest": { + "type": "string" + }, + "spendReportGroupBy": { + "type": "string" + }, + "spendReportDatePart": { + "type": "string" + }, + "providerAttemptCanonicalSlug": { + "type": "string" + }, + "providerAttemptCredentialType": { + "type": "string" + }, + "providerAttemptSuccess": { + "type": "string" + }, + "providerAttemptStatusCode": { + "type": "string" + }, + "providerAttemptTimeout": { + "type": "string" + }, + "providerAttemptIsFinal": { + "type": "string" + }, + "providerAttemptNumber": { + "type": "string" + }, + "providerAttemptTotalInRequest": { + "type": "string" + }, + "generationId": { + "type": "string" + }, + "sessionId": { + "type": "string" + }, + "contentCaptureStatus": { + "type": "string" + }, + "contentCaptureInputs": { + "type": "string" + }, + "contentCaptureOutputs": { + "type": "string" + }, + "transcriptStatus": { + "type": "string" + }, + "transcriptInputs": { + "type": "string" + }, + "transcriptOutputs": { + "type": "string" + }, + "providerAttemptError": { + "type": "string" + }, + "providerAttemptSafetyIdentifier": { + "type": "string" + }, + "providerAttemptDevSafetyIdentifier": { + "type": "string" + }, + "providerAttemptRegion": { + "type": "string" + }, + "providerAttemptModelIndex": { + "type": "string" + }, + "toolCallType": { + "type": "string" + }, + "toolCallProvider": { + "type": "string" + }, + "toolCallSuccess": { + "type": "string" + }, + "toolCallErrorType": { + "type": "string" + }, + "toolCallStatusCode": { + "type": "string" + }, + "environmentId": { + "type": "string" + }, + "billableRegion": { + "type": "string" + }, + "direction": { + "type": "string" + }, + "networkTenancy": { + "type": "string" + }, + "trafficSource": { + "type": "string" + }, + "networkId": { + "type": "string" + }, + "privatelinkEndpointId": { + "type": "string" + }, + "privatelinkDnsName": { + "type": "string" + }, + "privatelinkIpAddress": { + "type": "string" + } + }, + "required": [ + "aiGatewayModelId", + "aiModel", + "aiModelType", + "aiProvider", + "appName", + "asnId", + "asnName", + "attributes", + "attributionEventName", + "attributionTarget", + "authMethod", + "billableRegion", + "blobOperationLevel", + "blobOperationType", + "botCategory", + "botCategoryLegacy", + "botCheckResult", + "botName", + "botVerified", + "browserName", + "cacheApi", + "cacheCreation1hInputTokensCurrency", + "cacheCreationInputTokensCurrency", + "cacheHitLevel", + "cacheHitState", + "cacheHostname", + "cacheOperation", + "cachePath", + "cacheReason", + "cacheResult", + "cacheTags", + "cachedInputTokensCurrency", + "cause", + "clientIp", + "clientIpCountry", + "clientJa4Digest", + "clientUserAgent", + "codingAgent", + "commitSha", + "consumerGroup", + "contentCaptureInputs", + "contentCaptureOutputs", + "contentCaptureStatus", + "contentType", + "costCurrency", + "country", + "dataCacheRegion", + "deepAnalysisCheck", + "deploymentId", + "deviceType", + "direction", + "edgeNetworkRegion", + "edgeType", + "entryId", + "entryItemId", + "entryName", + "entryRevalidateSeconds", + "environment", + "environmentId", + "errorCode", + "errorMessage", + "eventData", + "eventName", + "eventType", + "externalRewriteTargetHost", + "externalRewriteTargetPath", + "fetchIndex", + "fetchType", + "flagClientName", + "flagEvaluationReason", + "flagKey", + "flagVariant", + "flags", + "functionDispatcher", + "functionRegion", + "functionStartType", + "gatewayCostCurrency", + "generationId", + "hipaaRequested", + "httpAccept", + "httpStatus", + "imageSource", + "imageTransformationRegion", + "inferenceEndpointSlug", + "inferenceGeoRegion", + "inferenceProviderRegion", + "inferenceScope", + "isAdditionalRequest", + "isByok", + "isPrefetchRequest", + "isPrivateModel", + "isRequestZdr", + "isStreaming", + "isrAction", + "isrCacheRegion", + "keyId", + "keyName", + "marketCostCurrency", + "messageId", + "metricName", + "microfrontendsDefaultAppDeploymentId", + "microfrontendsDefaultAppProjectId", + "microfrontendsMatchedPath", + "microfrontendsResponseReason", + "middlewareAction", + "middlewareActionTarget", + "moderationApplied", + "networkId", + "networkTenancy", + "notificationUrl", + "optimizedFormatMimeType", + "optimizedQuality", + "optimizedWidthPixels", + "originHostname", + "originPath", + "originRoute", + "osName", + "pathType", + "pathTypeVariant", + "piiRedactionApplied", + "pprState", + "privatelinkDnsName", + "privatelinkEndpointId", + "privatelinkIpAddress", + "projectId", + "projectName", + "provider", + "providerAttemptCanonicalSlug", + "providerAttemptCredentialType", + "providerAttemptDevSafetyIdentifier", + "providerAttemptError", + "providerAttemptIsFinal", + "providerAttemptModelIndex", + "providerAttemptNumber", + "providerAttemptRegion", + "providerAttemptSafetyIdentifier", + "providerAttemptStatusCode", + "providerAttemptSuccess", + "providerAttemptTimeout", + "providerAttemptTotalInRequest", + "pullRequestNumber", + "pullRequestState", + "queueName", + "queueRegion", + "quotaEntityId", + "quotaEntityType", + "quotaRequested", + "reason", + "redirectLocation", + "referrerHostname", + "referrerUrl", + "region", + "reportingProjectId", + "reportingProjectName", + "repositoryName", + "repositoryOwner", + "requestApi", + "requestExtension", + "requestHostname", + "requestId", + "requestMethod", + "requestPath", + "requestResolvedIp", + "requestedInferenceRegion", + "reviewConclusion", + "reviewStatus", + "rewriteDestinationHostname", + "route", + "ruleCategory", + "runtime", + "sandboxName", + "sandboxSessionId", + "sdkKeyEnvironment", + "sdkKeyId", + "servedSpeed", + "serverActionName", + "service", + "sessionId", + "skewProtection", + "source", + "sourceImage", + "sourceImageHash", + "sourceImageHostname", + "sourceImagePathname", + "specVersion", + "spendAttribution", + "spendReportDatePart", + "spendReportGroupBy", + "stepRunId", + "storeId", + "storeName", + "surchargeCostCurrency", + "tagName", + "toolCallErrorType", + "toolCallProvider", + "toolCallStatusCode", + "toolCallSuccess", + "toolCallType", + "trafficSource", + "transcriptInputs", + "transcriptOutputs", + "transcriptStatus", + "triggeringTag", + "utmCampaign", + "utmContent", + "utmMedium", + "utmSource", + "utmTerm", + "vdcOperationOrigin", + "videoAspectRatio", + "videoResolution", + "virtualModelKind", + "virtualModelSlug", + "visitorId", + "wafAction", + "wafRuleId", + "workflowEventType", + "workflowName", + "workflowRunId", + "workflowStatus", + "workflowStepName" + ], + "type": "object", + "additionalProperties": { + "nullable": true, + "type": "number" + } + }, + "type": "array" + } + ] + } + }, + "required": [ + "data", + "query", + "version" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "402": { + "description": "" + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "projectId", + "description": "The project identifier or the project name", + "in": "query", + "required": true, + "schema": { + "description": "The project identifier or the project name", + "example": "prj_XLKmu1DyR1eY7zq8UgeRKbA7yVLA", + "type": "string" + } + }, + { + "name": "by", + "description": "Up to two dimensions used to break down results.\n\nAt most one time granularity is allowed: hour, day, week, month, year.\n\nOther dimensions: country, deviceType, environment, requestPath, referrerHostname, osName, browserName, route, utmSource, utmMedium, utmCampaign, utmContent, utmTerm, eventName.\n\nJSON dimensions: flags, eventData. Used bare, they break down results by key, for example flags returns one group per flag name. With a key, they break down results by that key's value, for example eventData/plan. Wrap keys containing characters other than letters, digits, and underscores in single quotes, for example flags/'my-flag'.", + "in": "query", + "required": true, + "schema": { + "description": "Up to two dimensions used to break down results.\n\nAt most one time granularity is allowed: hour, day, week, month, year.\n\nOther dimensions: country, deviceType, environment, requestPath, referrerHostname, osName, browserName, route, utmSource, utmMedium, utmCampaign, utmContent, utmTerm, eventName.\n\nJSON dimensions: flags, eventData. Used bare, they break down results by key, for example flags returns one group per flag name. With a key, they break down results by that key's value, for example eventData/plan. Wrap keys containing characters other than letters, digits, and underscores in single quotes, for example flags/'my-flag'.", + "example": [ + "day", + "eventName" + ], + "type": "array", + "minItems": 1, + "maxItems": 2, + "uniqueItems": true, + "items": { + "type": "string", + "anyOf": [ + { + "enum": [ + "hour", + "day", + "week", + "month", + "year", + "country", + "deviceType", + "environment", + "requestPath", + "referrerHostname", + "osName", + "browserName", + "route", + "utmSource", + "utmMedium", + "utmCampaign", + "utmContent", + "utmTerm", + "eventName", + "flags", + "eventData" + ] + }, + { + "pattern": "^(flags|eventData)(/([0-9A-Za-z_]+|'([^']|'')*'))+$" + } + ], + "errorMessage": "`by` items should be equal to one of the allowed values \"hour, day, week, month, year, country, deviceType, environment, requestPath, referrerHostname, osName, browserName, route, utmSource, utmMedium, utmCampaign, utmContent, utmTerm, eventName, flags, eventData\", or a JSON dimension key such as \"flags/\u003cname\u003e, eventData/\u003cproperty\u003e\"" + } + } + }, + { + "name": "since", + "description": "Timestamp in milliseconds, or a valid Date string.\n\nSelects data from (including) this date and time.\nWill be adjusted according to the desired time granularity.", + "in": "query", + "required": true, + "schema": { + "description": "Timestamp in milliseconds, or a valid Date string.\n\nSelects data from (including) this date and time.\nWill be adjusted according to the desired time granularity.", + "example": "2024-09-01T00:00:00.000Z", + "anyOf": [ + { + "type": "number" + }, + { + "type": "string" + } + ] + } + }, + { + "name": "until", + "description": "Timestamp in milliseconds, or a valid Date string.\n\nSelects data until (including) this date.\nWill be adjusted according to the desired time granularity.", + "in": "query", + "required": true, + "schema": { + "description": "Timestamp in milliseconds, or a valid Date string.\n\nSelects data until (including) this date.\nWill be adjusted according to the desired time granularity.", + "example": "2024-09-08T00:00:00.000Z", + "anyOf": [ + { + "type": "number" + }, + { + "type": "string" + } + ] + } + }, + { + "name": "limit", + "description": "Number of distinct results, default to 10. Other results are grouped into \"Others\" group.", + "in": "query", + "required": false, + "schema": { + "description": "Number of distinct results, default to 10. Other results are grouped into \"Others\" group.", + "default": 10, + "example": 3, + "type": "integer", + "minimum": 1, + "maximum": 100 + } + }, + { + "name": "filter", + "description": "OData-compliant filter. Encode the value when sending it in a URL.\n\nAllows filtering on one or multiple dimensions. By default, filters for production environment only.\n\nSupported dimensions: country, deviceType, environment, requestPath, referrerHostname, osName, browserName, route, utmSource, utmMedium, utmCampaign, utmContent, utmTerm, eventName.\n\nJSON dimensions filtered by key: flags/\u003cname\u003e, eventData/\u003cproperty\u003e, for example eventData/plan eq 'pro'. Wrap keys containing characters other than letters, digits, and underscores in single quotes, for example flags/'my-flag' eq 'true'.\n\nSupported operations include eq, ne, in, and logical operators and, or, not with parentheses. Functions such as startswith are supported by the OData parser.", + "in": "query", + "required": false, + "schema": { + "description": "OData-compliant filter. Encode the value when sending it in a URL.\n\nAllows filtering on one or multiple dimensions. By default, filters for production environment only.\n\nSupported dimensions: country, deviceType, environment, requestPath, referrerHostname, osName, browserName, route, utmSource, utmMedium, utmCampaign, utmContent, utmTerm, eventName.\n\nJSON dimensions filtered by key: flags/\u003cname\u003e, eventData/\u003cproperty\u003e, for example eventData/plan eq 'pro'. Wrap keys containing characters other than letters, digits, and underscores in single quotes, for example flags/'my-flag' eq 'true'.\n\nSupported operations include eq, ne, in, and logical operators and, or, not with parentheses. Functions such as startswith are supported by the OData parser.", + "example": "eventData/plan eq 'pro'", + "type": "string" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + } + }, + "/v1/query/web-analytics/visits/count": { + "get": { + "description": "Counts the number of page views on a project (production only), since Web Analytics was enabled. Results can be filtered on supported dimensions.", + "operationId": "countPageviews", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Counts page views", + "tags": [ + "web-analytics" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "version": { + "type": "number" + }, + "query": { + "properties": { + "since": { + "type": "string" + }, + "until": { + "type": "string" + }, + "filter": { + "type": "string" + } + }, + "required": [ + "since", + "until" + ], + "type": "object" + }, + "data": { + "oneOf": [ + { + "properties": { + "projectId": { + "type": "string" + }, + "country": { + "type": "string" + }, + "deviceType": { + "type": "string" + }, + "environment": { + "type": "string" + }, + "requestPath": { + "type": "string" + }, + "referrerHostname": { + "type": "string" + }, + "osName": { + "type": "string" + }, + "browserName": { + "type": "string" + }, + "route": { + "type": "string" + }, + "utmSource": { + "type": "string" + }, + "utmMedium": { + "type": "string" + }, + "utmCampaign": { + "type": "string" + }, + "utmContent": { + "type": "string" + }, + "utmTerm": { + "type": "string" + }, + "flags": { + "type": "string" + }, + "errorMessage": { + "type": "string" + }, + "entryRevalidateSeconds": { + "type": "string" + }, + "projectName": { + "type": "string" + }, + "deploymentId": { + "type": "string" + }, + "pathType": { + "type": "string" + }, + "pathTypeVariant": { + "type": "string" + }, + "requestHostname": { + "type": "string" + }, + "requestResolvedIp": { + "type": "string" + }, + "requestMethod": { + "type": "string" + }, + "requestExtension": { + "type": "string" + }, + "requestId": { + "type": "string" + }, + "requestApi": { + "type": "string" + }, + "referrerUrl": { + "type": "string" + }, + "serverActionName": { + "type": "string" + }, + "httpStatus": { + "type": "string" + }, + "errorCode": { + "type": "string" + }, + "source": { + "type": "string" + }, + "edgeType": { + "type": "string" + }, + "reason": { + "type": "string" + }, + "edgeNetworkRegion": { + "type": "string" + }, + "functionRegion": { + "type": "string" + }, + "imageTransformationRegion": { + "type": "string" + }, + "dataCacheRegion": { + "type": "string" + }, + "cause": { + "type": "string" + }, + "runtime": { + "type": "string" + }, + "provider": { + "type": "string" + }, + "isrCacheRegion": { + "type": "string" + }, + "isrAction": { + "type": "string" + }, + "cacheResult": { + "type": "string" + }, + "cacheOperation": { + "type": "string" + }, + "cacheHostname": { + "type": "string" + }, + "cachePath": { + "type": "string" + }, + "cacheHitState": { + "type": "string" + }, + "cacheHitLevel": { + "type": "string" + }, + "cacheApi": { + "type": "string" + }, + "cacheReason": { + "type": "string" + }, + "pprState": { + "type": "string" + }, + "clientIp": { + "type": "string" + }, + "clientIpCountry": { + "type": "string" + }, + "clientUserAgent": { + "type": "string" + }, + "httpAccept": { + "type": "string" + }, + "clientJa4Digest": { + "type": "string" + }, + "asnId": { + "type": "string" + }, + "asnName": { + "type": "string" + }, + "botName": { + "type": "string" + }, + "botCategory": { + "type": "string" + }, + "botCategoryLegacy": { + "type": "string" + }, + "botVerified": { + "type": "string" + }, + "botCheckResult": { + "type": "string" + }, + "deepAnalysisCheck": { + "type": "string" + }, + "wafAction": { + "type": "string" + }, + "wafRuleId": { + "type": "string" + }, + "ruleCategory": { + "type": "string" + }, + "skewProtection": { + "type": "string" + }, + "functionStartType": { + "type": "string" + }, + "functionDispatcher": { + "type": "string" + }, + "isAdditionalRequest": { + "type": "string" + }, + "originHostname": { + "type": "string" + }, + "originPath": { + "type": "string" + }, + "originRoute": { + "type": "string" + }, + "fetchType": { + "type": "string" + }, + "fetchIndex": { + "type": "string" + }, + "imageSource": { + "type": "string" + }, + "sourceImage": { + "type": "string" + }, + "sourceImagePathname": { + "type": "string" + }, + "sourceImageHostname": { + "type": "string" + }, + "sourceImageHash": { + "type": "string" + }, + "optimizedQuality": { + "type": "string" + }, + "optimizedWidthPixels": { + "type": "string" + }, + "optimizedFormatMimeType": { + "type": "string" + }, + "vdcOperationOrigin": { + "type": "string" + }, + "entryName": { + "type": "string" + }, + "entryId": { + "type": "string" + }, + "entryItemId": { + "type": "string" + }, + "tagName": { + "type": "string" + }, + "cacheTags": { + "type": "string" + }, + "storeId": { + "type": "string" + }, + "storeName": { + "type": "string" + }, + "blobOperationType": { + "type": "string" + }, + "blobOperationLevel": { + "type": "string" + }, + "visitorId": { + "type": "string" + }, + "eventName": { + "type": "string" + }, + "attributionTarget": { + "type": "string" + }, + "attributionEventName": { + "type": "string" + }, + "metricName": { + "type": "string" + }, + "attributes": { + "type": "string" + }, + "flagKey": { + "type": "string" + }, + "flagVariant": { + "type": "string" + }, + "flagEvaluationReason": { + "type": "string" + }, + "flagClientName": { + "type": "string" + }, + "sdkKeyId": { + "type": "string" + }, + "sdkKeyEnvironment": { + "type": "string" + }, + "reportingProjectId": { + "type": "string" + }, + "reportingProjectName": { + "type": "string" + }, + "eventData": { + "type": "string" + }, + "middlewareAction": { + "type": "string" + }, + "middlewareActionTarget": { + "type": "string" + }, + "aiModel": { + "type": "string" + }, + "aiGatewayModelId": { + "type": "string" + }, + "aiProvider": { + "type": "string" + }, + "aiModelType": { + "type": "string" + }, + "servedSpeed": { + "type": "string" + }, + "virtualModelSlug": { + "type": "string" + }, + "virtualModelKind": { + "type": "string" + }, + "inferenceEndpointSlug": { + "type": "string" + }, + "inferenceScope": { + "type": "string" + }, + "inferenceGeoRegion": { + "type": "string" + }, + "inferenceProviderRegion": { + "type": "string" + }, + "requestedInferenceRegion": { + "type": "string" + }, + "costCurrency": { + "type": "string" + }, + "marketCostCurrency": { + "type": "string" + }, + "cachedInputTokensCurrency": { + "type": "string" + }, + "cacheCreationInputTokensCurrency": { + "type": "string" + }, + "cacheCreation1hInputTokensCurrency": { + "type": "string" + }, + "surchargeCostCurrency": { + "type": "string" + }, + "gatewayCostCurrency": { + "type": "string" + }, + "keyId": { + "type": "string" + }, + "keyName": { + "type": "string" + }, + "authMethod": { + "type": "string" + }, + "appName": { + "type": "string" + }, + "codingAgent": { + "type": "string" + }, + "isByok": { + "type": "string" + }, + "spendAttribution": { + "type": "string" + }, + "isPrivateModel": { + "type": "string" + }, + "isStreaming": { + "type": "string" + }, + "isRequestZdr": { + "type": "string" + }, + "hipaaRequested": { + "type": "string" + }, + "quotaRequested": { + "type": "string" + }, + "quotaEntityId": { + "type": "string" + }, + "quotaEntityType": { + "type": "string" + }, + "videoResolution": { + "type": "string" + }, + "videoAspectRatio": { + "type": "string" + }, + "piiRedactionApplied": { + "type": "string" + }, + "moderationApplied": { + "type": "string" + }, + "queueName": { + "type": "string" + }, + "consumerGroup": { + "type": "string" + }, + "messageId": { + "type": "string" + }, + "eventType": { + "type": "string" + }, + "notificationUrl": { + "type": "string" + }, + "queueRegion": { + "type": "string" + }, + "sandboxSessionId": { + "type": "string" + }, + "sandboxName": { + "type": "string" + }, + "workflowRunId": { + "type": "string" + }, + "workflowName": { + "type": "string" + }, + "workflowStatus": { + "type": "string" + }, + "stepRunId": { + "type": "string" + }, + "workflowStepName": { + "type": "string" + }, + "workflowEventType": { + "type": "string" + }, + "region": { + "type": "string" + }, + "specVersion": { + "type": "string" + }, + "contentType": { + "type": "string" + }, + "rewriteDestinationHostname": { + "type": "string" + }, + "externalRewriteTargetHost": { + "type": "string" + }, + "externalRewriteTargetPath": { + "type": "string" + }, + "commitSha": { + "type": "string" + }, + "reviewConclusion": { + "type": "string" + }, + "pullRequestNumber": { + "type": "string" + }, + "repositoryName": { + "type": "string" + }, + "repositoryOwner": { + "type": "string" + }, + "reviewStatus": { + "type": "string" + }, + "pullRequestState": { + "type": "string" + }, + "triggeringTag": { + "type": "string" + }, + "redirectLocation": { + "type": "string" + }, + "microfrontendsResponseReason": { + "type": "string" + }, + "microfrontendsMatchedPath": { + "type": "string" + }, + "microfrontendsDefaultAppDeploymentId": { + "type": "string" + }, + "microfrontendsDefaultAppProjectId": { + "type": "string" + }, + "service": { + "type": "string" + }, + "isPrefetchRequest": { + "type": "string" + }, + "spendReportGroupBy": { + "type": "string" + }, + "spendReportDatePart": { + "type": "string" + }, + "providerAttemptCanonicalSlug": { + "type": "string" + }, + "providerAttemptCredentialType": { + "type": "string" + }, + "providerAttemptSuccess": { + "type": "string" + }, + "providerAttemptStatusCode": { + "type": "string" + }, + "providerAttemptTimeout": { + "type": "string" + }, + "providerAttemptIsFinal": { + "type": "string" + }, + "providerAttemptNumber": { + "type": "string" + }, + "providerAttemptTotalInRequest": { + "type": "string" + }, + "generationId": { + "type": "string" + }, + "sessionId": { + "type": "string" + }, + "contentCaptureStatus": { + "type": "string" + }, + "contentCaptureInputs": { + "type": "string" + }, + "contentCaptureOutputs": { + "type": "string" + }, + "transcriptStatus": { + "type": "string" + }, + "transcriptInputs": { + "type": "string" + }, + "transcriptOutputs": { + "type": "string" + }, + "providerAttemptError": { + "type": "string" + }, + "providerAttemptSafetyIdentifier": { + "type": "string" + }, + "providerAttemptDevSafetyIdentifier": { + "type": "string" + }, + "providerAttemptRegion": { + "type": "string" + }, + "providerAttemptModelIndex": { + "type": "string" + }, + "toolCallType": { + "type": "string" + }, + "toolCallProvider": { + "type": "string" + }, + "toolCallSuccess": { + "type": "string" + }, + "toolCallErrorType": { + "type": "string" + }, + "toolCallStatusCode": { + "type": "string" + }, + "environmentId": { + "type": "string" + }, + "billableRegion": { + "type": "string" + }, + "direction": { + "type": "string" + }, + "networkTenancy": { + "type": "string" + }, + "trafficSource": { + "type": "string" + }, + "networkId": { + "type": "string" + }, + "privatelinkEndpointId": { + "type": "string" + }, + "privatelinkDnsName": { + "type": "string" + }, + "privatelinkIpAddress": { + "type": "string" + } + }, + "required": [ + "aiGatewayModelId", + "aiModel", + "aiModelType", + "aiProvider", + "appName", + "asnId", + "asnName", + "attributes", + "attributionEventName", + "attributionTarget", + "authMethod", + "billableRegion", + "blobOperationLevel", + "blobOperationType", + "botCategory", + "botCategoryLegacy", + "botCheckResult", + "botName", + "botVerified", + "browserName", + "cacheApi", + "cacheCreation1hInputTokensCurrency", + "cacheCreationInputTokensCurrency", + "cacheHitLevel", + "cacheHitState", + "cacheHostname", + "cacheOperation", + "cachePath", + "cacheReason", + "cacheResult", + "cacheTags", + "cachedInputTokensCurrency", + "cause", + "clientIp", + "clientIpCountry", + "clientJa4Digest", + "clientUserAgent", + "codingAgent", + "commitSha", + "consumerGroup", + "contentCaptureInputs", + "contentCaptureOutputs", + "contentCaptureStatus", + "contentType", + "costCurrency", + "country", + "dataCacheRegion", + "deepAnalysisCheck", + "deploymentId", + "deviceType", + "direction", + "edgeNetworkRegion", + "edgeType", + "entryId", + "entryItemId", + "entryName", + "entryRevalidateSeconds", + "environment", + "environmentId", + "errorCode", + "errorMessage", + "eventData", + "eventName", + "eventType", + "externalRewriteTargetHost", + "externalRewriteTargetPath", + "fetchIndex", + "fetchType", + "flagClientName", + "flagEvaluationReason", + "flagKey", + "flagVariant", + "flags", + "functionDispatcher", + "functionRegion", + "functionStartType", + "gatewayCostCurrency", + "generationId", + "hipaaRequested", + "httpAccept", + "httpStatus", + "imageSource", + "imageTransformationRegion", + "inferenceEndpointSlug", + "inferenceGeoRegion", + "inferenceProviderRegion", + "inferenceScope", + "isAdditionalRequest", + "isByok", + "isPrefetchRequest", + "isPrivateModel", + "isRequestZdr", + "isStreaming", + "isrAction", + "isrCacheRegion", + "keyId", + "keyName", + "marketCostCurrency", + "messageId", + "metricName", + "microfrontendsDefaultAppDeploymentId", + "microfrontendsDefaultAppProjectId", + "microfrontendsMatchedPath", + "microfrontendsResponseReason", + "middlewareAction", + "middlewareActionTarget", + "moderationApplied", + "networkId", + "networkTenancy", + "notificationUrl", + "optimizedFormatMimeType", + "optimizedQuality", + "optimizedWidthPixels", + "originHostname", + "originPath", + "originRoute", + "osName", + "pathType", + "pathTypeVariant", + "piiRedactionApplied", + "pprState", + "privatelinkDnsName", + "privatelinkEndpointId", + "privatelinkIpAddress", + "projectId", + "projectName", + "provider", + "providerAttemptCanonicalSlug", + "providerAttemptCredentialType", + "providerAttemptDevSafetyIdentifier", + "providerAttemptError", + "providerAttemptIsFinal", + "providerAttemptModelIndex", + "providerAttemptNumber", + "providerAttemptRegion", + "providerAttemptSafetyIdentifier", + "providerAttemptStatusCode", + "providerAttemptSuccess", + "providerAttemptTimeout", + "providerAttemptTotalInRequest", + "pullRequestNumber", + "pullRequestState", + "queueName", + "queueRegion", + "quotaEntityId", + "quotaEntityType", + "quotaRequested", + "reason", + "redirectLocation", + "referrerHostname", + "referrerUrl", + "region", + "reportingProjectId", + "reportingProjectName", + "repositoryName", + "repositoryOwner", + "requestApi", + "requestExtension", + "requestHostname", + "requestId", + "requestMethod", + "requestPath", + "requestResolvedIp", + "requestedInferenceRegion", + "reviewConclusion", + "reviewStatus", + "rewriteDestinationHostname", + "route", + "ruleCategory", + "runtime", + "sandboxName", + "sandboxSessionId", + "sdkKeyEnvironment", + "sdkKeyId", + "servedSpeed", + "serverActionName", + "service", + "sessionId", + "skewProtection", + "source", + "sourceImage", + "sourceImageHash", + "sourceImageHostname", + "sourceImagePathname", + "specVersion", + "spendAttribution", + "spendReportDatePart", + "spendReportGroupBy", + "stepRunId", + "storeId", + "storeName", + "surchargeCostCurrency", + "tagName", + "toolCallErrorType", + "toolCallProvider", + "toolCallStatusCode", + "toolCallSuccess", + "toolCallType", + "trafficSource", + "transcriptInputs", + "transcriptOutputs", + "transcriptStatus", + "triggeringTag", + "utmCampaign", + "utmContent", + "utmMedium", + "utmSource", + "utmTerm", + "vdcOperationOrigin", + "videoAspectRatio", + "videoResolution", + "virtualModelKind", + "virtualModelSlug", + "visitorId", + "wafAction", + "wafRuleId", + "workflowEventType", + "workflowName", + "workflowRunId", + "workflowStatus", + "workflowStepName" + ], + "type": "object", + "additionalProperties": { + "nullable": true, + "type": "number" + } + }, + { + "properties": { + "visitors": { + "type": "number" + }, + "pageviews": { + "type": "number" + } + }, + "required": [ + "pageviews", + "visitors" + ], + "type": "object" + } + ] + } + }, + "required": [ + "data", + "query", + "version" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "402": { + "description": "" + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "projectId", + "description": "The project identifier or the project name", + "in": "query", + "required": true, + "schema": { + "description": "The project identifier or the project name", + "example": "prj_XLKmu1DyR1eY7zq8UgeRKbA7yVLA", + "type": "string" + } + }, + { + "name": "since", + "description": "Timestamp in milliseconds, or a valid Date string.\n\nSelects data from (including) this date and time.\nWill be adjusted according to the desired time granularity.", + "in": "query", + "required": false, + "schema": { + "description": "Timestamp in milliseconds, or a valid Date string.\n\nSelects data from (including) this date and time.\nWill be adjusted according to the desired time granularity.", + "example": "2024-09-01T00:00:00.000Z", + "anyOf": [ + { + "type": "number" + }, + { + "type": "string" + } + ] + } + }, + { + "name": "until", + "description": "Timestamp in milliseconds, or a valid Date string.\n\nSelects data until (including) this date.\nWill be adjusted according to the desired time granularity.", + "in": "query", + "required": false, + "schema": { + "description": "Timestamp in milliseconds, or a valid Date string.\n\nSelects data until (including) this date.\nWill be adjusted according to the desired time granularity.", + "example": "2024-09-08T00:00:00.000Z", + "anyOf": [ + { + "type": "number" + }, + { + "type": "string" + } + ] + } + }, + { + "name": "filter", + "description": "OData-compliant filter. Encode the value when sending it in a URL.\n\nAllows filtering on one or multiple dimensions.\n\nSupported dimensions: country, deviceType, environment, requestPath, referrerHostname, osName, browserName, route, utmSource, utmMedium, utmCampaign, utmContent, utmTerm.\n\nJSON dimensions filtered by key: flags/\u003cname\u003e, for example flags/beta_banner eq 'true'. Wrap keys containing characters other than letters, digits, and underscores in single quotes, for example flags/'my-flag' eq 'true'.\n\nSupported operations include eq, ne, in, and logical operators and, or, not with parentheses. Functions such as startswith are supported by the OData parser.", + "in": "query", + "required": false, + "schema": { + "description": "OData-compliant filter. Encode the value when sending it in a URL.\n\nAllows filtering on one or multiple dimensions.\n\nSupported dimensions: country, deviceType, environment, requestPath, referrerHostname, osName, browserName, route, utmSource, utmMedium, utmCampaign, utmContent, utmTerm.\n\nJSON dimensions filtered by key: flags/\u003cname\u003e, for example flags/beta_banner eq 'true'. Wrap keys containing characters other than letters, digits, and underscores in single quotes, for example flags/'my-flag' eq 'true'.\n\nSupported operations include eq, ne, in, and logical operators and, or, not with parentheses. Functions such as startswith are supported by the OData parser.", + "example": "route eq '/home'", + "type": "string" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + } + }, + "/v1/query/web-analytics/events/count": { + "get": { + "description": "Counts the number of custom events on a project (production only), since Web Analytics was enabled. Results can be filtered on supported dimensions.", + "operationId": "countEvents", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Counts custom events", + "tags": [ + "web-analytics" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "version": { + "type": "number" + }, + "query": { + "properties": { + "since": { + "type": "string" + }, + "until": { + "type": "string" + }, + "filter": { + "type": "string" + } + }, + "required": [ + "since", + "until" + ], + "type": "object" + }, + "data": { + "oneOf": [ + { + "properties": { + "projectId": { + "type": "string" + }, + "country": { + "type": "string" + }, + "deviceType": { + "type": "string" + }, + "environment": { + "type": "string" + }, + "requestPath": { + "type": "string" + }, + "referrerHostname": { + "type": "string" + }, + "osName": { + "type": "string" + }, + "browserName": { + "type": "string" + }, + "route": { + "type": "string" + }, + "utmSource": { + "type": "string" + }, + "utmMedium": { + "type": "string" + }, + "utmCampaign": { + "type": "string" + }, + "utmContent": { + "type": "string" + }, + "utmTerm": { + "type": "string" + }, + "flags": { + "type": "string" + }, + "errorMessage": { + "type": "string" + }, + "entryRevalidateSeconds": { + "type": "string" + }, + "projectName": { + "type": "string" + }, + "deploymentId": { + "type": "string" + }, + "pathType": { + "type": "string" + }, + "pathTypeVariant": { + "type": "string" + }, + "requestHostname": { + "type": "string" + }, + "requestResolvedIp": { + "type": "string" + }, + "requestMethod": { + "type": "string" + }, + "requestExtension": { + "type": "string" + }, + "requestId": { + "type": "string" + }, + "requestApi": { + "type": "string" + }, + "referrerUrl": { + "type": "string" + }, + "serverActionName": { + "type": "string" + }, + "httpStatus": { + "type": "string" + }, + "errorCode": { + "type": "string" + }, + "source": { + "type": "string" + }, + "edgeType": { + "type": "string" + }, + "reason": { + "type": "string" + }, + "edgeNetworkRegion": { + "type": "string" + }, + "functionRegion": { + "type": "string" + }, + "imageTransformationRegion": { + "type": "string" + }, + "dataCacheRegion": { + "type": "string" + }, + "cause": { + "type": "string" + }, + "runtime": { + "type": "string" + }, + "provider": { + "type": "string" + }, + "isrCacheRegion": { + "type": "string" + }, + "isrAction": { + "type": "string" + }, + "cacheResult": { + "type": "string" + }, + "cacheOperation": { + "type": "string" + }, + "cacheHostname": { + "type": "string" + }, + "cachePath": { + "type": "string" + }, + "cacheHitState": { + "type": "string" + }, + "cacheHitLevel": { + "type": "string" + }, + "cacheApi": { + "type": "string" + }, + "cacheReason": { + "type": "string" + }, + "pprState": { + "type": "string" + }, + "clientIp": { + "type": "string" + }, + "clientIpCountry": { + "type": "string" + }, + "clientUserAgent": { + "type": "string" + }, + "httpAccept": { + "type": "string" + }, + "clientJa4Digest": { + "type": "string" + }, + "asnId": { + "type": "string" + }, + "asnName": { + "type": "string" + }, + "botName": { + "type": "string" + }, + "botCategory": { + "type": "string" + }, + "botCategoryLegacy": { + "type": "string" + }, + "botVerified": { + "type": "string" + }, + "botCheckResult": { + "type": "string" + }, + "deepAnalysisCheck": { + "type": "string" + }, + "wafAction": { + "type": "string" + }, + "wafRuleId": { + "type": "string" + }, + "ruleCategory": { + "type": "string" + }, + "skewProtection": { + "type": "string" + }, + "functionStartType": { + "type": "string" + }, + "functionDispatcher": { + "type": "string" + }, + "isAdditionalRequest": { + "type": "string" + }, + "originHostname": { + "type": "string" + }, + "originPath": { + "type": "string" + }, + "originRoute": { + "type": "string" + }, + "fetchType": { + "type": "string" + }, + "fetchIndex": { + "type": "string" + }, + "imageSource": { + "type": "string" + }, + "sourceImage": { + "type": "string" + }, + "sourceImagePathname": { + "type": "string" + }, + "sourceImageHostname": { + "type": "string" + }, + "sourceImageHash": { + "type": "string" + }, + "optimizedQuality": { + "type": "string" + }, + "optimizedWidthPixels": { + "type": "string" + }, + "optimizedFormatMimeType": { + "type": "string" + }, + "vdcOperationOrigin": { + "type": "string" + }, + "entryName": { + "type": "string" + }, + "entryId": { + "type": "string" + }, + "entryItemId": { + "type": "string" + }, + "tagName": { + "type": "string" + }, + "cacheTags": { + "type": "string" + }, + "storeId": { + "type": "string" + }, + "storeName": { + "type": "string" + }, + "blobOperationType": { + "type": "string" + }, + "blobOperationLevel": { + "type": "string" + }, + "visitorId": { + "type": "string" + }, + "eventName": { + "type": "string" + }, + "attributionTarget": { + "type": "string" + }, + "attributionEventName": { + "type": "string" + }, + "metricName": { + "type": "string" + }, + "attributes": { + "type": "string" + }, + "flagKey": { + "type": "string" + }, + "flagVariant": { + "type": "string" + }, + "flagEvaluationReason": { + "type": "string" + }, + "flagClientName": { + "type": "string" + }, + "sdkKeyId": { + "type": "string" + }, + "sdkKeyEnvironment": { + "type": "string" + }, + "reportingProjectId": { + "type": "string" + }, + "reportingProjectName": { + "type": "string" + }, + "eventData": { + "type": "string" + }, + "middlewareAction": { + "type": "string" + }, + "middlewareActionTarget": { + "type": "string" + }, + "aiModel": { + "type": "string" + }, + "aiGatewayModelId": { + "type": "string" + }, + "aiProvider": { + "type": "string" + }, + "aiModelType": { + "type": "string" + }, + "servedSpeed": { + "type": "string" + }, + "virtualModelSlug": { + "type": "string" + }, + "virtualModelKind": { + "type": "string" + }, + "inferenceEndpointSlug": { + "type": "string" + }, + "inferenceScope": { + "type": "string" + }, + "inferenceGeoRegion": { + "type": "string" + }, + "inferenceProviderRegion": { + "type": "string" + }, + "requestedInferenceRegion": { + "type": "string" + }, + "costCurrency": { + "type": "string" + }, + "marketCostCurrency": { + "type": "string" + }, + "cachedInputTokensCurrency": { + "type": "string" + }, + "cacheCreationInputTokensCurrency": { + "type": "string" + }, + "cacheCreation1hInputTokensCurrency": { + "type": "string" + }, + "surchargeCostCurrency": { + "type": "string" + }, + "gatewayCostCurrency": { + "type": "string" + }, + "keyId": { + "type": "string" + }, + "keyName": { + "type": "string" + }, + "authMethod": { + "type": "string" + }, + "appName": { + "type": "string" + }, + "codingAgent": { + "type": "string" + }, + "isByok": { + "type": "string" + }, + "spendAttribution": { + "type": "string" + }, + "isPrivateModel": { + "type": "string" + }, + "isStreaming": { + "type": "string" + }, + "isRequestZdr": { + "type": "string" + }, + "hipaaRequested": { + "type": "string" + }, + "quotaRequested": { + "type": "string" + }, + "quotaEntityId": { + "type": "string" + }, + "quotaEntityType": { + "type": "string" + }, + "videoResolution": { + "type": "string" + }, + "videoAspectRatio": { + "type": "string" + }, + "piiRedactionApplied": { + "type": "string" + }, + "moderationApplied": { + "type": "string" + }, + "queueName": { + "type": "string" + }, + "consumerGroup": { + "type": "string" + }, + "messageId": { + "type": "string" + }, + "eventType": { + "type": "string" + }, + "notificationUrl": { + "type": "string" + }, + "queueRegion": { + "type": "string" + }, + "sandboxSessionId": { + "type": "string" + }, + "sandboxName": { + "type": "string" + }, + "workflowRunId": { + "type": "string" + }, + "workflowName": { + "type": "string" + }, + "workflowStatus": { + "type": "string" + }, + "stepRunId": { + "type": "string" + }, + "workflowStepName": { + "type": "string" + }, + "workflowEventType": { + "type": "string" + }, + "region": { + "type": "string" + }, + "specVersion": { + "type": "string" + }, + "contentType": { + "type": "string" + }, + "rewriteDestinationHostname": { + "type": "string" + }, + "externalRewriteTargetHost": { + "type": "string" + }, + "externalRewriteTargetPath": { + "type": "string" + }, + "commitSha": { + "type": "string" + }, + "reviewConclusion": { + "type": "string" + }, + "pullRequestNumber": { + "type": "string" + }, + "repositoryName": { + "type": "string" + }, + "repositoryOwner": { + "type": "string" + }, + "reviewStatus": { + "type": "string" + }, + "pullRequestState": { + "type": "string" + }, + "triggeringTag": { + "type": "string" + }, + "redirectLocation": { + "type": "string" + }, + "microfrontendsResponseReason": { + "type": "string" + }, + "microfrontendsMatchedPath": { + "type": "string" + }, + "microfrontendsDefaultAppDeploymentId": { + "type": "string" + }, + "microfrontendsDefaultAppProjectId": { + "type": "string" + }, + "service": { + "type": "string" + }, + "isPrefetchRequest": { + "type": "string" + }, + "spendReportGroupBy": { + "type": "string" + }, + "spendReportDatePart": { + "type": "string" + }, + "providerAttemptCanonicalSlug": { + "type": "string" + }, + "providerAttemptCredentialType": { + "type": "string" + }, + "providerAttemptSuccess": { + "type": "string" + }, + "providerAttemptStatusCode": { + "type": "string" + }, + "providerAttemptTimeout": { + "type": "string" + }, + "providerAttemptIsFinal": { + "type": "string" + }, + "providerAttemptNumber": { + "type": "string" + }, + "providerAttemptTotalInRequest": { + "type": "string" + }, + "generationId": { + "type": "string" + }, + "sessionId": { + "type": "string" + }, + "contentCaptureStatus": { + "type": "string" + }, + "contentCaptureInputs": { + "type": "string" + }, + "contentCaptureOutputs": { + "type": "string" + }, + "transcriptStatus": { + "type": "string" + }, + "transcriptInputs": { + "type": "string" + }, + "transcriptOutputs": { + "type": "string" + }, + "providerAttemptError": { + "type": "string" + }, + "providerAttemptSafetyIdentifier": { + "type": "string" + }, + "providerAttemptDevSafetyIdentifier": { + "type": "string" + }, + "providerAttemptRegion": { + "type": "string" + }, + "providerAttemptModelIndex": { + "type": "string" + }, + "toolCallType": { + "type": "string" + }, + "toolCallProvider": { + "type": "string" + }, + "toolCallSuccess": { + "type": "string" + }, + "toolCallErrorType": { + "type": "string" + }, + "toolCallStatusCode": { + "type": "string" + }, + "environmentId": { + "type": "string" + }, + "billableRegion": { + "type": "string" + }, + "direction": { + "type": "string" + }, + "networkTenancy": { + "type": "string" + }, + "trafficSource": { + "type": "string" + }, + "networkId": { + "type": "string" + }, + "privatelinkEndpointId": { + "type": "string" + }, + "privatelinkDnsName": { + "type": "string" + }, + "privatelinkIpAddress": { + "type": "string" + } + }, + "required": [ + "aiGatewayModelId", + "aiModel", + "aiModelType", + "aiProvider", + "appName", + "asnId", + "asnName", + "attributes", + "attributionEventName", + "attributionTarget", + "authMethod", + "billableRegion", + "blobOperationLevel", + "blobOperationType", + "botCategory", + "botCategoryLegacy", + "botCheckResult", + "botName", + "botVerified", + "browserName", + "cacheApi", + "cacheCreation1hInputTokensCurrency", + "cacheCreationInputTokensCurrency", + "cacheHitLevel", + "cacheHitState", + "cacheHostname", + "cacheOperation", + "cachePath", + "cacheReason", + "cacheResult", + "cacheTags", + "cachedInputTokensCurrency", + "cause", + "clientIp", + "clientIpCountry", + "clientJa4Digest", + "clientUserAgent", + "codingAgent", + "commitSha", + "consumerGroup", + "contentCaptureInputs", + "contentCaptureOutputs", + "contentCaptureStatus", + "contentType", + "costCurrency", + "country", + "dataCacheRegion", + "deepAnalysisCheck", + "deploymentId", + "deviceType", + "direction", + "edgeNetworkRegion", + "edgeType", + "entryId", + "entryItemId", + "entryName", + "entryRevalidateSeconds", + "environment", + "environmentId", + "errorCode", + "errorMessage", + "eventData", + "eventName", + "eventType", + "externalRewriteTargetHost", + "externalRewriteTargetPath", + "fetchIndex", + "fetchType", + "flagClientName", + "flagEvaluationReason", + "flagKey", + "flagVariant", + "flags", + "functionDispatcher", + "functionRegion", + "functionStartType", + "gatewayCostCurrency", + "generationId", + "hipaaRequested", + "httpAccept", + "httpStatus", + "imageSource", + "imageTransformationRegion", + "inferenceEndpointSlug", + "inferenceGeoRegion", + "inferenceProviderRegion", + "inferenceScope", + "isAdditionalRequest", + "isByok", + "isPrefetchRequest", + "isPrivateModel", + "isRequestZdr", + "isStreaming", + "isrAction", + "isrCacheRegion", + "keyId", + "keyName", + "marketCostCurrency", + "messageId", + "metricName", + "microfrontendsDefaultAppDeploymentId", + "microfrontendsDefaultAppProjectId", + "microfrontendsMatchedPath", + "microfrontendsResponseReason", + "middlewareAction", + "middlewareActionTarget", + "moderationApplied", + "networkId", + "networkTenancy", + "notificationUrl", + "optimizedFormatMimeType", + "optimizedQuality", + "optimizedWidthPixels", + "originHostname", + "originPath", + "originRoute", + "osName", + "pathType", + "pathTypeVariant", + "piiRedactionApplied", + "pprState", + "privatelinkDnsName", + "privatelinkEndpointId", + "privatelinkIpAddress", + "projectId", + "projectName", + "provider", + "providerAttemptCanonicalSlug", + "providerAttemptCredentialType", + "providerAttemptDevSafetyIdentifier", + "providerAttemptError", + "providerAttemptIsFinal", + "providerAttemptModelIndex", + "providerAttemptNumber", + "providerAttemptRegion", + "providerAttemptSafetyIdentifier", + "providerAttemptStatusCode", + "providerAttemptSuccess", + "providerAttemptTimeout", + "providerAttemptTotalInRequest", + "pullRequestNumber", + "pullRequestState", + "queueName", + "queueRegion", + "quotaEntityId", + "quotaEntityType", + "quotaRequested", + "reason", + "redirectLocation", + "referrerHostname", + "referrerUrl", + "region", + "reportingProjectId", + "reportingProjectName", + "repositoryName", + "repositoryOwner", + "requestApi", + "requestExtension", + "requestHostname", + "requestId", + "requestMethod", + "requestPath", + "requestResolvedIp", + "requestedInferenceRegion", + "reviewConclusion", + "reviewStatus", + "rewriteDestinationHostname", + "route", + "ruleCategory", + "runtime", + "sandboxName", + "sandboxSessionId", + "sdkKeyEnvironment", + "sdkKeyId", + "servedSpeed", + "serverActionName", + "service", + "sessionId", + "skewProtection", + "source", + "sourceImage", + "sourceImageHash", + "sourceImageHostname", + "sourceImagePathname", + "specVersion", + "spendAttribution", + "spendReportDatePart", + "spendReportGroupBy", + "stepRunId", + "storeId", + "storeName", + "surchargeCostCurrency", + "tagName", + "toolCallErrorType", + "toolCallProvider", + "toolCallStatusCode", + "toolCallSuccess", + "toolCallType", + "trafficSource", + "transcriptInputs", + "transcriptOutputs", + "transcriptStatus", + "triggeringTag", + "utmCampaign", + "utmContent", + "utmMedium", + "utmSource", + "utmTerm", + "vdcOperationOrigin", + "videoAspectRatio", + "videoResolution", + "virtualModelKind", + "virtualModelSlug", + "visitorId", + "wafAction", + "wafRuleId", + "workflowEventType", + "workflowName", + "workflowRunId", + "workflowStatus", + "workflowStepName" + ], + "type": "object", + "additionalProperties": { + "nullable": true, + "type": "number" + } + }, + { + "properties": { + "visitors": { + "type": "number" + }, + "count": { + "type": "number" + } + }, + "required": [ + "count", + "visitors" + ], + "type": "object" + } + ] + } + }, + "required": [ + "data", + "query", + "version" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "402": { + "description": "" + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "projectId", + "description": "The project identifier or the project name", + "in": "query", + "required": true, + "schema": { + "description": "The project identifier or the project name", + "example": "prj_XLKmu1DyR1eY7zq8UgeRKbA7yVLA", + "type": "string" + } + }, + { + "name": "since", + "description": "Timestamp in milliseconds, or a valid Date string.\n\nSelects data from (including) this date and time.\nWill be adjusted according to the desired time granularity.", + "in": "query", + "required": false, + "schema": { + "description": "Timestamp in milliseconds, or a valid Date string.\n\nSelects data from (including) this date and time.\nWill be adjusted according to the desired time granularity.", + "example": "2024-09-01T00:00:00.000Z", + "anyOf": [ + { + "type": "number" + }, + { + "type": "string" + } + ] + } + }, + { + "name": "until", + "description": "Timestamp in milliseconds, or a valid Date string.\n\nSelects data until (including) this date.\nWill be adjusted according to the desired time granularity.", + "in": "query", + "required": false, + "schema": { + "description": "Timestamp in milliseconds, or a valid Date string.\n\nSelects data until (including) this date.\nWill be adjusted according to the desired time granularity.", + "example": "2024-09-08T00:00:00.000Z", + "anyOf": [ + { + "type": "number" + }, + { + "type": "string" + } + ] + } + }, + { + "name": "filter", + "description": "OData-compliant filter. Encode the value when sending it in a URL.\n\nAllows filtering on one or multiple dimensions.\n\nSupported dimensions: country, deviceType, environment, requestPath, referrerHostname, osName, browserName, route, utmSource, utmMedium, utmCampaign, utmContent, utmTerm, eventName.\n\nJSON dimensions filtered by key: flags/\u003cname\u003e, eventData/\u003cproperty\u003e, for example eventData/plan eq 'pro'. Wrap keys containing characters other than letters, digits, and underscores in single quotes, for example flags/'my-flag' eq 'true'.\n\nSupported operations include eq, ne, in, and logical operators and, or, not with parentheses. Functions such as startswith are supported by the OData parser.", + "in": "query", + "required": false, + "schema": { + "description": "OData-compliant filter. Encode the value when sending it in a URL.\n\nAllows filtering on one or multiple dimensions.\n\nSupported dimensions: country, deviceType, environment, requestPath, referrerHostname, osName, browserName, route, utmSource, utmMedium, utmCampaign, utmContent, utmTerm, eventName.\n\nJSON dimensions filtered by key: flags/\u003cname\u003e, eventData/\u003cproperty\u003e, for example eventData/plan eq 'pro'. Wrap keys containing characters other than letters, digits, and underscores in single quotes, for example flags/'my-flag' eq 'true'.\n\nSupported operations include eq, ne, in, and logical operators and, or, not with parentheses. Functions such as startswith are supported by the OData parser.", + "example": "eventName eq 'signup'", + "type": "string" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + } + }, + "/v1/webhooks": { + "post": { + "description": "Creates a webhook", + "operationId": "createWebhook", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Creates a webhook", + "tags": [ + "webhooks" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "secret": { + "type": "string", + "description": "The webhook secret used to sign the payload" + }, + "alertRuleIds": { + "items": { + "type": "string" + }, + "type": "array" + }, + "events": { + "items": { + "type": "string", + "enum": [ + "ai-gateway.auto-reload.limit-reached", + "ai-gateway.balance-depleted", + "alerts.triggered", + "botid.anomaly", + "budget.reached", + "comment.created", + "comment.deleted", + "comment.mentioned", + "comment.reaction-added", + "comment.reaction-removed", + "comment.resolved", + "comment.unresolved", + "comment.updated", + "deployment", + "deployment-canceled", + "deployment-check-rerequested", + "deployment-checks-completed", + "deployment-error", + "deployment-prepared", + "deployment-ready", + "deployment.blocked", + "deployment.build-requested", + "deployment.canceled", + "deployment.check-rerequested", + "deployment.checkrun.cancel", + "deployment.checkrun.start", + "deployment.checks.failed", + "deployment.checks.succeeded", + "deployment.cleanup", + "deployment.created", + "deployment.error", + "deployment.integration.action.cancel", + "deployment.integration.action.cleanup", + "deployment.integration.action.start", + "deployment.promoted", + "deployment.ready", + "deployment.rollback", + "deployment.succeeded", + "domain-created", + "domain.auto-renew.changed", + "domain.certificate.add", + "domain.certificate.add.failed", + "domain.certificate.deleted", + "domain.certificate.renew", + "domain.certificate.renew.failed", + "domain.created", + "domain.dns.records.changed", + "domain.renewal", + "domain.renewal.failed", + "domain.transfer-in.completed", + "domain.transfer-in.failed", + "domain.transfer-in.started", + "edge-config.created", + "edge-config.deleted", + "edge-config.items.updated", + "firewall.attack", + "firewall.custom-rule-anomaly", + "firewall.system-rule-anomaly", + "flag.created", + "flag.deleted", + "flag.segment.created", + "flag.segment.deleted", + "flag.segment.updated", + "flag.updated", + "function.archival-required", + "function.removal-required", + "integration-configuration-permission-updated", + "integration-configuration-removed", + "integration-configuration-scope-change-confirmed", + "integration-configuration.permission-upgraded", + "integration-configuration.removed", + "integration-configuration.scope-change-confirmed", + "integration-configuration.transferred", + "integration-resource.project-connected", + "integration-resource.project-disconnected", + "marketplace.invoice.created", + "marketplace.invoice.notpaid", + "marketplace.invoice.overdue", + "marketplace.invoice.paid", + "marketplace.invoice.refunded", + "marketplace.member.changed", + "message.created", + "message.deleted", + "message.mentioned", + "message.reaction-added", + "message.reaction-removed", + "message.updated", + "observability.anomaly", + "observability.anomaly-error", + "observability.error-anomaly", + "observability.usage-anomaly", + "project-created", + "project-removed", + "project.created", + "project.domain.created", + "project.domain.deleted", + "project.domain.moved", + "project.domain.unverified", + "project.domain.updated", + "project.domain.verified", + "project.env-variable.created", + "project.env-variable.deleted", + "project.env-variable.updated", + "project.removed", + "project.renamed", + "project.rolling-release.aborted", + "project.rolling-release.approved", + "project.rolling-release.completed", + "project.rolling-release.started", + "test-webhook", + "thread.resolved", + "thread.unresolved" + ], + "example": "deployment.created", + "description": "The webhooks events", + "x-speakeasy-enums": { + "budget.reached": "BudgetReached", + "domain.created": "DomainCreated", + "domain.dns.records.changed": "DomainDnsRecordsChanged", + "domain.transfer-in.started": "DomainTransferInStarted", + "domain.transfer-in.completed": "DomainTransferInCompleted", + "domain.transfer-in.failed": "DomainTransferInFailed", + "domain.certificate.add": "DomainCertificateAdd", + "domain.certificate.add.failed": "DomainCertificateAddFailed", + "domain.certificate.renew": "DomainCertificateRenew", + "domain.certificate.renew.failed": "DomainCertificateRenewFailed", + "domain.certificate.deleted": "DomainCertificateDeleted", + "domain.renewal": "DomainRenewal", + "domain.renewal.failed": "DomainRenewalFailed", + "domain.auto-renew.changed": "DomainAutoRenewChanged", + "deployment.created": "DeploymentCreated", + "deployment.cleanup": "DeploymentCleanup", + "deployment.error": "DeploymentError", + "deployment.canceled": "DeploymentCanceled", + "deployment.succeeded": "DeploymentSucceeded", + "deployment.ready": "DeploymentReady", + "deployment.check-rerequested": "DeploymentCheckRerequested", + "deployment.promoted": "DeploymentPromoted", + "deployment.integration.action.start": "DeploymentIntegrationActionStart", + "deployment.integration.action.cancel": "DeploymentIntegrationActionCancel", + "deployment.integration.action.cleanup": "DeploymentIntegrationActionCleanup", + "deployment.checkrun.start": "DeploymentCheckrunStart", + "deployment.checkrun.cancel": "DeploymentCheckrunCancel", + "edge-config.created": "EdgeConfigCreated", + "edge-config.deleted": "EdgeConfigDeleted", + "edge-config.items.updated": "EdgeConfigItemsUpdated", + "firewall.attack": "FirewallAttack", + "integration-configuration.permission-upgraded": "IntegrationConfigurationPermissionUpgraded", + "integration-configuration.removed": "IntegrationConfigurationRemoved", + "integration-configuration.scope-change-confirmed": "IntegrationConfigurationScopeChangeConfirmed", + "integration-resource.project-connected": "IntegrationResourceProjectConnected", + "integration-resource.project-disconnected": "IntegrationResourceProjectDisconnected", + "project.created": "ProjectCreated", + "project.removed": "ProjectRemoved", + "project.domain.created": "ProjectDomainCreated", + "project.domain.updated": "ProjectDomainUpdated", + "project.domain.deleted": "ProjectDomainDeleted", + "project.domain.verified": "ProjectDomainVerified", + "project.domain.unverified": "ProjectDomainUnverified", + "project.domain.moved": "ProjectDomainMoved", + "project.rolling-release.started": "ProjectRollingReleaseStarted", + "project.rolling-release.aborted": "ProjectRollingReleaseAborted", + "project.rolling-release.completed": "ProjectRollingReleaseCompleted", + "project.rolling-release.approved": "ProjectRollingReleaseApproved", + "deployment.checks.failed": "DeploymentChecksFailed", + "deployment.checks.succeeded": "DeploymentChecksSucceeded", + "deployment-checks-completed": "DeploymentChecksCompleted", + "deployment-ready": "DeploymentReadyHyphen", + "deployment-prepared": "DeploymentPreparedHyphen", + "deployment-error": "DeploymentErrorHyphen", + "deployment-check-rerequested": "DeploymentCheckRerequestedHyphen", + "deployment-canceled": "DeploymentCanceledHyphen", + "project-created": "ProjectCreatedHyphen", + "project-removed": "ProjectRemovedHyphen", + "domain-created": "DomainCreatedHyphen", + "deployment": "Deployment", + "integration-configuration-permission-updated": "IntegrationConfigurationPermissionUpdatedHyphen", + "integration-configuration-removed": "IntegrationConfigurationRemovedHyphen", + "integration-configuration-scope-change-confirmed": "IntegrationConfigurationScopeChangeConfirmedHyphen", + "marketplace.invoice.created": "MarketplaceInvoiceCreated", + "marketplace.invoice.paid": "MarketplaceInvoicePaid", + "marketplace.invoice.notpaid": "MarketplaceInvoiceNotpaid", + "marketplace.invoice.refunded": "MarketplaceInvoiceRefunded", + "observability.anomaly": "ObservabilityAnomaly", + "observability.anomaly-error": "ObservabilityAnomalyError", + "test-webhook": "TestWebhook" + } + }, + "type": "array", + "description": "The webhooks events", + "example": "deployment.created" + }, + "id": { + "type": "string", + "description": "The webhook id", + "example": "account_hook_GflD6EYyo7F4ViYS" + }, + "url": { + "type": "string", + "description": "A string with the URL of the webhook", + "example": "https://my-webhook.com" + }, + "ownerId": { + "type": "string", + "description": "The unique ID of the team the webhook belongs to", + "example": "ZspSRT4ljIEEmMHgoDwKWDei" + }, + "createdAt": { + "type": "number", + "description": "A number containing the date when the webhook was created in in milliseconds", + "example": 1567024758130 + }, + "updatedAt": { + "type": "number", + "description": "A number containing the date when the webhook was updated in in milliseconds", + "example": 1567024758130 + }, + "projectIds": { + "items": { + "type": "string" + }, + "type": "array", + "description": "The ID of the projects the webhook is associated with", + "example": [ + "prj_12HKQaOmR5t5Uy6vdcQsNIiZgHGB" + ] + } + }, + "required": [ + "createdAt", + "events", + "id", + "ownerId", + "secret", + "updatedAt", + "url" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "additionalProperties": false, + "required": [ + "url", + "events" + ], + "properties": { + "url": { + "format": "uri", + "pattern": "^https?://", + "type": "string" + }, + "events": { + "minItems": 1, + "type": "array", + "items": { + "type": "string", + "enum": [ + "budget.reached", + "domain.created", + "domain.dns.records.changed", + "domain.transfer-in.started", + "domain.transfer-in.completed", + "domain.transfer-in.failed", + "domain.certificate.add", + "domain.certificate.add.failed", + "domain.certificate.renew", + "domain.certificate.renew.failed", + "domain.certificate.deleted", + "domain.renewal", + "domain.renewal.failed", + "domain.auto-renew.changed", + "deployment.created", + "deployment.build-requested", + "deployment.cleanup", + "deployment.error", + "deployment.blocked", + "deployment.canceled", + "deployment.succeeded", + "deployment.ready", + "deployment.check-rerequested", + "deployment.promoted", + "deployment.rollback", + "deployment.integration.action.start", + "deployment.integration.action.cancel", + "deployment.integration.action.cleanup", + "deployment.checkrun.start", + "deployment.checkrun.cancel", + "edge-config.created", + "edge-config.deleted", + "edge-config.items.updated", + "firewall.attack", + "firewall.system-rule-anomaly", + "firewall.custom-rule-anomaly", + "function.archival-required", + "function.removal-required", + "alerts.triggered", + "integration-configuration.permission-upgraded", + "integration-configuration.removed", + "integration-configuration.scope-change-confirmed", + "integration-configuration.transferred", + "integration-resource.project-connected", + "integration-resource.project-disconnected", + "project.created", + "project.removed", + "project.renamed", + "project.env-variable.created", + "project.env-variable.updated", + "project.env-variable.deleted", + "project.domain.created", + "project.domain.updated", + "project.domain.deleted", + "project.domain.verified", + "project.domain.unverified", + "project.domain.moved", + "project.rolling-release.started", + "project.rolling-release.aborted", + "project.rolling-release.completed", + "project.rolling-release.approved", + "deployment.checks.failed", + "deployment.checks.succeeded", + "deployment-checks-completed", + "deployment-ready", + "deployment-prepared", + "deployment-error", + "deployment-check-rerequested", + "deployment-canceled", + "project-created", + "project-removed", + "domain-created", + "deployment", + "integration-configuration-permission-updated", + "integration-configuration-removed", + "integration-configuration-scope-change-confirmed", + "marketplace.member.changed", + "marketplace.invoice.created", + "marketplace.invoice.paid", + "marketplace.invoice.notpaid", + "marketplace.invoice.overdue", + "marketplace.invoice.refunded", + "ai-gateway.balance-depleted", + "ai-gateway.auto-reload.limit-reached", + "observability.anomaly", + "observability.anomaly-error", + "observability.usage-anomaly", + "observability.error-anomaly", + "botid.anomaly", + "flag.created", + "flag.updated", + "flag.deleted", + "flag.segment.created", + "flag.segment.updated", + "flag.segment.deleted", + "test-webhook", + "message.created", + "message.updated", + "message.deleted", + "thread.resolved", + "thread.unresolved", + "message.reaction-added", + "message.reaction-removed", + "message.mentioned", + "comment.created", + "comment.updated", + "comment.deleted", + "comment.resolved", + "comment.unresolved", + "comment.reaction-added", + "comment.reaction-removed", + "comment.mentioned" + ], + "x-speakeasy-enums": { + "budget.reached": "BudgetReached", + "domain.created": "DomainCreated", + "domain.dns.records.changed": "DomainDnsRecordsChanged", + "domain.transfer-in.started": "DomainTransferInStarted", + "domain.transfer-in.completed": "DomainTransferInCompleted", + "domain.transfer-in.failed": "DomainTransferInFailed", + "domain.certificate.add": "DomainCertificateAdd", + "domain.certificate.add.failed": "DomainCertificateAddFailed", + "domain.certificate.renew": "DomainCertificateRenew", + "domain.certificate.renew.failed": "DomainCertificateRenewFailed", + "domain.certificate.deleted": "DomainCertificateDeleted", + "domain.renewal": "DomainRenewal", + "domain.renewal.failed": "DomainRenewalFailed", + "domain.auto-renew.changed": "DomainAutoRenewChanged", + "deployment.created": "DeploymentCreated", + "deployment.cleanup": "DeploymentCleanup", + "deployment.error": "DeploymentError", + "deployment.canceled": "DeploymentCanceled", + "deployment.succeeded": "DeploymentSucceeded", + "deployment.ready": "DeploymentReady", + "deployment.check-rerequested": "DeploymentCheckRerequested", + "deployment.promoted": "DeploymentPromoted", + "deployment.integration.action.start": "DeploymentIntegrationActionStart", + "deployment.integration.action.cancel": "DeploymentIntegrationActionCancel", + "deployment.integration.action.cleanup": "DeploymentIntegrationActionCleanup", + "deployment.checkrun.start": "DeploymentCheckrunStart", + "deployment.checkrun.cancel": "DeploymentCheckrunCancel", + "edge-config.created": "EdgeConfigCreated", + "edge-config.deleted": "EdgeConfigDeleted", + "edge-config.items.updated": "EdgeConfigItemsUpdated", + "firewall.attack": "FirewallAttack", + "integration-configuration.permission-upgraded": "IntegrationConfigurationPermissionUpgraded", + "integration-configuration.removed": "IntegrationConfigurationRemoved", + "integration-configuration.scope-change-confirmed": "IntegrationConfigurationScopeChangeConfirmed", + "integration-resource.project-connected": "IntegrationResourceProjectConnected", + "integration-resource.project-disconnected": "IntegrationResourceProjectDisconnected", + "project.created": "ProjectCreated", + "project.removed": "ProjectRemoved", + "project.domain.created": "ProjectDomainCreated", + "project.domain.updated": "ProjectDomainUpdated", + "project.domain.deleted": "ProjectDomainDeleted", + "project.domain.verified": "ProjectDomainVerified", + "project.domain.unverified": "ProjectDomainUnverified", + "project.domain.moved": "ProjectDomainMoved", + "project.rolling-release.started": "ProjectRollingReleaseStarted", + "project.rolling-release.aborted": "ProjectRollingReleaseAborted", + "project.rolling-release.completed": "ProjectRollingReleaseCompleted", + "project.rolling-release.approved": "ProjectRollingReleaseApproved", + "deployment.checks.failed": "DeploymentChecksFailed", + "deployment.checks.succeeded": "DeploymentChecksSucceeded", + "deployment-checks-completed": "DeploymentChecksCompleted", + "deployment-ready": "DeploymentReadyHyphen", + "deployment-prepared": "DeploymentPreparedHyphen", + "deployment-error": "DeploymentErrorHyphen", + "deployment-check-rerequested": "DeploymentCheckRerequestedHyphen", + "deployment-canceled": "DeploymentCanceledHyphen", + "project-created": "ProjectCreatedHyphen", + "project-removed": "ProjectRemovedHyphen", + "domain-created": "DomainCreatedHyphen", + "deployment": "Deployment", + "integration-configuration-permission-updated": "IntegrationConfigurationPermissionUpdatedHyphen", + "integration-configuration-removed": "IntegrationConfigurationRemovedHyphen", + "integration-configuration-scope-change-confirmed": "IntegrationConfigurationScopeChangeConfirmedHyphen", + "marketplace.invoice.created": "MarketplaceInvoiceCreated", + "marketplace.invoice.paid": "MarketplaceInvoicePaid", + "marketplace.invoice.notpaid": "MarketplaceInvoiceNotpaid", + "marketplace.invoice.refunded": "MarketplaceInvoiceRefunded", + "observability.anomaly": "ObservabilityAnomaly", + "observability.anomaly-error": "ObservabilityAnomalyError", + "test-webhook": "TestWebhook" + } + } + }, + "projectIds": { + "minItems": 1, + "maxItems": 50, + "type": "array", + "items": { + "pattern": "^[a-zA-z0-9_]+$", + "type": "string" + } + } + } + } + } + }, + "required": true + } + }, + "get": { + "description": "Get a list of webhooks", + "operationId": "getWebhooks", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Get a list of webhooks", + "tags": [ + "webhooks" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "oneOf": [ + { + "items": { + "properties": { + "projectsMetadata": { + "nullable": true, + "items": { + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "framework": { + "nullable": true, + "type": "string", + "enum": [ + "actix-web", + "angular", + "ash", + "astro", + "axum", + "blitzjs", + "brunch", + "bun", + "container", + "create-react-app", + "django", + "docusaurus", + "docusaurus-2", + "dojo", + "eleventy", + "elysia", + "ember", + "eve", + "express", + "factory-eve", + "fastapi", + "fasthtml", + "fastify", + "flask", + "gatsby", + "go", + "gridsome", + "h3", + "hexo", + "hono", + "hugo", + "hydrogen", + "ionic-angular", + "ionic-react", + "jekyll", + "koa", + "mastra", + "middleman", + "nestjs", + "nextjs", + "nitro", + "node", + "nuxtjs", + "parcel", + "polymer", + "preact", + "python", + "react-router", + "redwoodjs", + "remix", + "ruby", + "rust", + "saber", + "sanity", + "sanity-v2", + "sapper", + "scully", + "services", + "solidstart", + "solidstart-1", + "stencil", + "storybook", + "svelte", + "sveltekit", + "sveltekit-1", + "tanstack-start", + "tanstack-start-lovable", + "umijs", + "vite", + "vitepress", + "vue", + "vuepress", + "xmcp", + "zola", + null + ] + }, + "latestDeployment": { + "type": "string" + } + }, + "required": [ + "id", + "name" + ], + "type": "object" + }, + "type": "array" + }, + "alertRuleIds": { + "items": { + "type": "string" + }, + "type": "array" + }, + "events": { + "items": { + "type": "string", + "enum": [ + "ai-gateway.auto-reload.limit-reached", + "ai-gateway.balance-depleted", + "alerts.triggered", + "botid.anomaly", + "budget.reached", + "comment.created", + "comment.deleted", + "comment.mentioned", + "comment.reaction-added", + "comment.reaction-removed", + "comment.resolved", + "comment.unresolved", + "comment.updated", + "deployment", + "deployment-canceled", + "deployment-check-rerequested", + "deployment-checks-completed", + "deployment-error", + "deployment-prepared", + "deployment-ready", + "deployment.blocked", + "deployment.build-requested", + "deployment.canceled", + "deployment.check-rerequested", + "deployment.checkrun.cancel", + "deployment.checkrun.start", + "deployment.checks.failed", + "deployment.checks.succeeded", + "deployment.cleanup", + "deployment.created", + "deployment.error", + "deployment.integration.action.cancel", + "deployment.integration.action.cleanup", + "deployment.integration.action.start", + "deployment.promoted", + "deployment.ready", + "deployment.rollback", + "deployment.succeeded", + "domain-created", + "domain.auto-renew.changed", + "domain.certificate.add", + "domain.certificate.add.failed", + "domain.certificate.deleted", + "domain.certificate.renew", + "domain.certificate.renew.failed", + "domain.created", + "domain.dns.records.changed", + "domain.renewal", + "domain.renewal.failed", + "domain.transfer-in.completed", + "domain.transfer-in.failed", + "domain.transfer-in.started", + "edge-config.created", + "edge-config.deleted", + "edge-config.items.updated", + "firewall.attack", + "firewall.custom-rule-anomaly", + "firewall.system-rule-anomaly", + "flag.created", + "flag.deleted", + "flag.segment.created", + "flag.segment.deleted", + "flag.segment.updated", + "flag.updated", + "function.archival-required", + "function.removal-required", + "integration-configuration-permission-updated", + "integration-configuration-removed", + "integration-configuration-scope-change-confirmed", + "integration-configuration.permission-upgraded", + "integration-configuration.removed", + "integration-configuration.scope-change-confirmed", + "integration-configuration.transferred", + "integration-resource.project-connected", + "integration-resource.project-disconnected", + "marketplace.invoice.created", + "marketplace.invoice.notpaid", + "marketplace.invoice.overdue", + "marketplace.invoice.paid", + "marketplace.invoice.refunded", + "marketplace.member.changed", + "message.created", + "message.deleted", + "message.mentioned", + "message.reaction-added", + "message.reaction-removed", + "message.updated", + "observability.anomaly", + "observability.anomaly-error", + "observability.error-anomaly", + "observability.usage-anomaly", + "project-created", + "project-removed", + "project.created", + "project.domain.created", + "project.domain.deleted", + "project.domain.moved", + "project.domain.unverified", + "project.domain.updated", + "project.domain.verified", + "project.env-variable.created", + "project.env-variable.deleted", + "project.env-variable.updated", + "project.removed", + "project.renamed", + "project.rolling-release.aborted", + "project.rolling-release.approved", + "project.rolling-release.completed", + "project.rolling-release.started", + "test-webhook", + "thread.resolved", + "thread.unresolved" + ], + "example": "deployment.created", + "description": "The webhooks events", + "x-speakeasy-enums": { + "budget.reached": "BudgetReached", + "domain.created": "DomainCreated", + "domain.dns.records.changed": "DomainDnsRecordsChanged", + "domain.transfer-in.started": "DomainTransferInStarted", + "domain.transfer-in.completed": "DomainTransferInCompleted", + "domain.transfer-in.failed": "DomainTransferInFailed", + "domain.certificate.add": "DomainCertificateAdd", + "domain.certificate.add.failed": "DomainCertificateAddFailed", + "domain.certificate.renew": "DomainCertificateRenew", + "domain.certificate.renew.failed": "DomainCertificateRenewFailed", + "domain.certificate.deleted": "DomainCertificateDeleted", + "domain.renewal": "DomainRenewal", + "domain.renewal.failed": "DomainRenewalFailed", + "domain.auto-renew.changed": "DomainAutoRenewChanged", + "deployment.created": "DeploymentCreated", + "deployment.cleanup": "DeploymentCleanup", + "deployment.error": "DeploymentError", + "deployment.canceled": "DeploymentCanceled", + "deployment.succeeded": "DeploymentSucceeded", + "deployment.ready": "DeploymentReady", + "deployment.check-rerequested": "DeploymentCheckRerequested", + "deployment.promoted": "DeploymentPromoted", + "deployment.integration.action.start": "DeploymentIntegrationActionStart", + "deployment.integration.action.cancel": "DeploymentIntegrationActionCancel", + "deployment.integration.action.cleanup": "DeploymentIntegrationActionCleanup", + "deployment.checkrun.start": "DeploymentCheckrunStart", + "deployment.checkrun.cancel": "DeploymentCheckrunCancel", + "edge-config.created": "EdgeConfigCreated", + "edge-config.deleted": "EdgeConfigDeleted", + "edge-config.items.updated": "EdgeConfigItemsUpdated", + "firewall.attack": "FirewallAttack", + "integration-configuration.permission-upgraded": "IntegrationConfigurationPermissionUpgraded", + "integration-configuration.removed": "IntegrationConfigurationRemoved", + "integration-configuration.scope-change-confirmed": "IntegrationConfigurationScopeChangeConfirmed", + "integration-resource.project-connected": "IntegrationResourceProjectConnected", + "integration-resource.project-disconnected": "IntegrationResourceProjectDisconnected", + "project.created": "ProjectCreated", + "project.removed": "ProjectRemoved", + "project.domain.created": "ProjectDomainCreated", + "project.domain.updated": "ProjectDomainUpdated", + "project.domain.deleted": "ProjectDomainDeleted", + "project.domain.verified": "ProjectDomainVerified", + "project.domain.unverified": "ProjectDomainUnverified", + "project.domain.moved": "ProjectDomainMoved", + "project.rolling-release.started": "ProjectRollingReleaseStarted", + "project.rolling-release.aborted": "ProjectRollingReleaseAborted", + "project.rolling-release.completed": "ProjectRollingReleaseCompleted", + "project.rolling-release.approved": "ProjectRollingReleaseApproved", + "deployment.checks.failed": "DeploymentChecksFailed", + "deployment.checks.succeeded": "DeploymentChecksSucceeded", + "deployment-checks-completed": "DeploymentChecksCompleted", + "deployment-ready": "DeploymentReadyHyphen", + "deployment-prepared": "DeploymentPreparedHyphen", + "deployment-error": "DeploymentErrorHyphen", + "deployment-check-rerequested": "DeploymentCheckRerequestedHyphen", + "deployment-canceled": "DeploymentCanceledHyphen", + "project-created": "ProjectCreatedHyphen", + "project-removed": "ProjectRemovedHyphen", + "domain-created": "DomainCreatedHyphen", + "deployment": "Deployment", + "integration-configuration-permission-updated": "IntegrationConfigurationPermissionUpdatedHyphen", + "integration-configuration-removed": "IntegrationConfigurationRemovedHyphen", + "integration-configuration-scope-change-confirmed": "IntegrationConfigurationScopeChangeConfirmedHyphen", + "marketplace.invoice.created": "MarketplaceInvoiceCreated", + "marketplace.invoice.paid": "MarketplaceInvoicePaid", + "marketplace.invoice.notpaid": "MarketplaceInvoiceNotpaid", + "marketplace.invoice.refunded": "MarketplaceInvoiceRefunded", + "observability.anomaly": "ObservabilityAnomaly", + "observability.anomaly-error": "ObservabilityAnomalyError", + "test-webhook": "TestWebhook" + } + }, + "type": "array", + "description": "The webhooks events", + "example": "deployment.created" + }, + "id": { + "type": "string", + "description": "The webhook id", + "example": "account_hook_GflD6EYyo7F4ViYS" + }, + "url": { + "type": "string", + "description": "A string with the URL of the webhook", + "example": "https://my-webhook.com" + }, + "ownerId": { + "type": "string", + "description": "The unique ID of the team the webhook belongs to", + "example": "ZspSRT4ljIEEmMHgoDwKWDei" + }, + "createdAt": { + "type": "number", + "description": "A number containing the date when the webhook was created in in milliseconds", + "example": 1567024758130 + }, + "updatedAt": { + "type": "number", + "description": "A number containing the date when the webhook was updated in in milliseconds", + "example": 1567024758130 + }, + "projectIds": { + "items": { + "type": "string" + }, + "type": "array", + "description": "The ID of the projects the webhook is associated with", + "example": [ + "prj_12HKQaOmR5t5Uy6vdcQsNIiZgHGB" + ] + } + }, + "required": [ + "createdAt", + "events", + "id", + "ownerId", + "projectsMetadata", + "updatedAt", + "url" + ], + "type": "object" + }, + "type": "array" + }, + { + "items": { + "properties": { + "alertRuleIds": { + "items": { + "type": "string" + }, + "type": "array" + }, + "events": { + "items": { + "type": "string", + "enum": [ + "ai-gateway.auto-reload.limit-reached", + "ai-gateway.balance-depleted", + "alerts.triggered", + "botid.anomaly", + "budget.reached", + "comment.created", + "comment.deleted", + "comment.mentioned", + "comment.reaction-added", + "comment.reaction-removed", + "comment.resolved", + "comment.unresolved", + "comment.updated", + "deployment", + "deployment-canceled", + "deployment-check-rerequested", + "deployment-checks-completed", + "deployment-error", + "deployment-prepared", + "deployment-ready", + "deployment.blocked", + "deployment.build-requested", + "deployment.canceled", + "deployment.check-rerequested", + "deployment.checkrun.cancel", + "deployment.checkrun.start", + "deployment.checks.failed", + "deployment.checks.succeeded", + "deployment.cleanup", + "deployment.created", + "deployment.error", + "deployment.integration.action.cancel", + "deployment.integration.action.cleanup", + "deployment.integration.action.start", + "deployment.promoted", + "deployment.ready", + "deployment.rollback", + "deployment.succeeded", + "domain-created", + "domain.auto-renew.changed", + "domain.certificate.add", + "domain.certificate.add.failed", + "domain.certificate.deleted", + "domain.certificate.renew", + "domain.certificate.renew.failed", + "domain.created", + "domain.dns.records.changed", + "domain.renewal", + "domain.renewal.failed", + "domain.transfer-in.completed", + "domain.transfer-in.failed", + "domain.transfer-in.started", + "edge-config.created", + "edge-config.deleted", + "edge-config.items.updated", + "firewall.attack", + "firewall.custom-rule-anomaly", + "firewall.system-rule-anomaly", + "flag.created", + "flag.deleted", + "flag.segment.created", + "flag.segment.deleted", + "flag.segment.updated", + "flag.updated", + "function.archival-required", + "function.removal-required", + "integration-configuration-permission-updated", + "integration-configuration-removed", + "integration-configuration-scope-change-confirmed", + "integration-configuration.permission-upgraded", + "integration-configuration.removed", + "integration-configuration.scope-change-confirmed", + "integration-configuration.transferred", + "integration-resource.project-connected", + "integration-resource.project-disconnected", + "marketplace.invoice.created", + "marketplace.invoice.notpaid", + "marketplace.invoice.overdue", + "marketplace.invoice.paid", + "marketplace.invoice.refunded", + "marketplace.member.changed", + "message.created", + "message.deleted", + "message.mentioned", + "message.reaction-added", + "message.reaction-removed", + "message.updated", + "observability.anomaly", + "observability.anomaly-error", + "observability.error-anomaly", + "observability.usage-anomaly", + "project-created", + "project-removed", + "project.created", + "project.domain.created", + "project.domain.deleted", + "project.domain.moved", + "project.domain.unverified", + "project.domain.updated", + "project.domain.verified", + "project.env-variable.created", + "project.env-variable.deleted", + "project.env-variable.updated", + "project.removed", + "project.renamed", + "project.rolling-release.aborted", + "project.rolling-release.approved", + "project.rolling-release.completed", + "project.rolling-release.started", + "test-webhook", + "thread.resolved", + "thread.unresolved" + ], + "example": "deployment.created", + "description": "The webhooks events", + "x-speakeasy-enums": { + "budget.reached": "BudgetReached", + "domain.created": "DomainCreated", + "domain.dns.records.changed": "DomainDnsRecordsChanged", + "domain.transfer-in.started": "DomainTransferInStarted", + "domain.transfer-in.completed": "DomainTransferInCompleted", + "domain.transfer-in.failed": "DomainTransferInFailed", + "domain.certificate.add": "DomainCertificateAdd", + "domain.certificate.add.failed": "DomainCertificateAddFailed", + "domain.certificate.renew": "DomainCertificateRenew", + "domain.certificate.renew.failed": "DomainCertificateRenewFailed", + "domain.certificate.deleted": "DomainCertificateDeleted", + "domain.renewal": "DomainRenewal", + "domain.renewal.failed": "DomainRenewalFailed", + "domain.auto-renew.changed": "DomainAutoRenewChanged", + "deployment.created": "DeploymentCreated", + "deployment.cleanup": "DeploymentCleanup", + "deployment.error": "DeploymentError", + "deployment.canceled": "DeploymentCanceled", + "deployment.succeeded": "DeploymentSucceeded", + "deployment.ready": "DeploymentReady", + "deployment.check-rerequested": "DeploymentCheckRerequested", + "deployment.promoted": "DeploymentPromoted", + "deployment.integration.action.start": "DeploymentIntegrationActionStart", + "deployment.integration.action.cancel": "DeploymentIntegrationActionCancel", + "deployment.integration.action.cleanup": "DeploymentIntegrationActionCleanup", + "deployment.checkrun.start": "DeploymentCheckrunStart", + "deployment.checkrun.cancel": "DeploymentCheckrunCancel", + "edge-config.created": "EdgeConfigCreated", + "edge-config.deleted": "EdgeConfigDeleted", + "edge-config.items.updated": "EdgeConfigItemsUpdated", + "firewall.attack": "FirewallAttack", + "integration-configuration.permission-upgraded": "IntegrationConfigurationPermissionUpgraded", + "integration-configuration.removed": "IntegrationConfigurationRemoved", + "integration-configuration.scope-change-confirmed": "IntegrationConfigurationScopeChangeConfirmed", + "integration-resource.project-connected": "IntegrationResourceProjectConnected", + "integration-resource.project-disconnected": "IntegrationResourceProjectDisconnected", + "project.created": "ProjectCreated", + "project.removed": "ProjectRemoved", + "project.domain.created": "ProjectDomainCreated", + "project.domain.updated": "ProjectDomainUpdated", + "project.domain.deleted": "ProjectDomainDeleted", + "project.domain.verified": "ProjectDomainVerified", + "project.domain.unverified": "ProjectDomainUnverified", + "project.domain.moved": "ProjectDomainMoved", + "project.rolling-release.started": "ProjectRollingReleaseStarted", + "project.rolling-release.aborted": "ProjectRollingReleaseAborted", + "project.rolling-release.completed": "ProjectRollingReleaseCompleted", + "project.rolling-release.approved": "ProjectRollingReleaseApproved", + "deployment.checks.failed": "DeploymentChecksFailed", + "deployment.checks.succeeded": "DeploymentChecksSucceeded", + "deployment-checks-completed": "DeploymentChecksCompleted", + "deployment-ready": "DeploymentReadyHyphen", + "deployment-prepared": "DeploymentPreparedHyphen", + "deployment-error": "DeploymentErrorHyphen", + "deployment-check-rerequested": "DeploymentCheckRerequestedHyphen", + "deployment-canceled": "DeploymentCanceledHyphen", + "project-created": "ProjectCreatedHyphen", + "project-removed": "ProjectRemovedHyphen", + "domain-created": "DomainCreatedHyphen", + "deployment": "Deployment", + "integration-configuration-permission-updated": "IntegrationConfigurationPermissionUpdatedHyphen", + "integration-configuration-removed": "IntegrationConfigurationRemovedHyphen", + "integration-configuration-scope-change-confirmed": "IntegrationConfigurationScopeChangeConfirmedHyphen", + "marketplace.invoice.created": "MarketplaceInvoiceCreated", + "marketplace.invoice.paid": "MarketplaceInvoicePaid", + "marketplace.invoice.notpaid": "MarketplaceInvoiceNotpaid", + "marketplace.invoice.refunded": "MarketplaceInvoiceRefunded", + "observability.anomaly": "ObservabilityAnomaly", + "observability.anomaly-error": "ObservabilityAnomalyError", + "test-webhook": "TestWebhook" + } + }, + "type": "array", + "description": "The webhooks events", + "example": "deployment.created" + }, + "id": { + "type": "string", + "description": "The webhook id", + "example": "account_hook_GflD6EYyo7F4ViYS" + }, + "url": { + "type": "string", + "description": "A string with the URL of the webhook", + "example": "https://my-webhook.com" + }, + "ownerId": { + "type": "string", + "description": "The unique ID of the team the webhook belongs to", + "example": "ZspSRT4ljIEEmMHgoDwKWDei" + }, + "createdAt": { + "type": "number", + "description": "A number containing the date when the webhook was created in in milliseconds", + "example": 1567024758130 + }, + "updatedAt": { + "type": "number", + "description": "A number containing the date when the webhook was updated in in milliseconds", + "example": 1567024758130 + }, + "projectIds": { + "items": { + "type": "string" + }, + "type": "array", + "description": "The ID of the projects the webhook is associated with", + "example": [ + "prj_12HKQaOmR5t5Uy6vdcQsNIiZgHGB" + ] + } + }, + "required": [ + "createdAt", + "events", + "id", + "ownerId", + "updatedAt", + "url" + ], + "type": "object" + }, + "type": "array" + } + ] + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "projectId", + "in": "query", + "schema": { + "pattern": "^[a-zA-z0-9_]+$", + "type": "string" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + } + }, + "/v1/webhooks/{id}": { + "get": { + "description": "Get a webhook", + "operationId": "getWebhook", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Get a webhook", + "tags": [ + "webhooks" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "alertRuleIds": { + "items": { + "type": "string" + }, + "type": "array" + }, + "events": { + "items": { + "type": "string", + "enum": [ + "ai-gateway.auto-reload.limit-reached", + "ai-gateway.balance-depleted", + "alerts.triggered", + "botid.anomaly", + "budget.reached", + "comment.created", + "comment.deleted", + "comment.mentioned", + "comment.reaction-added", + "comment.reaction-removed", + "comment.resolved", + "comment.unresolved", + "comment.updated", + "deployment", + "deployment-canceled", + "deployment-check-rerequested", + "deployment-checks-completed", + "deployment-error", + "deployment-prepared", + "deployment-ready", + "deployment.blocked", + "deployment.build-requested", + "deployment.canceled", + "deployment.check-rerequested", + "deployment.checkrun.cancel", + "deployment.checkrun.start", + "deployment.checks.failed", + "deployment.checks.succeeded", + "deployment.cleanup", + "deployment.created", + "deployment.error", + "deployment.integration.action.cancel", + "deployment.integration.action.cleanup", + "deployment.integration.action.start", + "deployment.promoted", + "deployment.ready", + "deployment.rollback", + "deployment.succeeded", + "domain-created", + "domain.auto-renew.changed", + "domain.certificate.add", + "domain.certificate.add.failed", + "domain.certificate.deleted", + "domain.certificate.renew", + "domain.certificate.renew.failed", + "domain.created", + "domain.dns.records.changed", + "domain.renewal", + "domain.renewal.failed", + "domain.transfer-in.completed", + "domain.transfer-in.failed", + "domain.transfer-in.started", + "edge-config.created", + "edge-config.deleted", + "edge-config.items.updated", + "firewall.attack", + "firewall.custom-rule-anomaly", + "firewall.system-rule-anomaly", + "flag.created", + "flag.deleted", + "flag.segment.created", + "flag.segment.deleted", + "flag.segment.updated", + "flag.updated", + "function.archival-required", + "function.removal-required", + "integration-configuration-permission-updated", + "integration-configuration-removed", + "integration-configuration-scope-change-confirmed", + "integration-configuration.permission-upgraded", + "integration-configuration.removed", + "integration-configuration.scope-change-confirmed", + "integration-configuration.transferred", + "integration-resource.project-connected", + "integration-resource.project-disconnected", + "marketplace.invoice.created", + "marketplace.invoice.notpaid", + "marketplace.invoice.overdue", + "marketplace.invoice.paid", + "marketplace.invoice.refunded", + "marketplace.member.changed", + "message.created", + "message.deleted", + "message.mentioned", + "message.reaction-added", + "message.reaction-removed", + "message.updated", + "observability.anomaly", + "observability.anomaly-error", + "observability.error-anomaly", + "observability.usage-anomaly", + "project-created", + "project-removed", + "project.created", + "project.domain.created", + "project.domain.deleted", + "project.domain.moved", + "project.domain.unverified", + "project.domain.updated", + "project.domain.verified", + "project.env-variable.created", + "project.env-variable.deleted", + "project.env-variable.updated", + "project.removed", + "project.renamed", + "project.rolling-release.aborted", + "project.rolling-release.approved", + "project.rolling-release.completed", + "project.rolling-release.started", + "test-webhook", + "thread.resolved", + "thread.unresolved" + ], + "example": "deployment.created", + "description": "The webhooks events", + "x-speakeasy-enums": { + "budget.reached": "BudgetReached", + "domain.created": "DomainCreated", + "domain.dns.records.changed": "DomainDnsRecordsChanged", + "domain.transfer-in.started": "DomainTransferInStarted", + "domain.transfer-in.completed": "DomainTransferInCompleted", + "domain.transfer-in.failed": "DomainTransferInFailed", + "domain.certificate.add": "DomainCertificateAdd", + "domain.certificate.add.failed": "DomainCertificateAddFailed", + "domain.certificate.renew": "DomainCertificateRenew", + "domain.certificate.renew.failed": "DomainCertificateRenewFailed", + "domain.certificate.deleted": "DomainCertificateDeleted", + "domain.renewal": "DomainRenewal", + "domain.renewal.failed": "DomainRenewalFailed", + "domain.auto-renew.changed": "DomainAutoRenewChanged", + "deployment.created": "DeploymentCreated", + "deployment.cleanup": "DeploymentCleanup", + "deployment.error": "DeploymentError", + "deployment.canceled": "DeploymentCanceled", + "deployment.succeeded": "DeploymentSucceeded", + "deployment.ready": "DeploymentReady", + "deployment.check-rerequested": "DeploymentCheckRerequested", + "deployment.promoted": "DeploymentPromoted", + "deployment.integration.action.start": "DeploymentIntegrationActionStart", + "deployment.integration.action.cancel": "DeploymentIntegrationActionCancel", + "deployment.integration.action.cleanup": "DeploymentIntegrationActionCleanup", + "deployment.checkrun.start": "DeploymentCheckrunStart", + "deployment.checkrun.cancel": "DeploymentCheckrunCancel", + "edge-config.created": "EdgeConfigCreated", + "edge-config.deleted": "EdgeConfigDeleted", + "edge-config.items.updated": "EdgeConfigItemsUpdated", + "firewall.attack": "FirewallAttack", + "integration-configuration.permission-upgraded": "IntegrationConfigurationPermissionUpgraded", + "integration-configuration.removed": "IntegrationConfigurationRemoved", + "integration-configuration.scope-change-confirmed": "IntegrationConfigurationScopeChangeConfirmed", + "integration-resource.project-connected": "IntegrationResourceProjectConnected", + "integration-resource.project-disconnected": "IntegrationResourceProjectDisconnected", + "project.created": "ProjectCreated", + "project.removed": "ProjectRemoved", + "project.domain.created": "ProjectDomainCreated", + "project.domain.updated": "ProjectDomainUpdated", + "project.domain.deleted": "ProjectDomainDeleted", + "project.domain.verified": "ProjectDomainVerified", + "project.domain.unverified": "ProjectDomainUnverified", + "project.domain.moved": "ProjectDomainMoved", + "project.rolling-release.started": "ProjectRollingReleaseStarted", + "project.rolling-release.aborted": "ProjectRollingReleaseAborted", + "project.rolling-release.completed": "ProjectRollingReleaseCompleted", + "project.rolling-release.approved": "ProjectRollingReleaseApproved", + "deployment.checks.failed": "DeploymentChecksFailed", + "deployment.checks.succeeded": "DeploymentChecksSucceeded", + "deployment-checks-completed": "DeploymentChecksCompleted", + "deployment-ready": "DeploymentReadyHyphen", + "deployment-prepared": "DeploymentPreparedHyphen", + "deployment-error": "DeploymentErrorHyphen", + "deployment-check-rerequested": "DeploymentCheckRerequestedHyphen", + "deployment-canceled": "DeploymentCanceledHyphen", + "project-created": "ProjectCreatedHyphen", + "project-removed": "ProjectRemovedHyphen", + "domain-created": "DomainCreatedHyphen", + "deployment": "Deployment", + "integration-configuration-permission-updated": "IntegrationConfigurationPermissionUpdatedHyphen", + "integration-configuration-removed": "IntegrationConfigurationRemovedHyphen", + "integration-configuration-scope-change-confirmed": "IntegrationConfigurationScopeChangeConfirmedHyphen", + "marketplace.invoice.created": "MarketplaceInvoiceCreated", + "marketplace.invoice.paid": "MarketplaceInvoicePaid", + "marketplace.invoice.notpaid": "MarketplaceInvoiceNotpaid", + "marketplace.invoice.refunded": "MarketplaceInvoiceRefunded", + "observability.anomaly": "ObservabilityAnomaly", + "observability.anomaly-error": "ObservabilityAnomalyError", + "test-webhook": "TestWebhook" + } + }, + "type": "array", + "description": "The webhooks events", + "example": "deployment.created" + }, + "id": { + "type": "string", + "description": "The webhook id", + "example": "account_hook_GflD6EYyo7F4ViYS" + }, + "url": { + "type": "string", + "description": "A string with the URL of the webhook", + "example": "https://my-webhook.com" + }, + "ownerId": { + "type": "string", + "description": "The unique ID of the team the webhook belongs to", + "example": "ZspSRT4ljIEEmMHgoDwKWDei" + }, + "createdAt": { + "type": "number", + "description": "A number containing the date when the webhook was created in in milliseconds", + "example": 1567024758130 + }, + "updatedAt": { + "type": "number", + "description": "A number containing the date when the webhook was updated in in milliseconds", + "example": 1567024758130 + }, + "projectIds": { + "items": { + "type": "string" + }, + "type": "array", + "description": "The ID of the projects the webhook is associated with", + "example": [ + "prj_12HKQaOmR5t5Uy6vdcQsNIiZgHGB" + ] + } + }, + "required": [ + "createdAt", + "events", + "id", + "ownerId", + "updatedAt", + "url" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + }, + "delete": { + "description": "Deletes a webhook", + "operationId": "deleteWebhook", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Deletes a webhook", + "tags": [ + "webhooks" + ], + "responses": { + "204": { + "description": "" + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + } + }, + "/v2/deployments/{id}/aliases": { + "get": { + "description": "Retrieves all Aliases for the Deployment with the given ID. The authenticated user or team must own the deployment.", + "operationId": "listDeploymentAliases", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "List Deployment Aliases", + "tags": [ + "aliases" + ], + "responses": { + "200": { + "description": "The list of aliases assigned to the deployment", + "content": { + "application/json": { + "schema": { + "properties": { + "aliases": { + "items": { + "properties": { + "uid": { + "type": "string", + "description": "The unique identifier of the alias", + "example": "2WjyKQmM8ZnGcJsPWMrHRHrE" + }, + "alias": { + "type": "string", + "description": "The alias name, it could be a `.vercel.app` subdomain or a custom domain", + "example": "my-alias.vercel.app" + }, + "created": { + "type": "string", + "format": "date-time", + "description": "The date when the alias was created", + "example": "2017-04-26T23:00:34.232Z" + }, + "redirect": { + "nullable": true, + "type": "string", + "description": "Target destination domain for redirect when the alias is a redirect" + }, + "protectionBypass": { + "additionalProperties": { + "oneOf": [ + { + "properties": { + "createdAt": { + "type": "number" + }, + "createdBy": { + "type": "string" + }, + "scope": { + "type": "string", + "enum": [ + "shareable-link" + ] + }, + "expires": { + "type": "number" + } + }, + "required": [ + "createdAt", + "createdBy", + "scope" + ], + "type": "object", + "description": "The protection bypass for the alias" + }, + { + "properties": { + "createdAt": { + "type": "number" + }, + "lastUpdatedAt": { + "type": "number" + }, + "lastUpdatedBy": { + "type": "string" + }, + "access": { + "type": "string", + "enum": [ + "granted", + "requested" + ] + }, + "scope": { + "type": "string", + "enum": [ + "user" + ] + } + }, + "required": [ + "access", + "createdAt", + "lastUpdatedAt", + "lastUpdatedBy", + "scope" + ], + "type": "object", + "description": "The protection bypass for the alias" + }, + { + "properties": { + "createdAt": { + "type": "number" + }, + "createdBy": { + "type": "string" + }, + "scope": { + "type": "string", + "enum": [ + "alias-protection-override" + ] + } + }, + "required": [ + "createdAt", + "createdBy", + "scope" + ], + "type": "object", + "description": "The protection bypass for the alias" + }, + { + "properties": { + "createdAt": { + "type": "number" + }, + "lastUpdatedAt": { + "type": "number" + }, + "lastUpdatedBy": { + "type": "string" + }, + "scope": { + "type": "string", + "enum": [ + "email_invite" + ] + } + }, + "required": [ + "createdAt", + "lastUpdatedAt", + "lastUpdatedBy", + "scope" + ], + "type": "object", + "description": "The protection bypass for the alias" + } + ] + }, + "type": "object", + "description": "The protection bypass for the alias" + } + }, + "required": [ + "alias", + "created", + "uid" + ], + "type": "object", + "description": "A list of the aliases assigned to the deployment" + }, + "type": "array", + "description": "A list of the aliases assigned to the deployment" + } + }, + "required": [ + "aliases" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "The deployment was not found" + }, + "410": { + "description": "" + } + }, + "x-vercel-cli": { + "supportedSubcommands": true, + "supportedProduction": false, + "aliases": [ + "for-deployment" + ] + }, + "parameters": [ + { + "name": "id", + "description": "The ID of the deployment the aliases should be listed for", + "in": "path", + "required": true, + "schema": { + "example": "dpl_FjvFJncQHQcZMznrUm9EoB8sFuPa", + "description": "The ID of the deployment the aliases should be listed for", + "type": "string" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + }, + "post": { + "description": "Creates a new alias for the deployment resolved from the given deployment or alias ID or URL. The authenticated user or team must own this deployment. If the desired alias is already assigned to another deployment, then it will be removed from the old deployment and assigned to the new one.", + "operationId": "assignAlias", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Assign an Alias", + "tags": [ + "aliases" + ], + "responses": { + "200": { + "description": "The alias was successfully assigned to the deployment", + "content": { + "application/json": { + "schema": { + "properties": { + "uid": { + "type": "string", + "description": "The unique identifier of the alias", + "example": "2WjyKQmM8ZnGcJsPWMrHRHrE" + }, + "alias": { + "type": "string", + "description": "The assigned alias name", + "example": "my-alias.vercel.app" + }, + "created": { + "type": "string", + "format": "date-time", + "description": "The date when the alias was created", + "example": "2017-04-26T23:00:34.232Z" + }, + "oldDeploymentId": { + "nullable": true, + "type": "string", + "description": "The unique identifier of the previously aliased deployment, only received when the alias was used before", + "example": "dpl_FjvFJncQHQcZMznrUm9EoB8sFuPa" + } + }, + "required": [ + "alias", + "created", + "uid" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid.\nOne of the provided values in the request query is invalid.\nThe cert for the provided alias is not ready\nThe deployment is not READY and can not be aliased\nThe supplied alias is invalid" + }, + "401": { + "description": "The request is not authorized." + }, + "402": { + "description": "The account is missing a payment so payment method must be updated" + }, + "403": { + "description": "You do not have permission to access this resource.\nIf no .vercel.app alias exists then we fail (nothing to mirror)" + }, + "404": { + "description": "The domain used for the alias was not found\nThe deployment was not found" + }, + "409": { + "description": "The provided alias is already assigned to the given deployment\nThe domain is not allowed to be used" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "id", + "description": "The deployment or alias ID or URL to assign from", + "in": "path", + "required": true, + "schema": { + "description": "The deployment or alias ID or URL to assign from", + "example": "dpl_FjvFJncQHQcZMznrUm9EoB8sFuPa", + "oneOf": [ + { + "type": "string" + } + ] + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "properties": { + "alias": { + "description": "The alias we want to assign to the deployment defined in the URL", + "example": "my-alias.vercel.app", + "type": "string" + }, + "redirect": { + "description": "The redirect property will take precedence over the deployment id from the URL and consists of a hostname (like test.com) to which the alias should redirect using status code 307", + "example": null, + "type": "string", + "nullable": true + } + }, + "type": "object" + } + } + }, + "required": true + } + } + }, + "/v4/aliases": { + "get": { + "description": "Retrieves a list of aliases for the authenticated User or Team. When `domain` is provided, only aliases for that domain will be returned. When `projectId` is provided, it will only return the given project aliases.", + "operationId": "listAliases", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "List aliases", + "tags": [ + "aliases" + ], + "responses": { + "200": { + "description": "The paginated list of aliases", + "content": { + "application/json": { + "schema": { + "properties": { + "aliases": { + "items": { + "properties": { + "alias": { + "type": "string", + "description": "The alias name, it could be a `.vercel.app` subdomain or a custom domain", + "example": "my-alias.vercel.app" + }, + "created": { + "type": "string", + "format": "date-time", + "description": "The date when the alias was created", + "example": "2017-04-26T23:00:34.232Z" + }, + "createdAt": { + "type": "number", + "description": "The date when the alias was created in milliseconds since the UNIX epoch", + "example": 1540095775941 + }, + "creator": { + "properties": { + "uid": { + "type": "string", + "description": "ID of the user who created the alias", + "example": "96SnxkFiMyVKsK3pnoHfx3Hz" + }, + "email": { + "type": "string", + "description": "Email of the user who created the alias", + "example": "john-doe@gmail.com" + }, + "username": { + "type": "string", + "description": "Username of the user who created the alias", + "example": "john-doe" + } + }, + "required": [ + "uid" + ], + "type": "object", + "description": "Information of the user who created the alias" + }, + "deletedAt": { + "type": "number", + "description": "The date when the alias was deleted in milliseconds since the UNIX epoch", + "example": 1540095775941, + "nullable": true + }, + "deployment": { + "properties": { + "id": { + "type": "string", + "description": "The deployment unique identifier", + "example": "dpl_5m8CQaRBm3FnWRW1od3wKTpaECPx" + }, + "url": { + "type": "string", + "description": "The deployment unique URL", + "example": "my-instant-deployment-3ij3cxz9qr.now.sh" + }, + "meta": { + "type": "string", + "description": "The deployment metadata", + "example": {} + } + }, + "required": [ + "id" + ], + "type": "object", + "description": "A map with the deployment ID, URL and metadata" + }, + "deploymentId": { + "nullable": true, + "type": "string", + "description": "The deployment ID", + "example": "dpl_5m8CQaRBm3FnWRW1od3wKTpaECPx" + }, + "projectId": { + "nullable": true, + "type": "string", + "description": "The unique identifier of the project", + "example": "prj_12HKQaOmR5t5Uy6vdcQsNIiZgHGB" + }, + "redirect": { + "nullable": true, + "type": "string", + "description": "Target destination domain for redirect when the alias is a redirect" + }, + "redirectStatusCode": { + "nullable": true, + "type": "number", + "enum": [ + 301, + 302, + 307, + 308, + null + ], + "description": "Status code to be used on redirect" + }, + "uid": { + "type": "string", + "description": "The unique identifier of the alias" + }, + "updatedAt": { + "type": "number", + "description": "The date when the alias was updated in milliseconds since the UNIX epoch", + "example": 1540095775941 + }, + "protectionBypass": { + "additionalProperties": { + "oneOf": [ + { + "properties": { + "createdAt": { + "type": "number" + }, + "createdBy": { + "type": "string" + }, + "scope": { + "type": "string", + "enum": [ + "shareable-link" + ] + }, + "expires": { + "type": "number" + } + }, + "required": [ + "createdAt", + "createdBy", + "scope" + ], + "type": "object", + "description": "The protection bypass for the alias" + }, + { + "properties": { + "createdAt": { + "type": "number" + }, + "lastUpdatedAt": { + "type": "number" + }, + "lastUpdatedBy": { + "type": "string" + }, + "access": { + "type": "string", + "enum": [ + "granted", + "requested" + ] + }, + "scope": { + "type": "string", + "enum": [ + "user" + ] + } + }, + "required": [ + "access", + "createdAt", + "lastUpdatedAt", + "lastUpdatedBy", + "scope" + ], + "type": "object", + "description": "The protection bypass for the alias" + }, + { + "properties": { + "createdAt": { + "type": "number" + }, + "createdBy": { + "type": "string" + }, + "scope": { + "type": "string", + "enum": [ + "alias-protection-override" + ] + } + }, + "required": [ + "createdAt", + "createdBy", + "scope" + ], + "type": "object", + "description": "The protection bypass for the alias" + }, + { + "properties": { + "createdAt": { + "type": "number" + }, + "lastUpdatedAt": { + "type": "number" + }, + "lastUpdatedBy": { + "type": "string" + }, + "scope": { + "type": "string", + "enum": [ + "email_invite" + ] + } + }, + "required": [ + "createdAt", + "lastUpdatedAt", + "lastUpdatedBy", + "scope" + ], + "type": "object", + "description": "The protection bypass for the alias" + } + ] + }, + "type": "object", + "description": "The protection bypass for the alias" + }, + "microfrontends": { + "properties": { + "defaultApp": { + "properties": { + "projectId": { + "type": "string" + } + }, + "required": [ + "projectId" + ], + "type": "object" + }, + "applications": { + "oneOf": [ + { + "items": { + "properties": { + "fallbackHost": { + "type": "string", + "description": "This is always set. In production it is used as a pointer to each apps production deployment. For pre-production, it's used as the fallback if there is no deployment for the branch." + }, + "projectId": { + "type": "string", + "description": "The project ID of the microfrontends application." + } + }, + "required": [ + "fallbackHost", + "projectId" + ], + "type": "object", + "description": "A list of the deployment routing information for each project." + }, + "type": "array", + "description": "A list of the deployment routing information for each project." + }, + { + "items": { + "properties": { + "fallbackHost": { + "type": "string", + "description": "This is always set. For branch aliases, it's used as the fallback if there is no deployment for the branch." + }, + "branchAlias": { + "type": "string", + "description": "Could point to a branch without a deployment if the project was never deployed. The proxy will fallback to the fallbackHost if there is no deployment." + }, + "projectId": { + "type": "string", + "description": "The project ID of the microfrontends application." + } + }, + "required": [ + "branchAlias", + "fallbackHost", + "projectId" + ], + "type": "object", + "description": "A list of the deployment routing information for each project." + }, + "type": "array", + "description": "A list of the deployment routing information for each project." + }, + { + "items": { + "properties": { + "deploymentId": { + "type": "string", + "description": "This is the deployment for the same commit, it could be a cancelled deployment. The proxy will fallback to the branchDeploymentId and then the fallbackDeploymentId." + }, + "branchDeploymentId": { + "type": "string", + "description": "This is the latest non-cancelled deployment of the branch alias at the time the commit alias was created. It is possible there is no deployment for the branch, or this was set before the deployment was canceled, in which case this will point to a cancelled deployment, in either case the proxy will fallback to the fallbackDeploymentId." + }, + "fallbackDeploymentId": { + "type": "string", + "description": "This is the deployment of the fallback host at the time the commit alias was created. It is possible for this to be a deleted deployment, in which case the proxy will show that the deployment is deleted. It will not use the fallbackHost, as a future deployment on the fallback host could be invalid for this deployment, and it could lead to confusion / incorrect behavior for the commit alias." + }, + "fallbackHost": { + "type": "string", + "description": "Temporary for backwards compatibility. Can remove when metadata change is released" + }, + "branchAlias": { + "type": "string" + }, + "projectId": { + "type": "string", + "description": "The project ID of the microfrontends application." + } + }, + "required": [ + "projectId" + ], + "type": "object", + "description": "A list of the deployment routing information for each project." + }, + "type": "array", + "description": "A list of the deployment routing information for each project." + } + ] + } + }, + "required": [ + "applications", + "defaultApp" + ], + "type": "object", + "description": "The microfrontends for the alias including the routing configuration" + } + }, + "required": [ + "alias", + "created", + "deploymentId", + "projectId", + "uid" + ], + "type": "object" + }, + "type": "array" + }, + "pagination": { + "$ref": "#/components/schemas/Pagination" + } + }, + "required": [ + "aliases", + "pagination" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + } + }, + "x-vercel-cli": { + "supportedSubcommands": true, + "supportedProduction": false, + "aliases": [ + "list" + ] + }, + "parameters": [ + { + "name": "domain", + "description": "Get only aliases of the given domain name", + "in": "query", + "schema": { + "description": "Get only aliases of the given domain name", + "example": "my-test-domain.com", + "maxItems": 20, + "oneOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "string" + } + ] + } + }, + { + "name": "from", + "description": "Get only aliases created after the provided timestamp", + "in": "query", + "schema": { + "deprecated": true, + "description": "Get only aliases created after the provided timestamp", + "example": 1540095775951, + "type": "number" + } + }, + { + "name": "limit", + "description": "Maximum number of aliases to list from a request", + "in": "query", + "schema": { + "description": "Maximum number of aliases to list from a request", + "example": 10, + "type": "number" + } + }, + { + "name": "projectId", + "description": "Filter aliases from the given `projectId`", + "in": "query", + "schema": { + "description": "Filter aliases from the given `projectId`", + "example": "prj_12HKQaOmR5t5Uy6vdcQsNIiZgHGB", + "type": "string" + } + }, + { + "name": "since", + "description": "Get aliases created after this JavaScript timestamp", + "in": "query", + "schema": { + "description": "Get aliases created after this JavaScript timestamp", + "example": 1540095775941, + "type": "number" + } + }, + { + "name": "until", + "description": "Get aliases created before this JavaScript timestamp", + "in": "query", + "schema": { + "description": "Get aliases created before this JavaScript timestamp", + "example": 1540095775951, + "type": "number" + } + }, + { + "name": "rollbackDeploymentId", + "description": "Get aliases that would be rolled back for the given deployment", + "in": "query", + "schema": { + "description": "Get aliases that would be rolled back for the given deployment", + "example": "dpl_XXX", + "type": "string" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + } + }, + "/v4/aliases/{idOrAlias}": { + "get": { + "description": "Retrieves an Alias for the given host name or alias ID.", + "operationId": "getAlias", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Get an Alias", + "tags": [ + "aliases" + ], + "responses": { + "200": { + "description": "The alias information", + "content": { + "application/json": { + "schema": { + "properties": { + "alias": { + "type": "string", + "description": "The alias name, it could be a `.vercel.app` subdomain or a custom domain", + "example": "my-alias.vercel.app" + }, + "created": { + "type": "string", + "format": "date-time", + "description": "The date when the alias was created", + "example": "2017-04-26T23:00:34.232Z" + }, + "createdAt": { + "type": "number", + "description": "The date when the alias was created in milliseconds since the UNIX epoch", + "example": 1540095775941, + "nullable": true + }, + "creator": { + "properties": { + "uid": { + "type": "string", + "description": "ID of the user who created the alias", + "example": "96SnxkFiMyVKsK3pnoHfx3Hz" + }, + "email": { + "type": "string", + "description": "Email of the user who created the alias", + "example": "john-doe@gmail.com" + }, + "username": { + "type": "string", + "description": "Username of the user who created the alias", + "example": "john-doe" + } + }, + "required": [ + "uid" + ], + "type": "object", + "description": "Information of the user who created the alias" + }, + "deletedAt": { + "type": "number", + "description": "The date when the alias was deleted in milliseconds since the UNIX epoch", + "example": 1540095775941, + "nullable": true + }, + "deployment": { + "properties": { + "id": { + "type": "string", + "description": "The deployment unique identifier", + "example": "dpl_5m8CQaRBm3FnWRW1od3wKTpaECPx" + }, + "url": { + "type": "string", + "description": "The deployment unique URL", + "example": "my-instant-deployment-3ij3cxz9qr.now.sh" + }, + "meta": { + "type": "string", + "description": "The deployment metadata", + "example": {} + } + }, + "required": [ + "id" + ], + "type": "object", + "description": "A map with the deployment ID, URL and metadata" + }, + "deploymentId": { + "nullable": true, + "type": "string", + "description": "The deployment ID", + "example": "dpl_5m8CQaRBm3FnWRW1od3wKTpaECPx" + }, + "projectId": { + "nullable": true, + "type": "string", + "description": "The unique identifier of the project", + "example": "prj_12HKQaOmR5t5Uy6vdcQsNIiZgHGB" + }, + "redirect": { + "nullable": true, + "type": "string", + "description": "Target destination domain for redirect when the alias is a redirect" + }, + "redirectStatusCode": { + "nullable": true, + "type": "number", + "enum": [ + 301, + 302, + 307, + 308, + null + ], + "description": "Status code to be used on redirect" + }, + "uid": { + "type": "string", + "description": "The unique identifier of the alias" + }, + "updatedAt": { + "type": "number", + "description": "The date when the alias was updated in milliseconds since the UNIX epoch", + "example": 1540095775941, + "nullable": true + }, + "protectionBypass": { + "additionalProperties": { + "oneOf": [ + { + "properties": { + "createdAt": { + "type": "number" + }, + "createdBy": { + "type": "string" + }, + "scope": { + "type": "string", + "enum": [ + "shareable-link" + ] + }, + "expires": { + "type": "number" + } + }, + "required": [ + "createdAt", + "createdBy", + "scope" + ], + "type": "object", + "description": "The protection bypass for the alias" + }, + { + "properties": { + "createdAt": { + "type": "number" + }, + "lastUpdatedAt": { + "type": "number" + }, + "lastUpdatedBy": { + "type": "string" + }, + "access": { + "type": "string", + "enum": [ + "granted", + "requested" + ] + }, + "scope": { + "type": "string", + "enum": [ + "user" + ] + } + }, + "required": [ + "access", + "createdAt", + "lastUpdatedAt", + "lastUpdatedBy", + "scope" + ], + "type": "object", + "description": "The protection bypass for the alias" + }, + { + "properties": { + "createdAt": { + "type": "number" + }, + "createdBy": { + "type": "string" + }, + "scope": { + "type": "string", + "enum": [ + "alias-protection-override" + ] + } + }, + "required": [ + "createdAt", + "createdBy", + "scope" + ], + "type": "object", + "description": "The protection bypass for the alias" + }, + { + "properties": { + "createdAt": { + "type": "number" + }, + "lastUpdatedAt": { + "type": "number" + }, + "lastUpdatedBy": { + "type": "string" + }, + "scope": { + "type": "string", + "enum": [ + "email_invite" + ] + } + }, + "required": [ + "createdAt", + "lastUpdatedAt", + "lastUpdatedBy", + "scope" + ], + "type": "object", + "description": "The protection bypass for the alias" + } + ] + }, + "type": "object", + "description": "The protection bypass for the alias" + }, + "microfrontends": { + "properties": { + "defaultApp": { + "properties": { + "projectId": { + "type": "string" + } + }, + "required": [ + "projectId" + ], + "type": "object" + }, + "applications": { + "oneOf": [ + { + "items": { + "properties": { + "fallbackHost": { + "type": "string", + "description": "This is always set. In production it is used as a pointer to each apps production deployment. For pre-production, it's used as the fallback if there is no deployment for the branch." + }, + "projectId": { + "type": "string", + "description": "The project ID of the microfrontends application." + } + }, + "required": [ + "fallbackHost", + "projectId" + ], + "type": "object", + "description": "A list of the deployment routing information for each project." + }, + "type": "array", + "description": "A list of the deployment routing information for each project." + }, + { + "items": { + "properties": { + "fallbackHost": { + "type": "string", + "description": "This is always set. For branch aliases, it's used as the fallback if there is no deployment for the branch." + }, + "branchAlias": { + "type": "string", + "description": "Could point to a branch without a deployment if the project was never deployed. The proxy will fallback to the fallbackHost if there is no deployment." + }, + "projectId": { + "type": "string", + "description": "The project ID of the microfrontends application." + } + }, + "required": [ + "branchAlias", + "fallbackHost", + "projectId" + ], + "type": "object", + "description": "A list of the deployment routing information for each project." + }, + "type": "array", + "description": "A list of the deployment routing information for each project." + }, + { + "items": { + "properties": { + "deploymentId": { + "type": "string", + "description": "This is the deployment for the same commit, it could be a cancelled deployment. The proxy will fallback to the branchDeploymentId and then the fallbackDeploymentId." + }, + "branchDeploymentId": { + "type": "string", + "description": "This is the latest non-cancelled deployment of the branch alias at the time the commit alias was created. It is possible there is no deployment for the branch, or this was set before the deployment was canceled, in which case this will point to a cancelled deployment, in either case the proxy will fallback to the fallbackDeploymentId." + }, + "fallbackDeploymentId": { + "type": "string", + "description": "This is the deployment of the fallback host at the time the commit alias was created. It is possible for this to be a deleted deployment, in which case the proxy will show that the deployment is deleted. It will not use the fallbackHost, as a future deployment on the fallback host could be invalid for this deployment, and it could lead to confusion / incorrect behavior for the commit alias." + }, + "fallbackHost": { + "type": "string", + "description": "Temporary for backwards compatibility. Can remove when metadata change is released" + }, + "branchAlias": { + "type": "string" + }, + "projectId": { + "type": "string", + "description": "The project ID of the microfrontends application." + } + }, + "required": [ + "projectId" + ], + "type": "object", + "description": "A list of the deployment routing information for each project." + }, + "type": "array", + "description": "A list of the deployment routing information for each project." + } + ] + } + }, + "required": [ + "applications", + "defaultApp" + ], + "type": "object", + "description": "The microfrontends for the alias including the routing configuration" + } + }, + "required": [ + "alias", + "created", + "deploymentId", + "projectId", + "uid" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "The alias was not found" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "from", + "description": "Get the alias only if it was created after the provided timestamp", + "in": "query", + "required": false, + "schema": { + "deprecated": true, + "description": "Get the alias only if it was created after the provided timestamp", + "example": 1540095775951, + "type": "number" + } + }, + { + "name": "idOrAlias", + "description": "The alias or alias ID to be retrieved", + "in": "path", + "required": true, + "schema": { + "description": "The alias or alias ID to be retrieved", + "example": "example.vercel.app", + "type": "string" + } + }, + { + "name": "projectId", + "description": "Get the alias only if it is assigned to the provided project ID", + "in": "query", + "required": false, + "schema": { + "description": "Get the alias only if it is assigned to the provided project ID", + "example": "prj_12HKQaOmR5t5Uy6vdcQsNIiZgHGB", + "type": "string" + } + }, + { + "name": "since", + "description": "Get the alias only if it was created after this JavaScript timestamp", + "in": "query", + "required": false, + "schema": { + "description": "Get the alias only if it was created after this JavaScript timestamp", + "example": 1540095775941, + "type": "number" + } + }, + { + "name": "until", + "description": "Get the alias only if it was created before this JavaScript timestamp", + "in": "query", + "required": false, + "schema": { + "description": "Get the alias only if it was created before this JavaScript timestamp", + "example": 1540095775951, + "type": "number" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + } + }, + "/v2/aliases/{aliasId}": { + "delete": { + "description": "Delete an Alias with the specified ID.", + "operationId": "deleteAlias", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Delete an Alias", + "tags": [ + "aliases" + ], + "responses": { + "200": { + "description": "The alias was successfully removed", + "content": { + "application/json": { + "schema": { + "properties": { + "status": { + "type": "string", + "enum": [ + "SUCCESS" + ] + } + }, + "required": [ + "status" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "The alias was not found" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "aliasId", + "description": "The ID or alias that will be removed", + "in": "path", + "required": true, + "schema": { + "example": "2WjyKQmM8ZnGcJsPWMrHRHrE", + "description": "The ID or alias that will be removed", + "oneOf": [ + { + "type": "string" + } + ] + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + } + }, + "/aliases/{id}/protection-bypass": { + "patch": { + "description": "Update the protection bypass for the alias or deployment URL (used for user access \u0026 comment access for deployments). Used as shareable links and user scoped access for Vercel Authentication and also to allow external (logged in) people to comment on previews for Preview Comments (next-live-mode).", + "operationId": "patchUrlProtectionBypass", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Update the protection bypass for a URL", + "tags": [ + "aliases" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "additionalProperties": true, + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid.\nOne of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "409": { + "description": "" + }, + "410": { + "description": "" + }, + "428": { + "description": "" + } + }, + "parameters": [ + { + "name": "id", + "description": "The alias or deployment ID", + "in": "path", + "required": true, + "schema": { + "type": "string", + "description": "The alias or deployment ID" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "oneOf": [ + { + "type": "object", + "properties": { + "ttl": { + "description": "Optional time the shareable link is valid for in seconds. If not provided, the shareable link will never expire.", + "type": "number", + "maximum": 63072000 + }, + "revoke": { + "description": "Optional instructions for revoking and regenerating a shareable link", + "type": "object", + "properties": { + "secret": { + "description": "Sharebale link to revoked", + "type": "string" + }, + "regenerate": { + "description": "Whether or not a new shareable link should be created after the provided secret is revoked", + "type": "boolean" + } + }, + "required": [ + "secret", + "regenerate" + ] + } + }, + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "scope": { + "description": "Instructions for creating a user scoped protection bypass", + "type": "object", + "properties": { + "userId": { + "type": "string", + "description": "Specified user id for the scoped bypass." + }, + "email": { + "type": "string", + "format": "email", + "description": "Specified email for the scoped bypass." + }, + "access": { + "enum": [ + "denied", + "granted" + ], + "description": "Invitation status for the user scoped bypass." + } + }, + "allOf": [ + { + "anyOf": [ + { + "required": [ + "userId" + ] + }, + { + "required": [ + "email" + ] + } + ] + }, + { + "required": [ + "access" + ] + } + ] + } + }, + "required": [ + "scope" + ], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "override": { + "type": "object", + "properties": { + "scope": { + "enum": [ + "alias-protection-override" + ] + }, + "action": { + "enum": [ + "create", + "revoke" + ] + } + }, + "required": [ + "scope", + "action" + ] + } + }, + "required": [ + "override" + ], + "additionalProperties": false + } + ] + } + } + } + } + } + }, + "/v8/certs/{id}": { + "get": { + "description": "Get cert by id", + "operationId": "getCertById", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Get cert by id", + "tags": [ + "certs" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "id": { + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "expiresAt": { + "type": "number" + }, + "autoRenew": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "cns": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "autoRenew", + "cns", + "createdAt", + "expiresAt", + "id" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + } + }, + "x-vercel-cli": { + "supportedSubcommands": true, + "supportedProduction": false + }, + "parameters": [ + { + "name": "id", + "description": "The cert id", + "in": "path", + "required": true, + "schema": { + "description": "The cert id", + "type": "string" + }, + "x-vercel-cli": { + "kind": "argument" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + }, + "delete": { + "description": "Remove cert", + "operationId": "removeCert", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Remove cert", + "tags": [ + "certs" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + } + }, + "x-vercel-cli": { + "supportedSubcommands": true, + "supportedProduction": false + }, + "parameters": [ + { + "name": "id", + "description": "The cert id to remove", + "in": "path", + "required": true, + "schema": { + "description": "The cert id to remove", + "type": "string" + }, + "x-vercel-cli": { + "kind": "argument" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + } + }, + "/v8/certs": { + "get": { + "description": "Get certs", + "operationId": "getCerts", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Get certs", + "tags": [ + "certs" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "certs": { + "items": { + "properties": { + "id": { + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "expiresAt": { + "type": "number" + }, + "autoRenew": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "cns": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "autoRenew", + "cns", + "createdAt", + "expiresAt", + "id" + ], + "type": "object" + }, + "type": "array" + }, + "pagination": { + "$ref": "#/components/schemas/Pagination" + } + }, + "required": [ + "certs", + "pagination" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "" + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + }, + "post": { + "description": "Issue a new cert", + "operationId": "issueCert", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Issue a new cert", + "tags": [ + "certs" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "id": { + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "expiresAt": { + "type": "number" + }, + "autoRenew": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "cns": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "autoRenew", + "cns", + "createdAt", + "expiresAt", + "id" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "402": { + "description": "The account is missing a payment so payment method must be updated" + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + }, + "449": { + "description": "" + }, + "500": { + "description": "" + } + }, + "x-vercel-cli": { + "supportedSubcommands": true, + "supportedProduction": false, + "aliases": [ + "issue" + ], + "bodyArguments": [ + "cns" + ] + }, + "parameters": [ + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "cns": { + "description": "The common names the cert should be issued for", + "type": "array", + "items": { + "type": "string" + } + } + } + } + } + } + } + }, + "put": { + "description": "Upload a cert", + "operationId": "uploadCert", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Upload a cert", + "tags": [ + "certs" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "id": { + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "expiresAt": { + "type": "number" + }, + "autoRenew": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "cns": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "autoRenew", + "cns", + "createdAt", + "expiresAt", + "id" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request body is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "402": { + "description": "This feature is only available for Enterprise customers." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "410": { + "description": "" + } + }, + "x-vercel-cli": { + "supportedSubcommands": true, + "supportedProduction": false, + "aliases": [ + "add" + ] + }, + "parameters": [ + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "ca", + "key", + "cert" + ], + "additionalProperties": false, + "properties": { + "ca": { + "type": "string", + "description": "The certificate authority" + }, + "key": { + "type": "string", + "description": "The certificate key" + }, + "cert": { + "type": "string", + "description": "The certificate" + }, + "skipValidation": { + "type": "boolean", + "description": "Skip validation of the certificate" + } + } + } + } + } + } + } + }, + "/v6/deployments/{id}/files": { + "get": { + "description": "Allows to retrieve the file structure of the source code of a deployment by supplying the deployment unique identifier. If the deployment was created with the Vercel CLI or the API directly with the `files` key, it will have a file tree that can be retrievable.", + "operationId": "listDeploymentFiles", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "List Deployment Files", + "tags": [ + "deployments" + ], + "responses": { + "200": { + "description": "Retrieved the file tree successfully", + "content": { + "application/json": { + "schema": { + "items": { + "$ref": "#/components/schemas/FileTree" + }, + "type": "array" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "File tree not found\nDeployment not found" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "id", + "description": "The unique deployment identifier", + "in": "path", + "required": true, + "schema": { + "description": "The unique deployment identifier", + "type": "string" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + } + }, + "/v8/deployments/{id}/files/{fileId}": { + "get": { + "description": "Allows to retrieve the content of a file by supplying the file identifier and the deployment unique identifier. The response body will contain a JSON response containing the contents of the file encoded as base64.", + "operationId": "getDeploymentFileContents", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Get Deployment File Contents", + "tags": [ + "deployments" + ], + "responses": { + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "File not found\nDeployment not found" + }, + "410": { + "description": "Invalid API version." + } + }, + "parameters": [ + { + "name": "id", + "description": "The unique deployment identifier", + "in": "path", + "required": true, + "schema": { + "description": "The unique deployment identifier", + "type": "string" + } + }, + { + "name": "fileId", + "description": "The unique file identifier", + "in": "path", + "required": true, + "schema": { + "description": "The unique file identifier", + "type": "string" + } + }, + { + "name": "path", + "description": "Path to the file to fetch (only for Git deployments)", + "in": "query", + "required": false, + "schema": { + "description": "Path to the file to fetch (only for Git deployments)", + "type": "string" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + } + }, + "/v7/deployments": { + "get": { + "description": "List deployments under the authenticated user or team. If a deployment hasn't finished uploading (is incomplete), the `url` property will have a value of `null`.", + "operationId": "getDeployments", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "List deployments", + "tags": [ + "deployments" + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "properties": { + "pagination": { + "$ref": "#/components/schemas/Pagination" + }, + "deployments": { + "items": { + "properties": { + "createdAt": { + "type": "number" + }, + "readyState": { + "type": "string", + "enum": [ + "BLOCKED", + "BUILDING", + "CANCELED", + "DELETED", + "ERROR", + "INITIALIZING", + "QUEUED", + "READY" + ] + }, + "uid": { + "type": "string", + "description": "The unique identifier of the deployment.", + "example": "dpl_2euZBFqxYdDMDG1jTrHFnNZ2eUVa" + }, + "name": { + "type": "string", + "description": "The name of the deployment.", + "example": "docs" + }, + "projectId": { + "type": "string", + "description": "The project ID of the deployment" + }, + "url": { + "type": "string", + "description": "The URL of the deployment.", + "example": "docs-9jaeg38me.vercel.app" + }, + "created": { + "type": "number", + "description": "Timestamp of when the deployment got created.", + "example": 1609492210000 + }, + "defaultRoute": { + "type": "string", + "description": "The default route that should be used for screenshots and links if configured with microfrontends.", + "example": "/docs" + }, + "deleted": { + "type": "number", + "description": "Timestamp of when the deployment got deleted.", + "example": 1609492210000 + }, + "undeleted": { + "type": "number", + "description": "Timestamp of when the deployment was undeleted.", + "example": 1609492210000 + }, + "softDeletedByRetention": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Optional flag to indicate if the deployment was soft deleted by retention policy.", + "example": true + }, + "source": { + "type": "string", + "enum": [ + "api-trigger-git-deploy", + "cli", + "clone/repo", + "drop", + "git", + "git-deploy-hook", + "import", + "import/repo", + "redeploy", + "v0-web" + ], + "description": "The source of the deployment.", + "example": "cli" + }, + "state": { + "type": "string", + "enum": [ + "BLOCKED", + "BUILDING", + "CANCELED", + "DELETED", + "ERROR", + "INITIALIZING", + "QUEUED", + "READY" + ], + "description": "In which state is the deployment.", + "example": "READY" + }, + "type": { + "type": "string", + "enum": [ + "LAMBDAS" + ], + "description": "The type of the deployment.", + "example": "LAMBDAS" + }, + "creator": { + "properties": { + "uid": { + "type": "string", + "description": "Stable creator id across principal types. This may be a user ID, an app ID, an integration configuration ID, or `system`.", + "example": "eLrCnEgbKhsHyfbiNR7E8496" + }, + "type": { + "type": "string", + "enum": [ + "app", + "integration", + "system", + "user" + ], + "description": "Principal type of the deployment creator. Defaults to `\"user\"` if absent (legacy deployments created before principal attribution was recorded)." + }, + "email": { + "type": "string", + "description": "The email address of the user.", + "example": "example@example.com" + }, + "username": { + "type": "string", + "description": "The username of the user.", + "example": "johndoe" + }, + "githubLogin": { + "type": "string", + "description": "The GitHub login of the user.", + "example": "johndoe" + }, + "gitlabLogin": { + "type": "string", + "description": "The GitLab login of the user.", + "example": "johndoe" + } + }, + "required": [ + "uid" + ], + "type": "object", + "description": "Metadata information of the deployment creator." + }, + "meta": { + "additionalProperties": { + "type": "string", + "description": "Metadata information from the Git provider." + }, + "type": "object", + "description": "Metadata information from the Git provider." + }, + "target": { + "nullable": true, + "type": "string", + "enum": [ + "production", + "staging", + null + ], + "description": "On which environment has the deployment been deployed to.", + "example": "production" + }, + "aliasError": { + "nullable": true, + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object", + "description": "An error object in case aliasing of the deployment failed." + }, + "aliasAssigned": { + "nullable": true, + "oneOf": [ + { + "type": "number" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + } + ] + }, + "buildingAt": { + "type": "number", + "description": "Timestamp of when the deployment started building at.", + "example": 1609492210000 + }, + "ready": { + "type": "number", + "description": "Timestamp of when the deployment got ready.", + "example": 1609492210000 + }, + "readySubstate": { + "type": "string", + "enum": [ + "PROMOTED", + "ROLLING", + "STAGED" + ], + "description": "Substate of deployment when readyState is 'READY' Tracks whether or not deployment has seen production traffic: - STAGED: never seen production traffic - ROLLING: in the process of gradually transitioning production traffic - PROMOTED: has seen production traffic" + }, + "checksState": { + "type": "string", + "enum": [ + "completed", + "registered", + "running" + ], + "description": "State of all registered checks" + }, + "checksConclusion": { + "type": "string", + "enum": [ + "canceled", + "failed", + "skipped", + "succeeded" + ], + "description": "Conclusion for checks" + }, + "checks": { + "properties": { + "deployment-alias": { + "properties": { + "state": { + "type": "string", + "enum": [ + "failed", + "pending", + "succeeded" + ] + }, + "startedAt": { + "type": "number" + }, + "completedAt": { + "type": "number" + } + }, + "required": [ + "startedAt", + "state" + ], + "type": "object", + "description": "Detailed information about v2 deployment checks. Includes information about blocked workflows in the deployment lifecycle." + } + }, + "required": [ + "deployment-alias" + ], + "type": "object", + "description": "Detailed information about v2 deployment checks. Includes information about blocked workflows in the deployment lifecycle." + }, + "inspectorUrl": { + "nullable": true, + "type": "string", + "description": "Vercel URL to inspect the deployment.", + "example": "https://vercel.com/acme/nextjs/J1hXN00qjUeoYfpEEf7dnDtpSiVq" + }, + "errorCode": { + "type": "string", + "description": "Error code when the deployment is in an error state.", + "example": "BUILD_FAILED" + }, + "errorMessage": { + "nullable": true, + "type": "string", + "description": "Error message when the deployment is in an canceled or error state.", + "example": "The Deployment has been canceled because this project was not affected" + }, + "oomReport": { + "type": "string", + "enum": [ + "out-of-memory" + ], + "description": "Indicates if the deployment encountered an out-of-memory error.", + "example": "out-of-memory" + }, + "isRollbackCandidate": { + "nullable": true, + "type": "boolean", + "enum": [ + false, + true, + null + ], + "description": "Deployment can be used for instant rollback" + }, + "prebuilt": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "manualProvisioning": { + "properties": { + "state": { + "type": "string", + "enum": [ + "COMPLETE", + "PENDING", + "TIMEOUT" + ], + "description": "Current provisioning state" + }, + "completedAt": { + "type": "number", + "description": "Timestamp when manual provisioning completed" + } + }, + "required": [ + "state" + ], + "type": "object" + }, + "projectSettings": { + "properties": { + "framework": { + "nullable": true, + "type": "string", + "enum": [ + "actix-web", + "angular", + "ash", + "astro", + "axum", + "blitzjs", + "brunch", + "bun", + "container", + "create-react-app", + "django", + "docusaurus", + "docusaurus-2", + "dojo", + "eleventy", + "elysia", + "ember", + "eve", + "express", + "factory-eve", + "fastapi", + "fasthtml", + "fastify", + "flask", + "gatsby", + "go", + "gridsome", + "h3", + "hexo", + "hono", + "hugo", + "hydrogen", + "ionic-angular", + "ionic-react", + "jekyll", + "koa", + "mastra", + "middleman", + "nestjs", + "nextjs", + "nitro", + "node", + "nuxtjs", + "parcel", + "polymer", + "preact", + "python", + "react-router", + "redwoodjs", + "remix", + "ruby", + "rust", + "saber", + "sanity", + "sanity-v2", + "sapper", + "scully", + "services", + "solidstart", + "solidstart-1", + "stencil", + "storybook", + "svelte", + "sveltekit", + "sveltekit-1", + "tanstack-start", + "tanstack-start-lovable", + "umijs", + "vite", + "vitepress", + "vue", + "vuepress", + "xmcp", + "zola", + null + ] + }, + "gitForkProtection": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "customerSupportCodeVisibility": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "gitLFS": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "devCommand": { + "nullable": true, + "type": "string" + }, + "installCommand": { + "nullable": true, + "type": "string" + }, + "buildCommand": { + "nullable": true, + "type": "string" + }, + "nodeVersion": { + "type": "string", + "enum": [ + "10.x", + "12.x", + "14.x", + "16.x", + "18.x", + "20.x", + "22.x", + "24.x", + "8.10.x" + ] + }, + "outputDirectory": { + "nullable": true, + "type": "string" + }, + "rootDirectory": { + "nullable": true, + "type": "string" + }, + "sourceFilesOutsideRootDirectory": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "commandForIgnoringBuildStep": { + "nullable": true, + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "speedInsights": { + "properties": { + "id": { + "type": "string" + }, + "enabledAt": { + "type": "number" + }, + "disabledAt": { + "type": "number" + }, + "canceledAt": { + "type": "number" + }, + "hasData": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "dataReceivedAt": { + "type": "number", + "description": "When the first free (not Speed Insights Plus) production data point was observed, in ms. Set once by subscriber-analytics-events; projects that already had data before this field shipped get it backfilled on their next batch, so it reads \"first free data point observed\", not necessarily \"first ever\"." + }, + "paidAt": { + "type": "number" + } + }, + "required": [ + "id" + ], + "type": "object" + }, + "webAnalytics": { + "properties": { + "id": { + "type": "string" + }, + "disabledAt": { + "type": "number" + }, + "canceledAt": { + "type": "number" + }, + "enabledAt": { + "type": "number" + }, + "hasData": { + "type": "boolean", + "enum": [ + true + ] + } + }, + "required": [ + "id" + ], + "type": "object" + }, + "skipGitConnectDuringLink": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "gitComments": { + "properties": { + "onPullRequest": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether the Vercel bot should comment on PRs" + }, + "onCommit": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether the Vercel bot should comment on commits" + } + }, + "required": [ + "onCommit", + "onPullRequest" + ], + "type": "object", + "description": "Since June '23" + } + }, + "type": "object", + "description": "The project settings which was used for this deployment" + }, + "connectBuildsEnabled": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "The flag saying if Secure Compute network is used for builds" + }, + "connectConfigurationId": { + "type": "string", + "description": "The ID of Secure Compute network used for this deployment" + }, + "passiveConnectConfigurationId": { + "type": "string", + "description": "The ID of Secure Compute network used for this deployment's passive functions" + }, + "expiration": { + "type": "number", + "description": "The expiration configured by the project retention policy" + }, + "proposedExpiration": { + "type": "number", + "description": "The expiration proposed to replace the existing expiration" + }, + "platform": { + "properties": { + "source": { + "properties": { + "name": { + "type": "string", + "description": "Display name of the platform." + } + }, + "required": [ + "name" + ], + "type": "object", + "description": "The external platform that created the deployment (e.g. its display name)." + }, + "origin": { + "properties": { + "type": { + "type": "string", + "enum": [ + "id", + "url" + ], + "description": "Whether the value is an opaque identifier or a URL." + }, + "value": { + "type": "string", + "description": "The identifier or URL pointing to the originating entity." + } + }, + "required": [ + "type", + "value" + ], + "type": "object", + "description": "Reference back to the entity on the platform that initiated the deployment." + }, + "creator": { + "properties": { + "name": { + "type": "string", + "description": "Display name of the platform user." + }, + "avatar": { + "type": "string", + "description": "URL of the platform user's avatar image." + } + }, + "required": [ + "name" + ], + "type": "object", + "description": "The user on the external platform who triggered the deployment." + }, + "meta": { + "additionalProperties": { + "type": "string" + }, + "type": "object", + "description": "Arbitrary key-value metadata provided by the platform." + } + }, + "required": [ + "creator", + "origin", + "source" + ], + "type": "object", + "description": "Metadata about the source platform that triggered the deployment." + }, + "customEnvironment": { + "properties": { + "id": { + "type": "string" + }, + "slug": { + "type": "string" + } + }, + "required": [ + "id" + ], + "type": "object", + "description": "The custom environment used for this deployment, if any" + }, + "seatBlock": { + "properties": { + "blockCode": { + "type": "string", + "enum": [ + "COMMIT_AUTHOR_REQUIRED", + "TEAM_ACCESS_REQUIRED" + ], + "description": "The NSNB decision code for the seat block. TODO: We should consolidate block types." + }, + "userId": { + "type": "string", + "description": "The blocked vercel user ID." + }, + "isVerified": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Determines if the user was verified during the block. In the git integration case, the commit sender was the author." + }, + "gitUserId": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "gitProvider": { + "type": "string", + "enum": [ + "bitbucket", + "github", + "gitlab" + ], + "description": "The git provider type associated with gitUserId." + } + }, + "required": [ + "blockCode" + ], + "type": "object", + "description": "NSNB Blocked metadata" + }, + "attribution": { + "properties": { + "commitMeta": { + "properties": { + "email": { + "type": "string", + "description": "Email from git commit author" + }, + "name": { + "type": "string", + "description": "Name from git commit author" + }, + "isVerified": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether the commit was signed/verified (GitHub only, others return undefined)" + } + }, + "type": "object", + "description": "Commit metadata from the git commit author" + }, + "gitUser": { + "properties": { + "id": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "login": { + "type": "string", + "description": "Git provider username/login" + }, + "type": { + "type": "string", + "description": "User type" + }, + "provider": { + "type": "string", + "description": "The git provider (github, gitlab, bitbucket)" + } + }, + "required": [ + "id", + "login" + ], + "type": "object", + "description": "Git provider user associated with the commit author email (only set if resolved)" + }, + "vercelUser": { + "properties": { + "id": { + "type": "string", + "description": "Vercel user ID" + }, + "username": { + "type": "string", + "description": "Vercel username" + }, + "teamRoles": { + "items": { + "type": "string" + }, + "type": "array", + "description": "Team roles at time of deployment" + } + }, + "required": [ + "id", + "username" + ], + "type": "object", + "description": "Vercel user linked to the git provider account (only set if resolved)" + } + }, + "type": "object", + "description": "Commit attribution metadata" + } + }, + "required": [ + "created", + "createdAt", + "creator", + "inspectorUrl", + "name", + "projectId", + "readyState", + "type", + "uid", + "url" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "deployments", + "pagination" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "" + }, + "410": { + "description": "" + }, + "422": { + "description": "" + } + }, + "x-vercel-cli": { + "supportedSubcommands": true, + "supportedProduction": false, + "aliases": [ + "ls", + "list" + ] + }, + "parameters": [ + { + "name": "app", + "description": "Name of the deployment.", + "in": "query", + "schema": { + "description": "Name of the deployment.", + "type": "string", + "example": "docs" + } + }, + { + "name": "from", + "description": "Gets the deployment created after this Date timestamp. (default: current time)", + "in": "query", + "schema": { + "description": "Gets the deployment created after this Date timestamp. (default: current time)", + "type": "number", + "example": 1612948664566, + "deprecated": true + } + }, + { + "name": "limit", + "description": "Maximum number of deployments to list from a request.", + "in": "query", + "schema": { + "description": "Maximum number of deployments to list from a request.", + "type": "number", + "example": 10 + } + }, + { + "name": "projectId", + "description": "Filter deployments from the given ID or name.", + "in": "query", + "schema": { + "description": "Filter deployments from the given ID or name.", + "type": "string", + "example": "QmXGTs7mvAMMC7WW5ebrM33qKG32QK3h4vmQMjmY" + } + }, + { + "name": "projectIds", + "description": "Filter deployments from the given project IDs. Cannot be used when projectId is specified.", + "in": "query", + "schema": { + "description": "Filter deployments from the given project IDs. Cannot be used when projectId is specified.", + "type": "array", + "items": { + "type": "string" + }, + "example": [ + "prj_123", + "prj_456" + ], + "minItems": 1, + "maxItems": 20 + } + }, + { + "name": "target", + "description": "Filter deployments based on the environment.", + "in": "query", + "schema": { + "description": "Filter deployments based on the environment.", + "type": "string", + "example": "production" + } + }, + { + "name": "to", + "description": "Gets the deployment created before this Date timestamp. (default: current time)", + "in": "query", + "schema": { + "description": "Gets the deployment created before this Date timestamp. (default: current time)", + "type": "number", + "example": 1612948664566, + "deprecated": true + } + }, + { + "name": "users", + "description": "Filter out deployments based on users who have created the deployment.", + "in": "query", + "schema": { + "description": "Filter out deployments based on users who have created the deployment.", + "type": "string", + "example": "kr1PsOIzqEL5Xg6M4VZcZosf,K4amb7K9dAt5R2vBJWF32bmY" + } + }, + { + "name": "since", + "description": "Get Deployments created after this JavaScript timestamp.", + "in": "query", + "schema": { + "description": "Get Deployments created after this JavaScript timestamp.", + "type": "number", + "example": 1540095775941 + } + }, + { + "name": "until", + "description": "Get Deployments created before this JavaScript timestamp.", + "in": "query", + "schema": { + "description": "Get Deployments created before this JavaScript timestamp.", + "type": "number", + "example": 1540095775951 + } + }, + { + "name": "state", + "description": "Filter deployments based on their state (`BUILDING`, `ERROR`, `INITIALIZING`, `QUEUED`, `READY`, `CANCELED`, `BLOCKED`)", + "in": "query", + "schema": { + "description": "Filter deployments based on their state (`BUILDING`, `ERROR`, `INITIALIZING`, `QUEUED`, `READY`, `CANCELED`, `BLOCKED`)", + "type": "string", + "example": "BUILDING,READY" + } + }, + { + "name": "rollbackCandidate", + "description": "Filter deployments based on their rollback candidacy", + "in": "query", + "schema": { + "description": "Filter deployments based on their rollback candidacy", + "type": "boolean" + } + }, + { + "name": "branch", + "description": "Filter deployments based on the branch name", + "in": "query", + "schema": { + "description": "Filter deployments based on the branch name", + "type": "string" + } + }, + { + "name": "sha", + "description": "Filter deployments based on the SHA", + "in": "query", + "schema": { + "description": "Filter deployments based on the SHA", + "type": "string" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + } + }, + "/v13/deployments/{id}": { + "delete": { + "description": "This API allows you to delete a deployment, either by supplying its `id` in the URL or the `url` of the deployment as a query parameter. You can obtain the ID, for example, by listing all deployments.", + "operationId": "deleteDeployment", + "security": [ + { + "bearerToken": [] + } + ], + "summary": "Delete a Deployment", + "tags": [ + "deployments" + ], + "responses": { + "200": { + "description": "The deployment was successfully deleted", + "content": { + "application/json": { + "schema": { + "properties": { + "uid": { + "type": "string", + "description": "The removed deployment ID.", + "example": "dpl_5WJWYSyB7BpgTj3EuwF37WMRBXBtPQ2iTMJHJBJyRfd" + }, + "state": { + "type": "string", + "enum": [ + "DELETED" + ], + "description": "A constant with the final state of the deployment." + } + }, + "required": [ + "state", + "uid" + ], + "type": "object" + } + } + } + }, + "400": { + "description": "One of the provided values in the request query is invalid." + }, + "401": { + "description": "The request is not authorized." + }, + "403": { + "description": "You do not have permission to access this resource." + }, + "404": { + "description": "The deployment was not found" + }, + "410": { + "description": "" + } + }, + "parameters": [ + { + "name": "id", + "description": "The ID of the deployment to be deleted", + "in": "path", + "required": true, + "schema": { + "description": "The ID of the deployment to be deleted", + "example": "dpl_5WJWYSyB7BpgTj3EuwF37WMRBXBtPQ2iTMJHJBJyRfd", + "type": "string" + } + }, + { + "name": "url", + "description": "A Deployment or Alias URL. In case it is passed, the ID will be ignored", + "in": "query", + "required": false, + "schema": { + "description": "A Deployment or Alias URL. In case it is passed, the ID will be ignored", + "example": "https://files-orcin-xi.vercel.app/", + "type": "string" + } + }, + { + "description": "The Team identifier to perform the request on behalf of.", + "in": "query", + "name": "teamId", + "schema": { + "type": "string", + "example": "team_1a2b3c4d5e6f7g8h9i0j1k2l" + } + }, + { + "description": "The Team slug to perform the request on behalf of.", + "in": "query", + "name": "slug", + "schema": { + "type": "string", + "example": "my-team-url-slug" + } + } + ] + } + } + }, + "components": { + "schemas": { + "AiGatewayProviderOptionBag": { + "additionalProperties": true, + "type": "object", + "description": "Arbitrary per-provider AI SDK options, keyed by gateway provider slug." + }, + "AiGatewayVirtualModelConfig": { + "properties": { + "ownerId": { + "type": "string", + "description": "Team (owner) that owns this VMC." + }, + "virtualModelSlug": { + "type": "string", + "description": "Client-facing alias used as the model slug in Gateway calls." + }, + "displayName": { + "type": "string", + "description": "Human-readable name for UI." + }, + "description": { + "type": "string", + "description": "Optional description for UI." + }, + "deleted": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether this VMC is soft-deleted." + }, + "status": { + "type": "string", + "description": "UI lifecycle status: draft, active, or archived." + }, + "visibility": { + "type": "string", + "description": "Visibility in listings: public, internal, or stealth." + }, + "updatedBy": { + "type": "string", + "description": "User id that last updated this VMC." + }, + "kind": { + "type": "string", + "description": "VMC kind: alias, relay, or router." + }, + "baseUrl": { + "type": "string", + "description": "For kind=relay: URL the gateway forwards requests to as a transparent proxy." + }, + "instanceId": { + "type": "string", + "description": "The concrete model-provider instance this VMC resolves to." + }, + "providerOrder": { + "items": { + "type": "string" + }, + "type": "array", + "description": "Ordered list of providers to try as fallbacks on failure." + }, + "providerOnly": { + "items": { + "type": "string" + }, + "type": "array", + "description": "Restrict routing to only these providers." + }, + "providerOptions": { + "additionalProperties": { + "$ref": "#/components/schemas/AiGatewayProviderOptionBag" + }, + "type": "object", + "description": "Arbitrary per-provider AI SDK options, keyed by gateway provider slug." + }, + "inferenceRegion": { + "properties": { + "providers": { + "additionalProperties": { + "nullable": true, + "properties": { + "scope": { + "type": "string", + "enum": [ + "global", + "specific", + "zone" + ], + "description": "Pin scope: `specific` (one provider region), `zone` (geo zone), or `global`." + }, + "geoRegion": { + "type": "string", + "description": "Geo zone (e.g. \"us\", \"eu\")." + }, + "providerRegion": { + "type": "string", + "description": "Provider-specific region identifier." + } + }, + "type": "object", + "description": "Per-provider region overrides keyed by provider slug." + }, + "type": "object", + "description": "Per-provider region overrides keyed by provider slug." + }, + "scope": { + "type": "string", + "enum": [ + "global", + "specific", + "zone" + ], + "description": "Pin scope: `specific` (one provider region), `zone` (geo zone), or `global`." + }, + "geoRegion": { + "type": "string", + "description": "Geo zone (e.g. \"us\", \"eu\")." + }, + "providerRegion": { + "type": "string", + "description": "Provider-specific region identifier." + } + }, + "type": "object", + "description": "Region pinned on the VMC for system-credential routing (alias/router only)." + }, + "modelSlug": { + "type": "string", + "description": "Canonical model slug this VMC maps to (e.g. \"creator/model\"). Not used by kind=router." + }, + "models": { + "items": { + "type": "string" + }, + "type": "array", + "description": "For kind=router: ordered candidates, model slugs or router references. Otherwise: fallback models." + }, + "selector": { + "type": "string", + "enum": [ + "cost", + "priority", + "tps", + "ttft" + ], + "description": "For kind=router: how to order candidates." + }, + "requires": { + "items": { + "type": "string" + }, + "type": "array", + "description": "For kind=router: capability tags a candidate must have." + }, + "byokCredentialIds": { + "items": { + "type": "string" + }, + "type": "array", + "description": "BYOK credential IDs allowed for this VMC." + }, + "observabilityTags": { + "items": { + "type": "string" + }, + "type": "array", + "description": "Observability tags attached to requests through this VMC." + }, + "sort": { + "type": "string", + "enum": [ + "cost", + "latency", + "price", + "throughput", + "tps", + "ttft" + ], + "description": "Rank eligible providers by an attribute." + }, + "has": { + "items": { + "type": "string", + "enum": [ + "implicit-caching", + "vision" + ], + "description": "Limit providers to those with these features." + }, + "type": "array", + "description": "Limit providers to those with these features." + }, + "caching": { + "type": "string", + "enum": [ + "auto" + ], + "description": "Use caching if available." + }, + "serviceTier": { + "type": "string", + "enum": [ + "fast", + "flex", + "priority" + ], + "description": "Service tier for providers that support it." + }, + "providerTimeouts": { + "properties": { + "byok": { + "additionalProperties": { + "type": "number" + }, + "type": "object" + } + }, + "type": "object", + "description": "Per-request provider timeouts in ms, keyed by provider slug for BYOK credentials." + }, + "zeroDataRetention": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Only use providers with zero data retention." + }, + "hipaaCompliant": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Only use HIPAA-compliant providers." + }, + "disallowPromptTraining": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Only use providers that will not train on your prompts." + }, + "speed": { + "type": "string", + "enum": [ + "fast" + ], + "description": "Only use fastest providers with short timeouts." + }, + "allowFallbackFromFast": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Allow fallback from fast to standard providers on failure." + }, + "createdAt": { + "type": "number", + "description": "Creation timestamp (epoch ms)." + }, + "updatedAt": { + "type": "number", + "description": "Last update timestamp (epoch ms)." + } + }, + "required": [ + "createdAt", + "deleted", + "kind", + "ownerId", + "status", + "updatedAt", + "virtualModelSlug" + ], + "type": "object", + "description": "Public response shape for virtual model configs. Used so OpenAPI generation can avoid ElectroDB's recursive EntityItem types." + }, + "AiGatewayVirtualModelConfigList": { + "properties": { + "virtualModelConfigs": { + "items": { + "$ref": "#/components/schemas/AiGatewayVirtualModelConfig" + }, + "type": "array", + "description": "The page of VMCs." + }, + "cursor": { + "nullable": true, + "type": "string", + "description": "Cursor for the next page, or null when no more pages remain." + } + }, + "required": [ + "cursor", + "virtualModelConfigs" + ], + "type": "object" + }, + "AiGatewayRule": { + "properties": { + "ownerId": { + "type": "string" + }, + "ruleId": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "deny", + "rewrite" + ] + }, + "match": { + "properties": { + "model": { + "type": "string" + } + }, + "type": "object" + }, + "action": { + "properties": { + "rewriteModel": { + "type": "string" + }, + "reason": { + "type": "string" + } + }, + "type": "object" + }, + "enabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "deleted": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "description": { + "type": "string" + }, + "createdBy": { + "type": "string" + }, + "updatedBy": { + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "updatedAt": { + "type": "number" + } + }, + "required": [ + "createdAt", + "enabled", + "ownerId", + "ruleId", + "type", + "updatedAt" + ], + "type": "object", + "description": "Public response shape for AI Gateway routing rules. Used so OpenAPI generation can avoid ElectroDB's recursive EntityItem types." + }, + "AiGatewayRuleList": { + "properties": { + "rules": { + "items": { + "$ref": "#/components/schemas/AiGatewayRule" + }, + "type": "array" + } + }, + "required": [ + "rules" + ], + "type": "object" + }, + "Network": { + "properties": { + "awsAccountId": { + "type": "string", + "description": "The ID of the AWS Account in which the network exists." + }, + "awsAvailabilityZoneIds": { + "items": { + "type": "string" + }, + "type": "array", + "description": "The IDs of the AWS Availability Zones in which the network exists, if specified during creation." + }, + "awsRegion": { + "type": "string", + "description": "The AWS Region in which the network exists." + }, + "cidr": { + "type": "string", + "description": "The CIDR range of the Network." + }, + "createdAt": { + "type": "number", + "description": "The date at which the Network was created, represented as a UNIX timestamp since EPOCH." + }, + "egressIpAddresses": { + "items": { + "type": "string" + }, + "type": "array" + }, + "hostedZones": { + "properties": { + "count": { + "type": "number", + "description": "The number of AWS Route53 Hosted Zones associated with the Network." + } + }, + "required": [ + "count" + ], + "type": "object", + "description": "Metadata about any AWS Route53 Hosted Zones associated with the Network." + }, + "id": { + "type": "string", + "description": "The unique identifier of the Network." + }, + "name": { + "type": "string", + "description": "The name of the network." + }, + "peeringConnections": { + "properties": { + "count": { + "type": "number", + "description": "The number of AWS Route53 Hosted Zones associated with the Network." + } + }, + "required": [ + "count" + ], + "type": "object", + "description": "Metadata about any AWS Route53 Hosted Zones associated with the Network." + }, + "projects": { + "properties": { + "count": { + "type": "number" + }, + "ids": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "count", + "ids" + ], + "type": "object", + "description": "Metadata about any projects associated with the Network." + }, + "region": { + "type": "string", + "description": "The Vercel region in which the Network exists." + }, + "status": { + "type": "string", + "enum": [ + "create_in_progress", + "delete_in_progress", + "error", + "ready" + ], + "description": "The status of the Network." + }, + "teamId": { + "type": "string", + "description": "The unique identifier of the Team that owns the Network." + }, + "vpcId": { + "type": "string", + "description": "The ID of the VPC which hosts the network." + } + }, + "required": [ + "awsAccountId", + "awsRegion", + "cidr", + "createdAt", + "id", + "name", + "status", + "teamId" + ], + "type": "object" + }, + "PrivateLinkEndpoint": { + "properties": { + "endpointId": { + "type": "string", + "description": "The unique identifier of the PrivateLink endpoint.", + "example": "ple_a1b2c3d4e5f6g7h8" + }, + "name": { + "type": "string", + "description": "The name of the PrivateLink endpoint, shown in the Vercel dashboard.", + "example": "payments-db" + }, + "teamId": { + "type": "string", + "description": "The identifier of the team that owns the PrivateLink endpoint.", + "example": "team_a1b2c3d4e5f6g7h8" + }, + "projectId": { + "type": "string", + "description": "The identifier of the project the PrivateLink endpoint belongs to.", + "example": "prj_a1b2c3d4e5f6g7h8" + }, + "vercelRegion": { + "type": "string", + "description": "The Vercel region the endpoint is provisioned in.", + "example": "iad1" + }, + "awsServiceName": { + "type": "string", + "description": "The AWS VPC endpoint service the endpoint connects to.", + "example": "com.amazonaws.vpce.us-east-1.vpce-svc-0123456789abcdef0" + }, + "vpcEndpointId": { + "type": "string", + "description": "The identifier of the underlying AWS VPC endpoint. Absent until AWS has created the endpoint.", + "example": "vpce-0123456789abcdef0" + }, + "awsDnsEntries": { + "items": { + "type": "string" + }, + "type": "array", + "description": "The regional DNS names assigned to the endpoint by AWS. Use these to reach the service when private DNS is not enabled.", + "example": [ + "vpce-0123456789abcdef0-a1b2c3d4.vpce-svc-0123456789abcdef0.us-east-1.vpce.amazonaws.com" + ] + }, + "privateDnsNames": { + "items": { + "type": "string" + }, + "type": "array", + "description": "The private DNS names of the endpoint service, populated when private DNS is enabled for the endpoint.", + "example": [ + "payments.internal.example.com" + ] + }, + "status": { + "type": "string", + "enum": [ + "available", + "creating", + "deleting", + "failed", + "pending-acceptance", + "provisioning", + "rejected" + ], + "description": "The current state of the endpoint. - `creating`: the endpoint is being created. - `pending-acceptance`: waiting for the endpoint service owner to accept the connection. Only occurs for services that require manual acceptance. - `provisioning`: the connection was accepted and AWS is finishing setup. - `available`: the endpoint is fully provisioned and ready to use. - `rejected`: the endpoint service owner rejected the connection. - `failed`: the endpoint could not be provisioned. - `deleting`: the endpoint is being deleted.", + "example": "available" + }, + "statusMessage": { + "type": "string", + "description": "A human-readable explanation of why the endpoint could not be provisioned. Only set when `status` is `failed`, and absent for every other status including `rejected`, since AWS does not report a rejection reason.", + "example": "Endpoint did not become available in time. Try deleting and recreating, or visit https://vercel.com/help if the issue persists." + }, + "createdAt": { + "type": "number", + "description": "Timestamp in milliseconds since the UNIX epoch for when the endpoint was created.", + "example": 1610963878358 + }, + "updatedAt": { + "type": "number", + "description": "Timestamp in milliseconds since the UNIX epoch for when the endpoint was last updated.", + "example": 1610963878358 + } + }, + "required": [ + "awsServiceName", + "createdAt", + "endpointId", + "name", + "projectId", + "status", + "teamId", + "updatedAt", + "vercelRegion" + ], + "type": "object", + "description": "A PrivateLink endpoint, which connects a project to an AWS VPC endpoint service in a single region so that traffic reaches the service over AWS PrivateLink rather than the public internet." + }, + "ConnectTriggerConfiguration": { + "properties": { + "enabled": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether incoming triggers are enabled for the connector." + } + }, + "required": [ + "enabled" + ], + "type": "object", + "description": "Incoming trigger configuration. Only present when enabled." + }, + "ConnectTriggerDestination": { + "properties": { + "projectId": { + "type": "string", + "description": "Vercel project that receives matching trigger requests." + }, + "customEnvironmentId": { + "type": "string", + "description": "Stable custom-environment ID to route this destination to. Mutually exclusive with `branch`; omitted destinations keep the legacy production behavior." + }, + "branch": { + "type": "string", + "description": "Git branch used to select a preview deployment." + }, + "path": { + "type": "string", + "description": "Route path that receives the forwarded trigger request." + } + }, + "required": [ + "projectId" + ], + "type": "object", + "description": "Destinations that incoming triggers should be forwarded to. Limited to 3 entries. Set the initial destination with `triggerDestination` during creation. Replace the complete set with `PATCH /v1/connect/connectors/{connector}/trigger-destinations`." + }, + "ConnectConnector": { + "properties": { + "id": { + "type": "string", + "description": "Stable `scl_` connector ID. Use this value directly in `{connector}`." + }, + "uid": { + "type": "string", + "description": "Team-scoped UID. URL-encode this value before using it in `{connector}`." + }, + "defaultInstallationId": { + "type": "string", + "description": "Installation used when a token request does not specify an installation." + }, + "createdAt": { + "type": "number", + "description": "Creation time in epoch milliseconds." + }, + "updatedAt": { + "type": "number", + "description": "Last update time in epoch milliseconds." + }, + "reinstallAt": { + "type": "number", + "description": "Time when this connector started requiring reinstallation because an installation-affecting app-token grant changed." + }, + "createdBy": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "user" + ], + "description": "Principal kind." + }, + "id": { + "type": "string", + "description": "Vercel user ID." + } + }, + "required": [ + "id", + "type" + ], + "type": "object", + "description": "Principal that originally created the connector — either a Vercel user (interactive dashboard / CLI flow) or a Vercel deployment (OIDC-authenticated project, used by runtime auto-provisioning). See {@link ConnexPrincipal}. Optional: pre-existing rows from before this shape was introduced may carry no attribution at all." + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "project" + ], + "description": "Principal kind." + }, + "id": { + "type": "string", + "description": "Vercel project ID." + }, + "environment": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "string", + "enum": [ + "development", + "preview", + "production" + ] + } + ], + "description": "Deployment environment of the project principal." + } + }, + "required": [ + "environment", + "id", + "type" + ], + "type": "object", + "description": "Principal that originally created the connector — either a Vercel user (interactive dashboard / CLI flow) or a Vercel deployment (OIDC-authenticated project, used by runtime auto-provisioning). See {@link ConnexPrincipal}. Optional: pre-existing rows from before this shape was introduced may carry no attribution at all." + } + ], + "description": "Principal that created the connector." + }, + "updatedBy": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "user" + ], + "description": "Principal kind." + }, + "id": { + "type": "string", + "description": "Vercel user ID." + } + }, + "required": [ + "id", + "type" + ], + "type": "object", + "description": "Principal that most recently mutated the connector. Same shape as {@link createdBy} but tracks the most recent updater, not the original creator. At create time the two fields point at the same principal; they diverge on the first subsequent update." + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "project" + ], + "description": "Principal kind." + }, + "id": { + "type": "string", + "description": "Vercel project ID." + }, + "environment": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "string", + "enum": [ + "development", + "preview", + "production" + ] + } + ], + "description": "Deployment environment of the project principal." + } + }, + "required": [ + "environment", + "id", + "type" + ], + "type": "object", + "description": "Principal that most recently mutated the connector. Same shape as {@link createdBy} but tracks the most recent updater, not the original creator. At create time the two fields point at the same principal; they diverge on the first subsequent update." + } + ], + "description": "Principal that most recently updated the connector." + }, + "creationMode": { + "type": "string", + "enum": [ + "managed", + "manual" + ], + "description": "How the connector row was originally created. New create paths stamp this explicitly; older rows may omit it." + }, + "managed": { + "properties": { + "sync": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether Vercel synchronizes provider-side configuration." + } + }, + "type": "object", + "description": "Managed connector metadata exposed without leaking the manager connector or installation identifiers." + }, + "type": { + "type": "string", + "enum": [ + "api-key", + "aws-alpha", + "custom", + "discord", + "github", + "linear", + "linq", + "microsoft-entra", + "microsoft-teams", + "oauth", + "photon", + "salesforce", + "sendblue", + "slack", + "snowflake", + "snowflake-wif" + ], + "description": "Connector implementation type." + }, + "service": { + "type": "string", + "description": "Best-effort identifier of the third-party service this connector represents, independent of `type`. Examples: `'slack'`, `'mcp.linear.app'`, and `'auth.example.com'`. Always present in API responses." + }, + "connectionMethod": { + "type": "string", + "description": "The connection method this connector was created from, when the create request named one." + }, + "target": { + "type": "string", + "description": "Which of the service's products/surfaces this connector points at." + }, + "name": { + "type": "string", + "description": "Connector name within the owning team." + }, + "displayName": { + "type": "string", + "description": "Human-readable connector name." + }, + "clientUrl": { + "nullable": true, + "type": "string", + "description": "Provider-side URL for viewing or managing the resource represented by the connector. The destination can be an app, account, phone line, or service instance, depending on the connector type." + }, + "redirectUri": { + "type": "string", + "description": "Redirect URI registered with the third-party service for this connector, if any. Used by `startAuthorization`/`startInstallation` to replay the exact URI back to the provider's token endpoint. Absent on connectors created before this field was introduced; those callers fall back to the `https://connect.vercel.com/callback` default." + }, + "typeName": { + "type": "string", + "description": "Human-readable name of the connector type." + }, + "typeIcon": { + "type": "string", + "description": "Icon identifier supplied by the connector type." + }, + "website": { + "type": "string", + "description": "Public website for the connected service." + }, + "devsite": { + "type": "string", + "description": "Developer website for the connected service." + }, + "docsite": { + "type": "string", + "description": "Developer documentation for the connected service." + }, + "icon": { + "type": "string", + "description": "Connector branding icon. SHA-1 hash that resolves to the uploaded icon through the Vercel avatar service. Consumers render this with `https://vercel.com/api/www/avatar/{icon}`." + }, + "backgroundColor": { + "type": "string", + "description": "Hex background color (e.g., `#000000`) for branding." + }, + "accentColor": { + "type": "string", + "description": "Hex accent color (e.g., `#000000`) for branding." + }, + "supportedSubjectTypes": { + "items": { + "type": "string" + }, + "type": "array", + "description": "Token subject types supported by the connector." + }, + "appTokens": { + "properties": { + "crossInstallation": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether one app token can be used across installations." + }, + "supportsRefinement": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether callers can narrow app-token grants per request." + }, + "supportsResources": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether callers can request resource-specific app tokens." + }, + "requiresReinstallation": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "True when changing app token grants requires reinstalling the app, so tokens cannot be partitioned independently by requester environment." + }, + "scopes": { + "items": { + "type": "string" + }, + "type": "array", + "description": "Known allowed app-level scopes. For Slack this is the bot scope set configured on the app; for OAuth it is the connector's enabled `clientCredentials.scopes` configuration." + }, + "supportedAuthorizationDetails": { + "items": { + "type": "string" + }, + "type": "array", + "description": "Supported OAuth authorization-detail type names." + }, + "permissionsUrl": { + "type": "string", + "description": "Link to the page on the service where this connector's app-level permissions are declared and granted, when the service has one and it differs from `clientUrl`." + } + }, + "required": [ + "crossInstallation", + "supportsRefinement" + ], + "type": "object", + "description": "App-token capabilities and known grants for the connector." + }, + "userTokens": { + "properties": { + "crossInstallation": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether one user token can be used across installations." + }, + "supportsRefinement": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether callers can narrow user-token grants per request." + }, + "supportsResources": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether callers can request resource-specific user tokens." + }, + "scopes": { + "items": { + "type": "string" + }, + "type": "array", + "description": "Known allowed user-level scopes. For Slack this is the user scope set configured on the app; for OAuth it is the connector's enabled `userAuthorization.scopes` configuration." + }, + "supportedAuthorizationDetails": { + "items": { + "type": "string" + }, + "type": "array", + "description": "Supported OAuth authorization-detail type names." + }, + "manualCredentialInput": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "User authorization is completed by the Connect consent screen submitting a credential instead of an OAuth redirect." + } + }, + "required": [ + "crossInstallation", + "supportsRefinement" + ], + "type": "object", + "description": "User-token capabilities and known grants for the connector." + }, + "supportsInstallation": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether the connector supports an installation flow." + }, + "supportsRevocation": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether Connect can revoke tokens for this connector." + }, + "supportsTriggers": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether this connector type supports trigger webhooks. Derived from the type definition; indicates that `triggers` and `triggerDestinations` may be meaningful for this connector." + }, + "supportsIcon": { + "enum": [ + false, + "maybe", + true + ], + "description": "Whether the connector icon can propagate to the provider." + }, + "triggers": { + "$ref": "#/components/schemas/ConnectTriggerConfiguration", + "description": "Incoming trigger configuration for the connector." + }, + "events": { + "items": { + "type": "string" + }, + "type": "array", + "description": "Known events this connector subscribes to (e.g. Slack bot events, GitHub webhook events). Names are type-specific and validated by the managed-create flow when forwarded to the third-party service." + }, + "triggerDestinations": { + "items": { + "$ref": "#/components/schemas/ConnectTriggerDestination" + }, + "type": "array", + "description": "Destinations that incoming triggers should be forwarded to. Limited to 3 entries. Set the initial destination with `triggerDestination` during creation. Replace the complete set with `PATCH /v1/connect/connectors/{connector}/trigger-destinations`." + } + }, + "required": [ + "createdAt", + "displayName", + "id", + "name", + "service", + "supportedSubjectTypes", + "supportsIcon", + "supportsInstallation", + "supportsRevocation", + "supportsTriggers", + "type", + "typeName", + "uid", + "updatedAt" + ], + "type": "object", + "description": "A connector that defines how Vercel accesses an external service." + }, + "ConnectPagination": { + "properties": { + "next": { + "nullable": true, + "type": "string", + "description": "Opaque value to pass as `cursor` on the next request." + } + }, + "required": [ + "next" + ], + "type": "object", + "description": "Cursor for the next page." + }, + "ConnectConnectorList": { + "properties": { + "connectors": { + "items": { + "$ref": "#/components/schemas/ConnectConnector" + }, + "type": "array", + "description": "Connectors in this page." + }, + "pagination": { + "$ref": "#/components/schemas/ConnectPagination", + "description": "Cursor for the next page." + } + }, + "required": [ + "connectors", + "pagination" + ], + "type": "object", + "description": "Page of connectors." + }, + "ConnectConnectorCreateResult": { + "properties": { + "id": { + "type": "string", + "description": "Stable `scl_` connector ID. Use this value directly in `{connector}`." + }, + "uid": { + "type": "string", + "description": "Team-scoped UID. URL-encode this value before using it in `{connector}`." + }, + "defaultInstallationId": { + "type": "string", + "description": "Installation used when a token request does not specify an installation." + }, + "createdAt": { + "type": "number", + "description": "Creation time in epoch milliseconds." + }, + "updatedAt": { + "type": "number", + "description": "Last update time in epoch milliseconds." + }, + "reinstallAt": { + "type": "number", + "description": "Time when this connector started requiring reinstallation because an installation-affecting app-token grant changed." + }, + "createdBy": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "user" + ], + "description": "Principal kind." + }, + "id": { + "type": "string", + "description": "Vercel user ID." + } + }, + "required": [ + "id", + "type" + ], + "type": "object", + "description": "Principal that originally created the connector — either a Vercel user (interactive dashboard / CLI flow) or a Vercel deployment (OIDC-authenticated project, used by runtime auto-provisioning). See {@link ConnexPrincipal}. Optional: pre-existing rows from before this shape was introduced may carry no attribution at all." + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "project" + ], + "description": "Principal kind." + }, + "id": { + "type": "string", + "description": "Vercel project ID." + }, + "environment": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "string", + "enum": [ + "development", + "preview", + "production" + ], + "x-speakeasy-name-override": "created_by_environment" + } + ], + "description": "Deployment environment of the project principal.", + "title": "CreatedByEnvironmentTarget" + } + }, + "required": [ + "environment", + "id", + "type" + ], + "type": "object", + "description": "Principal that originally created the connector — either a Vercel user (interactive dashboard / CLI flow) or a Vercel deployment (OIDC-authenticated project, used by runtime auto-provisioning). See {@link ConnexPrincipal}. Optional: pre-existing rows from before this shape was introduced may carry no attribution at all." + } + ], + "description": "Principal that created the connector." + }, + "updatedBy": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "user" + ], + "description": "Principal kind." + }, + "id": { + "type": "string", + "description": "Vercel user ID." + } + }, + "required": [ + "id", + "type" + ], + "type": "object", + "description": "Principal that most recently mutated the connector. Same shape as {@link createdBy} but tracks the most recent updater, not the original creator. At create time the two fields point at the same principal; they diverge on the first subsequent update." + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "project" + ], + "description": "Principal kind." + }, + "id": { + "type": "string", + "description": "Vercel project ID." + }, + "environment": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "string", + "enum": [ + "development", + "preview", + "production" + ], + "x-speakeasy-name-override": "updated_by_environment" + } + ], + "description": "Deployment environment of the project principal.", + "title": "UpdatedByEnvironmentTarget" + } + }, + "required": [ + "environment", + "id", + "type" + ], + "type": "object", + "description": "Principal that most recently mutated the connector. Same shape as {@link createdBy} but tracks the most recent updater, not the original creator. At create time the two fields point at the same principal; they diverge on the first subsequent update." + } + ], + "description": "Principal that most recently updated the connector." + }, + "creationMode": { + "type": "string", + "enum": [ + "managed", + "manual" + ], + "description": "How the connector row was originally created. New create paths stamp this explicitly; older rows may omit it." + }, + "managed": { + "properties": { + "sync": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether Vercel synchronizes provider-side configuration." + } + }, + "type": "object", + "description": "Managed connector metadata exposed without leaking the manager connector or installation identifiers." + }, + "type": { + "type": "string", + "enum": [ + "api-key", + "aws-alpha", + "custom", + "discord", + "github", + "linear", + "linq", + "microsoft-entra", + "microsoft-teams", + "oauth", + "photon", + "salesforce", + "sendblue", + "slack", + "snowflake", + "snowflake-wif" + ], + "description": "Connector implementation type." + }, + "service": { + "type": "string", + "description": "Best-effort identifier of the third-party service this connector represents, independent of `type`. Examples: `'slack'`, `'mcp.linear.app'`, and `'auth.example.com'`. Always present in API responses." + }, + "connectionMethod": { + "type": "string", + "description": "The connection method this connector was created from, when the create request named one." + }, + "target": { + "type": "string", + "description": "Which of the service's products/surfaces this connector points at." + }, + "name": { + "type": "string", + "description": "Connector name within the owning team." + }, + "displayName": { + "type": "string", + "description": "Human-readable connector name." + }, + "clientUrl": { + "nullable": true, + "type": "string", + "description": "Provider-side URL for viewing or managing the resource represented by the connector. The destination can be an app, account, phone line, or service instance, depending on the connector type." + }, + "redirectUri": { + "type": "string", + "description": "Redirect URI registered with the third-party service for this connector, if any. Used by `startAuthorization`/`startInstallation` to replay the exact URI back to the provider's token endpoint. Absent on connectors created before this field was introduced; those callers fall back to the `https://connect.vercel.com/callback` default." + }, + "typeName": { + "type": "string", + "description": "Human-readable name of the connector type." + }, + "typeIcon": { + "type": "string", + "description": "Icon identifier supplied by the connector type." + }, + "website": { + "type": "string", + "description": "Public website for the connected service." + }, + "devsite": { + "type": "string", + "description": "Developer website for the connected service." + }, + "docsite": { + "type": "string", + "description": "Developer documentation for the connected service." + }, + "icon": { + "type": "string", + "description": "Connector branding icon. SHA-1 hash that resolves to the uploaded icon through the Vercel avatar service. Consumers render this with `https://vercel.com/api/www/avatar/{icon}`." + }, + "backgroundColor": { + "type": "string", + "description": "Hex background color (e.g., `#000000`) for branding." + }, + "accentColor": { + "type": "string", + "description": "Hex accent color (e.g., `#000000`) for branding." + }, + "supportedSubjectTypes": { + "items": { + "type": "string" + }, + "type": "array", + "description": "Token subject types supported by the connector." + }, + "appTokens": { + "properties": { + "crossInstallation": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether one app token can be used across installations." + }, + "supportsRefinement": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether callers can narrow app-token grants per request." + }, + "supportsResources": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether callers can request resource-specific app tokens." + }, + "requiresReinstallation": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "True when changing app token grants requires reinstalling the app, so tokens cannot be partitioned independently by requester environment." + }, + "scopes": { + "items": { + "type": "string" + }, + "type": "array", + "description": "Known allowed app-level scopes. For Slack this is the bot scope set configured on the app; for OAuth it is the connector's enabled `clientCredentials.scopes` configuration." + }, + "supportedAuthorizationDetails": { + "items": { + "type": "string" + }, + "type": "array", + "description": "Supported OAuth authorization-detail type names." + }, + "permissionsUrl": { + "type": "string", + "description": "Link to the page on the service where this connector's app-level permissions are declared and granted, when the service has one and it differs from `clientUrl`." + } + }, + "required": [ + "crossInstallation", + "supportsRefinement" + ], + "type": "object", + "description": "App-token capabilities and known grants for the connector." + }, + "userTokens": { + "properties": { + "crossInstallation": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether one user token can be used across installations." + }, + "supportsRefinement": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether callers can narrow user-token grants per request." + }, + "supportsResources": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether callers can request resource-specific user tokens." + }, + "scopes": { + "items": { + "type": "string" + }, + "type": "array", + "description": "Known allowed user-level scopes. For Slack this is the user scope set configured on the app; for OAuth it is the connector's enabled `userAuthorization.scopes` configuration." + }, + "supportedAuthorizationDetails": { + "items": { + "type": "string" + }, + "type": "array", + "description": "Supported OAuth authorization-detail type names." + }, + "manualCredentialInput": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "User authorization is completed by the Connect consent screen submitting a credential instead of an OAuth redirect." + } + }, + "required": [ + "crossInstallation", + "supportsRefinement" + ], + "type": "object", + "description": "User-token capabilities and known grants for the connector." + }, + "supportsInstallation": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether the connector supports an installation flow." + }, + "supportsRevocation": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether Connect can revoke tokens for this connector." + }, + "supportsTriggers": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether this connector type supports trigger webhooks. Derived from the type definition; indicates that `triggers` and `triggerDestinations` may be meaningful for this connector." + }, + "supportsIcon": { + "enum": [ + false, + "maybe", + true + ], + "description": "Whether the connector icon can propagate to the provider." + }, + "triggers": { + "$ref": "#/components/schemas/ConnectTriggerConfiguration", + "description": "Incoming trigger configuration for the connector." + }, + "events": { + "items": { + "type": "string" + }, + "type": "array", + "description": "Known events this connector subscribes to (e.g. Slack bot events, GitHub webhook events). Names are type-specific and validated by the managed-create flow when forwarded to the third-party service." + }, + "triggerDestinations": { + "items": { + "$ref": "#/components/schemas/ConnectTriggerDestination" + }, + "type": "array", + "description": "Destinations that incoming triggers should be forwarded to. Limited to 3 entries. Set the initial destination with `triggerDestination` during creation. Replace the complete set with `PATCH /v1/connect/connectors/{connector}/trigger-destinations`." + } + }, + "required": [ + "createdAt", + "displayName", + "id", + "name", + "service", + "supportedSubjectTypes", + "supportsIcon", + "supportsInstallation", + "supportsRevocation", + "supportsTriggers", + "type", + "typeName", + "uid", + "updatedAt" + ], + "type": "object", + "description": "Connector created by the request." + }, + "ConnectConnectorCreateData": { + "description": "Provider configuration. With type, provide the complete configuration for that type. With service and connectionMethod, provide only credentials and preferences; Connect supplies the type, endpoints, templates, and defaults. Other connector types accept an arbitrary object.", + "anyOf": [ + { + "type": "object", + "properties": { + "serverUrl": { + "type": "string", + "description": "Authorization server base URL used for discovery." + }, + "serverConfig": { + "description": "Authorization server metadata. Values override discovered metadata. Empty known string fields remove their stored overrides.", + "type": "object", + "properties": { + "issuer": { + "type": "string", + "description": "Authorization server issuer URL." + }, + "authorization_endpoint": { + "type": "string", + "description": "OAuth authorization endpoint URL." + }, + "token_endpoint": { + "type": "string", + "description": "OAuth token endpoint URL." + }, + "userinfo_endpoint": { + "type": "string", + "description": "OpenID Connect UserInfo endpoint URL." + }, + "jwks_uri": { + "type": "string", + "description": "URL of the authorization server JSON Web Key Set." + }, + "jwks": { + "description": "Inline authorization server JSON Web Key Set.", + "type": "object", + "properties": { + "keys": { + "type": "array", + "items": { + "type": "object", + "properties": { + "kty": { + "type": "string", + "description": "JSON Web Key type." + }, + "kid": { + "type": "string", + "description": "JSON Web Key identifier." + }, + "use": { + "type": "string", + "enum": [ + "sig", + "enc" + ], + "description": "Intended key use: signing or encryption." + }, + "key_ops": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Operations permitted for this key." + }, + "alg": { + "type": "string", + "description": "Algorithm intended for this key." + } + }, + "required": [ + "kty" + ], + "additionalProperties": true + }, + "description": "JSON Web Keys published by the authorization server." + } + }, + "required": [ + "keys" + ], + "additionalProperties": true + }, + "revocation_endpoint": { + "type": "string", + "description": "OAuth token revocation endpoint URL." + }, + "introspection_endpoint": { + "type": "string", + "description": "OAuth token introspection endpoint URL." + }, + "end_session_endpoint": { + "type": "string", + "description": "OpenID Connect session termination endpoint URL." + }, + "device_authorization_endpoint": { + "type": "string", + "description": "OAuth device authorization endpoint URL." + }, + "registration_endpoint": { + "type": "string", + "description": "OAuth dynamic client registration endpoint URL." + }, + "response_types_supported": { + "type": "array", + "items": { + "type": "string" + }, + "description": "OAuth response types supported by the server." + }, + "token_endpoint_auth_methods_supported": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Token endpoint client authentication methods supported by the server." + }, + "token_endpoint_auth_signing_alg_values_supported": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Signing algorithms supported for token endpoint authentication." + }, + "scopes_supported": { + "type": "array", + "items": { + "type": "string" + }, + "description": "OAuth scopes supported by the server." + }, + "grant_types_supported": { + "type": "array", + "items": { + "type": "string" + }, + "description": "OAuth grant types supported by the server." + }, + "response_modes_supported": { + "type": "array", + "items": { + "type": "string" + }, + "description": "OAuth response modes supported by the server." + }, + "subject_types_supported": { + "type": "array", + "items": { + "type": "string" + }, + "description": "OpenID Connect subject identifier types supported by the server." + }, + "id_token_signing_alg_values_supported": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Signing algorithms supported for ID tokens." + }, + "id_token_encryption_alg_values_supported": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Key management algorithms supported for encrypted ID tokens." + }, + "id_token_encryption_enc_values_supported": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Content encryption algorithms supported for encrypted ID tokens." + }, + "claim_types_supported": { + "type": "array", + "items": { + "type": "string" + }, + "description": "OpenID Connect claim value types supported by the server." + }, + "claims_supported": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Claims that the authorization server can return." + }, + "code_challenge_methods_supported": { + "type": "array", + "items": { + "type": "string" + }, + "description": "PKCE code challenge methods supported by the server." + }, + "prompt_values_supported": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Authorization prompt values supported by the server." + }, + "claims_parameter_supported": { + "type": "boolean", + "description": "Whether authorization requests can use the claims parameter." + }, + "request_parameter_supported": { + "type": "boolean", + "description": "Whether authorization requests can use signed request objects." + }, + "request_uri_parameter_supported": { + "type": "boolean", + "description": "Whether authorization requests can use request_uri." + }, + "require_request_uri_registration": { + "type": "boolean", + "description": "Whether request_uri values must be registered in advance." + }, + "service_documentation": { + "type": "string", + "description": "Authorization server documentation URL." + }, + "op_policy_uri": { + "type": "string", + "description": "Authorization server privacy policy URL." + }, + "op_tos_uri": { + "type": "string", + "description": "Authorization server terms of service URL." + }, + "logo_uri": { + "type": "string", + "description": "Authorization server logo URL." + }, + "client_id_metadata_document_supported": { + "type": "boolean", + "description": "Whether the server supports OAuth client ID metadata documents." + }, + "authorization_details_types_supported": { + "type": "array", + "items": { + "type": "string" + }, + "description": "OAuth authorization-detail types supported by the server." + } + }, + "additionalProperties": true, + "default": {} + }, + "clientId": { + "type": "string", + "description": "OAuth client ID assigned by the provider." + }, + "clientName": { + "type": "string", + "description": "OAuth client name." + }, + "clientSecret": { + "type": "string", + "description": "OAuth client secret.", + "writeOnly": true + }, + "tokenEndpointAuthMethod": { + "type": "string", + "description": "OAuth token endpoint authentication method. Common values are client_secret_post, client_secret_basic, none, and private_key_jwt. If omitted, Vercel selects a supported method from serverConfig and otherwise uses client_secret_post." + }, + "responseType": { + "type": "string", + "description": "OAuth authorization response type. Defaults to code. Other provider-supported values are accepted. An empty string clears the configured type." + }, + "pkceRequired": { + "type": "boolean", + "description": "Whether user authorization must use PKCE." + }, + "codeChallengeMethod": { + "type": "string", + "description": "PKCE code challenge method. Supported values are S256 and plain. Vercel prefers S256 when the provider supports it. An empty string clears the configured method." + }, + "userAuthorization": { + "description": "User authorization grant settings.", + "type": "object", + "properties": { + "enabled": { + "type": "boolean", + "description": "Whether this OAuth grant is enabled." + }, + "scopes": { + "type": "array", + "description": "Default scopes to request when token params specify scopes: [\\\"*\\\"].", + "items": { + "type": "string" + } + } + }, + "required": [ + "enabled" + ], + "additionalProperties": false + }, + "refreshTokens": { + "description": "Refresh token settings.", + "type": "object", + "properties": { + "enabled": { + "type": "boolean", + "description": "Whether this OAuth grant is enabled." + } + }, + "required": [ + "enabled" + ], + "additionalProperties": false + }, + "clientCredentials": { + "description": "Client credentials grant settings.", + "type": "object", + "properties": { + "enabled": { + "type": "boolean", + "description": "Whether this OAuth grant is enabled." + }, + "scopes": { + "type": "array", + "description": "Default scopes to request when token params specify scopes: [\\\"*\\\"].", + "items": { + "type": "string" + } + } + }, + "required": [ + "enabled" + ], + "additionalProperties": false + }, + "forwardedClaims": { + "type": "object", + "additionalProperties": false, + "description": "Allow-list of extra claims to propagate, keyed by source (idToken). Only claims named here and present in that source are exposed.", + "properties": { + "idToken": { + "type": "array", + "items": { + "type": "string" + }, + "description": "ID token claim names that Connect can expose." + } + } + }, + "defaultAudience": { + "type": "string", + "description": "Default audience used when a token request omits one. An empty string clears the default." + }, + "defaultTokenExpiresIn": { + "type": "number", + "minimum": 60, + "description": "Default token lifetime in seconds to use when the token response omits expires_in." + }, + "authorizationUrlParams": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "description": "Extra query parameters added to authorization URLs." + }, + "jwtBearer": { + "description": "JWT bearer grant settings.", + "type": "object", + "properties": { + "enabled": { + "type": "boolean", + "description": "Whether JWT bearer grants are enabled." + }, + "scopes": { + "type": "array", + "description": "Default scopes to request when token params specify scopes: [\\\"*\\\"].", + "items": { + "type": "string" + } + }, + "sub": { + "type": "string", + "description": "Default JWT subject claim." + }, + "iss": { + "type": "string", + "description": "Default JWT issuer claim." + }, + "aud": { + "type": "string", + "description": "Default JWT audience claim." + }, + "additionalClaims": { + "type": "object", + "additionalProperties": {}, + "description": "Additional claims included in generated JWT assertions." + }, + "ttl": { + "type": "number", + "description": "JWT lifetime in seconds.", + "minimum": 0, + "exclusiveMinimum": true + }, + "useClientCredentials": { + "type": "boolean", + "description": "Whether JWT bearer requests also use client credentials." + } + }, + "additionalProperties": false + }, + "clientAssertion": { + "description": "`private_key_jwt` client assertion settings.", + "type": "object", + "additionalProperties": false, + "properties": { + "type": { + "type": "string", + "description": "OAuth client assertion type. Defaults to urn:ietf:params:oauth:client-assertion-type:jwt-bearer. An empty string clears the configured type." + }, + "ttl": { + "type": "number", + "description": "Client assertion lifetime in seconds.", + "minimum": 0, + "exclusiveMinimum": true + }, + "claims": { + "type": "object", + "additionalProperties": {}, + "description": "Additional claims included in the client assertion." + } + } + } + }, + "required": [ + "clientId" + ], + "additionalProperties": false, + "title": "type:oauth" + }, + { + "type": "object", + "properties": { + "subjectType": { + "type": "string", + "enum": [ + "app", + "user" + ], + "description": "Which subject the connector issues tokens for. Defaults to \\\"app\\\" (connector-level keys). \\\"user\\\" connectors store no connector-level values; each user supplies their own key during authorization." + }, + "values": { + "type": "array", + "items": { + "type": "object", + "properties": { + "value": { + "type": "string", + "description": "API key value.", + "writeOnly": true + }, + "scope": { + "type": "string", + "description": "Optional scope associated with the API key value." + }, + "expiresAt": { + "type": "integer", + "description": "The timestamp when the API key value expires in milliseconds.", + "minimum": 0, + "exclusiveMinimum": true + } + }, + "required": [ + "value" + ], + "additionalProperties": false + }, + "description": "Initial API key values stored by the connector." + }, + "serviceUrls": { + "type": "array", + "minItems": 1, + "maxItems": 8, + "items": { + "type": "string", + "format": "uri" + }, + "description": "The HTTPS resources the API key authenticates against." + }, + "instructions": { + "type": "string", + "maxLength": 4000, + "description": "Markdown instructions shown to each user on the authorization screen, explaining how to obtain the key they should paste." + } + }, + "additionalProperties": false, + "title": "type:api-key" + }, + { + "type": "object", + "properties": { + "appId": { + "type": "integer", + "description": "GitHub App numeric ID.", + "minimum": 0, + "exclusiveMinimum": true + }, + "appSlug": { + "type": "string", + "description": "GitHub App slug." + }, + "appName": { + "type": "string", + "description": "GitHub App display name." + }, + "clientId": { + "type": "string", + "description": "OAuth client ID assigned by GitHub." + }, + "owner": { + "description": "GitHub App owner.", + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "user", + "organization", + "User", + "Organization" + ], + "description": "GitHub App owner type." + }, + "id": { + "type": "integer", + "description": "GitHub App owner numeric ID." + }, + "slug": { + "type": "string", + "description": "GitHub App owner login." + }, + "name": { + "type": "string", + "description": "GitHub App owner display name." + } + }, + "required": [ + "type", + "id", + "slug" + ], + "additionalProperties": false + }, + "clientSecret": { + "type": "string", + "description": "GitHub App OAuth client secret.", + "writeOnly": true + }, + "privateKeyPem": { + "type": "string", + "description": "GitHub App private key in PEM format.", + "writeOnly": true + }, + "webhookSecret": { + "type": "string", + "description": "GitHub App webhook secret.", + "writeOnly": true + }, + "extras": { + "type": "object", + "additionalProperties": {}, + "description": "Additional provider metadata stored with the connector." + } + }, + "required": [ + "appId", + "appSlug", + "appName", + "clientId" + ], + "additionalProperties": false, + "title": "type:github" + }, + { + "type": "object", + "properties": { + "appId": { + "type": "string", + "description": "Linear application ID." + }, + "appName": { + "type": "string", + "description": "Linear application name." + }, + "clientId": { + "type": "string", + "description": "OAuth client ID assigned by Linear." + }, + "clientSecret": { + "type": "string", + "description": "Linear OAuth client secret.", + "writeOnly": true + }, + "webhookSecret": { + "type": "string", + "description": "Linear webhook verification secret.", + "writeOnly": true + }, + "appScopes": { + "type": "array", + "items": { + "type": "string" + }, + "description": "OAuth scopes requested for Linear application tokens." + }, + "userScopes": { + "type": "array", + "items": { + "type": "string" + }, + "description": "OAuth scopes requested for Linear user tokens." + }, + "ownerOrganization": { + "description": "Linear organization that owns the OAuth application.", + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "Linear organization ID." + }, + "slug": { + "type": "string", + "description": "Linear organization slug." + }, + "name": { + "type": "string", + "description": "Linear organization name." + }, + "logoUrl": { + "type": "string", + "description": "Linear organization logo URL.", + "nullable": true + } + }, + "required": [ + "id", + "slug", + "name" + ], + "additionalProperties": false + }, + "application": { + "description": "Linear OAuth application metadata.", + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "Linear OAuth application ID." + }, + "clientId": { + "type": "string", + "description": "Linear OAuth client ID." + }, + "name": { + "type": "string", + "description": "Linear OAuth application name." + }, + "description": { + "type": "string", + "description": "Linear OAuth application description.", + "nullable": true + }, + "developer": { + "type": "string", + "description": "Linear OAuth application developer name.", + "nullable": true + }, + "developerUrl": { + "type": "string", + "description": "Linear OAuth application developer URL.", + "nullable": true + }, + "imageUrl": { + "type": "string", + "description": "Linear OAuth application image URL.", + "nullable": true + }, + "redirectUris": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Registered redirect URIs for the Linear OAuth application." + }, + "distribution": { + "type": "string", + "description": "Linear OAuth application distribution mode.", + "nullable": true + }, + "webhookResourceTypes": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Linear resource types delivered to the webhook." + }, + "webhookUrl": { + "type": "string", + "description": "Linear webhook URL.", + "nullable": true + }, + "webhookEnabled": { + "type": "boolean", + "description": "Whether the Linear webhook is enabled." + }, + "createdAt": { + "type": "string", + "description": "Linear OAuth application creation timestamp." + }, + "updatedAt": { + "type": "string", + "description": "Linear OAuth application update timestamp." + } + }, + "required": [ + "id", + "clientId", + "name" + ], + "additionalProperties": false + }, + "extras": { + "type": "object", + "additionalProperties": {}, + "description": "Additional provider metadata stored with the connector." + } + }, + "required": [ + "clientId", + "clientSecret" + ], + "additionalProperties": false, + "title": "type:linear" + }, + { + "type": "object", + "properties": { + "apiToken": { + "type": "string", + "description": "Linq partner API token for the shared line.", + "writeOnly": true + }, + "phoneNumbers": { + "type": "array", + "items": { + "type": "string", + "pattern": "^\\\\+[1-9]\\\\d{1,14}$" + } + } + }, + "required": [ + "apiToken" + ], + "additionalProperties": false, + "title": "type:linq" + }, + { + "type": "object", + "properties": { + "consumerKey": { + "type": "string", + "description": "Salesforce connected app consumer key." + }, + "consumerSecret": { + "type": "string", + "description": "Salesforce connected app consumer secret.", + "writeOnly": true + }, + "loginHost": { + "type": "string", + "description": "Salesforce login host, such as login.salesforce.com." + } + }, + "required": [ + "consumerKey", + "consumerSecret", + "loginHost" + ], + "additionalProperties": false, + "title": "type:salesforce" + }, + { + "type": "object", + "properties": { + "apiKeyId": { + "type": "string", + "description": "Sendblue API key id (`sb-api-key-id`)." + }, + "apiSecretKey": { + "type": "string", + "description": "Sendblue API secret key (`sb-api-secret-key`).", + "writeOnly": true + }, + "phoneNumbers": { + "description": "E.164 Sendblue lines this connector sends and receives on. Used as the connector's display name, and the only lines its webhooks are registered for; an empty array clears them, which also removes the webhook subscription.", + "type": "array", + "items": { + "type": "string", + "pattern": "^\\\\+[1-9]\\\\d{1,14}$" + } + } + }, + "required": [ + "apiKeyId", + "apiSecretKey" + ], + "additionalProperties": false, + "title": "type:sendblue" + }, + { + "type": "object", + "properties": { + "appId": { + "type": "string", + "description": "Slack app ID." + }, + "appName": { + "type": "string", + "description": "Slack app display name." + }, + "clientId": { + "type": "string", + "description": "OAuth client ID assigned by Slack." + }, + "clientSecret": { + "type": "string", + "description": "Slack app OAuth client secret.", + "writeOnly": true + }, + "slackTeam": { + "description": "Slack workspace metadata.", + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "Slack workspace ID." + }, + "name": { + "type": "string", + "description": "Slack workspace name." + }, + "domain": { + "type": "string", + "description": "Slack workspace domain." + } + }, + "required": [ + "id" + ], + "additionalProperties": false + }, + "signingSecret": { + "type": "string", + "description": "Slack request signing secret.", + "writeOnly": true + }, + "verificationToken": { + "type": "string", + "description": "Legacy Slack webhook verification token.", + "writeOnly": true + }, + "botScopes": { + "type": "array", + "items": { + "type": "string" + }, + "description": "OAuth scopes requested for Slack bot tokens." + }, + "userScopes": { + "type": "array", + "items": { + "type": "string" + }, + "description": "OAuth scopes requested for Slack user tokens." + }, + "slashCommands": { + "type": "array", + "maxItems": 50, + "items": { + "type": "object", + "properties": { + "command": { + "type": "string", + "pattern": "^\\\\/", + "maxLength": 32, + "description": "Slash command including its leading slash." + }, + "description": { + "type": "string", + "maxLength": 2000, + "description": "Description shown for the slash command in Slack." + }, + "usageHint": { + "type": "string", + "maxLength": 1000, + "description": "Optional usage hint shown for the slash command." + }, + "shouldEscape": { + "type": "boolean", + "description": "Whether Slack should escape command arguments." + } + }, + "required": [ + "command", + "description" + ], + "additionalProperties": false + }, + "description": "Slash commands configured for the managed Slack app." + }, + "shortcuts": { + "type": "array", + "maxItems": 10, + "items": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "global", + "message" + ], + "description": "Where Slack exposes the shortcut." + }, + "name": { + "type": "string", + "description": "Shortcut display name." + }, + "callbackId": { + "type": "string", + "maxLength": 255, + "description": "Identifier included in the shortcut callback." + }, + "description": { + "type": "string", + "maxLength": 150, + "description": "Description shown for the shortcut in Slack." + } + }, + "required": [ + "type", + "name", + "callbackId", + "description" + ], + "additionalProperties": false + }, + "description": "Global and message shortcuts configured for the Slack app." + }, + "extras": { + "type": "object", + "additionalProperties": {}, + "description": "Additional provider metadata stored with the connector." + } + }, + "required": [ + "appId", + "appName", + "clientId", + "clientSecret" + ], + "additionalProperties": false, + "title": "type:slack" + }, + { + "type": "object", + "properties": { + "clientName": { + "type": "string", + "description": "Snowflake OAuth client name." + }, + "accountIdentifier": { + "type": "string", + "description": "Snowflake account identifier." + }, + "defaultSessionRole": { + "type": "string", + "description": "Default Snowflake role for created sessions." + }, + "extras": { + "type": "object", + "additionalProperties": {}, + "description": "Additional provider metadata stored with the connector." + } + }, + "required": [ + "accountIdentifier" + ], + "additionalProperties": false, + "title": "type:snowflake" + }, + { + "type": "object", + "properties": { + "clientName": { + "type": "string", + "description": "Snowflake client name." + }, + "accountIdentifier": { + "type": "string", + "description": "Snowflake account identifier." + }, + "extras": { + "type": "object", + "additionalProperties": {}, + "description": "Additional provider metadata stored with the connector." + } + }, + "additionalProperties": false, + "title": "type:snowflake-wif" + }, + { + "type": "object", + "properties": { + "projectId": { + "type": "string", + "description": "Photon project ID." + }, + "projectSecret": { + "type": "string", + "description": "Photon project secret.", + "writeOnly": true + }, + "webhookSecret": { + "type": "string", + "description": "Photon webhook verification secret.", + "writeOnly": true + } + }, + "required": [ + "projectId", + "projectSecret" + ], + "additionalProperties": false, + "title": "type:photon" + }, + { + "title": "type:other", + "type": "object", + "additionalProperties": true + } + ] + }, + "ConnectCreateConnectorRequest": { + "type": "object", + "required": [ + "data" + ], + "properties": { + "data": { + "$ref": "#/components/schemas/ConnectConnectorCreateData", + "description": "Provider configuration for the selected connector type or connection method." + }, + "icon": { + "type": "string", + "description": "SHA-1 digest of a PNG or JPEG icon that is at least 640 by 640 pixels. This field does not accept a URL or image bytes.\n\nFirst compute the digest and upload the raw image with [POST /v2/files](https://vercel.com/docs/rest-api/deployments/upload-deployment-files). Send `Content-Length` and the same 40-character digest in `x-vercel-digest`. Then set `icon` to that digest.\n\n```js\nimport { createHash } from 'node:crypto';\nimport { readFile } from 'node:fs/promises';\n\nconst VERCEL_TOKEN = process.env.VERCEL_TOKEN;\nconst connectorId = 'scl_...';\nconst bytes = await readFile('icon.png');\nconst digest = createHash('sha1').update(bytes).digest('hex');\n\nawait fetch('https://api.vercel.com/v2/files', {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${VERCEL_TOKEN}`,\n 'Content-Type': 'application/octet-stream',\n 'Content-Length': String(bytes.length),\n 'x-vercel-digest': digest,\n },\n body: bytes,\n});\n\nawait fetch(`https://api.vercel.com/v2/connect/connectors/${connectorId}`, {\n method: 'PATCH',\n headers: {\n Authorization: `Bearer ${VERCEL_TOKEN}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ icon: digest }),\n});\n```\n", + "pattern": "^[0-9a-fA-F]{40}$" + }, + "backgroundColor": { + "type": "string", + "description": "Branding background color (6-digit hex, for example", + "pattern": "^#[0-9a-fA-F]{6}$" + }, + "accentColor": { + "type": "string", + "description": "Branding accent color (6-digit hex, for example", + "pattern": "^#[0-9a-fA-F]{6}$" + }, + "type": { + "type": "string", + "description": "Connector implementation type for full configuration. Known types: api-key, discord, github, linear, linq, microsoft-entra, oauth, photon, salesforce, sendblue, slack, snowflake, snowflake-wif. Optional when service and connectionMethod select the type." + }, + "service": { + "type": "string", + "description": "Service slug or URL for which the connector is used. Required when connectionMethod is set. Service alone does not enable preset configuration." + }, + "connectionMethod": { + "type": "string", + "maxLength": 64, + "description": "Connection method slug of the service. Use it with service to select preset configuration." + }, + "params": { + "type": "object", + "maxProperties": 16, + "additionalProperties": { + "type": "string", + "maxLength": 256 + }, + "description": "Values for the selected connection method's template fields. Requires connectionMethod." + }, + "target": { + "type": "string", + "maxLength": 64, + "description": "Which of the service's targets this connector is for. Requires \\\"connectionMethod\\\" and must be one that method serves. Optional." + }, + "uid": { + "type": "string", + "description": "Optional team-scoped unique identifier for the connector. If omitted or empty, Connect generates a value." + }, + "name": { + "type": "string", + "description": "Connector name. The value is trimmed and cannot contain control characters. If omitted or empty, the project name is used. A name or projectId is required. API key connectors require name." + }, + "projectId": { + "type": "string", + "description": "Project to connect during creation. If environments is omitted, the connection uses development, preview, and production." + }, + "environments": { + "minItems": 1, + "description": "Environments for the project connection. Requires projectId. Use one or more built-in environment names or stable custom environment IDs that belong to the project. Duplicate values are accepted and removed.", + "type": "array", + "items": { + "anyOf": [ + { + "type": "string", + "enum": [ + "development", + "preview", + "production" + ] + }, + { + "type": "string", + "pattern": "^env_" + } + ], + "description": "A built-in environment name or the stable env_* ID of a custom environment." + } + }, + "triggers": { + "description": "Whether the triggers are enabled for this connector.", + "type": "boolean" + }, + "triggerDestination": { + "description": "Initial trigger destination. Requires triggers to be enabled and a projectId here or at the top level. Connector responses expose the resulting set as triggerDestinations. Replace the complete set with PATCH /v1/connect/connectors/{connector}/trigger-destinations.", + "oneOf": [ + { + "title": "Default deployment", + "type": "object", + "minProperties": 1, + "additionalProperties": false, + "properties": { + "projectId": { + "type": "string", + "description": "Project that receives triggers. During connector creation, omit it to use the top-level projectId.", + "minLength": 1 + }, + "path": { + "type": "string", + "maxLength": 2048, + "description": "Route path on the linked project that receives forwarded trigger requests.", + "minLength": 1 + } + } + }, + { + "title": "Branch", + "type": "object", + "required": [ + "branch" + ], + "additionalProperties": false, + "properties": { + "projectId": { + "type": "string", + "description": "Project that receives triggers. During connector creation, omit it to use the top-level projectId.", + "minLength": 1 + }, + "branch": { + "type": "string", + "maxLength": 250, + "description": "Git branch used to select a preview deployment.", + "minLength": 1 + }, + "path": { + "type": "string", + "maxLength": 2048, + "description": "Route path on the linked project that receives forwarded trigger requests.", + "minLength": 1 + } + } + }, + { + "title": "Custom environment", + "type": "object", + "required": [ + "customEnvironmentId" + ], + "additionalProperties": false, + "properties": { + "projectId": { + "type": "string", + "description": "Project that receives triggers. During connector creation, omit it to use the top-level projectId.", + "minLength": 1 + }, + "customEnvironmentId": { + "description": "Stable custom environment ID that belongs to the destination project.", + "type": "string", + "pattern": "^env_" + }, + "path": { + "type": "string", + "maxLength": 2048, + "description": "Route path on the linked project that receives forwarded trigger requests.", + "minLength": 1 + } + } + } + ] + }, + "events": { + "type": "array", + "description": "Default trigger events for this connector.", + "items": { + "type": "string" + } + } + }, + "description": "Create a connector with full provider configuration or with a known service connection method.", + "anyOf": [ + { + "title": "Full configuration", + "required": [ + "type" + ] + }, + { + "title": "Preset configuration", + "required": [ + "service", + "connectionMethod" + ] + } + ] + }, + "ConnectReconsent": { + "properties": { + "scope": { + "type": "string", + "enum": [ + "user" + ], + "description": "The affected authorization scope. user means each affected user must authorize again." + } + }, + "required": [ + "scope" + ], + "type": "object", + "description": "Existing authorizations no longer cover the connector's configured scopes, so they must be re-authorized." + }, + "ConnectServiceSyncError": { + "properties": { + "message": { + "type": "string", + "description": "Human-readable provider synchronization error." + }, + "fields": { + "items": { + "type": "string" + }, + "type": "array", + "description": "Connector fields that caused the synchronization error." + }, + "vendor": { + "additionalProperties": true, + "type": "object", + "description": "Provider-specific error details that are safe to expose." + } + }, + "required": [ + "message" + ], + "type": "object", + "description": "Provider synchronization errors, when synchronization is required." + }, + "ConnectServiceSync": { + "properties": { + "status": { + "type": "string", + "enum": [ + "done", + "required" + ], + "description": "done means the external service was updated. required means the Vercel update was saved, but provider-side configuration still needs attention." + }, + "errors": { + "items": { + "$ref": "#/components/schemas/ConnectServiceSyncError" + }, + "type": "array", + "description": "Provider synchronization errors. Present when serviceSync.status is required." + } + }, + "required": [ + "status" + ], + "type": "object", + "description": "Provider-side configuration synchronization result." + }, + "ConnectConnectorUpdateResult": { + "properties": { + "connector": { + "$ref": "#/components/schemas/ConnectConnector", + "description": "Updated connector." + }, + "reinstallNeeded": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "When true, prompt a team owner or administrator to reinstall the connector before relying on the change." + }, + "reconsentNeeded": { + "$ref": "#/components/schemas/ConnectReconsent", + "description": "Present when affected users must authorize the connector's new permissions." + }, + "serviceSync": { + "$ref": "#/components/schemas/ConnectServiceSync", + "description": "Result of synchronizing the change with the external service." + } + }, + "required": [ + "connector" + ], + "type": "object", + "description": "Updated connector and any required provider follow-up actions." + }, + "ConnectConnectorUpdateData": { + "description": "Provider configuration fields for the connector type.", + "anyOf": [ + { + "type": "object", + "properties": { + "serverUrl": { + "type": "string", + "description": "Authorization server base URL used for discovery." + }, + "serverConfig": { + "description": "Authorization server metadata. Values override discovered metadata. Empty known string fields remove their stored overrides.", + "type": "object", + "properties": { + "issuer": { + "type": "string", + "description": "Authorization server issuer URL." + }, + "authorization_endpoint": { + "type": "string", + "description": "OAuth authorization endpoint URL." + }, + "token_endpoint": { + "type": "string", + "description": "OAuth token endpoint URL." + }, + "userinfo_endpoint": { + "type": "string", + "description": "OpenID Connect UserInfo endpoint URL." + }, + "jwks_uri": { + "type": "string", + "description": "URL of the authorization server JSON Web Key Set." + }, + "jwks": { + "description": "Inline authorization server JSON Web Key Set.", + "type": "object", + "properties": { + "keys": { + "type": "array", + "items": { + "type": "object", + "properties": { + "kty": { + "type": "string", + "description": "JSON Web Key type." + }, + "kid": { + "type": "string", + "description": "JSON Web Key identifier." + }, + "use": { + "type": "string", + "enum": [ + "sig", + "enc" + ], + "description": "Intended key use: signing or encryption." + }, + "key_ops": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Operations permitted for this key." + }, + "alg": { + "type": "string", + "description": "Algorithm intended for this key." + } + }, + "required": [ + "kty" + ], + "additionalProperties": true + }, + "description": "JSON Web Keys published by the authorization server." + } + }, + "required": [ + "keys" + ], + "additionalProperties": true + }, + "revocation_endpoint": { + "type": "string", + "description": "OAuth token revocation endpoint URL." + }, + "introspection_endpoint": { + "type": "string", + "description": "OAuth token introspection endpoint URL." + }, + "end_session_endpoint": { + "type": "string", + "description": "OpenID Connect session termination endpoint URL." + }, + "device_authorization_endpoint": { + "type": "string", + "description": "OAuth device authorization endpoint URL." + }, + "registration_endpoint": { + "type": "string", + "description": "OAuth dynamic client registration endpoint URL." + }, + "response_types_supported": { + "type": "array", + "items": { + "type": "string" + }, + "description": "OAuth response types supported by the server." + }, + "token_endpoint_auth_methods_supported": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Token endpoint client authentication methods supported by the server." + }, + "token_endpoint_auth_signing_alg_values_supported": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Signing algorithms supported for token endpoint authentication." + }, + "scopes_supported": { + "type": "array", + "items": { + "type": "string" + }, + "description": "OAuth scopes supported by the server." + }, + "grant_types_supported": { + "type": "array", + "items": { + "type": "string" + }, + "description": "OAuth grant types supported by the server." + }, + "response_modes_supported": { + "type": "array", + "items": { + "type": "string" + }, + "description": "OAuth response modes supported by the server." + }, + "subject_types_supported": { + "type": "array", + "items": { + "type": "string" + }, + "description": "OpenID Connect subject identifier types supported by the server." + }, + "id_token_signing_alg_values_supported": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Signing algorithms supported for ID tokens." + }, + "id_token_encryption_alg_values_supported": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Key management algorithms supported for encrypted ID tokens." + }, + "id_token_encryption_enc_values_supported": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Content encryption algorithms supported for encrypted ID tokens." + }, + "claim_types_supported": { + "type": "array", + "items": { + "type": "string" + }, + "description": "OpenID Connect claim value types supported by the server." + }, + "claims_supported": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Claims that the authorization server can return." + }, + "code_challenge_methods_supported": { + "type": "array", + "items": { + "type": "string" + }, + "description": "PKCE code challenge methods supported by the server." + }, + "prompt_values_supported": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Authorization prompt values supported by the server." + }, + "claims_parameter_supported": { + "type": "boolean", + "description": "Whether authorization requests can use the claims parameter." + }, + "request_parameter_supported": { + "type": "boolean", + "description": "Whether authorization requests can use signed request objects." + }, + "request_uri_parameter_supported": { + "type": "boolean", + "description": "Whether authorization requests can use request_uri." + }, + "require_request_uri_registration": { + "type": "boolean", + "description": "Whether request_uri values must be registered in advance." + }, + "service_documentation": { + "type": "string", + "description": "Authorization server documentation URL." + }, + "op_policy_uri": { + "type": "string", + "description": "Authorization server privacy policy URL." + }, + "op_tos_uri": { + "type": "string", + "description": "Authorization server terms of service URL." + }, + "logo_uri": { + "type": "string", + "description": "Authorization server logo URL." + }, + "client_id_metadata_document_supported": { + "type": "boolean", + "description": "Whether the server supports OAuth client ID metadata documents." + }, + "authorization_details_types_supported": { + "type": "array", + "items": { + "type": "string" + }, + "description": "OAuth authorization-detail types supported by the server." + } + }, + "additionalProperties": true, + "default": {} + }, + "clientId": { + "type": "string", + "description": "OAuth client ID." + }, + "clientName": { + "type": "string", + "description": "OAuth client name." + }, + "clientSecret": { + "type": "string", + "description": "OAuth client secret.", + "writeOnly": true + }, + "tokenEndpointAuthMethod": { + "type": "string", + "description": "OAuth token endpoint authentication method. Common values are client_secret_post, client_secret_basic, none, and private_key_jwt. If omitted, Vercel selects a supported method from serverConfig and otherwise uses client_secret_post." + }, + "responseType": { + "type": "string", + "description": "OAuth authorization response type. Defaults to code. Other provider-supported values are accepted. An empty string clears the configured type." + }, + "pkceRequired": { + "type": "boolean", + "description": "Whether user authorization must use PKCE." + }, + "codeChallengeMethod": { + "type": "string", + "description": "PKCE code challenge method. Supported values are S256 and plain. Vercel prefers S256 when the provider supports it. An empty string clears the configured method." + }, + "userAuthorization": { + "description": "User authorization grant settings.", + "type": "object", + "properties": { + "enabled": { + "type": "boolean", + "description": "Whether this OAuth grant is enabled." + }, + "scopes": { + "type": "array", + "description": "Default scopes to request when token params specify scopes: [\\\"*\\\"].", + "items": { + "type": "string" + } + } + }, + "required": [ + "enabled" + ], + "additionalProperties": false + }, + "refreshTokens": { + "description": "Refresh token settings.", + "type": "object", + "properties": { + "enabled": { + "type": "boolean", + "description": "Whether this OAuth grant is enabled." + } + }, + "required": [ + "enabled" + ], + "additionalProperties": false + }, + "clientCredentials": { + "description": "Client credentials grant settings.", + "type": "object", + "properties": { + "enabled": { + "type": "boolean", + "description": "Whether this OAuth grant is enabled." + }, + "scopes": { + "type": "array", + "description": "Default scopes to request when token params specify scopes: [\\\"*\\\"].", + "items": { + "type": "string" + } + } + }, + "required": [ + "enabled" + ], + "additionalProperties": false + }, + "forwardedClaims": { + "type": "object", + "additionalProperties": false, + "description": "Allow-list of extra claims to propagate, keyed by source (idToken). Only claims named here and present in that source are exposed.", + "properties": { + "idToken": { + "type": "array", + "items": { + "type": "string" + }, + "description": "ID token claim names that Connect can expose." + } + } + }, + "defaultAudience": { + "type": "string", + "description": "Default audience used when a token request omits one. An empty string clears the default." + }, + "defaultTokenExpiresIn": { + "type": "number", + "minimum": 60, + "description": "Default token lifetime in seconds to use when the token response omits expires_in." + }, + "authorizationUrlParams": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "description": "Extra query parameters added to authorization URLs." + }, + "jwtBearer": { + "description": "JWT bearer grant settings.", + "type": "object", + "properties": { + "enabled": { + "type": "boolean", + "description": "Whether JWT bearer grants are enabled." + }, + "scopes": { + "type": "array", + "description": "Default scopes to request when token params specify scopes: [\\\"*\\\"].", + "items": { + "type": "string" + } + }, + "sub": { + "type": "string", + "description": "Default JWT subject claim." + }, + "iss": { + "type": "string", + "description": "Default JWT issuer claim." + }, + "aud": { + "type": "string", + "description": "Default JWT audience claim." + }, + "additionalClaims": { + "type": "object", + "additionalProperties": {}, + "description": "Additional claims included in generated JWT assertions." + }, + "ttl": { + "type": "number", + "description": "JWT lifetime in seconds.", + "minimum": 0, + "exclusiveMinimum": true + }, + "useClientCredentials": { + "type": "boolean", + "description": "Whether JWT bearer requests also use client credentials." + } + }, + "additionalProperties": false + }, + "clientAssertion": { + "description": "`private_key_jwt` client assertion settings.", + "type": "object", + "additionalProperties": false, + "properties": { + "type": { + "type": "string", + "description": "OAuth client assertion type. Defaults to urn:ietf:params:oauth:client-assertion-type:jwt-bearer. An empty string clears the configured type." + }, + "ttl": { + "type": "number", + "description": "Client assertion lifetime in seconds.", + "minimum": 0, + "exclusiveMinimum": true + }, + "claims": { + "type": "object", + "additionalProperties": {}, + "description": "Additional claims included in the client assertion." + } + } + } + }, + "additionalProperties": false, + "title": "type:oauth" + }, + { + "type": "object", + "properties": { + "toDelete": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Stored API key value IDs to delete." + }, + "toAdd": { + "type": "array", + "items": { + "type": "object", + "properties": { + "value": { + "type": "string", + "description": "API key value.", + "writeOnly": true + }, + "scope": { + "type": "string", + "description": "Optional scope associated with the API key value." + }, + "expiresAt": { + "type": "integer", + "description": "The timestamp when the API key value expires in milliseconds.", + "minimum": 0, + "exclusiveMinimum": true + } + }, + "required": [ + "value" + ], + "additionalProperties": false + }, + "description": "API key values to add." + }, + "toUpdate": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "Stored API key value ID." + }, + "value": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "string" + } + ], + "description": "Replacement API key value. Use null to keep the stored value.", + "writeOnly": true + }, + "scope": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "string" + } + ], + "description": "Replacement scope. Use null to remove the scope." + }, + "expiresAt": { + "anyOf": [ + { + "type": "integer", + "minimum": 0, + "exclusiveMinimum": true + }, + { + "type": "string" + } + ], + "description": "The timestamp when the API key value expires in milliseconds." + } + }, + "required": [ + "id" + ], + "additionalProperties": false + }, + "description": "Existing API key values to update." + }, + "instructions": { + "anyOf": [ + { + "type": "string", + "maxLength": 4000 + }, + { + "type": "string" + } + ], + "description": "Markdown instructions shown to each user on the authorization screen, explaining how to obtain the key they should paste." + } + }, + "additionalProperties": false, + "title": "type:api-key" + }, + { + "type": "object", + "properties": { + "appId": { + "type": "integer", + "description": "GitHub App numeric ID.", + "minimum": 0, + "exclusiveMinimum": true + }, + "appSlug": { + "type": "string", + "description": "GitHub App slug." + }, + "appName": { + "type": "string", + "description": "GitHub App display name." + }, + "clientId": { + "type": "string", + "description": "GitHub App OAuth client ID." + }, + "owner": { + "description": "GitHub App owner.", + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "user", + "organization", + "User", + "Organization" + ], + "description": "GitHub App owner type." + }, + "id": { + "type": "integer", + "description": "GitHub App owner numeric ID." + }, + "slug": { + "type": "string", + "description": "GitHub App owner login." + }, + "name": { + "type": "string", + "description": "GitHub App owner display name." + } + }, + "required": [ + "type", + "id", + "slug" + ], + "additionalProperties": false + }, + "clientSecret": { + "type": "string", + "description": "GitHub App OAuth client secret.", + "writeOnly": true + }, + "privateKeyPem": { + "type": "string", + "description": "GitHub App private key in PEM format.", + "writeOnly": true + }, + "webhookSecret": { + "type": "string", + "description": "GitHub App webhook secret.", + "writeOnly": true + }, + "extras": { + "type": "object", + "additionalProperties": {}, + "description": "Additional provider metadata stored with the connector." + } + }, + "additionalProperties": false, + "title": "type:github" + }, + { + "type": "object", + "properties": { + "appId": { + "type": "string", + "description": "Linear application ID." + }, + "appName": { + "type": "string", + "description": "Linear application name." + }, + "clientId": { + "type": "string", + "description": "Linear OAuth client ID." + }, + "clientSecret": { + "type": "string", + "description": "Linear OAuth client secret.", + "writeOnly": true + }, + "webhookSecret": { + "type": "string", + "description": "Linear webhook verification secret.", + "writeOnly": true + }, + "appScopes": { + "type": "array", + "items": { + "type": "string" + }, + "description": "OAuth scopes requested for Linear application tokens." + }, + "userScopes": { + "type": "array", + "items": { + "type": "string" + }, + "description": "OAuth scopes requested for Linear user tokens." + }, + "ownerOrganization": { + "description": "Linear organization that owns the OAuth application.", + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "Linear organization ID." + }, + "slug": { + "type": "string", + "description": "Linear organization slug." + }, + "name": { + "type": "string", + "description": "Linear organization name." + }, + "logoUrl": { + "type": "string", + "description": "Linear organization logo URL.", + "nullable": true + } + }, + "required": [ + "id", + "slug", + "name" + ], + "additionalProperties": false + }, + "application": { + "description": "Linear OAuth application metadata.", + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "Linear OAuth application ID." + }, + "clientId": { + "type": "string", + "description": "Linear OAuth client ID." + }, + "name": { + "type": "string", + "description": "Linear OAuth application name." + }, + "description": { + "type": "string", + "description": "Linear OAuth application description.", + "nullable": true + }, + "developer": { + "type": "string", + "description": "Linear OAuth application developer name.", + "nullable": true + }, + "developerUrl": { + "type": "string", + "description": "Linear OAuth application developer URL.", + "nullable": true + }, + "imageUrl": { + "type": "string", + "description": "Linear OAuth application image URL.", + "nullable": true + }, + "redirectUris": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Registered redirect URIs for the Linear OAuth application." + }, + "distribution": { + "type": "string", + "description": "Linear OAuth application distribution mode.", + "nullable": true + }, + "webhookResourceTypes": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Linear resource types delivered to the webhook." + }, + "webhookUrl": { + "type": "string", + "description": "Linear webhook URL.", + "nullable": true + }, + "webhookEnabled": { + "type": "boolean", + "description": "Whether the Linear webhook is enabled." + }, + "createdAt": { + "type": "string", + "description": "Linear OAuth application creation timestamp." + }, + "updatedAt": { + "type": "string", + "description": "Linear OAuth application update timestamp." + } + }, + "required": [ + "id", + "clientId", + "name" + ], + "additionalProperties": false + }, + "extras": { + "type": "object", + "additionalProperties": {}, + "description": "Additional provider metadata stored with the connector." + } + }, + "additionalProperties": false, + "title": "type:linear" + }, + { + "type": "object", + "properties": { + "consumerKey": { + "type": "string", + "description": "Salesforce connected app consumer key." + }, + "consumerSecret": { + "type": "string", + "description": "Salesforce connected app consumer secret.", + "writeOnly": true + }, + "loginHost": { + "type": "string", + "description": "Salesforce login host, such as login.salesforce.com." + } + }, + "additionalProperties": false, + "title": "type:salesforce" + }, + { + "type": "object", + "properties": { + "appId": { + "type": "string", + "description": "Slack app ID." + }, + "appName": { + "type": "string", + "description": "Slack app display name." + }, + "clientId": { + "type": "string", + "description": "Slack app OAuth client ID." + }, + "clientSecret": { + "type": "string", + "description": "Slack app OAuth client secret.", + "writeOnly": true + }, + "slackTeam": { + "description": "Slack workspace metadata.", + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "Slack workspace ID." + }, + "name": { + "type": "string", + "description": "Slack workspace name." + }, + "domain": { + "type": "string", + "description": "Slack workspace domain." + } + }, + "required": [ + "id" + ], + "additionalProperties": false + }, + "signingSecret": { + "type": "string", + "description": "Slack request signing secret.", + "writeOnly": true + }, + "verificationToken": { + "type": "string", + "description": "Legacy Slack webhook verification token.", + "writeOnly": true + }, + "botScopes": { + "type": "array", + "items": { + "type": "string" + }, + "description": "OAuth scopes requested for Slack bot tokens." + }, + "userScopes": { + "type": "array", + "items": { + "type": "string" + }, + "description": "OAuth scopes requested for Slack user tokens." + }, + "slashCommands": { + "type": "array", + "maxItems": 50, + "items": { + "type": "object", + "properties": { + "command": { + "type": "string", + "pattern": "^\\\\/", + "maxLength": 32, + "description": "Slash command including its leading slash." + }, + "description": { + "type": "string", + "maxLength": 2000, + "description": "Description shown for the slash command in Slack." + }, + "usageHint": { + "type": "string", + "maxLength": 1000, + "description": "Optional usage hint shown for the slash command." + }, + "shouldEscape": { + "type": "boolean", + "description": "Whether Slack should escape command arguments." + } + }, + "required": [ + "command", + "description" + ], + "additionalProperties": false + }, + "description": "Slash commands configured for the managed Slack app." + }, + "shortcuts": { + "type": "array", + "maxItems": 10, + "items": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "global", + "message" + ], + "description": "Where Slack exposes the shortcut." + }, + "name": { + "type": "string", + "description": "Shortcut display name." + }, + "callbackId": { + "type": "string", + "maxLength": 255, + "description": "Identifier included in the shortcut callback." + }, + "description": { + "type": "string", + "maxLength": 150, + "description": "Description shown for the shortcut in Slack." + } + }, + "required": [ + "type", + "name", + "callbackId", + "description" + ], + "additionalProperties": false + }, + "description": "Global and message shortcuts configured for the Slack app." + }, + "extras": { + "type": "object", + "additionalProperties": {}, + "description": "Additional provider metadata stored with the connector." + } + }, + "additionalProperties": false, + "title": "type:slack" + }, + { + "type": "object", + "properties": { + "accountIdentifier": { + "type": "string", + "description": "Snowflake account identifier." + }, + "defaultSessionRole": { + "type": "string", + "description": "Default Snowflake role for created sessions." + } + }, + "additionalProperties": false, + "title": "type:snowflake" + }, + { + "type": "object", + "properties": { + "accountIdentifier": { + "type": "string", + "description": "Snowflake account identifier." + } + }, + "additionalProperties": false, + "title": "type:snowflake-wif" + }, + { + "type": "object", + "properties": { + "apiToken": { + "type": "string", + "description": "Linq partner API token for the shared line.", + "writeOnly": true + }, + "phoneNumbers": { + "type": "array", + "items": { + "type": "string", + "pattern": "^\\\\+[1-9]\\\\d{1,14}$" + } + } + }, + "additionalProperties": false, + "title": "type:linq" + }, + { + "type": "object", + "properties": { + "apiKeyId": { + "type": "string", + "description": "Sendblue API key id (`sb-api-key-id`)." + }, + "apiSecretKey": { + "type": "string", + "description": "Sendblue API secret key (`sb-api-secret-key`).", + "writeOnly": true + }, + "phoneNumbers": { + "description": "E.164 Sendblue lines this connector sends and receives on. Used as the connector's display name, and the only lines its webhooks are registered for; an empty array clears them, which also removes the webhook subscription.", + "type": "array", + "items": { + "type": "string", + "pattern": "^\\\\+[1-9]\\\\d{1,14}$" + } + } + }, + "additionalProperties": false, + "title": "type:sendblue" + }, + { + "type": "object", + "properties": { + "projectSecret": { + "type": "string", + "description": "Photon project secret.", + "writeOnly": true + }, + "webhookSecret": { + "type": "string", + "description": "Photon webhook verification secret.", + "writeOnly": true + }, + "repairWebhook": { + "type": "boolean", + "description": "Whether Connect should recreate the Photon webhook." + } + }, + "additionalProperties": false, + "title": "type:photon" + }, + { + "title": "type:other", + "type": "object", + "additionalProperties": true + } + ] + }, + "ConnectUpdateConnectorRequest": { + "type": "object", + "minProperties": 1, + "additionalProperties": false, + "properties": { + "triggers": { + "description": "Whether the triggers are enabled for this connector.", + "type": "boolean" + }, + "events": { + "type": "array", + "description": "Default trigger events for this connector.", + "items": { + "type": "string" + } + }, + "data": { + "$ref": "#/components/schemas/ConnectConnectorUpdateData", + "description": "Provider configuration fields to update." + }, + "icon": { + "type": "string", + "description": "SHA-1 digest of a PNG or JPEG icon that is at least 640 by 640 pixels. This field does not accept a URL or image bytes.\n\nFirst compute the digest and upload the raw image with [POST /v2/files](https://vercel.com/docs/rest-api/deployments/upload-deployment-files). Send `Content-Length` and the same 40-character digest in `x-vercel-digest`. Then set `icon` to that digest.\n\n```js\nimport { createHash } from 'node:crypto';\nimport { readFile } from 'node:fs/promises';\n\nconst VERCEL_TOKEN = process.env.VERCEL_TOKEN;\nconst connectorId = 'scl_...';\nconst bytes = await readFile('icon.png');\nconst digest = createHash('sha1').update(bytes).digest('hex');\n\nawait fetch('https://api.vercel.com/v2/files', {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${VERCEL_TOKEN}`,\n 'Content-Type': 'application/octet-stream',\n 'Content-Length': String(bytes.length),\n 'x-vercel-digest': digest,\n },\n body: bytes,\n});\n\nawait fetch(`https://api.vercel.com/v2/connect/connectors/${connectorId}`, {\n method: 'PATCH',\n headers: {\n Authorization: `Bearer ${VERCEL_TOKEN}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ icon: digest }),\n});\n```\n", + "pattern": "^[0-9a-fA-F]{40}$" + }, + "backgroundColor": { + "type": "string" + }, + "accentColor": { + "type": "string" + }, + "uid": { + "type": "string", + "description": "Full team-scoped UID, such as `slack/my-bot`. It cannot contain whitespace, `%`, `#`, control characters, or Vercel-owned namespaces. Changing it breaks callers that use the old UID. The stable connector ID does not change." + }, + "name": { + "type": "string", + "description": "Display name for the connector. It is trimmed and cannot be empty or contain control characters." + } + }, + "description": "Connector fields to update." + }, + "ConnectTriggerDestinationInput": { + "description": "A destination in the complete replacement set. Each destination targets the default deployment, a branch, or a custom environment.", + "oneOf": [ + { + "title": "Default deployment", + "type": "object", + "required": [ + "projectId" + ], + "additionalProperties": false, + "properties": { + "projectId": { + "type": "string", + "description": "Project that receives matching trigger requests.", + "minLength": 1 + }, + "path": { + "type": "string", + "maxLength": 2048, + "description": "Route path on the linked project that receives forwarded trigger requests.", + "minLength": 1 + } + } + }, + { + "title": "Branch", + "type": "object", + "required": [ + "projectId", + "branch" + ], + "additionalProperties": false, + "properties": { + "projectId": { + "type": "string", + "description": "Project that receives matching trigger requests.", + "minLength": 1 + }, + "branch": { + "type": "string", + "maxLength": 250, + "description": "Git branch used to select a preview deployment.", + "minLength": 1 + }, + "path": { + "type": "string", + "maxLength": 2048, + "description": "Route path on the linked project that receives forwarded trigger requests.", + "minLength": 1 + } + } + }, + { + "title": "Custom environment", + "type": "object", + "required": [ + "projectId", + "customEnvironmentId" + ], + "additionalProperties": false, + "properties": { + "projectId": { + "type": "string", + "description": "Project that receives matching trigger requests.", + "minLength": 1 + }, + "customEnvironmentId": { + "description": "Stable custom environment ID that belongs to the destination project.", + "type": "string", + "pattern": "^env_" + }, + "path": { + "type": "string", + "maxLength": 2048, + "description": "Route path on the linked project that receives forwarded trigger requests.", + "minLength": 1 + } + } + } + ] + }, + "ConnectReplaceTriggerDestinationsRequest": { + "type": "object", + "required": [ + "destinations" + ], + "additionalProperties": false, + "properties": { + "destinations": { + "type": "array", + "maxItems": 3, + "description": "Complete replacement set of trigger destinations. An empty array removes all destinations. Connector get and list responses expose the saved set as triggerDestinations.", + "items": { + "$ref": "#/components/schemas/ConnectTriggerDestinationInput" + } + } + }, + "description": "Complete replacement set of trigger destinations." + }, + "ConnectProjectConnection": { + "properties": { + "connectorId": { + "type": "string", + "description": "Stable `scl_` connector ID, even when the request used a UID." + }, + "project": { + "properties": { + "id": { + "type": "string", + "description": "Same Vercel project ID as the connection's top-level `projectId`." + }, + "name": { + "type": "string", + "description": "Current Vercel project name." + }, + "customEnvironments": { + "items": { + "properties": { + "id": { + "type": "string", + "description": "Stable custom environment ID." + }, + "slug": { + "type": "string", + "description": "Current human-readable custom environment slug." + } + }, + "required": [ + "id", + "slug" + ], + "type": "object", + "description": "Custom environments available on the project. This list can include environments where the connector is not enabled." + }, + "type": "array", + "description": "Custom environments available on the project. This list can include environments where the connector is not enabled." + } + }, + "required": [ + "id", + "name" + ], + "type": "object", + "description": "Vercel project connected to the connector." + }, + "enabledEnvironments": { + "items": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "string", + "enum": [ + "development", + "preview", + "production" + ] + } + ] + }, + "type": "array", + "description": "Environments where the connector is enabled for the project." + }, + "createdAt": { + "type": "number", + "description": "Time when the project connection was created, in epoch milliseconds." + }, + "updatedAt": { + "type": "number", + "description": "Time when the project connection was last updated, in epoch milliseconds." + } + }, + "required": [ + "connectorId", + "createdAt", + "enabledEnvironments", + "project", + "updatedAt" + ], + "type": "object", + "description": "A connection between a connector and a Vercel project, including the environments where the connector is enabled." + }, + "ConnectConnectorProjectConnectionList": { + "properties": { + "projects": { + "items": { + "$ref": "#/components/schemas/ConnectProjectConnection" + }, + "type": "array", + "description": "Project connections in this page." + }, + "pagination": { + "$ref": "#/components/schemas/ConnectPagination", + "description": "Cursor for the next page." + } + }, + "required": [ + "pagination", + "projects" + ], + "type": "object", + "description": "Page of projects connected to a connector." + }, + "ConnectUpsertProjectConnectionRequest": { + "type": "object", + "required": [ + "environments" + ], + "properties": { + "environments": { + "minItems": 1, + "description": "One or more built-in environment names or stable custom environment IDs that belong to the project. Duplicate values are accepted and removed.", + "type": "array", + "items": { + "anyOf": [ + { + "type": "string", + "enum": [ + "development", + "preview", + "production" + ] + }, + { + "type": "string", + "pattern": "^env_" + } + ], + "description": "A built-in environment name or the stable env_* ID of a custom environment." + } + } + }, + "description": "Environments enabled for a connector project connection." + }, + "ConnectProjectConnectorConnectionList": { + "properties": { + "connectors": { + "items": { + "$ref": "#/components/schemas/ConnectProjectConnection" + }, + "type": "array", + "description": "Connector connections in this page." + }, + "pagination": { + "$ref": "#/components/schemas/ConnectPagination", + "description": "Cursor for the next page." + } + }, + "required": [ + "connectors", + "pagination" + ], + "type": "object", + "description": "Page of connectors connected to a project." + }, + "ConnectError": { + "type": "object", + "description": "Error response returned by a Connect API operation.", + "required": [ + "error" + ], + "additionalProperties": false, + "properties": { + "error": { + "type": "object", + "required": [ + "code", + "message" + ], + "additionalProperties": true, + "properties": { + "code": { + "type": "string", + "description": "Stable machine-readable error code." + }, + "message": { + "type": "string", + "description": "Human-readable error message." + } + }, + "description": "Error details." + } + } + }, + "ConnectEnvironment": { + "description": "A built-in Vercel environment or a stable custom environment ID.", + "oneOf": [ + { + "type": "string", + "enum": [ + "development", + "preview", + "production" + ] + }, + { + "type": "string", + "pattern": "^env_" + } + ] + }, + "FlagJSONValue": { + "nullable": true, + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "items": { + "$ref": "#/components/schemas/FlagJSONValue" + }, + "type": "array", + "description": "TODO: The following types will eventually be exported by a more relevant package." + }, + { + "additionalProperties": { + "$ref": "#/components/schemas/FlagJSONValue" + }, + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + } + ] + }, + "Pagination": { + "properties": { + "count": { + "type": "number", + "description": "Amount of items in the current page.", + "example": 20 + }, + "next": { + "nullable": true, + "type": "number", + "description": "Timestamp that must be used to request the next page.", + "example": 1540095775951 + }, + "prev": { + "nullable": true, + "type": "number", + "description": "Timestamp that must be used to request the previous page.", + "example": 1540095775951 + } + }, + "required": [ + "count", + "next", + "prev" + ], + "type": "object", + "description": "This object contains information related to the pagination of the current request, including the necessary parameters to get the next or previous page of data." + }, + "TldName": { + "type": "string", + "description": "A valid TLD name" + }, + "HttpApiDecodeError": { + "type": "object", + "required": [ + "issues", + "message" + ], + "properties": { + "issues": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Issue" + } + }, + "message": { + "type": "string" + } + }, + "additionalProperties": false, + "description": "The request did not match the expected schema" + }, + "Issue": { + "type": "object", + "required": [ + "path", + "message" + ], + "properties": { + "path": { + "type": "array", + "items": { + "$ref": "#/components/schemas/PropertyKey" + }, + "description": "The path to the property where the issue occurred" + }, + "message": { + "type": "string", + "description": "A descriptive message explaining the issue" + } + }, + "additionalProperties": false, + "description": "Represents an error encountered while parsing a value to match the schema" + }, + "PropertyKey": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "object", + "required": [ + "_tag", + "key" + ], + "properties": { + "_tag": { + "type": "string", + "enum": [ + "symbol" + ] + }, + "key": { + "type": "string" + } + }, + "additionalProperties": false, + "description": "an object to be decoded into a globally shared symbol" + } + ] + }, + "TooManyRequests": { + "type": "object", + "required": [ + "status", + "code", + "message", + "retryAfter", + "limit" + ], + "properties": { + "status": { + "type": "number", + "enum": [ + 429 + ] + }, + "code": { + "type": "string", + "enum": [ + "too_many_requests" + ] + }, + "message": { + "type": "string" + }, + "retryAfter": { + "type": "object", + "required": [ + "value", + "str" + ], + "properties": { + "value": { + "type": "number" + }, + "str": { + "type": "string" + } + }, + "additionalProperties": false + }, + "limit": { + "type": "object", + "required": [ + "total", + "remaining", + "reset" + ], + "properties": { + "total": { + "type": "number" + }, + "remaining": { + "type": "number" + }, + "reset": { + "type": "number" + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + "Unauthorized": { + "type": "object", + "required": [ + "status", + "code", + "message" + ], + "properties": { + "status": { + "type": "number", + "enum": [ + 401 + ] + }, + "code": { + "type": "string", + "enum": [ + "unauthorized" + ] + }, + "message": { + "type": "string" + }, + "reason": { + "type": "string" + } + }, + "additionalProperties": false + }, + "NotAuthorizedForScope": { + "type": "object", + "required": [ + "status", + "code", + "message" + ], + "properties": { + "status": { + "type": "number", + "enum": [ + 403 + ] + }, + "code": { + "type": "string", + "enum": [ + "not_authorized_for_scope" + ] + }, + "message": { + "type": "string" + } + }, + "additionalProperties": false + }, + "InternalServerError": { + "type": "object", + "required": [ + "status", + "code", + "message" + ], + "properties": { + "status": { + "type": "number", + "enum": [ + 500 + ] + }, + "code": { + "type": "string", + "enum": [ + "internal_server_error" + ] + }, + "message": { + "type": "string" + } + }, + "additionalProperties": false + }, + "TldNotSupported": { + "type": "object", + "required": [ + "status", + "code", + "message" + ], + "properties": { + "status": { + "type": "number", + "enum": [ + 400 + ] + }, + "code": { + "type": "string", + "enum": [ + "tld_not_supported" + ] + }, + "message": { + "type": "string" + } + }, + "additionalProperties": false, + "description": "The TLD is not currently supported." + }, + "DomainName": { + "type": "string", + "description": "A valid domain name" + }, + "NotFound": { + "type": "object", + "required": [ + "status", + "code", + "message" + ], + "properties": { + "status": { + "type": "number", + "enum": [ + 404 + ] + }, + "code": { + "type": "string", + "enum": [ + "not_found" + ] + }, + "message": { + "type": "string" + } + }, + "additionalProperties": false + }, + "DomainTooShort": { + "type": "object", + "required": [ + "status", + "code", + "message" + ], + "properties": { + "status": { + "type": "number", + "enum": [ + 400 + ] + }, + "code": { + "type": "string", + "enum": [ + "domain_too_short" + ] + }, + "message": { + "type": "string" + } + }, + "additionalProperties": false, + "description": "The domain name (excluding the TLD) is too short." + }, + "BadRequest": { + "type": "object", + "required": [ + "status", + "code", + "message" + ], + "properties": { + "status": { + "type": "number", + "enum": [ + 400 + ] + }, + "code": { + "type": "string", + "enum": [ + "bad_request" + ] + }, + "message": { + "type": "string" + } + }, + "additionalProperties": false + }, + "DomainNotRegistered": { + "type": "object", + "required": [ + "status", + "code", + "message" + ], + "properties": { + "status": { + "type": "number", + "enum": [ + 400 + ] + }, + "code": { + "type": "string", + "enum": [ + "domain_not_registered" + ] + }, + "message": { + "type": "string" + } + }, + "additionalProperties": false, + "description": "The domain is not registered with Vercel." + }, + "Forbidden": { + "type": "object", + "required": [ + "status", + "code", + "message" + ], + "properties": { + "status": { + "type": "number", + "enum": [ + 403 + ] + }, + "code": { + "type": "string", + "enum": [ + "forbidden" + ] + }, + "message": { + "type": "string" + } + }, + "additionalProperties": false + }, + "DomainNotFound": { + "type": "object", + "required": [ + "status", + "code", + "message" + ], + "properties": { + "status": { + "type": "number", + "enum": [ + 404 + ] + }, + "code": { + "type": "string", + "enum": [ + "domain_not_found" + ] + }, + "message": { + "type": "string" + } + }, + "additionalProperties": false, + "description": "The domain was not found in our system." + }, + "DomainCannotBeTransferedOutUntil": { + "type": "object", + "required": [ + "status", + "code", + "message" + ], + "properties": { + "status": { + "type": "number", + "enum": [ + 409 + ] + }, + "code": { + "type": "string", + "enum": [ + "domain_cannot_be_transfered_out_until" + ] + }, + "message": { + "type": "string" + } + }, + "additionalProperties": false, + "description": "The domain cannot be transfered out until the specified date." + }, + "NonEmptyTrimmedString": { + "type": "string", + "description": "a non empty string", + "title": "nonEmptyString", + "pattern": "^\\S[\\s\\S]*\\S$|^\\S$|^$", + "minLength": 1 + }, + "EmailAddress": { + "type": "string", + "description": "A valid RFC 5322 email address", + "title": "nonEmptyString", + "minLength": 1 + }, + "E164PhoneNumber": { + "type": "string", + "description": "A valid E.164 phone number", + "title": "nonEmptyString", + "minLength": 1, + "pattern": "^(?=(?:\\D*\\d){8,15}$)\\+[1-9]\\d{0,2}\\.?\\d+$" + }, + "CountryCode": { + "type": "string", + "description": "A valid ISO 3166-1 alpha-2 country code" + }, + "OrderId": { + "type": "string", + "description": "A valid order ID" + }, + "LanguageCodeRequired": { + "type": "object", + "required": [ + "status", + "code", + "message" + ], + "properties": { + "status": { + "type": "number", + "enum": [ + 400 + ] + }, + "code": { + "type": "string", + "enum": [ + "language_code_required" + ] + }, + "message": { + "type": "string" + } + }, + "additionalProperties": false, + "description": "A language code is required for punycode domains." + }, + "DomainNotAvailable": { + "type": "object", + "required": [ + "status", + "code", + "message" + ], + "properties": { + "status": { + "type": "number", + "enum": [ + 400 + ] + }, + "code": { + "type": "string", + "enum": [ + "domain_not_available" + ] + }, + "message": { + "type": "string" + } + }, + "additionalProperties": false, + "description": "The domain is not available." + }, + "ExpectedPriceMismatch": { + "type": "object", + "required": [ + "status", + "code", + "message" + ], + "properties": { + "status": { + "type": "number", + "enum": [ + 400 + ] + }, + "code": { + "type": "string", + "enum": [ + "expected_price_mismatch" + ] + }, + "message": { + "type": "string" + } + }, + "additionalProperties": false, + "description": "The expected price passed does not match the actual price." + }, + "AdditionalContactInfoRequired": { + "type": "object", + "required": [ + "status", + "code", + "message" + ], + "properties": { + "status": { + "type": "number", + "enum": [ + 400 + ] + }, + "code": { + "type": "string", + "enum": [ + "additional_contact_info_required" + ] + }, + "message": { + "type": "string" + } + }, + "additionalProperties": false, + "description": "Additional contact information is required for the TLD." + }, + "InvalidAdditionalContactInfo": { + "type": "object", + "required": [ + "status", + "code", + "message" + ], + "properties": { + "status": { + "type": "number", + "enum": [ + 400 + ] + }, + "code": { + "type": "string", + "enum": [ + "invalid_additional_contact_info" + ] + }, + "message": { + "type": "string" + } + }, + "additionalProperties": false, + "description": "Additional contact information provided for the TLD is invalid." + }, + "OrderTooExpensive": { + "type": "object", + "required": [ + "status", + "code", + "message" + ], + "properties": { + "status": { + "type": "number", + "enum": [ + 400 + ] + }, + "code": { + "type": "string", + "enum": [ + "order_too_expensive" + ] + }, + "message": { + "type": "string" + } + }, + "additionalProperties": false, + "description": "The total price of the order is too high." + }, + "DuplicateDomains": { + "type": "object", + "required": [ + "status", + "code", + "message" + ], + "properties": { + "status": { + "type": "number", + "enum": [ + 400 + ] + }, + "code": { + "type": "string", + "enum": [ + "duplicate_domains" + ] + }, + "message": { + "type": "string" + } + }, + "additionalProperties": false, + "description": "Duplicate domains were provided." + }, + "TooManyDomains": { + "type": "object", + "required": [ + "status", + "code", + "message" + ], + "properties": { + "status": { + "type": "number", + "enum": [ + 400 + ] + }, + "code": { + "type": "string", + "enum": [ + "too_many_domains" + ] + }, + "message": { + "type": "string" + } + }, + "additionalProperties": false, + "description": "The number of domains in the order is too high." + }, + "DNSSECEnabled": { + "type": "object", + "required": [ + "status", + "code", + "message" + ], + "properties": { + "status": { + "type": "number", + "enum": [ + 400 + ] + }, + "code": { + "type": "string", + "enum": [ + "dnssec_enabled" + ] + }, + "message": { + "type": "string" + } + }, + "additionalProperties": false, + "description": "The operation cannot be completed because DNSSEC is enabled for the domain." + }, + "DomainAlreadyOwned": { + "type": "object", + "required": [ + "status", + "code", + "message" + ], + "properties": { + "status": { + "type": "number", + "enum": [ + 400 + ] + }, + "code": { + "type": "string", + "enum": [ + "domain_already_owned" + ] + }, + "message": { + "type": "string" + } + }, + "additionalProperties": false, + "description": "The domain is already owned by another team or user." + }, + "DomainNotRenewable": { + "type": "object", + "required": [ + "status", + "code", + "message" + ], + "properties": { + "status": { + "type": "number", + "enum": [ + 400 + ] + }, + "code": { + "type": "string", + "enum": [ + "domain_not_renewable" + ] + }, + "message": { + "type": "string" + } + }, + "additionalProperties": false, + "description": "The domain is not renewable." + }, + "DomainAlreadyRenewing": { + "type": "object", + "required": [ + "status", + "code", + "message" + ], + "properties": { + "status": { + "type": "number", + "enum": [ + 400 + ] + }, + "code": { + "type": "string", + "enum": [ + "domain_already_renewing" + ] + }, + "message": { + "type": "string" + } + }, + "additionalProperties": false, + "description": "The domain is already renewing." + }, + "Nameserver": { + "type": "string", + "description": "A valid nameserver" + }, + "ContactVerified": { + "type": "object", + "required": [ + "verified" + ], + "properties": { + "verified": { + "type": "boolean", + "enum": [ + true + ] + } + }, + "additionalProperties": false, + "description": "The registrant contact has been verified.", + "title": "Verified" + }, + "ContactPendingVerification": { + "type": "object", + "required": [ + "verified", + "verifyBy", + "email" + ], + "properties": { + "verified": { + "type": "boolean", + "enum": [ + false + ] + }, + "verifyBy": { + "$ref": "#/components/schemas/DateFromString" + }, + "email": { + "type": "string" + } + }, + "additionalProperties": false, + "description": "The registrant contact has not yet been verified. The contact must be verified by `verifyBy`, and a verification email is sent to `email`.", + "title": "Pending verification" + }, + "DateFromString": { + "type": "string", + "description": "a string to be decoded into a Date" + }, + "BoughtTooRecently": { + "type": "object", + "required": [ + "status", + "code", + "message" + ], + "properties": { + "status": { + "type": "number", + "enum": [ + 400 + ] + }, + "code": { + "type": "string", + "enum": [ + "bought_too_recently" + ] + }, + "message": { + "type": "string" + } + }, + "additionalProperties": false, + "description": "The domain was bought too recently to determine verification status." + }, + "RegistrantField": { + "anyOf": [ + { + "type": "object", + "required": [ + "description", + "required", + "type" + ], + "properties": { + "description": { + "type": "string" + }, + "required": { + "type": "boolean" + }, + "label": { + "type": "string" + }, + "validation": { + "type": "string" + }, + "required_when": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "object", + "required": [ + "value_in" + ], + "properties": { + "value_in": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false + } + ] + }, + "type": { + "type": "string", + "enum": [ + "string" + ] + }, + "options": { + "type": "array", + "items": { + "type": "object", + "required": [ + "value", + "label" + ], + "properties": { + "value": { + "type": "string" + }, + "label": { + "type": "string" + }, + "fields": { + "type": "object", + "properties": {} + } + }, + "additionalProperties": false + } + }, + "fields": { + "type": "object", + "properties": {} + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "description", + "required", + "type", + "options" + ], + "properties": { + "description": { + "type": "string" + }, + "required": { + "type": "boolean" + }, + "label": { + "type": "string" + }, + "validation": { + "type": "string" + }, + "required_when": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "object", + "required": [ + "value_in" + ], + "properties": { + "value_in": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false + } + ] + }, + "type": { + "type": "string", + "enum": [ + "enum" + ] + }, + "options": { + "type": "array", + "items": { + "type": "object", + "required": [ + "value", + "label" + ], + "properties": { + "value": { + "type": "string" + }, + "label": { + "type": "string" + }, + "fields": { + "type": "object", + "properties": {} + } + }, + "additionalProperties": false + } + }, + "fields": { + "type": "object", + "properties": {} + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "description", + "required", + "type" + ], + "properties": { + "description": { + "type": "string" + }, + "required": { + "type": "boolean" + }, + "label": { + "type": "string" + }, + "validation": { + "type": "string" + }, + "required_when": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "object", + "required": [ + "value_in" + ], + "properties": { + "value_in": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false + } + ] + }, + "type": { + "type": "string", + "enum": [ + "acknowledgement" + ] + }, + "value": { + "type": "string" + } + }, + "additionalProperties": false + }, + { + "type": "object", + "required": [ + "description", + "required", + "type" + ], + "properties": { + "description": { + "type": "string" + }, + "required": { + "type": "boolean" + }, + "label": { + "type": "string" + }, + "validation": { + "type": "string" + }, + "required_when": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "object", + "required": [ + "value_in" + ], + "properties": { + "value_in": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false + } + ] + }, + "type": { + "type": "string", + "enum": [ + "notice" + ] + } + }, + "additionalProperties": false + } + ], + "description": "Schema definition for registrant fields." + }, + "GlobalConfigItemValue": { + "nullable": true, + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "additionalProperties": { + "$ref": "#/components/schemas/GlobalConfigItemValue" + }, + "type": "object" + }, + { + "items": { + "$ref": "#/components/schemas/GlobalConfigItemValue" + }, + "type": "array" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + } + ] + }, + "GlobalConfigItem": { + "properties": { + "key": { + "type": "string" + }, + "value": { + "$ref": "#/components/schemas/GlobalConfigItemValue" + }, + "description": { + "type": "string" + }, + "edgeConfigId": { + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "updatedAt": { + "type": "number" + } + }, + "required": [ + "createdAt", + "edgeConfigId", + "key", + "updatedAt", + "value" + ], + "type": "object", + "description": "The Global Config." + }, + "GlobalConfigToken": { + "properties": { + "partialToken": { + "type": "string", + "description": "A partially-masked representation of the token, safe to display in UIs. The format is the first 3 characters of the token followed by a fixed 8-character `*` mask (e.g. `550e8400-e29b-41d4-a716-446655440000` → `550********`). The mask length is intentionally fixed (not proportional to the original token length) to avoid leaking the token length. Prefer this field for display/reference in UIs and logs. The full, plaintext token is only disclosed once at creation time via `POST /v1/edge-config/:edgeConfigId/token`; use `id` to reference a token in subsequent calls (e.g. when deleting)." + }, + "label": { + "type": "string" + }, + "id": { + "type": "string", + "description": "This is not the token itself, but rather an id to identify the token by" + }, + "edgeConfigId": { + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "token": { + "type": "string", + "description": "Deprecated: the full, plaintext token. - Returned once by `POST /v1/edge-config/:edgeConfigId/token` (create). - Still returned by `GET /v1/edge-config/:edgeConfigId/token/:token` (detail) for backwards compatibility, but scheduled for removal. - **Not** returned by `GET /v1/edge-config/:edgeConfigId/tokens` (list); use `partialToken` for display and `id` to reference tokens. Do not rely on this field being present on read operations. Prefer `partialToken` for display and `id` for references." + } + }, + "required": [ + "createdAt", + "edgeConfigId", + "id", + "label", + "partialToken" + ], + "type": "object", + "description": "The Global Config." + }, + "UserEvent": { + "properties": { + "id": { + "type": "string", + "description": "The unique identifier of the Event.", + "example": "uev_bfmMjiMnXfnPbT97dGdpJbCN" + }, + "text": { + "type": "string", + "description": "The human-readable text of the Event.", + "example": "You logged in via GitHub" + }, + "entities": { + "items": { + "properties": { + "type": { + "type": "string", + "enum": [ + "app", + "author", + "bitbucket_login", + "bold", + "deployment_host", + "deployment_inspector", + "dns_record", + "edge-config", + "env_var_name", + "flag", + "flags-segment", + "flags-settings", + "git_link", + "github_login", + "gitlab_login", + "hook_name", + "integration", + "link", + "project_name", + "scaling_rules", + "store", + "system", + "target" + ], + "example": "author", + "description": "The type of entity." + }, + "start": { + "type": "number", + "description": "The index of where the entity begins within the `text` (inclusive).", + "example": 0 + }, + "end": { + "type": "number", + "description": "The index of where the entity ends within the `text` (non-inclusive).", + "example": 3 + } + }, + "required": [ + "end", + "start", + "type" + ], + "type": "object", + "description": "A list of \"entities\" within the event `text`. Useful for enhancing the displayed text with additional styling and links." + }, + "type": "array", + "description": "A list of \"entities\" within the event `text`. Useful for enhancing the displayed text with additional styling and links." + }, + "type": { + "type": "string", + "enum": [ + "access-group-created", + "access-group-deleted", + "access-group-project-updated", + "access-group-updated", + "access-group-user-added", + "access-group-user-removed", + "admin-agentic-provisioning-account-unlinked", + "admin-plan-updated", + "admin-secondary-email-added", + "admin-secondary-email-removed", + "admin-team-name-update", + "admin-team-slug-update", + "admin-user-delete", + "admin-user-primary-email-updated", + "admin-username-updated", + "agentic-provisioning-account-blocked", + "agentic-provisioning-account-linked", + "agentic-provisioning-account-relinked", + "agentic-provisioning-account-unlinked", + "agentic-provisioning-credentials-rotated", + "agentic-provisioning-plan-changed", + "agentic-provisioning-team-created", + "ai-alert-investigation", + "ai-code-review", + "ai-gateway-api-key-created", + "ai-gateway-api-key-deleted", + "ai-gateway-api-key-quota-updated", + "ai-gateway-auto-reload-updated", + "ai-gateway-budget-default-updated", + "ai-gateway-byok-credential-created", + "ai-gateway-byok-credential-deleted", + "ai-gateway-byok-credential-updated", + "ai-gateway-byok-model-mappings-updated", + "ai-gateway-credits-purchased", + "ai-gateway-guardrails-updated", + "ai-gateway-hipaa-compliance-toggled", + "ai-gateway-inference-regions-updated", + "ai-gateway-model-allowlist-models-updated", + "ai-gateway-model-allowlist-toggled", + "ai-gateway-private-model-created", + "ai-gateway-private-model-deleted", + "ai-gateway-private-model-updated", + "ai-gateway-private-provider-created", + "ai-gateway-private-provider-deleted", + "ai-gateway-private-provider-updated", + "ai-gateway-prompt-training-opt-out-toggled", + "ai-gateway-provider-allowlist-providers-updated", + "ai-gateway-provider-allowlist-toggled", + "ai-gateway-rule-created", + "ai-gateway-rule-deleted", + "ai-gateway-rule-updated", + "ai-gateway-scope-budget-updated", + "ai-gateway-transcripts-default-disabled", + "ai-gateway-transcripts-default-enabled", + "ai-gateway-transcripts-disabled", + "ai-gateway-transcripts-enabled", + "ai-gateway-transcripts-retention-updated", + "ai-gateway-virtual-model-config-archived", + "ai-gateway-virtual-model-config-created", + "ai-gateway-virtual-model-config-deleted", + "ai-gateway-virtual-model-config-restored", + "ai-gateway-virtual-model-config-updated", + "ai-gateway-zero-data-retention-toggled", + "ai-omniagent", + "alert-investigation-project-allowlist-updated", + "alert-rule-created", + "alert-rule-deleted", + "alert-rule-updated", + "alias", + "alias-chown", + "alias-delete", + "alias-invite-created", + "alias-invite-joined", + "alias-invite-revoked", + "alias-protection-bypass-created", + "alias-protection-bypass-exception", + "alias-protection-bypass-regenerated", + "alias-protection-bypass-revoked", + "alias-system", + "alias-user-scoped-access-denied", + "alias-user-scoped-access-granted", + "alias-user-scoped-access-requested", + "alias-user-scoped-access-revoked", + "aliases-assigned", + "attack-mode-disabled", + "attack-mode-enabled", + "audit-log-export-downloaded", + "audit-log-export-requested", + "authorize-git-deployment", + "auto-expose-system-envs", + "avatar", + "billing-settings-updated", + "bulk-redirects-settings-updated", + "bulk-redirects-version-promoted", + "bulk-redirects-version-restored", + "cert", + "cert-autorenew", + "cert-chown", + "cert-clone", + "cert-delete", + "cert-renew", + "cert-replace", + "cert-system-create", + "code-owners-config-updated", + "compliance-document-downloaded", + "compliance-document-previewed", + "compliance-documents-bulk-downloaded", + "concurrent-builds-update", + "connect-attach-project", + "connect-bitbucket", + "connect-bitbucket-app", + "connect-configuration-created", + "connect-configuration-deleted", + "connect-configuration-link-updated", + "connect-configuration-linked", + "connect-configuration-unlinked", + "connect-configuration-updated", + "connect-create-connector", + "connect-delete-connector", + "connect-delete-installation", + "connect-detach-project", + "connect-github", + "connect-github-custom-host", + "connect-github-limited", + "connect-gitlab", + "connect-gitlab-app", + "connect-import-tokens", + "connect-revoke-all-tokens", + "connect-update-connector", + "connect-update-trigger-destinations", + "connect-upsert-installation", + "custom-alert-created", + "custom-alert-deleted", + "custom-alert-updated", + "custom-environments-settings-updated", + "custom-metric-metadata-deleted", + "custom-metric-metadata-updated", + "custom-suffix-clear", + "custom-suffix-disable", + "custom-suffix-enable", + "custom-suffix-pending", + "custom-suffix-ready", + "deploy-hook-created", + "deploy-hook-deduped", + "deploy-hook-deleted", + "deploy-hook-processed", + "deployment", + "deployment-check-created", + "deployment-check-deleted", + "deployment-check-updated", + "deployment-chown", + "deployment-creation-blocked", + "deployment-delete", + "deployment-policy-blocked", + "deployment-undeleted", + "disabled-integration-installation-removed", + "disconnect-bitbucket-app", + "disconnect-github", + "disconnect-github-custom-host", + "disconnect-github-limited", + "disconnect-gitlab-app", + "dns-add", + "dns-delete", + "dns-record-internal", + "dns-update", + "dns-zonefile-import", + "domain", + "domain-buy", + "domain-cdn", + "domain-chown", + "domain-custom-ns-change", + "domain-delegated", + "domain-delete", + "domain-ech-change", + "domain-move-in", + "domain-move-out", + "domain-move-out-request-sent", + "domain-renew-change", + "domain-service-type-updated", + "domain-transfer-in", + "domain-transfer-in-canceled", + "domain-transfer-in-completed", + "domain-zone-change", + "domain-zone-change-internal", + "drain-created", + "drain-deleted", + "drain-disabled", + "drain-enabled", + "drain-updated", + "edge-cache-dangerously-delete-by-src-images", + "edge-cache-dangerously-delete-by-tags", + "edge-cache-dangerously-delete-immutable-static", + "edge-cache-invalidate-by-src-images", + "edge-cache-invalidate-by-tags", + "edge-cache-purge-all", + "edge-cache-rollback-purge", + "edge-config-backup-restored", + "edge-config-created", + "edge-config-deleted", + "edge-config-items-updated", + "edge-config-schema-deleted", + "edge-config-schema-updated", + "edge-config-token-created", + "edge-config-token-deleted", + "edge-config-transfer-in", + "edge-config-transfer-out", + "edge-config-updated", + "email", + "email-notification-rule-removed", + "email-notification-rule-updated", + "emu-member-removed-unverified-domain", + "enforce-disjunctive-production-secrets", + "enforce-sensitive-environment-variables", + "env-variable-add", + "env-variable-delete", + "env-variable-edit", + "env-variable-masked", + "env-variable-read", + "env-variable-read:cli:dev", + "env-variable-read:cli:env:add", + "env-variable-read:cli:env:ls", + "env-variable-read:cli:env:pull", + "env-variable-read:cli:env:rm", + "env-variable-read:cli:pull", + "env-variable-read:unknown-source", + "env-variable-read:v0:env:pull", + "env-variable-rotated", + "experiment-created", + "experiment-deleted", + "experiment-transitioned", + "experiment-updated", + "firewall-bypass-created", + "firewall-bypass-deleted", + "firewall-config-modified", + "firewall-config-promoted", + "firewall-config-removed", + "firewall-managed-rulegroup-updated", + "firewall-managed-ruleset-updated", + "flag", + "flag-archived", + "flag-created", + "flag-deleted", + "flag-unarchived", + "flag-updated", + "flags-explorer-subscription", + "flags-sdk-key", + "flags-sdk-key-added", + "flags-sdk-key-deleted", + "flags-sdk-key-read", + "flags-segment", + "flags-settings", + "flags-transferred", + "flat-rate-cdn-auto-upgrade-consent", + "git-integration-repo-push", + "git_account_integration_link_added", + "global-config-backup-restored", + "global-config-created", + "global-config-deleted", + "global-config-items-updated", + "global-config-schema-deleted", + "global-config-schema-updated", + "global-config-token-created", + "global-config-token-deleted", + "global-config-transfer-in", + "global-config-transfer-out", + "global-config-updated", + "instant-rollback-created", + "integration-configuration-credential-revoked", + "integration-configuration-credential-rotated", + "integration-configuration-owner-changed", + "integration-configuration-scope-change-confirmed", + "integration-configuration-transfer-in-success", + "integration-configuration-transfer-out-success", + "integration-configurations-disabled", + "integration-installation-billing-plan-updated", + "integration-installation-completed", + "integration-installation-permission-updated", + "integration-installation-removed", + "integration-resource-redis-command-executed", + "integration-resource-sql-query-executed", + "integration-scope-changed", + "invoice-modified", + "invoice-refunded", + "kms-issuer-created", + "kms-issuer-deleted", + "kms-issuer-key-activated", + "kms-issuer-key-created", + "kms-issuer-key-revoked", + "kms-issuer-key-rotated", + "kms-issuer-policy-created", + "kms-issuer-policy-deleted", + "kms-issuer-policy-updated", + "kms-issuer-updated", + "log-drain-created", + "log-drain-deleted", + "log-drain-disabled", + "log-drain-enabled", + "login", + "login-connection-linked", + "login-connection-unlinked", + "manual-deployment-promotion-created", + "marketplace-flex-commit-opt-in", + "marketplace-integration-allowlist-updated", + "microfrontend-group-added", + "microfrontend-group-deleted", + "microfrontend-group-updated", + "microfrontend-project-added-to-group", + "microfrontend-project-removed-from-group", + "microfrontend-project-updated", + "monitoring-alert-updated", + "monitoring-disabled", + "monitoring-enabled", + "oauth-app-connection-created", + "oauth-app-connection-removed", + "oauth-app-connection-updated", + "oauth-app-created", + "oauth-app-deleted", + "oauth-app-secret-deleted", + "oauth-app-secret-generated", + "oauth-app-token-created", + "oauth-app-updated", + "observability-disabled", + "observability-enabled", + "observability-plus-project-disabled", + "observability-plus-project-enabled", + "oidc-policy-created", + "oidc-policy-deleted", + "oidc-policy-updated", + "oidc-policy-used-to-obtain-app-token", + "organization-create", + "organization-delete", + "organization-dsync-group-delete", + "organization-dsync-group-upsert", + "organization-slug-update", + "organization-team-add", + "organization-team-create", + "organization-team-delete", + "organization-team-sso-update", + "owner-blocked", + "owner-soft-blocked", + "owner-soft-unblocked", + "owner-unblocked", + "page-integrity-config-updated", + "page-integrity-header-approved", + "page-integrity-header-rejected", + "page-integrity-inventory-cleared", + "page-integrity-resource-approved", + "page-integrity-resource-deleted", + "page-integrity-resource-rejected", + "page-integrity-script-approval-rule-created", + "page-integrity-script-approval-rule-deleted", + "passkey-created", + "passkey-deleted", + "passkey-updated", + "passport-access-granted", + "password-protection-disabled", + "password-protection-enabled", + "payment-method-added", + "payment-method-default-updated", + "payment-method-removed", + "plan", + "preview-deployment-suffix-disabled", + "preview-deployment-suffix-enabled", + "preview-deployment-suffix-update", + "privatelink-endpoint-created", + "privatelink-endpoint-deleted", + "privatelink-endpoint-updated", + "production-branch-updated", + "project-add-alias", + "project-add-redirect", + "project-affected-projects-deployments-updated", + "project-alias-configured-change", + "project-analytics-disabled", + "project-analytics-enabled", + "project-auto-assign-custom-production-domains-updated", + "project-automation-bypass", + "project-avatar-update", + "project-build-command-updated", + "project-build-logs-and-source-protection-updated", + "project-build-machine-updated", + "project-card-widget-preference-updated", + "project-client-cert-delete", + "project-client-cert-upload", + "project-connect-configurations", + "project-consolidated-git-commit-status-updated", + "project-created", + "project-cron-jobs-toggled", + "project-custom-environment-created", + "project-custom-environment-deleted", + "project-custom-environment-updated", + "project-customer-success-code-visibility-updated", + "project-delete", + "project-deployment-policy-updated", + "project-deployment-retention-updated", + "project-directory-listing", + "project-domain-deleted", + "project-domain-moved", + "project-domain-unverified", + "project-domain-updated", + "project-domain-verified", + "project-elastic-concurrency-updated", + "project-expiration-locked", + "project-expiration-reached", + "project-expiration-scheduled", + "project-expiration-unlocked", + "project-external-rewrite-caching-updated", + "project-framework-updated", + "project-function-cpu-memory", + "project-function-failover", + "project-function-max-duration", + "project-function-regions", + "project-functions-beta-updated", + "project-functions-fluid-disabled", + "project-functions-fluid-enabled", + "project-git-commit-comments-toggled", + "project-git-commit-status-toggled", + "project-git-create-deployments-toggled", + "project-git-credential-bound-created", + "project-git-credential-bound-deleted", + "project-git-credential-bound-updated", + "project-git-credential-grant-created", + "project-git-credential-grant-deleted", + "project-git-credential-grant-updated", + "project-git-fork-protection-updated", + "project-git-lfs-toggled", + "project-git-pr-comments-toggled", + "project-git-repository-connected", + "project-git-repository-disconnected", + "project-git-repository-dispatch-events-toggled", + "project-git-require-verified-commits-toggled", + "project-ignored-build-step-updated", + "project-install-command-updated", + "project-member-added", + "project-member-invited", + "project-member-removed", + "project-member-removed-batch", + "project-member-updated", + "project-move-in-success", + "project-move-out-failed", + "project-move-out-started", + "project-move-out-success", + "project-name", + "project-node-version-updated", + "project-oidc-issuer-mode-updated", + "project-oidc-token-created", + "project-options-allowlist", + "project-output-directory-updated", + "project-passport-updated", + "project-password-protection", + "project-paused", + "project-preview-deployment-suffix", + "project-preview-environment-branch-tracking-updated", + "project-prioritize-production-builds-updated", + "project-program-enrollment-changed", + "project-protected-sourcemaps-updated", + "project-rollback-description-updated", + "project-rolling-release-aborted", + "project-rolling-release-approved", + "project-rolling-release-completed", + "project-rolling-release-configured", + "project-rolling-release-continued", + "project-rolling-release-disabled", + "project-rolling-release-enabled", + "project-rolling-release-paused", + "project-rolling-release-started", + "project-rolling-release-suggested-actions-generated", + "project-rolling-release-timer", + "project-root-directory-updated", + "project-routes-version-promoted", + "project-routes-version-restored", + "project-sandbox-config-updated", + "project-sandbox-url-protection-updated", + "project-skew-protection-allowed-domains-updated", + "project-skew-protection-max-age-updated", + "project-skew-protection-threshold-updated", + "project-source-files-outside-root-directory-updated", + "project-speed-insights-disabled", + "project-speed-insights-enabled", + "project-speed-insights-free-data-started", + "project-sso-protection", + "project-static-ips-updated", + "project-trusted-ips", + "project-trusted-sources", + "project-unpaused", + "project-web-analytics-disabled", + "project-web-analytics-enabled", + "protected-git-scope-added", + "protected-git-scope-removed", + "runtime-cache-purge-all", + "saml-connection-created", + "saml-connection-deleted", + "sandbox-alias-assigned", + "sandbox-alias-delete", + "sandbox-drive-created", + "sandbox-drive-deleted", + "sandbox-snapshot-regions-updated", + "scale", + "scale-auto", + "secondary-email-added", + "secondary-email-removed", + "secondary-email-verified", + "secret-add", + "secret-delete", + "secret-rename", + "security-list-created", + "security-list-deleted", + "security-list-updated", + "security-plus-updated", + "set-bio", + "set-name", + "set-profiles", + "set-scale", + "shared-env-variable-create", + "shared-env-variable-delete", + "shared-env-variable-read", + "shared-env-variable-repo-link", + "shared-env-variable-repo-unlink", + "shared-env-variable-update", + "show-ip-addresses", + "signup", + "signup-via-bitbucket", + "signup-via-github", + "signup-via-gitlab", + "speed-insights-settings-updated", + "spend-created", + "spend-deleted", + "spend-updated", + "sso-login", + "storage-accept-tos", + "storage-access-token-set", + "storage-accessed-data-browser", + "storage-connect-project", + "storage-create", + "storage-delete", + "storage-disconnect-project", + "storage-disconnect-projects", + "storage-inactive-store-deleted", + "storage-reset-credentials", + "storage-resource-repl-command", + "storage-set-locked", + "storage-transfer-in-success", + "storage-transfer-out-success", + "storage-transfer-request-created", + "storage-update", + "storage-update-project-connection", + "storage-upgrade-project-connection-to-oidc", + "storage-view-secret", + "strict-connectors", + "strict-deployment-protection-settings", + "strict-password-protection-settings", + "strict-shareable-links", + "subscription-created", + "subscription-product-added", + "subscription-product-removed", + "subscription-updated", + "support-session-created", + "team", + "team-agent-billing-migration-decision-changed", + "team-avatar-update", + "team-collaboration-settings-updated", + "team-default-build-machine-updated", + "team-default-passport-updated", + "team-delete", + "team-deployment-policy-updated", + "team-domain-verification-created", + "team-domain-verification-deleted", + "team-domain-verification-verified", + "team-email-domain-update", + "team-emu-updated", + "team-ended-trial", + "team-firewall-config-modified", + "team-firewall-config-promoted", + "team-git-repository-dispatch-events-toggled", + "team-git-require-verified-commits-toggled", + "team-invite-bulk-delete", + "team-invite-code-reset", + "team-invite-link-created", + "team-invite-link-deleted", + "team-ip-blocking-rules-created", + "team-ip-blocking-rules-removed", + "team-member-add", + "team-member-confirm-request", + "team-member-decline-request", + "team-member-delete", + "team-member-entitlement-added", + "team-member-entitlement-canceled", + "team-member-entitlement-reactivated", + "team-member-entitlement-removed", + "team-member-join", + "team-member-leave", + "team-member-request-access", + "team-member-role-update", + "team-member-sso-authorization-attempt", + "team-mfa-enforcement-updated", + "team-name-update", + "team-paid-invoice", + "team-program-enrollment-changed", + "team-remote-caching-purge", + "team-remote-caching-update", + "team-saml-enforced", + "team-saml-roles", + "team-slug-update", + "team-tokens-invalidated", + "tracing-configured", + "tracing-disabled", + "tracing-paused", + "tracing-resumed", + "unlink-login-connection", + "update-account-flow-dismissed", + "update-account-flow-triggered", + "user-auto-block-configured", + "user-blocked", + "user-delete", + "user-delete-requested", + "user-emu-account-archived", + "user-emu-account-deleted", + "user-emu-account-recovered", + "user-emu-account-update-opted-in", + "user-emu-account-update-opted-out", + "user-emu-recovery-email-sent", + "user-emu-recovery-initiated", + "user-emu-toggled", + "user-mfa-challenge-failed", + "user-mfa-challenge-initiated", + "user-mfa-challenge-verified", + "user-mfa-change-failed", + "user-mfa-configuration-updated", + "user-mfa-recovery-code-used", + "user-mfa-recovery-codes-regenerated", + "user-mfa-removed", + "user-mfa-setup-skipped", + "user-mfa-totp-verification-started", + "user-mfa-totp-verified", + "user-phone-removed", + "user-phone-updated", + "user-primary-email-updated", + "user-provider-email-claim-evaluated", + "user-sudo-mode-removed", + "user-token-created", + "user-token-deleted", + "user-tokens-deleted", + "user-unblocked", + "username", + "v0-chat-ai-usage", + "v0-chat-created", + "v0-chat-message-sent", + "vcr-image-deleted", + "vcr-image-pushed", + "vcr-repository-created", + "vcr-repository-deleted", + "vcr-repository-permission-added", + "vcr-repository-permission-removed", + "vcr-repository-permissions-cleared", + "vcr-repository-visibility-changed", + "vercel-agent-elevated-permissions-approved", + "vercel-agent-elevated-permissions-requested", + "vercel-agent-session-created", + "vercel-agent-team-trial-credits-applied", + "vercel-app-installation-request-dismissed", + "vercel-app-installation-requested", + "vercel-app-installation-updated", + "vercel-app-installed", + "vercel-app-tokens-revoked", + "vercel-app-uninstalled", + "vercel-toolbar", + "vpc-peering-connection-accepted", + "vpc-peering-connection-deleted", + "vpc-peering-connection-rejected", + "vpc-peering-connection-updated", + "vulnerability-banner-dismissed", + "web-analytics-tier-updated", + "webhook-created", + "webhook-deleted", + "webhook-updated", + "workflow-deployment-key-accessed" + ], + "description": "The type of the event.", + "example": "login" + }, + "categories": { + "items": { + "type": "string", + "enum": [ + "account", + "ai", + "ai-gateway", + "billing", + "connect", + "deployment", + "domain", + "edge", + "env-variable", + "feature-flags", + "firewall", + "integration", + "microfrontends", + "network", + "observability", + "other", + "project", + "security", + "storage", + "team", + "v0", + "vercel-app", + "workflow" + ], + "example": [ + "deployment" + ], + "description": "The categories that group this event with related event types. An event can belong to multiple categories (e.g. a firewall event is both Firewall and Security). The first entry is the \"primary\" category. Use the `/events/types` endpoint to discover the full list of categories." + }, + "type": "array", + "description": "The categories that group this event with related event types. An event can belong to multiple categories (e.g. a firewall event is both Firewall and Security). The first entry is the \"primary\" category. Use the `/events/types` endpoint to discover the full list of categories.", + "example": [ + "deployment" + ] + }, + "createdAt": { + "type": "number", + "description": "Timestamp (in milliseconds) of when the event was generated.", + "example": 1632859321020 + }, + "user": { + "properties": { + "slug": { + "type": "string" + }, + "avatar": { + "type": "string" + }, + "email": { + "type": "string" + }, + "username": { + "type": "string" + }, + "uid": { + "type": "string" + } + }, + "required": [ + "avatar", + "email", + "uid", + "username" + ], + "type": "object", + "description": "Metadata for {@link userId}." + }, + "principal": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "user" + ] + }, + "avatar": { + "type": "string" + }, + "email": { + "type": "string" + }, + "slug": { + "type": "string" + }, + "uid": { + "type": "string" + }, + "username": { + "type": "string" + } + }, + "required": [ + "avatar", + "email", + "uid", + "username" + ], + "type": "object", + "description": "Metadata for {@link principalId}." + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "app" + ] + }, + "id": { + "type": "string", + "description": "The backing Vercel App ID. When absent, defaults to `clientId`." + }, + "clientId": { + "type": "string", + "description": "The OAuth 2.0 client ID, which may be a CIMD URL." + }, + "name": { + "type": "string" + } + }, + "required": [ + "clientId", + "name", + "type" + ], + "type": "object", + "description": "Metadata for {@link principalId}." + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "external" + ] + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "email": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "type" + ], + "type": "object", + "description": "Metadata for {@link principalId}." + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "system" + ] + } + }, + "required": [ + "type" + ], + "type": "object", + "description": "Metadata for {@link principalId}." + } + ] + }, + "via": { + "items": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "user" + ] + }, + "avatar": { + "type": "string" + }, + "email": { + "type": "string" + }, + "slug": { + "type": "string" + }, + "uid": { + "type": "string" + }, + "username": { + "type": "string" + } + }, + "required": [ + "avatar", + "email", + "uid", + "username" + ], + "type": "object", + "description": "Metadata for {@link viaIds}." + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "app" + ] + }, + "id": { + "type": "string", + "description": "The backing Vercel App ID. When absent, defaults to `clientId`." + }, + "clientId": { + "type": "string", + "description": "The OAuth 2.0 client ID, which may be a CIMD URL." + }, + "name": { + "type": "string" + } + }, + "required": [ + "clientId", + "name", + "type" + ], + "type": "object", + "description": "Metadata for {@link viaIds}." + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "external" + ] + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "email": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "type" + ], + "type": "object", + "description": "Metadata for {@link viaIds}." + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "system" + ] + } + }, + "required": [ + "type" + ], + "type": "object", + "description": "Metadata for {@link viaIds}." + } + ] + }, + "type": "array", + "description": "Metadata for {@link viaIds}." + }, + "userId": { + "type": "string", + "description": "When the principal who generated the event is a user, this is their ID; otherwise, it is empty.", + "example": "zTuNVUXEAvvnNN3IaqinkyMw" + }, + "principalId": { + "type": "string", + "description": "The ID of the principal who generated the event. The principal is typically a user, but it could also be an app, an integration, etc. The principal may have delegated its authority to an acting party, and so {@link viaIds} should be checked as well." + }, + "viaIds": { + "items": { + "type": "string" + }, + "type": "array", + "description": "If the principal delegated its authority (for example, a user delegating to an app), then this array contains the ID of the current actor. For example, if `principalId` is \"user123\" and `viaIds` is `[\"app456\"]`, we can say the event was triggered by - \"app456 on behalf of user123\", or - \"user123 via app4556\". Both are equivalent. Arbitrarily long chains of delegation can be represented. For example, if `principalId` is \"user123\" and `viaIds` is `[\"service1\", \"service2\"]`, we can say the event was triggered by \"user123 via service1 via service2\"." + }, + "tokenId": { + "type": "string", + "description": "The public ID of the token that the principal authenticated with, when the request behind this event carried one." + }, + "sessionId": { + "type": "string", + "description": "The ID of the session that the principal's token belongs to, when it belongs to one." + }, + "requestId": { + "type": "string" + }, + "payload": { + "oneOf": [ + { + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "action": { + "type": "string", + "enum": [ + "archived", + "created", + "deleted", + "unarchived", + "updated" + ] + }, + "id": { + "type": "string" + }, + "slug": { + "type": "string" + }, + "projectId": { + "type": "string" + }, + "projectName": { + "type": "string" + } + }, + "required": [ + "action", + "id", + "projectId", + "slug" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "action": { + "type": "string", + "enum": [ + "created", + "deleted", + "transitioned", + "updated" + ] + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "slug": { + "type": "string" + }, + "state": { + "type": "string" + }, + "projectId": { + "type": "string" + }, + "projectName": { + "type": "string" + } + }, + "required": [ + "action", + "id", + "name", + "projectId", + "slug", + "state" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "action": { + "type": "string", + "enum": [ + "added", + "deleted", + "rotated" + ] + }, + "label": { + "type": "string" + }, + "projectName": { + "type": "string" + }, + "projectId": { + "type": "string" + }, + "environment": { + "type": "string" + } + }, + "required": [ + "action", + "environment" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "action": { + "type": "string", + "enum": [ + "read" + ] + }, + "projectName": { + "type": "string" + }, + "projectId": { + "type": "string" + }, + "environment": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "action", + "environment" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "projectId": { + "type": "string" + }, + "projectName": { + "type": "string" + }, + "policyId": { + "type": "string" + } + }, + "required": [ + "policyId", + "projectId", + "projectName" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "provider": { + "type": "string", + "enum": [ + "chatgpt", + "stripe" + ], + "description": "Present on new events only. Equivalent to \"stripe\" when absent." + }, + "providerAccount": { + "type": "string", + "description": "Present on new events only. Equivalent to `stripeAccount` when absent." + }, + "stripeAccount": { + "type": "string", + "description": "Present when `provider` is \"stripe\". Equivalent to `providerAccount`." + }, + "stripeOrganisation": { + "type": "string", + "description": "Present when `provider` is \"stripe\"." + }, + "teamId": { + "type": "string" + }, + "accountRequestId": { + "type": "string" + } + }, + "type": "object", + "description": "The payload of the event, if requested.", + "required": [ + "accountRequestId", + "teamId" + ] + }, + { + "properties": { + "provider": { + "type": "string", + "enum": [ + "chatgpt", + "stripe" + ], + "description": "Present on new events only. Equivalent to \"stripe\" when absent." + }, + "providerAccount": { + "type": "string", + "description": "Present on new events only. Equivalent to `stripeAccount` when absent." + }, + "stripeAccount": { + "type": "string", + "description": "Present when `provider` is \"stripe\". Equivalent to `providerAccount`." + }, + "stripeOrganisation": { + "type": "string", + "description": "Present when `provider` is \"stripe\"." + }, + "teamId": { + "type": "string" + } + }, + "type": "object", + "description": "The payload of the event, if requested.", + "required": [ + "teamId" + ] + }, + { + "properties": { + "provider": { + "type": "string", + "enum": [ + "chatgpt", + "stripe" + ], + "description": "Present on new events only. Equivalent to \"stripe\" when absent." + }, + "providerAccount": { + "type": "string", + "description": "Present on new events only. Equivalent to `stripeAccount` when absent." + }, + "stripeAccount": { + "type": "string", + "description": "Present when `provider` is \"stripe\". Equivalent to `providerAccount`." + }, + "stripeOrganisation": { + "type": "string", + "description": "Present when `provider` is \"stripe\"." + }, + "teamId": { + "type": "string" + }, + "teamSlug": { + "type": "string" + } + }, + "type": "object", + "description": "The payload of the event, if requested.", + "required": [ + "teamId", + "teamSlug" + ] + }, + { + "properties": { + "provider": { + "type": "string", + "enum": [ + "chatgpt", + "stripe" + ], + "description": "Present on new events only. Equivalent to \"stripe\" when absent." + }, + "providerAccount": { + "type": "string", + "description": "Present on new events only. Equivalent to `stripeAccount` when absent." + }, + "stripeAccount": { + "type": "string", + "description": "Present when `provider` is \"stripe\". Equivalent to `providerAccount`." + }, + "stripeOrganisation": { + "type": "string", + "description": "Present when `provider` is \"stripe\"." + }, + "reason": { + "type": "string" + }, + "blockCode": { + "type": "string" + } + }, + "type": "object", + "description": "The payload of the event, if requested.", + "required": [ + "blockCode", + "reason" + ] + }, + { + "properties": { + "provider": { + "type": "string", + "enum": [ + "chatgpt", + "stripe" + ], + "description": "Present on new events only. Equivalent to \"stripe\" when absent." + }, + "providerAccount": { + "type": "string", + "description": "Present on new events only. Equivalent to `stripeAccount` when absent." + }, + "stripeAccount": { + "type": "string", + "description": "Present when `provider` is \"stripe\". Equivalent to `providerAccount`." + }, + "resourceId": { + "type": "string" + }, + "projectName": { + "type": "string" + } + }, + "type": "object", + "description": "The payload of the event, if requested.", + "required": [ + "projectName", + "resourceId" + ] + }, + { + "properties": { + "provider": { + "type": "string", + "enum": [ + "chatgpt", + "stripe" + ], + "description": "Present on new events only. Equivalent to \"stripe\" when absent." + }, + "providerAccount": { + "type": "string", + "description": "Present on new events only. Equivalent to `stripeAccount` when absent." + }, + "stripeAccount": { + "type": "string", + "description": "Present when `provider` is \"stripe\". Equivalent to `providerAccount`." + }, + "stripeOrganisation": { + "type": "string", + "description": "Present when `provider` is \"stripe\"." + }, + "teamId": { + "type": "string" + }, + "actorId": { + "type": "string", + "description": "Okta user id." + }, + "actorType": { + "type": "string", + "enum": [ + "admin" + ] + }, + "actorName": { + "type": "string" + } + }, + "type": "object", + "description": "The payload of the event, if requested.", + "required": [ + "actorId", + "actorType", + "teamId" + ] + }, + { + "properties": { + "provider": { + "type": "string", + "enum": [ + "chatgpt", + "stripe" + ], + "description": "Present on new events only. Equivalent to \"stripe\" when absent." + }, + "providerAccount": { + "type": "string", + "description": "Present on new events only. Equivalent to `stripeAccount` when absent." + }, + "stripeAccount": { + "type": "string", + "description": "Present when `provider` is \"stripe\". Equivalent to `providerAccount`." + }, + "stripeOrganisation": { + "type": "string", + "description": "Present when `provider` is \"stripe\"." + }, + "teamId": { + "type": "string" + }, + "resourceId": { + "type": "string" + }, + "fromPlan": { + "type": "string", + "enum": [ + "hobby", + "pro" + ] + }, + "toPlan": { + "type": "string", + "enum": [ + "hobby", + "pro" + ] + } + }, + "type": "object", + "description": "The payload of the event, if requested.", + "required": [ + "fromPlan", + "resourceId", + "teamId", + "toPlan" + ] + }, + { + "properties": { + "apiKey": { + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + } + }, + "required": [ + "id", + "name" + ], + "type": "object" + }, + "budget": { + "nullable": true, + "properties": { + "limitAmount": { + "type": "number", + "description": "Spend cap, in dollars." + }, + "refreshPeriod": { + "type": "string", + "enum": [ + "daily", + "monthly", + "none", + "weekly" + ] + }, + "alertThresholds": { + "items": { + "type": "number" + }, + "type": "array" + } + }, + "required": [ + "limitAmount", + "refreshPeriod" + ], + "type": "object", + "description": "Spend budget on an AI Gateway API key, as surfaced in activity messages. Defined locally (rather than imported from `@api/pubsub-types`) because `@api/pubsub-types` already depends on `@api/events`; importing it here would create a circular dependency. Must stay structurally aligned with `APIKeyBudget` in `@api/pubsub-types/event-payloads/api-keys`." + }, + "zdrExemption": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "True when the key was created with a ZDR exemption." + }, + "bypassAll": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "True when the key was created to bypass all of the team's restrictions (the ZDR-only model restriction and the provider/model allowlist)." + } + }, + "required": [ + "apiKey" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "apiKey": { + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + } + }, + "required": [ + "id", + "name" + ], + "type": "object" + } + }, + "required": [ + "apiKey" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "apiKey": { + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + } + }, + "required": [ + "id", + "name" + ], + "type": "object" + }, + "budget": { + "nullable": true, + "properties": { + "limitAmount": { + "type": "number", + "description": "Spend cap, in dollars." + }, + "refreshPeriod": { + "type": "string", + "enum": [ + "daily", + "monthly", + "none", + "weekly" + ] + }, + "alertThresholds": { + "items": { + "type": "number" + }, + "type": "array" + } + }, + "required": [ + "limitAmount", + "refreshPeriod" + ], + "type": "object", + "description": "Spend budget on an AI Gateway API key, as surfaced in activity messages. Defined locally (rather than imported from `@api/pubsub-types`) because `@api/pubsub-types` already depends on `@api/events`; importing it here would create a circular dependency. Must stay structurally aligned with `APIKeyBudget` in `@api/pubsub-types/event-payloads/api-keys`." + }, + "change": { + "type": "string", + "enum": [ + "disable", + "enable", + "remove", + "set" + ] + } + }, + "required": [ + "apiKey", + "change" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "change": { + "type": "string", + "enum": [ + "disable", + "disable-commitment", + "enable", + "enable-commitment", + "update" + ] + }, + "settings": { + "properties": { + "minimumBalance": { + "type": "string" + }, + "targetBalance": { + "type": "string" + }, + "maximumMonthlySpend": { + "nullable": true, + "type": "string" + } + }, + "required": [ + "maximumMonthlySpend", + "minimumBalance", + "targetBalance" + ], + "type": "object" + }, + "previous": { + "properties": { + "minimumBalance": { + "type": "string" + }, + "targetBalance": { + "type": "string" + }, + "maximumMonthlySpend": { + "nullable": true, + "type": "string" + } + }, + "required": [ + "maximumMonthlySpend", + "minimumBalance", + "targetBalance" + ], + "type": "object" + }, + "commitment": { + "properties": { + "maximumMonthlySpend": { + "nullable": true, + "type": "string" + }, + "deferredInvoiceTargetBalance": { + "type": "string" + } + }, + "required": [ + "deferredInvoiceTargetBalance", + "maximumMonthlySpend" + ], + "type": "object" + } + }, + "required": [ + "change" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "scopeType": { + "type": "string", + "enum": [ + "api-key", + "project", + "team", + "user" + ] + }, + "budget": { + "nullable": true, + "properties": { + "limitAmount": { + "type": "number", + "description": "Spend cap, in dollars." + }, + "refreshPeriod": { + "type": "string", + "enum": [ + "daily", + "monthly", + "none", + "weekly" + ] + }, + "alertThresholds": { + "items": { + "type": "number" + }, + "type": "array" + } + }, + "required": [ + "limitAmount", + "refreshPeriod" + ], + "type": "object", + "description": "Spend budget on an AI Gateway API key, as surfaced in activity messages. Defined locally (rather than imported from `@api/pubsub-types`) because `@api/pubsub-types` already depends on `@api/events`; importing it here would create a circular dependency. Must stay structurally aligned with `APIKeyBudget` in `@api/pubsub-types/event-payloads/api-keys`." + }, + "change": { + "type": "string", + "enum": [ + "disable", + "enable", + "remove", + "set" + ] + } + }, + "required": [ + "change", + "scopeType" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "scopeType": { + "type": "string", + "enum": [ + "project", + "team", + "user" + ] + }, + "projectId": { + "type": "string", + "description": "Associates the event with a project for filtering; not rendered." + }, + "projectName": { + "type": "string" + }, + "userId": { + "type": "string", + "description": "Associates the event with a member for filtering; not rendered." + }, + "userName": { + "type": "string" + }, + "budget": { + "nullable": true, + "properties": { + "limitAmount": { + "type": "number", + "description": "Spend cap, in dollars." + }, + "refreshPeriod": { + "type": "string", + "enum": [ + "daily", + "monthly", + "none", + "weekly" + ] + }, + "alertThresholds": { + "items": { + "type": "number" + }, + "type": "array" + } + }, + "required": [ + "limitAmount", + "refreshPeriod" + ], + "type": "object", + "description": "Spend budget on an AI Gateway API key, as surfaced in activity messages. Defined locally (rather than imported from `@api/pubsub-types`) because `@api/pubsub-types` already depends on `@api/events`; importing it here would create a circular dependency. Must stay structurally aligned with `APIKeyBudget` in `@api/pubsub-types/event-payloads/api-keys`." + }, + "change": { + "type": "string", + "enum": [ + "disable", + "enable", + "remove", + "set" + ] + } + }, + "required": [ + "change", + "scopeType" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "credential": { + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "providerSlug": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "providerSlug" + ], + "type": "object" + } + }, + "required": [ + "credential" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "credential": { + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "providerSlug": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "providerSlug" + ], + "type": "object" + }, + "added": { + "items": { + "type": "string" + }, + "type": "array" + }, + "removed": { + "items": { + "type": "string" + }, + "type": "array" + }, + "changed": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "added", + "changed", + "credential", + "removed" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "enabled": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "enabled" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "amount": { + "type": "string" + }, + "purchaseIntentId": { + "type": "string" + } + }, + "required": [ + "amount", + "purchaseIntentId" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "added": { + "items": { + "type": "string" + }, + "type": "array" + }, + "removed": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "added", + "removed" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "privateModel": { + "properties": { + "slug": { + "type": "string" + }, + "providerSlug": { + "type": "string" + } + }, + "required": [ + "providerSlug", + "slug" + ], + "type": "object" + } + }, + "required": [ + "privateModel" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "privateModel": { + "properties": { + "slug": { + "type": "string" + } + }, + "required": [ + "slug" + ], + "type": "object" + } + }, + "required": [ + "privateModel" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "privateProvider": { + "properties": { + "slug": { + "type": "string" + } + }, + "required": [ + "slug" + ], + "type": "object" + } + }, + "required": [ + "privateProvider" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "piiRedaction": { + "properties": { + "from": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "to": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "from", + "to" + ], + "type": "object" + }, + "moderationPolicyCount": { + "type": "number" + }, + "policiesAdded": { + "items": { + "type": "string" + }, + "type": "array" + }, + "policiesRemoved": { + "items": { + "type": "string" + }, + "type": "array" + }, + "policiesModified": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "moderationPolicyCount", + "piiRedaction", + "policiesAdded", + "policiesModified", + "policiesRemoved" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "regions": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "regions" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "retention": { + "properties": { + "defaultMode": { + "type": "string", + "enum": [ + "days", + "until-requested" + ] + }, + "defaultDays": { + "type": "number" + }, + "ceilingMode": { + "type": "string", + "enum": [ + "days", + "until-requested" + ] + }, + "ceilingDays": { + "type": "number" + } + }, + "required": [ + "ceilingMode", + "defaultMode" + ], + "type": "object" + } + }, + "required": [ + "retention" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "rule": { + "properties": { + "id": { + "type": "string" + }, + "type": { + "type": "string" + }, + "model": { + "type": "string" + }, + "rewriteModel": { + "type": "string" + } + }, + "required": [ + "id", + "type" + ], + "type": "object" + } + }, + "required": [ + "rule" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "rule": { + "properties": { + "id": { + "type": "string" + }, + "type": { + "type": "string" + }, + "model": { + "type": "string" + } + }, + "required": [ + "id", + "type" + ], + "type": "object" + } + }, + "required": [ + "rule" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "rule": { + "properties": { + "id": { + "type": "string" + }, + "type": { + "type": "string" + }, + "model": { + "type": "string" + } + }, + "required": [ + "id", + "type" + ], + "type": "object" + }, + "enabled": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "rule" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "virtualModelConfig": { + "properties": { + "id": { + "type": "string" + }, + "displayName": { + "type": "string" + }, + "modelSlug": { + "type": "string" + } + }, + "required": [ + "id" + ], + "type": "object" + } + }, + "required": [ + "virtualModelConfig" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "accessGroup": { + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + } + }, + "required": [ + "id", + "name" + ], + "type": "object" + }, + "teamRoles": { + "items": { + "type": "string" + }, + "type": "array" + }, + "teamPermissions": { + "items": { + "type": "string" + }, + "type": "array" + }, + "entitlements": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "accessGroup" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "author": { + "type": "string" + }, + "accessGroup": { + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + } + }, + "required": [ + "id", + "name" + ], + "type": "object" + } + }, + "required": [ + "accessGroup", + "author" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "accessGroup": { + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + } + }, + "required": [ + "id", + "name" + ], + "type": "object" + }, + "project": { + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + } + }, + "required": [ + "id" + ], + "type": "object" + }, + "next_role": { + "nullable": true, + "type": "string", + "enum": [ + "ADMIN", + "PROJECT_DEVELOPER", + "PROJECT_GUEST", + "PROJECT_VIEWER", + null + ] + }, + "previous_role": { + "type": "string", + "enum": [ + "ADMIN", + "PROJECT_DEVELOPER", + "PROJECT_GUEST", + "PROJECT_VIEWER" + ] + } + }, + "required": [ + "accessGroup", + "project" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "accessGroup": { + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + } + }, + "required": [ + "id", + "name" + ], + "type": "object" + }, + "name": { + "type": "string" + }, + "previousName": { + "type": "string" + }, + "teamRoles": { + "items": { + "type": "string" + }, + "type": "array" + }, + "previousTeamRoles": { + "items": { + "type": "string" + }, + "type": "array" + }, + "teamPermissions": { + "items": { + "type": "string" + }, + "type": "array" + }, + "previousTeamPermissions": { + "items": { + "type": "string" + }, + "type": "array" + }, + "entitlementsAdded": { + "items": { + "type": "string" + }, + "type": "array" + }, + "entitlementsRemoved": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "accessGroup" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "accessGroup": { + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + } + }, + "required": [ + "id" + ], + "type": "object" + }, + "user": { + "properties": { + "id": { + "type": "string" + }, + "username": { + "type": "string" + } + }, + "required": [ + "id" + ], + "type": "object" + }, + "directoryType": { + "type": "string" + } + }, + "required": [ + "accessGroup", + "user" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "price": { + "type": "number" + }, + "currency": { + "type": "string" + } + }, + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "alias": { + "type": "string" + }, + "deployment": { + "nullable": true, + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "url": { + "type": "string" + }, + "meta": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "readyState": { + "type": "string" + }, + "allowListedReadyStateReasonInternal": { + "type": "string", + "enum": [ + "EARLY_IGNORE_STEP", + "IGNORE_STEP", + "NAMESPACE_PRUNED", + "UNAFFECTED_PROJECT", + "UNVERIFIED_COMMIT" + ], + "description": "A narrowed subset of the deployment's `readyStateReasonInternal` — only values in the public allowlist are permitted here. Callers should run their raw reason through `toAllowListedReadyStateReasonInternal` from `@api/events` before assigning. This keeps abuse / moderation / admin reasons out of the public activity log." + } + }, + "required": [ + "id", + "meta", + "name", + "url" + ], + "type": "object" + }, + "ruleCount": { + "type": "number" + }, + "deploymentUrl": { + "type": "string" + }, + "aliasId": { + "type": "string" + }, + "deploymentId": { + "nullable": true, + "type": "string" + }, + "oldDeploymentId": { + "nullable": true, + "type": "string" + }, + "redirect": { + "type": "string" + }, + "redirectStatusCode": { + "nullable": true, + "type": "number" + }, + "target": { + "nullable": true, + "type": "string" + }, + "system": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "aliasUpdatedAt": { + "type": "number" + } + }, + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "projectId": { + "type": "string" + }, + "aliasCount": { + "type": "number" + }, + "deployment": { + "nullable": true, + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "url": { + "type": "string" + }, + "meta": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "readyState": { + "type": "string" + }, + "allowListedReadyStateReasonInternal": { + "type": "string", + "enum": [ + "EARLY_IGNORE_STEP", + "IGNORE_STEP", + "NAMESPACE_PRUNED", + "UNAFFECTED_PROJECT", + "UNVERIFIED_COMMIT" + ], + "description": "A narrowed subset of the deployment's `readyStateReasonInternal` — only values in the public allowlist are permitted here. Callers should run their raw reason through `toAllowListedReadyStateReasonInternal` from `@api/events` before assigning. This keeps abuse / moderation / admin reasons out of the public activity log." + } + }, + "required": [ + "id", + "meta", + "name", + "url" + ], + "type": "object" + } + }, + "required": [ + "aliasCount", + "projectId" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "name": { + "type": "string" + }, + "alias": { + "type": "string" + }, + "oldTeam": { + "properties": { + "name": { + "type": "string" + } + }, + "required": [ + "name" + ], + "type": "object" + }, + "newTeam": { + "properties": { + "name": { + "type": "string" + } + }, + "required": [ + "name" + ], + "type": "object" + } + }, + "required": [ + "alias" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "name": { + "type": "string" + }, + "alias": { + "type": "string" + }, + "aliasId": { + "type": "string" + }, + "deploymentId": { + "nullable": true, + "type": "string" + } + }, + "required": [ + "alias", + "aliasId", + "deploymentId" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "alias": { + "type": "string" + }, + "email": { + "type": "string" + }, + "username": { + "type": "string" + } + }, + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "alias": { + "type": "string" + } + }, + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "alias": { + "type": "string" + }, + "email": { + "type": "string" + } + }, + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "aliasId": { + "type": "string" + }, + "alias": { + "type": "string" + }, + "projectId": { + "type": "string" + }, + "projectName": { + "type": "string" + } + }, + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "projectId": { + "type": "string" + }, + "projectName": { + "type": "string" + }, + "alias": { + "type": "string" + }, + "action": { + "type": "string", + "enum": [ + "created", + "removed" + ] + } + }, + "required": [ + "action", + "alias", + "projectName" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "alias": { + "type": "string" + }, + "deploymentUrl": { + "type": "string" + } + }, + "required": [ + "alias", + "deploymentUrl" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "alias": { + "type": "string" + }, + "userId": { + "type": "string" + }, + "username": { + "type": "string" + } + }, + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "alias": { + "type": "string" + }, + "aliasId": { + "type": "string" + }, + "userId": { + "type": "string" + }, + "username": { + "type": "string" + } + }, + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "appName": { + "type": "string" + }, + "appId": { + "type": "string" + }, + "scopes": { + "items": { + "type": "string", + "enum": [ + "email", + "offline_access", + "openid", + "profile" + ] + }, + "type": "array" + }, + "permissions": { + "items": { + "type": "string", + "enum": [ + "*", + "manage:speed-insights", + "manage:web-analytics", + "read-write:ai-gateway-api-key", + "read-write:ai-gateway-guardrails", + "read-write:ai-gateway-private-models", + "read-write:ai-gateway-rules", + "read-write:ai-gateway-virtual-model-configs", + "read-write:alerts", + "read-write:automations", + "read-write:billing", + "read-write:blob", + "read-write:connect", + "read-write:deployment", + "read-write:domain", + "read-write:domain-registrar", + "read-write:drains", + "read-write:edge-cache", + "read-write:edge-config", + "read-write:firewall", + "read-write:integration-configuration", + "read-write:integration-resource", + "read-write:kms", + "read-write:project", + "read-write:project-env-vars", + "read-write:project-env-vars-non-production", + "read-write:project-env-vars-production", + "read-write:project-flags-non-production", + "read-write:project-flags-production", + "read-write:project-protection-bypass", + "read-write:remote-cache", + "read-write:sandbox", + "read-write:team-members", + "read-write:vcr", + "read:access-group", + "read:ai-gateway-guardrails", + "read:ai-gateway-private-models", + "read:ai-gateway-rules", + "read:ai-gateway-virtual-model-configs", + "read:alerts", + "read:automations", + "read:billing", + "read:connect", + "read:deployment", + "read:domain", + "read:event", + "read:firewall", + "read:integration-configuration", + "read:integration-resource", + "read:kms", + "read:monitoring", + "read:project", + "read:project-env-vars-non-production", + "read:project-env-vars-production", + "read:project-flags", + "read:remote-cache", + "read:sandbox", + "read:speed-insights", + "read:team", + "read:user", + "read:vcr", + "read:web-analytics", + "read:webhooks", + "use:ai-gateway" + ] + }, + "type": "array" + } + }, + "required": [ + "appName", + "scopes" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "appName": { + "type": "string" + }, + "appId": { + "type": "string" + } + }, + "required": [ + "appName" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "appName": { + "type": "string" + }, + "appId": { + "type": "string" + }, + "nextScopes": { + "items": { + "type": "string", + "enum": [ + "email", + "offline_access", + "openid", + "profile" + ] + }, + "type": "array" + }, + "nextPermissions": { + "items": { + "type": "string", + "enum": [ + "*", + "manage:speed-insights", + "manage:web-analytics", + "read-write:ai-gateway-api-key", + "read-write:ai-gateway-guardrails", + "read-write:ai-gateway-private-models", + "read-write:ai-gateway-rules", + "read-write:ai-gateway-virtual-model-configs", + "read-write:alerts", + "read-write:automations", + "read-write:billing", + "read-write:blob", + "read-write:connect", + "read-write:deployment", + "read-write:domain", + "read-write:domain-registrar", + "read-write:drains", + "read-write:edge-cache", + "read-write:edge-config", + "read-write:firewall", + "read-write:integration-configuration", + "read-write:integration-resource", + "read-write:kms", + "read-write:project", + "read-write:project-env-vars", + "read-write:project-env-vars-non-production", + "read-write:project-env-vars-production", + "read-write:project-flags-non-production", + "read-write:project-flags-production", + "read-write:project-protection-bypass", + "read-write:remote-cache", + "read-write:sandbox", + "read-write:team-members", + "read-write:vcr", + "read:access-group", + "read:ai-gateway-guardrails", + "read:ai-gateway-private-models", + "read:ai-gateway-rules", + "read:ai-gateway-virtual-model-configs", + "read:alerts", + "read:automations", + "read:billing", + "read:connect", + "read:deployment", + "read:domain", + "read:event", + "read:firewall", + "read:integration-configuration", + "read:integration-resource", + "read:kms", + "read:monitoring", + "read:project", + "read:project-env-vars-non-production", + "read:project-env-vars-production", + "read:project-flags", + "read:remote-cache", + "read:sandbox", + "read:speed-insights", + "read:team", + "read:user", + "read:vcr", + "read:web-analytics", + "read:webhooks", + "use:ai-gateway" + ] + }, + "type": "array" + } + }, + "required": [ + "appName", + "nextScopes" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "appName": { + "type": "string" + }, + "appId": { + "type": "string" + }, + "installationId": { + "type": "string" + }, + "before": { + "properties": { + "resources": { + "properties": { + "projectIds": { + "properties": { + "type": { + "type": "string", + "enum": [ + "list" + ] + }, + "required": { + "type": "boolean", + "enum": [ + true + ] + }, + "items": { + "properties": { + "type": { + "type": "string", + "enum": [ + "string" + ] + } + }, + "required": [ + "type" + ], + "type": "object" + } + }, + "required": [ + "items", + "required", + "type" + ], + "type": "object", + "description": "Specific project IDs or all projects on the team (`['*']`)." + } + }, + "required": [ + "projectIds" + ], + "type": "object" + }, + "permissions": { + "items": { + "type": "string", + "enum": [ + "manage:speed-insights", + "manage:web-analytics", + "read-write:ai-gateway-api-key", + "read-write:ai-gateway-guardrails", + "read-write:ai-gateway-private-models", + "read-write:ai-gateway-rules", + "read-write:ai-gateway-virtual-model-configs", + "read-write:alerts", + "read-write:automations", + "read-write:billing", + "read-write:blob", + "read-write:connect", + "read-write:deployment", + "read-write:domain", + "read-write:domain-registrar", + "read-write:drains", + "read-write:edge-cache", + "read-write:edge-config", + "read-write:firewall", + "read-write:integration-configuration", + "read-write:integration-resource", + "read-write:kms", + "read-write:project", + "read-write:project-env-vars", + "read-write:project-env-vars-non-production", + "read-write:project-env-vars-production", + "read-write:project-flags-non-production", + "read-write:project-flags-production", + "read-write:project-protection-bypass", + "read-write:remote-cache", + "read-write:sandbox", + "read-write:team-members", + "read-write:vcr", + "read:access-group", + "read:ai-gateway-guardrails", + "read:ai-gateway-private-models", + "read:ai-gateway-rules", + "read:ai-gateway-virtual-model-configs", + "read:alerts", + "read:automations", + "read:billing", + "read:connect", + "read:deployment", + "read:domain", + "read:event", + "read:firewall", + "read:integration-configuration", + "read:integration-resource", + "read:kms", + "read:monitoring", + "read:project", + "read:project-env-vars-non-production", + "read:project-env-vars-production", + "read:project-flags", + "read:remote-cache", + "read:sandbox", + "read:speed-insights", + "read:team", + "read:vcr", + "read:web-analytics", + "read:webhooks", + "use:ai-gateway" + ] + }, + "type": "array" + } + }, + "type": "object" + }, + "after": { + "properties": { + "resources": { + "properties": { + "projectIds": { + "properties": { + "type": { + "type": "string", + "enum": [ + "list" + ] + }, + "required": { + "type": "boolean", + "enum": [ + true + ] + }, + "items": { + "properties": { + "type": { + "type": "string", + "enum": [ + "string" + ] + } + }, + "required": [ + "type" + ], + "type": "object" + } + }, + "required": [ + "items", + "required", + "type" + ], + "type": "object", + "description": "Specific project IDs or all projects on the team (`['*']`)." + } + }, + "required": [ + "projectIds" + ], + "type": "object" + }, + "permissions": { + "items": { + "type": "string", + "enum": [ + "manage:speed-insights", + "manage:web-analytics", + "read-write:ai-gateway-api-key", + "read-write:ai-gateway-guardrails", + "read-write:ai-gateway-private-models", + "read-write:ai-gateway-rules", + "read-write:ai-gateway-virtual-model-configs", + "read-write:alerts", + "read-write:automations", + "read-write:billing", + "read-write:blob", + "read-write:connect", + "read-write:deployment", + "read-write:domain", + "read-write:domain-registrar", + "read-write:drains", + "read-write:edge-cache", + "read-write:edge-config", + "read-write:firewall", + "read-write:integration-configuration", + "read-write:integration-resource", + "read-write:kms", + "read-write:project", + "read-write:project-env-vars", + "read-write:project-env-vars-non-production", + "read-write:project-env-vars-production", + "read-write:project-flags-non-production", + "read-write:project-flags-production", + "read-write:project-protection-bypass", + "read-write:remote-cache", + "read-write:sandbox", + "read-write:team-members", + "read-write:vcr", + "read:access-group", + "read:ai-gateway-guardrails", + "read:ai-gateway-private-models", + "read:ai-gateway-rules", + "read:ai-gateway-virtual-model-configs", + "read:alerts", + "read:automations", + "read:billing", + "read:connect", + "read:deployment", + "read:domain", + "read:event", + "read:firewall", + "read:integration-configuration", + "read:integration-resource", + "read:kms", + "read:monitoring", + "read:project", + "read:project-env-vars-non-production", + "read:project-env-vars-production", + "read:project-flags", + "read:remote-cache", + "read:sandbox", + "read:speed-insights", + "read:team", + "read:vcr", + "read:web-analytics", + "read:webhooks", + "use:ai-gateway" + ] + }, + "type": "array" + } + }, + "type": "object" + } + }, + "required": [ + "appName" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "appName": { + "type": "string" + }, + "appId": { + "type": "string" + }, + "resources": { + "properties": { + "projectIds": { + "properties": { + "type": { + "type": "string", + "enum": [ + "list" + ] + }, + "required": { + "type": "boolean", + "enum": [ + true + ] + }, + "items": { + "properties": { + "type": { + "type": "string", + "enum": [ + "string" + ] + } + }, + "required": [ + "type" + ], + "type": "object" + } + }, + "required": [ + "items", + "required", + "type" + ], + "type": "object", + "description": "Specific project IDs or all projects on the team (`['*']`)." + } + }, + "required": [ + "projectIds" + ], + "type": "object" + }, + "permissions": { + "items": { + "type": "string", + "enum": [ + "manage:speed-insights", + "manage:web-analytics", + "read-write:ai-gateway-api-key", + "read-write:ai-gateway-guardrails", + "read-write:ai-gateway-private-models", + "read-write:ai-gateway-rules", + "read-write:ai-gateway-virtual-model-configs", + "read-write:alerts", + "read-write:automations", + "read-write:billing", + "read-write:blob", + "read-write:connect", + "read-write:deployment", + "read-write:domain", + "read-write:domain-registrar", + "read-write:drains", + "read-write:edge-cache", + "read-write:edge-config", + "read-write:firewall", + "read-write:integration-configuration", + "read-write:integration-resource", + "read-write:kms", + "read-write:project", + "read-write:project-env-vars", + "read-write:project-env-vars-non-production", + "read-write:project-env-vars-production", + "read-write:project-flags-non-production", + "read-write:project-flags-production", + "read-write:project-protection-bypass", + "read-write:remote-cache", + "read-write:sandbox", + "read-write:team-members", + "read-write:vcr", + "read:access-group", + "read:ai-gateway-guardrails", + "read:ai-gateway-private-models", + "read:ai-gateway-rules", + "read:ai-gateway-virtual-model-configs", + "read:alerts", + "read:automations", + "read:billing", + "read:connect", + "read:deployment", + "read:domain", + "read:event", + "read:firewall", + "read:integration-configuration", + "read:integration-resource", + "read:kms", + "read:monitoring", + "read:project", + "read:project-env-vars-non-production", + "read:project-env-vars-production", + "read:project-flags", + "read:remote-cache", + "read:sandbox", + "read:speed-insights", + "read:team", + "read:vcr", + "read:web-analytics", + "read:webhooks", + "use:ai-gateway" + ] + }, + "type": "array" + } + }, + "required": [ + "appName" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "appName": { + "type": "string" + }, + "appId": { + "type": "string" + }, + "secretLastFourChars": { + "type": "string" + } + }, + "required": [ + "appName" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "appName": { + "type": "string", + "description": "The App's name at the moment this even was published (it may have changed since then)." + }, + "appId": { + "type": "string", + "description": "The App's ID. Note that not all historical events have this field." + }, + "app": { + "properties": { + "id": { + "type": "string", + "description": "The App's ID." + }, + "name": { + "type": "string", + "description": "The App's name at the moment this even was published (it may have changed since then)." + } + }, + "required": [ + "id", + "name" + ], + "type": "object", + "description": "Note that not all historical events have this field." + }, + "issuedBefore": { + "type": "number", + "description": "UNIX timestamp in seconds. Tokens issued before this timestamp will be revoked. Note that not all historical events have this field." + } + }, + "required": [ + "appName" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "projectId": { + "type": "string" + }, + "prevAttackModeEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "prevAttackModeActiveUntil": { + "nullable": true, + "type": "number" + }, + "attackModeEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "attackModeActiveUntil": { + "nullable": true, + "type": "number" + } + }, + "required": [ + "attackModeEnabled", + "projectId" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "projectId": { + "type": "string" + }, + "projectName": { + "type": "string" + }, + "autoExposeSystemEnvs": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "autoExposeSystemEnvs", + "projectName" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "avatar": { + "type": "string" + } + }, + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "invoiceId": { + "type": "string" + }, + "amount": { + "type": "number" + }, + "refundReason": { + "type": "string" + }, + "lineItemCount": { + "type": "number" + } + }, + "required": [ + "amount", + "invoiceId", + "lineItemCount", + "refundReason" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "invoiceId": { + "type": "string" + }, + "newInvoiceId": { + "type": "string" + }, + "settlementMethod": { + "type": "string", + "enum": [ + "credited-paid", + "credited-payment-pending", + "refunded-paid", + "refunded-payment-pending" + ] + }, + "amount": { + "type": "number" + } + }, + "required": [ + "amount", + "invoiceId", + "newInvoiceId", + "settlementMethod" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "paymentMethodId": { + "type": "string" + }, + "brand": { + "type": "string" + }, + "last4": { + "type": "string" + } + }, + "required": [ + "paymentMethodId" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "changedFields": { + "items": { + "type": "string", + "enum": [ + "address", + "email", + "language", + "name", + "purchaseOrder", + "tax" + ] + }, + "type": "array" + } + }, + "required": [ + "changedFields" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "subscriptionId": { + "type": "string" + }, + "planSlug": { + "type": "string" + } + }, + "type": "object", + "description": "The payload of the event, if requested.", + "required": [ + "planSlug" + ] + }, + { + "properties": { + "subscriptionId": { + "type": "string" + }, + "action": { + "type": "string", + "enum": [ + "cancel_plan" + ] + }, + "data": { + "properties": { + "planSlug": { + "type": "string", + "enum": [ + "v0_business", + "v0_teams" + ] + }, + "reason": { + "type": "string", + "enum": [ + "non-payment" + ] + } + }, + "required": [ + "planSlug" + ], + "type": "object" + } + }, + "type": "object", + "description": "The payload of the event, if requested.", + "required": [ + "action", + "data" + ] + }, + { + "properties": { + "subscriptionId": { + "type": "string" + }, + "action": { + "type": "string", + "enum": [ + "resume_plan" + ] + }, + "data": { + "properties": { + "planSlug": { + "type": "string", + "enum": [ + "v0_business", + "v0_teams" + ] + } + }, + "required": [ + "planSlug" + ], + "type": "object" + } + }, + "type": "object", + "description": "The payload of the event, if requested.", + "required": [ + "action", + "data" + ] + }, + { + "properties": { + "subscriptionId": { + "type": "string" + }, + "action": { + "type": "string", + "enum": [ + "mutate" + ] + }, + "data": { + "additionalProperties": true, + "type": "object" + } + }, + "type": "object", + "description": "The payload of the event, if requested.", + "required": [ + "action", + "data" + ] + }, + { + "properties": { + "subscriptionId": { + "type": "string" + }, + "productAliases": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object", + "description": "The payload of the event, if requested.", + "required": [ + "productAliases" + ] + }, + { + "properties": { + "project": { + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + } + }, + "required": [ + "id", + "name" + ], + "type": "object" + }, + "bulkRedirectsLimit": { + "type": "number" + }, + "prevBulkRedirectsLimit": { + "type": "number" + } + }, + "required": [ + "bulkRedirectsLimit", + "prevBulkRedirectsLimit", + "project" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "project": { + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + } + }, + "required": [ + "id", + "name" + ], + "type": "object" + }, + "versionId": { + "type": "string" + } + }, + "required": [ + "project", + "versionId" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "cn": { + "type": "string" + }, + "cns": { + "items": { + "type": "string" + }, + "type": "array" + }, + "custom": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "id": { + "type": "string" + } + }, + "required": [ + "custom" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "id": { + "type": "string" + }, + "cns": { + "items": { + "type": "string" + }, + "type": "array" + }, + "custom": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "cns", + "custom", + "id" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "cn": { + "type": "string" + }, + "cns": { + "items": { + "type": "string" + }, + "type": "array" + }, + "id": { + "type": "string" + } + }, + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "id": { + "type": "string" + }, + "oldTeam": { + "properties": { + "name": { + "type": "string" + } + }, + "required": [ + "name" + ], + "type": "object" + }, + "newTeam": { + "properties": { + "name": { + "type": "string" + } + }, + "required": [ + "name" + ], + "type": "object" + } + }, + "required": [ + "id" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "src": { + "type": "string" + }, + "dst": { + "type": "string" + } + }, + "required": [ + "dst", + "src" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "id": { + "type": "string" + }, + "cn": { + "type": "string" + }, + "cns": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "id" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "cn": { + "type": "string" + }, + "cns": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "gitOwnerName": { + "type": "string" + }, + "gitRepositoryName": { + "type": "string" + }, + "previous": { + "properties": { + "enabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "autoAddReviewers": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "autoAddReviewers", + "enabled" + ], + "type": "object" + }, + "next": { + "properties": { + "enabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "autoAddReviewers": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "autoAddReviewers", + "enabled" + ], + "type": "object" + } + }, + "required": [ + "gitOwnerName", + "gitRepositoryName", + "next", + "previous" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "slug": { + "type": "string" + }, + "documentId": { + "type": "string" + }, + "title": { + "type": "string" + }, + "fingerprint": { + "type": "string" + } + }, + "required": [ + "documentId", + "fingerprint", + "slug", + "title" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "count": { + "type": "number" + }, + "documents": { + "items": { + "properties": { + "slug": { + "type": "string" + }, + "documentId": { + "type": "string" + }, + "title": { + "type": "string" + }, + "fingerprint": { + "type": "string" + } + }, + "required": [ + "documentId", + "fingerprint", + "slug", + "title" + ], + "type": "object", + "description": "A single document included in a bulk compliance download." + }, + "type": "array" + } + }, + "required": [ + "count", + "documents" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "configuration": { + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + } + }, + "required": [ + "id", + "name" + ], + "type": "object" + } + }, + "required": [ + "configuration" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "team": { + "properties": { + "name": { + "type": "string" + }, + "id": { + "type": "string" + } + }, + "required": [ + "id", + "name" + ], + "type": "object" + }, + "configuration": { + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + } + }, + "required": [ + "id" + ], + "type": "object" + }, + "project": { + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + } + }, + "required": [ + "id" + ], + "type": "object" + }, + "buildsEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "configuration", + "project", + "team" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "team": { + "properties": { + "name": { + "type": "string" + }, + "id": { + "type": "string" + } + }, + "required": [ + "id", + "name" + ], + "type": "object" + }, + "configuration": { + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + } + }, + "required": [ + "id" + ], + "type": "object" + }, + "project": { + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + } + }, + "required": [ + "id" + ], + "type": "object" + }, + "buildsEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "passive": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "configuration", + "project", + "team" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "team": { + "properties": { + "name": { + "type": "string" + }, + "id": { + "type": "string" + } + }, + "required": [ + "id", + "name" + ], + "type": "object" + }, + "configuration": { + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + } + }, + "required": [ + "id" + ], + "type": "object" + }, + "project": { + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + } + }, + "required": [ + "id" + ], + "type": "object" + } + }, + "required": [ + "configuration", + "project", + "team" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "team": { + "properties": { + "name": { + "type": "string" + }, + "id": { + "type": "string" + } + }, + "required": [ + "id", + "name" + ], + "type": "object" + }, + "configuration": { + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + } + }, + "required": [ + "id" + ], + "type": "object" + }, + "newName": { + "type": "string" + } + }, + "required": [ + "configuration", + "newName", + "team" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "githubLogin": { + "type": "string" + }, + "host": { + "type": "string" + } + }, + "required": [ + "githubLogin" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "githubLogin": { + "type": "string" + } + }, + "required": [ + "githubLogin" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "githubLogin": { + "type": "string" + }, + "host": { + "type": "string" + } + }, + "required": [ + "githubLogin", + "host" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "gitlabLogin": { + "type": "string" + }, + "gitlabEmail": { + "type": "string" + }, + "gitlabName": { + "type": "string" + }, + "zeitAccount": { + "type": "string" + }, + "zeitAccountType": { + "type": "string" + } + }, + "required": [ + "gitlabEmail", + "gitlabLogin" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "gitlabLogin": { + "type": "string" + }, + "gitlabUserId": { + "type": "number" + } + }, + "required": [ + "gitlabLogin", + "gitlabUserId" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "bitbucketEmail": { + "type": "string" + }, + "bitbucketLogin": { + "type": "string" + }, + "bitbucketName": { + "type": "string" + } + }, + "required": [ + "bitbucketEmail", + "bitbucketLogin" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "bitbucketLogin": { + "type": "string" + }, + "bitbucketAccountId": { + "type": "string" + } + }, + "required": [ + "bitbucketAccountId", + "bitbucketLogin" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "clientId": { + "type": "string" + }, + "clientUid": { + "type": "string" + }, + "clientName": { + "type": "string" + }, + "projectId": { + "type": "string" + }, + "projectName": { + "type": "string" + }, + "installationId": { + "type": "string" + }, + "subjectType": { + "type": "string", + "enum": [ + "app", + "user" + ] + }, + "fields": { + "items": { + "type": "string" + }, + "type": "array" + }, + "environments": { + "items": { + "type": "string" + }, + "type": "array" + }, + "triggerDestinationCount": { + "type": "number" + }, + "tokenCount": { + "type": "number" + }, + "acceptedTokenCount": { + "type": "number" + }, + "importedTokenCount": { + "type": "number" + }, + "tokensDeleted": { + "type": "number" + } + }, + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "project": { + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + } + }, + "required": [ + "id", + "name" + ], + "type": "object" + }, + "purchasedAmount": { + "type": "number" + }, + "prevPurchasedAmount": { + "type": "number" + } + }, + "required": [ + "prevPurchasedAmount", + "project", + "purchasedAmount" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "additionalProperties": true, + "type": "object", + "description": "The payload of the event, if requested.", + "properties": { + "metricName": { + "type": "string" + } + }, + "required": [ + "metricName" + ] + }, + { + "properties": { + "reason": { + "type": "string" + }, + "suffix": { + "type": "string" + } + }, + "required": [ + "suffix" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "status": { + "type": "string" + }, + "suffix": { + "type": "string" + } + }, + "required": [ + "status", + "suffix" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "suffix": { + "type": "string" + } + }, + "required": [ + "suffix" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "projectId": { + "type": "string" + }, + "projectName": { + "type": "string" + }, + "hookName": { + "type": "string" + }, + "ref": { + "type": "string" + } + }, + "required": [ + "hookName", + "projectId", + "projectName", + "ref" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "project": { + "properties": { + "name": { + "type": "string" + } + }, + "required": [ + "name" + ], + "type": "object" + }, + "job": { + "properties": { + "deployHook": { + "properties": { + "createdAt": { + "type": "number" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "ref": { + "type": "string" + } + }, + "required": [ + "createdAt", + "id", + "name", + "ref" + ], + "type": "object" + }, + "state": { + "type": "string" + } + }, + "required": [ + "deployHook", + "state" + ], + "type": "object" + } + }, + "required": [ + "job", + "project" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "projectId": { + "type": "string" + }, + "projectName": { + "type": "string" + }, + "checkId": { + "type": "string" + }, + "checkName": { + "type": "string" + } + }, + "required": [ + "checkId", + "checkName", + "projectId", + "projectName" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "name": { + "type": "string" + }, + "alias": { + "items": { + "type": "string" + }, + "type": "array" + }, + "target": { + "nullable": true, + "type": "string" + }, + "deployment": { + "nullable": true, + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "url": { + "type": "string" + }, + "meta": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "readyState": { + "type": "string" + }, + "allowListedReadyStateReasonInternal": { + "type": "string", + "enum": [ + "EARLY_IGNORE_STEP", + "IGNORE_STEP", + "NAMESPACE_PRUNED", + "UNAFFECTED_PROJECT", + "UNVERIFIED_COMMIT" + ], + "description": "A narrowed subset of the deployment's `readyStateReasonInternal` — only values in the public allowlist are permitted here. Callers should run their raw reason through `toAllowListedReadyStateReasonInternal` from `@api/events` before assigning. This keeps abuse / moderation / admin reasons out of the public activity log." + } + }, + "required": [ + "id", + "meta", + "name", + "url" + ], + "type": "object" + }, + "url": { + "type": "string" + }, + "forced": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "gitCredentialSource": { + "type": "string", + "enum": [ + "external-token" + ] + }, + "deploymentId": { + "type": "string" + }, + "plan": { + "type": "string" + }, + "project": { + "type": "string" + }, + "projectId": { + "type": "string" + }, + "regions": { + "items": { + "type": "string" + }, + "type": "array" + }, + "type": { + "type": "string" + } + }, + "required": [ + "url" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "job": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "bitbucket-push" + ] + }, + "authorized": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "authorizedBy": { + "type": "string" + }, + "jobProjectIds": { + "items": { + "type": "string" + }, + "type": "array", + "description": "Since December 2022 All project ids associated to this job. Think monorepo. This job will be for one of these project." + }, + "jobPairs": { + "items": { + "items": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "string" + } + ] + }, + "maxItems": 2, + "minItems": 2, + "type": "array", + "description": "Since December 2022 Pairs of projects and owner ids to build for this build request." + }, + "type": "array", + "description": "Since December 2022 Pairs of projects and owner ids to build for this build request." + }, + "skippedJobPairs": { + "items": { + "items": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "string" + } + ] + }, + "maxItems": 2, + "minItems": 2, + "type": "array", + "description": "Since June 2024 Pairs of projects and owner ids to immediately finish (without building) because we want to create them in a skipped state." + }, + "type": "array", + "description": "Since June 2024 Pairs of projects and owner ids to immediately finish (without building) because we want to create them in a skipped state." + }, + "gitHashtagVercel": { + "items": { + "type": "string", + "enum": [ + "#VERCEL_BUILD_PRIO_1", + "#VERCEL_BUILD_PRIO_10", + "#VERCEL_BUILD_PRIO_2", + "#VERCEL_BUILD_PRIO_3", + "#VERCEL_BUILD_PRIO_4", + "#VERCEL_BUILD_PRIO_5", + "#VERCEL_BUILD_PRIO_6", + "#VERCEL_BUILD_PRIO_7", + "#VERCEL_BUILD_PRIO_8", + "#VERCEL_BUILD_PRIO_9", + "#VERCEL_SDDJ_AFTER_GET_REPO_FORCE_CANCEL", + "#VERCEL_SDDJ_AFTER_GET_REPO_FORCE_ERROR", + "#VERCEL_SDDJ_AFTER_VERIFY_FORCE_CANCEL", + "#VERCEL_SDDJ_AFTER_VERIFY_FORCE_ERROR", + "#VERCEL_SDDJ_BEFORE_BUILD_JOB_QUEUED_ERROR", + "#VERCEL_SDDJ_FORCE_GIT_FORK_ERROR", + "#VERCEL_SKIP", + "#VERCEL_V0_MESSAGE" + ], + "description": "Since February 2022 All the hashtag-vercel tags found in the commit message triggering the deploy. For example, #VERCEL_DO_SOMETHING" + }, + "type": "array", + "description": "Since February 2022 All the hashtag-vercel tags found in the commit message triggering the deploy. For example, #VERCEL_DO_SOMETHING" + }, + "connectedProjectCount": { + "type": "number", + "description": "Since April 2023 Cached count of how many projects are connected to the repo. Saves a few Cosmos queries down the road in the main flow." + }, + "prIdOrZero": { + "type": "number", + "description": "Since April 2023 If set then it is a cached result of asking the remote for the PR ID the commit that triggered this Job. Or zero if it was not a PR. This prevents a few git round trips by the git updater." + }, + "gitComments": { + "properties": { + "onPullRequest": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "onCommit": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "onCommit", + "onPullRequest" + ], + "type": "object", + "description": "Since June 2023 Determines if comments should be posted to the git host. Replaces `github.silent` in the vercel.json." + }, + "isManualGitDeploy": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Since 28 Feb 2024 If set to true, identifies that the git job was created for a manual git deployment" + }, + "commitVerification": { + "type": "string", + "enum": [ + "unknown", + "unverified", + "verified" + ], + "description": "Since 6 Nov 2025 The verification status of the commit. - 'verified' if the commit is verified - 'unverified' if the commit is not verified - 'unknown' if the commit verification status is unknown or not supported" + }, + "nsnbSideEffect": { + "properties": { + "action": { + "type": "string", + "enum": [ + "auto-approved-member", + "auto-approved-pending-invite" + ] + }, + "gitUserLogin": { + "type": "string" + } + }, + "required": [ + "action", + "gitUserLogin" + ], + "type": "object", + "description": "Since March 2026 Records a successful NSNB auto-add result so later GitHub PR comments can deterministically explain why this SHA was allowed to deploy." + }, + "createdAt": { + "type": "number" + }, + "deploymentId": { + "type": "string" + }, + "deployHook": { + "properties": { + "createdAt": { + "type": "number" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "ref": { + "type": "string" + } + }, + "required": [ + "createdAt", + "id", + "name", + "ref" + ], + "type": "object" + }, + "eventful": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "forceNew": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "headInfo": { + "properties": { + "owner": { + "type": "string" + }, + "ref": { + "type": "string" + }, + "repoUuid": { + "type": "string" + }, + "sha": { + "type": "string" + }, + "slug": { + "type": "string" + } + }, + "required": [ + "owner", + "ref", + "repoUuid", + "sha", + "slug" + ], + "type": "object" + }, + "linkedProjectId": { + "type": "string" + }, + "name": { + "type": "string" + }, + "owner": { + "type": "string" + }, + "prId": { + "type": "number" + }, + "projectId": { + "type": "string" + }, + "customEnvId": { + "nullable": true, + "type": "string" + }, + "ref": { + "type": "string" + }, + "repoPushedAt": { + "nullable": true, + "type": "number" + }, + "repoUuid": { + "type": "string" + }, + "sha": { + "type": "string" + }, + "silent": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "slug": { + "type": "string" + }, + "target": { + "nullable": true, + "type": "string" + }, + "url": { + "type": "string" + }, + "withCache": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "workspaceUuid": { + "type": "string" + }, + "provider": { + "type": "string", + "enum": [ + "bitbucket" + ] + } + }, + "required": [ + "headInfo", + "name", + "owner", + "provider", + "ref", + "repoUuid", + "sha", + "slug", + "type", + "workspaceUuid" + ], + "type": "object" + }, + { + "properties": { + "createdAt": { + "type": "number" + }, + "eventful": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "headInfo": { + "properties": { + "owner": { + "type": "string" + }, + "ref": { + "type": "string" + }, + "repoUuid": { + "type": "string" + }, + "sha": { + "type": "string" + }, + "slug": { + "type": "string" + } + }, + "required": [ + "owner", + "ref", + "repoUuid", + "sha", + "slug" + ], + "type": "object" + }, + "linkedProjectId": { + "type": "string" + }, + "name": { + "type": "string" + }, + "owner": { + "type": "string" + }, + "prId": { + "type": "number" + }, + "projectId": { + "type": "string" + }, + "customEnvId": { + "nullable": true, + "type": "string" + }, + "ref": { + "type": "string" + }, + "repoUuid": { + "type": "string" + }, + "sha": { + "type": "string" + }, + "slug": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "bitbucket-now-comment" + ] + }, + "workspaceUuid": { + "type": "string" + }, + "gitComments": { + "properties": { + "onPullRequest": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "onCommit": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "onCommit", + "onPullRequest" + ], + "type": "object" + }, + "provider": { + "type": "string", + "enum": [ + "bitbucket" + ] + } + }, + "required": [ + "headInfo", + "name", + "owner", + "prId", + "provider", + "ref", + "repoUuid", + "sha", + "slug", + "type", + "workspaceUuid" + ], + "type": "object", + "description": "Represents the payload for a Bitbucket comment job This interface defines the structure of data needed when creating a job to handle comments on Bitbucket pull requests or commits." + }, + { + "properties": { + "prId": { + "type": "number" + }, + "type": { + "type": "string", + "enum": [ + "pr" + ] + }, + "authorized": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "authorizedBy": { + "type": "string" + }, + "jobProjectIds": { + "items": { + "type": "string" + }, + "type": "array", + "description": "Since December 2022 All project ids associated to this job. Think monorepo. This job will be for one of these project." + }, + "jobPairs": { + "items": { + "items": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "string" + } + ] + }, + "maxItems": 2, + "minItems": 2, + "type": "array", + "description": "Since December 2022 Pairs of projects and owner ids to build for this build request." + }, + "type": "array", + "description": "Since December 2022 Pairs of projects and owner ids to build for this build request." + }, + "skippedJobPairs": { + "items": { + "items": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "string" + } + ] + }, + "maxItems": 2, + "minItems": 2, + "type": "array", + "description": "Since June 2024 Pairs of projects and owner ids to immediately finish (without building) because we want to create them in a skipped state." + }, + "type": "array", + "description": "Since June 2024 Pairs of projects and owner ids to immediately finish (without building) because we want to create them in a skipped state." + }, + "gitHashtagVercel": { + "items": { + "type": "string", + "enum": [ + "#VERCEL_BUILD_PRIO_1", + "#VERCEL_BUILD_PRIO_10", + "#VERCEL_BUILD_PRIO_2", + "#VERCEL_BUILD_PRIO_3", + "#VERCEL_BUILD_PRIO_4", + "#VERCEL_BUILD_PRIO_5", + "#VERCEL_BUILD_PRIO_6", + "#VERCEL_BUILD_PRIO_7", + "#VERCEL_BUILD_PRIO_8", + "#VERCEL_BUILD_PRIO_9", + "#VERCEL_SDDJ_AFTER_GET_REPO_FORCE_CANCEL", + "#VERCEL_SDDJ_AFTER_GET_REPO_FORCE_ERROR", + "#VERCEL_SDDJ_AFTER_VERIFY_FORCE_CANCEL", + "#VERCEL_SDDJ_AFTER_VERIFY_FORCE_ERROR", + "#VERCEL_SDDJ_BEFORE_BUILD_JOB_QUEUED_ERROR", + "#VERCEL_SDDJ_FORCE_GIT_FORK_ERROR", + "#VERCEL_SKIP", + "#VERCEL_V0_MESSAGE" + ], + "description": "Since February 2022 All the hashtag-vercel tags found in the commit message triggering the deploy. For example, #VERCEL_DO_SOMETHING" + }, + "type": "array", + "description": "Since February 2022 All the hashtag-vercel tags found in the commit message triggering the deploy. For example, #VERCEL_DO_SOMETHING" + }, + "connectedProjectCount": { + "type": "number", + "description": "Since April 2023 Cached count of how many projects are connected to the repo. Saves a few Cosmos queries down the road in the main flow." + }, + "prIdOrZero": { + "type": "number", + "description": "Since April 2023 If set then it is a cached result of asking the remote for the PR ID the commit that triggered this Job. Or zero if it was not a PR. This prevents a few git round trips by the git updater." + }, + "gitComments": { + "properties": { + "onPullRequest": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "onCommit": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "onCommit", + "onPullRequest" + ], + "type": "object", + "description": "Since June 2023 Determines if comments should be posted to the git host. Replaces `github.silent` in the vercel.json." + }, + "isManualGitDeploy": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Since 28 Feb 2024 If set to true, identifies that the git job was created for a manual git deployment" + }, + "commitVerification": { + "type": "string", + "enum": [ + "unknown", + "unverified", + "verified" + ], + "description": "Since 6 Nov 2025 The verification status of the commit. - 'verified' if the commit is verified - 'unverified' if the commit is not verified - 'unknown' if the commit verification status is unknown or not supported" + }, + "nsnbSideEffect": { + "properties": { + "action": { + "type": "string", + "enum": [ + "auto-approved-member", + "auto-approved-pending-invite" + ] + }, + "gitUserLogin": { + "type": "string" + } + }, + "required": [ + "action", + "gitUserLogin" + ], + "type": "object", + "description": "Since March 2026 Records a successful NSNB auto-add result so later GitHub PR comments can deterministically explain why this SHA was allowed to deploy." + }, + "committerGitUserId": { + "type": "number", + "description": "Remote account id of the committer details (github id etc, not vercel). Note that the committer name/email are user input verbatim and not verified. Github does appear to resolve the given email to the username so we can trust that. If the username matches that of the sender, which is verified info, then we can use the account id and account type. See api-incoming, where we determine and set this property Note that even with that, the account may still have been spoofed." + }, + "committerGitUserType": { + "type": "string", + "description": "Remote account type of the committer details (github type etc, not vercel). Note that the committer name/email are user input verbatim and not verified. Github does appear to resolve the given email to the username so we can trust that. If the username matches that of the sender, which is verified info, then we can use the account id and account type. See api-incoming, where we determine and set this property Note that even with that, the account may still have been spoofed." + }, + "createdAt": { + "type": "number" + }, + "forceNew": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "deploymentId": { + "type": "string" + }, + "deployHook": { + "properties": { + "createdAt": { + "type": "number" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "ref": { + "type": "string" + } + }, + "required": [ + "createdAt", + "id", + "name", + "ref" + ], + "type": "object" + }, + "beforeSha": { + "type": "string" + }, + "defaultBranch": { + "type": "string" + }, + "eventful": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "githubDeploymentId": { + "type": "string" + }, + "headInfo": { + "properties": { + "org": { + "type": "string" + }, + "ref": { + "type": "string" + }, + "repo": { + "type": "string" + }, + "repoId": { + "type": "number" + }, + "sha": { + "type": "string" + } + }, + "required": [ + "org", + "ref", + "repo", + "repoId", + "sha" + ], + "type": "object", + "description": "Information about the head commit/branch for a GitHub repository" + }, + "installationId": { + "type": "number" + }, + "isPrivate": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "linkedProjectId": { + "type": "string" + }, + "org": { + "type": "string" + }, + "projectId": { + "type": "string" + }, + "customEnvId": { + "nullable": true, + "type": "string" + }, + "repo": { + "type": "string" + }, + "repoId": { + "type": "number" + }, + "target": { + "nullable": true, + "type": "string" + }, + "url": { + "type": "string" + }, + "withCache": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "provider": { + "type": "string", + "enum": [ + "github", + "github-custom-host", + "github-limited" + ] + }, + "customHost": { + "type": "string" + } + }, + "required": [ + "headInfo", + "installationId", + "isPrivate", + "org", + "prId", + "provider", + "repo", + "repoId", + "type" + ], + "type": "object" + }, + { + "properties": { + "repoPushedAt": { + "nullable": true, + "type": "number" + }, + "commitInfo": { + "properties": { + "total": { + "type": "number" + }, + "earliestSha": { + "type": "string" + } + }, + "required": [ + "total" + ], + "type": "object" + }, + "forced": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "type": { + "type": "string", + "enum": [ + "push" + ] + }, + "authorized": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "authorizedBy": { + "type": "string" + }, + "jobProjectIds": { + "items": { + "type": "string" + }, + "type": "array", + "description": "Since December 2022 All project ids associated to this job. Think monorepo. This job will be for one of these project." + }, + "jobPairs": { + "items": { + "items": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "string" + } + ] + }, + "maxItems": 2, + "minItems": 2, + "type": "array", + "description": "Since December 2022 Pairs of projects and owner ids to build for this build request." + }, + "type": "array", + "description": "Since December 2022 Pairs of projects and owner ids to build for this build request." + }, + "skippedJobPairs": { + "items": { + "items": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "string" + } + ] + }, + "maxItems": 2, + "minItems": 2, + "type": "array", + "description": "Since June 2024 Pairs of projects and owner ids to immediately finish (without building) because we want to create them in a skipped state." + }, + "type": "array", + "description": "Since June 2024 Pairs of projects and owner ids to immediately finish (without building) because we want to create them in a skipped state." + }, + "gitHashtagVercel": { + "items": { + "type": "string", + "enum": [ + "#VERCEL_BUILD_PRIO_1", + "#VERCEL_BUILD_PRIO_10", + "#VERCEL_BUILD_PRIO_2", + "#VERCEL_BUILD_PRIO_3", + "#VERCEL_BUILD_PRIO_4", + "#VERCEL_BUILD_PRIO_5", + "#VERCEL_BUILD_PRIO_6", + "#VERCEL_BUILD_PRIO_7", + "#VERCEL_BUILD_PRIO_8", + "#VERCEL_BUILD_PRIO_9", + "#VERCEL_SDDJ_AFTER_GET_REPO_FORCE_CANCEL", + "#VERCEL_SDDJ_AFTER_GET_REPO_FORCE_ERROR", + "#VERCEL_SDDJ_AFTER_VERIFY_FORCE_CANCEL", + "#VERCEL_SDDJ_AFTER_VERIFY_FORCE_ERROR", + "#VERCEL_SDDJ_BEFORE_BUILD_JOB_QUEUED_ERROR", + "#VERCEL_SDDJ_FORCE_GIT_FORK_ERROR", + "#VERCEL_SKIP", + "#VERCEL_V0_MESSAGE" + ], + "description": "Since February 2022 All the hashtag-vercel tags found in the commit message triggering the deploy. For example, #VERCEL_DO_SOMETHING" + }, + "type": "array", + "description": "Since February 2022 All the hashtag-vercel tags found in the commit message triggering the deploy. For example, #VERCEL_DO_SOMETHING" + }, + "connectedProjectCount": { + "type": "number", + "description": "Since April 2023 Cached count of how many projects are connected to the repo. Saves a few Cosmos queries down the road in the main flow." + }, + "prIdOrZero": { + "type": "number", + "description": "Since April 2023 If set then it is a cached result of asking the remote for the PR ID the commit that triggered this Job. Or zero if it was not a PR. This prevents a few git round trips by the git updater." + }, + "gitComments": { + "properties": { + "onPullRequest": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "onCommit": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "onCommit", + "onPullRequest" + ], + "type": "object", + "description": "Since June 2023 Determines if comments should be posted to the git host. Replaces `github.silent` in the vercel.json." + }, + "isManualGitDeploy": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Since 28 Feb 2024 If set to true, identifies that the git job was created for a manual git deployment" + }, + "commitVerification": { + "type": "string", + "enum": [ + "unknown", + "unverified", + "verified" + ], + "description": "Since 6 Nov 2025 The verification status of the commit. - 'verified' if the commit is verified - 'unverified' if the commit is not verified - 'unknown' if the commit verification status is unknown or not supported" + }, + "nsnbSideEffect": { + "properties": { + "action": { + "type": "string", + "enum": [ + "auto-approved-member", + "auto-approved-pending-invite" + ] + }, + "gitUserLogin": { + "type": "string" + } + }, + "required": [ + "action", + "gitUserLogin" + ], + "type": "object", + "description": "Since March 2026 Records a successful NSNB auto-add result so later GitHub PR comments can deterministically explain why this SHA was allowed to deploy." + }, + "committerGitUserId": { + "type": "number", + "description": "Remote account id of the committer details (github id etc, not vercel). Note that the committer name/email are user input verbatim and not verified. Github does appear to resolve the given email to the username so we can trust that. If the username matches that of the sender, which is verified info, then we can use the account id and account type. See api-incoming, where we determine and set this property Note that even with that, the account may still have been spoofed." + }, + "committerGitUserType": { + "type": "string", + "description": "Remote account type of the committer details (github type etc, not vercel). Note that the committer name/email are user input verbatim and not verified. Github does appear to resolve the given email to the username so we can trust that. If the username matches that of the sender, which is verified info, then we can use the account id and account type. See api-incoming, where we determine and set this property Note that even with that, the account may still have been spoofed." + }, + "createdAt": { + "type": "number" + }, + "forceNew": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "deploymentId": { + "type": "string" + }, + "deployHook": { + "properties": { + "createdAt": { + "type": "number" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "ref": { + "type": "string" + } + }, + "required": [ + "createdAt", + "id", + "name", + "ref" + ], + "type": "object" + }, + "beforeSha": { + "type": "string" + }, + "defaultBranch": { + "type": "string" + }, + "eventful": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "githubDeploymentId": { + "type": "string" + }, + "headInfo": { + "properties": { + "org": { + "type": "string" + }, + "ref": { + "type": "string" + }, + "repo": { + "type": "string" + }, + "repoId": { + "type": "number" + }, + "sha": { + "type": "string" + } + }, + "required": [ + "org", + "ref", + "repo", + "repoId", + "sha" + ], + "type": "object", + "description": "Information about the head commit/branch for a GitHub repository" + }, + "installationId": { + "type": "number" + }, + "isPrivate": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "linkedProjectId": { + "type": "string" + }, + "org": { + "type": "string" + }, + "prId": { + "nullable": true, + "type": "number" + }, + "projectId": { + "type": "string" + }, + "customEnvId": { + "nullable": true, + "type": "string" + }, + "repo": { + "type": "string" + }, + "repoId": { + "type": "number" + }, + "target": { + "nullable": true, + "type": "string" + }, + "url": { + "type": "string" + }, + "withCache": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "provider": { + "type": "string", + "enum": [ + "github", + "github-custom-host", + "github-limited" + ] + }, + "customHost": { + "type": "string" + } + }, + "required": [ + "headInfo", + "installationId", + "isPrivate", + "org", + "prId", + "provider", + "repo", + "repoId", + "repoPushedAt", + "type" + ], + "type": "object" + }, + { + "properties": { + "createdAt": { + "type": "number" + }, + "eventful": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "headInfo": { + "properties": { + "org": { + "type": "string" + }, + "ref": { + "type": "string" + }, + "repo": { + "type": "string" + }, + "repoId": { + "type": "number" + }, + "sha": { + "type": "string" + } + }, + "required": [ + "org", + "ref", + "repo", + "repoId", + "sha" + ], + "type": "object", + "description": "Information about the head commit/branch for a GitHub repository" + }, + "beforeSha": { + "type": "string" + }, + "installationId": { + "type": "number" + }, + "isPrivate": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "linkedProjectId": { + "type": "string" + }, + "org": { + "type": "string" + }, + "prId": { + "type": "number" + }, + "projectId": { + "nullable": true + }, + "customEnvId": { + "nullable": true + }, + "repo": { + "type": "string" + }, + "repoId": { + "type": "number" + }, + "type": { + "type": "string", + "enum": [ + "now-comment" + ] + }, + "gitComments": { + "properties": { + "onPullRequest": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "onCommit": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "onCommit", + "onPullRequest" + ], + "type": "object" + }, + "provider": { + "type": "string", + "enum": [ + "github", + "github-custom-host", + "github-limited" + ] + }, + "customHost": { + "type": "string" + } + }, + "required": [ + "headInfo", + "installationId", + "isPrivate", + "org", + "prId", + "projectId", + "provider", + "repo", + "repoId", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "gitlab-push" + ] + }, + "authorized": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "authorizedBy": { + "type": "string" + }, + "jobProjectIds": { + "items": { + "type": "string" + }, + "type": "array", + "description": "Since December 2022 All project ids associated to this job. Think monorepo. This job will be for one of these project." + }, + "jobPairs": { + "items": { + "items": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "string" + } + ] + }, + "maxItems": 2, + "minItems": 2, + "type": "array", + "description": "Since December 2022 Pairs of projects and owner ids to build for this build request." + }, + "type": "array", + "description": "Since December 2022 Pairs of projects and owner ids to build for this build request." + }, + "skippedJobPairs": { + "items": { + "items": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "string" + } + ] + }, + "maxItems": 2, + "minItems": 2, + "type": "array", + "description": "Since June 2024 Pairs of projects and owner ids to immediately finish (without building) because we want to create them in a skipped state." + }, + "type": "array", + "description": "Since June 2024 Pairs of projects and owner ids to immediately finish (without building) because we want to create them in a skipped state." + }, + "gitHashtagVercel": { + "items": { + "type": "string", + "enum": [ + "#VERCEL_BUILD_PRIO_1", + "#VERCEL_BUILD_PRIO_10", + "#VERCEL_BUILD_PRIO_2", + "#VERCEL_BUILD_PRIO_3", + "#VERCEL_BUILD_PRIO_4", + "#VERCEL_BUILD_PRIO_5", + "#VERCEL_BUILD_PRIO_6", + "#VERCEL_BUILD_PRIO_7", + "#VERCEL_BUILD_PRIO_8", + "#VERCEL_BUILD_PRIO_9", + "#VERCEL_SDDJ_AFTER_GET_REPO_FORCE_CANCEL", + "#VERCEL_SDDJ_AFTER_GET_REPO_FORCE_ERROR", + "#VERCEL_SDDJ_AFTER_VERIFY_FORCE_CANCEL", + "#VERCEL_SDDJ_AFTER_VERIFY_FORCE_ERROR", + "#VERCEL_SDDJ_BEFORE_BUILD_JOB_QUEUED_ERROR", + "#VERCEL_SDDJ_FORCE_GIT_FORK_ERROR", + "#VERCEL_SKIP", + "#VERCEL_V0_MESSAGE" + ], + "description": "Since February 2022 All the hashtag-vercel tags found in the commit message triggering the deploy. For example, #VERCEL_DO_SOMETHING" + }, + "type": "array", + "description": "Since February 2022 All the hashtag-vercel tags found in the commit message triggering the deploy. For example, #VERCEL_DO_SOMETHING" + }, + "connectedProjectCount": { + "type": "number", + "description": "Since April 2023 Cached count of how many projects are connected to the repo. Saves a few Cosmos queries down the road in the main flow." + }, + "prIdOrZero": { + "type": "number", + "description": "Since April 2023 If set then it is a cached result of asking the remote for the PR ID the commit that triggered this Job. Or zero if it was not a PR. This prevents a few git round trips by the git updater." + }, + "gitComments": { + "properties": { + "onPullRequest": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "onCommit": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "onCommit", + "onPullRequest" + ], + "type": "object", + "description": "Since June 2023 Determines if comments should be posted to the git host. Replaces `github.silent` in the vercel.json." + }, + "isManualGitDeploy": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Since 28 Feb 2024 If set to true, identifies that the git job was created for a manual git deployment" + }, + "commitVerification": { + "type": "string", + "enum": [ + "unknown", + "unverified", + "verified" + ], + "description": "Since 6 Nov 2025 The verification status of the commit. - 'verified' if the commit is verified - 'unverified' if the commit is not verified - 'unknown' if the commit verification status is unknown or not supported" + }, + "nsnbSideEffect": { + "properties": { + "action": { + "type": "string", + "enum": [ + "auto-approved-member", + "auto-approved-pending-invite" + ] + }, + "gitUserLogin": { + "type": "string" + } + }, + "required": [ + "action", + "gitUserLogin" + ], + "type": "object", + "description": "Since March 2026 Records a successful NSNB auto-add result so later GitHub PR comments can deterministically explain why this SHA was allowed to deploy." + }, + "commit": { + "properties": { + "id": { + "type": "string" + }, + "authorAvatar": { + "nullable": true, + "type": "string" + }, + "authorEmail": { + "nullable": true, + "type": "string" + }, + "authorId": { + "nullable": true, + "type": "number" + }, + "authorLogin": { + "nullable": true, + "type": "string" + }, + "authorName": { + "nullable": true, + "type": "string" + } + }, + "required": [ + "id" + ], + "type": "object" + }, + "createdAt": { + "type": "number" + }, + "deployHook": { + "properties": { + "createdAt": { + "type": "number" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "ref": { + "type": "string" + } + }, + "required": [ + "createdAt", + "id", + "name", + "ref" + ], + "type": "object" + }, + "deploymentId": { + "type": "string" + }, + "eventful": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "forceNew": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "headInfo": { + "properties": { + "project": { + "properties": { + "defaultBranch": { + "nullable": true, + "type": "string" + }, + "id": { + "type": "string" + }, + "name": { + "nullable": true, + "type": "string" + }, + "namespace": { + "nullable": true, + "type": "string" + }, + "path": { + "nullable": true, + "type": "string" + }, + "url": { + "nullable": true, + "type": "string" + } + }, + "required": [ + "id" + ], + "type": "object" + }, + "ref": { + "type": "string" + }, + "sha": { + "type": "string" + } + }, + "required": [ + "project", + "ref", + "sha" + ], + "type": "object", + "description": "GitLab" + }, + "linkedProjectId": { + "type": "string" + }, + "prId": { + "type": "number" + }, + "project": { + "properties": { + "defaultBranch": { + "nullable": true, + "type": "string" + }, + "id": { + "type": "string" + }, + "name": { + "nullable": true, + "type": "string" + }, + "namespace": { + "nullable": true, + "type": "string" + }, + "path": { + "nullable": true, + "type": "string" + }, + "url": { + "nullable": true, + "type": "string" + } + }, + "required": [ + "id" + ], + "type": "object" + }, + "projectId": { + "type": "string" + }, + "customEnvId": { + "nullable": true, + "type": "string" + }, + "ref": { + "type": "string" + }, + "repoPushedAt": { + "nullable": true, + "type": "number" + }, + "sha": { + "type": "string" + }, + "silent": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "target": { + "nullable": true, + "type": "string" + }, + "url": { + "type": "string" + }, + "withCache": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "provider": { + "type": "string", + "enum": [ + "gitlab" + ] + } + }, + "required": [ + "headInfo", + "project", + "provider", + "ref", + "sha", + "type" + ], + "type": "object" + }, + { + "properties": { + "createdAt": { + "type": "number" + }, + "eventful": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "headInfo": { + "properties": { + "project": { + "properties": { + "defaultBranch": { + "nullable": true, + "type": "string" + }, + "id": { + "type": "string" + }, + "name": { + "nullable": true, + "type": "string" + }, + "namespace": { + "nullable": true, + "type": "string" + }, + "path": { + "nullable": true, + "type": "string" + }, + "url": { + "nullable": true, + "type": "string" + } + }, + "required": [ + "id" + ], + "type": "object" + }, + "ref": { + "type": "string" + }, + "sha": { + "type": "string" + } + }, + "required": [ + "project", + "ref", + "sha" + ], + "type": "object", + "description": "GitLab" + }, + "linkedProjectId": { + "type": "string" + }, + "prId": { + "type": "number" + }, + "project": { + "properties": { + "defaultBranch": { + "nullable": true, + "type": "string" + }, + "id": { + "type": "string" + }, + "name": { + "nullable": true, + "type": "string" + }, + "namespace": { + "nullable": true, + "type": "string" + }, + "path": { + "nullable": true, + "type": "string" + }, + "url": { + "nullable": true, + "type": "string" + } + }, + "required": [ + "id" + ], + "type": "object" + }, + "projectId": { + "type": "string" + }, + "customEnvId": { + "nullable": true, + "type": "string" + }, + "ref": { + "type": "string" + }, + "sha": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "gitlab-now-comment" + ] + }, + "gitComments": { + "properties": { + "onPullRequest": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "onCommit": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "onCommit", + "onPullRequest" + ], + "type": "object" + }, + "provider": { + "type": "string", + "enum": [ + "gitlab" + ] + } + }, + "required": [ + "headInfo", + "prId", + "project", + "provider", + "ref", + "sha", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "vercel-push" + ] + }, + "ref": { + "type": "string" + }, + "repo": { + "type": "string" + }, + "sha": { + "type": "string" + }, + "repoPushedAt": { + "nullable": true, + "type": "number" + }, + "deployHook": { + "properties": { + "createdAt": { + "type": "number" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "ref": { + "type": "string" + } + }, + "required": [ + "createdAt", + "id", + "name", + "ref" + ], + "type": "object" + }, + "url": { + "type": "string" + }, + "target": { + "nullable": true, + "type": "string" + }, + "deploymentId": { + "type": "string" + }, + "linkedProjectId": { + "type": "string" + }, + "projectId": { + "type": "string" + }, + "authorized": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "authorizedBy": { + "type": "string" + }, + "jobProjectIds": { + "items": { + "type": "string" + }, + "type": "array", + "description": "Since December 2022 All project ids associated to this job. Think monorepo. This job will be for one of these project." + }, + "jobPairs": { + "items": { + "items": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "string" + } + ] + }, + "maxItems": 2, + "minItems": 2, + "type": "array", + "description": "Since December 2022 Pairs of projects and owner ids to build for this build request." + }, + "type": "array", + "description": "Since December 2022 Pairs of projects and owner ids to build for this build request." + }, + "skippedJobPairs": { + "items": { + "items": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "string" + } + ] + }, + "maxItems": 2, + "minItems": 2, + "type": "array", + "description": "Since June 2024 Pairs of projects and owner ids to immediately finish (without building) because we want to create them in a skipped state." + }, + "type": "array", + "description": "Since June 2024 Pairs of projects and owner ids to immediately finish (without building) because we want to create them in a skipped state." + }, + "gitHashtagVercel": { + "items": { + "type": "string", + "enum": [ + "#VERCEL_BUILD_PRIO_1", + "#VERCEL_BUILD_PRIO_10", + "#VERCEL_BUILD_PRIO_2", + "#VERCEL_BUILD_PRIO_3", + "#VERCEL_BUILD_PRIO_4", + "#VERCEL_BUILD_PRIO_5", + "#VERCEL_BUILD_PRIO_6", + "#VERCEL_BUILD_PRIO_7", + "#VERCEL_BUILD_PRIO_8", + "#VERCEL_BUILD_PRIO_9", + "#VERCEL_SDDJ_AFTER_GET_REPO_FORCE_CANCEL", + "#VERCEL_SDDJ_AFTER_GET_REPO_FORCE_ERROR", + "#VERCEL_SDDJ_AFTER_VERIFY_FORCE_CANCEL", + "#VERCEL_SDDJ_AFTER_VERIFY_FORCE_ERROR", + "#VERCEL_SDDJ_BEFORE_BUILD_JOB_QUEUED_ERROR", + "#VERCEL_SDDJ_FORCE_GIT_FORK_ERROR", + "#VERCEL_SKIP", + "#VERCEL_V0_MESSAGE" + ], + "description": "Since February 2022 All the hashtag-vercel tags found in the commit message triggering the deploy. For example, #VERCEL_DO_SOMETHING" + }, + "type": "array", + "description": "Since February 2022 All the hashtag-vercel tags found in the commit message triggering the deploy. For example, #VERCEL_DO_SOMETHING" + }, + "connectedProjectCount": { + "type": "number", + "description": "Since April 2023 Cached count of how many projects are connected to the repo. Saves a few Cosmos queries down the road in the main flow." + }, + "prIdOrZero": { + "type": "number", + "description": "Since April 2023 If set then it is a cached result of asking the remote for the PR ID the commit that triggered this Job. Or zero if it was not a PR. This prevents a few git round trips by the git updater." + }, + "gitComments": { + "properties": { + "onPullRequest": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "onCommit": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "onCommit", + "onPullRequest" + ], + "type": "object", + "description": "Since June 2023 Determines if comments should be posted to the git host. Replaces `github.silent` in the vercel.json." + }, + "isManualGitDeploy": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Since 28 Feb 2024 If set to true, identifies that the git job was created for a manual git deployment" + }, + "commitVerification": { + "type": "string", + "enum": [ + "unknown", + "unverified", + "verified" + ], + "description": "Since 6 Nov 2025 The verification status of the commit. - 'verified' if the commit is verified - 'unverified' if the commit is not verified - 'unknown' if the commit verification status is unknown or not supported" + }, + "nsnbSideEffect": { + "properties": { + "action": { + "type": "string", + "enum": [ + "auto-approved-member", + "auto-approved-pending-invite" + ] + }, + "gitUserLogin": { + "type": "string" + } + }, + "required": [ + "action", + "gitUserLogin" + ], + "type": "object", + "description": "Since March 2026 Records a successful NSNB auto-add result so later GitHub PR comments can deterministically explain why this SHA was allowed to deploy." + }, + "headInfo": { + "properties": { + "org": { + "type": "string" + }, + "ref": { + "type": "string" + }, + "repo": { + "type": "string" + }, + "sha": { + "type": "string" + } + }, + "required": [ + "org", + "ref", + "repo", + "sha" + ], + "type": "object", + "description": "Vercel" + }, + "org": { + "type": "string" + }, + "provider": { + "type": "string", + "enum": [ + "vercel" + ] + }, + "customEnvId": { + "nullable": true, + "type": "string" + }, + "prId": { + "nullable": true, + "type": "number" + } + }, + "required": [ + "headInfo", + "org", + "provider", + "ref", + "repo", + "sha", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "cursor-origin-push" + ] + }, + "ref": { + "type": "string" + }, + "sha": { + "type": "string" + }, + "beforeSha": { + "type": "string" + }, + "defaultBranch": { + "type": "string" + }, + "forced": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "repoPushedAt": { + "nullable": true, + "type": "number" + }, + "deployHook": { + "properties": { + "createdAt": { + "type": "number" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "ref": { + "type": "string" + } + }, + "required": [ + "createdAt", + "id", + "name", + "ref" + ], + "type": "object" + }, + "url": { + "type": "string" + }, + "target": { + "nullable": true, + "type": "string" + }, + "deploymentId": { + "type": "string" + }, + "linkedProjectId": { + "type": "string" + }, + "projectId": { + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "eventful": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "forceNew": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "authorized": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "authorizedBy": { + "type": "string" + }, + "jobProjectIds": { + "items": { + "type": "string" + }, + "type": "array", + "description": "Since December 2022 All project ids associated to this job. Think monorepo. This job will be for one of these project." + }, + "jobPairs": { + "items": { + "items": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "string" + } + ] + }, + "maxItems": 2, + "minItems": 2, + "type": "array", + "description": "Since December 2022 Pairs of projects and owner ids to build for this build request." + }, + "type": "array", + "description": "Since December 2022 Pairs of projects and owner ids to build for this build request." + }, + "skippedJobPairs": { + "items": { + "items": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "string" + } + ] + }, + "maxItems": 2, + "minItems": 2, + "type": "array", + "description": "Since June 2024 Pairs of projects and owner ids to immediately finish (without building) because we want to create them in a skipped state." + }, + "type": "array", + "description": "Since June 2024 Pairs of projects and owner ids to immediately finish (without building) because we want to create them in a skipped state." + }, + "gitHashtagVercel": { + "items": { + "type": "string", + "enum": [ + "#VERCEL_BUILD_PRIO_1", + "#VERCEL_BUILD_PRIO_10", + "#VERCEL_BUILD_PRIO_2", + "#VERCEL_BUILD_PRIO_3", + "#VERCEL_BUILD_PRIO_4", + "#VERCEL_BUILD_PRIO_5", + "#VERCEL_BUILD_PRIO_6", + "#VERCEL_BUILD_PRIO_7", + "#VERCEL_BUILD_PRIO_8", + "#VERCEL_BUILD_PRIO_9", + "#VERCEL_SDDJ_AFTER_GET_REPO_FORCE_CANCEL", + "#VERCEL_SDDJ_AFTER_GET_REPO_FORCE_ERROR", + "#VERCEL_SDDJ_AFTER_VERIFY_FORCE_CANCEL", + "#VERCEL_SDDJ_AFTER_VERIFY_FORCE_ERROR", + "#VERCEL_SDDJ_BEFORE_BUILD_JOB_QUEUED_ERROR", + "#VERCEL_SDDJ_FORCE_GIT_FORK_ERROR", + "#VERCEL_SKIP", + "#VERCEL_V0_MESSAGE" + ], + "description": "Since February 2022 All the hashtag-vercel tags found in the commit message triggering the deploy. For example, #VERCEL_DO_SOMETHING" + }, + "type": "array", + "description": "Since February 2022 All the hashtag-vercel tags found in the commit message triggering the deploy. For example, #VERCEL_DO_SOMETHING" + }, + "connectedProjectCount": { + "type": "number", + "description": "Since April 2023 Cached count of how many projects are connected to the repo. Saves a few Cosmos queries down the road in the main flow." + }, + "prIdOrZero": { + "type": "number", + "description": "Since April 2023 If set then it is a cached result of asking the remote for the PR ID the commit that triggered this Job. Or zero if it was not a PR. This prevents a few git round trips by the git updater." + }, + "gitComments": { + "properties": { + "onPullRequest": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "onCommit": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "onCommit", + "onPullRequest" + ], + "type": "object", + "description": "Since June 2023 Determines if comments should be posted to the git host. Replaces `github.silent` in the vercel.json." + }, + "isManualGitDeploy": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Since 28 Feb 2024 If set to true, identifies that the git job was created for a manual git deployment" + }, + "commitVerification": { + "type": "string", + "enum": [ + "unknown", + "unverified", + "verified" + ], + "description": "Since 6 Nov 2025 The verification status of the commit. - 'verified' if the commit is verified - 'unverified' if the commit is not verified - 'unknown' if the commit verification status is unknown or not supported" + }, + "nsnbSideEffect": { + "properties": { + "action": { + "type": "string", + "enum": [ + "auto-approved-member", + "auto-approved-pending-invite" + ] + }, + "gitUserLogin": { + "type": "string" + } + }, + "required": [ + "action", + "gitUserLogin" + ], + "type": "object", + "description": "Since March 2026 Records a successful NSNB auto-add result so later GitHub PR comments can deterministically explain why this SHA was allowed to deploy." + }, + "headInfo": { + "properties": { + "owner": { + "type": "string", + "description": "Owner (namespace) slug, e.g. `acme`." + }, + "ownerId": { + "type": "string", + "description": "Origin namespace id (`ns_…`)." + }, + "ref": { + "type": "string" + }, + "repo": { + "type": "string", + "description": "Repository name, e.g. `api`." + }, + "repoId": { + "type": "string", + "description": "Origin repository id." + }, + "sha": { + "type": "string" + } + }, + "required": [ + "owner", + "ownerId", + "ref", + "repo", + "repoId", + "sha" + ], + "type": "object", + "description": "Cursor Origin" + }, + "installationId": { + "type": "string", + "description": "Origin installation id (`i_…`) used to resolve the credential." + }, + "owner": { + "type": "string" + }, + "repo": { + "type": "string" + }, + "repoId": { + "type": "string" + }, + "provider": { + "type": "string", + "enum": [ + "cursor-origin" + ] + }, + "customEnvId": { + "nullable": true, + "type": "string" + }, + "prId": { + "nullable": true, + "type": "number" + } + }, + "required": [ + "headInfo", + "installationId", + "owner", + "provider", + "ref", + "repo", + "repoId", + "sha", + "type" + ], + "type": "object" + }, + { + "properties": { + "createdAt": { + "type": "number" + }, + "eventful": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "headInfo": { + "properties": { + "owner": { + "type": "string", + "description": "Owner (namespace) slug, e.g. `acme`." + }, + "ownerId": { + "type": "string", + "description": "Origin namespace id (`ns_…`)." + }, + "ref": { + "type": "string" + }, + "repo": { + "type": "string", + "description": "Repository name, e.g. `api`." + }, + "repoId": { + "type": "string", + "description": "Origin repository id." + }, + "sha": { + "type": "string" + } + }, + "required": [ + "owner", + "ownerId", + "ref", + "repo", + "repoId", + "sha" + ], + "type": "object", + "description": "Cursor Origin" + }, + "installationId": { + "type": "string", + "description": "Origin installation id (`i_…`) used to resolve the credential." + }, + "linkedProjectId": { + "type": "string" + }, + "owner": { + "type": "string" + }, + "prId": { + "type": "number" + }, + "projectId": { + "nullable": true + }, + "customEnvId": { + "nullable": true + }, + "repo": { + "type": "string" + }, + "repoId": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "cursor-origin-now-comment" + ] + }, + "gitComments": { + "properties": { + "onPullRequest": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "onCommit": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "onCommit", + "onPullRequest" + ], + "type": "object" + }, + "provider": { + "type": "string", + "enum": [ + "cursor-origin" + ] + } + }, + "required": [ + "headInfo", + "installationId", + "owner", + "prId", + "projectId", + "provider", + "repo", + "repoId", + "type" + ], + "type": "object" + } + ] + } + }, + "required": [ + "job" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "url": { + "type": "string" + }, + "oldTeam": { + "properties": { + "name": { + "type": "string" + } + }, + "required": [ + "name" + ], + "type": "object" + }, + "newTeam": { + "properties": { + "name": { + "type": "string" + } + }, + "required": [ + "name" + ], + "type": "object" + } + }, + "required": [ + "url" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "sha": { + "type": "string" + }, + "gitUserPlatform": { + "type": "string" + }, + "projectId": { + "type": "string" + }, + "projectName": { + "type": "string" + }, + "gitCommitterName": { + "type": "string" + }, + "source": { + "type": "string" + }, + "reason": { + "type": "string", + "enum": [ + "ip_allow_list" + ] + } + }, + "required": [ + "gitCommitterName", + "gitUserPlatform", + "projectName", + "sha", + "source" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "deployment": { + "properties": { + "name": { + "type": "string" + }, + "id": { + "type": "string" + }, + "meta": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "url": { + "type": "string" + } + }, + "required": [ + "id", + "meta", + "name", + "url" + ], + "type": "object" + }, + "deploymentId": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "deployment", + "deploymentId", + "url" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "projectId": { + "type": "string" + }, + "projectName": { + "type": "string" + }, + "deploymentId": { + "type": "string", + "description": "The blocked deployment's id (e.g. `dpl_…`). When present, the message links it to the deployment details (inspector) page. Optional so events emitted before this field was added still render." + }, + "source": { + "type": "string", + "description": "Classified deploy source, e.g. 'cli', 'git', 'integration'." + }, + "ruleName": { + "type": "string", + "enum": [ + "deploymentSources", + "gitSources" + ], + "description": "Which rule blocked the deploy." + }, + "ruleProvenance": { + "type": "string", + "enum": [ + "default", + "project", + "team" + ], + "description": "Team-level or project-level rule." + } + }, + "required": [ + "projectName", + "ruleName", + "ruleProvenance", + "source" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "deploymentId": { + "type": "string" + }, + "deploymentUrl": { + "nullable": true, + "type": "string" + }, + "deploymentName": { + "nullable": true, + "type": "string" + }, + "projectId": { + "type": "string" + }, + "projectName": { + "type": "string" + } + }, + "required": [ + "deploymentId", + "deploymentName", + "deploymentUrl", + "projectId", + "projectName" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "integrationId": { + "type": "string" + }, + "configurationId": { + "type": "string" + }, + "integrationSlug": { + "type": "string" + }, + "integrationName": { + "type": "string" + }, + "ownerId": { + "type": "string" + }, + "projectIds": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "configurationId", + "integrationId", + "integrationName", + "integrationSlug", + "ownerId" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "id": { + "type": "string" + }, + "value": { + "type": "string" + }, + "name": { + "type": "string" + }, + "domain": { + "type": "string" + }, + "type": { + "type": "string" + }, + "mxPriority": { + "type": "number" + } + }, + "required": [ + "domain", + "id", + "name", + "type", + "value" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "action": { + "type": "string", + "enum": [ + "add", + "delete", + "update" + ] + }, + "initiator": { + "type": "string", + "enum": [ + "system", + "user" + ] + }, + "id": { + "type": "string" + }, + "domain": { + "type": "string" + }, + "name": { + "type": "string" + }, + "type": { + "type": "string" + }, + "value": { + "type": "string" + }, + "mxPriority": { + "type": "number" + }, + "previousValue": { + "type": "string" + }, + "source": { + "type": "string" + } + }, + "required": [ + "action", + "domain", + "id", + "initiator", + "name", + "type", + "value" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "id": { + "type": "string" + }, + "value": { + "type": "string" + }, + "name": { + "type": "string" + }, + "domain": { + "type": "string" + }, + "type": { + "type": "string" + } + }, + "required": [ + "domain", + "id", + "name", + "type", + "value" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "name": { + "type": "string" + }, + "zone": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "name" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "name": { + "type": "string" + }, + "price": { + "type": "number" + }, + "currency": { + "type": "string" + } + }, + "required": [ + "name", + "price" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "name": { + "type": "string" + }, + "cdnEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "cdnEnabled", + "name" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "name": { + "type": "string" + }, + "oldTeam": { + "properties": { + "name": { + "type": "string" + } + }, + "required": [ + "name" + ], + "type": "object" + }, + "newTeam": { + "properties": { + "name": { + "type": "string" + } + }, + "required": [ + "name" + ], + "type": "object" + } + }, + "required": [ + "name" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "name": { + "type": "string" + }, + "userId": { + "type": "string" + }, + "teamId": { + "type": "string" + }, + "ownerName": { + "type": "string" + } + }, + "required": [ + "name", + "ownerName", + "teamId", + "userId" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "domainId": { + "type": "string" + }, + "name": { + "type": "string" + } + }, + "required": [ + "domainId", + "name" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "previousServiceType": { + "type": "string" + }, + "serviceType": { + "type": "string" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "nameservers": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "id", + "name", + "nameservers", + "previousServiceType", + "serviceType" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "domain": { + "type": "string" + }, + "customNameservers": { + "nullable": true, + "items": { + "type": "string" + }, + "type": "array" + }, + "prevCustomNameservers": { + "nullable": true, + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "customNameservers", + "domain", + "prevCustomNameservers" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "domain": { + "type": "string" + } + }, + "required": [ + "domain" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "domain": { + "type": "string" + }, + "echMode": { + "type": "string", + "enum": [ + "auto", + "disabled", + "enabled" + ] + }, + "previousEchMode": { + "type": "string", + "enum": [ + "auto", + "disabled", + "enabled" + ] + } + }, + "required": [ + "domain", + "echMode", + "previousEchMode" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "domain": { + "type": "string" + }, + "zone": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "domain", + "zone" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "domain": { + "type": "string" + }, + "zone": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "initiator": { + "type": "string", + "enum": [ + "system", + "user" + ] + }, + "source": { + "type": "string" + }, + "previousZone": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "domain", + "initiator", + "zone" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "name": { + "type": "string" + }, + "fromId": { + "nullable": true, + "type": "string" + }, + "fromName": { + "nullable": true, + "type": "string" + } + }, + "required": [ + "fromId", + "fromName", + "name" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "name": { + "type": "string" + }, + "destinationId": { + "nullable": true, + "type": "string" + }, + "destinationName": { + "nullable": true, + "type": "string" + } + }, + "required": [ + "destinationId", + "destinationName", + "name" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "name": { + "type": "string" + }, + "destinationId": { + "type": "string" + }, + "destinationName": { + "type": "string" + } + }, + "required": [ + "destinationId", + "destinationName", + "name" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "renew": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "domain": { + "type": "string" + } + }, + "required": [ + "domain" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "name": { + "type": "string" + }, + "price": { + "type": "number" + }, + "currency": { + "type": "string" + } + }, + "required": [ + "name" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "name": { + "type": "string" + } + }, + "required": [ + "name" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "drainUrl": { + "nullable": true, + "type": "string" + }, + "drainName": { + "nullable": true, + "type": "string" + }, + "integrationName": { + "type": "string" + } + }, + "required": [ + "drainName", + "drainUrl" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "drainUrl": { + "nullable": true, + "type": "string" + }, + "integrationName": { + "type": "string" + } + }, + "required": [ + "drainUrl" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "projectId": { + "type": "string" + }, + "projectName": { + "type": "string" + }, + "srcImages": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "projectId", + "projectName", + "srcImages" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "projectId": { + "type": "string" + }, + "projectName": { + "type": "string" + }, + "tags": { + "items": { + "type": "string" + }, + "type": "array" + }, + "target": { + "type": "string" + } + }, + "required": [ + "projectId", + "projectName", + "tags" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "projectId": { + "type": "string" + }, + "projectName": { + "type": "string" + }, + "path": { + "type": "string" + } + }, + "required": [ + "path", + "projectId", + "projectName" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "projectId": { + "type": "string" + }, + "projectName": { + "type": "string" + } + }, + "required": [ + "projectId", + "projectName" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "edgeConfigId": { + "type": "string" + }, + "edgeConfigSlug": { + "type": "string" + }, + "edgeConfigDigest": { + "type": "string" + } + }, + "required": [ + "edgeConfigDigest", + "edgeConfigId", + "edgeConfigSlug" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "edgeConfigId": { + "type": "string" + }, + "edgeConfigSlug": { + "type": "string" + }, + "edgeConfigDigest": { + "type": "string" + }, + "edgeConfigBackupVersionId": { + "type": "string" + } + }, + "required": [ + "edgeConfigBackupVersionId", + "edgeConfigDigest", + "edgeConfigId", + "edgeConfigSlug" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "edgeConfigId": { + "type": "string" + }, + "edgeConfigSlug": { + "type": "string" + }, + "edgeConfigSchema": { + "type": "object" + } + }, + "required": [ + "edgeConfigId", + "edgeConfigSlug" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "edgeConfigId": { + "type": "string" + }, + "edgeConfigSlug": { + "type": "string" + }, + "edgeConfigDigest": { + "type": "string" + } + }, + "required": [ + "edgeConfigId", + "edgeConfigSlug" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "edgeConfig": { + "properties": { + "id": { + "type": "string" + }, + "slug": { + "type": "string" + } + }, + "required": [ + "id", + "slug" + ], + "type": "object" + }, + "fromAccount": { + "properties": { + "id": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "team", + "user" + ] + }, + "slug": { + "type": "string" + }, + "username": { + "type": "string" + } + }, + "required": [ + "id", + "type" + ], + "type": "object" + }, + "toAccount": { + "properties": { + "id": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "team", + "user" + ] + }, + "slug": { + "type": "string" + }, + "username": { + "type": "string" + } + }, + "required": [ + "id", + "type" + ], + "type": "object" + } + }, + "required": [ + "edgeConfig", + "fromAccount", + "toAccount" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "edgeConfigId": { + "type": "string" + }, + "edgeConfigSlug": { + "type": "string" + }, + "edgeConfigTokenId": { + "type": "string" + }, + "label": { + "type": "string" + } + }, + "required": [ + "edgeConfigId", + "edgeConfigSlug", + "edgeConfigTokenId", + "label" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "edgeConfigId": { + "type": "string" + }, + "edgeConfigSlug": { + "type": "string" + }, + "edgeConfigTokenIds": { + "items": { + "type": "string" + }, + "type": "array", + "description": "ids of deleted tokens" + } + }, + "required": [ + "edgeConfigId", + "edgeConfigSlug", + "edgeConfigTokenIds" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "email": { + "type": "string" + }, + "name": { + "type": "string" + } + }, + "required": [ + "email", + "name" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "team": { + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + } + }, + "required": [ + "id" + ], + "type": "object" + }, + "previousRule": { + "properties": { + "email": { + "type": "string" + } + }, + "required": [ + "email" + ], + "type": "object" + } + }, + "required": [ + "previousRule", + "team" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "team": { + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + } + }, + "required": [ + "id" + ], + "type": "object" + }, + "previousRule": { + "properties": { + "email": { + "type": "string" + } + }, + "required": [ + "email" + ], + "type": "object" + }, + "nextRule": { + "properties": { + "email": { + "type": "string" + } + }, + "required": [ + "email" + ], + "type": "object" + } + }, + "required": [ + "team" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "deletedUser": { + "properties": { + "username": { + "type": "string" + }, + "email": { + "type": "string" + } + }, + "required": [ + "email", + "username" + ], + "type": "object" + }, + "deletedUid": { + "type": "string" + }, + "emailDomain": { + "type": "string" + } + }, + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "key": { + "type": "string" + }, + "projectId": { + "type": "string" + }, + "projectName": { + "type": "string" + }, + "target": { + "oneOf": [ + { + "type": "string" + }, + { + "items": { + "type": "string" + }, + "type": "array" + } + ] + }, + "customEnvironmentSlugs": { + "items": { + "type": "string" + }, + "type": "array" + }, + "id": { + "type": "string" + }, + "gitBranch": { + "type": "string" + }, + "edgeConfigId": { + "nullable": true, + "type": "string" + }, + "edgeConfigTokenId": { + "nullable": true, + "type": "string" + }, + "source": { + "type": "string" + }, + "ipAddress": { + "type": "string" + } + }, + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "key": { + "type": "string" + }, + "projectId": { + "type": "string" + }, + "projectName": { + "type": "string" + }, + "target": { + "oneOf": [ + { + "type": "string" + }, + { + "items": { + "type": "string" + }, + "type": "array" + } + ] + }, + "customEnvironmentSlugs": { + "items": { + "type": "string" + }, + "type": "array" + }, + "id": { + "type": "string" + }, + "gitBranch": { + "type": "string" + }, + "edgeConfigId": { + "nullable": true, + "type": "string" + }, + "edgeConfigTokenId": { + "nullable": true, + "type": "string" + }, + "source": { + "type": "string" + }, + "ipAddress": { + "type": "string" + }, + "deploymentId": { + "type": "string" + }, + "deploymentUrl": { + "type": "string" + } + }, + "type": "object", + "description": "The payload of the event, if requested.", + "required": [ + "deploymentId", + "deploymentUrl" + ] + }, + { + "properties": { + "created": { + "type": "string", + "format": "date-time", + "description": "The date when the Shared Env Var was created.", + "example": "2021-02-10T13:11:49.180Z" + }, + "key": { + "type": "string", + "description": "The name of the Shared Env Var.", + "example": "my-api-key" + }, + "ownerId": { + "nullable": true, + "type": "string", + "description": "The unique identifier of the owner (team) the Shared Env Var was created for.", + "example": "team_LLHUOMOoDlqOp8wPE4kFo9pE" + }, + "id": { + "type": "string", + "description": "The unique identifier of the Shared Env Var.", + "example": "env_XCG7t7AIHuO2SBA8667zNUiM" + }, + "createdBy": { + "nullable": true, + "type": "string", + "description": "The unique identifier of the user who created the Shared Env Var.", + "example": "2qDDuGFTWXBLDNnqZfWPDp1A" + }, + "deletedBy": { + "nullable": true, + "type": "string", + "description": "The unique identifier of the user who deleted the Shared Env Var.", + "example": "2qDDuGFTWXBLDNnqZfWPDp1A" + }, + "updatedBy": { + "nullable": true, + "type": "string", + "description": "The unique identifier of the user who last updated the Shared Env Var.", + "example": "2qDDuGFTWXBLDNnqZfWPDp1A" + }, + "createdAt": { + "type": "number", + "description": "Timestamp for when the Shared Env Var was created.", + "example": 1609492210000 + }, + "deletedAt": { + "type": "number", + "description": "Timestamp for when the Shared Env Var was (soft) deleted.", + "example": 1609492210000 + }, + "updatedAt": { + "type": "number", + "description": "Timestamp for when the Shared Env Var was last updated.", + "example": 1609492210000 + }, + "value": { + "type": "string", + "description": "The value of the Shared Env Var." + }, + "projectId": { + "items": { + "type": "string" + }, + "type": "array", + "description": "The unique identifiers of the projects which the Shared Env Var is linked to.", + "example": [ + "prj_2WjyKQmM8ZnGcJsPWMrHRHrE", + "prj_2WjyKQmM8ZnGcJsPWMrasEFg" + ] + }, + "type": { + "type": "string", + "enum": [ + "encrypted", + "plain", + "sensitive", + "system" + ], + "description": "The type of this cosmos doc instance, if blank, assume secret.", + "example": "encrypted" + }, + "target": { + "items": { + "type": "string", + "enum": [ + "development", + "preview", + "production" + ], + "example": "production", + "description": "environments this env variable targets" + }, + "type": "array", + "description": "environments this env variable targets", + "example": "production" + }, + "applyToAllCustomEnvironments": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "whether or not this env varible applies to custom environments" + }, + "customEnvironmentIds": { + "items": { + "type": "string" + }, + "type": "array", + "description": "The custom environment IDs that this Shared Env Var is scoped to." + }, + "decrypted": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "whether or not this env variable is decrypted" + }, + "comment": { + "type": "string", + "description": "A user provided comment that describes what this Shared Env Var is for." + }, + "lastEditedByDisplayName": { + "type": "string", + "description": "The last editor full name or username." + }, + "projectNames": { + "items": { + "type": "string" + }, + "type": "array" + }, + "ipAddress": { + "type": "string" + } + }, + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "envId": { + "type": "string" + }, + "envKey": { + "type": "string" + }, + "provider": { + "type": "string" + }, + "organizationId": { + "type": "string" + }, + "repository": { + "type": "string" + }, + "target": { + "items": { + "type": "string", + "enum": [ + "development", + "preview", + "production" + ] + }, + "type": "array" + } + }, + "required": [ + "envId", + "envKey", + "organizationId", + "provider", + "repository", + "target" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "oldEnvVar": { + "properties": { + "created": { + "type": "string", + "format": "date-time", + "description": "The date when the Shared Env Var was created.", + "example": "2021-02-10T13:11:49.180Z" + }, + "key": { + "type": "string", + "description": "The name of the Shared Env Var.", + "example": "my-api-key" + }, + "ownerId": { + "nullable": true, + "type": "string", + "description": "The unique identifier of the owner (team) the Shared Env Var was created for.", + "example": "team_LLHUOMOoDlqOp8wPE4kFo9pE" + }, + "id": { + "type": "string", + "description": "The unique identifier of the Shared Env Var.", + "example": "env_XCG7t7AIHuO2SBA8667zNUiM" + }, + "createdBy": { + "nullable": true, + "type": "string", + "description": "The unique identifier of the user who created the Shared Env Var.", + "example": "2qDDuGFTWXBLDNnqZfWPDp1A" + }, + "deletedBy": { + "nullable": true, + "type": "string", + "description": "The unique identifier of the user who deleted the Shared Env Var.", + "example": "2qDDuGFTWXBLDNnqZfWPDp1A" + }, + "updatedBy": { + "nullable": true, + "type": "string", + "description": "The unique identifier of the user who last updated the Shared Env Var.", + "example": "2qDDuGFTWXBLDNnqZfWPDp1A" + }, + "createdAt": { + "type": "number", + "description": "Timestamp for when the Shared Env Var was created.", + "example": 1609492210000 + }, + "deletedAt": { + "type": "number", + "description": "Timestamp for when the Shared Env Var was (soft) deleted.", + "example": 1609492210000 + }, + "updatedAt": { + "type": "number", + "description": "Timestamp for when the Shared Env Var was last updated.", + "example": 1609492210000 + }, + "value": { + "type": "string", + "description": "The value of the Shared Env Var." + }, + "projectId": { + "items": { + "type": "string" + }, + "type": "array", + "description": "The unique identifiers of the projects which the Shared Env Var is linked to.", + "example": [ + "prj_2WjyKQmM8ZnGcJsPWMrHRHrE", + "prj_2WjyKQmM8ZnGcJsPWMrasEFg" + ] + }, + "type": { + "type": "string", + "enum": [ + "encrypted", + "plain", + "sensitive", + "system" + ], + "description": "The type of this cosmos doc instance, if blank, assume secret.", + "example": "encrypted" + }, + "target": { + "items": { + "type": "string", + "enum": [ + "development", + "preview", + "production" + ], + "example": "production", + "description": "environments this env variable targets" + }, + "type": "array", + "description": "environments this env variable targets", + "example": "production" + }, + "applyToAllCustomEnvironments": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "whether or not this env varible applies to custom environments" + }, + "customEnvironmentIds": { + "items": { + "type": "string" + }, + "type": "array", + "description": "The custom environment IDs that this Shared Env Var is scoped to." + }, + "decrypted": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "whether or not this env variable is decrypted" + }, + "comment": { + "type": "string", + "description": "A user provided comment that describes what this Shared Env Var is for." + }, + "lastEditedByDisplayName": { + "type": "string", + "description": "The last editor full name or username." + } + }, + "type": "object" + }, + "newEnvVar": { + "properties": { + "created": { + "type": "string", + "format": "date-time", + "description": "The date when the Shared Env Var was created.", + "example": "2021-02-10T13:11:49.180Z" + }, + "key": { + "type": "string", + "description": "The name of the Shared Env Var.", + "example": "my-api-key" + }, + "ownerId": { + "nullable": true, + "type": "string", + "description": "The unique identifier of the owner (team) the Shared Env Var was created for.", + "example": "team_LLHUOMOoDlqOp8wPE4kFo9pE" + }, + "id": { + "type": "string", + "description": "The unique identifier of the Shared Env Var.", + "example": "env_XCG7t7AIHuO2SBA8667zNUiM" + }, + "createdBy": { + "nullable": true, + "type": "string", + "description": "The unique identifier of the user who created the Shared Env Var.", + "example": "2qDDuGFTWXBLDNnqZfWPDp1A" + }, + "deletedBy": { + "nullable": true, + "type": "string", + "description": "The unique identifier of the user who deleted the Shared Env Var.", + "example": "2qDDuGFTWXBLDNnqZfWPDp1A" + }, + "updatedBy": { + "nullable": true, + "type": "string", + "description": "The unique identifier of the user who last updated the Shared Env Var.", + "example": "2qDDuGFTWXBLDNnqZfWPDp1A" + }, + "createdAt": { + "type": "number", + "description": "Timestamp for when the Shared Env Var was created.", + "example": 1609492210000 + }, + "deletedAt": { + "type": "number", + "description": "Timestamp for when the Shared Env Var was (soft) deleted.", + "example": 1609492210000 + }, + "updatedAt": { + "type": "number", + "description": "Timestamp for when the Shared Env Var was last updated.", + "example": 1609492210000 + }, + "value": { + "type": "string", + "description": "The value of the Shared Env Var." + }, + "projectId": { + "items": { + "type": "string" + }, + "type": "array", + "description": "The unique identifiers of the projects which the Shared Env Var is linked to.", + "example": [ + "prj_2WjyKQmM8ZnGcJsPWMrHRHrE", + "prj_2WjyKQmM8ZnGcJsPWMrasEFg" + ] + }, + "type": { + "type": "string", + "enum": [ + "encrypted", + "plain", + "sensitive", + "system" + ], + "description": "The type of this cosmos doc instance, if blank, assume secret.", + "example": "encrypted" + }, + "target": { + "items": { + "type": "string", + "enum": [ + "development", + "preview", + "production" + ], + "example": "production", + "description": "environments this env variable targets" + }, + "type": "array", + "description": "environments this env variable targets", + "example": "production" + }, + "applyToAllCustomEnvironments": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "whether or not this env varible applies to custom environments" + }, + "customEnvironmentIds": { + "items": { + "type": "string" + }, + "type": "array", + "description": "The custom environment IDs that this Shared Env Var is scoped to." + }, + "decrypted": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "whether or not this env variable is decrypted" + }, + "comment": { + "type": "string", + "description": "A user provided comment that describes what this Shared Env Var is for." + }, + "lastEditedByDisplayName": { + "type": "string", + "description": "The last editor full name or username." + } + }, + "type": "object" + }, + "updateDiff": { + "properties": { + "id": { + "type": "string" + }, + "key": { + "type": "string" + }, + "newKey": { + "type": "string" + }, + "oldTarget": { + "items": { + "type": "string", + "enum": [ + "development", + "preview", + "production" + ] + }, + "type": "array" + }, + "newTarget": { + "items": { + "type": "string", + "enum": [ + "development", + "preview", + "production" + ] + }, + "type": "array" + }, + "oldType": { + "type": "string" + }, + "newType": { + "type": "string" + }, + "oldProjects": { + "items": { + "properties": { + "projectName": { + "type": "string" + }, + "projectId": { + "type": "string" + } + }, + "required": [ + "projectId" + ], + "type": "object" + }, + "type": "array" + }, + "newProjects": { + "items": { + "properties": { + "projectName": { + "type": "string" + }, + "projectId": { + "type": "string" + } + }, + "required": [ + "projectId" + ], + "type": "object" + }, + "type": "array" + }, + "oldCustomEnvironmentIds": { + "items": { + "type": "string" + }, + "type": "array" + }, + "newCustomEnvironmentIds": { + "items": { + "type": "string" + }, + "type": "array" + }, + "changedValue": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "changedValue", + "id" + ], + "type": "object" + } + }, + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "projectId": { + "type": "string" + }, + "scope": { + "type": "string" + }, + "source": { + "type": "string" + }, + "expiresAt": { + "nullable": true, + "type": "number" + } + }, + "required": [ + "projectId", + "scope", + "source" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "projectId": { + "type": "string" + }, + "scope": { + "type": "string" + }, + "source": { + "type": "string" + } + }, + "required": [ + "projectId", + "scope", + "source" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "projectId": { + "type": "string" + }, + "projectName": { + "type": "string" + }, + "configVersion": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + } + }, + "required": [ + "configVersion", + "projectId", + "projectName" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "configVersion": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + } + }, + "required": [ + "configVersion" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "configVersion": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "configChangeCount": { + "type": "number" + }, + "configChanges": { + "items": { + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "configVersion" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "projectId": { + "type": "string" + }, + "projectName": { + "type": "string" + }, + "restore": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "configVersion": { + "type": "number" + }, + "configChangeCount": { + "type": "number" + }, + "configChanges": { + "items": { + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "configChangeCount", + "configChanges", + "configVersion", + "projectId", + "restore" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "projectId": { + "type": "string" + }, + "rulesetName": { + "type": "string" + }, + "ruleGroups": { + "additionalProperties": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "challenge", + "deny", + "log" + ] + } + }, + "required": [ + "active" + ], + "type": "object" + }, + "type": "object" + } + }, + "required": [ + "projectId", + "ruleGroups", + "rulesetName" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "projectId": { + "type": "string" + }, + "rulesetName": { + "type": "string" + }, + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "action": { + "type": "string", + "enum": [ + "challenge", + "deny", + "log" + ] + } + }, + "required": [ + "active", + "projectId", + "rulesetName" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "projectId": { + "type": "string" + }, + "projectName": { + "type": "string" + }, + "previousOwnerId": { + "type": "string" + }, + "newOwnerId": { + "type": "string" + } + }, + "required": [ + "newOwnerId", + "previousOwnerId", + "projectId" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "action": { + "type": "string", + "enum": [ + "disable", + "enable" + ] + } + }, + "required": [ + "action" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "source": { + "type": "string", + "enum": [ + "create", + "enable", + "upgrade" + ] + } + }, + "required": [ + "source" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "provider": { + "type": "string", + "enum": [ + "bitbucket", + "cursor-origin", + "github", + "gitlab" + ] + }, + "actorLogin": { + "nullable": true, + "type": "string", + "description": "Display name only. Logins are mutable; join on `actorAccountId`." + }, + "actorAccountId": { + "nullable": true, + "type": "string", + "description": "Stable account id on `provider`." + }, + "installationId": { + "nullable": true, + "type": "string", + "description": "Set only when an App installation token was minted (GitHub only)." + }, + "usedAppToken": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "sourceRepo": { + "nullable": true, + "type": "string", + "description": "Source repository, \"owner/name\". Null when the pushed content was generated in-request (push-files-to-repo) rather than copied from a repository." + }, + "sourceCommitSha": { + "nullable": true, + "type": "string" + }, + "destinationRepo": { + "type": "string", + "description": "\"owner/name\", or the raw request value if blocked before it resolved." + }, + "destinationBranch": { + "nullable": true, + "type": "string", + "description": "Branch actually pushed to, or the requested one if blocked." + }, + "resultCommitSha": { + "nullable": true, + "type": "string" + }, + "outcome": { + "type": "string", + "enum": [ + "failure", + "success" + ] + }, + "failureStage": { + "type": "string", + "enum": [ + "authorization", + "push", + "unexpected", + "unknown", + "validation" + ], + "description": "Mirrors `PushFailureStage` in `@api/git-push-repo`." + }, + "failureCode": { + "type": "string", + "description": "Sanitized code, never a raw error message." + } + }, + "required": [ + "actorAccountId", + "actorLogin", + "destinationBranch", + "destinationRepo", + "installationId", + "outcome", + "provider", + "resultCommitSha", + "sourceCommitSha", + "sourceRepo", + "usedAppToken" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "projectId": { + "type": "string" + }, + "fromDeploymentId": { + "type": "string" + }, + "toDeploymentId": { + "type": "string" + }, + "projectName": { + "type": "string" + }, + "reason": { + "type": "string" + } + }, + "required": [ + "fromDeploymentId", + "projectId", + "projectName", + "toDeploymentId" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "integrationId": { + "type": "string" + }, + "configurationId": { + "type": "string" + }, + "integrationSlug": { + "type": "string" + }, + "integrationName": { + "type": "string" + } + }, + "required": [ + "configurationId", + "integrationId", + "integrationName", + "integrationSlug" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "userId": { + "type": "string" + }, + "integrationId": { + "type": "string" + }, + "configurationId": { + "type": "string" + }, + "integrationSlug": { + "type": "string" + }, + "integrationName": { + "type": "string" + }, + "newOwner": { + "nullable": true, + "properties": { + "abuse": { + "properties": { + "blockHistory": { + "items": { + "properties": { + "action": { + "type": "string", + "enum": [ + "blocked", + "hard-blocked", + "soft-blocked", + "unblocked" + ] + }, + "createdAt": { + "type": "number" + }, + "caseId": { + "type": "string" + }, + "reason": { + "type": "string" + }, + "actor": { + "type": "string" + }, + "statusCode": { + "type": "number" + }, + "comment": { + "type": "string" + }, + "ineligibleForAppeal": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "action", + "createdAt", + "reason" + ], + "type": "object", + "description": "Since June 2023" + }, + "type": "array", + "description": "Since June 2023" + }, + "gitAuthHistory": { + "items": { + "type": "string" + }, + "type": "array", + "description": "Since March 2022. Helps abuse checks by tracking git auths. Format: `\u003cplatform\u003e:\u003cdetail\u003e:\u003cvalue\u003e`" + }, + "history": { + "items": { + "properties": { + "scanner": { + "type": "string" + }, + "reason": { + "type": "string" + }, + "by": { + "type": "string" + }, + "byId": { + "type": "string" + }, + "at": { + "type": "number" + } + }, + "required": [ + "at", + "by", + "byId", + "reason", + "scanner" + ], + "type": "object", + "description": "(scanner history). Since November 2021. First element is newest." + }, + "type": "array", + "description": "(scanner history). Since November 2021. First element is newest." + }, + "gitLineageBlocks": { + "type": "number", + "description": "Since September 2023. How often did this owner trigger an actual git lineage deploy block?" + }, + "gitLineageBlocksDry": { + "type": "number", + "description": "Since September 2023. How often did this owner trigger a git lineage deploy block dry run?" + }, + "scanner": { + "type": "string", + "description": "Since November 2021. Guides the abuse scanner in build container." + }, + "scheduledUnblockAt": { + "type": "string", + "description": "Since December 2025. UTC timestamp string of when an auto-unblock is scheduled. Format: \"Wed, 03 Dec 2025 20:32:13 GMT\"" + }, + "scheduledBlock": { + "properties": { + "executeAt": { + "type": "number", + "description": "Unix ms timestamp of the scheduled EventBridge execution." + }, + "reason": { + "type": "string", + "description": "Violation reason (string value of the `Violation` enum)." + }, + "source": { + "type": "string", + "description": "What triggered the scheduled block (string value of `TeamBlockSource`)." + }, + "createdAt": { + "type": "number", + "description": "Unix ms timestamp of when the marker was written." + }, + "caseId": { + "type": "string", + "description": "Absent from the automated evaluation path, which has no case." + }, + "scheduleName": { + "type": "string", + "description": "EventBridge schedule name, persisted so the pending event can be cancelled." + } + }, + "required": [ + "createdAt", + "executeAt", + "reason", + "source" + ], + "type": "object", + "description": "Since June 2026. A hard block that is scheduled (the delay varies by source; see `executeAt`) but not yet executed. Powers admin visibility, scheduler dedup, and cancellation. Cleared on execution or when the team is unblocked/reviewed before `executeAt`; the executor treats its absence as \"block cancelled\"." + }, + "updatedAt": { + "type": "number", + "description": "Since November 2021" + }, + "creationUserAgent": { + "type": "string" + }, + "creationIp": { + "type": "string" + }, + "removedPhoneNumbers": { + "type": "string" + } + }, + "required": [ + "updatedAt" + ], + "type": "object" + }, + "acceptanceState": { + "type": "string" + }, + "acceptedAt": { + "type": "number" + }, + "avatar": { + "type": "string" + }, + "billing": { + "type": "object", + "properties": { + "plan": { + "type": "string", + "enum": [ + "enterprise", + "hobby", + "pro" + ] + } + }, + "required": [ + "plan" + ] + }, + "blocked": { + "nullable": true, + "type": "number" + }, + "blockReason": { + "type": "string" + }, + "created": { + "type": "number" + }, + "createdAt": { + "type": "number" + }, + "credentials": { + "items": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "apple", + "bitbucket", + "chatgpt", + "github-oauth", + "github-oauth-limited", + "gitlab", + "google", + "vercel" + ] + }, + "id": { + "type": "string" + } + }, + "required": [ + "id", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "github-oauth-custom-host" + ] + }, + "host": { + "type": "string" + }, + "id": { + "type": "string" + } + }, + "required": [ + "host", + "id", + "type" + ], + "type": "object" + } + ] + }, + "type": "array" + }, + "customerId": { + "nullable": true, + "type": "string" + }, + "orbCustomerId": { + "nullable": true, + "type": "string" + }, + "dataCache": { + "properties": { + "excessBillingEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "type": "object" + }, + "deletedAt": { + "nullable": true, + "type": "number" + }, + "deploymentSecret": { + "type": "string" + }, + "dismissedTeams": { + "items": { + "type": "string" + }, + "type": "array" + }, + "dismissedToasts": { + "items": { + "properties": { + "name": { + "type": "string" + }, + "dismissals": { + "items": { + "properties": { + "scopeId": { + "type": "string" + }, + "createdAt": { + "type": "number" + } + }, + "required": [ + "createdAt", + "scopeId" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "dismissals", + "name" + ], + "type": "object" + }, + "type": "array" + }, + "favoriteProjectsAndSpaces": { + "items": { + "properties": { + "teamId": { + "type": "string" + }, + "projectId": { + "type": "string" + } + }, + "required": [ + "projectId", + "teamId" + ], + "type": "object" + }, + "type": "array" + }, + "email": { + "type": "string" + }, + "id": { + "type": "string" + }, + "importFlowGitNamespace": { + "nullable": true, + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "importFlowGitNamespaceId": { + "nullable": true, + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "importFlowGitProvider": { + "nullable": true, + "type": "string", + "enum": [ + "bitbucket", + "cursor-origin", + "github", + "github-custom-host", + "github-limited", + "gitlab", + "vercel", + null + ] + }, + "preferredScopesAndGitNamespaces": { + "items": { + "properties": { + "scopeId": { + "type": "string" + }, + "gitNamespaceId": { + "nullable": true, + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + } + }, + "required": [ + "gitNamespaceId", + "scopeId" + ], + "type": "object" + }, + "type": "array" + }, + "isDomainReseller": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "isZeitPub": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "testAccountExpiresAt": { + "type": "number" + }, + "maxActiveSlots": { + "type": "number" + }, + "name": { + "type": "string" + }, + "phoneNumber": { + "type": "string" + }, + "platformVersion": { + "nullable": true, + "type": "number" + }, + "preventAutoBlocking": { + "oneOf": [ + { + "type": "number" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + } + ] + }, + "projectDomainsLimit": { + "type": "number", + "description": "Overrides our DEFAULT project domains limit per account or per project." + }, + "projectCardWidgetPreferences": { + "items": { + "properties": { + "projectId": { + "type": "string" + }, + "widget": { + "type": "string", + "enum": [ + "analytics-online", + "analytics-page-views", + "analytics-visitors", + "firewall-allowed", + "firewall-denied", + "observability-alert", + "observability-edge-requests", + "observability-error-rate", + "observability-function-invocations", + "shortcut", + "speed-insights-cls", + "speed-insights-lcp", + "speed-insights-res" + ] + }, + "config": { + "properties": { + "url": { + "type": "string" + } + }, + "required": [ + "url" + ], + "type": "object" + } + }, + "required": [ + "projectId", + "widget" + ], + "type": "object" + }, + "type": "array" + }, + "remoteCaching": { + "properties": { + "enabled": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "type": "object", + "description": "Represents configuration for remote caching" + }, + "removedAliasesAt": { + "type": "number" + }, + "removedBillingSubscriptionAt": { + "type": "number" + }, + "removedConfigurationsAt": { + "type": "number" + }, + "removedDeploymentsAt": { + "type": "number" + }, + "removedDomiansAt": { + "type": "number" + }, + "removedEventsAt": { + "type": "number" + }, + "removedProjectsAt": { + "type": "number" + }, + "removedSecretsAt": { + "type": "number" + }, + "removedSharedEnvVarsAt": { + "type": "number" + }, + "removedEdgeConfigsAt": { + "type": "number" + }, + "resourceConfig": { + "properties": { + "concurrentBuilds": { + "type": "number" + }, + "nodeType": { + "type": "string" + }, + "elasticConcurrencyEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "buildEntitlements": { + "properties": { + "enhancedBuilds": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "type": "object" + }, + "buildQueue": { + "properties": { + "configuration": { + "type": "string", + "enum": [ + "SKIP_NAMESPACE_QUEUE", + "WAIT_FOR_NAMESPACE_QUEUE" + ] + } + }, + "type": "object" + }, + "awsAccountType": { + "type": "string" + }, + "awsAccountIds": { + "items": { + "type": "string" + }, + "type": "array" + }, + "cfZoneName": { + "type": "string" + }, + "imageOptimizationType": { + "type": "string" + }, + "edgeConfigs": { + "type": "number" + }, + "edgeConfigSize": { + "type": "number" + }, + "edgeFunctionMaxSizeBytes": { + "type": "number" + }, + "edgeFunctionExecutionTimeoutMs": { + "type": "number" + }, + "serverlessFunctionMaxDuration": { + "type": "number" + }, + "serverlessFunctionMaxMemorySize": { + "type": "number" + }, + "kvDatabases": { + "type": "number" + }, + "postgresDatabases": { + "type": "number" + }, + "blobStores": { + "type": "number" + }, + "integrationStores": { + "type": "number" + }, + "cronJobsPerProject": { + "type": "number" + }, + "microfrontendGroupsPerTeam": { + "type": "number" + }, + "microfrontendProjectsPerGroup": { + "type": "number" + }, + "flagsExplorerOverridesThreshold": { + "type": "number" + }, + "flagsExplorerUnlimitedOverrides": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "customEnvironmentsPerProject": { + "type": "number" + }, + "security": { + "properties": { + "rateLimit": { + "type": "number" + }, + "customRules": { + "type": "number" + }, + "ipBlocks": { + "type": "number" + }, + "ipBypass": { + "type": "number" + } + }, + "type": "object" + }, + "bulkRedirectsFreeLimitOverride": { + "type": "number" + }, + "buildMachine": { + "properties": { + "default": { + "type": "string", + "enum": [ + "basic", + "elastic", + "enhanced", + "standard", + "turbo" + ], + "description": "Default build machine type for new deployments. This must be used in combination with the buildEntitlements field. It is respected over Vercel's notion of the default build machine, and was originally implemented to allow Teams to \"downgrade\". - Hobby customers cannot set this, because they only have access to one machine type - Pro customers get Turbo machines by default, so this field is effectively for downgrading - ENT customers cannot set this (yet), because their default is based on their contract. https://linear.app/vercel/project/self-serve-build-machines-for-enterprise-customers-0cbc357e26d2/overview" + } + }, + "type": "object", + "description": "Build machine configuration recorded on a team or user `resourceConfig`. This is deliberately separate from the build machine config recorded on a deployment (`DeploymentBuildMachine` in `@api/deployments-types`). A team/user only expresses its default machine for new deployments; the per-build fields (`purchaseType`, `defaultPurchaseType`, `machineSelectionType`, `cores`, `memory`) are recorded on the deployment record when a build actually runs and never belong on a team/user document." + } + }, + "type": "object" + }, + "resourceLimits": { + "additionalProperties": { + "oneOf": [ + { + "properties": { + "max": { + "type": "number" + }, + "duration": { + "type": "number" + } + }, + "required": [ + "duration", + "max" + ], + "type": "object", + "description": "Override for a token-bucket rate limit: a fixed quantity per duration." + }, + { + "properties": { + "minRate": { + "type": "number" + }, + "maxRate": { + "type": "number" + }, + "stepPerMinute": { + "type": "number" + } + }, + "type": "object", + "description": "Overrides for a ramp (slew-rate) admission limit, which bounds how quickly the allowed rate may change over time rather than capping a fixed quantity. All three are expressed in units per minute. - `minRate`: the floor the allowed rate never drops below. Also the cold-start rate a new or idle consumer begins at. - `maxRate`: the ceiling the allowed rate may climb to. - `stepPerMinute`: how much the allowed rate moves per minute of activity — the slope at which it ramps up toward `maxRate` (and, where supported, decays back down toward `minRate`)." + } + ] + }, + "type": "object", + "description": "User | Team resource limits. Each entry overrides either a token-bucket rate limit or a ramp admission limit, never both." + }, + "activeDashboardViews": { + "items": { + "properties": { + "scopeId": { + "type": "string" + }, + "viewPreference": { + "nullable": true, + "type": "string", + "enum": [ + "cards", + "list", + null + ] + }, + "favoritesViewPreference": { + "nullable": true, + "type": "string", + "enum": [ + "closed", + "open", + null + ] + }, + "recentsViewPreference": { + "nullable": true, + "type": "string", + "enum": [ + "closed", + "open", + null + ] + } + }, + "required": [ + "scopeId" + ], + "type": "object" + }, + "type": "array" + }, + "secondaryEmails": { + "items": { + "properties": { + "email": { + "type": "string" + }, + "verified": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "email", + "verified" + ], + "type": "object" + }, + "type": "array" + }, + "emailDomains": { + "items": { + "type": "string" + }, + "type": "array" + }, + "emailNotifications": { + "properties": { + "rules": { + "additionalProperties": { + "properties": { + "email": { + "type": "string" + } + }, + "required": [ + "email" + ], + "type": "object" + }, + "type": "object" + } + }, + "type": "object" + }, + "siftScore": { + "type": "number" + }, + "siftScores": { + "additionalProperties": { + "properties": { + "score": { + "type": "number" + }, + "reasons": { + "items": { + "properties": { + "name": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "required": [ + "name", + "value" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "reasons", + "score" + ], + "type": "object" + }, + "type": "object" + }, + "siftRoute": { + "properties": { + "name": { + "type": "string", + "enum": [ + "string" + ] + } + }, + "required": [ + "name" + ], + "type": "object" + }, + "sfdcId": { + "type": "string" + }, + "softBlock": { + "nullable": true, + "properties": { + "blockedAt": { + "type": "number" + }, + "reason": { + "type": "string", + "enum": [ + "BLOCKED_FOR_PLATFORM_ABUSE", + "DOMAIN_OWNER_DELETION_REQUEST", + "ENTERPRISE_TRIAL_ENDED", + "ENTERPRISE_UNPAID_INVOICE", + "EXPOSURE_CAP_EXCEEDED", + "FAIR_USE_LIMITS_EXCEEDED", + "SUBSCRIPTION_CANCELED", + "SUBSCRIPTION_EXPIRED", + "UNPAID_INVOICE" + ] + }, + "blockedDueToOverageType": { + "type": "string", + "enum": [ + "analyticsUsage", + "artifacts", + "bandwidth", + "blobDataTransfer", + "blobTotalAdvancedRequests", + "blobTotalAvgSizeInBytes", + "blobTotalGetResponseObjectSizeInBytes", + "blobTotalSimpleRequests", + "connectDataTransfer", + "dataCacheRead", + "dataCacheWrite", + "edgeConfigRead", + "edgeConfigWrite", + "edgeFunctionExecutionUnits", + "edgeMiddlewareInvocations", + "edgeRequest", + "edgeRequestAdditionalCpuDuration", + "elasticConcurrencyBuildSlots", + "fastDataTransfer", + "fastOriginTransfer", + "fluidCpuDuration", + "fluidDuration", + "functionDuration", + "functionInvocation", + "imageOptimizationCacheRead", + "imageOptimizationCacheWrite", + "imageOptimizationTransformation", + "logDrainsVolume", + "monitoringMetric", + "observabilityEvent", + "onDemandConcurrencyMinutes", + "runtimeCacheRead", + "runtimeCacheWrite", + "serverlessFunctionExecution", + "sourceImages", + "wafOwaspExcessBytes", + "wafOwaspRequests", + "wafRateLimitRequest", + "webAnalyticsEvent" + ] + }, + "unpauseAt": { + "type": "number", + "description": "Since September 2026. Set only by `billing-usage-alerts` for usage plans with a `blockDurationMs`; its presence marks a pause that expires on its own." + } + }, + "required": [ + "blockedAt", + "reason" + ], + "type": "object" + }, + "stagingPrefix": { + "type": "string" + }, + "sysToken": { + "type": "string" + }, + "teams": { + "items": { + "properties": { + "teamId": { + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "role": { + "type": "string", + "enum": [ + "BILLING", + "CONTRIBUTOR", + "DEVELOPER", + "MEMBER", + "OWNER", + "SECURITY", + "VIEWER", + "VIEWER_FOR_PLUS" + ] + }, + "confirmed": { + "type": "boolean", + "enum": [ + true + ] + }, + "confirmedAt": { + "type": "number" + }, + "accessRequestedAt": { + "type": "number" + }, + "teamRoles": { + "items": { + "type": "string", + "enum": [ + "BILLING", + "CONTRIBUTOR", + "DEVELOPER", + "MEMBER", + "OWNER", + "SECURITY", + "VIEWER", + "VIEWER_FOR_PLUS" + ] + }, + "type": "array" + }, + "teamPermissions": { + "items": { + "type": "string", + "enum": [ + "AiGatewayApiKeyOwnedBySelf", + "AiGatewayBudgetManager", + "AiGatewayCredits", + "AiGatewaySettings", + "AiGatewayTranscriptsManager", + "AiGatewayTranscriptsViewer", + "ConnectorManager", + "CreateProject", + "EnvVariableManager", + "EnvironmentManager", + "FullProductionDeployment", + "IntegrationManager", + "OrgAdmin", + "OrgViewer", + "UsageViewer", + "V0Builder", + "V0Chatter", + "V0Viewer", + "WorkflowDecryptor" + ] + }, + "type": "array" + }, + "created": { + "type": "number" + }, + "joinedFrom": { + "properties": { + "origin": { + "type": "string", + "enum": [ + "account-update", + "bitbucket", + "dsync", + "feedback", + "github", + "gitlab", + "import", + "link", + "mail", + "nsnb-auto-approve", + "nsnb-hobby-upgrade", + "nsnb-invite", + "nsnb-redeploy", + "nsnb-redeploy-attribution-card", + "nsnb-request-access", + "nsnb-viewer-upgrade", + "organization-teams", + "saml", + "teams" + ] + }, + "commitId": { + "type": "string" + }, + "repoId": { + "type": "string" + }, + "repoPath": { + "type": "string" + }, + "gitUserId": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "gitUserLogin": { + "type": "string" + }, + "ssoUserId": { + "type": "string" + }, + "ssoConnectedAt": { + "type": "number" + }, + "idpUserId": { + "type": "string" + }, + "dsyncUserId": { + "type": "string" + }, + "dsyncConnectedAt": { + "type": "number" + } + }, + "required": [ + "origin" + ], + "type": "object" + } + }, + "required": [ + "confirmed", + "confirmedAt", + "created", + "createdAt", + "role", + "teamId" + ], + "type": "object" + }, + "type": "array", + "description": "A helper that allows to describe a relationship attribute. It receives the shape of a relationship plus the foreignKey name to make it mandatory in the resulting type." + }, + "trialTeamIds": { + "items": { + "type": "string" + }, + "type": "array", + "description": "Introduced 2022-04-12 An array of teamIds (for trial teams created after 2022-04-01), created by the user in question. Used in determining whether the team has a trial available in utils/api-teams/user-has-trial-available.ts." + }, + "maxTrials": { + "type": "number", + "description": "Introduced 2022-04-19 Number of maximum trials to allocate to a user. When undefined, defaults to MAX_TRIALS in utils/api-teams/user-has-trial-available.ts. This is set to trialTeamIds + 1 by services/api-backoffice/src/handlers/add-additional-trial.ts." + }, + "trialTeamId": { + "type": "string", + "description": "Deprecated on 2022-04-12 in favor of trialTeamIds and using utils/api-teams/user-has-trial-available.ts." + }, + "type": { + "type": "string", + "enum": [ + "user" + ] + }, + "usageAlerts": { + "nullable": true, + "properties": { + "warningAt": { + "nullable": true, + "type": "number" + }, + "blockingAt": { + "nullable": true, + "type": "number" + } + }, + "type": "object", + "description": "Contains the timestamps when a user was notified about their usage" + }, + "overageUsageAlerts": { + "properties": { + "analyticsUsage": { + "properties": { + "currentThreshold": { + "type": "number" + }, + "warningAt": { + "nullable": true, + "type": "number" + }, + "blockedAt": { + "nullable": true, + "type": "number" + }, + "blockGracePeriodStartedAt": { + "nullable": true, + "type": "number" + } + }, + "required": [ + "currentThreshold" + ], + "type": "object" + }, + "artifacts": { + "properties": { + "currentThreshold": { + "type": "number" + }, + "warningAt": { + "nullable": true, + "type": "number" + }, + "blockedAt": { + "nullable": true, + "type": "number" + }, + "blockGracePeriodStartedAt": { + "nullable": true, + "type": "number" + } + }, + "required": [ + "currentThreshold" + ], + "type": "object" + }, + "bandwidth": { + "properties": { + "currentThreshold": { + "type": "number" + }, + "warningAt": { + "nullable": true, + "type": "number" + }, + "blockedAt": { + "nullable": true, + "type": "number" + }, + "blockGracePeriodStartedAt": { + "nullable": true, + "type": "number" + } + }, + "required": [ + "currentThreshold" + ], + "type": "object" + }, + "blobTotalAdvancedRequests": { + "properties": { + "currentThreshold": { + "type": "number" + }, + "warningAt": { + "nullable": true, + "type": "number" + }, + "blockedAt": { + "nullable": true, + "type": "number" + }, + "blockGracePeriodStartedAt": { + "nullable": true, + "type": "number" + } + }, + "required": [ + "currentThreshold" + ], + "type": "object" + }, + "blobTotalAvgSizeInBytes": { + "properties": { + "currentThreshold": { + "type": "number" + }, + "warningAt": { + "nullable": true, + "type": "number" + }, + "blockedAt": { + "nullable": true, + "type": "number" + }, + "blockGracePeriodStartedAt": { + "nullable": true, + "type": "number" + } + }, + "required": [ + "currentThreshold" + ], + "type": "object" + }, + "blobTotalGetResponseObjectSizeInBytes": { + "properties": { + "currentThreshold": { + "type": "number" + }, + "warningAt": { + "nullable": true, + "type": "number" + }, + "blockedAt": { + "nullable": true, + "type": "number" + }, + "blockGracePeriodStartedAt": { + "nullable": true, + "type": "number" + } + }, + "required": [ + "currentThreshold" + ], + "type": "object" + }, + "blobTotalSimpleRequests": { + "properties": { + "currentThreshold": { + "type": "number" + }, + "warningAt": { + "nullable": true, + "type": "number" + }, + "blockedAt": { + "nullable": true, + "type": "number" + }, + "blockGracePeriodStartedAt": { + "nullable": true, + "type": "number" + } + }, + "required": [ + "currentThreshold" + ], + "type": "object" + }, + "connectDataTransfer": { + "properties": { + "currentThreshold": { + "type": "number" + }, + "warningAt": { + "nullable": true, + "type": "number" + }, + "blockedAt": { + "nullable": true, + "type": "number" + }, + "blockGracePeriodStartedAt": { + "nullable": true, + "type": "number" + } + }, + "required": [ + "currentThreshold" + ], + "type": "object" + }, + "dataCacheRead": { + "properties": { + "currentThreshold": { + "type": "number" + }, + "warningAt": { + "nullable": true, + "type": "number" + }, + "blockedAt": { + "nullable": true, + "type": "number" + }, + "blockGracePeriodStartedAt": { + "nullable": true, + "type": "number" + } + }, + "required": [ + "currentThreshold" + ], + "type": "object" + }, + "dataCacheWrite": { + "properties": { + "currentThreshold": { + "type": "number" + }, + "warningAt": { + "nullable": true, + "type": "number" + }, + "blockedAt": { + "nullable": true, + "type": "number" + }, + "blockGracePeriodStartedAt": { + "nullable": true, + "type": "number" + } + }, + "required": [ + "currentThreshold" + ], + "type": "object" + }, + "edgeConfigRead": { + "properties": { + "currentThreshold": { + "type": "number" + }, + "warningAt": { + "nullable": true, + "type": "number" + }, + "blockedAt": { + "nullable": true, + "type": "number" + }, + "blockGracePeriodStartedAt": { + "nullable": true, + "type": "number" + } + }, + "required": [ + "currentThreshold" + ], + "type": "object" + }, + "edgeConfigWrite": { + "properties": { + "currentThreshold": { + "type": "number" + }, + "warningAt": { + "nullable": true, + "type": "number" + }, + "blockedAt": { + "nullable": true, + "type": "number" + }, + "blockGracePeriodStartedAt": { + "nullable": true, + "type": "number" + } + }, + "required": [ + "currentThreshold" + ], + "type": "object" + }, + "edgeFunctionExecutionUnits": { + "properties": { + "currentThreshold": { + "type": "number" + }, + "warningAt": { + "nullable": true, + "type": "number" + }, + "blockedAt": { + "nullable": true, + "type": "number" + }, + "blockGracePeriodStartedAt": { + "nullable": true, + "type": "number" + } + }, + "required": [ + "currentThreshold" + ], + "type": "object" + }, + "edgeMiddlewareInvocations": { + "properties": { + "currentThreshold": { + "type": "number" + }, + "warningAt": { + "nullable": true, + "type": "number" + }, + "blockedAt": { + "nullable": true, + "type": "number" + }, + "blockGracePeriodStartedAt": { + "nullable": true, + "type": "number" + } + }, + "required": [ + "currentThreshold" + ], + "type": "object" + }, + "edgeRequestAdditionalCpuDuration": { + "properties": { + "currentThreshold": { + "type": "number" + }, + "warningAt": { + "nullable": true, + "type": "number" + }, + "blockedAt": { + "nullable": true, + "type": "number" + }, + "blockGracePeriodStartedAt": { + "nullable": true, + "type": "number" + } + }, + "required": [ + "currentThreshold" + ], + "type": "object" + }, + "edgeRequest": { + "properties": { + "currentThreshold": { + "type": "number" + }, + "warningAt": { + "nullable": true, + "type": "number" + }, + "blockedAt": { + "nullable": true, + "type": "number" + }, + "blockGracePeriodStartedAt": { + "nullable": true, + "type": "number" + } + }, + "required": [ + "currentThreshold" + ], + "type": "object" + }, + "elasticConcurrencyBuildSlots": { + "properties": { + "currentThreshold": { + "type": "number" + }, + "warningAt": { + "nullable": true, + "type": "number" + }, + "blockedAt": { + "nullable": true, + "type": "number" + }, + "blockGracePeriodStartedAt": { + "nullable": true, + "type": "number" + } + }, + "required": [ + "currentThreshold" + ], + "type": "object" + }, + "fastDataTransfer": { + "properties": { + "currentThreshold": { + "type": "number" + }, + "warningAt": { + "nullable": true, + "type": "number" + }, + "blockedAt": { + "nullable": true, + "type": "number" + }, + "blockGracePeriodStartedAt": { + "nullable": true, + "type": "number" + } + }, + "required": [ + "currentThreshold" + ], + "type": "object" + }, + "fastOriginTransfer": { + "properties": { + "currentThreshold": { + "type": "number" + }, + "warningAt": { + "nullable": true, + "type": "number" + }, + "blockedAt": { + "nullable": true, + "type": "number" + }, + "blockGracePeriodStartedAt": { + "nullable": true, + "type": "number" + } + }, + "required": [ + "currentThreshold" + ], + "type": "object" + }, + "fluidCpuDuration": { + "properties": { + "currentThreshold": { + "type": "number" + }, + "warningAt": { + "nullable": true, + "type": "number" + }, + "blockedAt": { + "nullable": true, + "type": "number" + }, + "blockGracePeriodStartedAt": { + "nullable": true, + "type": "number" + } + }, + "required": [ + "currentThreshold" + ], + "type": "object" + }, + "fluidDuration": { + "properties": { + "currentThreshold": { + "type": "number" + }, + "warningAt": { + "nullable": true, + "type": "number" + }, + "blockedAt": { + "nullable": true, + "type": "number" + }, + "blockGracePeriodStartedAt": { + "nullable": true, + "type": "number" + } + }, + "required": [ + "currentThreshold" + ], + "type": "object" + }, + "functionDuration": { + "properties": { + "currentThreshold": { + "type": "number" + }, + "warningAt": { + "nullable": true, + "type": "number" + }, + "blockedAt": { + "nullable": true, + "type": "number" + }, + "blockGracePeriodStartedAt": { + "nullable": true, + "type": "number" + } + }, + "required": [ + "currentThreshold" + ], + "type": "object" + }, + "functionInvocation": { + "properties": { + "currentThreshold": { + "type": "number" + }, + "warningAt": { + "nullable": true, + "type": "number" + }, + "blockedAt": { + "nullable": true, + "type": "number" + }, + "blockGracePeriodStartedAt": { + "nullable": true, + "type": "number" + } + }, + "required": [ + "currentThreshold" + ], + "type": "object" + }, + "imageOptimizationCacheRead": { + "properties": { + "currentThreshold": { + "type": "number" + }, + "warningAt": { + "nullable": true, + "type": "number" + }, + "blockedAt": { + "nullable": true, + "type": "number" + }, + "blockGracePeriodStartedAt": { + "nullable": true, + "type": "number" + } + }, + "required": [ + "currentThreshold" + ], + "type": "object" + }, + "imageOptimizationCacheWrite": { + "properties": { + "currentThreshold": { + "type": "number" + }, + "warningAt": { + "nullable": true, + "type": "number" + }, + "blockedAt": { + "nullable": true, + "type": "number" + }, + "blockGracePeriodStartedAt": { + "nullable": true, + "type": "number" + } + }, + "required": [ + "currentThreshold" + ], + "type": "object" + }, + "imageOptimizationTransformation": { + "properties": { + "currentThreshold": { + "type": "number" + }, + "warningAt": { + "nullable": true, + "type": "number" + }, + "blockedAt": { + "nullable": true, + "type": "number" + }, + "blockGracePeriodStartedAt": { + "nullable": true, + "type": "number" + } + }, + "required": [ + "currentThreshold" + ], + "type": "object" + }, + "logDrainsVolume": { + "properties": { + "currentThreshold": { + "type": "number" + }, + "warningAt": { + "nullable": true, + "type": "number" + }, + "blockedAt": { + "nullable": true, + "type": "number" + }, + "blockGracePeriodStartedAt": { + "nullable": true, + "type": "number" + } + }, + "required": [ + "currentThreshold" + ], + "type": "object" + }, + "monitoringMetric": { + "properties": { + "currentThreshold": { + "type": "number" + }, + "warningAt": { + "nullable": true, + "type": "number" + }, + "blockedAt": { + "nullable": true, + "type": "number" + }, + "blockGracePeriodStartedAt": { + "nullable": true, + "type": "number" + } + }, + "required": [ + "currentThreshold" + ], + "type": "object" + }, + "blobDataTransfer": { + "properties": { + "currentThreshold": { + "type": "number" + }, + "warningAt": { + "nullable": true, + "type": "number" + }, + "blockedAt": { + "nullable": true, + "type": "number" + }, + "blockGracePeriodStartedAt": { + "nullable": true, + "type": "number" + } + }, + "required": [ + "currentThreshold" + ], + "type": "object" + }, + "observabilityEvent": { + "properties": { + "currentThreshold": { + "type": "number" + }, + "warningAt": { + "nullable": true, + "type": "number" + }, + "blockedAt": { + "nullable": true, + "type": "number" + }, + "blockGracePeriodStartedAt": { + "nullable": true, + "type": "number" + } + }, + "required": [ + "currentThreshold" + ], + "type": "object" + }, + "onDemandConcurrencyMinutes": { + "properties": { + "currentThreshold": { + "type": "number" + }, + "warningAt": { + "nullable": true, + "type": "number" + }, + "blockedAt": { + "nullable": true, + "type": "number" + }, + "blockGracePeriodStartedAt": { + "nullable": true, + "type": "number" + } + }, + "required": [ + "currentThreshold" + ], + "type": "object" + }, + "runtimeCacheRead": { + "properties": { + "currentThreshold": { + "type": "number" + }, + "warningAt": { + "nullable": true, + "type": "number" + }, + "blockedAt": { + "nullable": true, + "type": "number" + }, + "blockGracePeriodStartedAt": { + "nullable": true, + "type": "number" + } + }, + "required": [ + "currentThreshold" + ], + "type": "object" + }, + "runtimeCacheWrite": { + "properties": { + "currentThreshold": { + "type": "number" + }, + "warningAt": { + "nullable": true, + "type": "number" + }, + "blockedAt": { + "nullable": true, + "type": "number" + }, + "blockGracePeriodStartedAt": { + "nullable": true, + "type": "number" + } + }, + "required": [ + "currentThreshold" + ], + "type": "object" + }, + "serverlessFunctionExecution": { + "properties": { + "currentThreshold": { + "type": "number" + }, + "warningAt": { + "nullable": true, + "type": "number" + }, + "blockedAt": { + "nullable": true, + "type": "number" + }, + "blockGracePeriodStartedAt": { + "nullable": true, + "type": "number" + } + }, + "required": [ + "currentThreshold" + ], + "type": "object" + }, + "sourceImages": { + "properties": { + "currentThreshold": { + "type": "number" + }, + "warningAt": { + "nullable": true, + "type": "number" + }, + "blockedAt": { + "nullable": true, + "type": "number" + }, + "blockGracePeriodStartedAt": { + "nullable": true, + "type": "number" + } + }, + "required": [ + "currentThreshold" + ], + "type": "object" + }, + "wafOwaspExcessBytes": { + "properties": { + "currentThreshold": { + "type": "number" + }, + "warningAt": { + "nullable": true, + "type": "number" + }, + "blockedAt": { + "nullable": true, + "type": "number" + }, + "blockGracePeriodStartedAt": { + "nullable": true, + "type": "number" + } + }, + "required": [ + "currentThreshold" + ], + "type": "object" + }, + "wafOwaspRequests": { + "properties": { + "currentThreshold": { + "type": "number" + }, + "warningAt": { + "nullable": true, + "type": "number" + }, + "blockedAt": { + "nullable": true, + "type": "number" + }, + "blockGracePeriodStartedAt": { + "nullable": true, + "type": "number" + } + }, + "required": [ + "currentThreshold" + ], + "type": "object" + }, + "wafRateLimitRequest": { + "properties": { + "currentThreshold": { + "type": "number" + }, + "warningAt": { + "nullable": true, + "type": "number" + }, + "blockedAt": { + "nullable": true, + "type": "number" + }, + "blockGracePeriodStartedAt": { + "nullable": true, + "type": "number" + } + }, + "required": [ + "currentThreshold" + ], + "type": "object" + }, + "webAnalyticsEvent": { + "properties": { + "currentThreshold": { + "type": "number" + }, + "warningAt": { + "nullable": true, + "type": "number" + }, + "blockedAt": { + "nullable": true, + "type": "number" + }, + "blockGracePeriodStartedAt": { + "nullable": true, + "type": "number" + } + }, + "required": [ + "currentThreshold" + ], + "type": "object" + } + }, + "type": "object" + }, + "overageMetadata": { + "properties": { + "firstTimeOnDemandNotificationSentAt": { + "type": "number", + "description": "Tracks if the first time on-demand overage email has been sent." + }, + "dailyOverageSummaryEmailSentAt": { + "type": "number", + "description": "Tracks the last time we sent a daily summary email." + }, + "weeklyOverageSummaryEmailSentAt": { + "type": "number", + "description": "Tracks the last time we sent a weekly summary email." + }, + "overageSummaryExpiresAt": { + "type": "number", + "description": "Tracks when the overage summary email will stop auto-sending. We currently lock the user into email for a month after the last on-demand usage." + }, + "increasedOnDemandEmailSentAt": { + "type": "number", + "description": "Tracks the last time we sent a increased on-demand email." + }, + "increasedOnDemandEmailAttemptedAt": { + "type": "number", + "description": "Tracks the last time we attempted to send an increased on-demand email. This check is to limit the number of attempts per day." + } + }, + "type": "object", + "description": "Contains the timestamps for usage summary emails." + }, + "speedInsightsFreeUsageAlert": { + "properties": { + "currentThreshold": { + "type": "number", + "description": "Highest allocation percentage threshold notified (e.g. 75 or 100)." + }, + "notifiedAt": { + "type": "number", + "description": "When the notification for `currentThreshold` was sent." + } + }, + "required": [ + "currentThreshold", + "notifiedAt" + ], + "type": "object", + "description": "Tracks notifications sent for the team-wide Speed Insights free allocation. The allocation is measured over a rolling window (not a billing period), so deduplication is time-based rather than reset at period start." + }, + "username": { + "type": "string" + }, + "updatedAt": { + "type": "number" + }, + "enablePreviewFeedback": { + "type": "string", + "enum": [ + "default", + "default-force", + "off", + "off-force", + "on", + "on-force" + ], + "description": "Whether the Vercel Toolbar is enabled for preview deployments." + }, + "featureBlocks": { + "properties": { + "webAnalytics": { + "properties": { + "updatedAt": { + "type": "number" + }, + "blockedFrom": { + "type": "number" + }, + "blockedUntil": { + "type": "number" + }, + "blockReason": { + "type": "string", + "enum": [ + "admin_override", + "hard_blocked", + "limits_exceeded" + ] + }, + "graceEmailSentAt": { + "type": "number" + } + }, + "required": [ + "blockReason", + "updatedAt" + ], + "type": "object" + }, + "monitoring": { + "properties": { + "updatedAt": { + "type": "number" + }, + "blockedFrom": { + "type": "number" + }, + "blockedUntil": { + "type": "number" + }, + "blockReason": { + "type": "string", + "enum": [ + "admin_override", + "hard_blocked", + "limits_exceeded" + ] + }, + "blockType": { + "type": "string", + "enum": [ + "hard", + "soft" + ] + } + }, + "required": [ + "blockReason", + "blockType", + "updatedAt" + ], + "type": "object", + "description": "A soft block indicates a temporary pause in data collection (ex limit exceeded for the current cycle) A hard block indicates a stoppage in data collection that requires manual intervention (ex upgrading a pro trial)" + }, + "observabilityPlus": { + "properties": { + "updatedAt": { + "type": "number" + }, + "blockedFrom": { + "type": "number" + }, + "blockedUntil": { + "type": "number" + }, + "blockReason": { + "type": "string", + "enum": [ + "admin_override", + "hard_blocked", + "limits_exceeded" + ] + }, + "blockType": { + "type": "string", + "enum": [ + "hard", + "soft" + ] + } + }, + "required": [ + "blockReason", + "blockType", + "updatedAt" + ], + "type": "object" + }, + "dataCache": { + "properties": { + "updatedAt": { + "type": "number" + }, + "blockedFrom": { + "type": "number" + }, + "blockedUntil": { + "type": "number" + }, + "blockReason": { + "type": "string", + "enum": [ + "admin_override", + "hard_blocked", + "limits_exceeded" + ] + } + }, + "required": [ + "blockReason", + "updatedAt" + ], + "type": "object" + }, + "imageOptimizationTransformation": { + "properties": { + "updatedAt": { + "type": "number" + }, + "blockedFrom": { + "type": "number" + }, + "blockedUntil": { + "type": "number" + }, + "blockReason": { + "type": "string", + "enum": [ + "admin_override", + "hard_blocked", + "limits_exceeded" + ] + } + }, + "required": [ + "blockReason", + "updatedAt" + ], + "type": "object" + }, + "sourceImages": { + "properties": { + "updatedAt": { + "type": "number" + }, + "blockedFrom": { + "type": "number" + }, + "blockedUntil": { + "type": "number" + }, + "blockReason": { + "type": "string", + "enum": [ + "admin_override", + "hard_blocked", + "limits_exceeded" + ] + } + }, + "required": [ + "blockReason", + "updatedAt" + ], + "type": "object" + }, + "blob": { + "oneOf": [ + { + "properties": { + "updatedAt": { + "type": "number" + }, + "blockedFrom": { + "type": "number" + }, + "blockedUntil": { + "type": "number" + }, + "blockReason": { + "type": "string", + "enum": [ + "limits_exceeded" + ] + }, + "overageReason": { + "type": "string", + "enum": [ + "analyticsUsage", + "artifacts", + "bandwidth", + "blobDataTransfer", + "blobTotalAdvancedRequests", + "blobTotalAvgSizeInBytes", + "blobTotalGetResponseObjectSizeInBytes", + "blobTotalSimpleRequests", + "connectDataTransfer", + "dataCacheRead", + "dataCacheWrite", + "edgeConfigRead", + "edgeConfigWrite", + "edgeFunctionExecutionUnits", + "edgeMiddlewareInvocations", + "edgeRequest", + "edgeRequestAdditionalCpuDuration", + "elasticConcurrencyBuildSlots", + "fastDataTransfer", + "fastOriginTransfer", + "fluidCpuDuration", + "fluidDuration", + "functionDuration", + "functionInvocation", + "imageOptimizationCacheRead", + "imageOptimizationCacheWrite", + "imageOptimizationTransformation", + "logDrainsVolume", + "monitoringMetric", + "observabilityEvent", + "onDemandConcurrencyMinutes", + "runtimeCacheRead", + "runtimeCacheWrite", + "serverlessFunctionExecution", + "sourceImages", + "wafOwaspExcessBytes", + "wafOwaspRequests", + "wafRateLimitRequest", + "webAnalyticsEvent" + ] + } + }, + "required": [ + "blockReason", + "overageReason", + "updatedAt" + ], + "type": "object" + }, + { + "properties": { + "updatedAt": { + "type": "number" + }, + "blockedFrom": { + "type": "number" + }, + "blockedUntil": { + "type": "number" + }, + "blockReason": { + "type": "string", + "enum": [ + "admin_override", + "hard_blocked" + ] + } + }, + "required": [ + "blockReason", + "updatedAt" + ], + "type": "object" + } + ] + }, + "postgres": { + "oneOf": [ + { + "properties": { + "updatedAt": { + "type": "number" + }, + "blockedFrom": { + "type": "number" + }, + "blockedUntil": { + "type": "number" + }, + "blockReason": { + "type": "string", + "enum": [ + "limits_exceeded" + ] + }, + "overageReason": { + "type": "string", + "enum": [ + "analyticsUsage", + "artifacts", + "bandwidth", + "blobDataTransfer", + "blobTotalAdvancedRequests", + "blobTotalAvgSizeInBytes", + "blobTotalGetResponseObjectSizeInBytes", + "blobTotalSimpleRequests", + "connectDataTransfer", + "dataCacheRead", + "dataCacheWrite", + "edgeConfigRead", + "edgeConfigWrite", + "edgeFunctionExecutionUnits", + "edgeMiddlewareInvocations", + "edgeRequest", + "edgeRequestAdditionalCpuDuration", + "elasticConcurrencyBuildSlots", + "fastDataTransfer", + "fastOriginTransfer", + "fluidCpuDuration", + "fluidDuration", + "functionDuration", + "functionInvocation", + "imageOptimizationCacheRead", + "imageOptimizationCacheWrite", + "imageOptimizationTransformation", + "logDrainsVolume", + "monitoringMetric", + "observabilityEvent", + "onDemandConcurrencyMinutes", + "runtimeCacheRead", + "runtimeCacheWrite", + "serverlessFunctionExecution", + "sourceImages", + "wafOwaspExcessBytes", + "wafOwaspRequests", + "wafRateLimitRequest", + "webAnalyticsEvent" + ] + } + }, + "required": [ + "blockReason", + "overageReason", + "updatedAt" + ], + "type": "object" + }, + { + "properties": { + "updatedAt": { + "type": "number" + }, + "blockedFrom": { + "type": "number" + }, + "blockedUntil": { + "type": "number" + }, + "blockReason": { + "type": "string", + "enum": [ + "admin_override", + "hard_blocked" + ] + } + }, + "required": [ + "blockReason", + "updatedAt" + ], + "type": "object" + } + ] + }, + "redis": { + "oneOf": [ + { + "properties": { + "updatedAt": { + "type": "number" + }, + "blockedFrom": { + "type": "number" + }, + "blockedUntil": { + "type": "number" + }, + "blockReason": { + "type": "string", + "enum": [ + "limits_exceeded" + ] + }, + "overageReason": { + "type": "string", + "enum": [ + "analyticsUsage", + "artifacts", + "bandwidth", + "blobDataTransfer", + "blobTotalAdvancedRequests", + "blobTotalAvgSizeInBytes", + "blobTotalGetResponseObjectSizeInBytes", + "blobTotalSimpleRequests", + "connectDataTransfer", + "dataCacheRead", + "dataCacheWrite", + "edgeConfigRead", + "edgeConfigWrite", + "edgeFunctionExecutionUnits", + "edgeMiddlewareInvocations", + "edgeRequest", + "edgeRequestAdditionalCpuDuration", + "elasticConcurrencyBuildSlots", + "fastDataTransfer", + "fastOriginTransfer", + "fluidCpuDuration", + "fluidDuration", + "functionDuration", + "functionInvocation", + "imageOptimizationCacheRead", + "imageOptimizationCacheWrite", + "imageOptimizationTransformation", + "logDrainsVolume", + "monitoringMetric", + "observabilityEvent", + "onDemandConcurrencyMinutes", + "runtimeCacheRead", + "runtimeCacheWrite", + "serverlessFunctionExecution", + "sourceImages", + "wafOwaspExcessBytes", + "wafOwaspRequests", + "wafRateLimitRequest", + "webAnalyticsEvent" + ] + } + }, + "required": [ + "blockReason", + "overageReason", + "updatedAt" + ], + "type": "object" + }, + { + "properties": { + "updatedAt": { + "type": "number" + }, + "blockedFrom": { + "type": "number" + }, + "blockedUntil": { + "type": "number" + }, + "blockReason": { + "type": "string", + "enum": [ + "admin_override", + "hard_blocked" + ] + } + }, + "required": [ + "blockReason", + "updatedAt" + ], + "type": "object" + } + ] + }, + "microfrontendsRequest": { + "properties": { + "updatedAt": { + "type": "number" + }, + "blockedFrom": { + "type": "number" + }, + "blockedUntil": { + "type": "number" + }, + "blockReason": { + "type": "string", + "enum": [ + "admin_override", + "hard_blocked", + "limits_exceeded" + ] + } + }, + "required": [ + "blockReason", + "updatedAt" + ], + "type": "object" + }, + "workflowStorageWrite": { + "properties": { + "updatedAt": { + "type": "number" + }, + "blockedFrom": { + "type": "number" + }, + "blockedUntil": { + "type": "number" + }, + "blockReason": { + "type": "string", + "enum": [ + "admin_override", + "hard_blocked", + "limits_exceeded" + ] + } + }, + "required": [ + "blockReason", + "updatedAt" + ], + "type": "object" + }, + "workflowEvents": { + "properties": { + "updatedAt": { + "type": "number" + }, + "blockedFrom": { + "type": "number" + }, + "blockedUntil": { + "type": "number" + }, + "blockReason": { + "type": "string", + "enum": [ + "admin_override", + "hard_blocked", + "limits_exceeded" + ] + } + }, + "required": [ + "blockReason", + "updatedAt" + ], + "type": "object" + }, + "connexForwardTriggers": { + "properties": { + "updatedAt": { + "type": "number" + }, + "blockedFrom": { + "type": "number" + }, + "blockedUntil": { + "type": "number" + }, + "blockReason": { + "type": "string", + "enum": [ + "admin_override", + "hard_blocked", + "limits_exceeded" + ] + } + }, + "required": [ + "blockReason", + "updatedAt" + ], + "type": "object" + }, + "connexTokenRequests": { + "properties": { + "updatedAt": { + "type": "number" + }, + "blockedFrom": { + "type": "number" + }, + "blockedUntil": { + "type": "number" + }, + "blockReason": { + "type": "string", + "enum": [ + "admin_override", + "hard_blocked", + "limits_exceeded" + ] + } + }, + "required": [ + "blockReason", + "updatedAt" + ], + "type": "object" + }, + "kmsOperations": { + "properties": { + "updatedAt": { + "type": "number" + }, + "blockedFrom": { + "type": "number" + }, + "blockedUntil": { + "type": "number" + }, + "blockReason": { + "type": "string", + "enum": [ + "admin_override", + "hard_blocked", + "limits_exceeded" + ] + } + }, + "required": [ + "blockReason", + "updatedAt" + ], + "type": "object" + }, + "tracing": { + "properties": { + "updatedAt": { + "type": "number" + }, + "blockedFrom": { + "type": "number" + }, + "blockedUntil": { + "type": "number" + }, + "blockReason": { + "type": "string", + "enum": [ + "admin_override", + "hard_blocked", + "limits_exceeded" + ] + } + }, + "required": [ + "blockReason", + "updatedAt" + ], + "type": "object" + }, + "sandboxStorage": { + "properties": { + "updatedAt": { + "type": "number" + }, + "blockedFrom": { + "type": "number" + }, + "blockedUntil": { + "type": "number" + }, + "blockReason": { + "type": "string", + "enum": [ + "admin_override", + "hard_blocked", + "limits_exceeded" + ] + } + }, + "required": [ + "blockReason", + "updatedAt" + ], + "type": "object" + }, + "vcr": { + "properties": { + "updatedAt": { + "type": "number" + }, + "blockedFrom": { + "type": "number" + }, + "blockedUntil": { + "type": "number" + }, + "blockReason": { + "type": "string", + "enum": [ + "admin_override", + "hard_blocked", + "limits_exceeded" + ] + } + }, + "required": [ + "blockReason", + "updatedAt" + ], + "type": "object" + }, + "speedInsightsFree": { + "properties": { + "updatedAt": { + "type": "number" + }, + "blockedFrom": { + "type": "number" + }, + "blockedUntil": { + "type": "number" + }, + "blockReason": { + "type": "string", + "enum": [ + "admin_override", + "hard_blocked", + "limits_exceeded" + ] + } + }, + "required": [ + "blockReason", + "updatedAt" + ], + "type": "object", + "description": "Pauses Speed Insights free data-point ingestion when the team-wide free allocation is exhausted. The block lasts at least 14 days and is extended while rolling usage stays above half of the allocation." + } + }, + "type": "object", + "description": "Information about which features are blocked for a user. Blocks can be either soft (the user can still access the feature, but with a warning, e.g. prompting an upgrade) or hard (the user cannot access the feature at all)." + }, + "defaultTeamId": { + "type": "string" + }, + "version": { + "type": "string", + "enum": [ + "northstar" + ] + }, + "isMFAEnforced": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether MFA is enforced for this user. Set to true when the user has a" + }, + "northstarMigration": { + "properties": { + "teamId": { + "type": "string", + "description": "The ID of the team we created for this user." + }, + "projects": { + "type": "number", + "description": "The number of projects migrated for this user." + }, + "stores": { + "type": "number", + "description": "The number of stores migrated for this user." + }, + "integrationConfigurations": { + "type": "number", + "description": "The number of integration configurations migrated for this user." + }, + "integrationClients": { + "type": "number", + "description": "The number of integration clients migrated for this user." + }, + "startTime": { + "type": "number", + "description": "The migration start time timestamp for this user." + }, + "endTime": { + "type": "number", + "description": "The migration end time timestamp for this user." + } + }, + "required": [ + "endTime", + "integrationClients", + "integrationConfigurations", + "projects", + "startTime", + "stores", + "teamId" + ], + "type": "object", + "description": "An archive of information about the Northstar migration, derived from the old (deprecated) property, `northstarMigrationEvents`." + }, + "opportunityId": { + "type": "string", + "description": "The salesforce opportunity ID that this user is linked to. This is used to automatically associate a team of the user's choosing with the opportunity." + }, + "mfaConfiguration": { + "properties": { + "enabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "enabledAt": { + "type": "number" + }, + "recoveryCodes": { + "items": { + "type": "string" + }, + "type": "array" + }, + "totp": { + "properties": { + "secret": { + "type": "string" + }, + "createdAt": { + "type": "number" + } + }, + "required": [ + "createdAt", + "secret" + ], + "type": "object" + }, + "history": { + "items": { + "properties": { + "action": { + "type": "string", + "enum": [ + "disabled", + "enabled" + ], + "description": "The action that occurred" + }, + "timestamp": { + "nullable": true, + "type": "number", + "description": "Unix timestamp (milliseconds) when the change occurred. May be null for events that occurred before history tracking was implemented." + }, + "method": { + "type": "string", + "enum": [ + "admin_removal", + "passkey", + "self_serve_recovery", + "totp", + "unknown", + "user_disabled" + ], + "description": "Method used for the state change - 'totp': User set up TOTP authenticator - 'passkey': User registered a passkey - 'user_disabled': User disabled their own MFA - 'admin_removal': Admin removed MFA via backoffice - 'self_serve_recovery': User disabled their own MFA through the self-serve MFA disable recovery flow (a \"Locked Out User\" with only a passkey) - 'unknown': Method unknown (for pre-tracking events)" + }, + "actorId": { + "type": "string", + "description": "ID of the actor who made the change - For user actions: the user's own ID - For admin actions: the admin's user ID" + }, + "actorType": { + "type": "string", + "enum": [ + "admin", + "user" + ], + "description": "Type of actor" + }, + "reason": { + "type": "string", + "description": "Optional: Additional context or reason e.g., \"Account recovery request - ticket #12345\"" + } + }, + "required": [ + "action", + "actorId", + "actorType", + "method", + "timestamp" + ], + "type": "object", + "description": "History of MFA state changes (enabled/disabled events). Most recent events first." + }, + "type": "array", + "description": "History of MFA state changes (enabled/disabled events). Most recent events first." + } + }, + "required": [ + "enabled", + "recoveryCodes" + ], + "type": "object", + "description": "MFA configuration. When enabled, the user will be required to provide a second factor of authentication when logging in." + }, + "isEnterpriseManaged": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Indicates that the underlying user entity is a managed user for the enterprise it's associated with The intention is that this field is only set to true for users that are provisioned by the enterprise which means that the domain associated with the user's email is the same domain associated with the team Allowing us to query information about the user's team at login time through the domain verification service" + } + }, + "required": [ + "billing", + "blocked", + "createdAt", + "deploymentSecret", + "email", + "id", + "platformVersion", + "stagingPrefix", + "sysToken", + "type", + "updatedAt", + "username", + "version" + ], + "type": "object" + } + }, + "required": [ + "configurationId", + "integrationId", + "integrationSlug", + "newOwner", + "userId" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "integrationId": { + "type": "string" + }, + "configurationId": { + "type": "string" + }, + "integrationSlug": { + "type": "string" + }, + "integrationName": { + "type": "string" + }, + "ownerId": { + "type": "string" + }, + "projectIds": { + "items": { + "type": "string" + }, + "type": "array" + }, + "confirmedScopes": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "configurationId", + "confirmedScopes", + "integrationId", + "integrationName", + "integrationSlug", + "ownerId" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "integration": { + "properties": { + "id": { + "type": "string" + }, + "slug": { + "type": "string" + }, + "name": { + "type": "string" + }, + "configurationId": { + "type": "string" + } + }, + "required": [ + "configurationId", + "id", + "name", + "slug" + ], + "type": "object" + }, + "destinationTeamId": { + "type": "string" + }, + "destinationTeamName": { + "type": "string" + } + }, + "required": [ + "destinationTeamId", + "destinationTeamName", + "integration" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "integration": { + "properties": { + "id": { + "type": "string" + }, + "slug": { + "type": "string" + }, + "name": { + "type": "string" + }, + "configurationId": { + "type": "string" + } + }, + "required": [ + "configurationId", + "id", + "name", + "slug" + ], + "type": "object" + }, + "originTeamId": { + "type": "string" + }, + "originTeamName": { + "type": "string" + } + }, + "required": [ + "integration", + "originTeamId", + "originTeamName" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "configurations": { + "items": { + "properties": { + "integrationId": { + "type": "string" + }, + "configurationId": { + "type": "string" + }, + "integrationSlug": { + "type": "string" + }, + "integrationName": { + "type": "string" + } + }, + "required": [ + "configurationId", + "integrationId", + "integrationSlug" + ], + "type": "object" + }, + "type": "array" + }, + "ownerId": { + "type": "string" + } + }, + "required": [ + "configurations", + "ownerId" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "integrationId": { + "type": "string" + }, + "configurationId": { + "type": "string" + }, + "integrationSlug": { + "type": "string" + }, + "integrationName": { + "type": "string" + }, + "ownerId": { + "type": "string" + }, + "billingPlanId": { + "type": "string" + }, + "billingPlanName": { + "type": "string" + } + }, + "required": [ + "billingPlanId", + "configurationId", + "integrationId", + "integrationName", + "integrationSlug", + "ownerId" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "integrationId": { + "type": "string" + }, + "configurationId": { + "type": "string" + }, + "integrationSlug": { + "type": "string" + }, + "integrationName": { + "type": "string" + }, + "ownerId": { + "type": "string" + }, + "projectIds": { + "oneOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "string", + "enum": [ + "all" + ] + } + ] + } + }, + "required": [ + "configurationId", + "integrationId", + "integrationName", + "integrationSlug", + "ownerId" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "resourceId": { + "type": "string" + }, + "integrationId": { + "type": "string" + }, + "integrationSlug": { + "type": "string" + }, + "integrationProductSlug": { + "type": "string" + }, + "configurationId": { + "type": "string" + }, + "databaseName": { + "type": "string" + }, + "queryType": { + "type": "string", + "enum": [ + "data-edit", + "data-view", + "schema", + "user" + ] + }, + "readonly": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "rolledBack": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "failedQueryIndex": { + "nullable": true, + "type": "number" + }, + "errorCode": { + "nullable": true, + "type": "string" + }, + "queryCount": { + "type": "number" + }, + "queries": { + "items": { + "properties": { + "command": { + "nullable": true, + "type": "string" + }, + "rowCount": { + "type": "number" + }, + "tables": { + "items": { + "type": "string" + }, + "type": "array" + }, + "primaryKey": { + "items": { + "properties": { + "column": { + "type": "string" + }, + "value": { + "nullable": true, + "type": "string" + } + }, + "required": [ + "column", + "value" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "command" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "configurationId", + "databaseName", + "errorCode", + "failedQueryIndex", + "integrationId", + "integrationProductSlug", + "integrationSlug", + "queries", + "queryCount", + "queryType", + "readonly", + "resourceId", + "rolledBack" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "resourceId": { + "type": "string" + }, + "integrationId": { + "type": "string" + }, + "integrationSlug": { + "type": "string" + }, + "integrationProductSlug": { + "type": "string" + }, + "configurationId": { + "type": "string" + }, + "errorCode": { + "type": "string" + }, + "requestKind": { + "type": "string", + "enum": [ + "raw_commands" + ] + }, + "readonly": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "commands": { + "items": { + "properties": { + "command": { + "type": "string" + }, + "errorCode": { + "type": "string" + } + }, + "required": [ + "command" + ], + "type": "object" + }, + "type": "array" + }, + "errorIndex": { + "type": "number" + } + }, + "required": [ + "commands", + "configurationId", + "integrationId", + "integrationProductSlug", + "integrationSlug", + "readonly", + "requestKind", + "resourceId" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "resourceId": { + "type": "string" + }, + "integrationId": { + "type": "string" + }, + "integrationSlug": { + "type": "string" + }, + "integrationProductSlug": { + "type": "string" + }, + "configurationId": { + "type": "string" + }, + "errorCode": { + "type": "string" + }, + "requestKind": { + "type": "string", + "enum": [ + "list_keys" + ] + }, + "pattern": { + "type": "string" + }, + "type": { + "type": "string" + } + }, + "required": [ + "configurationId", + "integrationId", + "integrationProductSlug", + "integrationSlug", + "requestKind", + "resourceId" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "resourceId": { + "type": "string" + }, + "integrationId": { + "type": "string" + }, + "integrationSlug": { + "type": "string" + }, + "integrationProductSlug": { + "type": "string" + }, + "configurationId": { + "type": "string" + }, + "errorCode": { + "type": "string" + }, + "requestKind": { + "type": "string", + "enum": [ + "get_keys_metadata" + ] + }, + "keys": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "configurationId", + "integrationId", + "integrationProductSlug", + "integrationSlug", + "keys", + "requestKind", + "resourceId" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "resourceId": { + "type": "string" + }, + "integrationId": { + "type": "string" + }, + "integrationSlug": { + "type": "string" + }, + "integrationProductSlug": { + "type": "string" + }, + "configurationId": { + "type": "string" + }, + "errorCode": { + "type": "string" + }, + "requestKind": { + "type": "string", + "enum": [ + "get_key_data" + ] + }, + "key": { + "type": "string" + } + }, + "required": [ + "configurationId", + "integrationId", + "integrationProductSlug", + "integrationSlug", + "key", + "requestKind", + "resourceId" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "integrationId": { + "type": "string" + }, + "integrationSlug": { + "type": "string" + }, + "integrationName": { + "type": "string" + } + }, + "required": [ + "integrationId", + "integrationName", + "integrationSlug" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "issuerId": { + "type": "string" + }, + "issuerName": { + "type": "string" + }, + "algorithm": { + "type": "string" + }, + "origin": { + "type": "string" + }, + "managedBy": { + "type": "string" + } + }, + "required": [ + "algorithm", + "issuerId", + "issuerName", + "origin" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "issuerId": { + "type": "string" + }, + "issuerName": { + "type": "string" + }, + "managedBy": { + "type": "string" + } + }, + "required": [ + "issuerId", + "issuerName" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "issuerId": { + "type": "string" + }, + "issuerName": { + "type": "string" + }, + "keyId": { + "type": "string" + } + }, + "required": [ + "issuerId", + "issuerName" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "issuerId": { + "type": "string" + }, + "issuerName": { + "type": "string" + }, + "kind": { + "type": "string" + }, + "projectId": { + "type": "string" + }, + "clientId": { + "type": "string" + }, + "environments": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "issuerId", + "issuerName", + "kind" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "issuerId": { + "type": "string" + }, + "issuerName": { + "type": "string" + }, + "kind": { + "type": "string" + }, + "policyKey": { + "type": "string" + } + }, + "required": [ + "issuerId", + "issuerName", + "kind", + "policyKey" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "logDrainUrl": { + "nullable": true, + "type": "string" + }, + "integrationName": { + "type": "string" + } + }, + "required": [ + "logDrainUrl" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "logDrainUrl": { + "type": "string" + }, + "integrationName": { + "type": "string" + } + }, + "required": [ + "logDrainUrl" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "provider": { + "type": "string", + "enum": [ + "apple", + "bitbucket", + "chatgpt", + "github", + "github-custom-host", + "github-limited", + "gitlab", + "google", + "saml" + ] + }, + "login": { + "type": "string" + } + }, + "required": [ + "login", + "provider" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "provider": { + "type": "string", + "enum": [ + "apple", + "bitbucket", + "chatgpt", + "github", + "github-custom-host", + "github-limited", + "gitlab", + "google", + "saml" + ] + } + }, + "required": [ + "provider" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "userAgent": { + "type": "string" + }, + "geolocation": { + "nullable": true, + "properties": { + "city": { + "properties": { + "names": { + "properties": { + "en": { + "type": "string" + } + }, + "required": [ + "en" + ], + "type": "object" + } + }, + "required": [ + "names" + ], + "type": "object" + }, + "country": { + "properties": { + "names": { + "properties": { + "en": { + "type": "string" + } + }, + "required": [ + "en" + ], + "type": "object" + } + }, + "required": [ + "names" + ], + "type": "object" + }, + "most_specific_subdivision": { + "properties": { + "names": { + "properties": { + "en": { + "type": "string" + } + }, + "required": [ + "en" + ], + "type": "object" + } + }, + "required": [ + "names" + ], + "type": "object" + }, + "regionName": { + "type": "string" + } + }, + "required": [ + "country" + ], + "type": "object" + }, + "env": { + "type": "string" + }, + "os": { + "type": "string" + }, + "loginSessionId": { + "type": "string", + "description": "Browser login correlation ID. This is not an authentication credential." + }, + "username": { + "type": "string" + }, + "ssoType": { + "type": "string" + }, + "factors": { + "oneOf": [ + { + "items": { + "oneOf": [ + { + "properties": { + "origin": { + "type": "string", + "enum": [ + "apple", + "bitbucket", + "chatgpt", + "email", + "emu-recovery", + "github", + "gitlab", + "google", + "invite", + "magic-link", + "otp", + "otp-link", + "saml", + "webauthn" + ] + }, + "username": { + "type": "string" + }, + "teamId": { + "type": "string" + }, + "legacy": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "ssoType": { + "type": "string" + } + }, + "required": [ + "origin" + ], + "type": "object" + } + ] + }, + "maxItems": 1, + "minItems": 1, + "type": "array" + }, + { + "items": { + "oneOf": [ + { + "properties": { + "origin": { + "type": "string", + "enum": [ + "apple", + "bitbucket", + "chatgpt", + "email", + "emu-recovery", + "github", + "gitlab", + "google", + "invite", + "magic-link", + "otp", + "otp-link", + "saml", + "webauthn" + ] + }, + "username": { + "type": "string" + }, + "teamId": { + "type": "string" + }, + "legacy": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "ssoType": { + "type": "string" + } + }, + "required": [ + "origin" + ], + "type": "object" + }, + { + "properties": { + "origin": { + "type": "string", + "enum": [ + "recovery-code", + "totp", + "webauthn" + ] + } + }, + "required": [ + "origin" + ], + "type": "object" + } + ] + }, + "maxItems": 2, + "minItems": 2, + "type": "array" + } + ] + }, + "viaOTP": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "viaGithub": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "viaGitlab": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "viaBitbucket": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "viaGoogle": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "viaApple": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "viaSamlSso": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "viaPasskey": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "projectId": { + "type": "string" + }, + "toDeploymentId": { + "type": "string" + }, + "projectName": { + "type": "string" + } + }, + "required": [ + "projectId", + "projectName", + "toDeploymentId" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "periods": { + "items": { + "properties": { + "periodNumber": { + "type": "number" + }, + "percent": { + "type": "string" + }, + "startDate": { + "type": "string" + }, + "endDate": { + "type": "string" + } + }, + "required": [ + "endDate", + "percent", + "periodNumber", + "startDate" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "periods" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "enabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "allowedIntegrationCount": { + "type": "number" + }, + "allowedIntegrationIds": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "enabled" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "id": { + "type": "string" + }, + "slug": { + "type": "string" + }, + "name": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "slug" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "id": { + "type": "string" + }, + "slug": { + "type": "string" + }, + "name": { + "type": "string" + }, + "fallbackEnvironment": { + "type": "string" + }, + "enablePolyrepoBranchRouting": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "prev": { + "properties": { + "name": { + "type": "string" + }, + "slug": { + "type": "string" + }, + "fallbackEnvironment": { + "type": "string" + }, + "enablePolyrepoBranchRouting": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "fallbackEnvironment", + "name", + "slug" + ], + "type": "object" + } + }, + "required": [ + "id", + "prev" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "project": { + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + } + }, + "required": [ + "id", + "name" + ], + "type": "object" + }, + "group": { + "properties": { + "id": { + "type": "string" + }, + "slug": { + "type": "string" + }, + "name": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "slug" + ], + "type": "object" + } + }, + "required": [ + "group", + "project" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "project": { + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "microfrontends": { + "oneOf": [ + { + "properties": { + "isDefaultApp": { + "type": "boolean", + "enum": [ + true + ] + }, + "updatedAt": { + "type": "number", + "description": "Timestamp when the microfrontends settings were last updated." + }, + "groupIds": { + "type": "array", + "items": { + "type": "string" + }, + "minItems": 1, + "description": "The group IDs of microfrontends that this project belongs to. Each microfrontend project must belong to a microfrontends group that is the set of microfrontends that are used together." + }, + "enabled": { + "type": "boolean", + "enum": [ + true + ], + "description": "Whether microfrontends are enabled for this project." + }, + "defaultRoute": { + "type": "string", + "description": "A path that is used to take screenshots and as the default path in preview links when a domain for this microfrontend is shown in the UI. Includes the leading slash, e.g. `/docs`" + }, + "freeProjectForLegacyLimits": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether the project was part of the legacy limits for hobby and pro-trial before billing was added. This field is only set when the team is upgraded to a paid plan and we are backfilling the subscription status. We cap the subscription to 2 projects and set this field for the 3rd project. When this field is set, the project is not charged for and we do not call any billing APIs for this project." + } + }, + "required": [ + "enabled", + "groupIds", + "isDefaultApp", + "updatedAt" + ], + "type": "object" + }, + { + "properties": { + "isDefaultApp": { + "type": "boolean", + "enum": [ + false + ] + }, + "routeObservabilityToThisProject": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether observability data should be routed to this microfrontend project or a root project." + }, + "doNotRouteWithMicrofrontendsRouting": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether to add microfrontends routing to aliases. This means domains in this project will route as a microfrontend." + }, + "updatedAt": { + "type": "number", + "description": "Timestamp when the microfrontends settings were last updated." + }, + "groupIds": { + "type": "array", + "items": { + "type": "string" + }, + "minItems": 1, + "description": "The group IDs of microfrontends that this project belongs to. Each microfrontend project must belong to a microfrontends group that is the set of microfrontends that are used together." + }, + "enabled": { + "type": "boolean", + "enum": [ + true + ], + "description": "Whether microfrontends are enabled for this project." + }, + "defaultRoute": { + "type": "string", + "description": "A path that is used to take screenshots and as the default path in preview links when a domain for this microfrontend is shown in the UI. Includes the leading slash, e.g. `/docs`" + }, + "freeProjectForLegacyLimits": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether the project was part of the legacy limits for hobby and pro-trial before billing was added. This field is only set when the team is upgraded to a paid plan and we are backfilling the subscription status. We cap the subscription to 2 projects and set this field for the 3rd project. When this field is set, the project is not charged for and we do not call any billing APIs for this project." + } + }, + "required": [ + "enabled", + "groupIds", + "updatedAt" + ], + "type": "object" + }, + { + "properties": { + "updatedAt": { + "type": "number" + }, + "groupIds": { + "type": "array", + "items": {}, + "minItems": 0, + "maxItems": 0 + }, + "enabled": { + "type": "boolean", + "enum": [ + false + ] + }, + "freeProjectForLegacyLimits": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "enabled", + "groupIds", + "updatedAt" + ], + "type": "object" + } + ] + } + }, + "required": [ + "id", + "name" + ], + "type": "object" + }, + "prev": { + "properties": { + "project": { + "properties": { + "microfrontends": { + "oneOf": [ + { + "properties": { + "isDefaultApp": { + "type": "boolean", + "enum": [ + true + ] + }, + "updatedAt": { + "type": "number", + "description": "Timestamp when the microfrontends settings were last updated." + }, + "groupIds": { + "type": "array", + "items": { + "type": "string" + }, + "minItems": 1, + "description": "The group IDs of microfrontends that this project belongs to. Each microfrontend project must belong to a microfrontends group that is the set of microfrontends that are used together." + }, + "enabled": { + "type": "boolean", + "enum": [ + true + ], + "description": "Whether microfrontends are enabled for this project." + }, + "defaultRoute": { + "type": "string", + "description": "A path that is used to take screenshots and as the default path in preview links when a domain for this microfrontend is shown in the UI. Includes the leading slash, e.g. `/docs`" + }, + "freeProjectForLegacyLimits": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether the project was part of the legacy limits for hobby and pro-trial before billing was added. This field is only set when the team is upgraded to a paid plan and we are backfilling the subscription status. We cap the subscription to 2 projects and set this field for the 3rd project. When this field is set, the project is not charged for and we do not call any billing APIs for this project." + } + }, + "required": [ + "enabled", + "groupIds", + "isDefaultApp", + "updatedAt" + ], + "type": "object" + }, + { + "properties": { + "isDefaultApp": { + "type": "boolean", + "enum": [ + false + ] + }, + "routeObservabilityToThisProject": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether observability data should be routed to this microfrontend project or a root project." + }, + "doNotRouteWithMicrofrontendsRouting": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether to add microfrontends routing to aliases. This means domains in this project will route as a microfrontend." + }, + "updatedAt": { + "type": "number", + "description": "Timestamp when the microfrontends settings were last updated." + }, + "groupIds": { + "type": "array", + "items": { + "type": "string" + }, + "minItems": 1, + "description": "The group IDs of microfrontends that this project belongs to. Each microfrontend project must belong to a microfrontends group that is the set of microfrontends that are used together." + }, + "enabled": { + "type": "boolean", + "enum": [ + true + ], + "description": "Whether microfrontends are enabled for this project." + }, + "defaultRoute": { + "type": "string", + "description": "A path that is used to take screenshots and as the default path in preview links when a domain for this microfrontend is shown in the UI. Includes the leading slash, e.g. `/docs`" + }, + "freeProjectForLegacyLimits": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether the project was part of the legacy limits for hobby and pro-trial before billing was added. This field is only set when the team is upgraded to a paid plan and we are backfilling the subscription status. We cap the subscription to 2 projects and set this field for the 3rd project. When this field is set, the project is not charged for and we do not call any billing APIs for this project." + } + }, + "required": [ + "enabled", + "groupIds", + "updatedAt" + ], + "type": "object" + }, + { + "properties": { + "updatedAt": { + "type": "number" + }, + "groupIds": { + "type": "array", + "items": {}, + "minItems": 0, + "maxItems": 0 + }, + "enabled": { + "type": "boolean", + "enum": [ + false + ] + }, + "freeProjectForLegacyLimits": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "enabled", + "groupIds", + "updatedAt" + ], + "type": "object" + } + ] + } + }, + "type": "object" + } + }, + "required": [ + "project" + ], + "type": "object" + }, + "group": { + "properties": { + "id": { + "type": "string" + }, + "slug": { + "type": "string" + }, + "name": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "slug" + ], + "type": "object" + } + }, + "required": [ + "group", + "prev", + "project" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "alertId": { + "type": "string" + }, + "alertName": { + "type": "string" + } + }, + "required": [ + "alertId", + "alertName" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "projectId": { + "type": "string" + }, + "projectName": { + "type": "string" + } + }, + "required": [ + "projectName" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "organizationId": { + "type": "string" + }, + "rootTeamId": { + "type": "string" + }, + "slug": { + "type": "string" + }, + "name": { + "type": "string" + } + }, + "required": [ + "name", + "organizationId", + "rootTeamId", + "slug" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "directoryGroupId": { + "type": "string" + }, + "directoryId": { + "type": "string" + }, + "groupName": { + "type": "string" + }, + "next": { + "properties": { + "default": { + "type": "string", + "enum": [ + "BILLING", + "CONTRIBUTOR", + "DEVELOPER", + "MEMBER", + "OWNER", + "SECURITY", + "VIEWER", + "VIEWER_FOR_PLUS" + ] + }, + "roles": { + "additionalProperties": { + "type": "string", + "enum": [ + "BILLING", + "CONTRIBUTOR", + "DEVELOPER", + "MEMBER", + "OWNER", + "SECURITY", + "VIEWER", + "VIEWER_FOR_PLUS" + ] + }, + "type": "object" + } + }, + "required": [ + "roles" + ], + "type": "object" + }, + "organizationId": { + "type": "string" + } + }, + "required": [ + "directoryGroupId", + "directoryId", + "groupName", + "next", + "organizationId" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "directoryGroupId": { + "type": "string" + }, + "directoryId": { + "type": "string" + }, + "organizationId": { + "type": "string" + } + }, + "required": [ + "directoryGroupId", + "directoryId", + "organizationId" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "organizationId": { + "type": "string" + }, + "slug": { + "type": "string" + } + }, + "required": [ + "organizationId", + "slug" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "organizationId": { + "type": "string" + }, + "teamId": { + "type": "string" + }, + "billingPlan": { + "type": "string", + "enum": [ + "enterprise", + "platform" + ] + } + }, + "required": [ + "billingPlan", + "organizationId", + "teamId" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "organizationId": { + "type": "string" + }, + "teamId": { + "type": "string" + }, + "teamName": { + "type": "string" + }, + "previousMode": { + "type": "string", + "enum": [ + "organization", + "team" + ] + }, + "mode": { + "type": "string", + "enum": [ + "organization", + "team" + ] + } + }, + "required": [ + "mode", + "organizationId", + "previousMode", + "teamId", + "teamName" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "ownerId": { + "type": "string" + }, + "source": { + "type": "string" + }, + "cause": { + "type": "string" + }, + "blockReason": { + "type": "string" + }, + "siftRoute": { + "properties": { + "name": { + "type": "string" + } + }, + "required": [ + "name" + ], + "type": "object" + } + }, + "required": [ + "cause", + "ownerId", + "source" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "ownerId": { + "type": "string" + }, + "source": { + "type": "string" + }, + "cause": { + "type": "string" + }, + "reason": { + "nullable": true, + "type": "string" + } + }, + "required": [ + "cause", + "ownerId", + "source" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "ownerId": { + "type": "string" + }, + "source": { + "type": "string" + }, + "cause": { + "type": "string" + }, + "blockReason": { + "type": "string" + } + }, + "required": [ + "cause", + "ownerId", + "source" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "ownerId": { + "type": "string" + }, + "source": { + "type": "string" + }, + "cause": { + "type": "string" + } + }, + "required": [ + "cause", + "ownerId", + "source" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "projectId": { + "type": "string" + }, + "previous": { + "nullable": true, + "properties": { + "enabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "mode": { + "type": "string" + }, + "enforcementScope": { + "type": "string", + "enum": [ + "all", + "preview" + ] + }, + "enforcePercentage": { + "type": "number" + }, + "newResourceBlockingPolicy": { + "type": "string", + "enum": [ + "allow", + "block" + ] + }, + "allowUnsafeScriptSrcKeywords": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "omitScriptNonce": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "connectSrcNotificationsEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "computedScriptSrc": { + "type": "string" + }, + "computedScriptSrcPreview": { + "type": "string" + }, + "computedConnectSrc": { + "type": "string" + }, + "computedConnectSrcPreview": { + "type": "string" + } + }, + "required": [ + "allowUnsafeScriptSrcKeywords", + "enabled", + "enforcePercentage", + "mode", + "newResourceBlockingPolicy" + ], + "type": "object" + }, + "next": { + "properties": { + "enabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "mode": { + "type": "string" + }, + "enforcementScope": { + "type": "string", + "enum": [ + "all", + "preview" + ] + }, + "enforcePercentage": { + "type": "number" + }, + "newResourceBlockingPolicy": { + "type": "string", + "enum": [ + "allow", + "block" + ] + }, + "allowUnsafeScriptSrcKeywords": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "omitScriptNonce": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "connectSrcNotificationsEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "computedScriptSrc": { + "type": "string" + }, + "computedScriptSrcPreview": { + "type": "string" + }, + "computedConnectSrc": { + "type": "string" + }, + "computedConnectSrcPreview": { + "type": "string" + } + }, + "required": [ + "allowUnsafeScriptSrcKeywords", + "enabled", + "enforcePercentage", + "mode", + "newResourceBlockingPolicy" + ], + "type": "object" + } + }, + "required": [ + "next", + "previous", + "projectId" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "projectId": { + "type": "string" + }, + "headerName": { + "type": "string" + }, + "previousStatus": { + "type": "string" + }, + "justification": { + "type": "string" + } + }, + "required": [ + "headerName", + "justification", + "previousStatus", + "projectId" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "projectId": { + "type": "string" + }, + "headerName": { + "type": "string" + }, + "previousStatus": { + "type": "string" + }, + "justification": { + "nullable": true, + "type": "string" + } + }, + "required": [ + "headerName", + "justification", + "previousStatus", + "projectId" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "projectId": { + "type": "string" + }, + "projectName": { + "type": "string" + }, + "deletedCount": { + "type": "number" + }, + "scriptCount": { + "type": "number" + }, + "connectSrcCount": { + "type": "number" + }, + "connectSrcOriginCount": { + "type": "number" + }, + "headerCount": { + "type": "number" + }, + "connectSrcUserNormalizationRuleCount": { + "type": "number" + }, + "connectSrcNormalizationRulesCleared": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "connectSrcCount", + "connectSrcOriginCount", + "deletedCount", + "headerCount", + "projectId", + "projectName", + "scriptCount" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "projectId": { + "type": "string" + }, + "url": { + "type": "string" + }, + "previousStatus": { + "type": "string" + }, + "justification": { + "type": "string" + }, + "approvalScope": { + "type": "string", + "enum": [ + "all", + "preview" + ] + }, + "kind": { + "type": "string", + "enum": [ + "connectSrc", + "script" + ] + } + }, + "required": [ + "justification", + "previousStatus", + "projectId", + "url" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "projectId": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "script" + ] + }, + "resourceUrl": { + "type": "string" + } + }, + "required": [ + "projectId", + "resourceUrl", + "type" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "projectId": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "header" + ] + }, + "headerName": { + "type": "string" + } + }, + "required": [ + "headerName", + "projectId", + "type" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "projectId": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "connectSrc" + ] + }, + "resourceUrl": { + "type": "string" + } + }, + "required": [ + "projectId", + "resourceUrl", + "type" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "projectId": { + "type": "string" + }, + "url": { + "type": "string" + }, + "headerName": { + "type": "string" + }, + "previousStatus": { + "type": "string" + }, + "justification": { + "nullable": true, + "type": "string" + }, + "kind": { + "type": "string", + "enum": [ + "connectSrc", + "script" + ] + } + }, + "required": [ + "justification", + "previousStatus", + "projectId" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "additionalProperties": true, + "type": "object", + "description": "The payload of the event, if requested.", + "properties": { + "projectId": { + "type": "string" + }, + "projectName": { + "type": "string" + }, + "pattern": { + "type": "string" + }, + "justification": { + "type": "string" + } + }, + "required": [ + "justification", + "pattern", + "projectId", + "projectName" + ] + }, + { + "properties": { + "oldName": { + "type": "string" + }, + "newName": { + "type": "string" + } + }, + "required": [ + "newName", + "oldName" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "projectId": { + "type": "string" + }, + "environment": { + "type": "string" + }, + "host": { + "type": "string" + }, + "connectorId": { + "type": "string" + }, + "connectorType": { + "type": "string" + }, + "connectorService": { + "type": "string" + }, + "externalIssuer": { + "type": "string" + }, + "externalSubject": { + "type": "string" + }, + "sessionId": { + "type": "string" + }, + "emailVerified": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "tenantId": { + "type": "string" + }, + "installationId": { + "type": "string" + } + }, + "required": [ + "connectorId", + "connectorService", + "connectorType", + "environment", + "externalIssuer", + "externalSubject", + "host", + "projectId", + "sessionId" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "projectId": { + "type": "string" + }, + "projectName": { + "type": "string" + }, + "previous": { + "properties": { + "passport": { + "nullable": true, + "properties": { + "connectorId": { + "type": "string" + }, + "deploymentType": { + "type": "string", + "enum": [ + "all", + "all_except_custom_domains", + "preview", + "prod_deployment_urls_and_all_previews" + ] + } + }, + "required": [ + "connectorId", + "deploymentType" + ], + "type": "object" + } + }, + "type": "object" + }, + "next": { + "properties": { + "passport": { + "nullable": true, + "properties": { + "connectorId": { + "type": "string" + }, + "deploymentType": { + "type": "string", + "enum": [ + "all", + "all_except_custom_domains", + "preview", + "prod_deployment_urls_and_all_previews" + ] + } + }, + "required": [ + "connectorId", + "deploymentType" + ], + "type": "object" + } + }, + "type": "object" + } + }, + "required": [ + "next", + "previous", + "projectId", + "projectName" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "previous": { + "properties": { + "passport": { + "nullable": true, + "properties": { + "connectorId": { + "type": "string" + }, + "deploymentType": { + "type": "string", + "enum": [ + "all", + "all_except_custom_domains", + "preview", + "prod_deployment_urls_and_all_previews" + ] + } + }, + "required": [ + "connectorId", + "deploymentType" + ], + "type": "object" + } + }, + "type": "object" + }, + "next": { + "properties": { + "passport": { + "nullable": true, + "properties": { + "connectorId": { + "type": "string" + }, + "deploymentType": { + "type": "string", + "enum": [ + "all", + "all_except_custom_domains", + "preview", + "prod_deployment_urls_and_all_previews" + ] + } + }, + "required": [ + "connectorId", + "deploymentType" + ], + "type": "object" + } + }, + "type": "object" + } + }, + "required": [ + "next", + "previous" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "plan": { + "type": "string" + }, + "removedUsers": { + "additionalProperties": { + "properties": { + "role": { + "type": "string", + "enum": [ + "BILLING", + "CONTRIBUTOR", + "DEVELOPER", + "MEMBER", + "OWNER", + "SECURITY", + "VIEWER", + "VIEWER_FOR_PLUS" + ] + }, + "confirmed": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "confirmedAt": { + "type": "number" + }, + "joinedFrom": { + "properties": { + "origin": { + "type": "string", + "enum": [ + "account-update", + "bitbucket", + "dsync", + "feedback", + "github", + "gitlab", + "import", + "link", + "mail", + "nsnb-auto-approve", + "nsnb-hobby-upgrade", + "nsnb-invite", + "nsnb-redeploy", + "nsnb-redeploy-attribution-card", + "nsnb-request-access", + "nsnb-viewer-upgrade", + "organization-teams", + "saml", + "teams" + ] + }, + "commitId": { + "type": "string" + }, + "repoId": { + "type": "string" + }, + "repoPath": { + "type": "string" + }, + "gitUserId": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "gitUserLogin": { + "type": "string" + }, + "ssoUserId": { + "type": "string" + }, + "ssoConnectedAt": { + "type": "number" + }, + "idpUserId": { + "type": "string" + }, + "dsyncUserId": { + "type": "string" + }, + "dsyncConnectedAt": { + "type": "number" + } + }, + "required": [ + "origin" + ], + "type": "object" + } + }, + "required": [ + "confirmed", + "role" + ], + "type": "object" + }, + "type": "object" + }, + "prevPlan": { + "type": "string" + }, + "priorPlan": { + "type": "string" + }, + "isDowngrade": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "userAgent": { + "type": "string" + }, + "isReactivate": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "isTrialUpgrade": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "automated": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether the plan change was system-initiated rather than human-initiated." + }, + "reason": { + "type": "string", + "description": "Why the plan changed. For downgrades, this is a {@link DowngradeReason} from `@api/pubsub-types` (e.g. `user_downgrade`, `trial_expired`)." + }, + "timestamp": { + "type": "number" + }, + "removedMemberCount": { + "type": "number" + } + }, + "required": [ + "plan" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "plan": { + "type": "string" + }, + "removedUsers": { + "additionalProperties": { + "properties": { + "role": { + "type": "string", + "enum": [ + "BILLING", + "CONTRIBUTOR", + "DEVELOPER", + "MEMBER", + "OWNER", + "SECURITY", + "VIEWER", + "VIEWER_FOR_PLUS" + ] + }, + "confirmed": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "confirmedAt": { + "type": "number" + }, + "joinedFrom": { + "properties": { + "origin": { + "type": "string", + "enum": [ + "account-update", + "bitbucket", + "dsync", + "feedback", + "github", + "gitlab", + "import", + "link", + "mail", + "nsnb-auto-approve", + "nsnb-hobby-upgrade", + "nsnb-invite", + "nsnb-redeploy", + "nsnb-redeploy-attribution-card", + "nsnb-request-access", + "nsnb-viewer-upgrade", + "organization-teams", + "saml", + "teams" + ] + }, + "commitId": { + "type": "string" + }, + "repoId": { + "type": "string" + }, + "repoPath": { + "type": "string" + }, + "gitUserId": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "gitUserLogin": { + "type": "string" + }, + "ssoUserId": { + "type": "string" + }, + "ssoConnectedAt": { + "type": "number" + }, + "idpUserId": { + "type": "string" + }, + "dsyncUserId": { + "type": "string" + }, + "dsyncConnectedAt": { + "type": "number" + } + }, + "required": [ + "origin" + ], + "type": "object" + } + }, + "required": [ + "confirmed", + "role" + ], + "type": "object" + }, + "type": "object" + }, + "prevPlan": { + "type": "string" + }, + "priorPlan": { + "type": "string" + }, + "isDowngrade": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "userAgent": { + "type": "string" + }, + "isReactivate": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "isTrialUpgrade": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "automated": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether the plan change was system-initiated rather than human-initiated." + }, + "reason": { + "type": "string", + "description": "Why the plan changed. For downgrades, this is a {@link DowngradeReason} from `@api/pubsub-types` (e.g. `user_downgrade`, `trial_expired`)." + }, + "timestamp": { + "type": "number" + }, + "removedMemberCount": { + "type": "number" + }, + "actorId": { + "type": "string", + "description": "Okta user id." + }, + "actorType": { + "type": "string", + "enum": [ + "admin" + ] + }, + "actorName": { + "type": "string" + } + }, + "required": [ + "actorId", + "actorType", + "plan" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "price": { + "type": "number" + }, + "currency": { + "type": "string" + }, + "enabled": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "previewDeploymentSuffix": { + "nullable": true, + "type": "string" + }, + "previousPreviewDeploymentSuffix": { + "nullable": true, + "type": "string" + } + }, + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "projectName": { + "type": "string" + }, + "endpoint": { + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "projectId": { + "type": "string" + }, + "vercelRegion": { + "type": "string" + }, + "awsServiceName": { + "type": "string" + }, + "privateDnsNames": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "awsServiceName", + "id", + "name", + "projectId", + "vercelRegion" + ], + "type": "object" + } + }, + "required": [ + "endpoint" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "projectName": { + "type": "string" + }, + "privateLinkEndpoint": { + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + } + }, + "required": [ + "id", + "name" + ], + "type": "object" + }, + "projectId": { + "type": "string" + } + }, + "required": [ + "privateLinkEndpoint", + "projectId" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "projectName": { + "type": "string" + }, + "prev": { + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "projectId": { + "type": "string" + }, + "vercelRegion": { + "type": "string" + }, + "awsServiceName": { + "type": "string" + }, + "privateDnsNames": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "awsServiceName", + "id", + "name", + "projectId", + "vercelRegion" + ], + "type": "object" + }, + "current": { + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "projectId": { + "type": "string" + }, + "vercelRegion": { + "type": "string" + }, + "awsServiceName": { + "type": "string" + }, + "privateDnsNames": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "awsServiceName", + "id", + "name", + "projectId", + "vercelRegion" + ], + "type": "object" + } + }, + "required": [ + "current", + "prev" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "projectName": { + "type": "string" + }, + "privateLinkEndpoint": { + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "environmentIds": { + "items": { + "type": "string" + }, + "type": "array" + }, + "privateDnsNames": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "id", + "name" + ], + "type": "object" + }, + "projectId": { + "type": "string" + }, + "previousEndpoint": { + "properties": { + "name": { + "type": "string" + }, + "environmentIds": { + "items": { + "type": "string" + }, + "type": "array" + }, + "privateDnsNames": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "name" + ], + "type": "object" + } + }, + "required": [ + "previousEndpoint", + "privateLinkEndpoint", + "projectId" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "projectId": { + "type": "string" + }, + "projectName": { + "type": "string" + }, + "branch": { + "type": "string" + } + }, + "required": [ + "branch", + "projectName" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "projectId": { + "type": "string" + }, + "projectName": { + "type": "string" + }, + "directoryListing": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "directoryListing", + "projectId", + "projectName" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "projectName": { + "type": "string" + }, + "projectId": { + "type": "string" + }, + "projectAnalytics": { + "nullable": true, + "properties": { + "id": { + "type": "string" + }, + "canceledAt": { + "nullable": true, + "type": "number" + }, + "disabledAt": { + "type": "number" + }, + "enabledAt": { + "type": "number" + }, + "paidAt": { + "type": "number" + }, + "sampleRatePercent": { + "nullable": true, + "type": "number" + }, + "spendLimitInDollars": { + "nullable": true, + "type": "number" + } + }, + "required": [ + "disabledAt", + "enabledAt", + "id" + ], + "type": "object" + }, + "prevProjectAnalytics": { + "nullable": true, + "properties": { + "id": { + "type": "string" + }, + "canceledAt": { + "nullable": true, + "type": "number" + }, + "disabledAt": { + "type": "number" + }, + "enabledAt": { + "type": "number" + }, + "paidAt": { + "type": "number" + }, + "sampleRatePercent": { + "nullable": true, + "type": "number" + }, + "spendLimitInDollars": { + "nullable": true, + "type": "number" + } + }, + "required": [ + "disabledAt", + "enabledAt", + "id" + ], + "type": "object" + } + }, + "required": [ + "prevProjectAnalytics", + "projectAnalytics", + "projectId" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "projectName": { + "type": "string" + }, + "projectId": { + "type": "string" + }, + "projectAnalytics": { + "additionalProperties": true, + "type": "object" + }, + "prevProjectAnalytics": { + "nullable": true, + "additionalProperties": true, + "type": "object" + } + }, + "required": [ + "projectId" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "projectId": { + "type": "string" + }, + "projectName": { + "type": "string" + }, + "action": { + "type": "string", + "enum": [ + "disabled", + "enabled", + "regenerated", + "updated" + ] + }, + "isEnvVar": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "note": { + "type": "string" + } + }, + "required": [ + "action", + "projectId", + "projectName" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "projectId": { + "type": "string" + }, + "projectName": { + "type": "string" + }, + "avatar": { + "nullable": true, + "type": "string" + } + }, + "required": [ + "projectId", + "projectName" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "projectId": { + "type": "string" + }, + "projectName": { + "type": "string" + }, + "enableAffectedProjectsDeployments": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "enableAffectedProjectsDeployments", + "projectId", + "projectName" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "projectId": { + "type": "string" + }, + "projectName": { + "type": "string" + }, + "enableExternalRewriteCaching": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "enableExternalRewriteCaching", + "projectId", + "projectName" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "projectId": { + "type": "string" + }, + "projectName": { + "type": "string" + }, + "previous": { + "type": "object" + }, + "next": { + "type": "object" + } + }, + "required": [ + "next", + "previous", + "projectId", + "projectName" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "projectId": { + "type": "string" + }, + "projectName": { + "type": "string" + }, + "productionDeploymentsFastLane": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "productionDeploymentsFastLane", + "projectId", + "projectName" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "projectId": { + "type": "string" + }, + "projectName": { + "type": "string" + }, + "sourceFilesOutsideRootDirectory": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "projectId", + "projectName", + "sourceFilesOutsideRootDirectory" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "projectId": { + "type": "string" + }, + "projectName": { + "type": "string" + }, + "deploymentId": { + "type": "string", + "description": "Deployment whose outcome caused a system-initiated elastic resize." + }, + "previousBuildMachineType": { + "type": "string" + }, + "nextBuildMachineType": { + "type": "string" + }, + "previousBuildMachineSelection": { + "type": "string" + }, + "nextBuildMachineSelection": { + "type": "string" + }, + "isSystemInitiated": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "reason": { + "type": "string", + "description": "For system-initiated (elastic) changes, why the build machine was upgraded/downgraded. Stored as the raw reason code (see `ElasticChangeReason` in `@api/build-machines-types`) and rendered as a human-readable clause in the activity/audit log." + } + }, + "required": [ + "nextBuildMachineSelection", + "nextBuildMachineType", + "previousBuildMachineSelection", + "projectName" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "projectId": { + "type": "string" + }, + "projectName": { + "type": "string" + }, + "widget": { + "nullable": true, + "type": "string", + "enum": [ + "alert", + "analytics-online", + "analytics-page-views", + "analytics-visitors", + "firewall-allowed", + "firewall-denied", + "observability-alert", + "observability-edge-requests", + "observability-error-rate", + "observability-function-invocations", + "online", + "res", + "shortcut", + "speed-insights-cls", + "speed-insights-lcp", + "speed-insights-res", + null + ] + } + }, + "required": [ + "projectId", + "projectName", + "widget" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "projectId": { + "type": "string" + }, + "projectName": { + "type": "string" + }, + "certId": { + "type": "string" + }, + "origin": { + "type": "string" + } + }, + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "projectId": { + "type": "string" + }, + "projectName": { + "type": "string" + }, + "target": { + "items": { + "type": "string" + }, + "type": "array" + }, + "updated": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "team": { + "properties": { + "name": { + "type": "string" + }, + "id": { + "type": "string" + } + }, + "required": [ + "id", + "name" + ], + "type": "object" + }, + "project": { + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "oldConnectConfigurations": { + "nullable": true, + "items": { + "properties": { + "envId": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "string", + "enum": [ + "preview", + "production" + ] + } + ] + }, + "connectConfigurationId": { + "type": "string" + }, + "dc": { + "type": "string" + }, + "passive": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "buildsEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "aws": { + "properties": { + "subnetIds": { + "items": { + "type": "string" + }, + "type": "array" + }, + "securityGroupId": { + "type": "string" + } + }, + "required": [ + "subnetIds" + ], + "type": "object" + }, + "createdAt": { + "type": "number" + }, + "updatedAt": { + "type": "number" + } + }, + "required": [ + "buildsEnabled", + "connectConfigurationId", + "createdAt", + "envId", + "passive", + "updatedAt" + ], + "type": "object" + }, + "type": "array" + }, + "newConnectConfigurations": { + "nullable": true, + "items": { + "properties": { + "envId": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "string", + "enum": [ + "preview", + "production" + ] + } + ] + }, + "connectConfigurationId": { + "type": "string" + }, + "dc": { + "type": "string" + }, + "passive": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "buildsEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "aws": { + "properties": { + "subnetIds": { + "items": { + "type": "string" + }, + "type": "array" + }, + "securityGroupId": { + "type": "string" + } + }, + "required": [ + "subnetIds" + ], + "type": "object" + }, + "createdAt": { + "type": "number" + }, + "updatedAt": { + "type": "number" + } + }, + "required": [ + "buildsEnabled", + "connectConfigurationId", + "createdAt", + "envId", + "passive", + "updatedAt" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "id", + "newConnectConfigurations", + "oldConnectConfigurations" + ], + "type": "object" + } + }, + "required": [ + "project", + "team" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "projectName": { + "type": "string" + }, + "projectId": { + "type": "string" + } + }, + "required": [ + "projectId" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "projectId": { + "type": "string" + }, + "projectName": { + "type": "string" + }, + "action": { + "type": "string", + "enum": [ + "disabled", + "enabled" + ] + } + }, + "required": [ + "action", + "projectId", + "projectName" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "name": { + "type": "string" + }, + "ownerId": { + "type": "string" + } + }, + "required": [ + "name", + "ownerId" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "projectId": { + "type": "string" + }, + "projectName": { + "type": "string" + }, + "elasticConcurrencyEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "oldElasticConcurrencyEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "buildQueueConfiguration": { + "type": "string", + "enum": [ + "SKIP_NAMESPACE_QUEUE", + "WAIT_FOR_NAMESPACE_QUEUE" + ] + }, + "oldBuildQueueConfiguration": { + "type": "string", + "enum": [ + "SKIP_NAMESPACE_QUEUE", + "WAIT_FOR_NAMESPACE_QUEUE" + ] + } + }, + "required": [ + "elasticConcurrencyEnabled", + "oldElasticConcurrencyEnabled", + "projectId", + "projectName" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "projectId": { + "type": "string" + }, + "projectName": { + "type": "string" + }, + "autoAssignCustomDomains": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "autoAssignCustomDomains", + "projectId", + "projectName" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "projectId": { + "type": "string" + }, + "projectName": { + "type": "string" + }, + "previewDeploymentsEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "previewDeploymentsEnabled", + "projectId", + "projectName" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "projectId": { + "type": "string" + }, + "projectName": { + "type": "string" + }, + "customEnvironmentId": { + "type": "string" + }, + "customEnvironmentSlug": { + "type": "string" + }, + "previous": { + "properties": { + "branchMatcher": { + "properties": { + "type": { + "type": "string", + "enum": [ + "endsWith", + "equals", + "startsWith" + ], + "description": "The type of matching to perform" + }, + "pattern": { + "type": "string", + "description": "The pattern to match against branch names" + } + }, + "required": [ + "pattern", + "type" + ], + "type": "object" + } + }, + "type": "object" + }, + "next": { + "properties": { + "branchMatcher": { + "properties": { + "type": { + "type": "string", + "enum": [ + "endsWith", + "equals", + "startsWith" + ], + "description": "The type of matching to perform" + }, + "pattern": { + "type": "string", + "description": "The pattern to match against branch names" + } + }, + "required": [ + "pattern", + "type" + ], + "type": "object" + } + }, + "type": "object" + } + }, + "required": [ + "customEnvironmentId", + "customEnvironmentSlug", + "next", + "previous", + "projectId", + "projectName" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "projectId": { + "type": "string" + }, + "projectName": { + "type": "string" + }, + "customEnvironmentId": { + "type": "string" + }, + "customEnvironmentSlug": { + "type": "string" + } + }, + "required": [ + "customEnvironmentId", + "customEnvironmentSlug", + "projectId", + "projectName" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "projectName": { + "type": "string" + }, + "projectId": { + "type": "string" + }, + "enableFunctionsBeta": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "enableFunctionsBeta", + "projectId" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "projectId": { + "type": "string" + }, + "projectName": { + "type": "string" + }, + "previous": { + "properties": { + "functionDefaultTimeout": { + "nullable": true, + "type": "number" + } + }, + "required": [ + "functionDefaultTimeout" + ], + "type": "object" + }, + "next": { + "properties": { + "functionDefaultTimeout": { + "type": "number" + } + }, + "required": [ + "functionDefaultTimeout" + ], + "type": "object" + } + }, + "required": [ + "next", + "previous", + "projectId", + "projectName" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "projectId": { + "type": "string" + }, + "projectName": { + "type": "string" + }, + "previous": { + "properties": { + "functionDefaultMemoryType": { + "nullable": true, + "type": "string" + } + }, + "required": [ + "functionDefaultMemoryType" + ], + "type": "object" + }, + "next": { + "properties": { + "functionDefaultMemoryType": { + "type": "string" + } + }, + "required": [ + "functionDefaultMemoryType" + ], + "type": "object" + } + }, + "required": [ + "next", + "previous", + "projectId", + "projectName" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "projectId": { + "type": "string" + }, + "projectName": { + "type": "string" + }, + "previous": { + "properties": { + "functionDefaultRegions": { + "nullable": true, + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "functionDefaultRegions" + ], + "type": "object" + }, + "next": { + "properties": { + "functionDefaultRegions": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "functionDefaultRegions" + ], + "type": "object" + } + }, + "required": [ + "next", + "previous", + "projectId", + "projectName" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "projectId": { + "type": "string" + }, + "projectName": { + "type": "string" + }, + "previous": { + "properties": { + "functionZeroConfigFailover": { + "nullable": true, + "type": "boolean", + "enum": [ + false, + true, + null + ] + } + }, + "required": [ + "functionZeroConfigFailover" + ], + "type": "object" + }, + "next": { + "properties": { + "functionZeroConfigFailover": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "functionZeroConfigFailover" + ], + "type": "object" + } + }, + "required": [ + "next", + "previous", + "projectId", + "projectName" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "projectId": { + "type": "string" + }, + "projectName": { + "type": "string" + }, + "previewDeploymentSuffix": { + "nullable": true, + "type": "string" + } + }, + "required": [ + "previewDeploymentSuffix", + "projectId", + "projectName" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "projectId": { + "type": "string" + }, + "projectName": { + "type": "string" + }, + "newProjectName": { + "type": "string" + } + }, + "required": [ + "newProjectName", + "projectId", + "projectName" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "projectId": { + "type": "string" + }, + "projectName": { + "type": "string" + }, + "previous": { + "properties": { + "gitProvider": { + "type": "string", + "enum": [ + "bitbucket", + "cursor-origin", + "github", + "github-custom-host", + "github-limited", + "gitlab", + "v0", + "vercel" + ] + }, + "gitRepoId": { + "type": "string" + }, + "gitRepositoryName": { + "type": "string" + } + }, + "required": [ + "gitProvider", + "gitRepoId", + "gitRepositoryName" + ], + "type": "object" + }, + "next": { + "properties": { + "gitProvider": { + "type": "string", + "enum": [ + "bitbucket", + "cursor-origin", + "github", + "github-custom-host", + "github-limited", + "gitlab", + "v0", + "vercel" + ] + }, + "gitRepoId": { + "type": "string" + }, + "gitRepositoryName": { + "type": "string" + } + }, + "required": [ + "gitProvider", + "gitRepoId", + "gitRepositoryName" + ], + "type": "object" + } + }, + "required": [ + "next", + "projectId", + "projectName" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "projectId": { + "type": "string" + }, + "projectName": { + "type": "string" + }, + "gitProvider": { + "type": "string", + "enum": [ + "bitbucket", + "cursor-origin", + "github", + "github-custom-host", + "github-limited", + "gitlab", + "v0", + "vercel" + ] + }, + "gitRepoId": { + "type": "string" + }, + "gitRepositoryName": { + "type": "string" + } + }, + "required": [ + "gitProvider", + "gitRepoId", + "gitRepositoryName", + "projectId", + "projectName" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "projectId": { + "type": "string" + }, + "projectName": { + "type": "string" + }, + "onPullRequest": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "onPullRequest", + "projectId", + "projectName" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "projectId": { + "type": "string" + }, + "projectName": { + "type": "string" + }, + "onCommit": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "onCommit", + "projectId", + "projectName" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "projectId": { + "type": "string" + }, + "projectName": { + "type": "string" + }, + "disableRepositoryDispatchEvents": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "disableRepositoryDispatchEvents", + "projectId", + "projectName" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "projectId": { + "type": "string" + }, + "projectName": { + "type": "string" + }, + "createDeployments": { + "type": "string", + "enum": [ + "disabled", + "enabled" + ] + } + }, + "required": [ + "createDeployments", + "projectId", + "projectName" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "projectId": { + "type": "string" + }, + "projectName": { + "type": "string" + }, + "requireVerifiedCommits": { + "nullable": true, + "type": "boolean", + "enum": [ + false, + true, + null + ] + } + }, + "required": [ + "projectId", + "projectName", + "requireVerifiedCommits" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "requireVerifiedCommits": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "requireVerifiedCommits" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "disableRepositoryDispatchEvents": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "disableRepositoryDispatchEvents" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "projectId": { + "type": "string" + }, + "projectName": { + "type": "string" + }, + "gitCommitStatus": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "gitCommitStatus", + "projectId", + "projectName" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "projectId": { + "type": "string" + }, + "projectName": { + "type": "string" + }, + "gitLFS": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "gitLFS", + "projectId", + "projectName" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "projectId": { + "type": "string" + }, + "projectName": { + "type": "string" + }, + "consolidatedGitCommitStatus": { + "nullable": true, + "properties": { + "enabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "propagateFailures": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "enabled", + "propagateFailures" + ], + "type": "object" + } + }, + "required": [ + "consolidatedGitCommitStatus", + "projectId", + "projectName" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "projectId": { + "type": "string" + }, + "projectName": { + "type": "string" + }, + "previous": { + "properties": { + "commandForIgnoringBuildStep": { + "type": "string" + } + }, + "type": "object" + }, + "next": { + "properties": { + "commandForIgnoringBuildStep": { + "type": "string" + } + }, + "type": "object" + } + }, + "required": [ + "next", + "previous", + "projectId", + "projectName" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "projectId": { + "type": "string" + }, + "projectName": { + "type": "string" + }, + "domain": { + "type": "string" + }, + "target": { + "type": "string" + }, + "redirect": { + "nullable": true, + "type": "string" + }, + "redirectStatusCode": { + "nullable": true, + "type": "number" + }, + "gitBranch": { + "nullable": true, + "type": "string" + }, + "configuredBy": { + "type": "string" + } + }, + "required": [ + "domain", + "gitBranch", + "projectId", + "projectName", + "redirect", + "redirectStatusCode", + "target" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "projectId": { + "type": "string" + }, + "projectName": { + "type": "string" + }, + "domain": { + "type": "string" + }, + "target": { + "type": "string" + }, + "redirect": { + "nullable": true, + "type": "string" + }, + "redirectStatusCode": { + "nullable": true, + "type": "number" + } + }, + "required": [ + "domain", + "projectId", + "projectName", + "target" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "oldProjectId": { + "type": "string" + }, + "oldProjectName": { + "type": "string" + }, + "newProjectId": { + "type": "string" + }, + "newProjectName": { + "type": "string" + }, + "domain": { + "type": "string" + } + }, + "required": [ + "domain", + "newProjectId", + "newProjectName", + "oldProjectId", + "oldProjectName" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "projectId": { + "type": "string" + }, + "projectName": { + "type": "string" + }, + "domain": { + "type": "string" + }, + "redirect": { + "nullable": true, + "type": "string" + }, + "redirectStatusCode": { + "nullable": true, + "type": "number" + } + }, + "required": [ + "domain", + "projectId", + "projectName" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "projects": { + "items": { + "properties": { + "projectId": { + "type": "string" + }, + "role": { + "type": "string", + "enum": [ + "ADMIN", + "PROJECT_DEVELOPER", + "PROJECT_GUEST", + "PROJECT_VIEWER" + ] + }, + "membershipCreatedAt": { + "type": "number" + } + }, + "required": [ + "membershipCreatedAt", + "projectId", + "role" + ], + "type": "object" + }, + "type": "array" + }, + "teamMembership": { + "properties": { + "uid": { + "type": "string" + }, + "username": { + "type": "string" + } + }, + "required": [ + "uid" + ], + "type": "object" + }, + "directoryType": { + "type": "string" + } + }, + "required": [ + "projects" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "projectId": { + "type": "string" + }, + "projectName": { + "type": "string" + }, + "target": { + "type": "string" + }, + "domain": { + "type": "string" + }, + "configuredBy": { + "nullable": true, + "type": "string" + }, + "prevConfiguredBy": { + "nullable": true, + "type": "string" + } + }, + "required": [ + "domain", + "projectId", + "projectName", + "target" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "project": { + "properties": { + "name": { + "type": "string" + }, + "id": { + "type": "string" + } + }, + "required": [ + "name" + ], + "type": "object" + }, + "projectMembership": { + "nullable": true, + "properties": { + "role": { + "type": "string", + "enum": [ + "ADMIN", + "PROJECT_DEVELOPER", + "PROJECT_GUEST", + "PROJECT_VIEWER" + ] + }, + "uid": { + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "username": { + "type": "string" + } + }, + "required": [ + "createdAt", + "role", + "uid" + ], + "type": "object" + } + }, + "required": [ + "project", + "projectMembership" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "project": { + "properties": { + "name": { + "type": "string" + }, + "role": { + "type": "string", + "enum": [ + "ADMIN", + "PROJECT_DEVELOPER", + "PROJECT_GUEST", + "PROJECT_VIEWER" + ] + }, + "invitedUserName": { + "type": "string" + }, + "id": { + "type": "string" + }, + "invitedUserId": { + "type": "string" + } + }, + "required": [ + "invitedUserName", + "name", + "role" + ], + "type": "object" + } + }, + "required": [ + "project" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "project": { + "properties": { + "name": { + "type": "string" + }, + "id": { + "type": "string" + } + }, + "required": [ + "name" + ], + "type": "object" + }, + "removedMembership": { + "properties": { + "role": { + "type": "string", + "enum": [ + "ADMIN", + "PROJECT_DEVELOPER", + "PROJECT_GUEST", + "PROJECT_VIEWER" + ] + }, + "uid": { + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "username": { + "type": "string" + } + }, + "required": [ + "createdAt", + "role", + "uid" + ], + "type": "object" + } + }, + "required": [ + "project", + "removedMembership" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "project": { + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + } + }, + "required": [ + "id", + "name" + ], + "type": "object" + }, + "projectMembership": { + "properties": { + "role": { + "type": "string", + "enum": [ + "ADMIN", + "PROJECT_DEVELOPER", + "PROJECT_GUEST", + "PROJECT_VIEWER" + ] + }, + "uid": { + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "username": { + "type": "string" + }, + "previousRole": { + "type": "string", + "enum": [ + "ADMIN", + "PROJECT_DEVELOPER", + "PROJECT_GUEST", + "PROJECT_VIEWER" + ] + } + }, + "type": "object" + } + }, + "required": [ + "project", + "projectMembership" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "previousProjectId": { + "type": "string" + }, + "newProjectId": { + "type": "string" + }, + "previousProjectName": { + "type": "string" + }, + "newProjectName": { + "type": "string" + }, + "originAccountName": { + "type": "string" + }, + "transferId": { + "type": "string" + } + }, + "required": [ + "newProjectName", + "originAccountName", + "previousProjectName" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "previousProjectId": { + "type": "string" + }, + "projectName": { + "type": "string" + }, + "destinationAccountName": { + "nullable": true, + "type": "string" + }, + "transferId": { + "type": "string" + } + }, + "required": [ + "destinationAccountName", + "projectName" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "projectId": { + "type": "string" + }, + "projectName": { + "type": "string" + }, + "originAccountName": { + "type": "string" + }, + "destinationAccountName": { + "type": "string" + }, + "destinationAccountId": { + "type": "string" + }, + "transferId": { + "type": "string" + } + }, + "required": [ + "destinationAccountId", + "destinationAccountName", + "originAccountName", + "projectId", + "projectName" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "previousProjectId": { + "type": "string" + }, + "newProjectId": { + "type": "string" + }, + "previousProjectName": { + "type": "string" + }, + "newProjectName": { + "type": "string" + }, + "destinationAccountName": { + "type": "string" + }, + "transferId": { + "type": "string" + } + }, + "required": [ + "destinationAccountName", + "newProjectName", + "previousProjectName" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "source": { + "type": "string" + }, + "projectId": { + "type": "string" + }, + "projectName": { + "type": "string" + } + }, + "required": [ + "projectId", + "projectName", + "source" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "projectId": { + "type": "string" + }, + "projectName": { + "type": "string" + }, + "optionsAllowlist": { + "nullable": true, + "properties": { + "paths": { + "items": { + "properties": { + "value": { + "type": "string" + } + }, + "required": [ + "value" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "paths" + ], + "type": "object" + }, + "oldOptionsAllowlist": { + "nullable": true, + "properties": { + "paths": { + "items": { + "properties": { + "value": { + "type": "string" + } + }, + "required": [ + "value" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "paths" + ], + "type": "object" + } + }, + "required": [ + "projectId", + "projectName" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "projectId": { + "type": "string" + }, + "projectName": { + "type": "string" + }, + "passwordProtection": { + "nullable": true, + "oneOf": [ + { + "properties": { + "deploymentType": { + "type": "string", + "enum": [ + "all", + "all_except_custom_domains", + "preview", + "prod_deployment_urls_and_all_previews" + ] + } + }, + "required": [ + "deploymentType" + ], + "type": "object" + }, + { + "type": "string", + "enum": [ + "all", + "all_except_custom_domains", + "preview", + "prod_deployment_urls_and_all_previews" + ] + } + ] + }, + "oldPasswordProtection": { + "nullable": true, + "oneOf": [ + { + "properties": { + "deploymentType": { + "type": "string", + "enum": [ + "all", + "all_except_custom_domains", + "preview", + "prod_deployment_urls_and_all_previews" + ] + } + }, + "required": [ + "deploymentType" + ], + "type": "object" + }, + { + "type": "string", + "enum": [ + "all", + "all_except_custom_domains", + "preview", + "prod_deployment_urls_and_all_previews" + ] + } + ] + } + }, + "required": [ + "oldPasswordProtection", + "passwordProtection" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "projectId": { + "type": "string" + } + }, + "required": [ + "projectId" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "projectId": { + "type": "string" + }, + "expiresAt": { + "type": "number" + } + }, + "required": [ + "expiresAt", + "projectId" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "projectId": { + "type": "string" + }, + "projectName": { + "type": "string", + "description": "Display name for Activity links. Optional for events stored before it was published." + }, + "reasonCode": { + "type": "string", + "enum": [ + "BACKOFFICE", + "BUDGET_REACHED", + "PUBLIC_API" + ] + } + }, + "required": [ + "projectId" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "projectId": { + "type": "string" + }, + "projectName": { + "type": "string" + }, + "consent": { + "type": "string", + "enum": [ + "granted", + "refused" + ] + } + }, + "required": [ + "consent", + "projectName" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "projectId": { + "type": "string" + }, + "projectName": { + "type": "string" + }, + "projectAccountId": { + "type": "string" + }, + "deploymentId": { + "type": "string" + }, + "rollbackDescription": { + "properties": { + "userId": { + "type": "string", + "description": "The user who rolled back the project." + }, + "username": { + "type": "string", + "description": "The username of the user who rolled back the project." + }, + "description": { + "type": "string", + "description": "User-supplied explanation of why they rolled back the project. Limited to 250 characters." + }, + "createdAt": { + "type": "number", + "description": "Timestamp of when the rollback was requested." + } + }, + "required": [ + "createdAt", + "description", + "userId", + "username" + ], + "type": "object", + "description": "Description of why a project was rolled back, and by whom. Note that lastAliasRequest contains the from/to details of the rollback." + } + }, + "required": [ + "deploymentId", + "projectAccountId", + "projectId", + "projectName" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "projectId": { + "type": "string" + }, + "projectName": { + "type": "string" + }, + "targetDeploymentId": { + "type": "string" + } + }, + "required": [ + "projectId", + "projectName" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "projectId": { + "type": "string" + }, + "projectName": { + "type": "string" + }, + "targetDeploymentId": { + "type": "string" + }, + "newTargetPercentage": { + "type": "number" + } + }, + "required": [ + "projectId", + "projectName" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "projectId": { + "type": "string" + }, + "projectName": { + "type": "string" + }, + "targetDeploymentId": { + "type": "string" + }, + "action": { + "type": "string" + } + }, + "required": [ + "projectId", + "projectName" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "projectId": { + "type": "string" + }, + "projectName": { + "type": "string" + }, + "previous": { + "nullable": true, + "type": "object" + }, + "next": { + "nullable": true, + "type": "object" + } + }, + "required": [ + "next", + "previous", + "projectId", + "projectName" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "projectId": { + "type": "string" + }, + "projectName": { + "type": "string" + }, + "region": { + "type": "string" + }, + "failoverRegions": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "projectId", + "projectName" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "projectId": { + "type": "string" + }, + "projectName": { + "type": "string" + }, + "previous": { + "properties": { + "issuerMode": { + "type": "string", + "enum": [ + "global", + "team" + ] + } + }, + "type": "object" + }, + "next": { + "properties": { + "issuerMode": { + "type": "string", + "enum": [ + "global", + "team" + ] + } + }, + "required": [ + "issuerMode" + ], + "type": "object" + } + }, + "required": [ + "next", + "previous", + "projectId", + "projectName" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "projectId": { + "type": "string" + }, + "projectName": { + "type": "string" + }, + "customerSupportCodeVisibility": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "customerSupportCodeVisibility", + "projectId", + "projectName" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "projectId": { + "type": "string" + }, + "projectName": { + "type": "string" + }, + "gitForkProtection": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "gitForkProtection", + "projectId", + "projectName" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "projectId": { + "type": "string" + }, + "projectName": { + "type": "string" + }, + "protectedSourcemaps": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "projectId", + "projectName", + "protectedSourcemaps" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "projectId": { + "type": "string" + }, + "projectName": { + "type": "string" + }, + "inheritDeploymentProtection": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "inheritDeploymentProtection", + "projectId", + "projectName" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "projectId": { + "type": "string" + }, + "projectName": { + "type": "string" + }, + "publicSource": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "projectId", + "projectName", + "publicSource" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "projectId": { + "type": "string" + }, + "projectName": { + "type": "string" + }, + "previous": { + "properties": { + "expiration": { + "type": "string" + }, + "expirationProduction": { + "type": "string" + }, + "expirationCanceled": { + "type": "string" + }, + "expirationErrored": { + "type": "string" + } + }, + "type": "object" + }, + "next": { + "properties": { + "expiration": { + "type": "string" + }, + "expirationProduction": { + "type": "string" + }, + "expirationCanceled": { + "type": "string" + }, + "expirationErrored": { + "type": "string" + } + }, + "type": "object" + } + }, + "required": [ + "next", + "previous" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "projectId": { + "type": "string" + }, + "projectName": { + "type": "string" + }, + "next": { + "properties": { + "skewProtectionBoundaryAt": { + "type": "number" + } + }, + "required": [ + "skewProtectionBoundaryAt" + ], + "type": "object" + }, + "previous": { + "properties": { + "skewProtectionBoundaryAt": { + "type": "number" + } + }, + "type": "object" + } + }, + "required": [ + "next", + "previous", + "projectId", + "projectName" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "projectId": { + "type": "string" + }, + "projectName": { + "type": "string" + }, + "next": { + "properties": { + "skewProtectionMaxAge": { + "type": "number" + } + }, + "required": [ + "skewProtectionMaxAge" + ], + "type": "object" + }, + "previous": { + "properties": { + "skewProtectionMaxAge": { + "type": "number" + } + }, + "type": "object" + } + }, + "required": [ + "next", + "previous", + "projectId", + "projectName" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "projectId": { + "type": "string" + }, + "projectName": { + "type": "string" + }, + "next": { + "properties": { + "skewProtectionAllowedDomains": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "skewProtectionAllowedDomains" + ], + "type": "object" + }, + "previous": { + "properties": { + "skewProtectionAllowedDomains": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + } + }, + "required": [ + "next", + "previous", + "projectId", + "projectName" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "projectId": { + "type": "string" + }, + "projectName": { + "type": "string" + }, + "ssoProtection": { + "nullable": true, + "oneOf": [ + { + "properties": { + "deploymentType": { + "type": "string", + "enum": [ + "all", + "all_except_custom_domains", + "preview", + "prod_deployment_urls_and_all_previews" + ] + }, + "cve55182MigrationAppliedFrom": { + "nullable": true, + "type": "string", + "enum": [ + "all", + "all_except_custom_domains", + "preview", + "prod_deployment_urls_and_all_previews", + null + ] + }, + "april2026SecurityIncidentMigrationAppliedFrom": { + "nullable": true, + "type": "string", + "enum": [ + "all", + "all_except_custom_domains", + "preview", + "prod_deployment_urls_and_all_previews", + null + ] + } + }, + "required": [ + "deploymentType" + ], + "type": "object" + }, + { + "type": "string", + "enum": [ + "all", + "all_except_custom_domains", + "preview", + "prod_deployment_urls_and_all_previews" + ] + } + ] + }, + "oldSsoProtection": { + "nullable": true, + "oneOf": [ + { + "properties": { + "deploymentType": { + "type": "string", + "enum": [ + "all", + "all_except_custom_domains", + "preview", + "prod_deployment_urls_and_all_previews" + ] + }, + "cve55182MigrationAppliedFrom": { + "nullable": true, + "type": "string", + "enum": [ + "all", + "all_except_custom_domains", + "preview", + "prod_deployment_urls_and_all_previews", + null + ] + }, + "april2026SecurityIncidentMigrationAppliedFrom": { + "nullable": true, + "type": "string", + "enum": [ + "all", + "all_except_custom_domains", + "preview", + "prod_deployment_urls_and_all_previews", + null + ] + } + }, + "required": [ + "deploymentType" + ], + "type": "object" + }, + { + "type": "string", + "enum": [ + "all", + "all_except_custom_domains", + "preview", + "prod_deployment_urls_and_all_previews" + ] + } + ] + } + }, + "required": [ + "oldSsoProtection", + "ssoProtection" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "projectId": { + "type": "string" + }, + "projectName": { + "type": "string" + }, + "next": { + "properties": { + "project": { + "properties": { + "id": { + "type": "string" + }, + "staticIps": { + "properties": { + "builds": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "buildRegion": { + "type": "string" + }, + "enabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "regions": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "enabled" + ], + "type": "object" + } + }, + "required": [ + "staticIps" + ], + "type": "object" + } + }, + "required": [ + "project" + ], + "type": "object" + }, + "previous": { + "properties": { + "project": { + "properties": { + "id": { + "type": "string" + }, + "staticIps": { + "properties": { + "builds": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "buildRegion": { + "type": "string" + }, + "enabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "regions": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "enabled" + ], + "type": "object" + } + }, + "required": [ + "staticIps" + ], + "type": "object" + } + }, + "required": [ + "project" + ], + "type": "object" + } + }, + "required": [ + "next", + "previous", + "projectId", + "projectName" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "projectId": { + "type": "string" + }, + "projectName": { + "type": "string" + }, + "trustedIps": { + "nullable": true, + "type": "string", + "enum": [ + "all", + "all_except_custom_domains", + "preview", + "prod_deployment_urls_and_all_previews", + "production", + null + ] + }, + "oldTrustedIps": { + "nullable": true, + "type": "string", + "enum": [ + "all", + "all_except_custom_domains", + "preview", + "prod_deployment_urls_and_all_previews", + "production", + null + ] + }, + "addedAddresses": { + "nullable": true, + "items": { + "type": "string" + }, + "type": "array" + }, + "removedAddresses": { + "nullable": true, + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "projectId", + "projectName" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "projectId": { + "type": "string" + }, + "projectName": { + "type": "string" + }, + "enableVercelCiSameRepository": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "addedProjects": { + "items": { + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + } + }, + "required": [ + "id", + "name" + ], + "type": "object" + }, + "type": "array" + }, + "removedProjects": { + "items": { + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + } + }, + "required": [ + "id", + "name" + ], + "type": "object" + }, + "type": "array" + }, + "addedProviders": { + "items": { + "type": "string" + }, + "type": "array" + }, + "removedProviders": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "addedProjects", + "addedProviders", + "projectId", + "projectName", + "removedProjects", + "removedProviders" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "projectId": { + "type": "string" + }, + "projectName": { + "type": "string", + "description": "Display name for Activity links. Optional for events stored before it was published." + }, + "reasonCode": { + "type": "string", + "enum": [ + "BACKOFFICE", + "PUBLIC_API" + ] + } + }, + "required": [ + "projectId" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "projectId": { + "type": "string" + }, + "projectName": { + "type": "string" + }, + "projectWebAnalytics": { + "properties": { + "id": { + "type": "string" + }, + "disabledAt": { + "type": "number" + }, + "canceledAt": { + "type": "number" + }, + "enabledAt": { + "type": "number" + }, + "hasData": { + "type": "boolean", + "enum": [ + true + ] + } + }, + "required": [ + "id" + ], + "type": "object" + }, + "prevProjectWebAnalytics": { + "nullable": true, + "properties": { + "id": { + "type": "string" + }, + "disabledAt": { + "type": "number" + }, + "canceledAt": { + "type": "number" + }, + "enabledAt": { + "type": "number" + }, + "hasData": { + "type": "boolean", + "enum": [ + true + ] + } + }, + "required": [ + "id" + ], + "type": "object" + } + }, + "required": [ + "projectId", + "projectName" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "gitProvider": { + "type": "string" + }, + "gitProviderGroupDescriptor": { + "type": "string" + }, + "gitScope": { + "type": "string" + } + }, + "required": [ + "gitProvider", + "gitProviderGroupDescriptor", + "gitScope" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "connectionId": { + "type": "string" + }, + "connectionType": { + "type": "string" + } + }, + "required": [ + "connectionId", + "connectionType" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "alias": { + "type": "string" + }, + "sandboxName": { + "type": "string" + }, + "sandboxId": { + "type": "string" + }, + "projectId": { + "type": "string" + } + }, + "required": [ + "alias", + "sandboxName" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "driveName": { + "type": "string" + }, + "projectId": { + "type": "string" + }, + "projectName": { + "type": "string" + }, + "region": { + "type": "string" + } + }, + "required": [ + "driveName", + "projectId", + "projectName", + "region" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "projectId": { + "type": "string" + }, + "projectName": { + "type": "string" + }, + "snapshotId": { + "type": "string" + }, + "targetRegions": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "projectId", + "projectName", + "snapshotId", + "targetRegions" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "instances": { + "type": "number" + }, + "url": { + "type": "string" + } + }, + "required": [ + "instances", + "url" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "email": { + "type": "string" + }, + "verified": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "email", + "verified" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "email": { + "type": "string" + }, + "verified": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "actorId": { + "type": "string", + "description": "Okta user id." + }, + "actorType": { + "type": "string", + "enum": [ + "admin" + ] + }, + "actorName": { + "type": "string" + } + }, + "required": [ + "actorId", + "actorType", + "email", + "verified" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "email": { + "type": "string" + } + }, + "required": [ + "email" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "uid": { + "type": "string" + }, + "name": { + "oneOf": [ + { + "type": "string" + }, + { + "properties": { + "name": { + "type": "string" + } + }, + "required": [ + "name" + ], + "type": "object" + } + ] + } + }, + "required": [ + "name", + "uid" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "oldName": { + "type": "string" + }, + "newName": { + "type": "string" + }, + "uid": { + "type": "string" + } + }, + "required": [ + "newName", + "oldName" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "enabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "updatedAt": { + "type": "number" + }, + "firstEnabledAt": { + "type": "number" + }, + "projectId": { + "type": "string" + }, + "projectName": { + "type": "string" + } + }, + "required": [ + "enabled", + "updatedAt" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "bio": { + "type": "string" + } + }, + "required": [ + "bio" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "scalingRules": { + "additionalProperties": { + "properties": { + "min": { + "type": "number" + }, + "max": { + "type": "number" + } + }, + "required": [ + "max", + "min" + ], + "type": "object" + }, + "type": "object" + }, + "min": { + "type": "number" + }, + "max": { + "type": "number" + }, + "url": { + "type": "string" + } + }, + "required": [ + "max", + "min", + "scalingRules", + "url" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "userAgent": { + "type": "string" + }, + "geolocation": { + "nullable": true, + "properties": { + "city": { + "properties": { + "names": { + "properties": { + "en": { + "type": "string" + } + }, + "required": [ + "en" + ], + "type": "object" + } + }, + "required": [ + "names" + ], + "type": "object" + }, + "country": { + "properties": { + "names": { + "properties": { + "en": { + "type": "string" + } + }, + "required": [ + "en" + ], + "type": "object" + } + }, + "required": [ + "names" + ], + "type": "object" + }, + "most_specific_subdivision": { + "properties": { + "names": { + "properties": { + "en": { + "type": "string" + } + }, + "required": [ + "en" + ], + "type": "object" + } + }, + "required": [ + "names" + ], + "type": "object" + }, + "regionName": { + "type": "string" + } + }, + "required": [ + "country" + ], + "type": "object" + }, + "env": { + "type": "string" + }, + "os": { + "type": "string" + }, + "username": { + "type": "string" + }, + "ssoType": { + "type": "string" + }, + "factors": { + "items": { + "oneOf": [ + { + "properties": { + "origin": { + "type": "string", + "enum": [ + "apple", + "bitbucket", + "chatgpt", + "email", + "github", + "gitlab", + "google", + "otp", + "saml" + ] + }, + "username": { + "type": "string" + }, + "teamId": { + "type": "string" + }, + "legacy": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "ssoType": { + "type": "string" + } + }, + "required": [ + "origin" + ], + "type": "object" + } + ] + }, + "maxItems": 1, + "minItems": 1, + "type": "array" + }, + "viaOTP": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "viaGithub": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "viaGitlab": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "viaBitbucket": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "viaGoogle": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "viaApple": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "viaSamlSso": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "viaPasskey": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "email": { + "type": "string" + }, + "bitbucketLogin": { + "type": "string" + }, + "bitbucketEmail": { + "type": "string" + }, + "bitbucketName": { + "type": "string" + }, + "zeitAccount": { + "type": "string" + }, + "zeitAccountType": { + "type": "string" + } + }, + "required": [ + "bitbucketEmail", + "bitbucketLogin", + "bitbucketName", + "email", + "zeitAccount", + "zeitAccountType" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "email": { + "type": "string" + }, + "githubLogin": { + "type": "string" + }, + "zeitAccount": { + "type": "string" + }, + "zeitAccountType": { + "type": "string" + } + }, + "required": [ + "email", + "githubLogin", + "zeitAccount", + "zeitAccountType" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "email": { + "type": "string" + }, + "gitlabLogin": { + "type": "string" + }, + "gitlabEmail": { + "type": "string" + }, + "gitlabName": { + "type": "string" + }, + "zeitAccount": { + "type": "string" + }, + "zeitAccountType": { + "type": "string" + } + }, + "required": [ + "email", + "gitlabEmail", + "gitlabLogin", + "gitlabName", + "zeitAccount", + "zeitAccountType" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "projectId": { + "type": "string" + }, + "projectName": { + "type": "string" + }, + "analyticsId": { + "type": "string" + }, + "sampleRatePercent": { + "nullable": true, + "type": "number" + }, + "spendLimitInDollars": { + "nullable": true, + "type": "number" + }, + "previous": { + "properties": { + "sampleRatePercent": { + "nullable": true, + "type": "number" + }, + "spendLimitInDollars": { + "nullable": true, + "type": "number" + } + }, + "required": [ + "sampleRatePercent", + "spendLimitInDollars" + ], + "type": "object" + } + }, + "required": [ + "previous", + "sampleRatePercent", + "spendLimitInDollars" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "budget": { + "properties": { + "budgetItem": { + "properties": { + "type": { + "type": "string", + "enum": [ + "fixed" + ], + "description": "The budget type" + }, + "fixedBudget": { + "type": "number", + "description": "Budget amount (USD / dollars)" + }, + "previousSpend": { + "items": { + "type": "number" + }, + "type": "array", + "description": "Array of the last 3 months of spend data" + }, + "notifiedAt": { + "items": { + "type": "number" + }, + "type": "array", + "description": "Array of 50, 75, 100 to keep track of notifications sent out" + }, + "webhookId": { + "type": "string", + "description": "Webhook id that corresponds to a webhook in Cosmos webhook collection" + }, + "webhookNotified": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Keep track if the webhook has been called for the month" + }, + "createdAt": { + "type": "number", + "description": "Date time when budget is created" + }, + "updatedAt": { + "type": "number", + "description": "Date time when budget is updated last" + }, + "isActive": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Is the budget currently active for a customer" + }, + "pauseProjects": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Should all projects be paused if budget is exceeded" + }, + "pricingPlan": { + "type": "string", + "enum": [ + "flex", + "legacy", + "platform", + "plus", + "unbundled" + ], + "description": "The acive pricing plan the team is billed with" + }, + "teamId": { + "type": "string", + "description": "Partition key" + }, + "id": { + "type": "string", + "description": "Sort key that needs to be unique per teamId" + } + }, + "required": [ + "createdAt", + "fixedBudget", + "id", + "isActive", + "notifiedAt", + "previousSpend", + "teamId", + "type" + ], + "type": "object", + "description": "Represents a budget for tracking and notifying teams on their spending." + } + }, + "required": [ + "budgetItem" + ], + "type": "object" + } + }, + "required": [ + "budget" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "budget": { + "properties": { + "type": { + "type": "string", + "enum": [ + "fixed" + ], + "description": "The budget type" + }, + "fixedBudget": { + "type": "number", + "description": "Budget amount (USD / dollars)" + }, + "previousSpend": { + "items": { + "type": "number" + }, + "type": "array", + "description": "Array of the last 3 months of spend data" + }, + "notifiedAt": { + "items": { + "type": "number" + }, + "type": "array", + "description": "Array of 50, 75, 100 to keep track of notifications sent out" + }, + "webhookId": { + "type": "string", + "description": "Webhook id that corresponds to a webhook in Cosmos webhook collection" + }, + "webhookNotified": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Keep track if the webhook has been called for the month" + }, + "createdAt": { + "type": "number", + "description": "Date time when budget is created" + }, + "updatedAt": { + "type": "number", + "description": "Date time when budget is updated last" + }, + "isActive": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Is the budget currently active for a customer" + }, + "pauseProjects": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Should all projects be paused if budget is exceeded" + }, + "pricingPlan": { + "type": "string", + "enum": [ + "flex", + "legacy", + "platform", + "plus", + "unbundled" + ], + "description": "The acive pricing plan the team is billed with" + }, + "teamId": { + "type": "string", + "description": "Partition key" + }, + "id": { + "type": "string", + "description": "Sort key that needs to be unique per teamId" + } + }, + "required": [ + "createdAt", + "fixedBudget", + "id", + "isActive", + "notifiedAt", + "previousSpend", + "teamId", + "type" + ], + "type": "object", + "description": "Represents a budget for tracking and notifying teams on their spending." + } + }, + "required": [ + "budget" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "budget": { + "properties": { + "type": { + "type": "string", + "enum": [ + "fixed" + ], + "description": "The budget type" + }, + "fixedBudget": { + "type": "number", + "description": "Budget amount (USD / dollars)" + }, + "previousSpend": { + "items": { + "type": "number" + }, + "type": "array", + "description": "Array of the last 3 months of spend data" + }, + "notifiedAt": { + "items": { + "type": "number" + }, + "type": "array", + "description": "Array of 50, 75, 100 to keep track of notifications sent out" + }, + "webhookId": { + "type": "string", + "description": "Webhook id that corresponds to a webhook in Cosmos webhook collection" + }, + "webhookNotified": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Keep track if the webhook has been called for the month" + }, + "createdAt": { + "type": "number", + "description": "Date time when budget is created" + }, + "updatedAt": { + "type": "number", + "description": "Date time when budget is updated last" + }, + "isActive": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Is the budget currently active for a customer" + }, + "pauseProjects": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Should all projects be paused if budget is exceeded" + }, + "pricingPlan": { + "type": "string", + "enum": [ + "flex", + "legacy", + "platform", + "plus", + "unbundled" + ], + "description": "The acive pricing plan the team is billed with" + }, + "teamId": { + "type": "string", + "description": "Partition key" + }, + "id": { + "type": "string", + "description": "Sort key that needs to be unique per teamId" + } + }, + "required": [ + "createdAt", + "fixedBudget", + "id", + "isActive", + "notifiedAt", + "previousSpend", + "teamId", + "type" + ], + "type": "object", + "description": "Represents a budget for tracking and notifying teams on their spending." + }, + "webhookUrl": { + "type": "string" + } + }, + "required": [ + "budget" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "budget": { + "properties": { + "type": { + "type": "string", + "enum": [ + "fixed" + ], + "description": "The budget type" + }, + "fixedBudget": { + "type": "number", + "description": "Budget amount (USD / dollars)" + }, + "previousSpend": { + "items": { + "type": "number" + }, + "type": "array", + "description": "Array of the last 3 months of spend data" + }, + "notifiedAt": { + "items": { + "type": "number" + }, + "type": "array", + "description": "Array of 50, 75, 100 to keep track of notifications sent out" + }, + "webhookId": { + "type": "string", + "description": "Webhook id that corresponds to a webhook in Cosmos webhook collection" + }, + "webhookNotified": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Keep track if the webhook has been called for the month" + }, + "createdAt": { + "type": "number", + "description": "Date time when budget is created" + }, + "updatedAt": { + "type": "number", + "description": "Date time when budget is updated last" + }, + "isActive": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Is the budget currently active for a customer" + }, + "pauseProjects": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Should all projects be paused if budget is exceeded" + }, + "pricingPlan": { + "type": "string", + "enum": [ + "flex", + "legacy", + "platform", + "plus", + "unbundled" + ], + "description": "The acive pricing plan the team is billed with" + }, + "teamId": { + "type": "string", + "description": "Partition key" + }, + "id": { + "type": "string", + "description": "Sort key that needs to be unique per teamId" + } + }, + "required": [ + "createdAt", + "fixedBudget", + "id", + "isActive", + "notifiedAt", + "previousSpend", + "teamId", + "type" + ], + "type": "object", + "description": "Represents a budget for tracking and notifying teams on their spending." + }, + "prevBudget": { + "properties": { + "type": { + "type": "string", + "enum": [ + "fixed" + ], + "description": "The budget type" + }, + "fixedBudget": { + "type": "number", + "description": "Budget amount (USD / dollars)" + }, + "previousSpend": { + "items": { + "type": "number" + }, + "type": "array", + "description": "Array of the last 3 months of spend data" + }, + "notifiedAt": { + "items": { + "type": "number" + }, + "type": "array", + "description": "Array of 50, 75, 100 to keep track of notifications sent out" + }, + "webhookId": { + "type": "string", + "description": "Webhook id that corresponds to a webhook in Cosmos webhook collection" + }, + "webhookNotified": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Keep track if the webhook has been called for the month" + }, + "createdAt": { + "type": "number", + "description": "Date time when budget is created" + }, + "updatedAt": { + "type": "number", + "description": "Date time when budget is updated last" + }, + "isActive": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Is the budget currently active for a customer" + }, + "pauseProjects": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Should all projects be paused if budget is exceeded" + }, + "pricingPlan": { + "type": "string", + "enum": [ + "flex", + "legacy", + "platform", + "plus", + "unbundled" + ], + "description": "The acive pricing plan the team is billed with" + }, + "teamId": { + "type": "string", + "description": "Partition key" + }, + "id": { + "type": "string", + "description": "Sort key that needs to be unique per teamId" + } + }, + "required": [ + "createdAt", + "fixedBudget", + "id", + "isActive", + "notifiedAt", + "previousSpend", + "teamId", + "type" + ], + "type": "object", + "description": "Represents a budget for tracking and notifying teams on their spending." + }, + "webhookUrl": { + "type": "string" + }, + "prevWebhookUrl": { + "type": "string" + } + }, + "required": [ + "budget" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "webhookUrl": { + "type": "string" + } + }, + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "storeType": { + "type": "string", + "enum": [ + "postgres", + "redis" + ] + } + }, + "required": [ + "storeType" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "transferRequestCode": { + "type": "string" + }, + "store": { + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "blob", + "edge-config", + "integration", + "postgres", + "redis" + ] + } + }, + "required": [ + "id", + "type" + ], + "type": "object" + } + }, + "required": [ + "store", + "transferRequestCode" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "transferRequestCode": { + "type": "string" + }, + "store": { + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "blob", + "edge-config", + "integration", + "postgres", + "redis" + ] + } + }, + "required": [ + "id", + "type" + ], + "type": "object" + }, + "destinationTeamId": { + "type": "string" + }, + "destinationTeamName": { + "type": "string" + } + }, + "required": [ + "destinationTeamId", + "destinationTeamName", + "store", + "transferRequestCode" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "transferRequestCode": { + "type": "string" + }, + "store": { + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "blob", + "edge-config", + "integration", + "postgres", + "redis" + ] + } + }, + "required": [ + "id", + "type" + ], + "type": "object" + }, + "originTeamId": { + "type": "string" + }, + "originTeamName": { + "type": "string" + } + }, + "required": [ + "originTeamId", + "originTeamName", + "store", + "transferRequestCode" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "computeUnitsMax": { + "type": "number" + }, + "computeUnitsMin": { + "type": "number" + }, + "suspendTimeoutSeconds": { + "type": "number" + }, + "type": { + "type": "string", + "enum": [ + "blob", + "edge-config", + "integration", + "postgres", + "redis" + ] + }, + "access": { + "type": "string", + "enum": [ + "private", + "public" + ] + } + }, + "required": [ + "id", + "type" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "store": { + "properties": { + "name": { + "type": "string" + }, + "id": { + "type": "string" + } + }, + "required": [ + "id", + "name" + ], + "type": "object" + }, + "ownerId": { + "type": "string" + } + }, + "required": [ + "store" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "computeUnitsMax": { + "type": "number" + }, + "computeUnitsMin": { + "type": "number" + }, + "suspendTimeoutSeconds": { + "type": "number" + }, + "type": { + "type": "string", + "enum": [ + "blob", + "edge-config", + "integration", + "postgres", + "redis" + ] + }, + "access": { + "type": "string", + "enum": [ + "private", + "public" + ] + }, + "locked": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "id", + "locked", + "type" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "actorId": { + "type": "string" + }, + "actorType": { + "type": "string", + "enum": [ + "admin", + "user" + ] + }, + "reason": { + "type": "string" + }, + "caseNumber": { + "type": "string" + }, + "client": { + "type": "string" + } + }, + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "slug": { + "type": "string" + } + }, + "required": [ + "slug" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "previous": { + "properties": { + "enabled": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether automatic code reviews are enabled" + }, + "scope": { + "type": "string", + "enum": [ + "all", + "private", + "public", + "selected_repos" + ], + "description": "Which repository visibilities get automatic reviews" + }, + "includeDrafts": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether to include draft pull requests in automatic reviews" + }, + "selectedRepos": { + "nullable": true, + "items": { + "type": "string" + }, + "type": "array", + "description": "GitHub repos to scope automatic reviews to. Format: \"owner/repo\" (lowercase). Only used when scope='selected_repos'." + } + }, + "required": [ + "enabled", + "includeDrafts", + "scope" + ], + "type": "object", + "description": "Automatic code review settings" + }, + "next": { + "properties": { + "enabled": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether automatic code reviews are enabled" + }, + "scope": { + "type": "string", + "enum": [ + "all", + "private", + "public", + "selected_repos" + ], + "description": "Which repository visibilities get automatic reviews" + }, + "includeDrafts": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether to include draft pull requests in automatic reviews" + }, + "selectedRepos": { + "nullable": true, + "items": { + "type": "string" + }, + "type": "array", + "description": "GitHub repos to scope automatic reviews to. Format: \"owner/repo\" (lowercase). Only used when scope='selected_repos'." + } + }, + "required": [ + "enabled", + "includeDrafts", + "scope" + ], + "type": "object", + "description": "Automatic code review settings" + } + }, + "required": [ + "next" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "trialCreditsIssuedAt": { + "type": "number" + }, + "expiresAt": { + "type": "string" + }, + "amount": { + "type": "string" + }, + "currency": { + "type": "string" + } + }, + "required": [ + "amount", + "currency", + "expiresAt", + "trialCreditsIssuedAt" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "eventId": { + "type": "string" + }, + "sessionId": { + "type": "string" + }, + "sessionKind": { + "type": "string", + "description": "Currently emitted session kinds: chat, investigation." + }, + "surface": { + "type": "string", + "description": "Currently emitted surfaces: dashboard, internal, slack, automation, github." + }, + "occurredAt": { + "type": "number" + } + }, + "required": [ + "eventId", + "occurredAt", + "sessionId", + "sessionKind", + "surface" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "eventId": { + "type": "string" + }, + "sessionId": { + "type": "string" + }, + "sessionKind": { + "type": "string", + "description": "Currently emitted session kinds: chat, investigation." + }, + "surface": { + "type": "string", + "description": "Currently emitted surfaces: dashboard, internal, slack, automation, github." + }, + "occurredAt": { + "type": "number" + }, + "planId": { + "type": "string" + }, + "requestedScopes": { + "items": { + "type": "string" + }, + "type": "array", + "description": "Scopes requested by the model-authored plan." + }, + "elevatedScopes": { + "items": { + "type": "string" + }, + "type": "array", + "description": "Requested Vercel scopes that are not included in the baseline token." + }, + "mergedScopes": { + "items": { + "type": "string" + }, + "type": "array", + "description": "Baseline plus elevated Vercel scopes used when minting scoped tokens." + }, + "githubScopes": { + "items": { + "type": "string" + }, + "type": "array", + "description": "External GitHub scopes requested by the plan; these are not Vercel token scopes." + }, + "requestedScopeCount": { + "type": "number" + }, + "elevatedScopeCount": { + "type": "number" + }, + "mergedScopeCount": { + "type": "number" + }, + "githubScopeCount": { + "type": "number" + } + }, + "required": [ + "elevatedScopeCount", + "elevatedScopes", + "eventId", + "githubScopeCount", + "githubScopes", + "mergedScopeCount", + "mergedScopes", + "occurredAt", + "planId", + "requestedScopeCount", + "requestedScopes", + "sessionId", + "sessionKind", + "surface" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "previous": { + "nullable": true, + "type": "string", + "enum": [ + "auto-approval", + "block", + "manual-approval", + null + ] + }, + "next": { + "nullable": true, + "type": "string", + "enum": [ + "auto-approval", + "block", + "manual-approval", + null + ] + }, + "teamSlug": { + "type": "string" + } + }, + "required": [ + "next", + "previous" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "previous": { + "type": "string", + "enum": [ + "basic", + "elastic", + "enhanced", + "standard", + "turbo" + ] + }, + "next": { + "type": "string", + "enum": [ + "basic", + "elastic", + "enhanced", + "standard", + "turbo" + ] + }, + "isSystemInitiated": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "reason": { + "type": "string", + "enum": [ + "basic-floor", + "build-timeout-failure", + "enospc-failure", + "enterprise-floor", + "high-peak-disk", + "high-peak-memory", + "long-build-duration", + "oom-failure", + "plan-change", + "project-transfer", + "short-build-duration", + "sustained-high-cpu" + ] + } + }, + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "slug": { + "type": "string" + }, + "teamId": { + "type": "string" + }, + "by": { + "type": "string" + }, + "byUid": { + "type": "string" + }, + "reasons": { + "items": { + "properties": { + "slug": { + "type": "string" + }, + "description": { + "type": "string" + } + }, + "required": [ + "description", + "slug" + ], + "type": "object" + }, + "type": "array" + }, + "removedUsers": { + "additionalProperties": { + "properties": { + "role": { + "type": "string", + "enum": [ + "BILLING", + "CONTRIBUTOR", + "DEVELOPER", + "MEMBER", + "OWNER", + "SECURITY", + "VIEWER", + "VIEWER_FOR_PLUS" + ] + }, + "confirmed": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "confirmedAt": { + "type": "number" + } + }, + "required": [ + "confirmed", + "role" + ], + "type": "object" + }, + "type": "object" + }, + "removedMemberCount": { + "type": "number" + }, + "timestamp": { + "type": "number" + } + }, + "required": [ + "by", + "slug", + "teamId" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "previous": { + "nullable": true, + "type": "object" + }, + "next": { + "nullable": true, + "type": "object" + } + }, + "required": [ + "next", + "previous" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "enabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "domain": { + "type": "string" + } + }, + "required": [ + "enabled" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "projectId": { + "type": "string" + }, + "projectName": { + "type": "string" + }, + "enabled": { + "nullable": true, + "type": "boolean", + "enum": [ + false, + true, + null + ] + }, + "environment": { + "type": "string", + "enum": [ + "preview", + "production" + ] + } + }, + "required": [ + "enabled", + "environment", + "projectId", + "projectName" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "environment": { + "type": "string", + "enum": [ + "preview", + "production" + ] + }, + "enabled": { + "type": "string", + "enum": [ + "default", + "default-force", + "off", + "off-force", + "on", + "on-force" + ] + } + }, + "required": [ + "enabled", + "environment" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "emailDomain": { + "nullable": true, + "type": "string" + } + }, + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "deletedCount": { + "type": "number" + }, + "inviteIds": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "deletedCount", + "inviteIds" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "directoryType": { + "type": "string" + }, + "ssoType": { + "type": "string" + }, + "invitedUser": { + "properties": { + "username": { + "type": "string" + }, + "email": { + "type": "string" + } + }, + "required": [ + "email", + "username" + ], + "type": "object" + }, + "invitedEmail": { + "type": "string" + }, + "invitationRole": { + "type": "string" + }, + "entitlements": { + "items": { + "type": "string" + }, + "type": "array" + }, + "invitedUid": { + "type": "string" + }, + "origin": { + "type": "string" + }, + "teamSlug": { + "type": "string" + } + }, + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "teamName": { + "type": "string" + }, + "username": { + "type": "string" + }, + "gitUsername": { + "type": "string" + }, + "githubUsername": { + "nullable": true, + "type": "string" + }, + "gitlabUsername": { + "nullable": true, + "type": "string" + }, + "bitbucketUsername": { + "nullable": true, + "type": "string" + }, + "updatedUid": { + "type": "string" + }, + "teamId": { + "type": "string" + } + }, + "required": [ + "teamName" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "teamName": { + "type": "string" + }, + "username": { + "type": "string" + }, + "gitUsername": { + "nullable": true, + "type": "string" + }, + "githubUsername": { + "nullable": true, + "type": "string" + }, + "gitlabUsername": { + "nullable": true, + "type": "string" + }, + "bitbucketUsername": { + "nullable": true, + "type": "string" + } + }, + "required": [ + "teamName" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "deletedUser": { + "properties": { + "username": { + "type": "string" + }, + "email": { + "type": "string" + } + }, + "required": [ + "email", + "username" + ], + "type": "object" + }, + "deletedUid": { + "type": "string" + }, + "githubUsername": { + "nullable": true, + "type": "string" + }, + "gitlabUsername": { + "nullable": true, + "type": "string" + }, + "bitbucketUsername": { + "nullable": true, + "type": "string" + }, + "directoryType": { + "type": "string" + }, + "role": { + "type": "string", + "enum": [ + "BILLING", + "CONTRIBUTOR", + "DEVELOPER", + "MEMBER", + "OWNER", + "SECURITY", + "VIEWER", + "VIEWER_FOR_PLUS" + ] + }, + "reason": { + "type": "string", + "description": "Why the member was removed. When removed due to a plan downgrade, this is a {@link DowngradeReason} from `@api/pubsub-types` (e.g. `trial_expired`, `user_downgrade`)." + }, + "previousPlan": { + "type": "string", + "enum": [ + "enterprise", + "hobby", + "pro" + ] + }, + "newPlan": { + "type": "string", + "enum": [ + "enterprise", + "hobby", + "pro" + ] + }, + "automated": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether the removal was system-initiated rather than human-initiated." + } + }, + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "entitlement": { + "type": "string" + }, + "user": { + "properties": { + "id": { + "type": "string" + }, + "username": { + "type": "string" + } + }, + "required": [ + "id", + "username" + ], + "type": "object" + } + }, + "required": [ + "entitlement", + "user" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "entitlement": { + "type": "string" + }, + "user": { + "properties": { + "id": { + "type": "string" + }, + "username": { + "type": "string" + } + }, + "required": [ + "id", + "username" + ], + "type": "object" + }, + "previousCanceledAt": { + "type": "string" + } + }, + "required": [ + "entitlement", + "user" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "role": { + "type": "string" + }, + "uid": { + "type": "string" + }, + "updatedUid": { + "type": "string" + }, + "updatedUser": { + "properties": { + "username": { + "type": "string" + }, + "email": { + "type": "string" + } + }, + "required": [ + "email", + "username" + ], + "type": "object" + }, + "origin": { + "type": "string" + }, + "teamSlug": { + "type": "string" + }, + "teamRoles": { + "items": { + "type": "string" + }, + "type": "array" + }, + "teamPermissions": { + "items": { + "type": "string" + }, + "type": "array" + }, + "entitlements": { + "items": { + "type": "string" + }, + "type": "array" + }, + "invitedBy": { + "properties": { + "email": { + "type": "string" + }, + "userId": { + "type": "string" + }, + "name": { + "type": "string" + } + }, + "required": [ + "email" + ], + "type": "object" + } + }, + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "requestedTeamName": { + "type": "string" + }, + "requestedTeamSlug": { + "type": "string" + }, + "requestedUserName": { + "type": "string" + }, + "gitUsername": { + "type": "string" + }, + "githubUsername": { + "type": "string" + }, + "gitlabUsername": { + "type": "string" + }, + "bitbucketUsername": { + "type": "string" + }, + "source": { + "type": "string", + "enum": [ + "account-update", + "bitbucket", + "dsync", + "feedback", + "github", + "gitlab", + "import", + "link", + "mail", + "nsnb-auto-approve", + "nsnb-hobby-upgrade", + "nsnb-invite", + "nsnb-redeploy", + "nsnb-redeploy-attribution-card", + "nsnb-request-access", + "nsnb-viewer-upgrade", + "organization-teams", + "saml", + "teams" + ] + } + }, + "required": [ + "requestedTeamName" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "directoryType": { + "type": "string" + }, + "ssoType": { + "type": "string" + }, + "updatedUser": { + "properties": { + "username": { + "type": "string" + }, + "email": { + "type": "string" + } + }, + "required": [ + "email", + "username" + ], + "type": "object" + }, + "role": { + "type": "string" + }, + "previousRole": { + "type": "string" + }, + "previousTeamRoles": { + "items": { + "type": "string", + "enum": [ + "BILLING", + "CONTRIBUTOR", + "DEVELOPER", + "MEMBER", + "OWNER", + "SECURITY", + "VIEWER", + "VIEWER_FOR_PLUS" + ] + }, + "type": "array" + }, + "teamRoles": { + "items": { + "type": "string", + "enum": [ + "BILLING", + "CONTRIBUTOR", + "DEVELOPER", + "MEMBER", + "OWNER", + "SECURITY", + "VIEWER", + "VIEWER_FOR_PLUS" + ] + }, + "type": "array" + }, + "previousTeamPermissions": { + "items": { + "type": "string", + "enum": [ + "AiGatewayApiKeyOwnedBySelf", + "AiGatewayBudgetManager", + "AiGatewayCredits", + "AiGatewaySettings", + "AiGatewayTranscriptsManager", + "AiGatewayTranscriptsViewer", + "ConnectorManager", + "CreateProject", + "EnvVariableManager", + "EnvironmentManager", + "FullProductionDeployment", + "IntegrationManager", + "OrgAdmin", + "OrgViewer", + "UsageViewer", + "V0Builder", + "V0Chatter", + "V0Viewer", + "WorkflowDecryptor" + ] + }, + "type": "array" + }, + "teamPermissions": { + "items": { + "type": "string", + "enum": [ + "AiGatewayApiKeyOwnedBySelf", + "AiGatewayBudgetManager", + "AiGatewayCredits", + "AiGatewaySettings", + "AiGatewayTranscriptsManager", + "AiGatewayTranscriptsViewer", + "ConnectorManager", + "CreateProject", + "EnvVariableManager", + "EnvironmentManager", + "FullProductionDeployment", + "IntegrationManager", + "OrgAdmin", + "OrgViewer", + "UsageViewer", + "V0Builder", + "V0Chatter", + "V0Viewer", + "WorkflowDecryptor" + ] + }, + "type": "array" + }, + "updatedUid": { + "type": "string" + }, + "origin": { + "type": "string" + }, + "teamSlug": { + "type": "string" + } + }, + "required": [ + "previousRole" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "email": { + "type": "string" + }, + "authorized": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "reason": { + "type": "string" + } + }, + "required": [ + "authorized" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "enforced": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "enforced" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "publicId": { + "type": "string" + }, + "role": { + "type": "string" + }, + "maxUses": { + "type": "number" + }, + "expiresAt": { + "type": "string" + }, + "name": { + "type": "string" + } + }, + "required": [ + "expiresAt", + "maxUses", + "publicId", + "role" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "publicId": { + "type": "string" + }, + "name": { + "type": "string" + } + }, + "required": [ + "publicId" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "previousConcurrentBuilds": { + "type": "number" + }, + "nextConcurrentBuilds": { + "type": "number" + } + }, + "required": [ + "nextConcurrentBuilds", + "previousConcurrentBuilds" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "plan": { + "type": "string", + "enum": [ + "enterprise", + "hobby", + "pro" + ] + }, + "trial": { + "nullable": true, + "properties": { + "start": { + "type": "number" + }, + "end": { + "type": "number" + } + }, + "required": [ + "end", + "start" + ], + "type": "object" + } + }, + "required": [ + "plan" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "invoiceId": { + "type": "string" + }, + "convertedFromTrial": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "plan": { + "type": "string", + "enum": [ + "enterprise", + "hobby", + "pro" + ] + } + }, + "required": [ + "convertedFromTrial", + "invoiceId", + "plan" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "inviteCode": { + "type": "string" + } + }, + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "name": { + "type": "string" + } + }, + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "name": { + "type": "string" + }, + "actorId": { + "type": "string", + "description": "Okta user id." + }, + "actorType": { + "type": "string", + "enum": [ + "admin" + ] + }, + "actorName": { + "type": "string" + } + }, + "type": "object", + "description": "The payload of the event, if requested.", + "required": [ + "actorId", + "actorType" + ] + }, + { + "properties": { + "decision": { + "type": "string", + "enum": [ + "keep_on", + "turn_off" + ] + }, + "version": { + "type": "string" + } + }, + "required": [ + "decision", + "version" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "consent": { + "type": "string", + "enum": [ + "granted", + "refused" + ] + } + }, + "required": [ + "consent" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "remoteCaching": { + "properties": { + "enabled": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "type": "object", + "description": "Represents configuration for remote caching" + } + }, + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "deletedCount": { + "type": "number" + } + }, + "required": [ + "deletedCount" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "enabled": { + "type": "string", + "enum": [ + "default", + "off", + "on" + ] + } + }, + "required": [ + "enabled" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "enabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "scope": { + "type": "string", + "enum": [ + "dashboard", + "log-drains" + ] + } + }, + "required": [ + "enabled", + "scope" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "previous": { + "additionalProperties": { + "oneOf": [ + { + "properties": { + "accessGroupId": { + "type": "string" + } + }, + "required": [ + "accessGroupId" + ], + "type": "object" + }, + { + "type": "string", + "enum": [ + "BILLING", + "CONTRIBUTOR", + "DEVELOPER", + "MEMBER", + "OWNER", + "SECURITY", + "VIEWER", + "VIEWER_FOR_PLUS" + ] + } + ] + }, + "type": "object" + }, + "next": { + "additionalProperties": { + "oneOf": [ + { + "properties": { + "accessGroupId": { + "type": "string" + } + }, + "required": [ + "accessGroupId" + ], + "type": "object" + }, + { + "type": "string", + "enum": [ + "BILLING", + "CONTRIBUTOR", + "DEVELOPER", + "MEMBER", + "OWNER", + "SECURITY", + "VIEWER", + "VIEWER_FOR_PLUS" + ] + } + ] + }, + "type": "object" + } + }, + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "domain": { + "type": "string" + }, + "ips": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "domain", + "ips" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "tokenTypes": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "tokenTypes" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "exportId": { + "type": "string" + }, + "from": { + "type": "number" + }, + "to": { + "type": "number" + }, + "format": { + "type": "string" + } + }, + "required": [ + "exportId", + "format", + "from", + "to" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "fileId": { + "type": "string" + } + }, + "required": [ + "fileId" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "slug": { + "type": "string" + } + }, + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "slug": { + "type": "string" + }, + "actorId": { + "type": "string", + "description": "Okta user id." + }, + "actorType": { + "type": "string", + "enum": [ + "admin" + ] + }, + "actorName": { + "type": "string" + } + }, + "type": "object", + "description": "The payload of the event, if requested.", + "required": [ + "actorId", + "actorType" + ] + }, + { + "properties": { + "projectId": { + "type": "string" + }, + "projectName": { + "type": "string" + }, + "sampling": { + "items": { + "properties": { + "type": { + "type": "string", + "enum": [ + "head_sampling" + ] + }, + "rate": { + "type": "number" + }, + "env": { + "type": "string", + "enum": [ + "preview", + "production" + ] + }, + "requestPath": { + "type": "string" + } + }, + "required": [ + "rate", + "type" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "projectId", + "projectName" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "reason": { + "type": "string", + "enum": [ + "limits-exceeded" + ] + } + }, + "required": [ + "reason" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "teamName": { + "type": "string" + } + }, + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "totp": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "recoveryCodes": { + "type": "number" + }, + "actorId": { + "type": "string" + }, + "actorType": { + "type": "string", + "enum": [ + "admin", + "user" + ] + }, + "actorName": { + "type": "string", + "description": "Human-readable admin who performed the removal." + }, + "reason": { + "type": "string" + } + }, + "required": [ + "recoveryCodes", + "totp" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "deletedAt": { + "nullable": true, + "type": "number" + }, + "username": { + "type": "string" + } + }, + "required": [ + "username" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "deletedAt": { + "nullable": true, + "type": "number" + }, + "username": { + "type": "string" + }, + "actorId": { + "type": "string", + "description": "Okta user id." + }, + "actorType": { + "type": "string", + "enum": [ + "admin" + ] + }, + "actorName": { + "type": "string" + } + }, + "required": [ + "actorId", + "actorType", + "username" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "username": { + "type": "string" + } + }, + "required": [ + "username" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "teamName": { + "type": "string" + } + }, + "required": [ + "teamName" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "teamId": { + "type": "string" + }, + "teamName": { + "type": "string" + } + }, + "required": [ + "teamId", + "teamName" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "actorId": { + "type": "string" + }, + "actorType": { + "type": "string", + "enum": [ + "admin" + ] + }, + "reason": { + "type": "string" + } + }, + "required": [ + "actorId", + "actorType" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "actorId": { + "type": "string" + }, + "actorType": { + "type": "string", + "enum": [ + "admin" + ] + } + }, + "required": [ + "actorId", + "actorType" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "enabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "actorId": { + "type": "string" + }, + "actorType": { + "type": "string", + "enum": [ + "admin" + ] + } + }, + "required": [ + "actorId", + "actorType", + "enabled" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "autoBlockPrevented": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "preventUntil": { + "type": "number" + }, + "actorId": { + "type": "string" + }, + "actorType": { + "type": "string", + "enum": [ + "admin" + ] + }, + "reason": { + "type": "string" + } + }, + "required": [ + "actorId", + "actorType", + "autoBlockPrevented" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "method": { + "type": "string", + "enum": [ + "email-otp", + "recovery-code", + "totp", + "webauthn" + ] + }, + "reason": { + "type": "string" + }, + "flowId": { + "type": "string" + }, + "loginSessionId": { + "type": "string" + } + }, + "required": [ + "method", + "reason" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "allowedMethods": { + "items": { + "type": "string", + "enum": [ + "recovery-code", + "totp", + "webauthn" + ] + }, + "type": "array" + }, + "firstFactor": { + "type": "string" + }, + "flowId": { + "type": "string" + }, + "loginSessionId": { + "type": "string" + } + }, + "required": [ + "allowedMethods", + "firstFactor", + "flowId" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "action": { + "type": "string", + "enum": [ + "add-passkey", + "add-totp", + "admin-remove", + "disable", + "enable", + "regenerate-recovery-codes", + "remove-passkey" + ] + }, + "reason": { + "type": "string" + } + }, + "required": [ + "action", + "reason" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "previous": { + "properties": { + "enabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "totpVerified": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "enabled", + "totpVerified" + ], + "type": "object" + }, + "next": { + "properties": { + "enabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "totpVerified": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "enabled", + "totpVerified" + ], + "type": "object" + }, + "method": { + "type": "string", + "enum": [ + "passkey", + "self_serve_recovery", + "totp", + "user_disabled" + ] + } + }, + "required": [ + "next", + "previous" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "remaining": { + "type": "number" + }, + "context": { + "type": "string", + "enum": [ + "login", + "sudo" + ], + "description": "Absent on events predating the field; those were all logins." + } + }, + "required": [ + "remaining" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "mfaEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "mfaEnabled" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "mfa": { + "properties": { + "enabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "totpVerified": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "enabled", + "totpVerified" + ], + "type": "object" + } + }, + "required": [ + "mfa" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "enabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "totpVerified": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "enabled", + "totpVerified" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "previous": { + "properties": { + "enabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "totpVerified": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "enabled", + "totpVerified" + ], + "type": "object" + }, + "next": { + "properties": { + "enabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "totpVerified": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "enabled", + "totpVerified" + ], + "type": "object" + } + }, + "required": [ + "next", + "previous" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "provider": { + "type": "string", + "enum": [ + "google" + ] + }, + "providerSubjectId": { + "type": "string" + }, + "outcome": { + "type": "string", + "enum": [ + "account-matched", + "linking-required" + ] + }, + "decision": { + "properties": { + "authoritative": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "basis": { + "type": "string", + "enum": [ + "gmail", + "none", + "workspace-mx" + ] + }, + "emailDomain": { + "type": "string" + }, + "emailVerified": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "hostedDomainMatch": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "mxOutcome": { + "type": "string", + "enum": [ + "google", + "lookup-error", + "non-google", + "not-checked" + ] + } + }, + "required": [ + "authoritative", + "basis", + "emailDomain", + "emailVerified", + "hostedDomainMatch", + "mxOutcome" + ], + "type": "object" + } + }, + "required": [ + "decision", + "outcome", + "provider", + "providerSubjectId" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "email": { + "type": "string" + }, + "prevEmail": { + "type": "string" + } + }, + "required": [ + "email", + "prevEmail" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "email": { + "type": "string" + }, + "prevEmail": { + "type": "string" + }, + "actorId": { + "type": "string", + "description": "Okta user id." + }, + "actorType": { + "type": "string", + "enum": [ + "admin" + ] + }, + "actorName": { + "type": "string" + } + }, + "required": [ + "actorId", + "actorType", + "email", + "prevEmail" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "username": { + "type": "string" + }, + "actorId": { + "type": "string", + "description": "Okta user id." + }, + "actorType": { + "type": "string", + "enum": [ + "admin" + ] + }, + "actorName": { + "type": "string" + } + }, + "required": [ + "actorId", + "actorType", + "username" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "projectId": { + "type": "string" + }, + "projectName": { + "type": "string" + }, + "repositoryName": { + "type": "string" + } + }, + "required": [ + "projectId", + "projectName", + "repositoryName" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "projectId": { + "type": "string" + }, + "projectName": { + "type": "string" + }, + "repositoryName": { + "type": "string" + }, + "reference": { + "type": "string" + }, + "digest": { + "type": "string" + } + }, + "required": [ + "digest", + "projectId", + "projectName", + "reference", + "repositoryName" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "projectId": { + "type": "string" + }, + "projectName": { + "type": "string" + }, + "repositoryName": { + "type": "string" + }, + "reference": { + "type": "string" + } + }, + "required": [ + "projectId", + "projectName", + "reference", + "repositoryName" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "projectId": { + "type": "string" + }, + "projectName": { + "type": "string" + }, + "repositoryName": { + "type": "string" + }, + "sharedWithTeamId": { + "type": "string" + }, + "sharedWithTeamSlug": { + "type": "string" + } + }, + "required": [ + "projectId", + "projectName", + "repositoryName", + "sharedWithTeamId", + "sharedWithTeamSlug" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "projectId": { + "type": "string" + }, + "projectName": { + "type": "string" + }, + "repositoryName": { + "type": "string" + }, + "sharedWithTeamId": { + "type": "string" + } + }, + "required": [ + "projectId", + "projectName", + "repositoryName", + "sharedWithTeamId" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "projectId": { + "type": "string" + }, + "projectName": { + "type": "string" + }, + "repositoryName": { + "type": "string" + }, + "public": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "projectId", + "projectName", + "public", + "repositoryName" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "projectId": { + "type": "string" + }, + "projectName": { + "type": "string" + }, + "repositoryName": { + "type": "string" + }, + "removedTeamIds": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "projectId", + "projectName", + "removedTeamIds", + "repositoryName" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "ruleName": { + "type": "string" + } + }, + "required": [ + "ruleName" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "previousProjectCount": { + "nullable": true, + "type": "number" + }, + "nextProjectCount": { + "nullable": true, + "type": "number" + } + }, + "required": [ + "nextProjectCount", + "previousProjectCount" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "customAlertTitle": { + "type": "string" + } + }, + "required": [ + "customAlertTitle" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "vulnerabilities": { + "items": { + "type": "string" + }, + "type": "array" + }, + "protectionEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "protectedProjectCount": { + "type": "number" + } + }, + "required": [ + "protectedProjectCount", + "protectionEnabled", + "vulnerabilities" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "team": { + "properties": { + "name": { + "type": "string" + }, + "id": { + "type": "string" + } + }, + "required": [ + "id", + "name" + ], + "type": "object" + }, + "configuration": { + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + } + }, + "required": [ + "id" + ], + "type": "object" + }, + "peering": { + "properties": { + "id": { + "type": "string" + }, + "accountId": { + "type": "string" + }, + "region": { + "type": "string" + }, + "vpcId": { + "type": "string" + } + }, + "required": [ + "accountId", + "id", + "region", + "vpcId" + ], + "type": "object" + } + }, + "required": [ + "configuration", + "peering", + "team" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "team": { + "properties": { + "name": { + "type": "string" + }, + "id": { + "type": "string" + } + }, + "required": [ + "id", + "name" + ], + "type": "object" + }, + "configuration": { + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + } + }, + "required": [ + "id" + ], + "type": "object" + }, + "peering": { + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + } + }, + "required": [ + "id" + ], + "type": "object" + } + }, + "required": [ + "configuration", + "peering", + "team" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "team": { + "properties": { + "name": { + "type": "string" + }, + "id": { + "type": "string" + } + }, + "required": [ + "id", + "name" + ], + "type": "object" + }, + "configuration": { + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + } + }, + "required": [ + "id" + ], + "type": "object" + }, + "peering": { + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + } + }, + "required": [ + "id" + ], + "type": "object" + }, + "newName": { + "type": "string" + } + }, + "required": [ + "configuration", + "peering", + "team" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "tier": { + "type": "string", + "enum": [ + "plus", + "pro" + ] + } + }, + "required": [ + "tier" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "id": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "id", + "url" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "chatId": { + "type": "string" + }, + "chatTitle": { + "type": "string" + } + }, + "required": [ + "chatId" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "model": { + "type": "string" + }, + "useCase": { + "type": "string" + }, + "chatId": { + "type": "string" + }, + "messageId": { + "type": "string" + }, + "inputTokens": { + "type": "number" + }, + "outputTokens": { + "type": "number" + }, + "timestamp": { + "type": "number" + }, + "events": { + "items": { + "properties": { + "eventId": { + "type": "string" + }, + "modelId": { + "type": "string" + }, + "inputTokens": { + "type": "number" + }, + "outputTokens": { + "type": "number" + }, + "totalTokens": { + "type": "number" + }, + "cacheCreationInputTokens": { + "type": "number" + }, + "cacheReadInputTokens": { + "type": "number" + }, + "timestamp": { + "type": "string" + } + }, + "required": [ + "cacheCreationInputTokens", + "cacheReadInputTokens", + "eventId", + "inputTokens", + "modelId", + "outputTokens", + "timestamp", + "totalTokens" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "chatId", + "events", + "inputTokens", + "messageId", + "model", + "outputTokens", + "timestamp", + "useCase" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "chatId": { + "type": "string" + }, + "chatTitle": { + "type": "string" + }, + "messageId": { + "type": "string" + } + }, + "required": [ + "chatId", + "messageId" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "deploymentId": { + "type": "string" + }, + "projectId": { + "type": "string" + }, + "projectName": { + "type": "string" + }, + "runId": { + "type": "string" + } + }, + "required": [ + "deploymentId", + "projectId", + "runId" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "grantType": { + "type": "string", + "enum": [ + "authorization_code", + "urn:ietf:params:oauth:grant-type:device_code", + "urn:ietf:params:oauth:grant-type:token-exchange" + ] + }, + "appName": { + "type": "string", + "description": "the app's name at the time the event was published (it could have changed since then)" + }, + "atTTL": { + "type": "number", + "description": "access_token TTL" + }, + "rtTTL": { + "type": "number", + "description": "refresh_token TTL" + }, + "scope": { + "type": "string" + }, + "authMethod": { + "type": "string", + "enum": [ + "app", + "apple", + "bitbucket", + "chatgpt", + "email", + "emu", + "github", + "github-webhook", + "gitlab", + "google", + "invite", + "manual", + "otp", + "passkey", + "saml", + "sms", + "token-exchange-oidc" + ] + }, + "app": { + "properties": { + "clientId": { + "type": "string" + }, + "name": { + "type": "string", + "description": "the app's name at the time the event was published (it could have changed since then)" + }, + "clientAuthenticationUsed": { + "properties": { + "method": { + "type": "string", + "enum": [ + "client_secret_basic", + "client_secret_jwt", + "client_secret_post", + "none", + "oidc_token", + "private_key_jwt" + ] + }, + "secretId": { + "type": "string" + } + }, + "required": [ + "method" + ], + "type": "object" + } + }, + "required": [ + "clientAuthenticationUsed", + "clientId", + "name" + ], + "type": "object", + "description": "optional since entries prior to 2025-10-13 do not contain app information" + }, + "includesRefreshToken": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "optional since entries prior to 2025-10-13 do not contain this field" + }, + "publicId": { + "type": "string", + "description": "optional since entries prior to 2025-10-13 do not contain this field" + }, + "tokenPrefix": { + "type": "string", + "enum": [ + "vca_" + ], + "description": "optional since entries prior to 2026-04-23 do not contain this field" + }, + "tokenSuffix": { + "type": "string", + "description": "optional since entries prior to 2026-04-23 do not contain this field" + }, + "refreshTokenPublicId": { + "type": "string", + "description": "optional; only present when a refresh token was issued (offline_access)." + }, + "refreshTokenPrefix": { + "type": "string", + "enum": [ + "vcr_" + ], + "description": "optional; only present when a refresh token was issued (offline_access)." + }, + "refreshTokenSuffix": { + "type": "string", + "description": "optional; only present when a refresh token was issued (offline_access)." + }, + "sessionId": { + "type": "string", + "description": "optional since entries prior to 2025-10-13 do not contain this field" + }, + "ip": { + "nullable": true, + "type": "string", + "description": "optional since entries prior to 2026-04-23 do not contain this field" + }, + "geolocation": { + "nullable": true, + "properties": { + "city": { + "properties": { + "names": { + "properties": { + "en": { + "type": "string" + } + }, + "required": [ + "en" + ], + "type": "object" + } + }, + "required": [ + "names" + ], + "type": "object" + }, + "country": { + "properties": { + "names": { + "properties": { + "en": { + "type": "string" + } + }, + "required": [ + "en" + ], + "type": "object" + } + }, + "required": [ + "names" + ], + "type": "object" + }, + "most_specific_subdivision": { + "properties": { + "names": { + "properties": { + "en": { + "type": "string" + } + }, + "required": [ + "en" + ], + "type": "object" + } + }, + "required": [ + "names" + ], + "type": "object" + }, + "regionName": { + "type": "string" + } + }, + "required": [ + "country" + ], + "type": "object", + "description": "optional since entries prior to 2026-04-23 do not contain this field" + }, + "userAgent": { + "type": "string", + "description": "optional since entries prior to 2026-04-23 do not contain this field" + }, + "issuerUrl": { + "type": "string", + "description": "OIDC issuer (`iss`) of the token that authenticated the request. Present for OIDC-authenticated flows: the token-exchange grant, or `client_credentials` with the `oidc_token` client-authentication method." + }, + "policyId": { + "type": "string", + "description": "ID of the OIDC-exchange policy that authorized a token-exchange grant. Absent for the `client_credentials` + `oidc_token` flow, which matches an app `oidcProviders` entry rather than a policy." + }, + "oidcSubject": { + "type": "string", + "description": "`sub` claim of the OIDC token. Present for OIDC-authenticated flows (see {@link issuerUrl})." + } + }, + "required": [ + "appName", + "atTTL", + "authMethod", + "grantType", + "scope" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "policy": { + "properties": { + "policyId": { + "type": "string" + }, + "clientId": { + "type": "string" + }, + "issuerUrl": { + "type": "string" + }, + "teamId": { + "type": "string" + }, + "name": { + "nullable": true, + "type": "string", + "description": "Human-readable policy name, or `null` when unnamed." + }, + "claims": { + "items": { + "properties": { + "name": { + "type": "string" + }, + "values": { + "items": { + "properties": { + "value": { + "type": "string" + }, + "wildcards": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "value", + "wildcards" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "name", + "values" + ], + "type": "object", + "description": "Claim matchers an OIDC token must satisfy to use the policy." + }, + "type": "array", + "description": "Claim matchers an OIDC token must satisfy to use the policy." + }, + "permissions": { + "items": { + "type": "string" + }, + "type": "array", + "description": "Permission boundary (`['*']` = the app's full declared permissions)." + }, + "resources": { + "nullable": true, + "properties": { + "projectIds": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "projectIds" + ], + "type": "object", + "description": "Resource boundary, or `null` when the policy has none." + }, + "createdAt": { + "type": "number", + "description": "Creation time (epoch ms)." + }, + "updatedAt": { + "type": "number", + "description": "Last-update time (epoch ms)." + } + }, + "required": [ + "claims", + "clientId", + "createdAt", + "issuerUrl", + "name", + "permissions", + "policyId", + "resources", + "teamId", + "updatedAt" + ], + "type": "object", + "description": "A full point-in-time snapshot of an OIDC exchange policy, captured on every lifecycle event so the audit trail records exactly what the policy looked like. Mirrors the management endpoints' public response shape." + }, + "appName": { + "type": "string" + } + }, + "required": [ + "policy" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "before": { + "properties": { + "policyId": { + "type": "string" + }, + "clientId": { + "type": "string" + }, + "issuerUrl": { + "type": "string" + }, + "teamId": { + "type": "string" + }, + "name": { + "nullable": true, + "type": "string", + "description": "Human-readable policy name, or `null` when unnamed." + }, + "claims": { + "items": { + "properties": { + "name": { + "type": "string" + }, + "values": { + "items": { + "properties": { + "value": { + "type": "string" + }, + "wildcards": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "value", + "wildcards" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "name", + "values" + ], + "type": "object", + "description": "Claim matchers an OIDC token must satisfy to use the policy." + }, + "type": "array", + "description": "Claim matchers an OIDC token must satisfy to use the policy." + }, + "permissions": { + "items": { + "type": "string" + }, + "type": "array", + "description": "Permission boundary (`['*']` = the app's full declared permissions)." + }, + "resources": { + "nullable": true, + "properties": { + "projectIds": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "projectIds" + ], + "type": "object", + "description": "Resource boundary, or `null` when the policy has none." + }, + "createdAt": { + "type": "number", + "description": "Creation time (epoch ms)." + }, + "updatedAt": { + "type": "number", + "description": "Last-update time (epoch ms)." + } + }, + "required": [ + "claims", + "clientId", + "createdAt", + "issuerUrl", + "name", + "permissions", + "policyId", + "resources", + "teamId", + "updatedAt" + ], + "type": "object", + "description": "A full point-in-time snapshot of an OIDC exchange policy, captured on every lifecycle event so the audit trail records exactly what the policy looked like. Mirrors the management endpoints' public response shape." + }, + "after": { + "properties": { + "policyId": { + "type": "string" + }, + "clientId": { + "type": "string" + }, + "issuerUrl": { + "type": "string" + }, + "teamId": { + "type": "string" + }, + "name": { + "nullable": true, + "type": "string", + "description": "Human-readable policy name, or `null` when unnamed." + }, + "claims": { + "items": { + "properties": { + "name": { + "type": "string" + }, + "values": { + "items": { + "properties": { + "value": { + "type": "string" + }, + "wildcards": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "value", + "wildcards" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "name", + "values" + ], + "type": "object", + "description": "Claim matchers an OIDC token must satisfy to use the policy." + }, + "type": "array", + "description": "Claim matchers an OIDC token must satisfy to use the policy." + }, + "permissions": { + "items": { + "type": "string" + }, + "type": "array", + "description": "Permission boundary (`['*']` = the app's full declared permissions)." + }, + "resources": { + "nullable": true, + "properties": { + "projectIds": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "projectIds" + ], + "type": "object", + "description": "Resource boundary, or `null` when the policy has none." + }, + "createdAt": { + "type": "number", + "description": "Creation time (epoch ms)." + }, + "updatedAt": { + "type": "number", + "description": "Last-update time (epoch ms)." + } + }, + "required": [ + "claims", + "clientId", + "createdAt", + "issuerUrl", + "name", + "permissions", + "policyId", + "resources", + "teamId", + "updatedAt" + ], + "type": "object", + "description": "A full point-in-time snapshot of an OIDC exchange policy, captured on every lifecycle event so the audit trail records exactly what the policy looked like. Mirrors the management endpoints' public response shape." + }, + "appName": { + "type": "string" + } + }, + "required": [ + "after", + "before" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "tokenId": { + "type": "string", + "description": "The token's public ID." + }, + "tokenPrefix": { + "type": "string", + "enum": [ + "vcp_" + ], + "description": "The token prefix used when showing a safe checksum-style fingerprint." + }, + "tokenSuffix": { + "type": "string", + "description": "The token checksum suffix." + }, + "tokenName": { + "type": "string", + "description": "User-supplied name of the token." + }, + "origin": { + "type": "string", + "enum": [ + "app", + "apple", + "bitbucket", + "chatgpt", + "email", + "emu", + "github", + "github-webhook", + "gitlab", + "google", + "invite", + "manual", + "otp", + "passkey", + "saml", + "sms", + "token-exchange-oidc" + ], + "description": "How the token was issued. Always `'manual'` for explicit PAT creation." + }, + "scope": { + "type": "string", + "enum": [ + "project", + "team", + "user" + ], + "description": "Scope of the token: - `'user'`: full-account token (not tied to any team). - `'team'`: scoped to a single team. - `'project'`: scoped to a single project within a team." + }, + "teamId": { + "type": "string", + "description": "Present when `scope` is `'team'` or `'project'`." + }, + "teamSlug": { + "type": "string", + "description": "Present when `scope` is `'team'` or `'project'`." + }, + "projectId": { + "type": "string", + "description": "Present when `scope` is `'project'`." + }, + "projectName": { + "type": "string", + "description": "Present when `scope` is `'project'`." + }, + "projectScope": { + "type": "string", + "enum": [ + "account", + "project-only" + ], + "description": "Present when `scope` is `'project'`." + }, + "expiresAt": { + "type": "number", + "description": "Unix epoch milliseconds. Absent when the token never expires." + }, + "hasAuthorizationDetails": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether the token was issued with RFC 9396 authorization details." + }, + "ip": { + "nullable": true, + "type": "string" + }, + "geolocation": { + "nullable": true, + "properties": { + "city": { + "properties": { + "names": { + "properties": { + "en": { + "type": "string" + } + }, + "required": [ + "en" + ], + "type": "object" + } + }, + "required": [ + "names" + ], + "type": "object" + }, + "country": { + "properties": { + "names": { + "properties": { + "en": { + "type": "string" + } + }, + "required": [ + "en" + ], + "type": "object" + } + }, + "required": [ + "names" + ], + "type": "object" + }, + "most_specific_subdivision": { + "properties": { + "names": { + "properties": { + "en": { + "type": "string" + } + }, + "required": [ + "en" + ], + "type": "object" + } + }, + "required": [ + "names" + ], + "type": "object" + }, + "regionName": { + "type": "string" + } + }, + "required": [ + "country" + ], + "type": "object" + }, + "userAgent": { + "type": "string" + }, + "reqId": { + "type": "string" + }, + "reqUrl": { + "type": "string" + } + }, + "required": [ + "origin", + "scope", + "tokenId", + "tokenName" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "tokenId": { + "type": "string" + }, + "tokenType": { + "type": "string" + }, + "tokenName": { + "type": "string" + }, + "actorTokenId": { + "type": "string", + "description": "The token's public ID." + }, + "origin": { + "type": "string", + "enum": [ + "app", + "apple", + "bitbucket", + "chatgpt", + "email", + "emu", + "github", + "github-webhook", + "gitlab", + "google", + "invite", + "manual", + "otp", + "passkey", + "saml", + "sms", + "token-exchange-oidc" + ] + }, + "teamId": { + "type": "string" + }, + "expired": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "leaked": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "revoked": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "ip": { + "nullable": true, + "type": "string" + }, + "geolocation": { + "nullable": true, + "properties": { + "city": { + "properties": { + "names": { + "properties": { + "en": { + "type": "string" + } + }, + "required": [ + "en" + ], + "type": "object" + } + }, + "required": [ + "names" + ], + "type": "object" + }, + "country": { + "properties": { + "names": { + "properties": { + "en": { + "type": "string" + } + }, + "required": [ + "en" + ], + "type": "object" + } + }, + "required": [ + "names" + ], + "type": "object" + }, + "most_specific_subdivision": { + "properties": { + "names": { + "properties": { + "en": { + "type": "string" + } + }, + "required": [ + "en" + ], + "type": "object" + } + }, + "required": [ + "names" + ], + "type": "object" + }, + "regionName": { + "type": "string" + } + }, + "required": [ + "country" + ], + "type": "object" + }, + "userAgent": { + "type": "string" + }, + "reqId": { + "type": "string" + }, + "reqUrl": { + "type": "string" + } + }, + "required": [ + "actorTokenId", + "tokenId", + "tokenName", + "tokenType" + ], + "type": "object", + "description": "The payload of the event, if requested." + }, + { + "properties": { + "deletedCount": { + "type": "number" + }, + "actorTokenId": { + "type": "string", + "description": "The token's public ID." + }, + "ip": { + "nullable": true, + "type": "string" + }, + "geolocation": { + "nullable": true, + "properties": { + "city": { + "properties": { + "names": { + "properties": { + "en": { + "type": "string" + } + }, + "required": [ + "en" + ], + "type": "object" + } + }, + "required": [ + "names" + ], + "type": "object" + }, + "country": { + "properties": { + "names": { + "properties": { + "en": { + "type": "string" + } + }, + "required": [ + "en" + ], + "type": "object" + } + }, + "required": [ + "names" + ], + "type": "object" + }, + "most_specific_subdivision": { + "properties": { + "names": { + "properties": { + "en": { + "type": "string" + } + }, + "required": [ + "en" + ], + "type": "object" + } + }, + "required": [ + "names" + ], + "type": "object" + }, + "regionName": { + "type": "string" + } + }, + "required": [ + "country" + ], + "type": "object" + }, + "userAgent": { + "type": "string" + }, + "reqId": { + "type": "string" + }, + "reqUrl": { + "type": "string" + } + }, + "required": [ + "actorTokenId", + "deletedCount" + ], + "type": "object", + "description": "The payload of the event, if requested." + } + ] + } + }, + "required": [ + "createdAt", + "entities", + "id", + "principalId", + "text" + ], + "type": "object", + "description": "Array of events generated by the User." + }, + "ListEventType": { + "properties": { + "name": { + "type": "string", + "enum": [ + "access-group-created", + "access-group-deleted", + "access-group-project-updated", + "access-group-updated", + "access-group-user-added", + "access-group-user-removed", + "admin-agentic-provisioning-account-unlinked", + "admin-plan-updated", + "admin-secondary-email-added", + "admin-secondary-email-removed", + "admin-team-name-update", + "admin-team-slug-update", + "admin-user-delete", + "admin-user-primary-email-updated", + "admin-username-updated", + "agentic-provisioning-account-blocked", + "agentic-provisioning-account-linked", + "agentic-provisioning-account-relinked", + "agentic-provisioning-account-unlinked", + "agentic-provisioning-credentials-rotated", + "agentic-provisioning-plan-changed", + "agentic-provisioning-team-created", + "ai-alert-investigation", + "ai-code-review", + "ai-gateway-api-key-created", + "ai-gateway-api-key-deleted", + "ai-gateway-api-key-quota-updated", + "ai-gateway-auto-reload-updated", + "ai-gateway-budget-default-updated", + "ai-gateway-byok-credential-created", + "ai-gateway-byok-credential-deleted", + "ai-gateway-byok-credential-updated", + "ai-gateway-byok-model-mappings-updated", + "ai-gateway-credits-purchased", + "ai-gateway-guardrails-updated", + "ai-gateway-hipaa-compliance-toggled", + "ai-gateway-inference-regions-updated", + "ai-gateway-model-allowlist-models-updated", + "ai-gateway-model-allowlist-toggled", + "ai-gateway-private-model-created", + "ai-gateway-private-model-deleted", + "ai-gateway-private-model-updated", + "ai-gateway-private-provider-created", + "ai-gateway-private-provider-deleted", + "ai-gateway-private-provider-updated", + "ai-gateway-prompt-training-opt-out-toggled", + "ai-gateway-provider-allowlist-providers-updated", + "ai-gateway-provider-allowlist-toggled", + "ai-gateway-rule-created", + "ai-gateway-rule-deleted", + "ai-gateway-rule-updated", + "ai-gateway-scope-budget-updated", + "ai-gateway-transcripts-default-disabled", + "ai-gateway-transcripts-default-enabled", + "ai-gateway-transcripts-disabled", + "ai-gateway-transcripts-enabled", + "ai-gateway-transcripts-retention-updated", + "ai-gateway-virtual-model-config-archived", + "ai-gateway-virtual-model-config-created", + "ai-gateway-virtual-model-config-deleted", + "ai-gateway-virtual-model-config-restored", + "ai-gateway-virtual-model-config-updated", + "ai-gateway-zero-data-retention-toggled", + "ai-omniagent", + "alert-investigation-project-allowlist-updated", + "alert-rule-created", + "alert-rule-deleted", + "alert-rule-updated", + "alias", + "alias-chown", + "alias-delete", + "alias-invite-created", + "alias-invite-joined", + "alias-invite-revoked", + "alias-protection-bypass-created", + "alias-protection-bypass-exception", + "alias-protection-bypass-regenerated", + "alias-protection-bypass-revoked", + "alias-system", + "alias-user-scoped-access-denied", + "alias-user-scoped-access-granted", + "alias-user-scoped-access-requested", + "alias-user-scoped-access-revoked", + "aliases-assigned", + "attack-mode-disabled", + "attack-mode-enabled", + "audit-log-export-downloaded", + "audit-log-export-requested", + "authorize-git-deployment", + "auto-expose-system-envs", + "avatar", + "billing-settings-updated", + "bulk-redirects-settings-updated", + "bulk-redirects-version-promoted", + "bulk-redirects-version-restored", + "cert", + "cert-autorenew", + "cert-chown", + "cert-clone", + "cert-delete", + "cert-renew", + "cert-replace", + "cert-system-create", + "code-owners-config-updated", + "compliance-document-downloaded", + "compliance-document-previewed", + "compliance-documents-bulk-downloaded", + "concurrent-builds-update", + "connect-attach-project", + "connect-bitbucket", + "connect-bitbucket-app", + "connect-configuration-created", + "connect-configuration-deleted", + "connect-configuration-link-updated", + "connect-configuration-linked", + "connect-configuration-unlinked", + "connect-configuration-updated", + "connect-create-connector", + "connect-delete-connector", + "connect-delete-installation", + "connect-detach-project", + "connect-github", + "connect-github-custom-host", + "connect-github-limited", + "connect-gitlab", + "connect-gitlab-app", + "connect-import-tokens", + "connect-revoke-all-tokens", + "connect-update-connector", + "connect-update-trigger-destinations", + "connect-upsert-installation", + "custom-alert-created", + "custom-alert-deleted", + "custom-alert-updated", + "custom-environments-settings-updated", + "custom-metric-metadata-deleted", + "custom-metric-metadata-updated", + "custom-suffix-clear", + "custom-suffix-disable", + "custom-suffix-enable", + "custom-suffix-pending", + "custom-suffix-ready", + "deploy-hook-created", + "deploy-hook-deduped", + "deploy-hook-deleted", + "deploy-hook-processed", + "deployment", + "deployment-check-created", + "deployment-check-deleted", + "deployment-check-updated", + "deployment-chown", + "deployment-creation-blocked", + "deployment-delete", + "deployment-policy-blocked", + "deployment-undeleted", + "disabled-integration-installation-removed", + "disconnect-bitbucket-app", + "disconnect-github", + "disconnect-github-custom-host", + "disconnect-github-limited", + "disconnect-gitlab-app", + "dns-add", + "dns-delete", + "dns-record-internal", + "dns-update", + "dns-zonefile-import", + "domain", + "domain-buy", + "domain-cdn", + "domain-chown", + "domain-custom-ns-change", + "domain-delegated", + "domain-delete", + "domain-ech-change", + "domain-move-in", + "domain-move-out", + "domain-move-out-request-sent", + "domain-renew-change", + "domain-service-type-updated", + "domain-transfer-in", + "domain-transfer-in-canceled", + "domain-transfer-in-completed", + "domain-zone-change", + "domain-zone-change-internal", + "drain-created", + "drain-deleted", + "drain-disabled", + "drain-enabled", + "drain-updated", + "edge-cache-dangerously-delete-by-src-images", + "edge-cache-dangerously-delete-by-tags", + "edge-cache-dangerously-delete-immutable-static", + "edge-cache-invalidate-by-src-images", + "edge-cache-invalidate-by-tags", + "edge-cache-purge-all", + "edge-cache-rollback-purge", + "edge-config-backup-restored", + "edge-config-created", + "edge-config-deleted", + "edge-config-items-updated", + "edge-config-schema-deleted", + "edge-config-schema-updated", + "edge-config-token-created", + "edge-config-token-deleted", + "edge-config-transfer-in", + "edge-config-transfer-out", + "edge-config-updated", + "email", + "email-notification-rule-removed", + "email-notification-rule-updated", + "emu-member-removed-unverified-domain", + "enforce-disjunctive-production-secrets", + "enforce-sensitive-environment-variables", + "env-variable-add", + "env-variable-delete", + "env-variable-edit", + "env-variable-masked", + "env-variable-read", + "env-variable-read:cli:dev", + "env-variable-read:cli:env:add", + "env-variable-read:cli:env:ls", + "env-variable-read:cli:env:pull", + "env-variable-read:cli:env:rm", + "env-variable-read:cli:pull", + "env-variable-read:unknown-source", + "env-variable-read:v0:env:pull", + "env-variable-rotated", + "experiment-created", + "experiment-deleted", + "experiment-transitioned", + "experiment-updated", + "firewall-bypass-created", + "firewall-bypass-deleted", + "firewall-config-modified", + "firewall-config-promoted", + "firewall-config-removed", + "firewall-managed-rulegroup-updated", + "firewall-managed-ruleset-updated", + "flag", + "flag-archived", + "flag-created", + "flag-deleted", + "flag-unarchived", + "flag-updated", + "flags-explorer-subscription", + "flags-sdk-key", + "flags-sdk-key-added", + "flags-sdk-key-deleted", + "flags-sdk-key-read", + "flags-segment", + "flags-settings", + "flags-transferred", + "flat-rate-cdn-auto-upgrade-consent", + "git-integration-repo-push", + "git_account_integration_link_added", + "global-config-backup-restored", + "global-config-created", + "global-config-deleted", + "global-config-items-updated", + "global-config-schema-deleted", + "global-config-schema-updated", + "global-config-token-created", + "global-config-token-deleted", + "global-config-transfer-in", + "global-config-transfer-out", + "global-config-updated", + "instant-rollback-created", + "integration-configuration-credential-revoked", + "integration-configuration-credential-rotated", + "integration-configuration-owner-changed", + "integration-configuration-scope-change-confirmed", + "integration-configuration-transfer-in-success", + "integration-configuration-transfer-out-success", + "integration-configurations-disabled", + "integration-installation-billing-plan-updated", + "integration-installation-completed", + "integration-installation-permission-updated", + "integration-installation-removed", + "integration-resource-redis-command-executed", + "integration-resource-sql-query-executed", + "integration-scope-changed", + "invoice-modified", + "invoice-refunded", + "kms-issuer-created", + "kms-issuer-deleted", + "kms-issuer-key-activated", + "kms-issuer-key-created", + "kms-issuer-key-revoked", + "kms-issuer-key-rotated", + "kms-issuer-policy-created", + "kms-issuer-policy-deleted", + "kms-issuer-policy-updated", + "kms-issuer-updated", + "log-drain-created", + "log-drain-deleted", + "log-drain-disabled", + "log-drain-enabled", + "login", + "login-connection-linked", + "login-connection-unlinked", + "manual-deployment-promotion-created", + "marketplace-flex-commit-opt-in", + "marketplace-integration-allowlist-updated", + "microfrontend-group-added", + "microfrontend-group-deleted", + "microfrontend-group-updated", + "microfrontend-project-added-to-group", + "microfrontend-project-removed-from-group", + "microfrontend-project-updated", + "monitoring-alert-updated", + "monitoring-disabled", + "monitoring-enabled", + "oauth-app-connection-created", + "oauth-app-connection-removed", + "oauth-app-connection-updated", + "oauth-app-created", + "oauth-app-deleted", + "oauth-app-secret-deleted", + "oauth-app-secret-generated", + "oauth-app-token-created", + "oauth-app-updated", + "observability-disabled", + "observability-enabled", + "observability-plus-project-disabled", + "observability-plus-project-enabled", + "oidc-policy-created", + "oidc-policy-deleted", + "oidc-policy-updated", + "oidc-policy-used-to-obtain-app-token", + "organization-create", + "organization-delete", + "organization-dsync-group-delete", + "organization-dsync-group-upsert", + "organization-slug-update", + "organization-team-add", + "organization-team-create", + "organization-team-delete", + "organization-team-sso-update", + "owner-blocked", + "owner-soft-blocked", + "owner-soft-unblocked", + "owner-unblocked", + "page-integrity-config-updated", + "page-integrity-header-approved", + "page-integrity-header-rejected", + "page-integrity-inventory-cleared", + "page-integrity-resource-approved", + "page-integrity-resource-deleted", + "page-integrity-resource-rejected", + "page-integrity-script-approval-rule-created", + "page-integrity-script-approval-rule-deleted", + "passkey-created", + "passkey-deleted", + "passkey-updated", + "passport-access-granted", + "password-protection-disabled", + "password-protection-enabled", + "payment-method-added", + "payment-method-default-updated", + "payment-method-removed", + "plan", + "preview-deployment-suffix-disabled", + "preview-deployment-suffix-enabled", + "preview-deployment-suffix-update", + "privatelink-endpoint-created", + "privatelink-endpoint-deleted", + "privatelink-endpoint-updated", + "production-branch-updated", + "project-add-alias", + "project-add-redirect", + "project-affected-projects-deployments-updated", + "project-alias-configured-change", + "project-analytics-disabled", + "project-analytics-enabled", + "project-auto-assign-custom-production-domains-updated", + "project-automation-bypass", + "project-avatar-update", + "project-build-command-updated", + "project-build-logs-and-source-protection-updated", + "project-build-machine-updated", + "project-card-widget-preference-updated", + "project-client-cert-delete", + "project-client-cert-upload", + "project-connect-configurations", + "project-consolidated-git-commit-status-updated", + "project-created", + "project-cron-jobs-toggled", + "project-custom-environment-created", + "project-custom-environment-deleted", + "project-custom-environment-updated", + "project-customer-success-code-visibility-updated", + "project-delete", + "project-deployment-policy-updated", + "project-deployment-retention-updated", + "project-directory-listing", + "project-domain-deleted", + "project-domain-moved", + "project-domain-unverified", + "project-domain-updated", + "project-domain-verified", + "project-elastic-concurrency-updated", + "project-expiration-locked", + "project-expiration-reached", + "project-expiration-scheduled", + "project-expiration-unlocked", + "project-external-rewrite-caching-updated", + "project-framework-updated", + "project-function-cpu-memory", + "project-function-failover", + "project-function-max-duration", + "project-function-regions", + "project-functions-beta-updated", + "project-functions-fluid-disabled", + "project-functions-fluid-enabled", + "project-git-commit-comments-toggled", + "project-git-commit-status-toggled", + "project-git-create-deployments-toggled", + "project-git-credential-bound-created", + "project-git-credential-bound-deleted", + "project-git-credential-bound-updated", + "project-git-credential-grant-created", + "project-git-credential-grant-deleted", + "project-git-credential-grant-updated", + "project-git-fork-protection-updated", + "project-git-lfs-toggled", + "project-git-pr-comments-toggled", + "project-git-repository-connected", + "project-git-repository-disconnected", + "project-git-repository-dispatch-events-toggled", + "project-git-require-verified-commits-toggled", + "project-ignored-build-step-updated", + "project-install-command-updated", + "project-member-added", + "project-member-invited", + "project-member-removed", + "project-member-removed-batch", + "project-member-updated", + "project-move-in-success", + "project-move-out-failed", + "project-move-out-started", + "project-move-out-success", + "project-name", + "project-node-version-updated", + "project-oidc-issuer-mode-updated", + "project-oidc-token-created", + "project-options-allowlist", + "project-output-directory-updated", + "project-passport-updated", + "project-password-protection", + "project-paused", + "project-preview-deployment-suffix", + "project-preview-environment-branch-tracking-updated", + "project-prioritize-production-builds-updated", + "project-program-enrollment-changed", + "project-protected-sourcemaps-updated", + "project-rollback-description-updated", + "project-rolling-release-aborted", + "project-rolling-release-approved", + "project-rolling-release-completed", + "project-rolling-release-configured", + "project-rolling-release-continued", + "project-rolling-release-disabled", + "project-rolling-release-enabled", + "project-rolling-release-paused", + "project-rolling-release-started", + "project-rolling-release-suggested-actions-generated", + "project-rolling-release-timer", + "project-root-directory-updated", + "project-routes-version-promoted", + "project-routes-version-restored", + "project-sandbox-config-updated", + "project-sandbox-url-protection-updated", + "project-skew-protection-allowed-domains-updated", + "project-skew-protection-max-age-updated", + "project-skew-protection-threshold-updated", + "project-source-files-outside-root-directory-updated", + "project-speed-insights-disabled", + "project-speed-insights-enabled", + "project-speed-insights-free-data-started", + "project-sso-protection", + "project-static-ips-updated", + "project-trusted-ips", + "project-trusted-sources", + "project-unpaused", + "project-web-analytics-disabled", + "project-web-analytics-enabled", + "protected-git-scope-added", + "protected-git-scope-removed", + "runtime-cache-purge-all", + "saml-connection-created", + "saml-connection-deleted", + "sandbox-alias-assigned", + "sandbox-alias-delete", + "sandbox-drive-created", + "sandbox-drive-deleted", + "sandbox-snapshot-regions-updated", + "scale", + "scale-auto", + "secondary-email-added", + "secondary-email-removed", + "secondary-email-verified", + "secret-add", + "secret-delete", + "secret-rename", + "security-list-created", + "security-list-deleted", + "security-list-updated", + "security-plus-updated", + "set-bio", + "set-name", + "set-profiles", + "set-scale", + "shared-env-variable-create", + "shared-env-variable-delete", + "shared-env-variable-read", + "shared-env-variable-repo-link", + "shared-env-variable-repo-unlink", + "shared-env-variable-update", + "show-ip-addresses", + "signup", + "signup-via-bitbucket", + "signup-via-github", + "signup-via-gitlab", + "speed-insights-settings-updated", + "spend-created", + "spend-deleted", + "spend-updated", + "sso-login", + "storage-accept-tos", + "storage-access-token-set", + "storage-accessed-data-browser", + "storage-connect-project", + "storage-create", + "storage-delete", + "storage-disconnect-project", + "storage-disconnect-projects", + "storage-inactive-store-deleted", + "storage-reset-credentials", + "storage-resource-repl-command", + "storage-set-locked", + "storage-transfer-in-success", + "storage-transfer-out-success", + "storage-transfer-request-created", + "storage-update", + "storage-update-project-connection", + "storage-upgrade-project-connection-to-oidc", + "storage-view-secret", + "strict-connectors", + "strict-deployment-protection-settings", + "strict-password-protection-settings", + "strict-shareable-links", + "subscription-created", + "subscription-product-added", + "subscription-product-removed", + "subscription-updated", + "support-session-created", + "team", + "team-agent-billing-migration-decision-changed", + "team-avatar-update", + "team-collaboration-settings-updated", + "team-default-build-machine-updated", + "team-default-passport-updated", + "team-delete", + "team-deployment-policy-updated", + "team-domain-verification-created", + "team-domain-verification-deleted", + "team-domain-verification-verified", + "team-email-domain-update", + "team-emu-updated", + "team-ended-trial", + "team-firewall-config-modified", + "team-firewall-config-promoted", + "team-git-repository-dispatch-events-toggled", + "team-git-require-verified-commits-toggled", + "team-invite-bulk-delete", + "team-invite-code-reset", + "team-invite-link-created", + "team-invite-link-deleted", + "team-ip-blocking-rules-created", + "team-ip-blocking-rules-removed", + "team-member-add", + "team-member-confirm-request", + "team-member-decline-request", + "team-member-delete", + "team-member-entitlement-added", + "team-member-entitlement-canceled", + "team-member-entitlement-reactivated", + "team-member-entitlement-removed", + "team-member-join", + "team-member-leave", + "team-member-request-access", + "team-member-role-update", + "team-member-sso-authorization-attempt", + "team-mfa-enforcement-updated", + "team-name-update", + "team-paid-invoice", + "team-program-enrollment-changed", + "team-remote-caching-purge", + "team-remote-caching-update", + "team-saml-enforced", + "team-saml-roles", + "team-slug-update", + "team-tokens-invalidated", + "tracing-configured", + "tracing-disabled", + "tracing-paused", + "tracing-resumed", + "unlink-login-connection", + "update-account-flow-dismissed", + "update-account-flow-triggered", + "user-auto-block-configured", + "user-blocked", + "user-delete", + "user-delete-requested", + "user-emu-account-archived", + "user-emu-account-deleted", + "user-emu-account-recovered", + "user-emu-account-update-opted-in", + "user-emu-account-update-opted-out", + "user-emu-recovery-email-sent", + "user-emu-recovery-initiated", + "user-emu-toggled", + "user-mfa-challenge-failed", + "user-mfa-challenge-initiated", + "user-mfa-challenge-verified", + "user-mfa-change-failed", + "user-mfa-configuration-updated", + "user-mfa-recovery-code-used", + "user-mfa-recovery-codes-regenerated", + "user-mfa-removed", + "user-mfa-setup-skipped", + "user-mfa-totp-verification-started", + "user-mfa-totp-verified", + "user-phone-removed", + "user-phone-updated", + "user-primary-email-updated", + "user-provider-email-claim-evaluated", + "user-sudo-mode-removed", + "user-token-created", + "user-token-deleted", + "user-tokens-deleted", + "user-unblocked", + "username", + "v0-chat-ai-usage", + "v0-chat-created", + "v0-chat-message-sent", + "vcr-image-deleted", + "vcr-image-pushed", + "vcr-repository-created", + "vcr-repository-deleted", + "vcr-repository-permission-added", + "vcr-repository-permission-removed", + "vcr-repository-permissions-cleared", + "vcr-repository-visibility-changed", + "vercel-agent-elevated-permissions-approved", + "vercel-agent-elevated-permissions-requested", + "vercel-agent-session-created", + "vercel-agent-team-trial-credits-applied", + "vercel-app-installation-request-dismissed", + "vercel-app-installation-requested", + "vercel-app-installation-updated", + "vercel-app-installed", + "vercel-app-tokens-revoked", + "vercel-app-uninstalled", + "vercel-toolbar", + "vpc-peering-connection-accepted", + "vpc-peering-connection-deleted", + "vpc-peering-connection-rejected", + "vpc-peering-connection-updated", + "vulnerability-banner-dismissed", + "web-analytics-tier-updated", + "webhook-created", + "webhook-deleted", + "webhook-updated", + "workflow-deployment-key-accessed" + ], + "description": "The name of the event type.", + "example": "deployment-created" + }, + "description": { + "type": "string", + "description": "Description of the event, visible to users in the Activity dashboard and docs." + }, + "categories": { + "items": { + "type": "string", + "enum": [ + "account", + "ai", + "ai-gateway", + "billing", + "connect", + "deployment", + "domain", + "edge", + "env-variable", + "feature-flags", + "firewall", + "integration", + "microfrontends", + "network", + "observability", + "other", + "project", + "security", + "storage", + "team", + "v0", + "vercel-app", + "workflow" + ], + "example": [ + "deployment" + ], + "description": "Categories that group this event type with related event types." + }, + "type": "array", + "description": "Categories that group this event type with related event types.", + "example": [ + "deployment" + ] + }, + "deprecated": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Present only when this event type is deprecated." + }, + "replacedBy": { + "items": { + "type": "string", + "enum": [ + "access-group-created", + "access-group-deleted", + "access-group-project-updated", + "access-group-updated", + "access-group-user-added", + "access-group-user-removed", + "admin-agentic-provisioning-account-unlinked", + "admin-plan-updated", + "admin-secondary-email-added", + "admin-secondary-email-removed", + "admin-team-name-update", + "admin-team-slug-update", + "admin-user-delete", + "admin-user-primary-email-updated", + "admin-username-updated", + "agentic-provisioning-account-blocked", + "agentic-provisioning-account-linked", + "agentic-provisioning-account-relinked", + "agentic-provisioning-account-unlinked", + "agentic-provisioning-credentials-rotated", + "agentic-provisioning-plan-changed", + "agentic-provisioning-team-created", + "ai-alert-investigation", + "ai-code-review", + "ai-gateway-api-key-created", + "ai-gateway-api-key-deleted", + "ai-gateway-api-key-quota-updated", + "ai-gateway-auto-reload-updated", + "ai-gateway-budget-default-updated", + "ai-gateway-byok-credential-created", + "ai-gateway-byok-credential-deleted", + "ai-gateway-byok-credential-updated", + "ai-gateway-byok-model-mappings-updated", + "ai-gateway-credits-purchased", + "ai-gateway-guardrails-updated", + "ai-gateway-hipaa-compliance-toggled", + "ai-gateway-inference-regions-updated", + "ai-gateway-model-allowlist-models-updated", + "ai-gateway-model-allowlist-toggled", + "ai-gateway-private-model-created", + "ai-gateway-private-model-deleted", + "ai-gateway-private-model-updated", + "ai-gateway-private-provider-created", + "ai-gateway-private-provider-deleted", + "ai-gateway-private-provider-updated", + "ai-gateway-prompt-training-opt-out-toggled", + "ai-gateway-provider-allowlist-providers-updated", + "ai-gateway-provider-allowlist-toggled", + "ai-gateway-rule-created", + "ai-gateway-rule-deleted", + "ai-gateway-rule-updated", + "ai-gateway-scope-budget-updated", + "ai-gateway-transcripts-default-disabled", + "ai-gateway-transcripts-default-enabled", + "ai-gateway-transcripts-disabled", + "ai-gateway-transcripts-enabled", + "ai-gateway-transcripts-retention-updated", + "ai-gateway-virtual-model-config-archived", + "ai-gateway-virtual-model-config-created", + "ai-gateway-virtual-model-config-deleted", + "ai-gateway-virtual-model-config-restored", + "ai-gateway-virtual-model-config-updated", + "ai-gateway-zero-data-retention-toggled", + "ai-omniagent", + "alert-investigation-project-allowlist-updated", + "alert-rule-created", + "alert-rule-deleted", + "alert-rule-updated", + "alias", + "alias-chown", + "alias-delete", + "alias-invite-created", + "alias-invite-joined", + "alias-invite-revoked", + "alias-protection-bypass-created", + "alias-protection-bypass-exception", + "alias-protection-bypass-regenerated", + "alias-protection-bypass-revoked", + "alias-system", + "alias-user-scoped-access-denied", + "alias-user-scoped-access-granted", + "alias-user-scoped-access-requested", + "alias-user-scoped-access-revoked", + "aliases-assigned", + "attack-mode-disabled", + "attack-mode-enabled", + "audit-log-export-downloaded", + "audit-log-export-requested", + "authorize-git-deployment", + "auto-expose-system-envs", + "avatar", + "billing-settings-updated", + "bulk-redirects-settings-updated", + "bulk-redirects-version-promoted", + "bulk-redirects-version-restored", + "cert", + "cert-autorenew", + "cert-chown", + "cert-clone", + "cert-delete", + "cert-renew", + "cert-replace", + "cert-system-create", + "code-owners-config-updated", + "compliance-document-downloaded", + "compliance-document-previewed", + "compliance-documents-bulk-downloaded", + "concurrent-builds-update", + "connect-attach-project", + "connect-bitbucket", + "connect-bitbucket-app", + "connect-configuration-created", + "connect-configuration-deleted", + "connect-configuration-link-updated", + "connect-configuration-linked", + "connect-configuration-unlinked", + "connect-configuration-updated", + "connect-create-connector", + "connect-delete-connector", + "connect-delete-installation", + "connect-detach-project", + "connect-github", + "connect-github-custom-host", + "connect-github-limited", + "connect-gitlab", + "connect-gitlab-app", + "connect-import-tokens", + "connect-revoke-all-tokens", + "connect-update-connector", + "connect-update-trigger-destinations", + "connect-upsert-installation", + "custom-alert-created", + "custom-alert-deleted", + "custom-alert-updated", + "custom-environments-settings-updated", + "custom-metric-metadata-deleted", + "custom-metric-metadata-updated", + "custom-suffix-clear", + "custom-suffix-disable", + "custom-suffix-enable", + "custom-suffix-pending", + "custom-suffix-ready", + "deploy-hook-created", + "deploy-hook-deduped", + "deploy-hook-deleted", + "deploy-hook-processed", + "deployment", + "deployment-check-created", + "deployment-check-deleted", + "deployment-check-updated", + "deployment-chown", + "deployment-creation-blocked", + "deployment-delete", + "deployment-policy-blocked", + "deployment-undeleted", + "disabled-integration-installation-removed", + "disconnect-bitbucket-app", + "disconnect-github", + "disconnect-github-custom-host", + "disconnect-github-limited", + "disconnect-gitlab-app", + "dns-add", + "dns-delete", + "dns-record-internal", + "dns-update", + "dns-zonefile-import", + "domain", + "domain-buy", + "domain-cdn", + "domain-chown", + "domain-custom-ns-change", + "domain-delegated", + "domain-delete", + "domain-ech-change", + "domain-move-in", + "domain-move-out", + "domain-move-out-request-sent", + "domain-renew-change", + "domain-service-type-updated", + "domain-transfer-in", + "domain-transfer-in-canceled", + "domain-transfer-in-completed", + "domain-zone-change", + "domain-zone-change-internal", + "drain-created", + "drain-deleted", + "drain-disabled", + "drain-enabled", + "drain-updated", + "edge-cache-dangerously-delete-by-src-images", + "edge-cache-dangerously-delete-by-tags", + "edge-cache-dangerously-delete-immutable-static", + "edge-cache-invalidate-by-src-images", + "edge-cache-invalidate-by-tags", + "edge-cache-purge-all", + "edge-cache-rollback-purge", + "edge-config-backup-restored", + "edge-config-created", + "edge-config-deleted", + "edge-config-items-updated", + "edge-config-schema-deleted", + "edge-config-schema-updated", + "edge-config-token-created", + "edge-config-token-deleted", + "edge-config-transfer-in", + "edge-config-transfer-out", + "edge-config-updated", + "email", + "email-notification-rule-removed", + "email-notification-rule-updated", + "emu-member-removed-unverified-domain", + "enforce-disjunctive-production-secrets", + "enforce-sensitive-environment-variables", + "env-variable-add", + "env-variable-delete", + "env-variable-edit", + "env-variable-masked", + "env-variable-read", + "env-variable-read:cli:dev", + "env-variable-read:cli:env:add", + "env-variable-read:cli:env:ls", + "env-variable-read:cli:env:pull", + "env-variable-read:cli:env:rm", + "env-variable-read:cli:pull", + "env-variable-read:unknown-source", + "env-variable-read:v0:env:pull", + "env-variable-rotated", + "experiment-created", + "experiment-deleted", + "experiment-transitioned", + "experiment-updated", + "firewall-bypass-created", + "firewall-bypass-deleted", + "firewall-config-modified", + "firewall-config-promoted", + "firewall-config-removed", + "firewall-managed-rulegroup-updated", + "firewall-managed-ruleset-updated", + "flag", + "flag-archived", + "flag-created", + "flag-deleted", + "flag-unarchived", + "flag-updated", + "flags-explorer-subscription", + "flags-sdk-key", + "flags-sdk-key-added", + "flags-sdk-key-deleted", + "flags-sdk-key-read", + "flags-segment", + "flags-settings", + "flags-transferred", + "flat-rate-cdn-auto-upgrade-consent", + "git-integration-repo-push", + "git_account_integration_link_added", + "global-config-backup-restored", + "global-config-created", + "global-config-deleted", + "global-config-items-updated", + "global-config-schema-deleted", + "global-config-schema-updated", + "global-config-token-created", + "global-config-token-deleted", + "global-config-transfer-in", + "global-config-transfer-out", + "global-config-updated", + "instant-rollback-created", + "integration-configuration-credential-revoked", + "integration-configuration-credential-rotated", + "integration-configuration-owner-changed", + "integration-configuration-scope-change-confirmed", + "integration-configuration-transfer-in-success", + "integration-configuration-transfer-out-success", + "integration-configurations-disabled", + "integration-installation-billing-plan-updated", + "integration-installation-completed", + "integration-installation-permission-updated", + "integration-installation-removed", + "integration-resource-redis-command-executed", + "integration-resource-sql-query-executed", + "integration-scope-changed", + "invoice-modified", + "invoice-refunded", + "kms-issuer-created", + "kms-issuer-deleted", + "kms-issuer-key-activated", + "kms-issuer-key-created", + "kms-issuer-key-revoked", + "kms-issuer-key-rotated", + "kms-issuer-policy-created", + "kms-issuer-policy-deleted", + "kms-issuer-policy-updated", + "kms-issuer-updated", + "log-drain-created", + "log-drain-deleted", + "log-drain-disabled", + "log-drain-enabled", + "login", + "login-connection-linked", + "login-connection-unlinked", + "manual-deployment-promotion-created", + "marketplace-flex-commit-opt-in", + "marketplace-integration-allowlist-updated", + "microfrontend-group-added", + "microfrontend-group-deleted", + "microfrontend-group-updated", + "microfrontend-project-added-to-group", + "microfrontend-project-removed-from-group", + "microfrontend-project-updated", + "monitoring-alert-updated", + "monitoring-disabled", + "monitoring-enabled", + "oauth-app-connection-created", + "oauth-app-connection-removed", + "oauth-app-connection-updated", + "oauth-app-created", + "oauth-app-deleted", + "oauth-app-secret-deleted", + "oauth-app-secret-generated", + "oauth-app-token-created", + "oauth-app-updated", + "observability-disabled", + "observability-enabled", + "observability-plus-project-disabled", + "observability-plus-project-enabled", + "oidc-policy-created", + "oidc-policy-deleted", + "oidc-policy-updated", + "oidc-policy-used-to-obtain-app-token", + "organization-create", + "organization-delete", + "organization-dsync-group-delete", + "organization-dsync-group-upsert", + "organization-slug-update", + "organization-team-add", + "organization-team-create", + "organization-team-delete", + "organization-team-sso-update", + "owner-blocked", + "owner-soft-blocked", + "owner-soft-unblocked", + "owner-unblocked", + "page-integrity-config-updated", + "page-integrity-header-approved", + "page-integrity-header-rejected", + "page-integrity-inventory-cleared", + "page-integrity-resource-approved", + "page-integrity-resource-deleted", + "page-integrity-resource-rejected", + "page-integrity-script-approval-rule-created", + "page-integrity-script-approval-rule-deleted", + "passkey-created", + "passkey-deleted", + "passkey-updated", + "passport-access-granted", + "password-protection-disabled", + "password-protection-enabled", + "payment-method-added", + "payment-method-default-updated", + "payment-method-removed", + "plan", + "preview-deployment-suffix-disabled", + "preview-deployment-suffix-enabled", + "preview-deployment-suffix-update", + "privatelink-endpoint-created", + "privatelink-endpoint-deleted", + "privatelink-endpoint-updated", + "production-branch-updated", + "project-add-alias", + "project-add-redirect", + "project-affected-projects-deployments-updated", + "project-alias-configured-change", + "project-analytics-disabled", + "project-analytics-enabled", + "project-auto-assign-custom-production-domains-updated", + "project-automation-bypass", + "project-avatar-update", + "project-build-command-updated", + "project-build-logs-and-source-protection-updated", + "project-build-machine-updated", + "project-card-widget-preference-updated", + "project-client-cert-delete", + "project-client-cert-upload", + "project-connect-configurations", + "project-consolidated-git-commit-status-updated", + "project-created", + "project-cron-jobs-toggled", + "project-custom-environment-created", + "project-custom-environment-deleted", + "project-custom-environment-updated", + "project-customer-success-code-visibility-updated", + "project-delete", + "project-deployment-policy-updated", + "project-deployment-retention-updated", + "project-directory-listing", + "project-domain-deleted", + "project-domain-moved", + "project-domain-unverified", + "project-domain-updated", + "project-domain-verified", + "project-elastic-concurrency-updated", + "project-expiration-locked", + "project-expiration-reached", + "project-expiration-scheduled", + "project-expiration-unlocked", + "project-external-rewrite-caching-updated", + "project-framework-updated", + "project-function-cpu-memory", + "project-function-failover", + "project-function-max-duration", + "project-function-regions", + "project-functions-beta-updated", + "project-functions-fluid-disabled", + "project-functions-fluid-enabled", + "project-git-commit-comments-toggled", + "project-git-commit-status-toggled", + "project-git-create-deployments-toggled", + "project-git-credential-bound-created", + "project-git-credential-bound-deleted", + "project-git-credential-bound-updated", + "project-git-credential-grant-created", + "project-git-credential-grant-deleted", + "project-git-credential-grant-updated", + "project-git-fork-protection-updated", + "project-git-lfs-toggled", + "project-git-pr-comments-toggled", + "project-git-repository-connected", + "project-git-repository-disconnected", + "project-git-repository-dispatch-events-toggled", + "project-git-require-verified-commits-toggled", + "project-ignored-build-step-updated", + "project-install-command-updated", + "project-member-added", + "project-member-invited", + "project-member-removed", + "project-member-removed-batch", + "project-member-updated", + "project-move-in-success", + "project-move-out-failed", + "project-move-out-started", + "project-move-out-success", + "project-name", + "project-node-version-updated", + "project-oidc-issuer-mode-updated", + "project-oidc-token-created", + "project-options-allowlist", + "project-output-directory-updated", + "project-passport-updated", + "project-password-protection", + "project-paused", + "project-preview-deployment-suffix", + "project-preview-environment-branch-tracking-updated", + "project-prioritize-production-builds-updated", + "project-program-enrollment-changed", + "project-protected-sourcemaps-updated", + "project-rollback-description-updated", + "project-rolling-release-aborted", + "project-rolling-release-approved", + "project-rolling-release-completed", + "project-rolling-release-configured", + "project-rolling-release-continued", + "project-rolling-release-disabled", + "project-rolling-release-enabled", + "project-rolling-release-paused", + "project-rolling-release-started", + "project-rolling-release-suggested-actions-generated", + "project-rolling-release-timer", + "project-root-directory-updated", + "project-routes-version-promoted", + "project-routes-version-restored", + "project-sandbox-config-updated", + "project-sandbox-url-protection-updated", + "project-skew-protection-allowed-domains-updated", + "project-skew-protection-max-age-updated", + "project-skew-protection-threshold-updated", + "project-source-files-outside-root-directory-updated", + "project-speed-insights-disabled", + "project-speed-insights-enabled", + "project-speed-insights-free-data-started", + "project-sso-protection", + "project-static-ips-updated", + "project-trusted-ips", + "project-trusted-sources", + "project-unpaused", + "project-web-analytics-disabled", + "project-web-analytics-enabled", + "protected-git-scope-added", + "protected-git-scope-removed", + "runtime-cache-purge-all", + "saml-connection-created", + "saml-connection-deleted", + "sandbox-alias-assigned", + "sandbox-alias-delete", + "sandbox-drive-created", + "sandbox-drive-deleted", + "sandbox-snapshot-regions-updated", + "scale", + "scale-auto", + "secondary-email-added", + "secondary-email-removed", + "secondary-email-verified", + "secret-add", + "secret-delete", + "secret-rename", + "security-list-created", + "security-list-deleted", + "security-list-updated", + "security-plus-updated", + "set-bio", + "set-name", + "set-profiles", + "set-scale", + "shared-env-variable-create", + "shared-env-variable-delete", + "shared-env-variable-read", + "shared-env-variable-repo-link", + "shared-env-variable-repo-unlink", + "shared-env-variable-update", + "show-ip-addresses", + "signup", + "signup-via-bitbucket", + "signup-via-github", + "signup-via-gitlab", + "speed-insights-settings-updated", + "spend-created", + "spend-deleted", + "spend-updated", + "sso-login", + "storage-accept-tos", + "storage-access-token-set", + "storage-accessed-data-browser", + "storage-connect-project", + "storage-create", + "storage-delete", + "storage-disconnect-project", + "storage-disconnect-projects", + "storage-inactive-store-deleted", + "storage-reset-credentials", + "storage-resource-repl-command", + "storage-set-locked", + "storage-transfer-in-success", + "storage-transfer-out-success", + "storage-transfer-request-created", + "storage-update", + "storage-update-project-connection", + "storage-upgrade-project-connection-to-oidc", + "storage-view-secret", + "strict-connectors", + "strict-deployment-protection-settings", + "strict-password-protection-settings", + "strict-shareable-links", + "subscription-created", + "subscription-product-added", + "subscription-product-removed", + "subscription-updated", + "support-session-created", + "team", + "team-agent-billing-migration-decision-changed", + "team-avatar-update", + "team-collaboration-settings-updated", + "team-default-build-machine-updated", + "team-default-passport-updated", + "team-delete", + "team-deployment-policy-updated", + "team-domain-verification-created", + "team-domain-verification-deleted", + "team-domain-verification-verified", + "team-email-domain-update", + "team-emu-updated", + "team-ended-trial", + "team-firewall-config-modified", + "team-firewall-config-promoted", + "team-git-repository-dispatch-events-toggled", + "team-git-require-verified-commits-toggled", + "team-invite-bulk-delete", + "team-invite-code-reset", + "team-invite-link-created", + "team-invite-link-deleted", + "team-ip-blocking-rules-created", + "team-ip-blocking-rules-removed", + "team-member-add", + "team-member-confirm-request", + "team-member-decline-request", + "team-member-delete", + "team-member-entitlement-added", + "team-member-entitlement-canceled", + "team-member-entitlement-reactivated", + "team-member-entitlement-removed", + "team-member-join", + "team-member-leave", + "team-member-request-access", + "team-member-role-update", + "team-member-sso-authorization-attempt", + "team-mfa-enforcement-updated", + "team-name-update", + "team-paid-invoice", + "team-program-enrollment-changed", + "team-remote-caching-purge", + "team-remote-caching-update", + "team-saml-enforced", + "team-saml-roles", + "team-slug-update", + "team-tokens-invalidated", + "tracing-configured", + "tracing-disabled", + "tracing-paused", + "tracing-resumed", + "unlink-login-connection", + "update-account-flow-dismissed", + "update-account-flow-triggered", + "user-auto-block-configured", + "user-blocked", + "user-delete", + "user-delete-requested", + "user-emu-account-archived", + "user-emu-account-deleted", + "user-emu-account-recovered", + "user-emu-account-update-opted-in", + "user-emu-account-update-opted-out", + "user-emu-recovery-email-sent", + "user-emu-recovery-initiated", + "user-emu-toggled", + "user-mfa-challenge-failed", + "user-mfa-challenge-initiated", + "user-mfa-challenge-verified", + "user-mfa-change-failed", + "user-mfa-configuration-updated", + "user-mfa-recovery-code-used", + "user-mfa-recovery-codes-regenerated", + "user-mfa-removed", + "user-mfa-setup-skipped", + "user-mfa-totp-verification-started", + "user-mfa-totp-verified", + "user-phone-removed", + "user-phone-updated", + "user-primary-email-updated", + "user-provider-email-claim-evaluated", + "user-sudo-mode-removed", + "user-token-created", + "user-token-deleted", + "user-tokens-deleted", + "user-unblocked", + "username", + "v0-chat-ai-usage", + "v0-chat-created", + "v0-chat-message-sent", + "vcr-image-deleted", + "vcr-image-pushed", + "vcr-repository-created", + "vcr-repository-deleted", + "vcr-repository-permission-added", + "vcr-repository-permission-removed", + "vcr-repository-permissions-cleared", + "vcr-repository-visibility-changed", + "vercel-agent-elevated-permissions-approved", + "vercel-agent-elevated-permissions-requested", + "vercel-agent-session-created", + "vercel-agent-team-trial-credits-applied", + "vercel-app-installation-request-dismissed", + "vercel-app-installation-requested", + "vercel-app-installation-updated", + "vercel-app-installed", + "vercel-app-tokens-revoked", + "vercel-app-uninstalled", + "vercel-toolbar", + "vpc-peering-connection-accepted", + "vpc-peering-connection-deleted", + "vpc-peering-connection-rejected", + "vpc-peering-connection-updated", + "vulnerability-banner-dismissed", + "web-analytics-tier-updated", + "webhook-created", + "webhook-deleted", + "webhook-updated", + "workflow-deployment-key-accessed" + ], + "description": "Event type names that supersede this deprecated event type." + }, + "type": "array", + "description": "Event type names that supersede this deprecated event type." + } + }, + "required": [ + "categories", + "description", + "name" + ], + "type": "object", + "description": "A user-facing event type." + }, + "ListEventTypesResponse": { + "properties": { + "types": { + "items": { + "$ref": "#/components/schemas/ListEventType" + }, + "type": "array" + }, + "categories": { + "items": { + "properties": { + "name": { + "type": "string", + "enum": [ + "account", + "ai", + "ai-gateway", + "billing", + "connect", + "deployment", + "domain", + "edge", + "env-variable", + "feature-flags", + "firewall", + "integration", + "microfrontends", + "network", + "observability", + "other", + "project", + "security", + "storage", + "team", + "v0", + "vercel-app", + "workflow" + ] + }, + "label": { + "type": "string" + } + }, + "required": [ + "label", + "name" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "categories", + "types" + ], + "type": "object", + "description": "Response returned by the List Event Types endpoint." + }, + "Flag": { + "properties": { + "description": { + "type": "string" + }, + "variants": { + "items": { + "type": "object" + }, + "type": "array" + }, + "id": { + "type": "string" + }, + "environments": { + "additionalProperties": { + "properties": { + "reuse": { + "properties": { + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "environment": { + "type": "string" + } + }, + "required": [ + "active", + "environment" + ], + "type": "object" + }, + "targets": { + "additionalProperties": { + "additionalProperties": { + "additionalProperties": { + "items": { + "properties": { + "note": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "required": [ + "value" + ], + "type": "object" + }, + "type": "array" + }, + "type": "object" + }, + "type": "object" + }, + "type": "object" + }, + "revision": { + "type": "number" + }, + "pausedOutcome": { + "properties": { + "type": { + "type": "string", + "enum": [ + "variant" + ] + }, + "variantId": { + "type": "string" + } + }, + "required": [ + "type", + "variantId" + ], + "type": "object" + }, + "fallthrough": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "variant" + ] + }, + "variantId": { + "type": "string" + } + }, + "required": [ + "type", + "variantId" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "split" + ] + }, + "base": { + "properties": { + "type": { + "type": "string", + "enum": [ + "entity" + ] + }, + "kind": { + "type": "string" + }, + "attribute": { + "type": "string" + } + }, + "required": [ + "attribute", + "kind", + "type" + ], + "type": "object" + }, + "weights": { + "additionalProperties": { + "type": "number" + }, + "type": "object" + }, + "defaultVariantId": { + "type": "string" + } + }, + "required": [ + "base", + "defaultVariantId", + "type", + "weights" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "rollout" + ] + }, + "base": { + "properties": { + "type": { + "type": "string", + "enum": [ + "entity" + ] + }, + "kind": { + "type": "string" + }, + "attribute": { + "type": "string" + } + }, + "required": [ + "attribute", + "kind", + "type" + ], + "type": "object" + }, + "defaultVariantId": { + "type": "string" + }, + "startTimestamp": { + "type": "number" + }, + "rollFromVariantId": { + "type": "string" + }, + "rollToVariantId": { + "type": "string" + }, + "slots": { + "items": { + "properties": { + "promille": { + "type": "number" + }, + "durationMs": { + "type": "number" + } + }, + "required": [ + "durationMs", + "promille" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "base", + "defaultVariantId", + "rollFromVariantId", + "rollToVariantId", + "slots", + "startTimestamp", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "experiment" + ] + } + }, + "required": [ + "type" + ], + "type": "object" + } + ] + }, + "active": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "rules": { + "items": { + "properties": { + "id": { + "type": "string" + }, + "outcome": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "variant" + ] + }, + "variantId": { + "type": "string" + } + }, + "required": [ + "type", + "variantId" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "split" + ] + }, + "base": { + "properties": { + "type": { + "type": "string", + "enum": [ + "entity" + ] + }, + "kind": { + "type": "string" + }, + "attribute": { + "type": "string" + } + }, + "required": [ + "attribute", + "kind", + "type" + ], + "type": "object" + }, + "weights": { + "additionalProperties": { + "type": "number" + }, + "type": "object" + }, + "defaultVariantId": { + "type": "string" + } + }, + "required": [ + "base", + "defaultVariantId", + "type", + "weights" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "rollout" + ] + }, + "base": { + "properties": { + "type": { + "type": "string", + "enum": [ + "entity" + ] + }, + "kind": { + "type": "string" + }, + "attribute": { + "type": "string" + } + }, + "required": [ + "attribute", + "kind", + "type" + ], + "type": "object" + }, + "defaultVariantId": { + "type": "string" + }, + "startTimestamp": { + "type": "number" + }, + "rollFromVariantId": { + "type": "string" + }, + "rollToVariantId": { + "type": "string" + }, + "slots": { + "items": { + "properties": { + "promille": { + "type": "number" + }, + "durationMs": { + "type": "number" + } + }, + "required": [ + "durationMs", + "promille" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "base", + "defaultVariantId", + "rollFromVariantId", + "rollToVariantId", + "slots", + "startTimestamp", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "experiment" + ] + } + }, + "required": [ + "type" + ], + "type": "object" + } + ] + }, + "conditions": { + "items": { + "properties": { + "rhs": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "list", + "list/inline" + ] + }, + "items": { + "items": { + "oneOf": [ + { + "properties": { + "label": { + "type": "string" + }, + "note": { + "type": "string" + }, + "value": { + "type": "number" + } + }, + "required": [ + "value" + ], + "type": "object" + }, + { + "properties": { + "label": { + "type": "string" + }, + "note": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "required": [ + "value" + ], + "type": "object" + } + ] + }, + "type": "array" + } + }, + "required": [ + "items", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "regex" + ] + }, + "pattern": { + "type": "string" + }, + "flags": { + "type": "string" + } + }, + "required": [ + "flags", + "pattern", + "type" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + } + ] + }, + "cmpOptions": { + "properties": { + "ignoreCase": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "type": "object" + }, + "lhs": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "segment" + ] + } + }, + "required": [ + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "entity" + ] + }, + "kind": { + "type": "string" + }, + "attribute": { + "type": "string" + } + }, + "required": [ + "attribute", + "kind", + "type" + ], + "type": "object" + } + ] + }, + "cmp": { + "type": "string", + "enum": [ + "!contains", + "!endsWith", + "!eq", + "!ex", + "!oneOf", + "!regex", + "!startsWith", + "after", + "before", + "contains", + "containsAllOf", + "containsAnyOf", + "containsNoneOf", + "endsWith", + "eq", + "ex", + "gt", + "gte", + "lt", + "lte", + "oneOf", + "regex", + "startsWith" + ] + } + }, + "required": [ + "cmp", + "lhs" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "conditions", + "id", + "outcome" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "active", + "fallthrough", + "pausedOutcome", + "rules" + ], + "type": "object" + }, + "type": "object" + }, + "kind": { + "type": "string", + "enum": [ + "boolean", + "json", + "number", + "string" + ] + }, + "revision": { + "type": "number" + }, + "seed": { + "type": "number" + }, + "state": { + "type": "string", + "enum": [ + "active", + "archived" + ] + }, + "maintainerIds": { + "items": { + "type": "string" + }, + "type": "array" + }, + "permanent": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "tags": { + "items": { + "type": "string" + }, + "type": "array" + }, + "slug": { + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "updatedAt": { + "type": "number" + }, + "updatedBy": { + "type": "string" + }, + "createdBy": { + "type": "string" + }, + "ownerId": { + "type": "string" + }, + "projectId": { + "type": "string" + }, + "typeName": { + "type": "string", + "enum": [ + "flag" + ] + }, + "metadata": { + "properties": { + "creator": { + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + } + }, + "required": [ + "id", + "name" + ], + "type": "object" + } + }, + "type": "object" + } + }, + "required": [ + "createdAt", + "createdBy", + "environments", + "id", + "kind", + "ownerId", + "projectId", + "revision", + "seed", + "slug", + "state", + "typeName", + "updatedAt", + "variants" + ], + "type": "object" + }, + "MarketplaceFlag": { + "properties": { + "typeName": { + "type": "string", + "enum": [ + "marketplaceFlag" + ] + }, + "id": { + "type": "string" + }, + "externalId": { + "type": "string" + }, + "slug": { + "type": "string" + }, + "origin": { + "type": "string" + }, + "ownerId": { + "type": "string" + }, + "projectId": { + "type": "string" + }, + "resourceId": { + "type": "string" + }, + "integrationConfigurationId": { + "type": "string" + }, + "state": { + "type": "string", + "enum": [ + "active", + "archived" + ] + }, + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "category": { + "type": "string", + "enum": [ + "experiment", + "flag" + ] + }, + "createdAt": { + "type": "number" + }, + "updatedAt": { + "type": "number" + } + }, + "required": [ + "externalId", + "id", + "integrationConfigurationId", + "origin", + "ownerId", + "projectId", + "resourceId", + "slug", + "state", + "typeName" + ], + "type": "object" + }, + "Segment": { + "properties": { + "description": { + "type": "string" + }, + "createdBy": { + "type": "string" + }, + "usedByFlags": { + "items": { + "type": "string" + }, + "type": "array" + }, + "usedBySegments": { + "items": { + "type": "string" + }, + "type": "array" + }, + "data": { + "properties": { + "rules": { + "items": { + "properties": { + "id": { + "type": "string" + }, + "outcome": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "all" + ] + } + }, + "required": [ + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "split" + ] + }, + "base": { + "properties": { + "type": { + "type": "string", + "enum": [ + "entity" + ] + }, + "kind": { + "type": "string" + }, + "attribute": { + "type": "string" + } + }, + "required": [ + "attribute", + "kind", + "type" + ], + "type": "object" + }, + "passPromille": { + "type": "number" + } + }, + "required": [ + "base", + "passPromille", + "type" + ], + "type": "object" + } + ] + }, + "conditions": { + "items": { + "properties": { + "rhs": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "list", + "list/inline" + ] + }, + "items": { + "items": { + "oneOf": [ + { + "properties": { + "label": { + "type": "string" + }, + "note": { + "type": "string" + }, + "value": { + "type": "number" + } + }, + "required": [ + "value" + ], + "type": "object" + }, + { + "properties": { + "label": { + "type": "string" + }, + "note": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "required": [ + "value" + ], + "type": "object" + } + ] + }, + "type": "array" + } + }, + "required": [ + "items", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "regex" + ] + }, + "pattern": { + "type": "string" + }, + "flags": { + "type": "string" + } + }, + "required": [ + "flags", + "pattern", + "type" + ], + "type": "object" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + } + ] + }, + "cmpOptions": { + "properties": { + "ignoreCase": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "type": "object" + }, + "lhs": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "segment" + ] + } + }, + "required": [ + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "entity" + ] + }, + "kind": { + "type": "string" + }, + "attribute": { + "type": "string" + } + }, + "required": [ + "attribute", + "kind", + "type" + ], + "type": "object" + } + ] + }, + "cmp": { + "type": "string", + "enum": [ + "!contains", + "!endsWith", + "!eq", + "!ex", + "!oneOf", + "!regex", + "!startsWith", + "after", + "before", + "contains", + "containsAllOf", + "containsAnyOf", + "containsNoneOf", + "endsWith", + "eq", + "ex", + "gt", + "gte", + "lt", + "lte", + "oneOf", + "regex", + "startsWith" + ] + } + }, + "required": [ + "cmp", + "lhs" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "conditions", + "id", + "outcome" + ], + "type": "object" + }, + "type": "array" + }, + "include": { + "additionalProperties": { + "additionalProperties": { + "items": { + "properties": { + "note": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "required": [ + "value" + ], + "type": "object" + }, + "type": "array" + }, + "type": "object" + }, + "type": "object" + }, + "exclude": { + "additionalProperties": { + "additionalProperties": { + "items": { + "properties": { + "note": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "required": [ + "value" + ], + "type": "object" + }, + "type": "array" + }, + "type": "object" + }, + "type": "object" + } + }, + "type": "object" + }, + "id": { + "type": "string" + }, + "label": { + "type": "string" + }, + "slug": { + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "updatedAt": { + "type": "number" + }, + "projectId": { + "type": "string" + }, + "typeName": { + "type": "string", + "enum": [ + "segment" + ] + }, + "hint": { + "type": "string" + }, + "metadata": { + "properties": { + "creator": { + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + } + }, + "required": [ + "id", + "name" + ], + "type": "object" + } + }, + "type": "object" + } + }, + "required": [ + "createdAt", + "data", + "hint", + "id", + "label", + "projectId", + "slug", + "typeName", + "updatedAt" + ], + "type": "object" + }, + "FlagsSdkKeyWithSecrets": { + "properties": { + "hashKey": { + "type": "string" + }, + "projectId": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "client", + "mobile", + "server" + ] + }, + "environment": { + "type": "string" + }, + "createdBy": { + "type": "string" + }, + "createdAt": { + "type": "number" + }, + "updatedAt": { + "type": "number" + }, + "label": { + "type": "string" + }, + "deletedAt": { + "type": "number" + }, + "partialKeyValue": { + "type": "string", + "description": "Partially-masked representation of the SDK key value, safe to display in UIs. The value is the `vf_\u003ctype\u003e_` prefix followed by the first 3 characters of the secret portion and a fixed 8-character `*` mask (e.g. `vf_server_abc********`)." + }, + "keyValue": { + "type": "string", + "description": "Cleartext value of the SDK key." + }, + "tokenValue": { + "type": "string", + "description": "Cleartext value of the Global Config token, when the project has a Global Config connection." + } + }, + "required": [ + "createdAt", + "createdBy", + "environment", + "hashKey", + "keyValue", + "partialKeyValue", + "projectId", + "type", + "updatedAt" + ], + "type": "object", + "description": "Representation of a Flags SDK key returned by CREATE. Includes cleartext secrets (`keyValue`, `tokenValue`, `connectionString`) which are only ever disclosed once, on creation." + }, + "APIKey": { + "description": "Information about the newly created API key.", + "type": "object", + "properties": { + "id": { + "description": "The unique identifier of the API key.", + "example": "5d9f2ebd38ddca62e5d51e9c1704c72530bdc8bfdd41e782a6687c48399e8391", + "type": "string" + }, + "name": { + "description": "The human-readable name of the API key.", + "example": "API Key for AI Gateway", + "type": "string" + }, + "partialKey": { + "description": "The last few characters of the API key string, for helping identify the API key.", + "example": "t7V", + "type": "string" + }, + "teamId": { + "description": "The ID of the team that the API key grants access to.", + "example": "team_123a6c5209bc3778245d011443644c8d27dc2c50", + "type": "string" + }, + "purpose": { + "description": "The API key's purpose, i.e. what resources it can be used with.", + "example": "ai-gateway", + "type": "string" + }, + "projectId": { + "description": "The ID of the project that this API key grants access to.\n\nWhen this is unset, the API key grants access to all projects in the team.", + "example": "prj_12HKQaOmR5t5Uy6vdcQsNIiZgHGB", + "type": "string", + "nullable": true + }, + "expiresAt": { + "description": "Timestamp (in milliseconds) of when the API key expires.", + "example": 1632816536002, + "type": "number", + "nullable": true + }, + "activeAt": { + "description": "Timestamp (in milliseconds) of when the API key was most recently used.", + "example": 1632816536002, + "type": "number" + }, + "createdAt": { + "description": "Timestamp (in milliseconds) of when the API key was created.", + "example": 1632816536002, + "type": "number" + }, + "createdBy": { + "description": "The ID of the user who created the API key.", + "example": "ZspSRT4ljIEEmMHgoDwKWDei", + "type": "string" + }, + "leakedAt": { + "description": "Timestamp (in milliseconds) of when the API key was marked as leaked.", + "example": 1632816536002, + "type": "number", + "nullable": true + }, + "leakedUrl": { + "description": "URL where the API key was discovered as leaked.", + "type": "string", + "nullable": true + }, + "createdByAppId": { + "description": "The ID of the app that created the API key, if any", + "type": "string", + "nullable": true + }, + "quota": { + "$ref": "#/components/schemas/APIKeyQuota" + }, + "metadata": { + "description": "Generic metadata attached to the API key.\n\nThe accepted shape depends on the key's `purpose` and is validated when the key is created. For `ai-gateway` keys this carries `environment` and `spendAttribution`.", + "type": "object", + "patternProperties": { + "^(.*)$": {} + } + } + }, + "required": [ + "id", + "name", + "partialKey", + "teamId", + "purpose", + "projectId", + "expiresAt", + "activeAt", + "createdAt", + "createdBy", + "leakedAt", + "leakedUrl", + "createdByAppId" + ] + }, + "APIKeyQuota": { + "description": "AI Gateway quota associated with an API key.", + "type": "object", + "properties": { + "quotaEntityId": { + "description": "The unique identifier for the quota.", + "type": "string" + }, + "limitAmount": { + "description": "The quota limit amount.", + "type": "number" + }, + "currentSpend": { + "description": "The current amount spent against the quota.", + "type": "number" + }, + "currentByokSpend": { + "description": "The current BYOK spend (tracked separately).", + "type": "number" + }, + "includeByokInQuota": { + "description": "Whether BYOK (Bring Your Own Key) spend counts against the quota.", + "type": "boolean" + }, + "refreshPeriod": { + "description": "How often the quota refreshes.", + "anyOf": [ + { + "type": "string" + }, + { + "type": "string" + }, + { + "type": "string" + }, + { + "type": "string" + } + ] + }, + "active": { + "description": "Whether the quota is currently active.", + "type": "boolean" + }, + "archived": { + "description": "Whether the quota has been archived.", + "type": "boolean" + }, + "alertThresholds": { + "description": "Spend percentages (a subset of [50, 75, 100]) at which to send a spend alert. Empty or undefined disables alerts.", + "type": "array", + "items": { + "type": "number" + } + }, + "createdAt": { + "description": "Timestamp (in milliseconds) of when the quota was created.", + "type": "number" + }, + "updatedAt": { + "description": "Timestamp (in milliseconds) of when the quota was last updated.", + "type": "number" + } + }, + "required": [ + "quotaEntityId", + "limitAmount", + "currentSpend", + "currentByokSpend", + "includeByokInQuota", + "refreshPeriod", + "active", + "archived", + "createdAt", + "updatedAt" + ] + }, + "ACLAction": { + "type": "string", + "enum": [ + "create", + "delete", + "list", + "read", + "update" + ], + "description": "Enum containing the actions that can be performed against a resource. Group operations are included." + }, + "NamedSandbox": { + "properties": { + "name": { + "type": "string", + "description": "The unique identifier of the sandbox.", + "example": "my-sandbox" + }, + "currentSnapshotId": { + "type": "string", + "description": "Current snapshot ID that the named sandbox is pointing to." + }, + "currentSessionId": { + "type": "string", + "description": "Current session ID the sandbox is pointing to." + }, + "status": { + "type": "string", + "enum": [ + "running", + "stopped", + "stopping" + ], + "description": "The status of the current sandbox.", + "example": "running" + }, + "statusUpdatedAt": { + "type": "number", + "description": "The time when the sandbox status was last updated, in milliseconds since the epoch.", + "example": 1750344501629 + }, + "persistent": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether the sandbox persists its state across restarts via automatic snapshots.", + "example": true + }, + "region": { + "type": "string", + "description": "The region the sandbox is pinned to: the region stored on the sandbox, otherwise the platform default. Where a running session actually landed is reported by `session.region`.", + "example": "iad1" + }, + "failoverRegions": { + "items": { + "type": "string", + "enum": [ + "arn1", + "bom1", + "cdg1", + "cle1", + "cpt1", + "dub1", + "fra1", + "gru1", + "hkg1", + "hnd1", + "iad1", + "icn1", + "kix1", + "lhr1", + "pdx1", + "sfo1", + "sin1", + "syd1", + "yul1" + ], + "description": "The regions the sandbox fails over to. Empty when it does not fail over.", + "example": [ + "sfo1", + "cle1" + ] + }, + "type": "array", + "description": "The regions the sandbox fails over to. Empty when it does not fail over.", + "example": [ + "sfo1", + "cle1" + ] + }, + "vcpus": { + "type": "number", + "description": "Number of virtual CPUs allocated.", + "example": 2 + }, + "memory": { + "type": "number", + "description": "Memory allocated in MB.", + "example": 1024 + }, + "runtime": { + "type": "string", + "description": "Runtime identifier.", + "example": "node22" + }, + "image": { + "type": "string", + "description": "Digest-pinned reference of the container image the sandbox was created from, when it was created from an image (\"{repository}@{manifestDigest}\").", + "example": "my-repo@sha256:2c4e8f9a1b3d5e7f091a2b3c4d5e6f708192a3b4c5d6e7f8091a2b3c4d5e6f708" + }, + "timeout": { + "type": "number", + "description": "Timeout in milliseconds.", + "example": 300000 + }, + "snapshotExpiration": { + "type": "number", + "description": "Default snapshot expiration time in milliseconds. 0 means no expiration.", + "example": 604800000 + }, + "keepLastSnapshots": { + "properties": { + "count": { + "type": "number", + "description": "Number of most recent snapshots to keep.", + "example": 5 + }, + "expiration": { + "type": "number", + "description": "Expiration time in milliseconds for kept snapshots.", + "example": 604800000 + }, + "deleteEvicted": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether to immediately delete evicted snapshots.", + "example": true + } + }, + "required": [ + "count", + "deleteEvicted" + ], + "type": "object", + "description": "Keep-last snapshot configuration." + }, + "networkPolicy": { + "properties": { + "mode": { + "type": "string", + "enum": [ + "allow-all", + "custom", + "default-allow", + "default-deny", + "deny-all" + ] + }, + "allowedDomains": { + "items": { + "type": "string" + }, + "type": "array" + }, + "allowedCIDRs": { + "items": { + "type": "string" + }, + "type": "array" + }, + "deniedCIDRs": { + "items": { + "type": "string" + }, + "type": "array" + }, + "s3Key": { + "type": "string" + } + }, + "required": [ + "mode" + ], + "type": "object", + "description": "Network policy configuration." + }, + "networkId": { + "type": "string", + "description": "The Connect network id for the target Secure Compute private network." + }, + "totalEgressBytes": { + "type": "number", + "description": "Cumulative egress bytes across all sandbox runs.", + "example": 4096 + }, + "totalIngressBytes": { + "type": "number", + "description": "Cumulative ingress bytes across all sandbox runs.", + "example": 2048 + }, + "totalActiveCpuDurationMs": { + "type": "number", + "description": "Cumulative active CPU duration in milliseconds across all sandbox runs.", + "example": 5000 + }, + "totalDurationMs": { + "type": "number", + "description": "Cumulative wall-clock duration in milliseconds across all sandbox runs.", + "example": 60000 + }, + "cwd": { + "type": "string", + "description": "The working directory of the sandbox.", + "example": "/vercel/sandbox" + }, + "tags": { + "additionalProperties": { + "type": "string" + }, + "type": "object", + "description": "Key-value tags attached to the named sandbox.", + "example": { + "team": "hive", + "user": "bob" + } + }, + "mounts": { + "additionalProperties": { + "properties": { + "drive": { + "type": "string" + }, + "mode": { + "type": "string", + "enum": [ + "read-only", + "read-write", + "snapshot" + ] + } + }, + "required": [ + "drive" + ], + "type": "object", + "description": "Key-value pairs of mount path and drive." + }, + "type": "object", + "description": "Key-value pairs of mount path and drive." + }, + "createdAt": { + "type": "number", + "description": "The time when the named sandbox was created, in milliseconds since the epoch.", + "example": 1750344501629 + }, + "updatedAt": { + "type": "number", + "description": "The time when the named sandbox was last updated, in milliseconds since the epoch.", + "example": 1750344501629 + }, + "expiresAt": { + "type": "number", + "description": "The time at which the currently running sandbox will time out, in milliseconds since the epoch. Only present while a session is running.", + "example": 1750344801629 + } + }, + "required": [ + "createdAt", + "currentSessionId", + "name", + "persistent", + "status", + "statusUpdatedAt", + "updatedAt" + ], + "type": "object", + "description": "This object contains information related to a Vercel NamedSandbox." + }, + "SandboxInjectionRule": { + "properties": { + "domain": { + "type": "string", + "description": "The domain (or pattern) that this injection rule applies to. Supports wildcards like *.vercel.com.", + "example": "api.vercel.com" + }, + "headerNames": { + "items": { + "type": "string" + }, + "type": "array", + "description": "The names of HTTP headers that have value that will be injected for requests to this domain.", + "example": [ + "Authorization", + "X-API-Key" + ] + } + }, + "required": [ + "domain" + ], + "type": "object", + "description": "HTTP header injection rules for outgoing requests matching specific domains." + }, + "SandboxNetworkPolicy": { + "properties": { + "mode": { + "type": "string", + "enum": [ + "allow-all", + "custom", + "deny-all" + ], + "description": "The network policy mode. - 'allow-all': All traffic is allowed. - 'deny-all': All traffic is blocked. - 'custom': Traffic is controlled by explicit allow/deny rules.", + "example": "custom" + }, + "allowedDomains": { + "items": { + "type": "string" + }, + "type": "array", + "description": "List of domain names the sandbox is allowed to connect to. Supports wildcard patterns (e.g., \"*.vercel.com\" matches all subdomains).", + "example": [ + "api.vercel.com", + "*.example.com" + ] + }, + "allowedCIDRs": { + "items": { + "type": "string" + }, + "type": "array", + "description": "List of IP address ranges (in CIDR notation) the sandbox is allowed to connect to.", + "example": [ + "10.0.0.0/8" + ] + }, + "deniedCIDRs": { + "items": { + "type": "string" + }, + "type": "array", + "description": "List of IP address ranges (in CIDR notation) the sandbox is blocked from connecting to. These rules take precedence over all allowed rules.", + "example": [ + "10.0.0.0/8" + ] + }, + "injectionRules": { + "items": { + "$ref": "#/components/schemas/SandboxInjectionRule" + }, + "type": "array", + "description": "HTTP header injection rules for outgoing requests matching specific domains." + } + }, + "required": [ + "mode" + ], + "type": "object", + "description": "The network policy applied to this sandbox, if any." + }, + "Session": { + "properties": { + "sourceSandboxName": { + "type": "string", + "description": "The name of the source sandbox.", + "example": "my-sandbox" + }, + "projectId": { + "type": "string", + "description": "The unique identifier of the project associated with this session.", + "example": "prj_123a6c5209bc3778245d011443644c8d27dc2c50" + }, + "id": { + "type": "string", + "description": "The unique identifier of the sandbox.", + "example": "sbx_123a6c5209bc3778245d011443644c8d27dc2c50" + }, + "memory": { + "type": "number", + "description": "Memory allocated to this sandbox in MB.", + "example": 2048 + }, + "vcpus": { + "type": "number", + "description": "Number of vCPUs allocated to this sandbox.", + "example": 2 + }, + "region": { + "type": "string", + "description": "The region where the sandbox is hosted.", + "example": "iad1" + }, + "runtime": { + "type": "string", + "description": "The runtime of the sandbox.", + "example": "node22" + }, + "timeout": { + "type": "number", + "description": "The maximum amount of time the sandbox will run for in milliseconds.", + "example": 3600000 + }, + "status": { + "type": "string", + "enum": [ + "aborted", + "failed", + "pending", + "running", + "snapshotting", + "stopped", + "stopping" + ], + "description": "The status of the sandbox.", + "example": "running" + }, + "requestedAt": { + "type": "number", + "description": "The time when the sandbox was requested, in milliseconds since the epoch.", + "example": 1750344501629 + }, + "startedAt": { + "type": "number", + "description": "The time when the sandbox was started, in milliseconds since the epoch.", + "example": 1750344501629 + }, + "cwd": { + "type": "string", + "description": "The working directory of the sandbox.", + "example": "/vercel/sandbox" + }, + "requestedStopAt": { + "type": "number", + "description": "The time when the sandbox was requested to stop, in milliseconds since the epoch.", + "example": 1750344501629 + }, + "stoppedAt": { + "type": "number", + "description": "The time when the sandbox was stopped, in milliseconds since the epoch.", + "example": 1750344501629 + }, + "abortedAt": { + "type": "number", + "description": "The time when the sandbox was aborted, in milliseconds since the epoch.", + "example": 1750344501629 + }, + "duration": { + "type": "number", + "description": "The duration of the sandbox in milliseconds.", + "example": 3600000 + }, + "sourceSnapshotId": { + "type": "string", + "description": "The unique identifier of the snapshot associated with this sandbox, if any.", + "example": "snap_123a6c5209bc3778245d011443644c8d27dc2c50" + }, + "snapshottedAt": { + "type": "number", + "description": "The time when a snapshot was requested, in milliseconds since the epoch.", + "example": 1750344501629 + }, + "createdAt": { + "type": "number", + "description": "The time when the sandbox was created, in milliseconds since the epoch.", + "example": 1750344501629 + }, + "updatedAt": { + "type": "number", + "description": "The last time the sandbox was updated, in milliseconds since the epoch.", + "example": 1750344501629 + }, + "networkPolicy": { + "$ref": "#/components/schemas/SandboxNetworkPolicy" + }, + "activeCpuDurationMs": { + "type": "number", + "description": "The amount of CPU time the sandbox consumed, if available, in milliseconds. This value is only available once the sandbox is stopped, and only if it stopped successfully.", + "example": 42 + }, + "networkTransfer": { + "properties": { + "ingress": { + "type": "number" + }, + "egress": { + "type": "number" + } + }, + "required": [ + "egress", + "ingress" + ], + "type": "object", + "description": "The quantity of data transfered to and from the sandbox, in bytes. This value is only available once the sandbox is stopped, and only if it stopped successfully.", + "example": { + "in": 12543852, + "out": 15368 + } + } + }, + "required": [ + "createdAt", + "cwd", + "id", + "memory", + "projectId", + "region", + "requestedAt", + "runtime", + "sourceSandboxName", + "status", + "timeout", + "updatedAt", + "vcpus" + ], + "type": "object", + "description": "This object contains information related to a Vercel Sandbox Session. v2 endpoints return \"session\" instead of \"sandbox\" as the response wrapper key." + }, + "SandboxPublicRoute": { + "properties": { + "url": { + "type": "string", + "description": "A public URL to access the corresponding port in the Sandbox." + }, + "port": { + "type": "number", + "description": "The user port number that the route is mapped to." + }, + "subdomain": { + "type": "string", + "description": "The subdomain assigned to this route." + }, + "system": { + "type": "boolean", + "enum": [ + true + ], + "description": "Whether the route is reserved by the system (e.g. for internal use)." + } + }, + "required": [ + "port", + "subdomain", + "url" + ], + "type": "object", + "description": "This object represents a public route in a Vercel Sandbox." + }, + "Drive": { + "properties": { + "id": { + "type": "string", + "description": "The unique drive ID.", + "example": "drive_abc123" + }, + "name": { + "type": "string", + "description": "The unique drive name within the project.", + "example": "workspace" + }, + "projectId": { + "type": "string", + "description": "The project that owns the drive.", + "example": "prj_abc123" + }, + "maxSizeBytes": { + "type": "number", + "description": "The maximum drive size in bytes.", + "example": 1099511627776 + }, + "region": { + "type": "string", + "description": "The region where the drive is stored.", + "example": "iad1" + }, + "currentSessionId": { + "type": "string", + "description": "Current session ID the drive is attached to, if any.", + "example": "sbx_123" + }, + "currentSandboxName": { + "type": "string", + "description": "Current sandbox name the drive is attached to, if any.", + "example": "my-sandbox" + }, + "createdAt": { + "type": "number", + "description": "The time when the drive was created, in milliseconds since the epoch.", + "example": 1750344501629 + }, + "updatedAt": { + "type": "number", + "description": "The last time the drive was updated, in milliseconds since the epoch.", + "example": 1750344501629 + } + }, + "required": [ + "createdAt", + "id", + "maxSizeBytes", + "name", + "projectId", + "region", + "updatedAt" + ], + "type": "object", + "description": "This object contains information related to a Vercel Sandbox Drive." + }, + "Snapshot": { + "properties": { + "id": { + "type": "string", + "description": "The unique identifier of the snapshot.", + "example": "snap_123a6c5209bc3778245d011443644c8d27dc2c50" + }, + "sourceSessionId": { + "type": "string", + "description": "The unique identifier of the session from which the snapshot was created.", + "example": "sbx_123a6c5209bc3778245d011443644c8d27dc2c50" + }, + "region": { + "type": "string", + "description": "The region where the snapshot is stored.", + "example": "iad1" + }, + "regions": { + "items": { + "type": "string" + }, + "type": "array", + "description": "The regions where the snapshot is available.", + "example": [ + "iad1", + "sfo1" + ] + }, + "status": { + "type": "string", + "enum": [ + "created", + "deleted", + "failed" + ], + "description": "The status of the snapshot.", + "example": "created" + }, + "sizeBytes": { + "type": "number", + "description": "The size of the snapshot in bytes.", + "example": 104857600 + }, + "expiresAt": { + "type": "number", + "description": "The time when the snapshot will expire, in milliseconds since the epoch. If not set, the snapshot does not have any expiration.", + "example": 1750344501629 + }, + "createdAt": { + "type": "number", + "description": "The time when the snapshot was created, in milliseconds since the epoch.", + "example": 1750344501629 + }, + "updatedAt": { + "type": "number", + "description": "The last time the snapshot was updated, in milliseconds since the epoch.", + "example": 1750344501629 + }, + "lastUsedAt": { + "type": "number", + "description": "The last time the snapshot was used (e.g. to resume or create a sandbox), in milliseconds since the epoch. Falls back to `createdAt` for older snapshots that predate this field.", + "example": 1750344501629 + }, + "creationMethod": { + "type": "string", + "enum": [ + "automatic", + "manual" + ], + "description": "The method used to create the snapshot.", + "example": "manual" + }, + "parentId": { + "type": "string", + "description": "The unique identifier of the parent snapshot, if this snapshot was created from another snapshot.", + "example": "snap_parent123" + } + }, + "required": [ + "createdAt", + "id", + "lastUsedAt", + "sizeBytes", + "sourceSessionId", + "status", + "updatedAt" + ], + "type": "object", + "description": "This object contains information related to a Snapshot of a Vercel Sandbox session (v2 API)." + }, + "SessionCommand": { + "properties": { + "id": { + "type": "string", + "description": "The ID of the command.", + "example": "cmd_123a6c5209bc3778245d011443644c8d27dc2c50" + }, + "name": { + "type": "string", + "description": "The name of the command.", + "example": "npm" + }, + "args": { + "items": { + "type": "string" + }, + "type": "array", + "description": "The arguments of the command.", + "example": [ + "run", + "build" + ] + }, + "cwd": { + "type": "string", + "description": "The current working directory of the command.", + "example": "/vercel/sandbox" + }, + "sessionId": { + "type": "string", + "description": "The ID of the session associated with the command.", + "example": "sbx_123a6c5209bc3778245d011443644c8d27dc2c50" + }, + "exitCode": { + "nullable": true, + "type": "number", + "description": "If the command did finish, the exit code.", + "example": 0 + }, + "startedAt": { + "type": "number", + "description": "When the command was started, in milliseconds since the epoch.", + "example": 1673123456789 + }, + "durationMs": { + "type": "number", + "description": "Duration of the command execution in milliseconds.", + "example": 1234 + } + }, + "required": [ + "args", + "cwd", + "exitCode", + "id", + "name", + "sessionId", + "startedAt" + ], + "type": "object", + "description": "This object represents a command run in a Vercel Sandbox session (v2 API)." + }, + "InvitedTeamMember": { + "properties": { + "uid": { + "type": "string", + "description": "The ID of the invited user", + "example": "kr1PsOIzqEL5Xg6M4VZcZosf" + }, + "username": { + "type": "string", + "description": "The username of the invited user", + "example": "john-doe" + }, + "email": { + "type": "string", + "description": "The email of the invited user.", + "example": "john@user.co" + }, + "role": { + "type": "string", + "enum": [ + "BILLING", + "CONTRIBUTOR", + "DEVELOPER", + "MEMBER", + "OWNER", + "SECURITY", + "VIEWER", + "VIEWER_FOR_PLUS" + ], + "description": "The role used for the invitation", + "example": "MEMBER" + }, + "teamRoles": { + "items": { + "type": "string", + "enum": [ + "BILLING", + "CONTRIBUTOR", + "DEVELOPER", + "MEMBER", + "OWNER", + "SECURITY", + "VIEWER", + "VIEWER_FOR_PLUS" + ], + "description": "The team roles of the user", + "example": [ + "MEMBER" + ] + }, + "type": "array", + "description": "The team roles of the user", + "example": [ + "MEMBER" + ] + }, + "teamPermissions": { + "items": { + "type": "string", + "enum": [ + "AiGatewayApiKeyOwnedBySelf", + "AiGatewayBudgetManager", + "AiGatewayCredits", + "AiGatewaySettings", + "AiGatewayTranscriptsManager", + "AiGatewayTranscriptsViewer", + "ConnectorManager", + "CreateProject", + "EnvVariableManager", + "EnvironmentManager", + "FullProductionDeployment", + "IntegrationManager", + "OrgAdmin", + "OrgViewer", + "UsageViewer", + "V0Builder", + "V0Chatter", + "V0Viewer", + "WorkflowDecryptor" + ], + "description": "The team permissions of the user", + "example": [ + "CreateProject" + ] + }, + "type": "array", + "description": "The team permissions of the user", + "example": [ + "CreateProject" + ] + } + }, + "required": [ + "email", + "role", + "uid", + "username" + ], + "type": "object", + "description": "The member was successfully added to the team." + }, + "Team": { + "properties": { + "connect": { + "properties": { + "enabled": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "type": "object" + }, + "creatorId": { + "type": "string", + "description": "The ID of the user who created the Team.", + "example": "R6efeCJQ2HKXywuasPDc0fOWB" + }, + "updatedAt": { + "type": "number", + "description": "Timestamp (in milliseconds) of when the Team was last updated.", + "example": 1611796915677 + }, + "emailDomain": { + "nullable": true, + "type": "string", + "description": "Hostname that'll be matched with emails on sign-up to automatically join the Team.", + "example": "example.com" + }, + "saml": { + "properties": { + "connection": { + "properties": { + "type": { + "type": "string", + "description": "The Identity Provider \"type\", for example Okta.", + "example": "OktaSAML" + }, + "state": { + "type": "string", + "description": "Current state of the connection.", + "example": "active" + }, + "connectedAt": { + "type": "number", + "description": "Timestamp (in milliseconds) of when the configuration was connected.", + "example": 1611796915677 + }, + "lastReceivedWebhookEvent": { + "type": "number", + "description": "Timestamp (in milliseconds) of when the last webhook event was received from WorkOS.", + "example": 1611796915677 + }, + "lastSyncedAt": { + "type": "number", + "description": "Timestamp (in milliseconds) of when the last directory sync was performed.", + "example": 1611796915677 + }, + "syncState": { + "type": "string", + "enum": [ + "ACTIVE", + "SETUP" + ], + "description": "Controls whether directory sync events are processed. - 'SETUP': Directory connected but role mappings not yet configured. Events are acknowledged but not processed. - 'ACTIVE': Fully configured. Events are processed normally. - undefined: Legacy directory (pre-feature), treat as 'ACTIVE' for backwards compatibility." + }, + "status": { + "type": "string" + } + }, + "required": [ + "connectedAt", + "state", + "status", + "type" + ], + "type": "object", + "description": "Information for the SAML Single Sign-On configuration." + }, + "directory": { + "properties": { + "type": { + "type": "string", + "description": "The Identity Provider \"type\", for example Okta.", + "example": "OktaSAML" + }, + "state": { + "type": "string", + "description": "Current state of the connection.", + "example": "active" + }, + "connectedAt": { + "type": "number", + "description": "Timestamp (in milliseconds) of when the configuration was connected.", + "example": 1611796915677 + }, + "lastReceivedWebhookEvent": { + "type": "number", + "description": "Timestamp (in milliseconds) of when the last webhook event was received from WorkOS.", + "example": 1611796915677 + }, + "lastSyncedAt": { + "type": "number", + "description": "Timestamp (in milliseconds) of when the last directory sync was performed.", + "example": 1611796915677 + }, + "syncState": { + "type": "string", + "enum": [ + "ACTIVE", + "SETUP" + ], + "description": "Controls whether directory sync events are processed. - 'SETUP': Directory connected but role mappings not yet configured. Events are acknowledged but not processed. - 'ACTIVE': Fully configured. Events are processed normally. - undefined: Legacy directory (pre-feature), treat as 'ACTIVE' for backwards compatibility." + } + }, + "required": [ + "connectedAt", + "state", + "type" + ], + "type": "object", + "description": "Information for the Directory Sync configuration." + }, + "enforced": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "When `true`, interactions with the Team **must** be done with an authentication token that has been authenticated with the Team's SAML Single Sign-On provider." + }, + "defaultRedirectUri": { + "type": "string", + "enum": [ + "v0.app", + "v0.dev", + "vercel.com" + ], + "description": "The default redirect URI to use after successful SAML authentication." + }, + "roles": { + "additionalProperties": { + "oneOf": [ + { + "properties": { + "accessGroupId": { + "type": "string" + } + }, + "required": [ + "accessGroupId" + ], + "type": "object", + "description": "When \"Directory Sync\" is configured, this object contains a mapping of which Directory Group (by ID) should be assigned to which Vercel Team \"role\"." + }, + { + "type": "string", + "enum": [ + "BILLING", + "CONTRIBUTOR", + "DEVELOPER", + "MEMBER", + "OWNER", + "SECURITY", + "VIEWER", + "VIEWER_FOR_PLUS" + ] + } + ] + }, + "type": "object", + "description": "When \"Directory Sync\" is configured, this object contains a mapping of which Directory Group (by ID) should be assigned to which Vercel Team \"role\"." + } + }, + "required": [ + "enforced" + ], + "type": "object", + "description": "When \"Single Sign-On (SAML)\" is configured, this object contains information regarding the configuration of the Identity Provider (IdP)." + }, + "inviteCode": { + "type": "string", + "description": "Code that can be used to join this Team. Only visible to Team owners.", + "example": "hasihf9e89" + }, + "billing": { + "nullable": true, + "properties": { + "plan": { + "type": "string", + "enum": [ + "enterprise", + "hobby", + "pro" + ] + } + }, + "required": [ + "plan" + ], + "type": "object", + "description": "The team's billing plan." + }, + "description": { + "nullable": true, + "type": "string", + "description": "A short description of the Team.", + "example": "Our mission is to make cloud computing accessible to everyone." + }, + "defaultRoles": { + "properties": { + "teamRoles": { + "items": { + "type": "string", + "enum": [ + "BILLING", + "CONTRIBUTOR", + "DEVELOPER", + "MEMBER", + "OWNER", + "SECURITY", + "VIEWER", + "VIEWER_FOR_PLUS" + ] + }, + "type": "array" + }, + "teamPermissions": { + "items": { + "type": "string", + "enum": [ + "AiGatewayApiKeyOwnedBySelf", + "AiGatewayBudgetManager", + "AiGatewayCredits", + "AiGatewaySettings", + "AiGatewayTranscriptsManager", + "AiGatewayTranscriptsViewer", + "ConnectorManager", + "CreateProject", + "EnvVariableManager", + "EnvironmentManager", + "FullProductionDeployment", + "IntegrationManager", + "OrgAdmin", + "OrgViewer", + "UsageViewer", + "V0Builder", + "V0Chatter", + "V0Viewer", + "WorkflowDecryptor" + ] + }, + "type": "array" + } + }, + "type": "object", + "description": "Default roles for the team." + }, + "stagingPrefix": { + "type": "string", + "description": "The prefix that is prepended to automatic aliases." + }, + "resourceConfig": { + "properties": { + "concurrentBuilds": { + "type": "number", + "description": "The total amount of concurrent builds that can be used." + }, + "elasticConcurrencyEnabled": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether every build for this team / user has elastic concurrency enabled automatically." + }, + "edgeConfigSize": { + "type": "number", + "description": "The maximum size in kilobytes of an Edge Config. Only specified if a custom limit is set." + }, + "edgeConfigs": { + "type": "number", + "description": "The maximum number of edge configs an account can create." + }, + "kvDatabases": { + "type": "number", + "description": "The maximum number of kv databases an account can create." + }, + "blobStores": { + "type": "number", + "description": "The maximum number of blob stores an account can create." + }, + "postgresDatabases": { + "type": "number", + "description": "The maximum number of postgres databases an account can create." + }, + "customEnvironmentsPerProject": { + "type": "number", + "description": "The maximum number of custom environments allowed per project." + }, + "serverlessFunctionMaxMemorySize": { + "type": "number", + "description": "The maximum memory size (in MB) for a serverless function. Only specified if a custom limit is set." + }, + "buildEntitlements": { + "properties": { + "enhancedBuilds": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "type": "object" + }, + "buildMachine": { + "properties": { + "default": { + "type": "string", + "enum": [ + "basic", + "elastic", + "enhanced", + "standard", + "turbo" + ], + "description": "Default build machine type for new builds" + } + }, + "type": "object", + "description": "Build machine configuration" + } + }, + "type": "object" + }, + "previewDeploymentSuffix": { + "nullable": true, + "type": "string", + "description": "The hostname that is current set as preview deployment suffix.", + "example": "example.dev" + }, + "platform": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether the team is a platform team.", + "example": true + }, + "disableHardAutoBlocks": { + "oneOf": [ + { + "type": "number" + }, + { + "type": "boolean", + "enum": [ + false, + true + ] + } + ] + }, + "remoteCaching": { + "properties": { + "enabled": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "type": "object", + "description": "Is remote caching enabled for this team" + }, + "defaultDeploymentProtection": { + "properties": { + "passwordProtection": { + "nullable": true, + "properties": { + "deploymentType": { + "type": "string" + } + }, + "required": [ + "deploymentType" + ], + "type": "object" + }, + "ssoProtection": { + "nullable": true, + "properties": { + "deploymentType": { + "type": "string" + } + }, + "required": [ + "deploymentType" + ], + "type": "object" + } + }, + "type": "object", + "description": "Default deployment protection for this team null indicates protection is disabled" + }, + "defaultPassport": { + "nullable": true, + "properties": { + "connectorId": { + "type": "string", + "description": "Default Passport configuration for new projects in this team." + }, + "deploymentType": { + "type": "string", + "enum": [ + "all", + "all_except_custom_domains", + "preview", + "prod_deployment_urls_and_all_previews" + ], + "description": "Default Passport configuration for new projects in this team." + } + }, + "required": [ + "connectorId", + "deploymentType" + ], + "type": "object", + "description": "Default Passport configuration for new projects in this team." + }, + "defaultExpirationSettings": { + "properties": { + "expirationDays": { + "type": "number", + "description": "Number of days to keep non-production deployments (mostly preview deployments) before soft deletion." + }, + "expirationDaysProduction": { + "type": "number", + "description": "Number of days to keep production deployments before soft deletion." + }, + "expirationDaysCanceled": { + "type": "number", + "description": "Number of days to keep canceled deployments before soft deletion." + }, + "expirationDaysErrored": { + "type": "number", + "description": "Number of days to keep errored deployments before soft deletion." + }, + "deploymentsToKeep": { + "type": "number", + "description": "Minimum number of production deployments to keep for this project, even if they are over the production expiration limit." + } + }, + "type": "object", + "description": "Default deployment expiration settings for this team" + }, + "defaultProjectJobs": { + "properties": { + "lint": { + "properties": { + "targets": { + "items": { + "type": "string" + }, + "type": "array", + "description": "Default job configuration applied to new projects created in this team." + } + }, + "required": [ + "targets" + ], + "type": "object", + "description": "Default job configuration applied to new projects created in this team." + }, + "typecheck": { + "properties": { + "targets": { + "items": { + "type": "string" + }, + "type": "array", + "description": "Default job configuration applied to new projects created in this team." + } + }, + "required": [ + "targets" + ], + "type": "object", + "description": "Default job configuration applied to new projects created in this team." + }, + "mfe-config-present": { + "properties": { + "targets": { + "items": { + "type": "string" + }, + "type": "array", + "description": "Default job configuration applied to new projects created in this team." + } + }, + "required": [ + "targets" + ], + "type": "object", + "description": "Default job configuration applied to new projects created in this team." + } + }, + "type": "object", + "description": "Default job configuration applied to new projects created in this team." + }, + "enablePreviewFeedback": { + "nullable": true, + "type": "string", + "enum": [ + "default", + "default-force", + "off", + "off-force", + "on", + "on-force", + null + ], + "description": "Whether toolbar is enabled on preview deployments" + }, + "enableProductionFeedback": { + "nullable": true, + "type": "string", + "enum": [ + "default", + "default-force", + "off", + "off-force", + "on", + "on-force", + null + ], + "description": "Whether toolbar is enabled on production deployments" + }, + "sensitiveEnvironmentVariablePolicy": { + "nullable": true, + "type": "string", + "enum": [ + "default", + "off", + "on", + null + ], + "description": "Sensitive environment variable policy for this team" + }, + "disjunctiveProductionSecretPolicy": { + "nullable": true, + "type": "string", + "enum": [ + "default", + "off", + "on", + null + ], + "description": "Require production secrets to use a different value than preview or development." + }, + "hideIpAddresses": { + "nullable": true, + "type": "boolean", + "enum": [ + false, + true, + null + ], + "description": "Indicates if IP addresses should be accessible in observability (o11y) tooling" + }, + "hideIpAddressesInLogDrains": { + "nullable": true, + "type": "boolean", + "enum": [ + false, + true, + null + ], + "description": "Indicates if IP addresses should be accessible in log drains" + }, + "dpAccessRequestsMode": { + "type": "string", + "enum": [ + "all", + "email-domain", + "none" + ], + "description": "Controls who can request access to protected deployments." + }, + "ipBuckets": { + "items": { + "properties": { + "bucket": { + "type": "string" + }, + "supportUntil": { + "type": "number" + }, + "default": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "bucket" + ], + "type": "object" + }, + "type": "array" + }, + "requireVerifiedCommits": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "When enabled, all projects in the team require commits to be signed and verified by the git provider before deployments will be created. Projects may override this via `project.gitProviderOptions.requireVerifiedCommits` (gated by `Project:Update`)." + }, + "disableRepositoryDispatchEvents": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Default for projects in the team. When `true`, projects in this team will not emit GitHub repository-dispatch events on deployment events unless the project explicitly overrides this setting via `project.gitProviderOptions.disableRepositoryDispatchEvents`." + }, + "strictDeploymentProtectionSettings": { + "properties": { + "enabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "updatedAt": { + "type": "number" + } + }, + "required": [ + "enabled", + "updatedAt" + ], + "type": "object", + "description": "When enabled, deployment protection settings require stricter permissions (owner-only)." + }, + "strictShareableLinks": { + "properties": { + "enabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "updatedAt": { + "type": "number" + } + }, + "required": [ + "enabled", + "updatedAt" + ], + "type": "object", + "description": "When enabled, creating shareable links requires Owner role." + }, + "strictPasswordProtectionSettings": { + "properties": { + "enabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "updatedAt": { + "type": "number" + } + }, + "required": [ + "enabled", + "updatedAt" + ], + "type": "object", + "description": "When enabled, adding, changing, or removing project password protection requires Owner role." + }, + "strictConnectors": { + "properties": { + "enabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "updatedAt": { + "type": "number" + } + }, + "required": [ + "enabled", + "updatedAt" + ], + "type": "object", + "description": "When enabled, creating and managing connectors requires Owner role or the ConnectorManager permission." + }, + "nsnbConfig": { + "properties": { + "preference": { + "type": "string", + "enum": [ + "auto-approval", + "block", + "manual-approval" + ] + } + }, + "required": [ + "preference" + ], + "type": "object", + "description": "NSNB configuration for the team." + }, + "deploymentPolicy": { + "properties": { + "gitSources": { + "items": { + "properties": { + "sources": { + "items": { + "oneOf": [ + { + "properties": { + "provider": { + "type": "string", + "enum": [ + "bitbucket", + "github" + ] + }, + "org": { + "type": "string" + }, + "repo": { + "type": "string" + } + }, + "required": [ + "org", + "provider" + ], + "type": "object", + "description": "Allowlist entry for GitHub and Bitbucket, whose repos are identified by a flat `org`/`repo` (Bitbucket's workspace/owner maps to `org`, its repo slug to `repo`). Omit `repo` to match any repo in the org. Org is matched case-insensitively." + }, + { + "properties": { + "provider": { + "type": "string", + "enum": [ + "gitlab" + ] + }, + "namespace": { + "type": "string" + }, + "project": { + "type": "string" + } + }, + "required": [ + "namespace", + "provider" + ], + "type": "object", + "description": "Allowlist entry for GitLab, which uses nested groups rather than a flat org/repo. `namespace` is the full group path (e.g. `group` or `group/subgroup`); `project` is the leaf project name. Omit `project` to match any project under the namespace. Namespace is matched case-insensitively." + } + ] + }, + "type": "array" + }, + "enabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "environments": { + "items": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "system" + ] + }, + "target": { + "type": "string", + "enum": [ + "preview", + "production" + ] + } + }, + "required": [ + "target", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "custom" + ] + }, + "environmentId": { + "type": "string" + } + }, + "required": [ + "environmentId", + "type" + ], + "type": "object" + } + ] + }, + "type": "array" + } + }, + "required": [ + "enabled", + "environments", + "sources" + ], + "type": "object", + "description": "`enabled: true` with empty `sources` is deny-all." + }, + "type": "array" + }, + "deploymentSources": { + "items": { + "properties": { + "sources": { + "items": { + "type": "string", + "enum": [ + "cli", + "deploy-hook", + "git", + "integration", + "rest-api", + "v0" + ], + "description": "Customer-configurable deployment sources. Every deploy classifies to exactly one. JSON schema in `packages/deployment-policy/schemas/body.ts` enumerates exactly these values. - `'git'` — git provider webhook. - `'cli'` — Vercel CLI (legacy classic-token CLI and SIWV CLI both). - `'rest-api'` — direct user/team-token REST upload. Does NOT cover deploy hooks, Marketplace integrations, or first-party app tokens. - `'deploy-hook'` — project deploy-hook URL. The URL is the credential. - `'integration'` — third-party Marketplace actor: Marketplace integration token, user-delegated OAuth from a Marketplace app, or an unrecognized third-party Vercel App. First-party Vercel Apps are never `'integration'`. - `'v0'` — the v0 product surface (entitlement-gated). v0 deploys through the CLI under the hood, but classifies as its own source so a team can allow or deny v0 independently of `'cli'`. First-party Vercel apps (Toolbar, etc.) classify as `'first-party'` — see `ClassifiedSource` in `./checks`. They're not in this union because they aren't customer-configurable; they bypass `checkDeploymentSources` entirely. v0 is intentionally NOT among them: like the CLI, it's a real product surface and is policy-controllable." + }, + "type": "array" + }, + "enabled": { + "type": "boolean", + "enum": [ + false, + true + ] + }, + "environments": { + "items": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "system" + ] + }, + "target": { + "type": "string", + "enum": [ + "preview", + "production" + ] + } + }, + "required": [ + "target", + "type" + ], + "type": "object" + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "custom" + ] + }, + "environmentId": { + "type": "string" + } + }, + "required": [ + "environmentId", + "type" + ], + "type": "object" + } + ] + }, + "type": "array" + } + }, + "required": [ + "enabled", + "environments", + "sources" + ], + "type": "object", + "description": "`enabled: true` with empty `sources` is deny-all." + }, + "type": "array" + } + }, + "type": "object", + "description": "Composable deployment-time policy for the team. Used as the default for every project on the team, with optional per-project overrides on `project.deploymentPolicy`." + }, + "personalAccessTokensInvalidatedAt": { + "type": "number", + "description": "Timestamp (ms) after which personal access tokens created at or before this time are considered invalid for this team." + }, + "appTokensInvalidatedAt": { + "type": "number", + "description": "Timestamp (ms) after which Vercel App tokens created at or before this time are considered invalid for this team." + }, + "apiKeysInvalidatedAt": { + "type": "number", + "description": "Timestamp (ms) after which API keys created at or before this time are considered invalid for this team." + }, + "integrationTokensInvalidatedAt": { + "type": "number", + "description": "Timestamp (ms) after which integration tokens created at or before this time are considered invalid for this team." + }, + "id": { + "type": "string", + "description": "The Team's unique identifier.", + "example": "team_nllPyCtREAqxxdyFKbbMDlxd" + }, + "slug": { + "type": "string", + "description": "The Team's slug, which is unique across the Vercel platform.", + "example": "my-team" + }, + "name": { + "nullable": true, + "type": "string", + "description": "Name associated with the Team account, or `null` if none has been provided.", + "example": "My Team" + }, + "avatar": { + "nullable": true, + "type": "string", + "description": "The ID of the file used as avatar for this Team.", + "example": "6eb07268bcfadd309905ffb1579354084c24655c" + }, + "membership": { + "properties": { + "uid": { + "type": "string" + }, + "entitlements": { + "items": { + "properties": { + "entitlement": { + "type": "string" + } + }, + "required": [ + "entitlement" + ], + "type": "object" + }, + "type": "array" + }, + "teamId": { + "type": "string" + }, + "confirmed": { + "type": "boolean", + "enum": [ + true + ] + }, + "accessRequestedAt": { + "type": "number" + }, + "role": { + "type": "string", + "enum": [ + "BILLING", + "CONTRIBUTOR", + "DEVELOPER", + "MEMBER", + "OWNER", + "SECURITY", + "VIEWER", + "VIEWER_FOR_PLUS" + ] + }, + "teamRoles": { + "items": { + "type": "string", + "enum": [ + "BILLING", + "CONTRIBUTOR", + "DEVELOPER", + "MEMBER", + "OWNER", + "SECURITY", + "VIEWER", + "VIEWER_FOR_PLUS" + ] + }, + "type": "array" + }, + "teamPermissions": { + "items": { + "type": "string", + "enum": [ + "AiGatewayApiKeyOwnedBySelf", + "AiGatewayBudgetManager", + "AiGatewayCredits", + "AiGatewaySettings", + "AiGatewayTranscriptsManager", + "AiGatewayTranscriptsViewer", + "ConnectorManager", + "CreateProject", + "EnvVariableManager", + "EnvironmentManager", + "FullProductionDeployment", + "IntegrationManager", + "OrgAdmin", + "OrgViewer", + "UsageViewer", + "V0Builder", + "V0Chatter", + "V0Viewer", + "WorkflowDecryptor" + ] + }, + "type": "array" + }, + "createdAt": { + "type": "number" + }, + "created": { + "type": "number" + }, + "joinedFrom": { + "properties": { + "origin": { + "type": "string", + "enum": [ + "account-update", + "bitbucket", + "dsync", + "feedback", + "github", + "gitlab", + "import", + "link", + "mail", + "nsnb-auto-approve", + "nsnb-hobby-upgrade", + "nsnb-invite", + "nsnb-redeploy", + "nsnb-redeploy-attribution-card", + "nsnb-request-access", + "nsnb-viewer-upgrade", + "organization-teams", + "saml", + "teams" + ] + }, + "commitId": { + "type": "string" + }, + "repoId": { + "type": "string" + }, + "repoPath": { + "type": "string" + }, + "gitUserId": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "gitUserLogin": { + "type": "string" + }, + "ssoUserId": { + "type": "string" + }, + "ssoConnectedAt": { + "type": "number" + }, + "idpUserId": { + "type": "string" + }, + "dsyncUserId": { + "type": "string" + }, + "dsyncConnectedAt": { + "type": "number" + } + }, + "required": [ + "origin" + ], + "type": "object" + } + }, + "required": [ + "confirmed", + "created", + "createdAt", + "role" + ], + "type": "object", + "description": "The membership of the authenticated User in relation to the Team." + }, + "createdAt": { + "type": "number", + "description": "UNIX timestamp (in milliseconds) when the Team was created.", + "example": 1630748523395 + }, + "parentId": { + "type": "string", + "description": "The organizationId for teams that belong to an organization (set on both the organization's root team and its child teams).", + "example": "org_nllPyCtREAqxxdyFKbbMDlxd" + }, + "orgRootTeamId": { + "type": "string", + "description": "Best-effort ID of the organization’s root billing team. When present, compare `orgRootTeamId === id` to identify the root team. It may be omitted even when `parentId` is set if organization resolution fails or the referenced organization is missing. Always omitted for non-organization teams.", + "example": "team_nllPyCtREAqxxdyFKbbMDlxd" + } + }, + "required": [ + "avatar", + "billing", + "createdAt", + "creatorId", + "description", + "id", + "name", + "slug", + "stagingPrefix", + "updatedAt" + ], + "type": "object", + "description": "Data representing a Team.", + "additionalProperties": true + }, + "TeamLimited": { + "properties": { + "limited": { + "type": "boolean", + "enum": [ + true + ], + "description": "Property indicating that this Team data contains only limited information, due to the authentication token missing privileges to read the full Team data or due to team having MFA enforced and the user not having MFA enabled. Re-login with the Team's configured SAML Single Sign-On provider in order to upgrade the authentication token with the necessary privileges." + }, + "limitedBy": { + "items": { + "type": "string", + "enum": [ + "invalidated", + "mfa", + "scope" + ] + }, + "type": "array" + }, + "saml": { + "properties": { + "connection": { + "properties": { + "type": { + "type": "string", + "description": "The Identity Provider \"type\", for example Okta.", + "example": "OktaSAML" + }, + "state": { + "type": "string", + "description": "Current state of the connection.", + "example": "active" + }, + "connectedAt": { + "type": "number", + "description": "Timestamp (in milliseconds) of when the configuration was connected.", + "example": 1611796915677 + }, + "lastReceivedWebhookEvent": { + "type": "number", + "description": "Timestamp (in milliseconds) of when the last webhook event was received from WorkOS.", + "example": 1611796915677 + }, + "lastSyncedAt": { + "type": "number", + "description": "Timestamp (in milliseconds) of when the last directory sync was performed.", + "example": 1611796915677 + }, + "syncState": { + "type": "string", + "enum": [ + "ACTIVE", + "SETUP" + ], + "description": "Controls whether directory sync events are processed. - 'SETUP': Directory connected but role mappings not yet configured. Events are acknowledged but not processed. - 'ACTIVE': Fully configured. Events are processed normally. - undefined: Legacy directory (pre-feature), treat as 'ACTIVE' for backwards compatibility." + }, + "status": { + "type": "string" + } + }, + "required": [ + "connectedAt", + "state", + "status", + "type" + ], + "type": "object", + "description": "Information for the SAML Single Sign-On configuration." + }, + "directory": { + "properties": { + "type": { + "type": "string", + "description": "The Identity Provider \"type\", for example Okta.", + "example": "OktaSAML" + }, + "state": { + "type": "string", + "description": "Current state of the connection.", + "example": "active" + }, + "connectedAt": { + "type": "number", + "description": "Timestamp (in milliseconds) of when the configuration was connected.", + "example": 1611796915677 + }, + "lastReceivedWebhookEvent": { + "type": "number", + "description": "Timestamp (in milliseconds) of when the last webhook event was received from WorkOS.", + "example": 1611796915677 + }, + "lastSyncedAt": { + "type": "number", + "description": "Timestamp (in milliseconds) of when the last directory sync was performed.", + "example": 1611796915677 + }, + "syncState": { + "type": "string", + "enum": [ + "ACTIVE", + "SETUP" + ], + "description": "Controls whether directory sync events are processed. - 'SETUP': Directory connected but role mappings not yet configured. Events are acknowledged but not processed. - 'ACTIVE': Fully configured. Events are processed normally. - undefined: Legacy directory (pre-feature), treat as 'ACTIVE' for backwards compatibility." + } + }, + "required": [ + "connectedAt", + "state", + "type" + ], + "type": "object", + "description": "Information for the Directory Sync configuration." + }, + "enforced": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "When `true`, interactions with the Team **must** be done with an authentication token that has been authenticated with the Team's SAML Single Sign-On provider." + } + }, + "required": [ + "enforced" + ], + "type": "object", + "description": "When \"Single Sign-On (SAML)\" is configured, this object contains information that allows the client-side to identify whether or not this Team has SAML enforced." + }, + "id": { + "type": "string", + "description": "The Team's unique identifier.", + "example": "team_nllPyCtREAqxxdyFKbbMDlxd" + }, + "slug": { + "type": "string", + "description": "The Team's slug, which is unique across the Vercel platform.", + "example": "my-team" + }, + "name": { + "nullable": true, + "type": "string", + "description": "Name associated with the Team account, or `null` if none has been provided.", + "example": "My Team" + }, + "avatar": { + "nullable": true, + "type": "string", + "description": "The ID of the file used as avatar for this Team.", + "example": "6eb07268bcfadd309905ffb1579354084c24655c" + }, + "membership": { + "properties": { + "uid": { + "type": "string" + }, + "entitlements": { + "items": { + "properties": { + "entitlement": { + "type": "string" + } + }, + "required": [ + "entitlement" + ], + "type": "object" + }, + "type": "array" + }, + "teamId": { + "type": "string" + }, + "confirmed": { + "type": "boolean", + "enum": [ + true + ] + }, + "accessRequestedAt": { + "type": "number" + }, + "role": { + "type": "string", + "enum": [ + "BILLING", + "CONTRIBUTOR", + "DEVELOPER", + "MEMBER", + "OWNER", + "SECURITY", + "VIEWER", + "VIEWER_FOR_PLUS" + ] + }, + "teamRoles": { + "items": { + "type": "string", + "enum": [ + "BILLING", + "CONTRIBUTOR", + "DEVELOPER", + "MEMBER", + "OWNER", + "SECURITY", + "VIEWER", + "VIEWER_FOR_PLUS" + ] + }, + "type": "array" + }, + "teamPermissions": { + "items": { + "type": "string", + "enum": [ + "AiGatewayApiKeyOwnedBySelf", + "AiGatewayBudgetManager", + "AiGatewayCredits", + "AiGatewaySettings", + "AiGatewayTranscriptsManager", + "AiGatewayTranscriptsViewer", + "ConnectorManager", + "CreateProject", + "EnvVariableManager", + "EnvironmentManager", + "FullProductionDeployment", + "IntegrationManager", + "OrgAdmin", + "OrgViewer", + "UsageViewer", + "V0Builder", + "V0Chatter", + "V0Viewer", + "WorkflowDecryptor" + ] + }, + "type": "array" + }, + "createdAt": { + "type": "number" + }, + "created": { + "type": "number" + }, + "joinedFrom": { + "properties": { + "origin": { + "type": "string", + "enum": [ + "account-update", + "bitbucket", + "dsync", + "feedback", + "github", + "gitlab", + "import", + "link", + "mail", + "nsnb-auto-approve", + "nsnb-hobby-upgrade", + "nsnb-invite", + "nsnb-redeploy", + "nsnb-redeploy-attribution-card", + "nsnb-request-access", + "nsnb-viewer-upgrade", + "organization-teams", + "saml", + "teams" + ] + }, + "commitId": { + "type": "string" + }, + "repoId": { + "type": "string" + }, + "repoPath": { + "type": "string" + }, + "gitUserId": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "gitUserLogin": { + "type": "string" + }, + "ssoUserId": { + "type": "string" + }, + "ssoConnectedAt": { + "type": "number" + }, + "idpUserId": { + "type": "string" + }, + "dsyncUserId": { + "type": "string" + }, + "dsyncConnectedAt": { + "type": "number" + } + }, + "required": [ + "origin" + ], + "type": "object" + } + }, + "required": [ + "confirmed", + "created", + "createdAt", + "role" + ], + "type": "object", + "description": "The membership of the authenticated User in relation to the Team." + }, + "createdAt": { + "type": "number", + "description": "UNIX timestamp (in milliseconds) when the Team was created.", + "example": 1630748523395 + }, + "parentId": { + "type": "string", + "description": "The organizationId for teams that belong to an organization (set on both the organization's root team and its child teams).", + "example": "org_nllPyCtREAqxxdyFKbbMDlxd" + }, + "orgRootTeamId": { + "type": "string", + "description": "Best-effort ID of the organization’s root billing team. When present, compare `orgRootTeamId === id` to identify the root team. It may be omitted even when `parentId` is set if organization resolution fails or the referenced organization is missing. Always omitted for non-organization teams.", + "example": "team_nllPyCtREAqxxdyFKbbMDlxd" + } + }, + "required": [ + "avatar", + "createdAt", + "id", + "limited", + "limitedBy", + "name", + "slug" + ], + "type": "object", + "description": "A limited form of data representing a Team, due to the authentication token missing privileges to read the full Team data." + }, + "AuthToken": { + "properties": { + "id": { + "type": "string", + "description": "The unique identifier of the token.", + "example": "5d9f2ebd38ddca62e5d51e9c1704c72530bdc8bfdd41e782a6687c48399e8391" + }, + "name": { + "type": "string", + "description": "The human-readable name of the token." + }, + "type": { + "type": "string", + "description": "The type of the token.", + "example": "oauth2-token" + }, + "prefix": { + "type": "string", + "description": "The token's prefix, for identification purposes.", + "example": "vcp_" + }, + "suffix": { + "type": "string", + "description": "The last few characters of the token, for identification purposes.", + "example": "abc123" + }, + "origin": { + "type": "string", + "description": "The origin of how the token was created.", + "example": "github" + }, + "scopes": { + "items": { + "oneOf": [ + { + "properties": { + "type": { + "type": "string", + "enum": [ + "user" + ] + }, + "sudo": { + "properties": { + "origin": { + "type": "string", + "enum": [ + "email-otp", + "otp", + "recovery-code", + "totp", + "webauthn" + ], + "description": "Possible step-up auth origins" + }, + "verifiedAt": { + "type": "number" + }, + "expiresAt": { + "type": "number" + } + }, + "required": [ + "expiresAt", + "origin" + ], + "type": "object" + }, + "origin": { + "type": "string", + "enum": [ + "app", + "apple", + "bitbucket", + "chatgpt", + "email", + "emu", + "github", + "github-webhook", + "gitlab", + "google", + "invite", + "manual", + "otp", + "passkey", + "saml", + "sms", + "token-exchange-oidc" + ] + }, + "createdAt": { + "type": "number" + }, + "expiresAt": { + "type": "number" + } + }, + "required": [ + "createdAt", + "type" + ], + "type": "object", + "description": "The access scopes granted to the token." + }, + { + "properties": { + "type": { + "type": "string", + "enum": [ + "team" + ] + }, + "teamId": { + "type": "string" + }, + "origin": { + "type": "string", + "enum": [ + "app", + "apple", + "bitbucket", + "chatgpt", + "email", + "emu", + "github", + "github-webhook", + "gitlab", + "google", + "invite", + "manual", + "otp", + "passkey", + "saml", + "sms", + "token-exchange-oidc" + ] + }, + "createdAt": { + "type": "number" + }, + "expiresAt": { + "type": "number" + } + }, + "required": [ + "createdAt", + "teamId", + "type" + ], + "type": "object", + "description": "The access scopes granted to the token." + } + ] + }, + "type": "array", + "description": "The access scopes granted to the token." + }, + "createdAt": { + "type": "number", + "description": "Timestamp (in milliseconds) of when the token was created.", + "example": 1632816536002 + }, + "activeAt": { + "type": "number", + "description": "Timestamp (in milliseconds) of when the token was most recently used.", + "example": 1632816536002 + }, + "expiresAt": { + "type": "number", + "description": "Timestamp (in milliseconds) of when the token expires.", + "example": 1632816536002 + }, + "revokedAt": { + "type": "number", + "description": "Timestamp (in milliseconds) of when the token was revoked.", + "example": 1632816536002 + }, + "leakedAt": { + "type": "number", + "description": "Timestamp (in milliseconds) of when the token was marked as leaked.", + "example": 1632816536002 + }, + "leakedUrl": { + "type": "string", + "description": "URL where the token was discovered as leaked." + } + }, + "required": [ + "activeAt", + "createdAt", + "id", + "name", + "type" + ], + "type": "object", + "description": "Authentication token metadata." + }, + "AuthUser": { + "properties": { + "createdAt": { + "type": "number", + "description": "UNIX timestamp (in milliseconds) when the User account was created.", + "example": 1630748523395 + }, + "softBlock": { + "nullable": true, + "properties": { + "blockedAt": { + "type": "number" + }, + "reason": { + "type": "string", + "enum": [ + "BLOCKED_FOR_PLATFORM_ABUSE", + "DOMAIN_OWNER_DELETION_REQUEST", + "ENTERPRISE_TRIAL_ENDED", + "ENTERPRISE_UNPAID_INVOICE", + "EXPOSURE_CAP_EXCEEDED", + "FAIR_USE_LIMITS_EXCEEDED", + "SUBSCRIPTION_CANCELED", + "SUBSCRIPTION_EXPIRED", + "UNPAID_INVOICE" + ] + }, + "blockedDueToOverageType": { + "type": "string", + "enum": [ + "analyticsUsage", + "artifacts", + "bandwidth", + "blobDataTransfer", + "blobTotalAdvancedRequests", + "blobTotalAvgSizeInBytes", + "blobTotalGetResponseObjectSizeInBytes", + "blobTotalSimpleRequests", + "connectDataTransfer", + "dataCacheRead", + "dataCacheWrite", + "edgeConfigRead", + "edgeConfigWrite", + "edgeFunctionExecutionUnits", + "edgeMiddlewareInvocations", + "edgeRequest", + "edgeRequestAdditionalCpuDuration", + "elasticConcurrencyBuildSlots", + "fastDataTransfer", + "fastOriginTransfer", + "fluidCpuDuration", + "fluidDuration", + "functionDuration", + "functionInvocation", + "imageOptimizationCacheRead", + "imageOptimizationCacheWrite", + "imageOptimizationTransformation", + "logDrainsVolume", + "monitoringMetric", + "observabilityEvent", + "onDemandConcurrencyMinutes", + "runtimeCacheRead", + "runtimeCacheWrite", + "serverlessFunctionExecution", + "sourceImages", + "wafOwaspExcessBytes", + "wafOwaspRequests", + "wafRateLimitRequest", + "webAnalyticsEvent" + ] + }, + "unpauseAt": { + "type": "number", + "description": "Since September 2026. Set only by `billing-usage-alerts` for usage plans with a `blockDurationMs`; its presence marks a pause that expires on its own." + } + }, + "required": [ + "blockedAt", + "reason" + ], + "type": "object", + "description": "When the User account has been \"soft blocked\", this property will contain the date when the restriction was enacted, and the identifier for why." + }, + "billing": { + "nullable": true, + "type": "object", + "description": "An object containing billing infomation associated with the User account." + }, + "resourceConfig": { + "properties": { + "concurrentBuilds": { + "type": "number", + "description": "An object containing infomation related to the amount of platform resources may be allocated to the User account." + }, + "nodeType": { + "type": "string", + "description": "An object containing infomation related to the amount of platform resources may be allocated to the User account." + }, + "elasticConcurrencyEnabled": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "An object containing infomation related to the amount of platform resources may be allocated to the User account." + }, + "buildEntitlements": { + "properties": { + "enhancedBuilds": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "An object containing infomation related to the amount of platform resources may be allocated to the User account." + } + }, + "type": "object", + "description": "An object containing infomation related to the amount of platform resources may be allocated to the User account." + }, + "buildQueue": { + "properties": { + "configuration": { + "type": "string", + "enum": [ + "SKIP_NAMESPACE_QUEUE", + "WAIT_FOR_NAMESPACE_QUEUE" + ], + "description": "An object containing infomation related to the amount of platform resources may be allocated to the User account." + } + }, + "type": "object", + "description": "An object containing infomation related to the amount of platform resources may be allocated to the User account." + }, + "awsAccountType": { + "type": "string", + "description": "An object containing infomation related to the amount of platform resources may be allocated to the User account." + }, + "awsAccountIds": { + "items": { + "type": "string" + }, + "type": "array", + "description": "An object containing infomation related to the amount of platform resources may be allocated to the User account." + }, + "cfZoneName": { + "type": "string", + "description": "An object containing infomation related to the amount of platform resources may be allocated to the User account." + }, + "imageOptimizationType": { + "type": "string", + "description": "An object containing infomation related to the amount of platform resources may be allocated to the User account." + }, + "edgeConfigs": { + "type": "number", + "description": "An object containing infomation related to the amount of platform resources may be allocated to the User account." + }, + "edgeConfigSize": { + "type": "number", + "description": "An object containing infomation related to the amount of platform resources may be allocated to the User account." + }, + "edgeFunctionMaxSizeBytes": { + "type": "number", + "description": "An object containing infomation related to the amount of platform resources may be allocated to the User account." + }, + "edgeFunctionExecutionTimeoutMs": { + "type": "number", + "description": "An object containing infomation related to the amount of platform resources may be allocated to the User account." + }, + "serverlessFunctionMaxDuration": { + "type": "number", + "description": "An object containing infomation related to the amount of platform resources may be allocated to the User account." + }, + "serverlessFunctionMaxMemorySize": { + "type": "number", + "description": "An object containing infomation related to the amount of platform resources may be allocated to the User account." + }, + "kvDatabases": { + "type": "number", + "description": "An object containing infomation related to the amount of platform resources may be allocated to the User account." + }, + "postgresDatabases": { + "type": "number", + "description": "An object containing infomation related to the amount of platform resources may be allocated to the User account." + }, + "blobStores": { + "type": "number", + "description": "An object containing infomation related to the amount of platform resources may be allocated to the User account." + }, + "integrationStores": { + "type": "number", + "description": "An object containing infomation related to the amount of platform resources may be allocated to the User account." + }, + "cronJobsPerProject": { + "type": "number", + "description": "An object containing infomation related to the amount of platform resources may be allocated to the User account." + }, + "microfrontendGroupsPerTeam": { + "type": "number", + "description": "An object containing infomation related to the amount of platform resources may be allocated to the User account." + }, + "microfrontendProjectsPerGroup": { + "type": "number", + "description": "An object containing infomation related to the amount of platform resources may be allocated to the User account." + }, + "flagsExplorerOverridesThreshold": { + "type": "number", + "description": "An object containing infomation related to the amount of platform resources may be allocated to the User account." + }, + "flagsExplorerUnlimitedOverrides": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "An object containing infomation related to the amount of platform resources may be allocated to the User account." + }, + "customEnvironmentsPerProject": { + "type": "number", + "description": "An object containing infomation related to the amount of platform resources may be allocated to the User account." + }, + "security": { + "properties": { + "rateLimit": { + "type": "number", + "description": "An object containing infomation related to the amount of platform resources may be allocated to the User account." + }, + "customRules": { + "type": "number", + "description": "An object containing infomation related to the amount of platform resources may be allocated to the User account." + }, + "ipBlocks": { + "type": "number", + "description": "An object containing infomation related to the amount of platform resources may be allocated to the User account." + }, + "ipBypass": { + "type": "number", + "description": "An object containing infomation related to the amount of platform resources may be allocated to the User account." + } + }, + "type": "object", + "description": "An object containing infomation related to the amount of platform resources may be allocated to the User account." + }, + "bulkRedirectsFreeLimitOverride": { + "type": "number", + "description": "An object containing infomation related to the amount of platform resources may be allocated to the User account." + } + }, + "type": "object", + "description": "An object containing infomation related to the amount of platform resources may be allocated to the User account." + }, + "stagingPrefix": { + "type": "string", + "description": "Prefix that will be used in the URL of \"Preview\" deployments created by the User account." + }, + "activeDashboardViews": { + "items": { + "properties": { + "scopeId": { + "type": "string" + }, + "viewPreference": { + "nullable": true, + "type": "string", + "enum": [ + "cards", + "list", + null + ] + }, + "favoritesViewPreference": { + "nullable": true, + "type": "string", + "enum": [ + "closed", + "open", + null + ] + }, + "recentsViewPreference": { + "nullable": true, + "type": "string", + "enum": [ + "closed", + "open", + null + ] + } + }, + "required": [ + "scopeId" + ], + "type": "object", + "description": "set of dashboard view preferences (cards or list) per scopeId" + }, + "type": "array", + "description": "set of dashboard view preferences (cards or list) per scopeId" + }, + "importFlowGitNamespace": { + "nullable": true, + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "importFlowGitNamespaceId": { + "nullable": true, + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + }, + "importFlowGitProvider": { + "nullable": true, + "type": "string", + "enum": [ + "bitbucket", + "cursor-origin", + "github", + "github-custom-host", + "github-limited", + "gitlab", + "vercel", + null + ] + }, + "preferredScopesAndGitNamespaces": { + "items": { + "properties": { + "scopeId": { + "type": "string" + }, + "gitNamespaceId": { + "nullable": true, + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + } + ] + } + }, + "required": [ + "gitNamespaceId", + "scopeId" + ], + "type": "object" + }, + "type": "array" + }, + "dismissedToasts": { + "items": { + "properties": { + "name": { + "type": "string" + }, + "dismissals": { + "items": { + "properties": { + "scopeId": { + "type": "string" + }, + "createdAt": { + "type": "number" + } + }, + "required": [ + "createdAt", + "scopeId" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "dismissals", + "name" + ], + "type": "object", + "description": "A record of when, under a certain scopeId, a toast was dismissed" + }, + "type": "array", + "description": "A record of when, under a certain scopeId, a toast was dismissed" + }, + "favoriteProjectsAndSpaces": { + "items": { + "properties": { + "teamId": { + "type": "string" + }, + "projectId": { + "type": "string" + } + }, + "required": [ + "projectId", + "teamId" + ], + "type": "object", + "description": "A list of projects and spaces across teams that a user has marked as a favorite." + }, + "type": "array", + "description": "A list of projects and spaces across teams that a user has marked as a favorite." + }, + "hasTrialAvailable": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether the user has a trial available for a paid plan subscription." + }, + "remoteCaching": { + "properties": { + "enabled": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "type": "object", + "description": "remote caching settings" + }, + "dataCache": { + "properties": { + "excessBillingEnabled": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "type": "object", + "description": "data cache settings" + }, + "featureBlocks": { + "properties": { + "webAnalytics": { + "properties": { + "blockedFrom": { + "type": "number" + }, + "blockedUntil": { + "type": "number" + }, + "isCurrentlyBlocked": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "isCurrentlyBlocked" + ], + "type": "object" + }, + "speedInsightsFree": { + "properties": { + "blockedFrom": { + "type": "number" + }, + "blockedUntil": { + "type": "number" + }, + "blockReason": { + "type": "string", + "enum": [ + "admin_override", + "hard_blocked", + "limits_exceeded" + ] + }, + "isCurrentlyBlocked": { + "type": "boolean", + "enum": [ + false, + true + ] + } + }, + "required": [ + "blockReason", + "isCurrentlyBlocked" + ], + "type": "object", + "description": "Client-facing view of the `speedInsightsFree` ingestion block. The dashboard needs `blockReason` to tell usage pauses apart from admin blocks." + } + }, + "type": "object", + "description": "Feature blocks for the user" + }, + "isAccountUpdateRequired": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "When `true`, the user must complete the EMU Update Account flow before they can use the dashboard." + }, + "accountUpdateContext": { + "properties": { + "canOptOut": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether this user can cancel their optional Account Update flow." + }, + "organization": { + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "slug": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "slug" + ], + "type": "object" + }, + "managedTeams": { + "items": { + "properties": { + "teamId": { + "type": "string" + }, + "slug": { + "type": "string" + }, + "name": { + "type": "string" + }, + "avatar": { + "nullable": true, + "type": "string" + }, + "workEmail": { + "type": "string" + } + }, + "required": [ + "avatar", + "name", + "slug", + "teamId", + "workEmail" + ], + "type": "object" + }, + "type": "array" + }, + "verifiedEmuDomains": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "canOptOut", + "managedTeams", + "verifiedEmuDomains" + ], + "type": "object", + "description": "Context for the Update Account screen. Present only when `isAccountUpdateRequired` is true. `managedTeams` is empty for orphan mode (user matches an EMU domain but is not on the team)." + }, + "id": { + "type": "string", + "description": "The User's unique identifier.", + "example": "AEIIDYVk59zbFF2Sxfyxxmua" + }, + "email": { + "type": "string", + "description": "Email address associated with the User account.", + "example": "me@example.com" + }, + "name": { + "nullable": true, + "type": "string", + "description": "Name associated with the User account, or `null` if none has been provided.", + "example": "John Doe" + }, + "username": { + "type": "string", + "description": "Unique username associated with the User account.", + "example": "jdoe" + }, + "avatar": { + "nullable": true, + "type": "string", + "description": "SHA1 hash of the avatar for the User account. Can be used in conjuction with the ... endpoint to retrieve the avatar image.", + "example": "22cb30c85ff45ac4c72de8981500006b28114aa1" + }, + "defaultTeamId": { + "nullable": true, + "type": "string", + "description": "The user's default team." + }, + "isEnterpriseManaged": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Indicates whether the user is managed by an enterprise." + }, + "shouldShowEnterpriseManagedWelcome": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether the Enterprise Managed User joined the current team through the Update Account flow and should see its welcome experience." + } + }, + "required": [ + "avatar", + "billing", + "createdAt", + "defaultTeamId", + "email", + "hasTrialAvailable", + "id", + "name", + "resourceConfig", + "softBlock", + "stagingPrefix", + "username" + ], + "type": "object", + "description": "Data for the currently authenticated User." + }, + "AuthUserLimited": { + "properties": { + "limited": { + "type": "boolean", + "enum": [ + true + ], + "description": "Property indicating that this User data contains only limited information, due to the authentication token missing privileges to read the full User data. Re-login with email, GitHub, GitLab or Bitbucket in order to upgrade the authentication token with the necessary privileges." + }, + "id": { + "type": "string", + "description": "The User's unique identifier.", + "example": "AEIIDYVk59zbFF2Sxfyxxmua" + }, + "email": { + "type": "string", + "description": "Email address associated with the User account.", + "example": "me@example.com" + }, + "name": { + "nullable": true, + "type": "string", + "description": "Name associated with the User account, or `null` if none has been provided.", + "example": "John Doe" + }, + "username": { + "type": "string", + "description": "Unique username associated with the User account.", + "example": "jdoe" + }, + "avatar": { + "nullable": true, + "type": "string", + "description": "SHA1 hash of the avatar for the User account. Can be used in conjuction with the ... endpoint to retrieve the avatar image.", + "example": "22cb30c85ff45ac4c72de8981500006b28114aa1" + }, + "defaultTeamId": { + "nullable": true, + "type": "string", + "description": "The user's default team." + }, + "isEnterpriseManaged": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Indicates whether the user is managed by an enterprise." + }, + "shouldShowEnterpriseManagedWelcome": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether the Enterprise Managed User joined the current team through the Update Account flow and should see its welcome experience." + } + }, + "required": [ + "avatar", + "defaultTeamId", + "email", + "id", + "limited", + "name", + "username" + ], + "type": "object", + "description": "A limited form of data for the currently authenticated User, due to the authentication token missing privileges to read the full User data." + }, + "VcrRepository": { + "properties": { + "id": { + "type": "string", + "description": "Unique identifier of the repository.", + "example": "repo_a1b2c3d4e5f6" + }, + "projectId": { + "type": "string", + "description": "Identifier of the project the repository belongs to.", + "example": "prj_a1b2c3d4e5f6" + }, + "name": { + "type": "string", + "description": "Name of the repository.", + "example": "my-app" + }, + "public": { + "type": "boolean", + "enum": [ + false, + true + ], + "description": "Whether the repository is public. Images in public repositories can be pulled by anyone. Defaults to `false` (private).", + "example": false + }, + "createdAt": { + "type": "string", + "description": "ISO 8601 timestamp of when the repository was created.", + "example": "2026-06-30T10:00:00.000Z" + }, + "updatedAt": { + "type": "string", + "description": "ISO 8601 timestamp of when the repository was last updated.", + "example": "2026-06-30T10:00:00.000Z" + } + }, + "required": [ + "createdAt", + "id", + "name", + "projectId", + "public", + "updatedAt" + ], + "type": "object", + "description": "A Vercel Container Registry repository." + }, + "VcrRepositoryList": { + "properties": { + "repositories": { + "items": { + "$ref": "#/components/schemas/VcrRepository" + }, + "type": "array" + }, + "nextCursor": { + "type": "string", + "description": "Cursor to fetch the next page of results, when more are available." + } + }, + "required": [ + "repositories" + ], + "type": "object", + "description": "A paginated list of Vercel Container Registry repositories." + }, + "VcrImageListItem": { + "properties": { + "tags": { + "items": { + "type": "string" + }, + "type": "array", + "description": "Tags pointing at this image's manifest." + }, + "id": { + "type": "string", + "description": "Internal identifier of the image.", + "example": "img_a1b2c3d4e5f6" + }, + "repositoryId": { + "type": "string", + "description": "Identifier of the repository the image belongs to.", + "example": "repo_a1b2c3d4e5f6" + }, + "manifestDigest": { + "type": "string", + "description": "SHA-256 digest of the image manifest.", + "example": "sha256:2c4e8f3a1b9d0e5c7a6f4b2d8e1c9a0b3d5f7e9c1a2b4d6f8e0c2a4b6d8f0e2c" + }, + "kind": { + "type": "string", + "enum": [ + "attestation", + "index", + "manifest" + ], + "description": "Whether the manifest is a multi-platform image index, a single-platform image manifest or an attestation." + }, + "platform": { + "type": "string", + "description": "Operating system the manifest targets. Only present for single-platform manifests.", + "example": "linux" + }, + "arch": { + "type": "string", + "description": "CPU architecture the manifest targets. Only present for single-platform manifests.", + "example": "amd64" + }, + "pushedBy": { + "type": "string", + "description": "Identifier of the actor that pushed the image." + }, + "sizeInBytes": { + "type": "number", + "description": "Total size in bytes of the image's resources (manifest, config and layer blobs) stored by the registry." + }, + "status": { + "nullable": true, + "type": "string", + "enum": [ + "preparing", + "ready", + "unoptimized", + null + ], + "description": "VHS-readiness status, or `null` for a multi-platform index." + }, + "createdAt": { + "type": "string", + "description": "ISO 8601 timestamp of when the image was created.", + "example": "2026-06-30T10:00:00.000Z" + } + }, + "required": [ + "createdAt", + "id", + "kind", + "manifestDigest", + "repositoryId", + "sizeInBytes", + "status", + "tags" + ], + "type": "object", + "description": "An image enriched with its tags and VHS-readiness status, as returned when listing a repository's images." + }, + "VcrImageList": { + "properties": { + "images": { + "items": { + "$ref": "#/components/schemas/VcrImageListItem" + }, + "type": "array" + }, + "nextCursor": { + "type": "string", + "description": "Cursor to fetch the next page of results, when more are available." + } + }, + "required": [ + "images" + ], + "type": "object", + "description": "A paginated list of images for a repository." + }, + "VcrRepositoryPermission": { + "properties": { + "repositoryId": { + "type": "string", + "description": "Identifier of the repository the permission grants access to.", + "example": "repo_a1b2c3d4e5f6" + }, + "teamId": { + "type": "string", + "description": "Identifier of the team that is granted access to the repository.", + "example": "team_a1b2c3d4e5f6" + }, + "teamSlug": { + "type": "string", + "description": "Slug of the team that is granted access to the repository.", + "example": "my-team" + }, + "createdAt": { + "type": "string", + "description": "ISO 8601 timestamp of when the permission was created.", + "example": "2026-06-30T10:00:00.000Z" + } + }, + "required": [ + "createdAt", + "repositoryId", + "teamId", + "teamSlug" + ], + "type": "object", + "description": "A team's access grant to a Vercel Container Registry repository." + }, + "VcrTag": { + "properties": { + "tag": { + "type": "string", + "description": "The tag name.", + "example": "latest" + }, + "manifestDigest": { + "type": "string", + "description": "SHA-256 digest of the image manifest the tag points at.", + "example": "sha256:2c4e8f3a1b9d0e5c7a6f4b2d8e1c9a0b3d5f7e9c1a2b4d6f8e0c2a4b6d8f0e2c" + }, + "imageId": { + "type": "string", + "description": "Internal identifier of the image the tag points at.", + "example": "img_a1b2c3d4e5f6" + }, + "kind": { + "type": "string", + "enum": [ + "attestation", + "index", + "manifest" + ], + "description": "Whether the manifest is a multi-platform image index, a single-platform image manifest or an attestation." + }, + "platform": { + "type": "string", + "description": "Operating system the manifest targets. Only present for single-platform manifests.", + "example": "linux" + }, + "arch": { + "type": "string", + "description": "CPU architecture the manifest targets. Only present for single-platform manifests.", + "example": "amd64" + }, + "pushedBy": { + "type": "string", + "description": "Identifier of the actor that pushed the image." + }, + "status": { + "nullable": true, + "type": "string", + "enum": [ + "preparing", + "ready", + "unoptimized", + null + ], + "description": "VHS-readiness status, or `null` for a multi-platform index." + }, + "sizeInBytes": { + "type": "number", + "description": "Total size in bytes of the image's resources (manifest, config and layer blobs) stored by the registry." + }, + "createdAt": { + "type": "string", + "description": "ISO 8601 timestamp of when the tag was created.", + "example": "2026-06-30T10:00:00.000Z" + }, + "updatedAt": { + "type": "string", + "description": "ISO 8601 timestamp of when the tag was last updated.", + "example": "2026-06-30T10:00:00.000Z" + } + }, + "required": [ + "createdAt", + "imageId", + "kind", + "manifestDigest", + "sizeInBytes", + "status", + "tag", + "updatedAt" + ], + "type": "object", + "description": "A tag pointing at an image in a Vercel Container Registry repository, enriched with the backing image's metadata and VHS-readiness status." + }, + "VcrImageLayer": { + "oneOf": [ + { + "properties": { + "createdBy": { + "nullable": true, + "type": "string" + }, + "digest": { + "nullable": true, + "type": "string" + }, + "operation": { + "type": "string", + "enum": [ + "ADD", + "ARG", + "CMD", + "COPY", + "ENTRYPOINT", + "ENV", + "EXPOSE", + "FROM", + "HEALTHCHECK", + "LABEL", + "ONBUILD", + "RUN", + "SHELL", + "STOPSIGNAL", + "UNKNOWN", + "USER", + "VOLUME", + "WORKDIR" + ], + "description": "Docker/OCI build instruction associated with an image layer." + }, + "sizeBytes": { + "nullable": true, + "type": "number" + }, + "type": { + "type": "string", + "enum": [ + "FROM" + ] + }, + "baseImage": { + "nullable": true, + "type": "string" + }, + "collapsedDigests": { + "items": { + "type": "string" + }, + "type": "array" + }, + "collapsedLayerCount": { + "type": "number" + } + }, + "required": [ + "baseImage", + "collapsedDigests", + "collapsedLayerCount", + "createdBy", + "digest", + "operation", + "sizeBytes", + "type" + ], + "type": "object" + }, + { + "properties": { + "createdBy": { + "nullable": true, + "type": "string" + }, + "digest": { + "nullable": true, + "type": "string" + }, + "operation": { + "type": "string", + "enum": [ + "ADD", + "ARG", + "CMD", + "COPY", + "ENTRYPOINT", + "ENV", + "EXPOSE", + "FROM", + "HEALTHCHECK", + "LABEL", + "ONBUILD", + "RUN", + "SHELL", + "STOPSIGNAL", + "UNKNOWN", + "USER", + "VOLUME", + "WORKDIR" + ], + "description": "Docker/OCI build instruction associated with an image layer." + }, + "sizeBytes": { + "nullable": true, + "type": "number" + }, + "type": { + "type": "string", + "enum": [ + "RUN" + ] + }, + "command": { + "nullable": true, + "type": "string" + } + }, + "required": [ + "command", + "createdBy", + "digest", + "operation", + "sizeBytes", + "type" + ], + "type": "object" + }, + { + "properties": { + "createdBy": { + "nullable": true, + "type": "string" + }, + "digest": { + "nullable": true, + "type": "string" + }, + "operation": { + "type": "string", + "enum": [ + "ADD", + "ARG", + "CMD", + "COPY", + "ENTRYPOINT", + "ENV", + "EXPOSE", + "FROM", + "HEALTHCHECK", + "LABEL", + "ONBUILD", + "RUN", + "SHELL", + "STOPSIGNAL", + "UNKNOWN", + "USER", + "VOLUME", + "WORKDIR" + ], + "description": "Docker/OCI build instruction associated with an image layer." + }, + "sizeBytes": { + "nullable": true, + "type": "number" + }, + "type": { + "type": "string", + "enum": [ + "ENV" + ] + }, + "env": { + "nullable": true, + "type": "string" + } + }, + "required": [ + "createdBy", + "digest", + "env", + "operation", + "sizeBytes", + "type" + ], + "type": "object" + }, + { + "properties": { + "createdBy": { + "nullable": true, + "type": "string" + }, + "digest": { + "nullable": true, + "type": "string" + }, + "operation": { + "type": "string", + "enum": [ + "ADD", + "ARG", + "CMD", + "COPY", + "ENTRYPOINT", + "ENV", + "EXPOSE", + "FROM", + "HEALTHCHECK", + "LABEL", + "ONBUILD", + "RUN", + "SHELL", + "STOPSIGNAL", + "UNKNOWN", + "USER", + "VOLUME", + "WORKDIR" + ], + "description": "Docker/OCI build instruction associated with an image layer." + }, + "sizeBytes": { + "nullable": true, + "type": "number" + }, + "type": { + "type": "string", + "enum": [ + "ADD", + "ARG", + "CMD", + "COPY", + "ENTRYPOINT", + "EXPOSE", + "HEALTHCHECK", + "LABEL", + "ONBUILD", + "SHELL", + "STOPSIGNAL", + "UNKNOWN", + "USER", + "VOLUME", + "WORKDIR" + ] + }, + "value": { + "nullable": true, + "type": "string" + } + }, + "required": [ + "createdBy", + "digest", + "operation", + "sizeBytes", + "type", + "value" + ], + "type": "object" + } + ] + }, + "VcrImageDetail": { + "properties": { + "layers": { + "items": { + "$ref": "#/components/schemas/VcrImageLayer" + }, + "type": "array" + }, + "tags": { + "items": { + "type": "string" + }, + "type": "array", + "description": "Tags pointing at this image's manifest." + }, + "id": { + "type": "string", + "description": "Internal identifier of the image.", + "example": "img_a1b2c3d4e5f6" + }, + "repositoryId": { + "type": "string", + "description": "Identifier of the repository the image belongs to.", + "example": "repo_a1b2c3d4e5f6" + }, + "manifestDigest": { + "type": "string", + "description": "SHA-256 digest of the image manifest.", + "example": "sha256:2c4e8f3a1b9d0e5c7a6f4b2d8e1c9a0b3d5f7e9c1a2b4d6f8e0c2a4b6d8f0e2c" + }, + "kind": { + "type": "string", + "enum": [ + "attestation", + "index", + "manifest" + ], + "description": "Whether the manifest is a multi-platform image index, a single-platform image manifest or an attestation." + }, + "platform": { + "type": "string", + "description": "Operating system the manifest targets. Only present for single-platform manifests.", + "example": "linux" + }, + "arch": { + "type": "string", + "description": "CPU architecture the manifest targets. Only present for single-platform manifests.", + "example": "amd64" + }, + "pushedBy": { + "type": "string", + "description": "Identifier of the actor that pushed the image." + }, + "sizeInBytes": { + "type": "number", + "description": "Total size in bytes of the image's resources (manifest, config and layer blobs) stored by the registry." + }, + "status": { + "nullable": true, + "type": "string", + "enum": [ + "preparing", + "ready", + "unoptimized", + null + ], + "description": "VHS-readiness status, or `null` for a multi-platform index." + }, + "createdAt": { + "type": "string", + "description": "ISO 8601 timestamp of when the image was created.", + "example": "2026-06-30T10:00:00.000Z" + } + }, + "required": [ + "createdAt", + "id", + "kind", + "layers", + "manifestDigest", + "repositoryId", + "sizeInBytes", + "status", + "tags" + ], + "type": "object", + "description": "A single image with its tags, status and resolved Dockerfile layer history." + }, + "VcrRepositoryPermissionList": { + "properties": { + "permissions": { + "items": { + "$ref": "#/components/schemas/VcrRepositoryPermission" + }, + "type": "array" + }, + "nextCursor": { + "type": "string", + "description": "Cursor to fetch the next page of results, when more are available." + } + }, + "required": [ + "permissions" + ], + "type": "object", + "description": "A paginated list of Vercel Container Registry repository permissions." + }, + "FileTree": { + "properties": { + "name": { + "type": "string", + "description": "The name of the file tree entry", + "example": "my-file.json" + }, + "type": { + "type": "string", + "enum": [ + "directory", + "file", + "invalid", + "lambda", + "middleware", + "symlink" + ], + "description": "String indicating the type of file tree entry.", + "example": "file" + }, + "uid": { + "type": "string", + "description": "The unique identifier of the file (only valid for the `file` type)", + "example": "2d4aad419917f15b1146e9e03ddc9bb31747e4d0" + }, + "children": { + "items": { + "$ref": "#/components/schemas/FileTree" + }, + "type": "array", + "description": "The list of children files of the directory (only valid for the `directory` type)" + }, + "contentType": { + "type": "string", + "description": "The content-type of the file (only valid for the `file` type)", + "example": "application/json" + }, + "mode": { + "type": "number", + "description": "The file \"mode\" indicating file type and permissions." + } + }, + "required": [ + "mode", + "name", + "type" + ], + "type": "object", + "description": "A deployment file tree entry" + }, + "VercelBaseError": { + "type": "object", + "required": [ + "code", + "message" + ], + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + } + } + }, + "VercelForbiddenError": { + "type": "object", + "required": [ + "error" + ], + "properties": { + "error": { + "allOf": [ + { + "$ref": "#/components/schemas/VercelBaseError" + }, + { + "type": "object", + "required": [ + "code" + ], + "properties": { + "code": { + "type": "string" + } + } + } + ] + } + } + }, + "VercelNotFoundError": { + "type": "object", + "required": [ + "error" + ], + "properties": { + "error": { + "allOf": [ + { + "$ref": "#/components/schemas/VercelBaseError" + }, + { + "type": "object", + "required": [ + "code" + ], + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + } + } + } + ] + } + } + }, + "VercelBadRequestError": { + "type": "object", + "required": [ + "error" + ], + "properties": { + "error": { + "allOf": [ + { + "$ref": "#/components/schemas/VercelBaseError" + }, + { + "type": "object", + "required": [ + "code" + ], + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + } + } + } + ] + } + } + }, + "VercelRateLimitError": { + "type": "object", + "required": [ + "error" + ], + "properties": { + "error": { + "allOf": [ + { + "$ref": "#/components/schemas/VercelBaseError" + }, + { + "type": "object", + "required": [ + "code" + ], + "properties": { + "code": { + "type": "string" + }, + "limit": { + "$ref": "#/components/schemas/RateLimitNotice" + } + } + } + ] + } + } + }, + "RateLimitNotice": { + "type": "object", + "required": [ + "remaining", + "reset", + "resetMs", + "total" + ], + "properties": { + "remaining": { + "type": "integer", + "minimum": 0 + }, + "reset": { + "type": "integer", + "minimum": 0 + }, + "resetMs": { + "type": "integer", + "minimum": 0 + }, + "total": { + "type": "integer", + "minimum": 0 + } + } + } + }, + "securitySchemes": { + "bearerToken": { + "type": "http", + "description": "Default authentication mechanism", + "scheme": "bearer" + }, + "oauth2": { + "type": "oauth2", + "flows": { + "authorizationCode": { + "authorizationUrl": "https://api.vercel.com/oauth/authorize", + "tokenUrl": "https://api.vercel.com/oauth/access_token", + "scopes": {} + } + } + } + } + }, + "security": [] +} \ No newline at end of file